git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] documentation: add tutorial for revision walking

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Jun 19, 2019, 08:13 UTC
Message-ID
<CAPig+cSyEHUvx39stA0kx1c6kKYO7jk7Sk_Q=etEro_h=3ucOw@mail.gmail.com>
In-Reply-To
<20190617231959.GB100487@google.com>
On Mon, Jun 17, 2019 at 7:20 PM Emily Shaffer <emilyshaffer@google.com> wrote:
Show 24 quoted lines
> On Fri, Jun 07, 2019 at 02:21:07AM -0400, Eric Sunshine wrote:
> > On Thu, Jun 6, 2019 at 9:08 PM Emily Shaffer <emilyshaffer@google.com> wrote:
> > > +int cmd_walken(int argc, const char **argv, const char *prefix)
> > > +{
> > > +       struct option options[] = {
> > > +               OPT_END()
> > > +       };
> > > +
> > > +       argc = parse_options(argc, argv, prefix, options, walken_usage, 0);
> > > +
> > > +       ...
> >
> > Perhaps comment out the "..." or remove it altogether to avoid having
> > the compiler barf when the below instructions tell the reader to build
> > the command.
>
> Hmm. That part I'm not so sure about. I like to use the "..." to
> indicate where the code in the snippet should be added around the other
> code already in the file - which I suppose it does just as clearly if
> it's commented - but I also hope folks are not simply copy-pasting
> blindly from the tutorial.
>
> It seems like including uncommented "..." in code tutorials is pretty
> common.

You're right, and that's not what I was "complaining" about. Looking back at your original email, I see that I somehow got confused and didn't realize or (quickly) forgot that you had already presented a _complete_ cmd_walken() snippet just above that spot, and that the cmd_walken() snippet upon which I was commenting was _incomplete_, thus the "..." was perfectly justified. Not realizing that the incomplete cmd_walken() example was just that (incomplete), I "complained" that the following "compile the project" instructions would barf on "...".

Maybe I got confused because the tiny cmd_walken() snippets followed one another so closely (or because I got interrupted several times during the review), but one way to avoid that would be to present a single _complete_ snippet from the start, followed by a bit of explanation. That is, something like this:

    Open up a new file `builtin/walken.c` and set up the command handler:
    ----
    /* "git walken" -- Part of the "My First Revision Walk" tutorial. */
    #include "builtin.h"
    int cmd_walken(int argc, const char **argv, const char *prefix)
    {
        const char * const usage[] = {
            N_("git walken"),
            NULL,
        }
        struct option options[] = {
            OPT_END()
        };
        argc = parse_options(argc, argv, prefix, options, usage, 0);
        printf(_("cmd_walken incoming...\n"));
        return 0;
    }
    ----
    `usage` is the usage message presented by `git -h walken`, and
    `options` will eventually specify command-line options.
Show 6 quoted lines
> I don't think I have a good reason to push back on this except that I
> think "/* ... */" is ugly :)
>
> I'll go through and replace "..." with some actual hints about what's
> supposed to go there; for example, here I'll replace with "/* print and
> return */".

Seeing as my initial review comment was in error, I'm not sure that you ought to replace "..." with anything else.

Show 13 quoted lines
> > "invoke anything" is pretty nebulous, as is the earlier "components
> > you may invoke". A newcomer is unlikely to know what this means, so
> > perhaps it needs an example (even if just a short parenthetical
> > comment).
>
> I have tried to reword this; I hope this is a little clearer.
>
>   Before you begin to examine user configuration for your revision walk, it's
>   common practice for you to initialize to default any switches that your command
>   may have, as well as ask any other components you may invoke to initialize as
>   well (for example, how `git log` also uses the `grep` and `diff` components).
>   `git log` does this in `init_log_defaults()`; in that case, one global
>   `decoration_style` is initialized, as well as the grep and diff-UI components.

By trying to express too many things at once, it's still difficult to follow. Perhaps use shorter, more easily digestible sentences, like this:

    Before examining configuration files which may modify command
    behavior, set up default state for switches or options your
    command may have. If your command utilizes other Git components,
    ask them to set up their default states, as well. For instance,
    `git log` takes advantage of `grep` and `diff` functionality; its
    init_log_defaults() sets its own state (`decoration_style`) and
    asks `grep` and `diff` to initialize themselves by calling their
    initialization functions.
Show 22 quoted lines
> > > +static int walken_commit_walk(struct rev_info *rev)
> > > +{
> > > +       /* prepare_revision_walk() gets the final steps ready for a revision
> > > +        * walk. We check the return value for errors. */
> >
> > Not at all sure what this comment is trying to say. Also, the second
> > sentence adds no value to what the code itself already says clearly by
> > actually checking the return value.
>
> Attempted to rephrase. I ended up with:
>
>   /*
>    * prepare_revision_walk() does the final setup needed by revision.h
>    * before a walk. It may return an error if there is a problem.
>    */
>
> Maybe the second sentence still doesn't serve a purpose, but I was
> trying to express that prepare_revision_walk() won't die() on its own.
>
> >
> > > +       if (prepare_revision_walk(rev))
> > > +               die(_("revision walk setup failed"));

As this is just a toy example, I don't care too strongly about the unnecessary second sentence. On the other hand, the tutorial is trying to teach people how to contribute to this project, and on this project, that sort of pointless comment is likely to be called out in review. In fact, given that view, the entire comment block is unnecessary (it doesn't add any value for anyone reviewing or reading the code), so it might make more sense to drop the comment from the code entirely, and just do a better job explaining in prose above the snippet why you are calling that function. For instance:

    ... Let's start the helper with the call to `prepare_revision_walk()`,
    which does the final setup of the `rev_info` structure before it can
    be used.

