This patch series teaches `git commit --fixup` to create "amend!" commit as an alternative that works with `git rebase --autosquash`. It allows to fixup both the content and the commit message of the specified commit. Here we add two suboptions to the `--fixup`, first `amend` suboption that creates an "amend!" commit. It takes the staged changes and also allows to edit the commit message of the commit we are fixing. Example usuage: git commit --fixup=amend:<commit> Secondly, `reword` suboption that creates an empty "amend!" commit i.e it ignores the staged changes and only allows to reword/edit the commit message of the commit we are fixing. `--fixup=reword:<commit>` is a short-hand of `--fixup=amend:<commit> --only`. Example usuage: git commit --fixup=reword:<commit> ** This work is rebased on the top of cm/rebase-i-updates. Charvi Mendiratta (6): sequencer: export and rename subject_length() commit: add amend suboption to --fixup to create amend! commit commit: add a reword suboption to --fixup t7500: add tests for --fixup=[amend|reword] options t3437: use --fixup with options to create amend! commit doc/git-commit: add documentation for fixup=[amend|reword] options Documentation/git-commit.txt | 45 +++++- Documentation/git-rebase.txt | 21 +-- builtin/commit.c | 122 +++++++++++++++-- commit.c | 14 ++ commit.h | 3 + sequencer.c | 16 +-- t/t3437-rebase-fixup-options.sh | 30 +--- t/t7500-commit-template-squash-signoff.sh | 159 ++++++++++++++++++++++ 8 files changed, 342 insertions(+), 68 deletions(-) Range-diff against v5: -: ---------- > 1: a2e89540ec sequencer: export and rename subject_length() 1: be2808a255 ! 2: f3cdb3eb1e commit: add amend suboption to --fixup to create amend! commit @@ builtin/commit.c: static int prepare_to_commit(const char *index_file, const cha } else if (!stat(git_path_merge_msg(the_repository), &statbuf)) { size_t merge_msg_start; -@@ builtin/commit.c: static void finalize_deferred_config(struct wt_status *s) - s->ahead_behind_flags = AHEAD_BEHIND_FULL; - } - -+/* returns the length of intial segment of alpha characters only */ -+static size_t skip_suboption(char *fixup_message) { -+ const char alphas[] = "abcdefghijklmnopqrstuvwxyz"; -+ return strspn(fixup_message, alphas); -+} -+ - static int parse_and_validate_options(int argc, const char *argv[], - const struct option *options, - const char * const usage[], @@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[], if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not make sense")); @@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *ar + * + * Otherwise, we are dealing with --fixup=<commit>. + */ -+ size_t len = skip_suboption(fixup_message); -+ if (len && fixup_message[len] == ':') { -+ fixup_message[len++] = '\0'; -+ fixup_commit = fixup_message + len; ++ char *p = fixup_message; ++ while (isalpha(*p)) ++ p++; ++ if (p > fixup_message && *p == ':') { ++ *p = '\0'; ++ fixup_commit = p + 1; + if (!strcmp("amend", fixup_message)) { + fixup_prefix = "amend"; + allow_empty = 1; 2: f6217338c1 ! 3: ded339706f commit: add a reword suboption to --fixup @@ builtin/commit.c: static void finalize_deferred_config(struct wt_status *s) + die(_("reword option of --fixup is mutually exclusive with --patch/--interactive/--all/--include/--only")); +} + - /* returns the length of intial segment of alpha characters only */ - static size_t skip_suboption(char *fixup_message) { - const char alphas[] = "abcdefghijklmnopqrstuvwxyz"; + static int parse_and_validate_options(int argc, const char *argv[], + const struct option *options, + const char * const usage[], @@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[], * We limit --fixup's suboptions to only alpha characters. * If the first character after a run of alpha is colon, @@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *ar * Otherwise, we are dealing with --fixup=<commit>. */ @@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[], - if (len && fixup_message[len] == ':') { - fixup_message[len++] = '\0'; - fixup_commit = fixup_message + len; + if (p > fixup_message && *p == ':') { + *p = '\0'; + fixup_commit = p + 1; - if (!strcmp("amend", fixup_message)) { + if (!strcmp("amend", fixup_message) || + !strcmp("reword", fixup_message)) { 3: 1a127dc0b3 = 4: ec6f3d5d7d t7500: add tests for --fixup=[amend|reword] options 4: be6f4fa0d1 = 5: 148087b133 t3437: use --fixup with options to create amend! commit 5: 79c098df2c ! 6: 2b750d305e doc/git-commit: add documentation for fixup=[amend|reword] options @@ Commit message Mentored-by: Christian Couder <chriscool@xxxxxxxxxxxxx> Mentored-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> + Helped-by: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> Helped-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> Signed-off-by: Charvi Mendiratta <charvi077@xxxxxxxxx> -- 2.29.0.rc1