git-cherry-pick: add allow-empty option
authorNeil Horman <nhorman@tuxdriver.com>
Wed, 11 Apr 2012 20:21:53 +0000 (16:21 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 11 Apr 2012 20:46:08 +0000 (13:46 -0700)
git cherry-pick fails when picking a non-ff commit that is empty.  The advice
given with the failure is that a git-commit --allow-empty should be issued to
explicitly add the empty commit during the cherry pick.  This option allows a
user to specify before hand that they want to keep the empty commit.  This
eliminates the need to issue both a cherry pick and a commit operation.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-cherry-pick.txt
builtin/revert.c
sequencer.c
sequencer.h

index fed5097..730237a 100644 (file)
@@ -103,6 +103,15 @@ effect to your index in a row.
        cherry-pick'ed commit, then a fast forward to this commit will
        be performed.
 
        cherry-pick'ed commit, then a fast forward to this commit will
        be performed.
 
+--allow-empty::
+       By default, cherry-picking an empty commit will fail,
+       indicating that an explicit invocation of `git commit
+       --allow-empty` is required. This option overrides that
+       behavior, allowing empty commits to be preserved automatically
+       in a cherry-pick. Note that when "--ff" is in effect, empty
+       commits that meet the "fast-forward" requirement will be kept
+       even without this option.
+
 --strategy=<strategy>::
        Use the given merge strategy.  Should only be used once.
        See the MERGE STRATEGIES section in linkgit:git-merge[1]
 --strategy=<strategy>::
        Use the given merge strategy.  Should only be used once.
        See the MERGE STRATEGIES section in linkgit:git-merge[1]
index e6840f2..06b00e6 100644 (file)
@@ -114,12 +114,14 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                OPT_END(),
                OPT_END(),
                OPT_END(),
                OPT_END(),
                OPT_END(),
                OPT_END(),
+               OPT_END(),
        };
 
        if (opts->action == REPLAY_PICK) {
                struct option cp_extra[] = {
                        OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"),
                        OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"),
        };
 
        if (opts->action == REPLAY_PICK) {
                struct option cp_extra[] = {
                        OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"),
                        OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"),
+                       OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, "preserve empty commits"),
                        OPT_END(),
                };
                if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
                        OPT_END(),
                };
                if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
index a37846a..71929ba 100644 (file)
@@ -260,8 +260,8 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
  */
 static int run_git_commit(const char *defmsg, struct replay_opts *opts)
 {
  */
 static int run_git_commit(const char *defmsg, struct replay_opts *opts)
 {
-       /* 6 is max possible length of our args array including NULL */
-       const char *args[6];
+       /* 7 is max possible length of our args array including NULL */
+       const char *args[7];
        int i = 0;
 
        args[i++] = "commit";
        int i = 0;
 
        args[i++] = "commit";
@@ -272,6 +272,9 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts)
                args[i++] = "-F";
                args[i++] = defmsg;
        }
                args[i++] = "-F";
                args[i++] = defmsg;
        }
+       if (opts->allow_empty)
+               args[i++] = "--allow-empty";
+
        args[i] = NULL;
 
        return run_command_v_opt(args, RUN_GIT_CMD);
        args[i] = NULL;
 
        return run_command_v_opt(args, RUN_GIT_CMD);
index bb4b138..e2cd725 100644 (file)
@@ -29,6 +29,7 @@ struct replay_opts {
        int signoff;
        int allow_ff;
        int allow_rerere_auto;
        int signoff;
        int allow_ff;
        int allow_rerere_auto;
+       int allow_empty;
 
        int mainline;
 
 
        int mainline;