The above observation may be more widely applicable than to just this one instance. Don't use in-code comments for what should be explained in prose if the in-code comment adds no value to the code itself (to wit, if a reviewer would say "don't repeat in a comment what the code already says clearly" or "don't use a comment to state the obvious").

Show 14 quoted lines
> > > +This display is an indicator for the latency between publishing a commit for
> > > +review the first time, and getting it actually merged into master.
> >
> > Perhaps: s/master/`&`/
> >
> > Even as a long-time contributor to the project, I had to pause over
> > this statement for several seconds before figuring out what it was
> > talking about. Without a long-winded explanation of how topics
> > progress from submission through 'pu' through 'next' through 'master'
> > and finally into a release, the above statement is likely to be
> > mystifying to a newcomer. Perhaps it should be dropped.
>
> Such an explanation exists in MyFirstContribution.txt. I will include a
> shameless plug to that document here. :)

I found that this sort of tangential reference disturbed the flow of the tutorial, leading the mind astray from the otherwise natural progression of the presentation. So, I'm not convinced that talking about the migration of a topic in the Git project itself adds value to this tutorial. The same effect could be seen when commits have been re-ordered via git-rebase, too, right? Perhaps mention that instead?

Show 12 quoted lines
> > > +       printf(_("Object walk completed. Found %d commits, %d blobs, %d tags, "
> > > +                "and %d trees.\n"), commit_count, blob_count, tag_count,
> > > +              tree_count);
> >
> > Or make the output more useful by having it be machine-parseable (and
> > not localized):
> >
> >     printf("commits %d\nblobs %d\ntags %d\ntrees %d\n",
> >         commit_count, blob_count, tag_cont, tree_count);
>
> I'm not sure whether I agree, since it's a useless toy command only for human
> parsing.

True, it's not a big deal, and I don't insist upon it. But, if you mention in prose that this output is easily machine-parseable, then perhaps that nudges the reader a bit in the direction of thinking about porcelain vs. plumbing, which is something a contributor to this project eventually has to be concerned with (the sooner, the better).

