Junio C Hamano wrote: > Now, once we start doing this, it may make sense to rethink how > this function and git_get_references functions are used. I > think > > git grep -n -e '^sub ' \ > -e git_get_references \ > -e git_get_refs_list gitweb/gitweb.perl > > would be instructive how wasteful the current code is. > > get_refs_list is called _TWICE_ in git_summary and worse yet > very late in the function, after calling git_get_references that > could already have done what the function does (by the way, > git_get_references already knows how to use peek-remote output > but for some reason it uses ls-remote -- I think you can safely > rewrite it to use peek-remote). So you end up doing peek-remote > three times to draw the summary page. > > git_get_references are called from almost everywhere that shows > the list of commits, which is understandable because we would > want to see those markers in the list. > > I very much suspect that you can use git_get_refs_list to return > a hash and a sorted list at the same time from the same input > and make git_summary to do with just a single call to it, and > get rid of git_get_references with a little bit of restructuring > of the caller. We can easily collapse two calls for git_get_refs_list in gi_summary, one for tags and one for heads into one call plus some filtering. Changing git_get_refs_list to do also the job of git_get_references means that in git_tags and git_heads we do extra the job of git_get_references. Neither git_tags, nor git_heads use references and refs marker; using the heads references in git_heads and tags references in git_tags is repeating the same information twice, cluttering the output. Unless we want to add yet another subroutine... But as call to git-peek-remote is what takes most time, we can waste some time processing references which we would not use for the sake of clarity. Well, we can get rid of git_get_references too, if we don't mind slight decrease in performance. We would then use: git_summary: my ($refs, $reflist) = git_get_refs_list(); my @taglist = map { s!^tags/!! } grep { m!^tags/! } @$reflist; my @headlist = map { s!^heads/!! } grep { m!^heads/! } @$reflist; git_heads, git_tags: my (undef, $taglist) = git_get_refs_list("tags"); my (undef, $headlist) = git_get_refs_list("heads"); everywhere else my ($refs, undef) = git_get_refs_list($type); -- Jakub Narebski Poland - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html