Subject: [PATCH 00/32] nd/multiple-work-trees cleanup

From: Nguyễn Thái Ngọc Duy <[email-masked]>
Date: Sat, 30 Aug 2014 15:33:30 +0700

This collapes some bug fix patches into the main ones, adds a few more
tests to cover recent changes, and removes advice.checkoutLocked (when
things are controversal, probably best to go without them until they
are settled). Diff against current version in 'pu'

diff --git a/Documentation/config.txt b/Documentation/config.txt
index b2c3388..57999fa 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -201,10 +201,6 @@ advice.*::
 	rmHints::
 		In case of failure in the output of linkgit:git-rm[1],
 		show directions on how to proceed from the current state.
-	checkoutLocked::
-		In multiple checkout setup, attempting to checkout a
-		branch already checked out elsewhere will fail. Show
-		some useful options to proceed.
 --
 
 core.fileMode::
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt
index 6bd82af..c9a7d1a 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.txt
@@ -139,8 +139,8 @@ is often called 'detached HEAD.'  See linkgit:git-checkout[1]
 for details.
 
 config::
-	Repository specific configuration file. This file is ignored if
-	$GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/config" will be
+	Repository specific configuration file. This file is ignored
+	if $GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/config" will be
 	used instead.
 
 branches::
@@ -218,11 +218,10 @@ remotes::
 	"$GIT_COMMON_DIR/remotes" will be used instead.
 
 logs::
-	Records of changes made to refs are stored in this
-	directory.  See linkgit:git-update-ref[1]
-	for more information. This directory is ignored if
-	$GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/logs" will be used
-	instead.
+	Records of changes made to refs are stored in this directory.
+	See linkgit:git-update-ref[1] for more information. This
+	directory is ignored $GIT_COMMON_DIR is set and
+	"$GIT_COMMON_DIR/logs" will be used instead.
 
 logs/refs/heads/`name`::
 	Records all changes made to the branch tip named `name`.
diff --git a/advice.c b/advice.c
index cf3b0f7..9b42033 100644
--- a/advice.c
+++ b/advice.c
@@ -15,7 +15,6 @@ int advice_detached_head = 1;
 int advice_set_upstream_failure = 1;
 int advice_object_name_warning = 1;
 int advice_rm_hints = 1;
-int advice_checkout_locked = 1;
 
 static struct {
 	const char *name;
@@ -36,7 +35,6 @@ static struct {
 	{ "setupstreamfailure", &advice_set_upstream_failure },
 	{ "objectnamewarning", &advice_object_name_warning },
 	{ "rmhints", &advice_rm_hints },
-	{ "checkoutlocked", &advice_checkout_locked },
 
 	/* make this an alias for backward compatibility */
 	{ "pushnonfastforward", &advice_push_update_rejected }
diff --git a/advice.h b/advice.h
index 935631d..5ecc6c1 100644
--- a/advice.h
+++ b/advice.h
@@ -18,7 +18,6 @@ extern int advice_detached_head;
 extern int advice_set_upstream_failure;
 extern int advice_object_name_warning;
 extern int advice_rm_hints;
-extern int advice_checkout_locked;
 
 int git_default_advice_config(const char *var, const char *value);
 __attribute__((format (printf, 1, 2)))
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 3dc416c..b88c646 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -862,7 +862,7 @@ static int prepare_linked_checkout(const struct checkout_opts *opts,
 	if (!new->commit)
 		die(_("no branch specified"));
 	if (file_exists(path))
-		die(_("%s already exists"), path);
+		die(_("'%s' already exists"), path);
 
 	len = strlen(path);
 	while (len && is_dir_sep(path[len - 1]))
@@ -1038,16 +1038,7 @@ static void check_linked_checkout(struct branch_info *new, const char *id)
 		strbuf_rtrim(&gitdir);
 	} else
 		strbuf_addstr(&gitdir, get_git_common_dir());
-	if (advice_checkout_locked)
-		die(_("'%s' is already checked out at %s\n"
-		      "Either go there and continue working, or detach HEAD using\n"
-		      "    git checkout --detach [more options] %s\n"
-		      "or create a new branch based off '%s' using\n"
-		      "    git checkout -b <branch name> [more options] %s\n"
-		      "or switch to another branch at the other checkout and retry."),
-		    new->name, gitdir.buf, new->name, new->name, new->name);
-	else
-		die(_("'%s' is already checked out at %s"), new->name, gitdir.buf);
+	die(_("'%s' is already checked out at '%s'"), new->name, gitdir.buf);
 done:
 	strbuf_release(&path);
 	strbuf_release(&sb);
diff --git a/t/t2025-checkout-to.sh b/t/t2025-checkout-to.sh
index 508993f..aa24ea8 100755
--- a/t/t2025-checkout-to.sh
+++ b/t/t2025-checkout-to.sh
@@ -12,6 +12,11 @@ test_expect_success 'checkout --to not updating paths' '
 	test_must_fail git checkout --to -- init.t
 '
 
+test_expect_success 'checkout --to an existing worktree' '
+	mkdir existing &&
+	test_must_fail git checkout --detach --to existing master
+'
+
 test_expect_success 'checkout --to refuses to checkout locked branch' '
 	test_must_fail git checkout --to zere master &&
 	! test -d zere &&
@@ -31,6 +36,16 @@ test_expect_success 'checkout --to a new worktree' '
 	)
 '
 
+test_expect_success 'checkout --to a new worktree from a subdir' '
+	(
+		mkdir sub &&
+		cd sub &&
+		git checkout --detach --to here master &&
+		cd here &&
+		test_cmp ../../init.t init.t
+	)
+'
+
 test_expect_success 'checkout --to from a linked checkout' '
 	(
 		cd here &&
-- 
2.1.0.rc0.78.gc0d8480