{"thread":{"id":"7968","subject":"[PATCH v2] Support ent:relative_path","startedAt":"2007-05-04T07:43:00Z","lastAt":"2007-05-04T20:43:34Z","messageCount":3,"participants":["Dana How","Alex Riesen"],"isPatch":true,"patchVersion":2,"patchTotal":null},"messages":[{"id":"41014","messageId":"463AE404.9060906@gmail.com","threadId":"7968","inReplyTo":null,"subject":"[PATCH v2] Support ent:relative_path","fromName":"Dana How","fromEmail":"danahow@gmail.com","sentAt":"2007-05-04T07:43:00Z","receivedAt":"2007-05-04T07:43:00Z","isPatch":true,"sender":{"key":"danahow@gmail.com","avatar":null},"body":"\nMost commands accept relative paths,  but this is\nnot true of arguments in ent:path format.  This\npatch makes all 3 of the following git-show commands\nwork in the git source tree (not just the first):\n % cd xdiff\n % git-show v1.5.2-rc0:xdiff/xemit.h\n % git-show v1.5.2-rc0:./xemit.h\n % git-config --bool core.relativepaths yes\n % git-show v1.5.2-rc0:xemit.h\n\nSigned-off-by: Dana L. How <danahow@gmail.com>\n---\n cache.h       |    2 ++\n config.c      |    5 +++++\n environment.c |    1 +\n setup.c       |    5 ++++-\n sha1_name.c   |   29 ++++++++++++++++++++++++++---\n 5 files changed, 38 insertions(+), 4 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex 8e76152..fc3fcb1 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -215,6 +215,7 @@ extern char *get_graft_file(void);\n \n #define ALTERNATE_DB_ENVIRONMENT \"GIT_ALTERNATE_OBJECT_DIRECTORIES\"\n \n+extern const char *prefix_to_cwd;\n extern const char **get_pathspec(const char *prefix, const char **pathspec);\n extern const char *setup_git_directory_gently(int *);\n extern const char *setup_git_directory(void);\n@@ -276,6 +277,7 @@ extern int delete_ref(const char *, const unsigned char *sha1);\n extern int use_legacy_headers;\n extern int trust_executable_bit;\n extern int has_symlinks;\n+extern int assume_relative_paths;\n extern int assume_unchanged;\n extern int prefer_symlink_refs;\n extern int log_all_ref_updates;\ndiff --git a/config.c b/config.c\nindex 70d1055..7525965 100644\n--- a/config.c\n+++ b/config.c\n@@ -279,6 +279,11 @@ int git_default_config(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n+\tif (!strcmp(var, \"core.relativepaths\")) {\n+\t\tassume_relative_paths = git_config_bool(var, value);\n+\t\treturn 0;\n+\t}\n+\n \tif (!strcmp(var, \"core.ignorestat\")) {\n \t\tassume_unchanged = git_config_bool(var, value);\n \t\treturn 0;\ndiff --git a/environment.c b/environment.c\nindex 2231659..f1b867d 100644\n--- a/environment.c\n+++ b/environment.c\n@@ -14,6 +14,7 @@ char git_default_name[MAX_GITNAME];\n int use_legacy_headers = 1;\n int trust_executable_bit = 1;\n int has_symlinks = 1;\n+int assume_relative_paths;\n int assume_unchanged;\n int prefer_symlink_refs;\n int is_bare_repository_cfg = -1; /* unspecified */\ndiff --git a/setup.c b/setup.c\nindex a45ea83..46ae6e3 100644\n--- a/setup.c\n+++ b/setup.c\n@@ -1,5 +1,7 @@\n #include \"cache.h\"\n \n+const char *prefix_to_cwd;\n+\n const char *prefix_path(const char *prefix, int len, const char *path)\n {\n \tconst char *orig = path;\n@@ -252,7 +254,8 @@ const char *setup_git_directory_gently(int *nongit_ok)\n \tcwd[len++] = '/';\n \tcwd[len] = 0;\n \tinside_git_dir = !prefixcmp(cwd + offset, \".git/\");\n-\treturn cwd + offset;\n+\tprefix_to_cwd = cwd + offset;\n+\treturn prefix_to_cwd;\n }\n \n int git_config_perm(const char *var, const char *value)\ndiff --git a/sha1_name.c b/sha1_name.c\nindex 55f25a2..d276767 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -592,6 +592,26 @@ static int handle_one_ref(const char *path,\n \treturn 0;\n }\n \n+static void prepend_prefix(const char **cp, int *namelen)\n+{\n+\tstatic char fullpath[PATH_MAX];\n+\tif (*namelen > 2 && !memcmp(*cp, \"./\", 2)) {\n+\t\t*cp += 2;\n+\t\t*namelen -= 2;\n+\t} else\n+\tif (!assume_relative_paths)\n+\t\treturn;\n+\tif (!prefix_to_cwd)\n+\t\treturn;\n+\n+\t*namelen += strlen(prefix_to_cwd);\n+\tif (*namelen >= PATH_MAX)\n+\t\tdie(\"path too long\");\n+\tstrcpy(fullpath, prefix_to_cwd);\n+\tstrcat(fullpath, *cp);\n+\t*cp = fullpath;\n+}\n+\n /*\n  * This interprets names like ':/Initial revision of \"git\"' by searching\n  * through history and returning the first commit whose message starts\n@@ -681,6 +701,7 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode)\n \t\t\tread_cache();\n \t\tif (active_nr < 0)\n \t\t\treturn -1;\n+\t\tprepend_prefix(&cp, &namelen);\n \t\tpos = cache_name_pos(cp, namelen);\n \t\tif (pos < 0)\n \t\t\tpos = -pos - 1;\n@@ -708,9 +729,11 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode)\n \t}\n \tif (*cp == ':') {\n \t\tunsigned char tree_sha1[20];\n-\t\tif (!get_sha1_1(name, cp-name, tree_sha1))\n-\t\t\treturn get_tree_entry(tree_sha1, cp+1, sha1,\n-\t\t\t\t\t      mode);\n+\t\tif (!get_sha1_1(name, cp - name, tree_sha1)) {\n+\t\t\tnamelen -= ++cp - name;\n+\t\t\tprepend_prefix(&cp, &namelen);\n+\t\t\treturn get_tree_entry(tree_sha1, cp, sha1, mode);\n+\t\t}\n \t}\n \treturn ret;\n }\n-- \n1.5.2.rc0.787.g0014\n"},{"id":"41087","messageId":"20070504202613.GC4033@steel.home","threadId":"7968","inReplyTo":"463AE404.9060906@gmail.com","subject":"Re: [PATCH v2] Support ent:relative_path","fromName":"Alex Riesen","fromEmail":"raa.lkml@gmail.com","sentAt":"2007-05-04T20:26:13Z","receivedAt":"2007-05-04T20:26:13Z","isPatch":true,"sender":{"key":"raa.lkml@gmail.com","avatar":"https://avatars.githubusercontent.com/u/324101?v=4"},"body":"Dana How, Fri, May 04, 2007 09:43:00 +0200:\n> +\tif (!strcmp(var, \"core.relativepaths\")) {\n> +\t\tassume_relative_paths = git_config_bool(var, value);\n> +\t\treturn 0;\n> +\t}\n\nStill don't like it. What good is a syntax you cannot depend upon?\n"},{"id":"41089","messageId":"56b7f5510705041343uc167f6djc6c60881fc4048b7@mail.gmail.com","threadId":"7968","inReplyTo":"20070504202613.GC4033@steel.home","subject":"Re: [PATCH v2] Support ent:relative_path","fromName":"Dana How","fromEmail":"danahow@gmail.com","sentAt":"2007-05-04T20:43:34Z","receivedAt":"2007-05-04T20:43:34Z","isPatch":true,"sender":{"key":"danahow@gmail.com","avatar":null},"body":"On 5/4/07, Alex Riesen <raa.lkml@gmail.com> wrote:\n> Dana How, Fri, May 04, 2007 09:43:00 +0200:\n> > +     if (!strcmp(var, \"core.relativepaths\")) {\n> > +             assume_relative_paths = git_config_bool(var, value);\n> > +             return 0;\n> > +     }\n> Still don't like it. What good is a syntax you cannot depend upon?\n\nNo worry.\nJunio already squashed this,  and I agreed.\n-- \nDana L. How  danahow@gmail.com  +1 650 804 5991 cell\n"}]}