On Wed, Dec 4, 2013 at 2:43 PM, Krzesimir Nowak <krzesi...@endocode.com> wrote:

> Given two branches residing in refs/heads/master and refs/wip/feature
> the list-of-branches view will present them in following way:
>
> master
> feature (wip)
>
> When getting a snapshot of a 'feature' branch, the tarball is going to
> have name like 'project-wip-feature-<short hash>.tgz'.
>
> Signed-off-by: Krzesimir Nowak <krzesi...@endocode.com>

Very nice feature, which allows to distinguish between refs/heads/feature
and refs/wip/feature.

> ---
>  gitweb/gitweb.perl | 27 +++++++++++++++++++++++++--
>  1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index 6d3d52d..9a63ea9 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -3739,8 +3739,14 @@ sub git_get_heads_list {
>                 $ref_item{'fullname'}  = $name;
>                 my $strip_refs = join '|', map { quotemeta } 
> get_branch_refs();
>                 $name =~ s!^refs/($strip_refs|remotes)/!!;
> +               $ref_item{'name'} = $name;
> +               # for refs neither in 'heads' nor 'remotes' we want to
> +               # show their different ref dir

Perhaps simply:

  +               # for refs neither in 'heads' nor 'remotes' we want
to show their ref dir

> +               my $ref_dir = (defined $1) ? $1 : '';
> +               if ($ref_dir ne '' and $ref_dir ne 'heads' and $ref_dir ne 
> 'remotes') {
> +                   $ref_item{'name'} .= ' (' . $ref_dir . ')';
> +               }
>
> -               $ref_item{'name'}  = $name;
>                 $ref_item{'id'}    = $hash;
>                 $ref_item{'title'} = $title || '(no commit message)';
>                 $ref_item{'epoch'} = $epoch;
> @@ -7257,7 +7263,24 @@ sub snapshot_name {
>                 # branches and other need shortened SHA-1 hash
>                 my $strip_refs = join '|', map { quotemeta } 
> get_branch_refs();
>                 if ($hash =~ m!^refs/($strip_refs|remotes)/(.*)$!) {
> -                       $ver = $1;
> +                       my $ref_dir = $1;
> +                       $ver = $2;
> +
> +                       if (defined $ref_dir) {
> +                               # this is going to be a part of
> +                               # filename, so lets stick to
> +                               # alphanumerics, dashes and underlines
> +                               # only - some filesystems do not like
> +                               # some punctuation symbols for
> +                               # example.
> +                               $ref_dir =~ s/[^[:alnum:]_-]//g;
> +                       }

I think this safety replacement should apply also to other parts of filename,
if it is to be used.

$ref_dir should be compatibile with path-part - in loose form it is stored
on filesystem... though different filesystems might have different restrictions.

One thing we should worry about is '/' in hierarchical refdir names, e.g.
'wip/jk', which needs to be replaced / sanitized somehow, though probably
as 'wip-jk' or 'wip_jk' rather than 'wipjk', isn't it?

> +
> +                       # for refs not in heads nor remotes we want to
> +                       # add a ref dir to archive name
> +                       if ($ref_dir ne '' and $ref_dir ne 'heads' and 
> $ref_dir ne 'remotes') {
> +                               $ver = $ref_dir . '-' . $ver;
> +                       }
>                 }
>                 $ver .= '-' . git_get_short_hash($project, $hash);
>         }
> --
> 1.8.3.1
>



-- 
Jakub Narebski
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to