Re: [PATCH] commit -c/-C/--amend: acquire authorship and restamp time with --claim
- From
Erick Mattos <erick.mattos@gmail.com>
- Date
- Nov 3, 2009, 16:39 UTC
- Message-ID
- <55bacdd30911030839v724924bm7a49a08172ed7573@mail.gmail.com>
- In-Reply-To
- <7vskcxwro7.fsf@alter.siamese.dyndns.org>
I am gonna check all this information but you probably missed the last patch I sent: http://marc.info/?l=git&m=125712272606721&w=2 Could you please check this one... while I am checking this e-mail.
Regards
2009/11/2 Junio C Hamano <gitster@pobox.com>:
Show 210 quoted lines
> The last one was probably harder to read since it was an interdiff. Here
> is what I am considering to queue.
>
> No, I didn't use --mine option when I ran "commit --amend" to record this
> one ;-)
>
> -- >8 --
> From: Erick Mattos <erick.mattos@gmail.com>
> Date: Sun, 1 Nov 2009 16:45:27 -0200
> Subject: [PATCH] git commit --mine: ignore authorship information taken from -c/-C/--amend
>
> When we use -c, -C, or --amend, we are trying one of two things: using the
> source as a template or modifying a commit with corrections.
>
> When these options are are used, the authorship and timestamp recorded in
> the newly created commit is always taken from the original commit. This
> is inconvenient when you want to just borrow the commit log message, or
> your change is so significant that you should take over the authorship
> (with the blame for bugs you introduced).
>
> Signed-off-by: Erick Mattos <erick.mattos@gmail.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
> Documentation/git-commit.txt | 7 +++-
> builtin-commit.c | 10 +++-
> t/t7509-commit.sh | 103 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 116 insertions(+), 4 deletions(-)
> create mode 100755 t/t7509-commit.sh
>
> diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
> index 0578a40..7832720 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) <commit>] [-F <file> | -m <msg>]
> + [(-c | -C) <commit>] [-F <file> | -m <msg>] [--mine]
> [--allow-empty] [--no-verify] [-e] [--author=<author>]
> [--cleanup=<mode>] [--] [[-i | -o ]<file>...]
>
> @@ -69,6 +69,11 @@ OPTIONS
> Like '-C', but with '-c' the editor is invoked, so that
> the user can further edit the commit message.
>
> +--mine::
> + When used with -C/-c/--amend options, declare that the
> + authorship of the resulting commit now belongs of the committer.
> + This also renews the author timestamp.
> +
> -F <file>::
> --file=<file>::
> Take the commit message from the given file. Use '-' to
> diff --git a/builtin-commit.c b/builtin-commit.c
> index beddf01..aa42989 100644
> --- a/builtin-commit.c
> +++ b/builtin-commit.c
> @@ -51,7 +51,7 @@ static const char *template_file;
> static char *edit_message, *use_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;
> +static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
> static char *untracked_files_arg;
> /*
> * The default commit message cleanup mode will remove the lines
> @@ -91,8 +91,9 @@ static struct option builtin_commit_options[] = {
> OPT_FILENAME('F', "file", &logfile, "read log from file"),
> OPT_STRING(0, "author", &force_author, "AUTHOR", "override author for commit"),
> OPT_CALLBACK('m', "message", &message, "MESSAGE", "specify commit message", opt_parse_m),
> - OPT_STRING('c', "reedit-message", &edit_message, "COMMIT", "reuse and edit message from specified commit "),
> + 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_BOOLEAN(0, "mine", &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"),
> OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
> @@ -381,7 +382,7 @@ static void determine_author_info(void)
> email = getenv("GIT_AUTHOR_EMAIL");
> date = getenv("GIT_AUTHOR_DATE");
>
> - if (use_message) {
> + if (use_message && !renew_authorship) {
> const char *a, *lb, *rb, *eol;
>
> a = strstr(use_message_buffer, "\nauthor ");
> @@ -747,6 +748,9 @@ static int parse_and_validate_options(int argc, const char *argv[],
> if (force_author && !strchr(force_author, '>'))
> force_author = find_author_by_nickname(force_author);
>
> + if (force_author && renew_authorship)
> + die("Using both --mine and --author does not make sense");
> +
> if (logfile || message.len || use_message)
> use_editor = 0;
> if (edit_flag)
> diff --git a/t/t7509-commit.sh b/t/t7509-commit.sh
> new file mode 100755
> index 0000000..ec13cea
> --- /dev/null
> +++ b/t/t7509-commit.sh
> @@ -0,0 +1,103 @@
> +#!/bin/sh
> +#
> +# Copyright (c) 2009 Erick Mattos
> +#
> +
> +test_description='git commit --mine'
> +
> +. ./test-lib.sh
> +
> +author_header () {
> + git cat-file commit "$1" |
> + sed -n -e '/^$/q' -e '/^author /p'
> +}
> +
> +message_body () {
> + git cat-file commit "$1" |
> + sed -e '1,/^$/d'
> +}
> +
> +test_expect_success '-C option copies authorship and message' '
> + echo "Initial" >foo &&
> + git add foo &&
> + test_tick &&
> + git commit -m "Initial Commit" --author Frigate\ \<flying@over.world\> &&
> + git tag Initial &&
> + echo "Test 1" >>foo &&
> + test_tick &&
> + git commit -a -C Initial &&
> + author_header Initial >expect &&
> + author_header HEAD >actual &&
> + test_cmp expect actual
> +'
> +
> +test_expect_success '-C option copies only the message with --mine' '
> + echo "Test 2" >>foo &&
> + test_tick &&
> + git commit -a -C Initial --mine &&
> + echo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&
> + author_header HEAD >actual
> + test_cmp expect actual &&
> +
> + message_body Initial >expect &&
> + message_body HEAD >actual &&
> + test_cmp expect actual
> +'
> +
> +test_expect_success '-c option copies authorship and message' '
> + echo "Test 3" >>foo &&
> + test_tick &&
> + EDITOR=: VISUAL=: git commit -a -c Initial &&
> + author_header Initial >expect &&
> + author_header HEAD >actual &&
> + test_cmp expect actual
> +'
> +
> +test_expect_success '-c option copies only the message with --mine' '
> + echo "Test 4" >>foo &&
> + test_tick &&
> + EDITOR=: VISUAL=: git commit -a -c Initial --mine &&
> + echo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&
> + author_header HEAD >actual &&
> + test_cmp expect actual &&
> +
> + message_body Initial >expect &&
> + message_body HEAD >actual &&
> + test_cmp expect actual
> +'
> +
> +test_expect_success '--amend option copies authorship' '
> + git checkout Initial &&
> + echo "Test 5" >>foo &&
> + test_tick &&
> + git commit -a --amend -m "amend test" &&
> + author_header Initial >expect &&
> + author_header HEAD >actual &&
> +
> + echo "amend test" >expect &&
> + message_body HEAD >actual &&
> + test_cmp expect actual
> +'
> +
> +test_expect_success '--mine makes the commit ours even with --amend option' '
> + git checkout Initial &&
> + echo "Test 6" >>foo &&
> + test_tick &&
> + git commit -a --mine -m "Changed again" --amend &&
> + echo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&
> + author_header HEAD >actual &&
> + test_cmp expect actual &&
> +
> + echo "Changed again" >expect &&
> + message_body HEAD >actual &&
> + test_cmp expect actual
> +'
> +
> +test_expect_success '--mine and --author are mutually exclusive' '
> + git checkout Initial &&
> + echo "Test 7" >>foo &&
> + test_tick &&
> + test_must_fail git commit -a --mine --author="Xyzzy <frotz@nitfol.xz>"
> +'
> +
> +test_done
> --
> 1.6.5.2.246.gc99575
>
>