Merge branch 'mh/work-tree'
authorJunio C Hamano <gitster@pobox.com>
Thu, 8 Nov 2007 01:37:00 +0000 (17:37 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Nov 2007 01:37:00 +0000 (17:37 -0800)
* mh/work-tree:
Make git-blame fail when working tree is needed and we're not in one
Don't always require working tree for git-rm
Use setup_work_tree() in builtin-ls-files.c
Refactor working tree setup

builtin-blame.c
builtin-ls-files.c
builtin-rm.c
cache.h
git.c
setup.c
index aedc294eac276af8d1a3e8c39bf93fa8fda93f94..55a3c0bc5e3aa9c893468f5f97eab17681ddc673 100644 (file)
@@ -2342,6 +2342,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
                 * do not default to HEAD, but use the working tree
                 * or "--contents".
                 */
+               setup_work_tree();
                sb.final = fake_working_tree_commit(path, contents_from);
                add_pending_object(&revs, &(sb.final->object), ":");
        }
index b70da1863b221386a073ec8b7138cf0d91f52159..e0b856f4328a4df945f3dd0c3f0e1dc14020238f 100644 (file)
@@ -525,11 +525,8 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
                break;
        }
 
-       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");
-       }
+       if (require_work_tree && !is_inside_work_tree())
+               setup_work_tree();
 
        pathspec = get_pathspec(prefix, argv + i);
 
index bca2bd97036fdaf2e2bf99e308ba62e1acf4d9e8..a3d25e6a571584c486d252c5a8e2b182f3da86e3 100644 (file)
@@ -155,6 +155,9 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
        if (!argc)
                usage_with_options(builtin_rm_usage, builtin_rm_options);
 
+       if (!index_only)
+               setup_work_tree();
+
        pathspec = get_pathspec(prefix, argv);
        seen = NULL;
        for (i = 0; pathspec[i] ; i++)
diff --git a/cache.h b/cache.h
index bfffa05dff149a948e46b04f6b15589e6f4be07e..497b9f962db0ca7f7c8dda8e848126e22da6685f 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -222,6 +222,7 @@ extern const char *get_git_work_tree(void);
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
 
 extern const char **get_pathspec(const char *prefix, const char **pathspec);
+extern void setup_work_tree(void);
 extern const char *setup_git_directory_gently(int *);
 extern const char *setup_git_directory(void);
 extern const char *prefix_path(const char *prefix, int len, const char *path);
diff --git a/git.c b/git.c
index 4e10581101c26444da5c7c44a80219b11607705b..4a250f7e8b84f2334c84daaf93baa0fe1f0ca344 100644 (file)
--- a/git.c
+++ b/git.c
@@ -249,14 +249,9 @@ 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) {
-               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);
-       }
+       if (p->option & NEED_WORK_TREE)
+               setup_work_tree();
+
        trace_argv_printf(argv, argc, "trace: built-in: git");
 
        status = p->fn(argc, argv, prefix);
@@ -345,7 +340,7 @@ static void handle_internal_command(int argc, const char **argv)
                { "rev-list", cmd_rev_list, RUN_SETUP },
                { "rev-parse", cmd_rev_parse, RUN_SETUP },
                { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
-               { "rm", cmd_rm, RUN_SETUP | NEED_WORK_TREE },
+               { "rm", cmd_rm, RUN_SETUP },
                { "runstatus", cmd_runstatus, RUN_SETUP | NEED_WORK_TREE },
                { "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER },
                { "show-branch", cmd_show_branch, RUN_SETUP },
diff --git a/setup.c b/setup.c
index 145eca50f41d811c4c8fcb21ed2604e6b2971aba..df006d9c4a674b224f36318742ef01b339d797b3 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -206,6 +206,15 @@ static const char *set_work_tree(const char *dir)
        return NULL;
 }
 
+void setup_work_tree(void) {
+       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("This operation must be run in a work tree");
+}
+
 /*
  * We cannot decide in this function whether we are in the work tree or
  * not, since the config can only be read _after_ this function was called.