Skip to content

Commit

Permalink
gitweb: Create links leading to 'blame_incremental' using JavaScript
Browse files Browse the repository at this point in the history
The new 'blame_incremental' view requires JavaScript to run.  Not all
web browsers implement JavaScript (e.g. text browsers such as Lynx),
and not all users have JavaScript enabled.  Therefore instead of
unconditionally linking to 'blame_incremental' view, we use JavaScript
to convert those links to lead to view utilizing JavaScript, by adding
'js=1' to link.

Currently the only action that takes 'js=1' into account is 'blame',
which then acts as if it was called as 'blame_incremental' action.
Possible enhancement would be to do JavaScript redirect by setting
window.location instead of modifying $format and $action in
git_blame_common() subroutine.

The only JavaScript-aware/using view is currently 'blame_incremental'.
While at it move reading JavaScript to git_footer_html() subroutine.
Note that in this view we do not add 'js=1' currently (even though
perhaps we should; note that for consistency we should also add 'js=1'
in links added by JavaScript part of 'blame_incremental').

This idea was originally implemented by Petr Baudis in
  http://article.gmane.org/gmane.comp.version-control.git/47614
but it added <script> element with fixBlameLinks() function in page
header, to be added as onload event using 'onload' attribute of HTML
'body' element: <body onload="fixBlameLinks();">.  This version adds
script at then end of page (in the page footer), and uses JavaScript
'window.onload=fixLinks();'.  Also in Petr version only links marked
with 'blamelink' class were modified, and they were modified by
replacing "a=blame" by "a=blame_incremental"... which doesn't work for
path_info links, and might replace wrong part if there is "a=blame" in
project name, ref name or file name.

Slightly different solution was implemented by Martin Koegler in
  http://thread.gmane.org/gmane.comp.version-control.git/47902/focus=47905
Here GitAddLinks() function was in gitweb.js file, not as contents of
<script> element.  It was also included in page header (in <head>
element) though, which means waiting for a script to load (and run).
It was smarter in that to "fix" (modify) link, it split URL, modified
value of 'a' parameter, and then recreated modified link.  It avoids
trouble with "a=blame" as substring in project name or file name, but
it doesn't work with path_info URL/link in the way it was written.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jakub Narebski authored and Junio C Hamano committed Sep 1, 2009
1 parent e206d62 commit c4ccf61
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 9 deletions.
34 changes: 34 additions & 0 deletions gitweb/gitweb.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,39 @@
* @license GPLv2 or later
*/

/* ============================================================ */
/* functions for generic gitweb actions and views */

/**
* used to check if link has 'js' query parameter already (at end),
* and other reasons to not add 'js=1' param at the end of link
* @constant
*/
var jsExceptionsRe = /[;?]js=[01]$/;

/**
* Add '?js=1' or ';js=1' to the end of every link in the document
* that doesn't have 'js' query parameter set already.
*
* Links with 'js=1' lead to JavaScript version of given action, if it
* exists (currently there is only 'blame_incremental' for 'blame')
*
* @globals jsExceptionsRe
*/
function fixLinks() {
var allLinks = document.getElementsByTagName("a") || document.links;
for (var i = 0, len = allLinks.length; i < len; i++) {
var link = allLinks[i];
if (!jsExceptionsRe.test(link)) { // =~ /[;?]js=[01]$/;
link.href +=
(link.href.indexOf('?') === -1 ? '?' : ';') + 'js=1';
}
}
}


/* ============================================================ */

/*
* This code uses DOM methods instead of (nonstandard) innerHTML
* to modify page.
Expand Down Expand Up @@ -89,6 +122,7 @@ function createRequestObject() {
return null;
}


/* ============================================================ */
/* utility/helper functions (and variables) */

Expand Down
28 changes: 19 additions & 9 deletions gitweb/gitweb.perl
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,8 @@ sub filter_snapshot_fmts {
snapshot_format => "sf",
extra_options => "opt",
search_use_regexp => "sr",
# this must be last entry (for manipulation from JavaScript)
javascript => "js"
);
our %cgi_param_mapping = @cgi_param_mapping;

Expand Down Expand Up @@ -3242,6 +3244,18 @@ sub git_footer_html {
insert_file($site_footer);
}

print qq!<script type="text/javascript" src="$javascript"></script>\n!;
if ($action eq 'blame_incremental') {
print qq!<script type="text/javascript">\n!.
qq!startBlame("!. href(action=>"blame_data", -replay=>1) .qq!",\n!.
qq! "!. href() .qq!");\n!.
qq!</script>\n!;
} else {
print qq!<script type="text/javascript">\n!.
qq!window.onload = fixLinks;\n!.
qq!</script>\n!;
}

print "</body>\n" .
"</html>";
}
Expand Down Expand Up @@ -4793,6 +4807,10 @@ sub git_tag {

sub git_blame_common {
my $format = shift || 'porcelain';
if ($format eq 'porcelain' && $cgi->param('js')) {
$format = 'incremental';
$action = 'blame_incremental'; # for page title etc
}

# permissions
gitweb_check_feature('blame')
Expand Down Expand Up @@ -4872,7 +4890,7 @@ sub git_blame_common {
if ($format eq 'incremental') {
print "<noscript>\n<div class=\"error\"><center><b>\n".
"This page requires JavaScript to run.\n Use ".
$cgi->a({-href => href(action=>'blame',-replay=>1)},
$cgi->a({-href => href(action=>'blame',javascript=>0,-replay=>1)},
'this page').
" instead.\n".
"</b></center></div>\n</noscript>\n";
Expand Down Expand Up @@ -5003,14 +5021,6 @@ sub git_blame_common {
close $fd
or print "Reading blob failed\n";

if ($format eq 'incremental') {
print qq!<script type="text/javascript" src="$javascript"></script>\n!.
qq!<script type="text/javascript">\n!.
qq!startBlame("!. href(action=>"blame_data", -replay=>1) .qq!",\n!.
qq! "!. href() .qq!");\n!.
qq!</script>\n!;
}

git_footer_html();
}

Expand Down

0 comments on commit c4ccf61

Please sign in to comment.