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

Re: [PATCH 2/2] fast-import: add '--signed-commits=<mode>' option

From
Christian Couder <christian.couder@gmail.com>
Date
Sep 12, 2025, 13:35 UTC
Message-ID
<CAP8UFD0EAuGdMWY2ff_kjaQnZ3w7VP2ftM6Y4Hr3T4HQTsFB3w@mail.gmail.com>
In-Reply-To
<xmqqtt1as08f.fsf@gitster.g>
On Wed, Sep 10, 2025 at 7:09 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 28 quoted lines
>
> Christian Couder <christian.couder@gmail.com> writes:
>
> > diff --git a/builtin/fast-import.c b/builtin/fast-import.c
> > @@ -2785,6 +2787,23 @@ static void store_signature(struct signature_data *stored_sig,
> >       }
> >  }
> >
> > +/* Process signatures (up to 2: one "sha1" and one "sha256") */
> > +static void import_signature(struct signature_data *sig_sha1,
> > +                          struct signature_data *sig_sha256,
> > +                          const char *v)
> > +{
> > +     struct signature_data sig = { NULL, NULL, STRBUF_INIT };
> > +
> > +     parse_one_signature(&sig, v);
> > +
> > +     if (!strcmp(sig.hash_algo, "sha1"))
> > +             store_signature(sig_sha1, &sig, "SHA-1");
> > +     else if (!strcmp(sig.hash_algo, "sha256"))
> > +             store_signature(sig_sha256, &sig, "SHA-256");
> > +     else
> > +             BUG("parse_one_signature() returned unknown hash algo");
> > +}
> > +
>
> THis is a new function; I am not sure if the division of labor
> between this one and its caller is done right.  See below.

I have removed this new function in V2 as I think I implemented what you suggest below.

Show 62 quoted lines
> > @@ -2817,19 +2836,28 @@ static void parse_new_commit(const char *arg)
> >       if (!committer)
> >               die("Expected committer but didn't get one");
> >
> > -     /* Process signatures (up to 2: one "sha1" and one "sha256") */
> >       while (skip_prefix(command_buf.buf, "gpgsig ", &v)) {
> > -             struct signature_data sig = { NULL, NULL, STRBUF_INIT };
> > -
> > -             parse_one_signature(&sig, v);
> > -
> > -             if (!strcmp(sig.hash_algo, "sha1"))
> > -                     store_signature(&sig_sha1, &sig, "SHA-1");
> > -             else if (!strcmp(sig.hash_algo, "sha256"))
> > -                     store_signature(&sig_sha256, &sig, "SHA-256");
> > -             else
> > -                     BUG("parse_one_signature() returned unknown hash algo");
> > -
> > +             struct strbuf data = STRBUF_INIT;
> > +             switch (signed_commit_mode) {
> > +             case SIGN_ABORT:
> > +                     die("encountered signed commit; use "
> > +                         "--signed-commits=<mode> to handle it");
> > +             case SIGN_WARN_VERBATIM:
> > +                     warning("importing a commit signature");
> > +                     /* fallthru */
> > +             case SIGN_VERBATIM:
> > +                     import_signature(&sig_sha1, &sig_sha256, v);
> > +                     break;
> > +             case SIGN_WARN_STRIP:
> > +                     warning("stripping a commit signature");
> > +                     /* fallthru */
> > +             case SIGN_STRIP:
> > +                     /* Read signature data and discard it */
> > +                     read_next_command();
> > +                     parse_data(&data, 0, NULL);
> > +                     strbuf_release(&data);
> > +                     break;
> > +             }
> >               read_next_command();
> >       }
>
> I am not sure if this change had to be this way.  The old code
> always called parse_one_signature(), which was responsible for
> checking the signature format and then calling read_next_command()
> and parse_data(), so no matter what happened afterwards, we know we
> are consuming the data stream regardless of the conditional execution
> that happens here.
>
> The new code calls import_signature() or an inlined sequence of
> read_next_command() plus parse_data(), essentially making each case
> arm in the switch() statement responsible individually for consuming
> the incoming data.  When somebody adds a new case there to specify a
> different way to handle signatures, they have to make sure that they
> do not forget calling read_next_command() and parse_data() themselves.
>
> Even though I can see, after some code inspection, that no branches
> in the current code forgets to advance the incoming data stream to
> leave us out of sync right now, this change feels like a bit of code
> ergonomics regression to me.  Was it so important that we pass a
> broken signature without inspecting in STRIP mode?  I am guessing
> that is the reason why the new code tries hard to avoid calling the
> parse_one_signature() function in these case arms.

Yeah, I thought it was cleaner and a bit faster if we don't parse signatures when in STRIP mode. That's why I did it like this.

Now as it looks like we don't really mind parsing them, I implemented that in V2. In ABORT mode, I still think it might be a bit better to ABORT right away though, so that's what I implemented in V2.

> An aside.  I think the warning message about importing should have a
> word "verbatim" in it, e.g.
>
>         warning("importing a commit signature verbatim");
In V2, I have changed the message to what you suggest.
Previous: Junio C HamanoNext: Junio C Hamano
Message 10 of 21 in “fast-import: start controlling how commit signatures are handled”
  1. 0/2 fast-import: start controlling how commit signatures are handledChristian Couder, Sep 10, 2025
  2. 1/2 gpg-interface: refactor 'enum sign_mode' parsingChristian Couder, Sep 10, 2025
  3. Junio C HamanoSep 10, 2025
  4. Patrick SteinhardtSep 11, 2025
  5. Junio C HamanoSep 11, 2025
  6. Christian CouderSep 12, 2025
  7. Christian CouderSep 12, 2025
  8. 2/2 fast-import: add '--signed-commits=<mode>' optionChristian Couder, Sep 10, 2025
  9. Junio C HamanoSep 10, 2025
  10. Christian CouderSep 12, 2025
  11. Junio C HamanoSep 12, 2025
  12. Christian CouderSep 15, 2025
  13. Junio C HamanoSep 15, 2025
  14. Christian CouderSep 17, 2025
  15. Junio C HamanoSep 10, 2025
  16. Christian CouderSep 12, 2025
  17. Junio C HamanoSep 12, 2025
  18. Patrick SteinhardtSep 11, 2025
  19. Junio C HamanoSep 11, 2025
  20. Christian CouderSep 12, 2025
  21. Christian CouderSep 12, 2025

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.