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>
This commit is contained in:
		
				
					committed by
					
						
						Junio C Hamano
					
				
			
			
				
	
			
			
			
						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
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user