From: Krzesimir Nowak <krzesimir@endocode.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] gitweb: Make showing branches configurable
Date: Mon, 25 Nov 2013 10:37:20 +0100 [thread overview]
Message-ID: <1385372240.2182.8.camel@localhost.localdomain> (raw)
In-Reply-To: <xmqqhab41gsu.fsf@gitster.dls.corp.google.com>
On Fri, 2013-11-22 at 09:34 -0800, Junio C Hamano wrote:
> Krzesimir Nowak <krzesimir@endocode.com> writes:
>
> > Running 'make GITWEB_WANTED_REFS="heads wip" gitweb.cgi' will create a
> > gitweb CGI script showing branches that appear in refs/heads/ and in
> > refs/wip/. Might be useful for gerrit setups where user branches are
> > not stored under refs/heads/.
> >
> > Signed-off-by: Krzesimir Nowak <krzesimir@endocode.com>
> > ---
> >
> > Notes:
> > I'm actually not sure if all those changes are really necessary as I
> > was mostly targeting it for Gerrit use. Especially I mean the changes
> > in git_get_remotes_list, fill_remote_heads and print_page_nav. I tried
> > to make it as general as it gets, so there's nothing Gerrit specific.
>
> Thanks.
>
> Two knee-jerk reactions after a quick scan.
>
> - You include "heads" for normal builds by hardcoded
> "GITWEB_WANTED_REFS = heads" but include "tags" unconditionally
> by having @ref_views = ("tags", @wanted_refs) in the code. Why?
>
Earlier both "tags" and "heads" were hardcoded there. So now instead of
"heads" we have @wanted_refs.
I suppose I should have given it a better name, like @branch_refs.
Right?
> - Does this have be a compile-time decision? It looks like this is
> something that can and should be made controllable with the
> normal gitweb configuration mechanism.
>
Maybe. I was just looking at Makefile and saw a bunch of configuration
options there, so I just added another one. Haven't noticed the gitweb
config thing. Sorry.
So, we should just hardcode the @wanted_refs (or @branch_refs after the
rename) to simply ('heads'), let it be overriden by perl gitweb config
file and get rid of a new substitution from Makefile?
>
> > gitweb/Makefile | 4 ++-
> > gitweb/gitweb.perl | 94 +++++++++++++++++++++++++++++++++++++++---------------
> > 2 files changed, 72 insertions(+), 26 deletions(-)
> >
> > diff --git a/gitweb/Makefile b/gitweb/Makefile
> > index cd194d0..361dce9 100644
> > --- a/gitweb/Makefile
> > +++ b/gitweb/Makefile
> > @@ -38,6 +38,7 @@ GITWEB_SITE_HTML_HEAD_STRING =
> > GITWEB_SITE_HEADER =
> > GITWEB_SITE_FOOTER =
> > HIGHLIGHT_BIN = highlight
> > +GITWEB_WANTED_REFS = heads
> >
> > # include user config
> > -include ../config.mak.autogen
> > @@ -148,7 +149,8 @@ GITWEB_REPLACE = \
> > -e 's|++GITWEB_SITE_HTML_HEAD_STRING++|$(GITWEB_SITE_HTML_HEAD_STRING)|g' \
> > -e 's|++GITWEB_SITE_HEADER++|$(GITWEB_SITE_HEADER)|g' \
> > -e 's|++GITWEB_SITE_FOOTER++|$(GITWEB_SITE_FOOTER)|g' \
> > - -e 's|++HIGHLIGHT_BIN++|$(HIGHLIGHT_BIN)|g'
> > + -e 's|++HIGHLIGHT_BIN++|$(HIGHLIGHT_BIN)|g' \
> > + -e 's|++GITWEB_WANTED_REFS++|$(GITWEB_WANTED_REFS)|g'
> >
> > GITWEB-BUILD-OPTIONS: FORCE
> > @rm -f $@+
> > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> > index 68c77f6..8bc9e9a 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,9 @@ our $logo_label = "git homepage";
> > # source of projects list
> > our $projects_list = "++GITWEB_LIST++";
> >
> > +# list of "directories" under "refs/" we want to display as branches
> > +our @wanted_refs = qw{++GITWEB_WANTED_REFS++};
> > +
> > # the width (in characters) of the projects list "Description" column
> > our $projects_list_description_width = 25;
> >
> > @@ -632,8 +636,19 @@ sub feature_avatar {
> > 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 (@wanted_refs) {
> > + return 1 if $rl =~ /^refs\/$ref\//;
> > + }
> > + }
> > +
> > + return 0;
> > }
> >
> > sub check_export_ok {
> > @@ -2515,6 +2530,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 +2538,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/' + $wanted_refs[x] + '/' prefix
> > + # (fullname) to differentiate from tag links; this also makes
> > + # possible to detect branch links
> > + for my $ref (@wanted_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 +2561,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 +3205,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 (@wanted_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 +3263,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 { $_ => () } @wanted_refs };
> > $remotes{$remote}{$key} = $url;
> > }
> > close $fd or return;
> > @@ -3237,9 +3277,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 (@wanted_refs) {
> > + $remotes->{$remote}{$ref} = [ grep {
> > + $_->{'name'} =~ s!^$remote/!!
> > + } @remoteheads ];
> > + }
> > }
> > }
> >
> > @@ -3644,7 +3686,7 @@ sub parse_from_to_diffinfo {
> >
> > sub git_get_heads_list {
> > my ($limit, @classes) = @_;
> > - @classes = ('heads') unless @classes;
> > + @classes = @wanted_refs unless @classes;
> > my @patterns = map { "refs/$_" } @classes;
> > my @headslist;
> >
> > @@ -3662,7 +3704,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 '|', @wanted_refs;
> > + $name =~ s!^refs/(?:$strip_refs|remotes)/!!;
> >
> > $ref_item{'name'} = $name;
> > $ref_item{'id'} = $hash;
> > @@ -4286,7 +4329,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", @wanted_refs);
> > push @ref_views, 'remotes' if gitweb_check_feature('remote_heads');
> > return join " | ", map {
> > $_ eq $current ? $_ :
> > @@ -7179,7 +7222,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 '|', @wanted_refs;
> > + if ($hash =~ m!^refs/(?:$strip_refs|remotes)/(.*)$!) {
> > $ver = $1;
> > }
> > $ver .= '-' . git_get_short_hash($project, $hash);
--
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
next prev parent reply other threads:[~2013-11-25 9:37 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-22 13:10 [PATCH] gitweb: Make showing branches configurable Krzesimir Nowak
2013-11-22 17:34 ` Junio C Hamano
2013-11-25 9:37 ` Krzesimir Nowak [this message]
2013-11-25 19:32 ` Junio C Hamano
2013-11-26 10:38 ` Krzesimir Nowak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385372240.2182.8.camel@localhost.localdomain \
--to=krzesimir@endocode.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).