]> Lady’s Gitweb - Gitweb/blobdiff - gitweb.perl
gitweb: Add support to Link: tag
[Gitweb] / gitweb.perl
index aa17a891f51c0b8edfd24d28b9b5181e72b00f6032016302a842af7f716b6b34..78e04e413a31f7b82bfc9ede76381f2fc7b35dd3ca44b7c5af51e41b10f78aef 100755 (executable)
@@ -134,6 +134,12 @@ our $default_projects_order = "project";
 # (only effective if this variable evaluates to true)
 our $export_ok = "++GITWEB_EXPORT_OK++";
 
 # (only effective if this variable evaluates to true)
 our $export_ok = "++GITWEB_EXPORT_OK++";
 
+# don't generate age column on the projects list page
+our $omit_age_column = 0;
+
+# don't generate information about owners of repositories
+our $omit_owner=0;
+
 # show repository only if this subroutine returns true
 # when given the path to the project, for example:
 #    sub { return -e "$_[0]/git-daemon-export-ok"; }
 # show repository only if this subroutine returns true
 # when given the path to the project, for example:
 #    sub { return -e "$_[0]/git-daemon-export-ok"; }
@@ -3013,9 +3019,11 @@ sub git_get_projects_list {
                        }
                        if (check_export_ok("$projectroot/$path")) {
                                my $pr = {
                        }
                        if (check_export_ok("$projectroot/$path")) {
                                my $pr = {
-                                       path => $path,
-                                       owner => to_utf8($owner),
+                                       path => $path
                                };
                                };
+                               if ($owner) {
+                                       $pr->{'owner'} = to_utf8($owner);
+                               }
                                push @list, $pr;
                        }
                }
                                push @list, $pr;
                        }
                }
@@ -4477,30 +4485,33 @@ sub git_print_log {
        }
 
        # print log
        }
 
        # print log
