Subject: Re: [PATCH 6/9] gitweb: Change appereance of marker of refs pointing to given object

From: Jakub Narebski <[email-masked]>
Date: Tue, 15 Aug 2006 18:34:17 +0200

Junio C Hamano wrote:

> Jakub Narebski <[email-masked]> writes:
> 
>> Change git_get_references to include type of ref in the %refs value, which
>> means putting everything after 'refs/' as a ref name, not only last
>> part of the name.  Instead of separating refs pointing to the same
>> object by " / " separator, use anonymous array reference to store all
>> refs pointing to given object.
>>
>> Use 'git-ls-remote .' if $projectroot/$project/info/refs does not
>> exist.  (Perhaps it should be used always.)
>>
>> Refs are now in separate span elements.  Class is dependent on the ref
>> type: currently known classes are 'tag', 'head', 'remote', and 'ref'
>> (last one for HEAD and other refs in the main directory).  There is
>> encompassing span element of class refs, just in case of unknown ref
>> type.
> 
> I do not see definition that matches "span.refs span.remote" in
> the CSS, though.

It get's default style "span.refs span" (and fefault colors).

>> +                    # e.g. tags/v2.6.11 or heads/next
>> +                    if ($ref =~ m!^(.*?)s?/(.*)$!) {
>> +                            $type = $1;
>> +                            $name = $2;
>> +                    } else {
>> +                            $type = "ref";
>> +                            $name = $ref;
>> +                    }
> 
> Hmph.  Maybe have a hash that defines the ones you know how to
> handle, and do something like:
> 
>         if ($ref =~ m|^([^/]+)/(.*)$| &&  exists $i_know_this_class{$1}) {
>               $type = $1;
>               $name = $2;
>       }
>         else {
>               $type = 'ref';
>               $name = $ref;
>       }

But what types are known is defined in CSS, not in gitweb.perl. The rule
is that type is defined by first component of the ref name, in singular form
(so with optional final s removed, refs -> ref, tags -> tag, remotes -> remote).
All unknown types get default "span.refs span" format, thanks to encompassing
span element.

"ref" class is for refs directly in $GIT_DIR, like HEAD or ORIG_HEAD (as of now
you cannot get such a ref due to the regexp used in git_get_references, and
the fact that you have no such refs in $GIT_DIR/info/refs file, and 
'git-ls-remote .' gives only HEAD; but we could add them 'by hand').

>> @@ -561,18 +578,24 @@ sub git_get_project_owner {
>>...
>> +            if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?[^\^]+)/) {
>>                      if (defined $refs{$1}) {
>> -                            $refs{$1} .= " / $2";
>> +                            push @{$refs{$1}}, $2;
>>                      } else {
>> -                            $refs{$1} = $2;
>> +                            $refs{$1} = [ $2 ];
>>                      }
>>              }
> 
> It would work as in your patch, but I would have preferred to
> see "exists $refs{$1}" there instead of "defined".
> 
> Or lose the if() and do it like this, which would be cleaner?
> 
>       if ($line =~ ...) {
>               push @{$refs{$1}}, $2;
>       }

That's even better.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git