git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: gitster@pobox.com, git@vger.kernel.org, matled@gmx.net
Subject: [PATCH 6/9] work-trees are allowed inside a git-dir
Date: Mon, 30 Jul 2007 00:25:42 +0100 (BST)	[thread overview]
Message-ID: <Pine.LNX.4.64.0707300025250.14781@racer.site> (raw)
In-Reply-To: <Pine.LNX.4.64.0707300016470.14781@racer.site>


It is allowed to call

	$ git --git-dir=../ --work-tree=. bla

when you really want to.  In this case, you are both in the git directory
and in the working tree.

The earlier handling of this situation was seriously bogus.  For regular
working tree operations, it checked if inside git dir.  That makes no
sense, of course, since the check should be for a work tree, and nothing
else.

Fix that.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin-ls-files.c |    8 +++++---
 git-sh-setup.sh    |    3 +--
 git.c              |   11 ++++++++---
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/builtin-ls-files.c b/builtin-ls-files.c
index 61577ea..d36181a 100644
--- a/builtin-ls-files.c
+++ b/builtin-ls-files.c
@@ -469,9 +469,11 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
 		break;
 	}
 
-	if (require_work_tree &&
-			(!is_inside_work_tree() || is_inside_git_dir()))
-		die("This operation must be run in a work tree");
+	if (require_work_tree && !is_inside_work_tree()) {
+		const char *work_tree = get_git_work_tree();
+		if (!work_tree || chdir(work_tree))
+			die("This operation must be run in a work tree");
+	}
 
 	pathspec = get_pathspec(prefix, argv + i);
 
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index c51985e..7bef43f 100755
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -59,8 +59,7 @@ cd_to_toplevel () {
 }
 
 require_work_tree () {
-	test $(git rev-parse --is-inside-work-tree) = true &&
-	test $(git rev-parse --is-inside-git-dir) = false ||
+	test $(git rev-parse --is-inside-work-tree) = true ||
 	die "fatal: $0 cannot be used without a working tree."
 }
 
diff --git a/git.c b/git.c
index a647f9c..2433355 100644
--- a/git.c
+++ b/git.c
@@ -272,9 +272,14 @@ static int run_command(struct cmd_struct *p, int argc, const char **argv)
 		prefix = setup_git_directory();
 	if (p->option & USE_PAGER)
 		setup_pager();
-	if ((p->option & NEED_WORK_TREE) &&
-	    (!is_inside_work_tree() || is_inside_git_dir()))
-		die("%s must be run in a work tree", p->cmd);
+	if (p->option & NEED_WORK_TREE) {
+		const char *work_tree = get_git_work_tree();
+		const char *git_dir = get_git_dir();
+		if (!is_absolute_path(git_dir))
+			set_git_dir(make_absolute_path(git_dir));
+		if (!work_tree || chdir(work_tree))
+			die("%s must be run in a work tree", p->cmd);
+	}
 	trace_argv_printf(argv, argc, "trace: built-in: git");
 
 	status = p->fn(argc, argv, prefix);
-- 
1.5.3.rc3.28.g1406

  parent reply	other threads:[~2007-07-29 23:26 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-29 23:23 [PATCH 0/9] work-tree clean ups Johannes Schindelin
2007-07-29 23:24 ` [PATCH 1/9] Add is_absolute_path() and make_absolute_path() Johannes Schindelin
2007-07-29 23:24 ` [PATCH 2/9] Add functions get_relative_cwd() and is_inside_dir() Johannes Schindelin
2007-07-29 23:24 ` [PATCH 3/9] white space fixes in setup.c Johannes Schindelin
2007-07-29 23:25 ` [PATCH 4/9] Clean up work-tree handling Johannes Schindelin
2007-07-29 23:25 ` [PATCH 5/9] Add set_git_dir() function Johannes Schindelin
2007-07-29 23:25 ` Johannes Schindelin [this message]
2007-07-29 23:25 ` [PATCH 7/9] init: use get_git_work_tree() instead of rolling our own Johannes Schindelin
2007-07-29 23:26 ` [PATCH 8/9] Fix t1501 for updated work-tree logic Johannes Schindelin
2007-07-29 23:26 ` [PATCH 9/9] Fix t1500 for sane work-tree behavior Johannes Schindelin
2007-07-29 23:29 ` [UNWANTED PATCH] Die if core.bare = true and core.worktree is set Johannes Schindelin
2007-08-01  0:28 ` [PATCH 0/9] work-tree clean ups Johannes Schindelin
2007-08-01  0:28   ` [PATCH 1/4] Add is_absolute_path() and make_absolute_path() Johannes Schindelin
2007-08-01  0:29   ` [PATCH 2/4] Add functions get_relative_cwd() and is_inside_dir() Johannes Schindelin
2007-08-01  4:22     ` Junio C Hamano
2007-08-01  5:35       ` Junio C Hamano
2007-08-01 11:38         ` Johannes Schindelin
2007-08-01 15:26         ` [NOT-SERIOUS PATCH] Make get_relative_cwd() not accept NULL for a directory Johannes Schindelin
2007-08-01 16:58           ` Junio C Hamano
2007-08-01 18:26             ` [PATCH] get_relative_cwd(): clarify why it handles dir == NULL Johannes Schindelin
2007-08-01  0:29   ` [PATCH 3/4] Add set_git_dir() function Johannes Schindelin
2007-08-01  0:30   ` [PATCH 4/4] Clean up work-tree handling Johannes Schindelin
2007-08-01  5:17     ` Junio C Hamano
2007-08-01 11:46       ` Johannes Schindelin
2007-08-02  7:04         ` Junio C Hamano
2007-08-01  8:59     ` Junio C Hamano
2007-08-01 11:53       ` Johannes Schindelin
2007-08-01  0:55   ` [PATCH 0/9] work-tree clean ups Junio C Hamano
2007-08-01  1:13     ` Johannes Schindelin
2007-08-01 10:56       ` Johannes Schindelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.64.0707300025250.14781@racer.site \
    --to=johannes.schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=matled@gmx.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).