Merge branch 'em/commit-claim'
						commit
						c142465c07
					
				|  | @ -9,7 +9,7 @@ SYNOPSIS | ||||||
| -------- | -------- | ||||||
| [verse] | [verse] | ||||||
| 'git commit' [-a | --interactive] [-s] [-v] [-u<mode>] [--amend] [--dry-run] | '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>] [--reset-author] | ||||||
| 	   [--allow-empty] [--no-verify] [-e] [--author=<author>] | 	   [--allow-empty] [--no-verify] [-e] [--author=<author>] | ||||||
| 	   [--cleanup=<mode>] [--] [[-i | -o ]<file>...] | 	   [--cleanup=<mode>] [--] [[-i | -o ]<file>...] | ||||||
|  |  | ||||||
|  | @ -69,6 +69,11 @@ OPTIONS | ||||||
| 	Like '-C', but with '-c' the editor is invoked, so that | 	Like '-C', but with '-c' the editor is invoked, so that | ||||||
| 	the user can further edit the commit message. | 	the user can further edit the commit message. | ||||||
|  |  | ||||||
|  | --reset-author:: | ||||||
|  | 	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>:: | -F <file>:: | ||||||
| --file=<file>:: | --file=<file>:: | ||||||
| 	Take the commit message from the given file.  Use '-' to | 	Take the commit message from the given file.  Use '-' to | ||||||
|  |  | ||||||
|  | @ -51,7 +51,7 @@ static const char *template_file; | ||||||
| static char *edit_message, *use_message; | static char *edit_message, *use_message; | ||||||
| static char *author_name, *author_email, *author_date; | static char *author_name, *author_email, *author_date; | ||||||
| static int all, edit_flag, also, interactive, only, amend, signoff; | 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; | static char *untracked_files_arg; | ||||||
| /* | /* | ||||||
|  * The default commit message cleanup mode will remove the lines |  * 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_FILENAME('F', "file", &logfile, "read log from file"), | ||||||
| 	OPT_STRING(0, "author", &force_author, "AUTHOR", "override author for commit"), | 	OPT_STRING(0, "author", &force_author, "AUTHOR", "override author for commit"), | ||||||
| 	OPT_CALLBACK('m', "message", &message, "MESSAGE", "specify commit message", opt_parse_m), | 	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_STRING('C', "reuse-message", &use_message, "COMMIT", "reuse message from 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_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"), | ||||||
| 	OPT_FILENAME('t', "template", &template_file, "use specified template file"), | 	OPT_FILENAME('t', "template", &template_file, "use specified template file"), | ||||||
| 	OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"), | 	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"); | 	email = getenv("GIT_AUTHOR_EMAIL"); | ||||||
| 	date = getenv("GIT_AUTHOR_DATE"); | 	date = getenv("GIT_AUTHOR_DATE"); | ||||||
|  |  | ||||||
| 	if (use_message) { | 	if (use_message && !renew_authorship) { | ||||||
| 		const char *a, *lb, *rb, *eol; | 		const char *a, *lb, *rb, *eol; | ||||||
|  |  | ||||||
| 		a = strstr(use_message_buffer, "\nauthor "); | 		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, '>')) | 	if (force_author && !strchr(force_author, '>')) | ||||||
| 		force_author = find_author_by_nickname(force_author); | 		force_author = find_author_by_nickname(force_author); | ||||||
|  |  | ||||||
|  | 	if (force_author && renew_authorship) | ||||||
|  | 		die("Using both --reset-author and --author does not make sense"); | ||||||
|  |  | ||||||
| 	if (logfile || message.len || use_message) | 	if (logfile || message.len || use_message) | ||||||
| 		use_editor = 0; | 		use_editor = 0; | ||||||
| 	if (edit_flag) | 	if (edit_flag) | ||||||
|  | @ -780,6 +784,8 @@ static int parse_and_validate_options(int argc, const char *argv[], | ||||||
| 		use_message = edit_message; | 		use_message = edit_message; | ||||||
| 	if (amend && !use_message) | 	if (amend && !use_message) | ||||||
| 		use_message = "HEAD"; | 		use_message = "HEAD"; | ||||||
|  | 	if (!use_message && renew_authorship) | ||||||
|  | 		die("--reset-author can be used only with -C, -c or --amend."); | ||||||
| 	if (use_message) { | 	if (use_message) { | ||||||
| 		unsigned char sha1[20]; | 		unsigned char sha1[20]; | ||||||
| 		static char utf8[] = "UTF-8"; | 		static char utf8[] = "UTF-8"; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,114 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | # | ||||||
|  | # Copyright (c) 2009 Erick Mattos | ||||||
|  | # | ||||||
|  |  | ||||||
|  | test_description='git commit --reset-author' | ||||||
|  |  | ||||||
|  | . ./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 && | ||||||
|  |  | ||||||
|  | 	message_body Initial >expect && | ||||||
|  | 	message_body HEAD >actual && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success '-C option copies only the message with --reset-author' ' | ||||||
|  | 	echo "Test 2" >>foo && | ||||||
|  | 	test_tick && | ||||||
|  | 	git commit -a -C Initial --reset-author && | ||||||
|  | 	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 --reset-author' ' | ||||||
|  | 	echo "Test 4" >>foo && | ||||||
|  | 	test_tick && | ||||||
|  | 	EDITOR=: VISUAL=: git commit -a -c Initial --reset-author && | ||||||
|  | 	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 '--reset-author makes the commit ours even with --amend option' ' | ||||||
|  | 	git checkout Initial && | ||||||
|  | 	echo "Test 6" >>foo && | ||||||
|  | 	test_tick && | ||||||
|  | 	git commit -a --reset-author -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 '--reset-author and --author are mutually exclusive' ' | ||||||
|  | 	git checkout Initial && | ||||||
|  | 	echo "Test 7" >>foo && | ||||||
|  | 	test_tick && | ||||||
|  | 	test_must_fail git commit -a --reset-author --author="Xyzzy <frotz@nitfol.xz>" | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success '--reset-author should be rejected without -c/-C/--amend' ' | ||||||
|  | 	git checkout Initial && | ||||||
|  | 	echo "Test 7" >>foo && | ||||||
|  | 	test_tick && | ||||||
|  | 	test_must_fail git commit -a --reset-author -m done | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_done | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano