* [PATCH] gitweb: Add an option for adding more branch refs @ 2013-11-26 10:37 Krzesimir Nowak 2013-11-26 21:48 ` Junio C Hamano 2013-11-27 15:56 ` Jakub Narębski 0 siblings, 2 replies; 5+ messages in thread From: Krzesimir Nowak @ 2013-11-26 10:37 UTC (permalink / raw) To: git; +Cc: gitster, Krzesimir Nowak Overriding an @additional_branch_refs configuration variable with value ('wip') will make gitweb to show branches that appear in refs/heads and refs/wip (refs/heads is hardcoded). Might be useful for gerrit setups where user branches are not stored under refs/heads/. Signed-off-by: Krzesimir Nowak <krzesimir@endocode.com> --- gitweb/gitweb.perl | 99 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 25 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 68c77f6..9bfd38b 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -17,6 +17,7 @@ use Encode; use Fcntl ':mode'; use File::Find qw(); use File::Basename qw(basename); +use List::Util qw(min); use Time::HiRes qw(gettimeofday tv_interval); binmode STDOUT, ':utf8'; @@ -122,6 +123,10 @@ our $logo_label = "git homepage"; # source of projects list our $projects_list = "++GITWEB_LIST++"; +# list of additional "directories" under "refs/" we want to display as +# branches +our @additional_branch_refs = (); + # the width (in characters) of the projects list "Description" column our $projects_list_description_width = 25; @@ -626,14 +631,29 @@ sub feature_avatar { return @val ? @val : @_; } +sub get_branch_refs { + return ('heads', @additional_branch_refs); +} + # checking HEAD file with -e is fragile if the repository was # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed # and then pruned. sub check_head_link { my ($dir) = @_; my $headfile = "$dir/HEAD"; - return ((-e $headfile) || - (-l $headfile && readlink($headfile) =~ /^refs\/heads\//)); + + if (-e $headfile) { + return 1; + } + if (-l $headfile) { + my $rl = readlink($headfile); + + for my $ref (get_branch_refs()) { + return 1 if $rl =~ /^refs\/$ref\//; + } + } + + return 0; } sub check_export_ok { @@ -2515,6 +2535,7 @@ sub format_snapshot_links { sub get_feed_info { my $format = shift || 'Atom'; my %res = (action => lc($format)); + my $matched_ref = 0; # feed links are possible only for project views return unless (defined $project); @@ -2522,12 +2543,17 @@ sub get_feed_info { # or don't have specific feed yet (so they should use generic) return if (!$action || $action =~ /^(?:tags|heads|forks|tag|search)$/x); - my $branch; - # branches refs uses 'refs/heads/' prefix (fullname) to differentiate - # from tag links; this also makes possible to detect branch links - if ((defined $hash_base && $hash_base =~ m!^refs/heads/(.*)$!) || - (defined $hash && $hash =~ m!^refs/heads/(.*)$!)) { - $branch = $1; + my $branch = undef; + # branches refs uses 'refs/' + $get_branch_refs()[x] + '/' prefix + # (fullname) to differentiate from tag links; this also makes + # possible to detect branch links + for my $ref (get_branch_refs()) { + if ((defined $hash_base && $hash_base =~ m!^refs/$ref/(.*)$!) || + (defined $hash && $hash =~ m!^refs/$ref/(.*)$!)) { + $branch = $1; + $matched_ref = $ref; + last; + } } # find log type for feed description (title) my $type = 'log'; @@ -2540,7 +2566,7 @@ sub get_feed_info { } $res{-title} = $type; - $res{'hash'} = (defined $branch ? "refs/heads/$branch" : undef); + $res{'hash'} = (defined $branch ? "refs/$matched_ref/$branch" : undef); $res{'file_name'} = $file_name; return %res; @@ -3184,24 +3210,43 @@ sub git_get_project_owner { return $owner; } -sub git_get_last_activity { - my ($path) = @_; - my $fd; +sub git_get_last_activity_age { + my ($refs) = @_; + my $fd = -1; - $git_dir = "$projectroot/$path"; open($fd, "-|", git_cmd(), 'for-each-ref', '--format=%(committer)', '--sort=-committerdate', '--count=1', - 'refs/heads') or return; + $refs) or return undef; + my $most_recent = <$fd>; - close $fd or return; + close $fd or return undef; if (defined $most_recent && $most_recent =~ / (\d+) [-+][01]\d\d\d$/) { my $timestamp = $1; - my $age = time - $timestamp; - return ($age, age_string($age)); + return time - $timestamp; } + + return undef; +} + +sub git_get_last_activity { + my ($path) = @_; + my @ages = (); + + $git_dir = "$projectroot/$path"; + for my $ref (get_branch_refs()) { + my $age = git_get_last_activity_age('refs/' . $_); + + push @ages, $age if defined $age; + } + if (@ages) { + my $min_age = min(@ages); + + return ($min_age, age_string($min_age)); + } + return (undef, undef); } @@ -3223,7 +3268,7 @@ sub git_get_remotes_list { next if $wanted and not $remote eq $wanted; my ($url, $key) = ($1, $2); - $remotes{$remote} ||= { 'heads' => () }; + $remotes{$remote} ||= { map { $_ => () } get_branch_refs() }; $remotes{$remote}{$key} = $url; } close $fd or return; @@ -3237,9 +3282,11 @@ sub fill_remote_heads { my @heads = map { "remotes/$_" } keys %$remotes; my @remoteheads = git_get_heads_list(undef, @heads); foreach my $remote (keys %$remotes) { - $remotes->{$remote}{'heads'} = [ grep { - $_->{'name'} =~ s!^$remote/!! - } @remoteheads ]; + foreach my $ref (get_branch_refs()) { + $remotes->{$remote}{$ref} = [ grep { + $_->{'name'} =~ s!^$remote/!! + } @remoteheads ]; + } } } @@ -3644,7 +3691,7 @@ sub parse_from_to_diffinfo { sub git_get_heads_list { my ($limit, @classes) = @_; - @classes = ('heads') unless @classes; + @classes = get_branch_refs() unless @classes; my @patterns = map { "refs/$_" } @classes; my @headslist; @@ -3662,7 +3709,8 @@ sub git_get_heads_list { my ($committer, $epoch, $tz) = ($committerinfo =~ /^(.*) ([0-9]+) (.*)$/); $ref_item{'fullname'} = $name; - $name =~ s!^refs/(?:head|remote)s/!!; + my $strip_refs = join '|', get_branch_refs(); + $name =~ s!^refs/(?:$strip_refs|remotes)/!!; $ref_item{'name'} = $name; $ref_item{'id'} = $hash; @@ -4286,7 +4334,7 @@ sub git_print_page_nav { # available if the feature is enabled sub format_ref_views { my ($current) = @_; - my @ref_views = qw{tags heads}; + my @ref_views = ('tags', get_branch_refs()); push @ref_views, 'remotes' if gitweb_check_feature('remote_heads'); return join " | ", map { $_ eq $current ? $_ : @@ -7179,7 +7227,8 @@ sub snapshot_name { $ver = $1; } else { # branches and other need shortened SHA-1 hash - if ($hash =~ m!^refs/(?:heads|remotes)/(.*)$!) { + my $strip_refs = join '|', get_branch_refs(); + if ($hash =~ m!^refs/(?:$strip_refs|remotes)/(.*)$!) { $ver = $1; } $ver .= '-' . git_get_short_hash($project, $hash); -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] gitweb: Add an option for adding more branch refs 2013-11-26 10:37 [PATCH] gitweb: Add an option for adding more branch refs Krzesimir Nowak @ 2013-11-26 21:48 ` Junio C Hamano 2013-11-27 15:34 ` Krzesimir Nowak 2013-11-27 15:56 ` Jakub Narębski 1 sibling, 1 reply; 5+ messages in thread From: Junio C Hamano @ 2013-11-26 21:48 UTC (permalink / raw) To: Krzesimir Nowak; +Cc: git Krzesimir Nowak <krzesimir@endocode.com> writes: > Overriding an @additional_branch_refs configuration variable with > value ('wip') will make gitweb to show branches that appear in > refs/heads and refs/wip (refs/heads is hardcoded). Might be useful for > gerrit setups where user branches are not stored under refs/heads/. > > Signed-off-by: Krzesimir Nowak <krzesimir@endocode.com> > --- > gitweb/gitweb.perl | 99 ++++++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 74 insertions(+), 25 deletions(-) > > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl > index 68c77f6..9bfd38b 100755 > --- a/gitweb/gitweb.perl > +++ b/gitweb/gitweb.perl > @@ -17,6 +17,7 @@ use Encode; > use Fcntl ':mode'; > use File::Find qw(); > use File::Basename qw(basename); > +use List::Util qw(min); > use Time::HiRes qw(gettimeofday tv_interval); > binmode STDOUT, ':utf8'; > > @@ -122,6 +123,10 @@ our $logo_label = "git homepage"; > # source of projects list > our $projects_list = "++GITWEB_LIST++"; > > +# list of additional "directories" under "refs/" we want to display as > +# branches > +our @additional_branch_refs = (); > + > # the width (in characters) of the projects list "Description" column > our $projects_list_description_width = 25; > > @@ -626,14 +631,29 @@ sub feature_avatar { > return @val ? @val : @_; > } > > +sub get_branch_refs { > + return ('heads', @additional_branch_refs); > +} > + > # checking HEAD file with -e is fragile if the repository was > # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed > # and then pruned. > sub check_head_link { > my ($dir) = @_; > my $headfile = "$dir/HEAD"; > - return ((-e $headfile) || > - (-l $headfile && readlink($headfile) =~ /^refs\/heads\//)); > + > + if (-e $headfile) { > + return 1; > + } > + if (-l $headfile) { > + my $rl = readlink($headfile); > + > + for my $ref (get_branch_refs()) { > + return 1 if $rl =~ /^refs\/$ref\//; > + } > + } > + return 0; The change to this function is wrong. A non-detached HEAD that points at anything other than refs/heads/ should be considered a repository corruption and should not be encouraged. > @@ -2515,6 +2535,7 @@ sub format_snapshot_links { > sub get_feed_info { > my $format = shift || 'Atom'; > my %res = (action => lc($format)); > + my $matched_ref = 0; > > # feed links are possible only for project views > return unless (defined $project); > @@ -2522,12 +2543,17 @@ sub get_feed_info { > # or don't have specific feed yet (so they should use generic) > return if (!$action || $action =~ /^(?:tags|heads|forks|tag|search)$/x); > > - my $branch; > - # branches refs uses 'refs/heads/' prefix (fullname) to differentiate > - # from tag links; this also makes possible to detect branch links > - if ((defined $hash_base && $hash_base =~ m!^refs/heads/(.*)$!) || > - (defined $hash && $hash =~ m!^refs/heads/(.*)$!)) { > - $branch = $1; > + my $branch = undef; > + # branches refs uses 'refs/' + $get_branch_refs()[x] + '/' prefix > + # (fullname) to differentiate from tag links; this also makes > + # possible to detect branch links > + for my $ref (get_branch_refs()) { > + if ((defined $hash_base && $hash_base =~ m!^refs/$ref/(.*)$!) || > + (defined $hash && $hash =~ m!^refs/$ref/(.*)$!)) { > + $branch = $1; > + $matched_ref = $ref; > + last; > + } > } > # find log type for feed description (title) > my $type = 'log'; > @@ -2540,7 +2566,7 @@ sub get_feed_info { > } > > $res{-title} = $type; > - $res{'hash'} = (defined $branch ? "refs/heads/$branch" : undef); > + $res{'hash'} = (defined $branch ? "refs/$matched_ref/$branch" : undef); > $res{'file_name'} = $file_name; OK. > @@ -3184,24 +3210,43 @@ sub git_get_project_owner { > return $owner; > } > > -sub git_get_last_activity { > - my ($path) = @_; > - my $fd; > +sub git_get_last_activity_age { > + my ($refs) = @_; > + my $fd = -1; > > - $git_dir = "$projectroot/$path"; > open($fd, "-|", git_cmd(), 'for-each-ref', > '--format=%(committer)', > '--sort=-committerdate', > '--count=1', > - 'refs/heads') or return; > + $refs) or return undef; > + > my $most_recent = <$fd>; > - close $fd or return; > + close $fd or return undef; > if (defined $most_recent && > $most_recent =~ / (\d+) [-+][01]\d\d\d$/) { > my $timestamp = $1; > - my $age = time - $timestamp; > - return ($age, age_string($age)); > + return time - $timestamp; > } > + > + return undef; > +} > + > +sub git_get_last_activity { > + my ($path) = @_; > + my @ages = (); > + > + $git_dir = "$projectroot/$path"; > + for my $ref (get_branch_refs()) { > + my $age = git_get_last_activity_age('refs/' . $_); > + > + push @ages, $age if defined $age; > + } > + if (@ages) { > + my $min_age = min(@ages); > + > + return ($min_age, age_string($min_age)); > + } > + > return (undef, undef); > } The original runs for-each-ref --count=1 refs/heads and picks the latest one, so shouldn't it be the matter of running for-each-ref --count=1 refs/heads refs/extra i.e. something like @@ -3193,7 +3193,7 @@ sub git_get_last_activity { '--format=%(committer)', '--sort=-committerdate', '--count=1', - 'refs/heads') or return; + map { "refs/$_" } get_branch_refs()) or return; my $most_recent = <$fd>; close $fd or return; if (defined $most_recent && to grab the latest among the refs you care about? > @@ -3223,7 +3268,7 @@ sub git_get_remotes_list { > next if $wanted and not $remote eq $wanted; > my ($url, $key) = ($1, $2); > > - $remotes{$remote} ||= { 'heads' => () }; > + $remotes{$remote} ||= { map { $_ => () } get_branch_refs() }; > $remotes{$remote}{$key} = $url; > } > close $fd or return; > @@ -3237,9 +3282,11 @@ sub fill_remote_heads { > my @heads = map { "remotes/$_" } keys %$remotes; > my @remoteheads = git_get_heads_list(undef, @heads); > foreach my $remote (keys %$remotes) { > - $remotes->{$remote}{'heads'} = [ grep { > - $_->{'name'} =~ s!^$remote/!! > - } @remoteheads ]; > + foreach my $ref (get_branch_refs()) { > + $remotes->{$remote}{$ref} = [ grep { > + $_->{'name'} =~ s!^$remote/!! > + } @remoteheads ]; > + } > } > } Hmmm, why? Aren't these additional ones about the local "branch-like" refs? What makes us think that these names are also shared with the names from remote hierarchies? > @@ -3644,7 +3691,7 @@ sub parse_from_to_diffinfo { > > sub git_get_heads_list { > my ($limit, @classes) = @_; > - @classes = ('heads') unless @classes; > + @classes = get_branch_refs() unless @classes; > my @patterns = map { "refs/$_" } @classes; > my @headslist; > > @@ -3662,7 +3709,8 @@ sub git_get_heads_list { > my ($committer, $epoch, $tz) = > ($committerinfo =~ /^(.*) ([0-9]+) (.*)$/); > $ref_item{'fullname'} = $name; > - $name =~ s!^refs/(?:head|remote)s/!!; > + my $strip_refs = join '|', get_branch_refs(); > + $name =~ s!^refs/(?:$strip_refs|remotes)/!!; > > $ref_item{'name'} = $name; > $ref_item{'id'} = $hash; > @@ -4286,7 +4334,7 @@ sub git_print_page_nav { > # available if the feature is enabled > sub format_ref_views { > my ($current) = @_; > - my @ref_views = qw{tags heads}; > + my @ref_views = ('tags', get_branch_refs()); > push @ref_views, 'remotes' if gitweb_check_feature('remote_heads'); > return join " | ", map { > $_ eq $current ? $_ : > @@ -7179,7 +7227,8 @@ sub snapshot_name { > $ver = $1; > } else { > # branches and other need shortened SHA-1 hash > - if ($hash =~ m!^refs/(?:heads|remotes)/(.*)$!) { > + my $strip_refs = join '|', get_branch_refs(); > + if ($hash =~ m!^refs/(?:$strip_refs|remotes)/(.*)$!) { > $ver = $1; > } > $ver .= '-' . git_get_short_hash($project, $hash); As the elements of @additional_branch_refs are expected by code added by this patch to never have any special metacharacters in them, it probably is a good idea to sanity check it to catch misconfigurations and typos before doing anything else. Other than that, looks good to me. Thanks. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gitweb: Add an option for adding more branch refs 2013-11-26 21:48 ` Junio C Hamano @ 2013-11-27 15:34 ` Krzesimir Nowak 0 siblings, 0 replies; 5+ messages in thread From: Krzesimir Nowak @ 2013-11-27 15:34 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Tue, 2013-11-26 at 13:48 -0800, Junio C Hamano wrote: > Krzesimir Nowak <krzesimir@endocode.com> writes: > > > Overriding an @additional_branch_refs configuration variable with > > value ('wip') will make gitweb to show branches that appear in > > refs/heads and refs/wip (refs/heads is hardcoded). Might be useful for > > gerrit setups where user branches are not stored under refs/heads/. > > > > Signed-off-by: Krzesimir Nowak <krzesimir@endocode.com> > > --- > > gitweb/gitweb.perl | 99 ++++++++++++++++++++++++++++++++++++++++-------------- > > 1 file changed, 74 insertions(+), 25 deletions(-) > > > > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl > > index 68c77f6..9bfd38b 100755 > > --- a/gitweb/gitweb.perl > > +++ b/gitweb/gitweb.perl > > @@ -17,6 +17,7 @@ use Encode; > > use Fcntl ':mode'; > > use File::Find qw(); > > use File::Basename qw(basename); > > +use List::Util qw(min); > > use Time::HiRes qw(gettimeofday tv_interval); > > binmode STDOUT, ':utf8'; > > > > @@ -122,6 +123,10 @@ our $logo_label = "git homepage"; > > # source of projects list > > our $projects_list = "++GITWEB_LIST++"; > > > > +# list of additional "directories" under "refs/" we want to display as > > +# branches > > +our @additional_branch_refs = (); > > + > > # the width (in characters) of the projects list "Description" column > > our $projects_list_description_width = 25; > > > > @@ -626,14 +631,29 @@ sub feature_avatar { > > return @val ? @val : @_; > > } > > > > +sub get_branch_refs { > > + return ('heads', @additional_branch_refs); > > +} > > + > > # checking HEAD file with -e is fragile if the repository was > > # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed > > # and then pruned. > > sub check_head_link { > > my ($dir) = @_; > > my $headfile = "$dir/HEAD"; > > - return ((-e $headfile) || > > - (-l $headfile && readlink($headfile) =~ /^refs\/heads\//)); > > + > > + if (-e $headfile) { > > + return 1; > > + } > > + if (-l $headfile) { > > + my $rl = readlink($headfile); > > + > > + for my $ref (get_branch_refs()) { > > + return 1 if $rl =~ /^refs\/$ref\//; > > + } > > + } > > + return 0; > > The change to this function is wrong. A non-detached HEAD that > points at anything other than refs/heads/ should be considered a > repository corruption and should not be encouraged. Ok, I'll get rid of it. > > > @@ -2515,6 +2535,7 @@ sub format_snapshot_links { > > sub get_feed_info { > > my $format = shift || 'Atom'; > > my %res = (action => lc($format)); > > + my $matched_ref = 0; > > > > # feed links are possible only for project views > > return unless (defined $project); > > @@ -2522,12 +2543,17 @@ sub get_feed_info { > > # or don't have specific feed yet (so they should use generic) > > return if (!$action || $action =~ /^(?:tags|heads|forks|tag|search)$/x); > > > > - my $branch; > > - # branches refs uses 'refs/heads/' prefix (fullname) to differentiate > > - # from tag links; this also makes possible to detect branch links > > - if ((defined $hash_base && $hash_base =~ m!^refs/heads/(.*)$!) || > > - (defined $hash && $hash =~ m!^refs/heads/(.*)$!)) { > > - $branch = $1; > > + my $branch = undef; > > + # branches refs uses 'refs/' + $get_branch_refs()[x] + '/' prefix > > + # (fullname) to differentiate from tag links; this also makes > > + # possible to detect branch links > > + for my $ref (get_branch_refs()) { > > + if ((defined $hash_base && $hash_base =~ m!^refs/$ref/(.*)$!) || > > + (defined $hash && $hash =~ m!^refs/$ref/(.*)$!)) { > > + $branch = $1; > > + $matched_ref = $ref; > > + last; > > + } > > } > > # find log type for feed description (title) > > my $type = 'log'; > > @@ -2540,7 +2566,7 @@ sub get_feed_info { > > } > > > > $res{-title} = $type; > > - $res{'hash'} = (defined $branch ? "refs/heads/$branch" : undef); > > + $res{'hash'} = (defined $branch ? "refs/$matched_ref/$branch" : undef); > > $res{'file_name'} = $file_name; > > OK. > > > @@ -3184,24 +3210,43 @@ sub git_get_project_owner { > > return $owner; > > } > > > > -sub git_get_last_activity { > > - my ($path) = @_; > > - my $fd; > > +sub git_get_last_activity_age { > > + my ($refs) = @_; > > + my $fd = -1; > > > > - $git_dir = "$projectroot/$path"; > > open($fd, "-|", git_cmd(), 'for-each-ref', > > '--format=%(committer)', > > '--sort=-committerdate', > > '--count=1', > > - 'refs/heads') or return; > > + $refs) or return undef; > > + > > my $most_recent = <$fd>; > > - close $fd or return; > > + close $fd or return undef; > > if (defined $most_recent && > > $most_recent =~ / (\d+) [-+][01]\d\d\d$/) { > > my $timestamp = $1; > > - my $age = time - $timestamp; > > - return ($age, age_string($age)); > > + return time - $timestamp; > > } > > + > > + return undef; > > +} > > + > > +sub git_get_last_activity { > > + my ($path) = @_; > > + my @ages = (); > > + > > + $git_dir = "$projectroot/$path"; > > + for my $ref (get_branch_refs()) { > > + my $age = git_get_last_activity_age('refs/' . $_); > > + > > + push @ages, $age if defined $age; > > + } > > + if (@ages) { > > + my $min_age = min(@ages); > > + > > + return ($min_age, age_string($min_age)); > > + } > > + > > return (undef, undef); > > } > > The original runs > > for-each-ref --count=1 refs/heads > > and picks the latest one, so shouldn't it be the matter of running > > for-each-ref --count=1 refs/heads refs/extra > > i.e. something like > > @@ -3193,7 +3193,7 @@ sub git_get_last_activity { > '--format=%(committer)', > '--sort=-committerdate', > '--count=1', > - 'refs/heads') or return; > + map { "refs/$_" } get_branch_refs()) or return; > my $most_recent = <$fd>; > close $fd or return; > if (defined $most_recent && > > to grab the latest among the refs you care about? That's simpler, yes. > > > @@ -3223,7 +3268,7 @@ sub git_get_remotes_list { > > next if $wanted and not $remote eq $wanted; > > my ($url, $key) = ($1, $2); > > > > - $remotes{$remote} ||= { 'heads' => () }; > > + $remotes{$remote} ||= { map { $_ => () } get_branch_refs() }; > > $remotes{$remote}{$key} = $url; > > } > > close $fd or return; > > @@ -3237,9 +3282,11 @@ sub fill_remote_heads { > > my @heads = map { "remotes/$_" } keys %$remotes; > > my @remoteheads = git_get_heads_list(undef, @heads); > > foreach my $remote (keys %$remotes) { > > - $remotes->{$remote}{'heads'} = [ grep { > > - $_->{'name'} =~ s!^$remote/!! > > - } @remoteheads ]; > > + foreach my $ref (get_branch_refs()) { > > + $remotes->{$remote}{$ref} = [ grep { > > + $_->{'name'} =~ s!^$remote/!! > > + } @remoteheads ]; > > + } > > } > > } > > Hmmm, why? Aren't these additional ones about the local > "branch-like" refs? What makes us think that these names are also > shared with the names from remote hierarchies? Might be another place where I had no clue if the change is right. Sorry. > > > @@ -3644,7 +3691,7 @@ sub parse_from_to_diffinfo { > > > > sub git_get_heads_list { > > my ($limit, @classes) = @_; > > - @classes = ('heads') unless @classes; > > + @classes = get_branch_refs() unless @classes; > > my @patterns = map { "refs/$_" } @classes; > > my @headslist; > > > > @@ -3662,7 +3709,8 @@ sub git_get_heads_list { > > my ($committer, $epoch, $tz) = > > ($committerinfo =~ /^(.*) ([0-9]+) (.*)$/); > > $ref_item{'fullname'} = $name; > > - $name =~ s!^refs/(?:head|remote)s/!!; > > + my $strip_refs = join '|', get_branch_refs(); > > + $name =~ s!^refs/(?:$strip_refs|remotes)/!!; > > > > $ref_item{'name'} = $name; > > $ref_item{'id'} = $hash; > > @@ -4286,7 +4334,7 @@ sub git_print_page_nav { > > # available if the feature is enabled > > sub format_ref_views { > > my ($current) = @_; > > - my @ref_views = qw{tags heads}; > > + my @ref_views = ('tags', get_branch_refs()); I'll get rid of that change, too. I just verified that it is wrong too. > > push @ref_views, 'remotes' if gitweb_check_feature('remote_heads'); > > return join " | ", map { > > $_ eq $current ? $_ : > > @@ -7179,7 +7227,8 @@ sub snapshot_name { > > $ver = $1; > > } else { > > # branches and other need shortened SHA-1 hash > > - if ($hash =~ m!^refs/(?:heads|remotes)/(.*)$!) { > > + my $strip_refs = join '|', get_branch_refs(); > > + if ($hash =~ m!^refs/(?:$strip_refs|remotes)/(.*)$!) { > > $ver = $1; > > } > > $ver .= '-' . git_get_short_hash($project, $hash); > > As the elements of @additional_branch_refs are expected by code > added by this patch to never have any special metacharacters in > them, it probably is a good idea to sanity check it to catch > misconfigurations and typos before doing anything else. > I assume that in case of misconfiguration we are returning 500. I added a sanity checking for duplicate refs, for explicitly specified 'heads' and refs that fail to pass the validate_ref (which I splitted from validate_refname). As for metacharacters - valid ref can contain a '|' which is a metacharacter in regex, so I wrapped some uses of @additional_branch_refs members in regexes into \Q and \E or used a quotemeta on them. That escapes metacharacters. Also, I added some docs to gitweb.conf.txt. Patch in "[PATCH v2] gitweb: Add an option for adding more branch refs" > Other than that, looks good to me. > > Thanks. -- Krzesimir Nowak Software Developer Endocode AG krzesimir@endocode.com ------ Endocode AG, Johannisstraße 20, 10117 Berlin info@endocode.com | www.endocode.com Vorstandsvorsitzender: Mirko Boehm Vorstände: Dr. Karl Beecher, Chris Kühl, Sebastian Sucker Aufsichtsratsvorsitzende: Jennifer Beecher Registergericht: Amtsgericht Charlottenburg - HRB 150748 B ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gitweb: Add an option for adding more branch refs 2013-11-26 10:37 [PATCH] gitweb: Add an option for adding more branch refs Krzesimir Nowak 2013-11-26 21:48 ` Junio C Hamano @ 2013-11-27 15:56 ` Jakub Narębski 2013-11-27 16:15 ` Krzesimir Nowak 1 sibling, 1 reply; 5+ messages in thread From: Jakub Narębski @ 2013-11-27 15:56 UTC (permalink / raw) To: Krzesimir Nowak; +Cc: git, gitster Krzesimir Nowak wrote: > Overriding an @additional_branch_refs configuration variable with > value ('wip') will make gitweb to show branches that appear in > refs/heads and refs/wip (refs/heads is hardcoded). Might be useful for > gerrit setups where user branches are not stored under refs/heads/. > The description of this change starts with technical details, instead of starting with intent of this change. Perhaps (this is only a proposal) Introduce @additional_branch_refs configuration variable, holding names of references to be considered branches; by default empty. For example setting it to ('wip') will make gitweb ... BTW. I have thought at first that is something similar to 'remote_heads' feature, which among others adds 'remotes' section to 'summary' view displaying refs/remotes/* refs... but no, gitweb still doesn't treat refs/remotes as branches, even with this feature set. Nb. why new configuration variable, and not new %feature? > Signed-off-by: Krzesimir Nowak <krzesimir@endocode.com> > --- > gitweb/gitweb.perl | 99 ++++++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 74 insertions(+), 25 deletions(-) > > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl > index 68c77f6..9bfd38b 100755 > --- a/gitweb/gitweb.perl > +++ b/gitweb/gitweb.perl > @@ -17,6 +17,7 @@ use Encode; > use Fcntl ':mode'; > use File::Find qw(); > use File::Basename qw(basename); > +use List::Util qw(min); > use Time::HiRes qw(gettimeofday tv_interval); > binmode STDOUT, ':utf8'; > [...] > @@ -3184,24 +3210,43 @@ sub git_get_project_owner { > return $owner; > } > > -sub git_get_last_activity { > - my ($path) = @_; > - my $fd; > +sub git_get_last_activity_age { > + my ($refs) = @_; > + my $fd = -1; > > - $git_dir = "$projectroot/$path"; > open($fd, "-|", git_cmd(), 'for-each-ref', > '--format=%(committer)', > '--sort=-committerdate', > '--count=1', > - 'refs/heads') or return; > + $refs) or return undef; git-for-each-ref accepts more than one pattern. Why not simply open($fd, "-|", git_cmd(), 'for-each-ref', '--format=%(committer)', '--sort=-committerdate', '--count=1', - 'refs/heads') or return; + get_branch_refs()) or return; Then we won't need List::Util::min. [...] > +sub git_get_last_activity { > + my ($path) = @_; > + my @ages = (); > + > + $git_dir = "$projectroot/$path"; > + for my $ref (get_branch_refs()) { > + my $age = git_get_last_activity_age('refs/' . $_); > + > + push @ages, $age if defined $age; > + } > + if (@ages) { > + my $min_age = min(@ages); > + > + return ($min_age, age_string($min_age)); > + } > + > return (undef, undef); > } > [...] -- Jakub Narębski ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gitweb: Add an option for adding more branch refs 2013-11-27 15:56 ` Jakub Narębski @ 2013-11-27 16:15 ` Krzesimir Nowak 0 siblings, 0 replies; 5+ messages in thread From: Krzesimir Nowak @ 2013-11-27 16:15 UTC (permalink / raw) To: Jakub Narębski; +Cc: git, gitster On Wed, 2013-11-27 at 16:56 +0100, Jakub Narębski wrote: > Krzesimir Nowak wrote: > > > Overriding an @additional_branch_refs configuration variable with > > value ('wip') will make gitweb to show branches that appear in > > refs/heads and refs/wip (refs/heads is hardcoded). Might be useful for > > gerrit setups where user branches are not stored under refs/heads/. > > > > The description of this change starts with technical details, > instead of starting with intent of this change. > > Perhaps (this is only a proposal) > > Introduce @additional_branch_refs configuration variable, holding > names of references to be considered branches; by default empty. > For example setting it to ('wip') will make gitweb ... > I have already posted second version of the patch. But I didn't change the commit message though. But thanks for proposal - it sounds better. I'll try to make it better next time I post a patch. > > BTW. I have thought at first that is something similar to 'remote_heads' > feature, which among others adds 'remotes' section to 'summary' view > displaying refs/remotes/* refs... but no, gitweb still doesn't treat > refs/remotes as branches, even with this feature set. > > Nb. why new configuration variable, and not new %feature? I dunno. Hard to tell where it fits. Junio told me about using "normal gitweb configuration mechanism", so that's the first thing that got my attention. http://www.mail-archive.com/git@vger.kernel.org/msg39859.html > > > Signed-off-by: Krzesimir Nowak <krzesimir@endocode.com> > > --- > > gitweb/gitweb.perl | 99 ++++++++++++++++++++++++++++++++++++++++-------------- > > 1 file changed, 74 insertions(+), 25 deletions(-) > > > > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl > > index 68c77f6..9bfd38b 100755 > > --- a/gitweb/gitweb.perl > > +++ b/gitweb/gitweb.perl > > @@ -17,6 +17,7 @@ use Encode; > > use Fcntl ':mode'; > > use File::Find qw(); > > use File::Basename qw(basename); > > +use List::Util qw(min); > > use Time::HiRes qw(gettimeofday tv_interval); > > binmode STDOUT, ':utf8'; > > > [...] > > @@ -3184,24 +3210,43 @@ sub git_get_project_owner { > > return $owner; > > } > > > > -sub git_get_last_activity { > > - my ($path) = @_; > > - my $fd; > > +sub git_get_last_activity_age { > > + my ($refs) = @_; > > + my $fd = -1; > > > > - $git_dir = "$projectroot/$path"; > > open($fd, "-|", git_cmd(), 'for-each-ref', > > '--format=%(committer)', > > '--sort=-committerdate', > > '--count=1', > > - 'refs/heads') or return; > > + $refs) or return undef; > > git-for-each-ref accepts more than one pattern. Why not simply > > open($fd, "-|", git_cmd(), 'for-each-ref', > '--format=%(committer)', > '--sort=-committerdate', > '--count=1', > - 'refs/heads') or return; > + get_branch_refs()) or return; > > Then we won't need List::Util::min. Yes, Junio pointed that out to me - fixed in second version of the patch. > > [...] > > +sub git_get_last_activity { > > + my ($path) = @_; > > + my @ages = (); > > + > > + $git_dir = "$projectroot/$path"; > > + for my $ref (get_branch_refs()) { > > + my $age = git_get_last_activity_age('refs/' . $_); > > + > > + push @ages, $age if defined $age; > > + } > > + if (@ages) { > > + my $min_age = min(@ages); > > + > > + return ($min_age, age_string($min_age)); > > + } > > + > > return (undef, undef); > > } > > > [...] -- Krzesimir Nowak Software Developer Endocode AG krzesimir@endocode.com ------ Endocode AG, Johannisstraße 20, 10117 Berlin info@endocode.com | www.endocode.com Vorstandsvorsitzender: Mirko Boehm Vorstände: Dr. Karl Beecher, Chris Kühl, Sebastian Sucker Aufsichtsratsvorsitzende: Jennifer Beecher Registergericht: Amtsgericht Charlottenburg - HRB 150748 B ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-11-27 16:15 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-11-26 10:37 [PATCH] gitweb: Add an option for adding more branch refs Krzesimir Nowak 2013-11-26 21:48 ` Junio C Hamano 2013-11-27 15:34 ` Krzesimir Nowak 2013-11-27 15:56 ` Jakub Narębski 2013-11-27 16:15 ` Krzesimir Nowak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).