Skip to contentSkip to conversation

Add NEED_WORK_TREE for more commands

PATCH In review Nguyễn Thái Ngọc Duy 3 participants 5 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add NEED_WORK_TREE for more commands

---
 git.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)
git.c +6 -6
index 23a430c..9db40b3 100644
@@ -307,10 +307,10 @@ static void handle_internal_command(int argc, const char **argv)
 	const char *cmd = argv[0];
 	static struct cmd_struct commands[] = {
 		{ "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
-		{ "annotate", cmd_annotate, RUN_SETUP },
+		{ "annotate", cmd_annotate, RUN_SETUP | NEED_WORK_TREE },
 		{ "apply", cmd_apply },
 		{ "archive", cmd_archive },
-		{ "blame", cmd_blame, RUN_SETUP },
+		{ "blame", cmd_blame, RUN_SETUP | NEED_WORK_TREE },
 		{ "branch", cmd_branch, RUN_SETUP },
 		{ "bundle", cmd_bundle },
 		{ "cat-file", cmd_cat_file, RUN_SETUP },
@@ -333,7 +333,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "fetch--tool", cmd_fetch__tool, RUN_SETUP },
 		{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
 		{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
-		{ "format-patch", cmd_format_patch, RUN_SETUP },
+		{ "format-patch", cmd_format_patch, RUN_SETUP | NEED_WORK_TREE },
 		{ "fsck", cmd_fsck, RUN_SETUP },
 		{ "fsck-objects", cmd_fsck, RUN_SETUP },
 		{ "gc", cmd_gc, RUN_SETUP },
@@ -346,7 +346,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "init", cmd_init_db },
 		{ "init-db", cmd_init_db },
 		{ "log", cmd_log, RUN_SETUP | USE_PAGER },
-		{ "ls-files", cmd_ls_files, RUN_SETUP },
+		{ "ls-files", cmd_ls_files, RUN_SETUP | NEED_WORK_TREE },
 		{ "ls-tree", cmd_ls_tree, RUN_SETUP },
 		{ "mailinfo", cmd_mailinfo },
 		{ "mailsplit", cmd_mailsplit },
@@ -363,7 +363,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "reflog", cmd_reflog, RUN_SETUP },
 		{ "repo-config", cmd_config },
 		{ "rerere", cmd_rerere, RUN_SETUP },
-		{ "reset", cmd_reset, RUN_SETUP },
+		{ "reset", cmd_reset, RUN_SETUP | NEED_WORK_TREE },
 		{ "rev-list", cmd_rev_list, RUN_SETUP },
 		{ "rev-parse", cmd_rev_parse, RUN_SETUP },
 		{ "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
@@ -377,7 +377,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "tag", cmd_tag, RUN_SETUP },
 		{ "tar-tree", cmd_tar_tree },
 		{ "unpack-objects", cmd_unpack_objects, RUN_SETUP },
-		{ "update-index", cmd_update_index, RUN_SETUP },
+		{ "update-index", cmd_update_index, RUN_SETUP | NEED_WORK_TREE },
 		{ "update-ref", cmd_update_ref, RUN_SETUP },
 		{ "upload-archive", cmd_upload_archive },
 		{ "verify-tag", cmd_verify_tag, RUN_SETUP },
Signature · 1 line
1.5.3.rc4.3.gab089
#1 lore raw

git.c

Quoted 12 lines · Nguyễn Thái Ngọc Duy
---
 git.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)
git.c +2 -0
index 23a430c..9db40b3 100644
+		{ "ls-files", cmd_ls_files, RUN_SETUP | NEED_WORK_TREE },
+		{ "update-index", cmd_update_index, RUN_SETUP | NEED_WORK_TREE },

At least these two work very fine without a working tree (and I *do* need them to work without a working tree).

Mike

#2 lore raw
Quoted 7 lines · Mike Hommey
Quoted 6 lines · Nguy???n Th??i Ng???c Duy
---
 git.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)
Quoted 9 lines

git.c

Quoted 6 lines
git.c +2 -0
index 23a430c..9db40b3 100644
+		{ "ls-files", cmd_ls_files, RUN_SETUP | NEED_WORK_TREE },
+		{ "update-index", cmd_update_index, RUN_SETUP | NEED_WORK_TREE },

At least these two work very fine without a working tree (and I *do* need them to work without a working tree).

How can you do that while both need index and a working directory to operate?

Quoted 1 line

Mike

Signature · 1 line
Duy
#3 lore raw
Quoted 18 lines · Nguyen Thai Ngoc Duy
Quoted 7 lines · Mike Hommey
Quoted 6 lines · Nguy???n Th??i Ng???c Duy
---
 git.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)
Quoted 9 lines

git.c

Quoted 6 lines
git.c +2 -0
index 23a430c..9db40b3 100644
+		{ "ls-files", cmd_ls_files, RUN_SETUP | NEED_WORK_TREE },
+		{ "update-index", cmd_update_index, RUN_SETUP | NEED_WORK_TREE },

At least these two work very fine without a working tree (and I *do* need them to work without a working tree).

Quoted 2 lines

How can you do that while both need index and a working directory to operate?

For example, ls-files -c and update-index --remove don't need more than the index, and you don't need a working tree to fiddle with the index with these commands.

By the way, git-rm has a --cached option that allows it to only work on the index, but it has a NEED_WORK_TREE which prevents its use without a working tree in such a case (though I don't know if the implementation itself relies on the working tree or not, but if it does, it shouldn't). It's sad to have to do
git-ls-files -c directory | xargs -d "\n" git-update-index --remove instead of
git-rm -r --cached directory
when you want to remove a directory in a bare repository.

Mike

#4 lore raw
In reply to Nguyễn Thái Ngọc Duy

Hi,

git.c static void handle_internal_command(int argc, const char **argv) · line 313

Quoted 2 lines · Nguyễn Thái Ngọc Duy
git.c +2 -0
+		{ "annotate", cmd_annotate, RUN_SETUP | NEED_WORK_TREE },
+		{ "blame", cmd_blame, RUN_SETUP | NEED_WORK_TREE },

Both can be sensibly run without a work tree: "git blame <commit> <file>"

git.c static void handle_internal_command(int argc, const char **argv) · line 336

Quoted 1 line
git.c +1 -0
+		{ "format-patch", cmd_format_patch, RUN_SETUP | NEED_WORK_TREE },

This can be run without work tree in any case, methinks. AFAICT format-patch only ever uses information from the object database.

git.c static void handle_internal_command(int argc, const char **argv) · line 349

Quoted 1 line
git.c +1 -0
+		{ "ls-files", cmd_ls_files, RUN_SETUP | NEED_WORK_TREE },

That has already been commented on.

git.c static void handle_internal_command(int argc, const char **argv) · line 366

Quoted 1 line
git.c +1 -0
+		{ "reset", cmd_reset, RUN_SETUP | NEED_WORK_TREE },

"git reset --soft HEAD <commit>" makes sense in a bare repository.

git.c static void handle_internal_command(int argc, const char **argv) · line 380

Quoted 1 line
git.c +1 -0
+		{ "update-index", cmd_update_index, RUN_SETUP | NEED_WORK_TREE },

That has been coommented on, too.

I agree that there are modes for these commands (except format-patch), in which they want a work-tree, but they have other modes, too, so IMHO it should be solved a la 6d9ba67b(Commands requiring a work tree must not run in GIT_DIR). You'll see that ls-files already has some special handling here, and this could be refactorised to requires_work_tree(), which should make the code much more elegant.

Ciao,
Dscho