diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 0578a40..27b774e 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>] [--claim]
[--allow-empty] [--no-verify] [-e] [--author=<author>]
[--cleanup=<mode>] [--] [[-i | -o ]<file>...]
@@ -61,14 +61,19 @@ OPTIONS
-C <commit>::
--reuse-message=<commit>::
Take an existing commit object, and reuse the log message
- and the authorship information (including the timestamp)
- when creating the commit.
+ and the authorship information when creating the commit.
-c <commit>::
--reedit-message=<commit>::
Like '-C', but with '-c' the editor is invoked, so that
the user can further edit the commit message.
+--claim::
+ 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. Therefore this option
+ sets the use of the message only from the original commit.
+
-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 c395cbf..33922df 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, claim;
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, "claim", &claim, "take over cloned commit authorship and renew timestamp"),
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 && !claim) {
const char *a, *lb, *rb, *eol;
a = strstr(use_message_buffer, "\nauthor ");diff --git a/t/t7509-commit.sh b/t/t7509-commit.sh
new file mode 100755
index 0000000..62fb00f
--- /dev/null
+++ b/t/t7509-commit.sh
@@ -0,0 +1,87 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Erick Mattos
+#
+
+test_description='git commit
+
+Tests for --claim option on a commit.'
+
+. ./test-lib.sh
+
+TEST_FILE="$PWD"/foo
+
+test_expect_success '-C option should be working' '
+ echo "Initial" > "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -m "Initial Commit" --author Frigate\ \<flying@over.world\> &&
+ sleep 1 &&
+ echo "Test 1" >> "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -C HEAD &&
+ git cat-file -p HEAD^ | sed -e '/^parent/d' -e '/^tree/d' -e '/^committer/d' > commit_1 &&
+ git cat-file -p HEAD | sed -e '/^parent/d' -e '/^tree/d' -e '/^committer/d' > commit_2 &&
+ cmp commit_1 commit_2
+'
+
+test_expect_success '-C option with --claim is working properly' '
+ sleep 1 &&
+ echo "Test 2" >> "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -C HEAD^ --claim &&
+ git cat-file -p HEAD^ | grep '^author' > commit_1 &&
+ git cat-file -p HEAD | grep '^author' > commit_2 &&
+ test_must_fail cmp commit_1 commit_2
+'
+
+test_expect_success '-c option should be working' '
+ echo "Initial" > "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -m "Initial Commit" --author Frigate\ \<flying@over.world\> &&
+ sleep 1 &&
+ echo "Test 3" >> "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -c HEAD <<EOF
+ "Changed"
+ EOF &&
+ git cat-file -p HEAD^ | grep '^author' > commit_1 &&
+ git cat-file -p HEAD | grep '^author' > commit_2 &&
+ cmp commit_1 commit_2
+'
+
+test_expect_success '-c option with --claim is working properly' '
+ sleep 1 &&
+ echo "Test 4" >> "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -c HEAD^ --claim <<EOF
+ "Changed again"
+ EOF &&
+ git cat-file -p HEAD^ | grep '^author' > commit_1 &&
+ git cat-file -p HEAD | grep '^author' > commit_2 &&
+ test_must_fail cmp commit_1 commit_2
+'
+
+test_expect_success '--amend option should be working' '
+ echo "Initial" > "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -m "Initial Commit" --author Frigate\ \<flying@over.world\> &&
+ echo "Test 5" >> "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -m "--amend test" &&
+ git cat-file -p HEAD | grep '^author' > commit_1 &&
+ sleep 1 &&
+ git commit -m "Changed" --amend &&
+ git cat-file -p HEAD | grep '^author' > commit_2 &&
+ cmp commit_1 commit_2
+'
+
+test_expect_success '--amend option with --claim is working properly' '
+ sleep 1 &&
+ echo "Test 6" >> "$TEST_FILE" &&
+ git add "$TEST_FILE" &&
+ git commit -m "Changed again" --amend --claim &&
+ git cat-file -p HEAD | grep '^author' > commit_1 &&
+ test_must_fail cmp commit_1 commit_2
+'
+
+test_done
--
1.6.5.GIT