checkout --orphan: respect -l option always
Added changes to satisfy a corner case: creating reflogs by using -l when core.logAllRefUpdates is set to false. Signed-off-by: Erick Mattos <erick.mattos@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									859c30175f
								
							
						
					
					
						commit
						3631bf77f7
					
				|  | @ -493,7 +493,24 @@ static void update_refs_for_switch(struct checkout_opts *opts, | ||||||
| 	struct strbuf msg = STRBUF_INIT; | 	struct strbuf msg = STRBUF_INIT; | ||||||
| 	const char *old_desc; | 	const char *old_desc; | ||||||
| 	if (opts->new_branch) { | 	if (opts->new_branch) { | ||||||
| 		if (!opts->new_orphan_branch) | 		if (opts->new_orphan_branch) { | ||||||
|  | 			if (opts->new_branch_log && !log_all_ref_updates) { | ||||||
|  | 				int temp; | ||||||
|  | 				char *log_file; | ||||||
|  | 				char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch); | ||||||
|  |  | ||||||
|  | 				temp = log_all_ref_updates; | ||||||
|  | 				log_all_ref_updates = 1; | ||||||
|  | 				if (log_ref_setup(ref_name, &log_file)) { | ||||||
|  | 					fprintf(stderr, "Can not do reflog for '%s'\n", | ||||||
|  | 					    opts->new_orphan_branch); | ||||||
|  | 					log_all_ref_updates = temp; | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				log_all_ref_updates = temp; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
| 			create_branch(old->name, opts->new_branch, new->name, 0, | 			create_branch(old->name, opts->new_branch, new->name, 0, | ||||||
| 				      opts->new_branch_log, opts->track); | 				      opts->new_branch_log, opts->track); | ||||||
| 		new->name = opts->new_branch; | 		new->name = opts->new_branch; | ||||||
|  | @ -517,6 +534,14 @@ static void update_refs_for_switch(struct checkout_opts *opts, | ||||||
| 					opts->new_branch ? " a new" : "", | 					opts->new_branch ? " a new" : "", | ||||||
| 					new->name); | 					new->name); | ||||||
| 		} | 		} | ||||||
|  | 		if (old->path && old->name) { | ||||||
|  | 			char log_file[PATH_MAX], ref_file[PATH_MAX]; | ||||||
|  |  | ||||||
|  | 			git_snpath(log_file, sizeof(log_file), "logs/%s", old->path); | ||||||
|  | 			git_snpath(ref_file, sizeof(ref_file), "%s", old->path); | ||||||
|  | 			if (!file_exists(ref_file) && file_exists(log_file)) | ||||||
|  | 				remove_path(log_file); | ||||||
|  | 		} | ||||||
| 	} else if (strcmp(new->name, "HEAD")) { | 	} else if (strcmp(new->name, "HEAD")) { | ||||||
| 		update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL, | 		update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL, | ||||||
| 			   REF_NODEREF, DIE_ON_ERR); | 			   REF_NODEREF, DIE_ON_ERR); | ||||||
|  | @ -684,8 +709,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) | ||||||
| 	if (opts.new_orphan_branch) { | 	if (opts.new_orphan_branch) { | ||||||
| 		if (opts.new_branch) | 		if (opts.new_branch) | ||||||
| 			die("--orphan and -b are mutually exclusive"); | 			die("--orphan and -b are mutually exclusive"); | ||||||
| 		if (opts.track > 0 || opts.new_branch_log) | 		if (opts.track > 0) | ||||||
| 			die("--orphan cannot be used with -t or -l"); | 			die("--orphan cannot be used with -t"); | ||||||
| 		opts.new_branch = opts.new_orphan_branch; | 		opts.new_branch = opts.new_orphan_branch; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -49,6 +49,62 @@ test_expect_success '--orphan must be rejected with -b' ' | ||||||
| 	test refs/heads/master = "$(git symbolic-ref HEAD)" | 	test refs/heads/master = "$(git symbolic-ref HEAD)" | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success '--orphan must be rejected with -t' ' | ||||||
|  | 	git checkout master && | ||||||
|  | 	test_must_fail git checkout --orphan new -t master && | ||||||
|  | 	test refs/heads/master = "$(git symbolic-ref HEAD)" | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success '--orphan ignores branch.autosetupmerge' ' | ||||||
|  | 	git checkout master && | ||||||
|  | 	git config branch.autosetupmerge always && | ||||||
|  | 	git checkout --orphan gamma && | ||||||
|  | 	test -z "$(git config branch.gamma.merge)" && | ||||||
|  | 	test refs/heads/gamma = "$(git symbolic-ref HEAD)" && | ||||||
|  | 	test_must_fail git rev-parse --verify HEAD^ | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success '--orphan makes reflog by default' ' | ||||||
|  | 	git checkout master && | ||||||
|  | 	git config --unset core.logAllRefUpdates && | ||||||
|  | 	git checkout --orphan delta && | ||||||
|  | 	! test -f .git/logs/refs/heads/delta && | ||||||
|  | 	test_must_fail PAGER= git reflog show delta && | ||||||
|  | 	git commit -m Delta && | ||||||
|  | 	test -f .git/logs/refs/heads/delta && | ||||||
|  | 	PAGER= git reflog show delta | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = false' ' | ||||||
|  | 	git checkout master && | ||||||
|  | 	git config core.logAllRefUpdates false && | ||||||
|  | 	git checkout --orphan epsilon && | ||||||
|  | 	! test -f .git/logs/refs/heads/epsilon && | ||||||
|  | 	test_must_fail PAGER= git reflog show epsilon && | ||||||
|  | 	git commit -m Epsilon && | ||||||
|  | 	! test -f .git/logs/refs/heads/epsilon && | ||||||
|  | 	test_must_fail PAGER= git reflog show epsilon | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = false' ' | ||||||
|  | 	git checkout master && | ||||||
|  | 	git checkout -l --orphan zeta && | ||||||
|  | 	test -f .git/logs/refs/heads/zeta && | ||||||
|  | 	test_must_fail PAGER= git reflog show zeta && | ||||||
|  | 	git commit -m Zeta && | ||||||
|  | 	PAGER= git reflog show zeta | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'giving up --orphan not committed when -l and core.logAllRefUpdates = false deletes reflog' ' | ||||||
|  | 	git checkout master && | ||||||
|  | 	git checkout -l --orphan eta && | ||||||
|  | 	test -f .git/logs/refs/heads/eta && | ||||||
|  | 	test_must_fail PAGER= git reflog show eta && | ||||||
|  | 	git checkout master && | ||||||
|  | 	! test -f .git/logs/refs/heads/eta && | ||||||
|  | 	test_must_fail PAGER= git reflog show eta | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_expect_success '--orphan is rejected with an existing name' ' | test_expect_success '--orphan is rejected with an existing name' ' | ||||||
| 	git checkout master && | 	git checkout master && | ||||||
| 	test_must_fail git checkout --orphan master && | 	test_must_fail git checkout --orphan master && | ||||||
|  | @ -60,31 +116,11 @@ test_expect_success '--orphan refuses to switch if a merge is needed' ' | ||||||
| 	git reset --hard && | 	git reset --hard && | ||||||
| 	echo local >>"$TEST_FILE" && | 	echo local >>"$TEST_FILE" && | ||||||
| 	cat "$TEST_FILE" >"$TEST_FILE.saved" && | 	cat "$TEST_FILE" >"$TEST_FILE.saved" && | ||||||
| 	test_must_fail git checkout --orphan gamma master^ && | 	test_must_fail git checkout --orphan new master^ && | ||||||
| 	test refs/heads/master = "$(git symbolic-ref HEAD)" && | 	test refs/heads/master = "$(git symbolic-ref HEAD)" && | ||||||
| 	test_cmp "$TEST_FILE" "$TEST_FILE.saved" && | 	test_cmp "$TEST_FILE" "$TEST_FILE.saved" && | ||||||
| 	git diff-index --quiet --cached HEAD && | 	git diff-index --quiet --cached HEAD && | ||||||
| 	git reset --hard | 	git reset --hard | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_success '--orphan does not mix well with -t' ' |  | ||||||
| 	git checkout master && |  | ||||||
| 	test_must_fail git checkout -t master --orphan gamma && |  | ||||||
| 	test refs/heads/master = "$(git symbolic-ref HEAD)" |  | ||||||
| ' |  | ||||||
|  |  | ||||||
| test_expect_success '--orphan ignores branch.autosetupmerge' ' |  | ||||||
| 	git checkout -f master && |  | ||||||
| 	git config branch.autosetupmerge always && |  | ||||||
| 	git checkout --orphan delta && |  | ||||||
| 	test -z "$(git config branch.delta.merge)" && |  | ||||||
| 	test refs/heads/delta = "$(git symbolic-ref HEAD)" && |  | ||||||
| 	test_must_fail git rev-parse --verify HEAD^ |  | ||||||
| ' |  | ||||||
|  |  | ||||||
| test_expect_success '--orphan does not mix well with -l' ' |  | ||||||
| 	git checkout -f master && |  | ||||||
| 	test_must_fail git checkout -l --orphan gamma |  | ||||||
| ' |  | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Erick Mattos
						Erick Mattos