Re: [PATCH v2] Fix notes handling in rev-list
On Thu, Jul 19, 2012 at 10:20:18AM -0700, Junio C Hamano wrote: > > So for plumbing, I think this is the wrong direction, anyway. The real > > value of this patch is that the pretty-printed code path would work more > > like git-log (especially the "%N" format, which lets callers make their > > own micro-format for specifying all the bits they are interested in). > > Yeah, but at that point the obvious question becomes "why you aren't > using 'git log' in the first place". I dunno. I guess there are other plumbing-like behaviors of rev-list that you would want, but the only ones I can think of are diff options, which rev-list does not handle at all. > > Maybe the best thing is to simply disallow --notes when not using a > > pretty-printed format. > > Yeah, or simply ignore it. I'd rather generate an error to make it more obvious what is happening (and it is not that we are somehow failing to find any notes). And it might help prevent the later question of: why does "git rev-list --oneline --notes" show notes, but "git rev-list --notes" silently ignores it? -Peff -- 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
Re: [PATCH v2] Fix notes handling in rev-list
Jeff King writes: > Unlike elements of the commit object itself, like --parents or > --timestamp, notes do not really gain any efficiency by being printed as > part of the traversal. So modulo the cost of piping the list of commits, > it would not really be any more efficient than "git rev-list | git notes > list --stdin" (except that the latter does not take a --stdin argument, > but could easily do so). And the latter is way more flexible. Yeah, I prefer that (not that I think we need either badly). > So for plumbing, I think this is the wrong direction, anyway. The real > value of this patch is that the pretty-printed code path would work more > like git-log (especially the "%N" format, which lets callers make their > own micro-format for specifying all the bits they are interested in). Yeah, but at that point the obvious question becomes "why you aren't using 'git log' in the first place". > Maybe the best thing is to simply disallow --notes when not using a > pretty-printed format. Yeah, or simply ignore it. -- 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
Re: [PATCH v2] Fix notes handling in rev-list
On Wed, Jul 18, 2012 at 03:39:34PM -0700, Junio C Hamano wrote: > Jeff King writes: > > > So leaving aside the --graph issues, we would need to decide what to > > show in the non-graph case. And I think your suggestion is good; there > > is no real need to dereference the blob (if you want that, you can turn > > on the pretty-printer). > > > > I'm just not sure what the output should be. I guess: > > > > > > > > is probably the most sensible (it's sort of like --parents). And that > > solves the --graph issue, too, since it continues to take only a single > > line. > > Surely. "rev-list --parents --notes" would still be usable that > way, as a reader that requests such a combination is prepared to > tell commits (i.e. parents) and blobs (i.e. notes) apart. I don't think we forbid non-blob values in notes trees, so technically there could be some ambiguity. I doubt it is a big problem in practice (especially since I haven't even heard of a good use case yet for "git rev-list --notes", let alone "git rev-list --notes --parents"). But now would be the time to avoid a crappy format that we will be stuck with later. Unlike elements of the commit object itself, like --parents or --timestamp, notes do not really gain any efficiency by being printed as part of the traversal. So modulo the cost of piping the list of commits, it would not really be any more efficient than "git rev-list | git notes list --stdin" (except that the latter does not take a --stdin argument, but could easily do so). And the latter is way more flexible. So for plumbing, I think this is the wrong direction, anyway. The real value of this patch is that the pretty-printed code path would work more like git-log (especially the "%N" format, which lets callers make their own micro-format for specifying all the bits they are interested in). Maybe the best thing is to simply disallow --notes when not using a pretty-printed format. -Peff -- 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
Re: [PATCH v2] Fix notes handling in rev-list
Jeff King writes: > So leaving aside the --graph issues, we would need to decide what to > show in the non-graph case. And I think your suggestion is good; there > is no real need to dereference the blob (if you want that, you can turn > on the pretty-printer). > > I'm just not sure what the output should be. I guess: > > > > is probably the most sensible (it's sort of like --parents). And that > solves the --graph issue, too, since it continues to take only a single > line. Surely. "rev-list --parents --notes" would still be usable that way, as a reader that requests such a combination is prepared to tell commits (i.e. parents) and blobs (i.e. notes) apart. -- 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
Re: [PATCH v2] Fix notes handling in rev-list
On Mon, Jul 16, 2012 at 10:42:07PM -0700, Junio C Hamano wrote: > > Just like log, the notes are part of the commit information to the right > > of the graph. But this second hunk is for when we are not using the > > pretty-printer at all, and the output looks like this: > > > > $ git rev-list --graph --notes -2 HEAD > > * f6bbb09529a4cc73446c7c115ac1468477bd0cc6 > > > > Notes: > > foobar > > * 31c79549b85c6393be4f40432f5b86ebc097fc7e > > > > which doesn't make sense > > I actually have quite a different feeling about this. As I said in > the separate message, I think --graph, or anything that makes the > output unparsable or harder to parse for machines for that matter, > in rev-list are not something we have because we wanted to support > them, but that which just happen to work because the large part of > rev-list and log can share building blocks to do similar things. > The key phrase is "can share" here; it does not necessarily mean > they "should" [*1*]. Somebody went to the trouble to make "rev-list --graph" work[1] (that is what the call to graph_show_remainder in the else clause of the conditional is about). I agree it seems kind of useless, but it does work now, and we should at least not make it worse (and I think we both agree that the output above is just wrong). So whatever we show for a note, it should look like: * f6bbb095... | the notes thing to show * 31c79549... Because that is how graph output is formatted. Either that, or we should disallow --graph entirely with rev-list (which I'd also be OK with). > I do not mind having an option to show the notes text, but I doubt > it is a sane thing to do to make "rev-list --notes" unconditionally > show the payload of the notes blob. "rev-list --objects" only shows > the object names of trees and blobs, not the payload in these > objects, and this is very much on purpuse. It allows the downstream > process that reads its output from the pipe to easily parse the > output and choose to do whatever it wants to do using them. > > I wonder if we should show the blob object names that store the > notes payload if we were given --notes option in a format that is > easy for readers to mechanically parse its output. So leaving aside the --graph issues, we would need to decide what to show in the non-graph case. And I think your suggestion is good; there is no real need to dereference the blob (if you want that, you can turn on the pretty-printer). I'm just not sure what the output should be. I guess: is probably the most sensible (it's sort of like --parents). And that solves the --graph issue, too, since it continues to take only a single line. -Peff [1] Looking at the code, I do think somebody wanted "rev-list --graph" to work, and it is not an accident. But I think they did not do a very thorough job, as things like "git rev-list --objects --graph" produce nonsensical output. -- 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
Re: [PATCH v2] Fix notes handling in rev-list
First of all, thanks for you feedback, both of you. And sorry for wasting your time . I thought that the "In-Reply-To"-header would serve as a reference to the original patch but obviously it wasn't enough. On Tue, Jul 17, 2012 at 8:42 AM, Junio C Hamano wrote: > > I wonder if we should show the blob object names that store the > notes payload if we were given --notes option in a format that is > easy for readers to mechanically parse its output. > Very good point indeed. I think this is how it should be. How would you prefer the output format to be? Would e.g. 189899d229ec Notes: 888ecad77e88 be ok? > In any case, the use of format_display_notes() that is meant for > human consumption feels very wrong to me, especially it seems to be > placed outside the "if (revs->verbose_header && commit->buffer)" > block in this patch. I do not have any problem if the patch makes > the notes text shown in the other side of the if block that uses > pretty_print_commit(), though. > I think that another place where human readable notes should be shown is inside the graph. -- Jukka -- 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
Re: [PATCH v2] Fix notes handling in rev-list
Jeff King writes: > On Mon, Jul 16, 2012 at 09:30:09PM +0300, Jukka Lehtniemi wrote: > >> @@ -111,6 +112,7 @@ static void show_commit(struct commit *commit, void >> *data) >> ctx.date_mode = revs->date_mode; >> ctx.date_mode_explicit = revs->date_mode_explicit; >> ctx.fmt = revs->commit_format; >> +ctx.show_notes = revs->show_notes; >> pretty_print_commit(&ctx, commit, &buf); >> if (revs->graph) { >> if (buf.len) { > > Makes sense. We were just failing to propagate the show_notes flag to > the pretty-print code, as log-tree does. > >> @@ -159,6 +161,12 @@ static void show_commit(struct commit *commit, void >> *data) >> } else { >> if (graph_show_remainder(revs->graph)) >> putchar('\n'); >> +if (revs->show_notes_given) { >> +struct strbuf buf = STRBUF_INIT; >> +format_display_notes(commit->object.sha1, &buf, 0, >> NOTES_SHOW_HEADER|NOTES_INDENT); >> +fwrite(buf.buf, 1, buf.len, stdout); >> +strbuf_release(&buf); >> +} > > But why are we using show_notes_given here instead of show_notes? The > former is about "did we get any kind of --notes option on the > command-line". So doing "git rev-list --no-notes" would trigger it, > which seems wrong. We should simply be checking show_notes again, no? > > Also, it seems odd to me to show the notes after graph_show_remainder. > Your first hunk is about passing the notes option to the pretty-printer, > which handles graph output already, and looks like this: > > $ git rev-list --oneline --graph --notes -2 HEAD > * f6bbb09 Fix notes handling in rev-list > | Notes: > | foobar > | > * 31c7954 Update draft release notes for 7th batch > > Just like log, the notes are part of the commit information to the right > of the graph. But this second hunk is for when we are not using the > pretty-printer at all, and the output looks like this: > > $ git rev-list --graph --notes -2 HEAD > * f6bbb09529a4cc73446c7c115ac1468477bd0cc6 > > Notes: > foobar > * 31c79549b85c6393be4f40432f5b86ebc097fc7e > > which doesn't make sense I actually have quite a different feeling about this. As I said in the separate message, I think --graph, or anything that makes the output unparsable or harder to parse for machines for that matter, in rev-list are not something we have because we wanted to support them, but that which just happen to work because the large part of rev-list and log can share building blocks to do similar things. The key phrase is "can share" here; it does not necessarily mean they "should" [*1*]. First and foremost, rev-list is a tool for people who hate what our vanilla "git log" Porcelain does enough that they want to write their own Porcelain scripts using it. I do not mind having an option to show the notes text, but I doubt it is a sane thing to do to make "rev-list --notes" unconditionally show the payload of the notes blob. "rev-list --objects" only shows the object names of trees and blobs, not the payload in these objects, and this is very much on purpuse. It allows the downstream process that reads its output from the pipe to easily parse the output and choose to do whatever it wants to do using them. I wonder if we should show the blob object names that store the notes payload if we were given --notes option in a format that is easy for readers to mechanically parse its output. In any case, the use of format_display_notes() that is meant for human consumption feels very wrong to me, especially it seems to be placed outside the "if (revs->verbose_header && commit->buffer)" block in this patch. I do not have any problem if the patch makes the notes text shown in the other side of the if block that uses pretty_print_commit(), though. [Footnote] *1* A simple litmus test is to ask this question: if somebody comes up with a "better" way to show the same output for the option, would we accept that update without worrying about breaking existing scripts? If the answer is yes, that is a secondary feature in the context of "rev-list" plumbing like --graph is. -- 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
Re: [PATCH v2] Fix notes handling in rev-list
On Mon, Jul 16, 2012 at 08:40:24PM -0700, Junio C Hamano wrote: > Jeff King writes: > > > ... But whatever we call it, I think it is an > > improvement. > > I didn't say it makes things worse in any way, did I? No, you did not. That was my attempt to end the paragraph on a positive and constructive note. What I meant was "I think you are wrong and it is a bugfix, but I do not care overly what we call it as long as we do it." :) Do note that my "as long as we do it" is about the direction, not the patch. There are a few issues with the patch itself, and I just posted a review. > I was reacting on the Subject: line because that will what I later > have to work from when reading shortlog, summarizing changes, etc. That is a fair point. From the release notes perspective, it probably is a feature (there is a documentation bug, but it happens to be fixed at the same time). -Peff -- 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
Re: [PATCH v2] Fix notes handling in rev-list
On Mon, Jul 16, 2012 at 09:30:09PM +0300, Jukka Lehtniemi wrote: > @@ -111,6 +112,7 @@ static void show_commit(struct commit *commit, void *data) > ctx.date_mode = revs->date_mode; > ctx.date_mode_explicit = revs->date_mode_explicit; > ctx.fmt = revs->commit_format; > + ctx.show_notes = revs->show_notes; > pretty_print_commit(&ctx, commit, &buf); > if (revs->graph) { > if (buf.len) { Makes sense. We were just failing to propagate the show_notes flag to the pretty-print code, as log-tree does. > @@ -159,6 +161,12 @@ static void show_commit(struct commit *commit, void > *data) > } else { > if (graph_show_remainder(revs->graph)) > putchar('\n'); > + if (revs->show_notes_given) { > + struct strbuf buf = STRBUF_INIT; > + format_display_notes(commit->object.sha1, &buf, 0, > NOTES_SHOW_HEADER|NOTES_INDENT); > + fwrite(buf.buf, 1, buf.len, stdout); > + strbuf_release(&buf); > + } But why are we using show_notes_given here instead of show_notes? The former is about "did we get any kind of --notes option on the command-line". So doing "git rev-list --no-notes" would trigger it, which seems wrong. We should simply be checking show_notes again, no? Also, it seems odd to me to show the notes after graph_show_remainder. Your first hunk is about passing the notes option to the pretty-printer, which handles graph output already, and looks like this: $ git rev-list --oneline --graph --notes -2 HEAD * f6bbb09 Fix notes handling in rev-list | Notes: | foobar | * 31c7954 Update draft release notes for 7th batch Just like log, the notes are part of the commit information to the right of the graph. But this second hunk is for when we are not using the pretty-printer at all, and the output looks like this: $ git rev-list --graph --notes -2 HEAD * f6bbb09529a4cc73446c7c115ac1468477bd0cc6 Notes: foobar * 31c79549b85c6393be4f40432f5b86ebc097fc7e which doesn't make sense; we've broken the graph with our notes output. I think you would need to feed the output to the graph code. Something like: diff --git a/builtin/rev-list.c b/builtin/rev-list.c index ff5a383..dbe7349 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -157,6 +159,13 @@ static void show_commit(struct commit *commit, void *data) } strbuf_release(&buf); } else { + if (revs->show_notes) { + struct strbuf buf = STRBUF_INIT; + format_display_notes(commit->object.sha1, &buf, 0, +NOTES_SHOW_HEADER|NOTES_INDENT); + graph_show_commit_msg(revs->graph, &buf); + strbuf_release(&buf); + } if (graph_show_remainder(revs->graph)) putchar('\n'); } Except that it seems to introduce an extra newline before the notes, and it is probably an abuse of graph_show_commit_msg (there is a graph_show_strbuf which graph_show_commit_msg is built around, and it could perhaps be made public). I'd look at how log-tree handles it for inspiration. > diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh > index f94f0c4..ab616a0 100755 > --- a/t/t6006-rev-list-format.sh > +++ b/t/t6006-rev-list-format.sh > [...] > @@ -19,6 +20,25 @@ test_cmp expect.$1 output.$1 > " > } > > +test_expect_success 'notes switch' " > +cat >expect.notes_switch <<'EOF' > +131a310eb913d107dd3c09a65d1651175898735d > + > +Notes: > +note foo > +86c75cfd708a0e5868dc876ed5b8bb66c80b4873 > +EOF > +git rev-list --notes master >output.notes_switch && > +test_cmp expect.notes_switch output.notes_switch > +" > + > +test_format notes %N <<'EOF' > +commit 131a310eb913d107dd3c09a65d1651175898735d > +note foo > + > +commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873 > +EOF > + Nice. Of the four behaviors I mentioned in my previous review: 1. --notes shows notes 2. --no-notes does not show notes 3. when no options are given, notes are not displayed 4. --format=%N shows notes this tests 2 of them (1 and 4). I don't know if it is worth testing (2), as it should not do anything (though it actually is broken with your patch). It is definitely worth making sure (3) works, but it is implicitly checked by the other tests in the script (which would break if we started showing notes). Still, it might be worth adding an explicit "rev-list does not show notes by default" to make sure it is clearly documented with a test. -Peff -- 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
Re: [PATCH v2] Fix notes handling in rev-list
Jeff King writes: > ... But whatever we call it, I think it is an > improvement. I didn't say it makes things worse in any way, did I? I was reacting on the Subject: line because that will what I later have to work from when reading shortlog, summarizing changes, etc. > ... I don't think one more option is going to > break the camel's back, but I wonder if "rev-list -h" could use some > cleanup. E.g., maybe drop seldom used stuff like --bisect-vars, format > similar options on a single line to save space, and add in some missing > options. Sounds good. The manpage also needs some cleaning up, I would think, to omit things that may happen to work (primarily because a lot of code is shared with "log") but do not have to, for example. -- 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
Re: [PATCH v2] Fix notes handling in rev-list
On Mon, Jul 16, 2012 at 12:03:40PM -0700, Junio C Hamano wrote: > Jukka Lehtniemi writes: > > > Display notes in the rev-list when switch '--notes' is used. > > Also expand notes place holder (%N) in user format. > > Previously rev-list ignored both of these. > > > > Signed-off-by: Jukka Lehtniemi > > --- > > > > Thanks for your feedback Peff! > > If it is an update for some old patch (I am guessing that is the > case from "v2" and "feedback" above), please hint where the > original can be found not to waste reviewers' time. Agreed. For reference, v1 is here: http://thread.gmane.org/gmane.comp.version-control.git/193842 > As "git rev-list -h" does not say anything about "notes", I do not > think this should be even called "Fix"; rather it is "teach rev-list > to show notes with --notes", a new feature. It does not, but "git rev-list --help" does (and it mentions "%N" for the pretty userformat). So it's debatable whether it is a code bug or a documentation bug. But whatever we call it, I think it is an improvement. > And as a new feature, "git rev-list -h" should be taught to include > this new option in its output. I didn't check the documentation but > you may also want to add --notes there, too (hint: grep for "--pretty" > to find where you may need to add the new option). "rev-list -h" is already an unwieldy 35 lines, yet still manages to miss many options (e.g., --grep, --author, --cherry-*, variations of --left-right, --boundary, history simplification options like --full-history, and so on). I don't think one more option is going to break the camel's back, but I wonder if "rev-list -h" could use some cleanup. E.g., maybe drop seldom used stuff like --bisect-vars, format similar options on a single line to save space, and add in some missing options. My preference would actually be to just give up and refer people to the manpage after a one or two line usage. But I think we have had that discussion before and you did not agree. -Peff -- 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
Re: [PATCH v2] Fix notes handling in rev-list
Jukka Lehtniemi writes: > Display notes in the rev-list when switch '--notes' is used. > Also expand notes place holder (%N) in user format. > Previously rev-list ignored both of these. > > Signed-off-by: Jukka Lehtniemi > --- > > Thanks for your feedback Peff! If it is an update for some old patch (I am guessing that is the case from "v2" and "feedback" above), please hint where the original can be found not to waste reviewers' time. As "git rev-list -h" does not say anything about "notes", I do not think this should be even called "Fix"; rather it is "teach rev-list to show notes with --notes", a new feature. And as a new feature, "git rev-list -h" should be taught to include this new option in its output. I didn't check the documentation but you may also want to add --notes there, too (hint: grep for "--pretty" to find where you may need to add the new option). -- 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