Previous: Emily ShafferNext: Emily Shaffer
Message 22 of 102 in “documentation: add tutorial for revision walking”
  1. documentation: add tutorial for revision walkingEmily Shaffer, Jun 7, 2019
  2. 00/13 example implementation of revwalk tutorialEmily Shaffer, Jun 7, 2019
  3. 01/13 walken: add infrastructure for revwalk demoEmily Shaffer, Jun 7, 2019
  4. 02/13 walken: add usage to enable -hEmily Shaffer, Jun 7, 2019
  5. 03/13 walken: add placeholder to initialize defaultsEmily Shaffer, Jun 7, 2019
  6. 04/13 walken: add handler to git_configEmily Shaffer, Jun 7, 2019
  7. 05/13 walken: configure rev_info and prepare for walkEmily Shaffer, Jun 7, 2019
  8. 06/13 walken: perform our basic revision walkEmily Shaffer, Jun 7, 2019
  9. 07/13 walken: filter for authors from gmail addressEmily Shaffer, Jun 7, 2019
  10. 08/13 walken: demonstrate various topographical sortsEmily Shaffer, Jun 7, 2019
  11. 09/13 walken: demonstrate reversing a revision walk listEmily Shaffer, Jun 7, 2019
  12. 10/13 walken: add unfiltered object walk from HEADEmily Shaffer, Jun 7, 2019
  13. 11/13 walken: add filtered object walkEmily Shaffer, Jun 7, 2019
  14. Jeff HostetlerJun 7, 2019
  15. Emily ShafferJun 17, 2019
  16. 12/13 walken: count omitted objectsEmily Shaffer, Jun 7, 2019
  17. 13/13 walken: reverse the object walk orderEmily Shaffer, Jun 7, 2019
  18. Eric SunshineJun 7, 2019
  19. Junio C HamanoJun 10, 2019
  20. Eric SunshineJun 10, 2019
  21. Emily ShafferJun 17, 2019
  22. Eric SunshineJun 19, 2019
  23. Emily ShafferJun 19, 2019
  24. Eric SunshineJun 23, 2019
  25. Junio C HamanoJun 10, 2019
  26. Emily ShafferJun 17, 2019
  27. Junio C HamanoJun 19, 2019
  28. Emily ShafferJun 20, 2019
  29. Josh SteadmonJul 13, 2019
  30. Emily ShafferJul 16, 2019
  31. Junio C HamanoJul 16, 2019
  32. Junio C HamanoJun 10, 2019
  33. Emily ShafferJun 17, 2019
  34. documentation: add tutorial for revision walkingEmily Shaffer, Jun 26, 2019
  35. 00/13 example implementation of revwalk tutorialEmily Shaffer, Jun 26, 2019
  36. 01/13 walken: add infrastructure for revwalk demoEmily Shaffer, Jun 26, 2019
  37. 02/13 walken: add usage to enable -hEmily Shaffer, Jun 26, 2019
  38. Eric SunshineJun 27, 2019
  39. Emily ShafferJun 27, 2019
  40. Eric SunshineJun 27, 2019
  41. 03/13 walken: add placeholder to initialize defaultsEmily Shaffer, Jun 26, 2019
  42. 04/13 walken: add handler to git_configEmily Shaffer, Jun 26, 2019
  43. Eric SunshineJun 27, 2019
  44. Emily ShafferJun 27, 2019
  45. 05/13 walken: configure rev_info and prepare for walkEmily Shaffer, Jun 26, 2019
  46. Eric SunshineJun 27, 2019
  47. Emily ShafferJun 27, 2019
  48. 06/13 walken: perform our basic revision walkEmily Shaffer, Jun 26, 2019
  49. Eric SunshineJun 27, 2019
  50. Emily ShafferJun 27, 2019
  51. 07/13 walken: filter for authors from gmail addressEmily Shaffer, Jun 26, 2019
  52. Eric SunshineJun 27, 2019
  53. Emily ShafferJun 27, 2019
  54. 08/13 walken: demonstrate various topographical sortsEmily Shaffer, Jun 26, 2019
  55. Eric SunshineJun 27, 2019
  56. Emily ShafferJun 27, 2019
  57. 09/13 walken: demonstrate reversing a revision walk listEmily Shaffer, Jun 26, 2019
  58. Eric SunshineJun 27, 2019
  59. Emily ShafferJun 27, 2019
  60. 10/13 walken: add unfiltered object walk from HEADEmily Shaffer, Jun 26, 2019
  61. Eric SunshineJun 27, 2019
  62. Emily ShafferJun 27, 2019
  63. Eric SunshineJun 28, 2019
  64. Emily ShafferJul 1, 2019
  65. 11/13 walken: add filtered object walkEmily Shaffer, Jun 26, 2019
  66. Eric SunshineJun 27, 2019
  67. Emily ShafferJun 27, 2019
  68. 12/13 walken: count omitted objectsEmily Shaffer, Jun 26, 2019
  69. Eric SunshineJun 27, 2019
  70. 13/13 walken: reverse the object walk orderEmily Shaffer, Jun 26, 2019
  71. Emily ShafferJun 27, 2019
  72. documentation: add tutorial for revision walkingEmily Shaffer, Jul 1, 2019
  73. 00/13 example implementation of revwalk tutorialEmily Shaffer, Jul 1, 2019
  74. 01/13 walken: add infrastructure for revwalk demoEmily Shaffer, Jul 1, 2019
  75. 02/13 walken: add usage to enable -hEmily Shaffer, Jul 1, 2019
  76. 03/13 walken: add placeholder to initialize defaultsEmily Shaffer, Jul 1, 2019
  77. 04/13 walken: add handler to git_configEmily Shaffer, Jul 1, 2019
  78. 05/13 walken: configure rev_info and prepare for walkEmily Shaffer, Jul 1, 2019
  79. 06/13 walken: perform our basic revision walkEmily Shaffer, Jul 1, 2019
  80. 07/13 walken: filter for authors from gmail addressEmily Shaffer, Jul 1, 2019
  81. 08/13 walken: demonstrate various topographical sortsEmily Shaffer, Jul 1, 2019
  82. 09/13 walken: demonstrate reversing a revision walk listEmily Shaffer, Jul 1, 2019
  83. 10/13 walken: add unfiltered object walk from HEADEmily Shaffer, Jul 1, 2019
  84. 11/13 walken: add filtered object walkEmily Shaffer, Jul 1, 2019
  85. 12/13 walken: count omitted objectsEmily Shaffer, Jul 1, 2019
  86. 13/13 walken: reverse the object walk orderEmily Shaffer, Jul 1, 2019
  87. Johannes SchindelinJul 25, 2019
  88. Emily ShafferAug 6, 2019
  89. Johannes SchindelinAug 8, 2019
  90. Josh SteadmonJul 24, 2019
  91. Jonathan TanJul 24, 2019
  92. Emily ShafferAug 6, 2019
  93. documentation: add tutorial for revision walkingEmily Shaffer, Aug 6, 2019
  94. Junio C HamanoAug 7, 2019
  95. Emily ShafferAug 14, 2019
  96. Junio C HamanoAug 14, 2019
  97. documentation: add tutorial for object walkingEmily Shaffer, Oct 10, 2019
  98. Junio C HamanoOct 11, 2019
  99. Emily ShafferOct 11, 2019
  100. SZEDER GáborOct 11, 2019
  101. Emily ShafferOct 11, 2019
  102. documentation: add tutorial for object walkingEmily Shaffer, Oct 11, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.