[PATCH v6 0/6][Outreachy] commit: Implementation of "amend!" commit
- From
Charvi Mendiratta <charvi077@gmail.com>
- Date
- Mar 15, 2021, 07:54 UTC
- Message-ID
- <20210315075435.18229-1-charvi077@gmail.com>
- In-Reply-To
- <20210310194306.32565-1-charvi077@gmail.com>
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@tuxfamily.org>
Mentored-by: Phillip Wood <phillip.wood@dunelm.org.uk>
+ Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Charvi Mendiratta <charvi077@gmail.com>
--
2.29.0.rc1