Thread (2 messages) 2 messages, 2 authors, 2016-06-15

Re: [PATCH] commit: Add -f, --fixes <commit> option to add Fixes: line

From: Junio C Hamano <hidden>
Date: 2013-10-28 09:08:55
Also in: lkml

Junio C Hamano [off-list ref] writes:
There are unbound number of kinds of trailers people would want to
add, depending on their projects' needs.  We should not have to add
a specific support for a tailer like this one, before thinking
through to see if we can add generic support for adding arbitrary
trailers to avoid code and interface bloat.

Think of the existing --signoff as a historical mistake.  Such a
generic "adding arbitrary trailers" support, when done properly,
should be able to express what "--signoff" does, and we should be
able to redo "--signoff" as a special case of that generic "adding
arbitrary trailers" support, and at that point, "Fixes:" trailer the
kernel project wants to use should fall out as a natural consequence.
Thinking aloud further, what I had in mind was along the lines of
the following.

 * The most generic external interface would be spelled as

    --trailer <token>[=<param>]

   where <token> can be things like "signoff", "closes", "acked-by",
   "change-id", "fixes", etc.; they can be taken from an unbounded
   set.  The historical "--signoff" can become a short-hand for
   "--trailer signoff".  More than one "--trailer" option can be
   given on a single command line.

 * The token is used to look into the configuration, e.g.,

   [commitTrailer "signoff"]
	style = append-norepeat
	trailer = Signed-off-by
        command = echo "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"'

   [commitTrailer "change-id"]
	style = append-only-if-missing
	trailer = Change-Id
        command = 'git hash-object -t commit --stdin <$GIT_PROTO_COMMIT'

   [commitTrailer "fixes"]
	style = overwrite
        trailer = Fixes
        command = 'git log -1 --oneline --format="%h (%s)" --abbrev-commit=14 $ARG'

   where

   - "commitTrailer.<token>.style" defines the interaction with
     existing trailer of the same kind (e.g. S-o-b: accumulates by
     appending, but we try not to repeat the same sign-off twice
     which would show you forwarding your own message you are the
     last person in the Sign-off chain; Fixes: if there is already
     one will remove the old one and replaces; etc.);

   - "commitTrailer.<token>.trailer" defines the trailer label at
     the beginning of the trailer line;

   - "commitTrailer.<token>.command" gives the command to run to
     obtain the payload after the "trailer" label.  A handful
     obvious and useful variables are exported for the command to
     use, and <param> is exported as $ARG, if present.

With the most generic syntax, with the above commitTrailer.fixes.*
configuration, I would imagine that you can say something like:

    git commit --trailer fixes="v2.6.12^{/^i386: tweak frobnitz}"

to say that the first commit you find traversing the history of
v2.6.12 whose title is "i386: tweak frobnitz" was faulty, and you
are creating a commit that corrects its mistake.

Giving some default configuration to often used trailer types
(e.g. configuration for "--trailer signoff") and promoting some
commonly used ones into a separate built-in option (e.g. an option
"--signoff" that does not have to say "--trailer signoff") are
entirely separate issues, and only time can nudge us into evaluating
individual types of trailers.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help