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; | ||||
| 	const char *old_desc; | ||||
| 	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, | ||||
| 				      opts->new_branch_log, opts->track); | ||||
| 		new->name = opts->new_branch; | ||||
|  | @ -517,6 +534,14 @@ static void update_refs_for_switch(struct checkout_opts *opts, | |||
| 					opts->new_branch ? " a new" : "", | ||||
| 					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")) { | ||||
| 		update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL, | ||||
| 			   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_branch) | ||||
| 			die("--orphan and -b are mutually exclusive"); | ||||
| 		if (opts.track > 0 || opts.new_branch_log) | ||||
| 			die("--orphan cannot be used with -t or -l"); | ||||
| 		if (opts.track > 0) | ||||
| 			die("--orphan cannot be used with -t"); | ||||
| 		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_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' ' | ||||
| 	git checkout 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 && | ||||
| 	echo local >>"$TEST_FILE" && | ||||
| 	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_cmp "$TEST_FILE" "$TEST_FILE.saved" && | ||||
| 	git diff-index --quiet --cached HEAD && | ||||
| 	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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Erick Mattos
						Erick Mattos