From: Jakub Narebski <jnareb@gmail.com>
To: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Cc: git@vger.kernel.org,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Johan Herland <johan@herland.net>,
Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH 1/4] gitweb: notes feature
Date: Sat, 6 Feb 2010 00:44:09 +0100 [thread overview]
Message-ID: <201002060044.11225.jnareb@gmail.com> (raw)
In-Reply-To: <1265300338-25021-2-git-send-email-giuseppe.bilotta@gmail.com>
On Thu, 4 Feb 2010, Giuseppe Bilotta wrote:
BTW. shouldn't this series be marked as RFC?
> Introduce support for notes by collecting them when creating commit
> lists. The list of noterefs to look into is configurable, and can be a(n
> array of) refspec(s), which will be looked for in the refs/notes
> namespace.
>
> The feature is disabled by default because it's presently not very
> efficient (one extra git call per configured refspec, plus two extra git
> calls per commit per noteref).
Signoff?
> ---
> gitweb/gitweb.perl | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 62 insertions(+), 0 deletions(-)
>
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index d0c3ff2..9ba5815 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -411,6 +411,22 @@ our %feature = (
> 'override' => 0,
> 'default' => [16]},
>
> + # Notes support. When this feature is enabled, the presence of notes
> + # for any commit is signaled, and the note content is made available
> + # in a way appropriate for the current view.
> + # Set this to '*' to enable all notes namespace, or to a shell-glob
> + # specification to enable specific namespaces only.
It is not obvious from this description that you can provide _list_ of
notes namespaces (or list of shell-globs).
> +
> + # To enable system wide have in $GITWEB_CONFIG
> + # $feature{'notes'}{'default'} = ['*'];
> + # To have project specific config enable override in $GITWEB_CONFIG
> + # $feature{'notes'}{'override'} = 1;
> + # and in project config gitweb.notes = namespace;
How you can provide list of notes here? Is overriding limited to single
name or shell-glob?
See feature_snapshot for example implementation.
> + 'notes' => {
> + 'sub' => \&feature_notes,
> + 'override' => 0,
> + 'default' => []},
> +
> # Avatar support. When this feature is enabled, views such as
> # shortlog or commit will display an avatar associated with
> # the email of the committer(s) and/or author(s).
> @@ -513,6 +529,16 @@ sub feature_patches {
> return ($_[0]);
> }
>
> +sub feature_notes {
> + my @val = (git_get_project_config('notes'));
> +
> + if (@val) {
> + return @val;
> + }
> +
> + return @_;
> +}
First, this I think limits overriding in repository config to single value.
Second, perhaps it is time to refactor all those similar feature_xxx
subroutines (just a possible suggestion)?
> +
> sub feature_avatar {
> my @val = (git_get_project_config('avatar'));
>
> @@ -2786,10 +2812,30 @@ sub parse_commit {
> return %co;
> }
>
> +# return all refs matching refs/notes/<globspecs> where the globspecs
> +# are taken from the notes feature content.
> +sub get_note_refs {
> + my @globs = gitweb_get_feature('notes');
> + my @note_refs = ();
> + foreach my $glob (@globs) {
> + if (open my $fd, '-|', git_cmd(), 'for-each-ref',
> + '--format=%(refname)', "refs/notes/$glob") {
open my $fd, '-|', git_cmd(), 'for-each-ref',
'--format=%(refname)', "refs/notes/$glob"
or return;
would reduce indent level a bit.
> + while (<$fd>) {
> + chomp;
> + push @note_refs, $_ if $_;
> + }
Why not simply
chomp(@note_refs = <$fd>);
> + close $fd;
> + }
> + }
> + return @note_refs;
> +}
> +
> sub parse_commits {
> my ($commit_id, $maxcount, $skip, $filename, @args) = @_;
> my @cos;
>
> + my @note_refs = get_note_refs();
> +
> $maxcount ||= 1;
> $skip ||= 0;
>
> @@ -2807,6 +2853,22 @@ sub parse_commits {
> or die_error(500, "Open git-rev-list failed");
> while (my $line = <$fd>) {
> my %co = parse_commit_text($line);
> + my %notes = () ;
> + foreach my $note_ref (@note_refs) {
> + my $obj = "$note_ref:$co{'id'}";
> + if (open my $fd, '-|', git_cmd(), 'rev-parse',
> + '--verify', '-q', $obj) {
> + my $exists = <$fd>;
> + close $fd;
> + if (defined $exists) {
> + if (open $fd, '-|', git_cmd(), 'show', $obj) {
> + $notes{$note_ref} = scalar <$fd>;
> + close $fd;
> + }
> + }
> + }
> + }
First, there are '--batch' and '--batch-check' options to git-cat-file.
With these I think you can get all notes with just single git command,
although using it is a bit complicated (requires open2 from IPC::Open2
for bidi communication).
Second, if not using 'git cat-file --batch', perhaps it would be easier
to read each $note_ref tree using 'git ls-tree'/'git ls-tree -r', and
parse its output to check for which commits/objects there are notes
available, and only then call 'git show' (or reuse connection to
'git cat-file --batch').
The second solution, with a bit more work, could work even in presence
of fan-out schemes for notes, I think.
> + $co{'notes'} = \%notes;
> push @cos, \%co;
> }
> close $fd;
> --
> 1.7.0.rc1.193.ge8618
>
>
--
Jakub Narebski
Poland
next prev parent reply other threads:[~2010-02-05 23:44 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-04 16:18 [PATCH 0/4] gitweb: preliminary notes support Giuseppe Bilotta
2010-02-04 16:18 ` [PATCH 1/4] gitweb: notes feature Giuseppe Bilotta
2010-02-04 16:33 ` Junio C Hamano
2010-02-04 16:46 ` Junio C Hamano
2010-02-04 17:21 ` Jakub Narebski
2010-02-04 20:08 ` Giuseppe Bilotta
2010-02-04 21:03 ` Junio C Hamano
2010-02-04 23:38 ` Giuseppe Bilotta
2010-02-05 10:36 ` Johan Herland
2010-02-05 16:10 ` Junio C Hamano
2010-02-05 21:31 ` Giuseppe Bilotta
2010-02-05 22:31 ` Junio C Hamano
2010-02-06 8:16 ` Giuseppe Bilotta
2010-02-04 21:07 ` Junio C Hamano
2010-02-04 23:20 ` Jakub Narebski
2010-02-05 0:44 ` Jakub Narebski
2010-02-05 0:55 ` Junio C Hamano
2010-02-05 8:42 ` Giuseppe Bilotta
2010-02-05 23:44 ` Jakub Narebski [this message]
2010-02-06 9:02 ` Giuseppe Bilotta
2010-02-06 22:14 ` Jakub Narebski
2010-02-06 22:58 ` Giuseppe Bilotta
2010-02-07 1:20 ` Jakub Narebski
2010-02-07 1:38 ` Jakub Narebski
2010-02-07 1:48 ` Johan Herland
2010-02-07 11:08 ` Jakub Narebski
2010-02-07 11:14 ` Giuseppe Bilotta
2010-02-07 12:41 ` Jakub Narebski
2010-02-07 18:38 ` Junio C Hamano
2010-02-07 20:11 ` Giuseppe Bilotta
2010-02-07 21:08 ` Jakub Narebski
2010-02-07 10:57 ` Giuseppe Bilotta
2010-02-07 11:11 ` Jakub Narebski
2010-02-04 16:18 ` [PATCH 2/4] gitweb: show notes in shortlog view Giuseppe Bilotta
2010-02-06 0:18 ` Jakub Narebski
2010-02-06 9:24 ` Giuseppe Bilotta
2010-02-04 16:18 ` [PATCH 3/4] gitweb: show notes in log Giuseppe Bilotta
2010-02-06 12:57 ` Jakub Narebski
2010-02-06 13:14 ` Giuseppe Bilotta
2010-02-06 21:47 ` Jakub Narebski
2010-02-04 16:18 ` [PATCH 4/4] gitweb: show notes in commit(diff) view Giuseppe Bilotta
2010-02-06 13:16 ` Jakub Narebski
2010-02-06 14:15 ` Giuseppe Bilotta
2010-02-06 14:34 ` Jakub Narebski
2010-02-06 16:13 ` Giuseppe Bilotta
2010-02-06 21:50 ` Jakub Narebski
2010-02-06 22:17 ` Giuseppe Bilotta
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=201002060044.11225.jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=giuseppe.bilotta@gmail.com \
--cc=johan@herland.net \
/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).