-       my $signoff = 0;
-       my $empty = 0;
+       my $skip_blank_line = 0;
        foreach my $line (@$log) {
        foreach my $line (@$log) {
-               if ($line =~ m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i) {
-                       $signoff = 1;
-                       $empty = 0;
+               if ($line =~ m/^\s*([A-Z][-A-Za-z]*-[Bb]y|C[Cc]): /) {
                        if (! $opts{'-remove_signoff'}) {
                                print "<span class=\"signoff\">" . esc_html($line) . "</span><br/>\n";
                        if (! $opts{'-remove_signoff'}) {
                                print "<span class=\"signoff\">" . esc_html($line) . "</span><br/>\n";
-                               next;
-                       } else {
-                               # remove signoff lines
-                               next;
+                               $skip_blank_line = 1;
                        }
                        }
-               } else {
-                       $signoff = 0;
+                       next;
+               }
+
+               if ($line =~ m,\s*([a-z]*link): (https?://\S+),i) {
+                       if (! $opts{'-remove_signoff'}) {
+                               print "<span class=\"signoff\">" . esc_html($1) . ": " .
+                                       "<a href=\"" . esc_html($2) . "\">" . esc_html($2) . "</a>" .
+                                       "</span><br/>\n";
+                               $skip_blank_line = 1;
+                       }
+                       next;
                }
 
                # print only one empty line
                # do not print empty line after signoff
                if ($line eq "") {
                }
 
                # print only one empty line
                # do not print empty line after signoff
                if ($line eq "") {
-                       next if ($empty || $signoff);
-                       $empty = 1;
+                       next if ($skip_blank_line);
+                       $skip_blank_line = 1;
                } else {
                } else {
-                       $empty = 0;
+                       $skip_blank_line = 0;
                }
 
                print format_log_line_html($line) . "<br/>\n";
                }
 
                print format_log_line_html($line) . "<br/>\n";
@@ -4508,7 +4519,7 @@ sub git_print_log {
 
        if ($opts{'-final_empty_line'}) {
                # end with single empty line
 
        if ($opts{'-final_empty_line'}) {
                # end with single empty line
-               print "<br/>\n" unless $empty;
+               print "<br/>\n" unless $skip_blank_line;
        }
 }
 
        }
 }
 
@@ -5066,7 +5077,7 @@ sub print_inline_diff_lines {
 # Format removed and added line, mark changed part and HTML-format them.
 # Implementation is based on contrib/diff-highlight
 sub format_rem_add_lines_pair {
 # Format removed and added line, mark changed part and HTML-format them.
 # Implementation is based on contrib/diff-highlight
 sub format_rem_add_lines_pair {
-       my ($rem, $add) = @_;
+       my ($rem, $add, $num_parents) = @_;
 
        # We need to untabify lines before split()'ing them;
        # otherwise offsets would be invalid.
 
        # We need to untabify lines before split()'ing them;
        # otherwise offsets would be invalid.
@@ -5078,8 +5089,8 @@ sub format_rem_add_lines_pair {
        my @rem = split(//, $rem);
        my @add = split(//, $add);
        my ($esc_rem, $esc_add);
        my @rem = split(//, $rem);
        my @add = split(//, $add);
        my ($esc_rem, $esc_add);
-       # Ignore +/- character, thus $prefix_len is set to 1.
-       my ($prefix_len, $suffix_len) = (1, 0);
+       # Ignore leading +/- characters for each parent.
+       my ($prefix_len, $suffix_len) = ($num_parents, 0);
        my ($prefix_has_nonspace, $suffix_has_nonspace);
 
        my $shorter = (@rem < @add) ? @rem : @add;
        my ($prefix_has_nonspace, $suffix_has_nonspace);
 
        my $shorter = (@rem < @add) ? @rem : @add;
@@ -5117,15 +5128,43 @@ sub format_rem_add_lines_pair {
 
 # HTML-format diff context, removed and added lines.
 sub format_ctx_rem_add_lines {
 
 # HTML-format diff context, removed and added lines.
 sub format_ctx_rem_add_lines {
-       my ($ctx, $rem, $add, $is_combined) = @_;
+       my ($ctx, $rem, $add, $num_parents) = @_;
        my (@new_ctx, @new_rem, @new_add);
        my (@new_ctx, @new_rem, @new_add);
+       my $can_highlight = 0;
+       my $is_combined = ($num_parents > 1);
 
        # Highlight if every removed line has a corresponding added line.
 
        # Highlight if every removed line has a corresponding added line.
-       # Combined diffs are not supported at this moment.
-       if (!$is_combined && @$add > 0 && @$add == @$rem) {
+       if (@$add > 0 && @$add == @$rem) {
+               $can_highlight = 1;
+
+               # Highlight lines in combined diff only if the chunk contains
+               # diff between the same version, e.g.
+               #
+               #    - a
+               #   -  b
+               #    + c
+               #   +  d
+               #
+               # Otherwise the highlightling would be confusing.
+               if ($is_combined) {
+                       for (my $i = 0; $i < @$add; $i++) {
+                               my $prefix_rem = substr($rem->[$i], 0, $num_parents);
+                               my $prefix_add = substr($add->[$i], 0, $num_parents);
+
+                               $prefix_rem =~ s/-/+/g;
+
+                               if ($prefix_rem ne $prefix_add) {
+                                       $can_highlight = 0;
+                                       last;
+                               }
+                       }
+               }
+       }
+
+       if ($can_highlight) {
                for (my $i = 0; $i < @$add; $i++) {
                        my ($line_rem, $line_add) = format_rem_add_lines_pair(
                for (my $i = 0; $i < @$add; $i++) {
                        my ($line_rem, $line_add) = format_rem_add_lines_pair(
-                               $rem->[$i], $add->[$i]);
+                               $rem->[$i], $add->[$i], $num_parents);
                        push @new_rem, $line_rem;
                        push @new_add, $line_add;
                }
                        push @new_rem, $line_rem;
                        push @new_add, $line_add;
                }
@@ -5141,10 +5180,11 @@ sub format_ctx_rem_add_lines {
 
 # Print context lines and then rem/add lines.
 sub print_diff_lines {
 
 # Print context lines and then rem/add lines.
 sub print_diff_lines {
-       my ($ctx, $rem, $add, $diff_style, $is_combined) = @_;
+       my ($ctx, $rem, $add, $diff_style, $num_parents) = @_;
+       my $is_combined = $num_parents > 1;
 
        ($ctx, $rem, $add) = format_ctx_rem_add_lines($ctx, $rem, $add,
 
        ($ctx, $rem, $add) = format_ctx_rem_add_lines($ctx, $rem, $add,
-               $is_combined);
+               $num_parents);
 
        if ($diff_style eq 'sidebyside' && !$is_combined) {
                print_sidebyside_diff_lines($ctx, $rem, $add);
 
        if ($diff_style eq 'sidebyside' && !$is_combined) {
                print_sidebyside_diff_lines($ctx, $rem, $add);
@@ -5155,7 +5195,7 @@ sub print_diff_lines {
 }
 
 sub print_diff_chunk {
 }
 
 sub print_diff_chunk {
-       my ($diff_style, $is_combined, $from, $to, @chunk) = @_;
+       my ($diff_style, $num_parents, $from, $to, @chunk) = @_;
        my (@ctx, @rem, @add);
 
        # The class of the previous line.
        my (@ctx, @rem, @add);
 
        # The class of the previous line.
@@ -5190,7 +5230,7 @@ sub print_diff_chunk {
                if (!$class || ((@rem || @add) && $class eq 'ctx') ||
                    (@rem && @add && $class ne $prev_class)) {
                        print_diff_lines(\@ctx, \@rem, \@add,
                if (!$class || ((@rem || @add) && $class eq 'ctx') ||
                    (@rem && @add && $class ne $prev_class)) {
                        print_diff_lines(\@ctx, \@rem, \@add,
-                                        $diff_style, $is_combined);
+                                        $diff_style, $num_parents);
                        @ctx = @rem = @add = ();
                }
 
                        @ctx = @rem = @add = ();
                }
 
@@ -5333,7 +5373,7 @@ sub git_patchset_body {
                        my $class = diff_line_class($patch_line, \%from, \%to);
 
                        if ($class eq 'chunk_header') {
                        my $class = diff_line_class($patch_line, \%from, \%to);
 
                        if ($class eq 'chunk_header') {
-                               print_diff_chunk($diff_style, $is_combined, \%from, \%to, @chunk);
+                               print_diff_chunk($diff_style, scalar @hash_parents, \%from, \%to, @chunk);
                                @chunk = ();
                        }
 
                                @chunk = ();
                        }
 
@@ -5342,7 +5382,7 @@ sub git_patchset_body {
 
        } continue {
                if (@chunk) {
 
        } continue {
                if (@chunk) {
-                       print_diff_chunk($diff_style, $is_combined, \%from, \%to, @chunk);
+                       print_diff_chunk($diff_style, scalar @hash_parents, \%from, \%to, @chunk);
                        @chunk = ();
                }
                print "</div>\n"; # class="patch"
                        @chunk = ();
                }
                print "</div>\n"; # class="patch"
@@ -5582,11 +5622,15 @@ sub git_project_list_rows {
                                        ? esc_html_match_hl_chopped($pr->{'descr_long'},
                                                                    $pr->{'descr'}, $search_regexp)
                                        : esc_html($pr->{'descr'})) .
                                        ? esc_html_match_hl_chopped($pr->{'descr_long'},
                                                                    $pr->{'descr'}, $search_regexp)
                                        : esc_html($pr->{'descr'})) .
-                     "</td>\n" .
-                     "<td><i>" . chop_and_escape_str($pr->{'owner'}, 15) . "</i></td>\n";
-               print "<td class=\"". age_class($pr->{'age'}) . "\">" .
-                     (defined $pr->{'age_string'} ? $pr->{'age_string'} : "No commits") . "</td>\n" .
-                     "<td class=\"link\">" .
+                     "</td>\n";
+               unless ($omit_owner) {
+                       print "<td><i>" . chop_and_escape_str($pr->{'owner'}, 15) . "</i></td>\n";
+               }
+               unless ($omit_age_column) {
+                       print "<td class=\"". age_class($pr->{'age'}) . "\">" .
+                           (defined $pr->{'age_string'} ? $pr->{'age_string'} : "No commits") . "</td>\n";
+               }
+               print"<td class=\"link\">" .
                      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary")}, "summary")   . " | " .
                      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"shortlog")}, "shortlog") . " | " .
                      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"log")}, "log") . " | " .
                      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary")}, "summary")   . " | " .
                      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"shortlog")}, "shortlog") . " | " .
                      $cgi->a({-href => href(project=>$pr->{'path'}, action=>"log")}, "log") . " | " .
@@ -5617,7 +5661,10 @@ sub git_project_list_body {
                                         'tagfilter'  => $tagfilter)
                if ($tagfilter || $search_regexp);
        # fill the rest
                                         'tagfilter'  => $tagfilter)
                if ($tagfilter || $search_regexp);
        # fill the rest
-       @projects = fill_project_list_info(\@projects);
+       my @all_fields = ('descr', 'descr_long', 'ctags', 'category');
+       push @all_fields, ('age', 'age_string') unless($omit_age_column);
+       push @all_fields, 'owner' unless($omit_owner);
+       @projects = fill_project_list_info(\@projects, @all_fields);
 
        $order ||= $default_projects_order;
        $from = 0 unless defined $from;
 
        $order ||= $default_projects_order;
        $from = 0 unless defined $from;
@@ -5648,8 +5695,8 @@ sub git_project_list_body {
                }
                print_sort_th('project', $order, 'Project');
                print_sort_th('descr', $order, 'Description');
                }
                print_sort_th('project', $order, 'Project');
                print_sort_th('descr', $order, 'Description');
-               print_sort_th('owner', $order, 'Owner');
-               print_sort_th('age', $order, 'Last Change');
+               print_sort_th('owner', $order, 'Owner') unless $omit_owner;
+               print_sort_th('age', $order, 'Last Change') unless $omit_age_column;
                print "<th></th>\n" . # for links
                      "</tr>\n";
        }
                print "<th></th>\n" . # for links
                      "</tr>\n";
        }
@@ -6402,8 +6449,10 @@ sub git_summary {
 
        print "<div class=\"title\">&nbsp;</div>\n";
        print "<table class=\"projects_list\">\n" .
 
        print "<div class=\"title\">&nbsp;</div>\n";
        print "<table class=\"projects_list\">\n" .
-             "<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" .
-             "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
+             "<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n";
+        unless ($omit_owner) {
+               print  "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
+        }
        if (defined $cd{'rfc2822'}) {
                print "<tr id=\"metadata_lchange\"><td>last change</td>" .
                      "<td>".format_timestamp_html(\%cd)."</td></tr>\n";
        if (defined $cd{'rfc2822'}) {
                print "<tr id=\"metadata_lchange\"><td>last change</td>" .
                      "<td>".format_timestamp_html(\%cd)."</td></tr>\n";
This page took 0.347714 seconds and 4 git commands to generate.