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 5/8] work-trees are allowed inside a git-dir
Date: Fri, 27 Jul 2007 19:57:46 +0100 (BST)	[thread overview]
Message-ID: <Pine.LNX.4.64.0707271957250.14781@racer.site> (raw)
In-Reply-To: <Pine.LNX.4.64.0707271851370.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.

Coincidently, you can omit the "--work-tree" now, if your repository knows
about the location already.

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.18.g49a1

  parent reply	other threads:[~2007-07-27 18:58 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-27 18:55 [PATCH 0/8 REVISION2] work-tree cleanups Johannes Schindelin
2007-07-27 18:56 ` [PATCH 1/8] Add is_absolute_path() and make_absolute_path() Johannes Schindelin
2007-07-27 20:51   ` Junio C Hamano
2007-07-28  1:03     ` Johannes Schindelin
2007-07-27 18:56 ` [PATCH 2/8] Add functions get_relative_cwd() and is_inside_dir() Johannes Schindelin
2007-07-27 20:51   ` Junio C Hamano
2007-07-28  1:03     ` Johannes Schindelin
2007-07-27 18:56 ` [PATCH 3/8] Clean up work-tree handling Johannes Schindelin
2007-07-27 20:51   ` Junio C Hamano
2007-07-28  0:21     ` Johannes Schindelin
2007-07-28  0:42       ` Junio C Hamano
2007-07-28  0:56         ` Johannes Schindelin
2007-07-28  5:18           ` Junio C Hamano
2007-07-28  9:01             ` Johannes Schindelin
2007-07-28 11:15               ` Junio C Hamano
2007-07-28 19:38                 ` Johannes Schindelin
2007-07-29 15:53             ` Johannes Schindelin
2007-07-29 19:54               ` Junio C Hamano
2007-07-29 20:02                 ` Johannes Schindelin
2007-07-27 18:57 ` [PATCH 4/8] Add set_git_dir() function Johannes Schindelin
2007-07-27 18:57 ` Johannes Schindelin [this message]
2007-07-27 20:51   ` [PATCH 5/8] work-trees are allowed inside a git-dir Junio C Hamano
2007-07-28  0:38     ` Johannes Schindelin
2007-07-28  0:48       ` Junio C Hamano
2007-07-28  1:01         ` Johannes Schindelin
2007-07-27 18:58 ` [PATCH 6/8] init: use get_git_work_tree() instead of rolling our own Johannes Schindelin
2007-07-27 18:58 ` [PATCH 7/8] Make t1501 a little saner, and fix it Johannes Schindelin
2007-07-27 18:59 ` [PATCH 8/8] Fix t1500 for sane work-tree behavior Johannes Schindelin
2007-07-27 20:51   ` Junio C Hamano
2007-07-28  0:46     ` 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.0707271957250.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).