Re: [PATCHv2 3/4] commit: --squash option for use with rebase --autosquash

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Sep 21, 2010 at 2:25 PM, Pat Notz <patnotz@xxxxxxxxx> wrote:
> This option makes it convenient to construct commit messages for use
> with 'rebase --autosquash'.  The resulting commit message will be
> "squash! ..." where "..." is the subject line of the specified commit
> message.  This option can be used with other commit message options
> such as -m, -c, -C and -F.
>
> If an editor is invoked (as with -c or -eF or no message options) the
> commit message is seeded with the correctly formatted subject line.
>
> Example usage:
>  $ git commit --squash HEAD~2
>  $ git commit --squash HEAD~2 -m "clever comment"
>  $ git commit --squash HEAD~2 -F msgfile
>  $ git commit --squash HEAD~2 -C deadbeef
>
> Signed-off-by: Pat Notz <patnotz@xxxxxxxxx>
> ---
>  Documentation/git-commit.txt |    8 +++++++-
>  builtin/commit.c             |   37 +++++++++++++++++++++++++++++++++++--
>  2 files changed, 42 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
> index 3367f8f..b621dc4 100644
> --- a/Documentation/git-commit.txt
> +++ b/Documentation/git-commit.txt
> @@ -9,7 +9,7 @@ SYNOPSIS
>  --------
>  [verse]
>  'git commit' [-a | --interactive] [-s] [-v] [-u<mode>] [--amend] [--dry-run]
> -          [(-c | -C | --fixup) <commit>] [-F <file> | -m <msg>]
> +          [(-c | -C | --fixup | --squash) <commit>] [-F <file> | -m <msg>]
>           [--reset-author] [--allow-empty] [--allow-empty-message] [--no-verify]
>           [-e] [--author=<author>] [--date=<date>] [--cleanup=<mode>]
>           [--status | --no-status] [--] [[-i | -o ]<file>...]
> @@ -75,6 +75,12 @@ OPTIONS
>        The commit message will be the subject line from the specified
>        commit with a prefix of "fixup! ".
>
> +--squash=<commit>::
> +       Construct a commit message for use with `rebase --autosquash`.
> +       The commit message subject line is taken from the specified
> +       commit with a prefix of "squash! ".  Can be used with additional
> +       commit message options (`-m`/`-c`/`-C`/`-F`).
> +

Ditto - I should add links to the git-rebase man page here.

>  --reset-author::
>        When used with -C/-c/--amend options, declare that the
>        authorship of the resulting commit now belongs of the committer.
> diff --git a/builtin/commit.c b/builtin/commit.c
> index 0901616..d28b2ff 100644
> --- a/builtin/commit.c
> +++ b/builtin/commit.c
> @@ -69,7 +69,7 @@ static enum {
>  static const char *logfile, *force_author;
>  static const char *template_file;
>  static char *edit_message, *use_message;
> -static char *fixup_message;
> +static char *fixup_message, *squash_message;
>  static char *author_name, *author_email, *author_date;
>  static int all, edit_flag, also, interactive, only, amend, signoff;
>  static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
> @@ -126,6 +126,7 @@ static struct option builtin_commit_options[] = {
>        OPT_STRING('c', "reedit-message", &edit_message, "COMMIT", "reuse and edit message from specified commit"),
>        OPT_STRING('C', "reuse-message", &use_message, "COMMIT", "reuse message from specified commit"),
>        OPT_STRING(0, "fixup", &fixup_message, "COMMIT", "use autosquash formatted message to fixup specified commit"),
> +       OPT_STRING(0, "squash", &squash_message, "COMMIT", "use autosquash formatted message to squash specified commit"),
>        OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
>        OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
>        OPT_FILENAME('t', "template", &template_file, "use specified template file"),
> @@ -567,6 +568,27 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
>        if (!no_verify && run_hook(index_file, "pre-commit", NULL))
>                return 0;
>
> +       if (squash_message) {
> +               /*
> +                * Insert the proper subject line before other commit
> +                * message options add their content.
> +                */
> +               unsigned char sha1[20];
> +               struct commit *commit;
> +               struct pretty_print_context ctx = {0};
> +
> +               if (get_sha1(squash_message, sha1))
> +                       die("could not lookup commit %s", squash_message);
> +               commit = lookup_commit_reference(sha1);
> +               if (!commit || parse_commit(commit))
> +                       die("could not parse commit %s", squash_message);
> +
> +               if(use_message && strcmp(use_message, squash_message) == 0)
> +                       strbuf_addstr(&sb,"squash! ");
> +               else
> +                       format_commit_message(commit, "squash! %s\n\n", &sb, &ctx);
> +       }
> +
>        if (message.len) {
>                strbuf_addbuf(&sb, &message);
>                hook_arg1 = "message";
> @@ -620,6 +642,16 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
>        else if (in_merge)
>                hook_arg1 = "merge";
>
> +       if (squash_message) {
> +               /*
> +                * If squash_commit was used for the commit subject,
> +                * then we're possibly hijacking other commit log options.
> +                * Reset the hook args to tell the real story.
> +                */
> +               hook_arg1 = "message";
> +               hook_arg2 = "";
> +       }
> +
>        fp = fopen(git_path(commit_editmsg), "w");
>        if (fp == NULL)
>                die_errno("could not open '%s'", git_path(commit_editmsg));
> @@ -891,7 +923,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
>                die("You have nothing to amend.");
>        if (amend && in_merge)
>                die("You are in the middle of a merge -- cannot amend.");
> -
> +       if (fixup_message && squash_message)
> +               die("Options --squash and --fixup cannot be used together");
>        if (use_message)
>                f++;
>        if (edit_message)
> --
> 1.7.3
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]