path: root/path.c
diff options
authorJunio C Hamano <>2013-09-09 21:36:15 (GMT)
committerJunio C Hamano <>2013-09-09 21:36:15 (GMT)
commitb02f5aeda6f66ac3be9b2e35f9b237d4f1f80d73 (patch)
tree8b85c36e79c9f3dffbc9ea9df9c812c5f5070514 /path.c
parentde9a25354aa22aa6796787f3ef3af276fba82339 (diff)
parent95c16418f0375e2fc325f32c3d7578fba9cfd7ef (diff)
Merge branch 'jl/submodule-mv'
"git mv A B" when moving a submodule A does "the right thing", inclusing relocating its working tree and adjusting the paths in the .gitmodules file. * jl/submodule-mv: (53 commits) rm: delete .gitmodules entry of submodules removed from the work tree mv: update the path entry in .gitmodules for moved submodules submodule.c: add .gitmodules staging helper functions mv: move submodules using a gitfile mv: move submodules together with their work trees rm: do not set a variable twice without intermediate reading. t6131 - skip tests if on case-insensitive file system parse_pathspec: accept :(icase)path syntax pathspec: support :(glob) syntax pathspec: make --literal-pathspecs disable pathspec magic pathspec: support :(literal) syntax for noglob pathspec kill limit_pathspec_to_literal() as it's only used by parse_pathspec() parse_pathspec: preserve prefix length via PATHSPEC_PREFIX_ORIGIN parse_pathspec: make sure the prefix part is wildcard-free rename field "raw" to "_raw" in struct pathspec tree-diff: remove the use of pathspec's raw[] in follow-rename codepath remove match_pathspec() in favor of match_pathspec_depth() remove init_pathspec() in favor of parse_pathspec() remove diff_tree_{setup,release}_paths convert common_prefix() to use struct pathspec ...
Diffstat (limited to 'path.c')
1 files changed, 14 insertions, 1 deletions
diff --git a/path.c b/path.c
index 3d244d3..9fd28bcd 100644
--- a/path.c
+++ b/path.c
@@ -543,8 +543,14 @@ const char *relative_path(const char *in, const char *prefix,
* Note that this function is purely textual. It does not follow symlinks,
* verify the existence of the path, or make any system calls.
+ *
+ * prefix_len != NULL is for a specific case of prefix_pathspec():
+ * assume that src == dst and src[0..prefix_len-1] is already
+ * normalized, any time "../" eats up to the prefix_len part,
+ * prefix_len is reduced. In the end prefix_len is the remaining
+ * prefix that has not been overridden by user pathspec.
-int normalize_path_copy(char *dst, const char *src)
+int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
char *dst0;
@@ -619,11 +625,18 @@ int normalize_path_copy(char *dst, const char *src)
/* Windows: dst[-1] cannot be backslash anymore */
while (dst0 < dst && dst[-1] != '/')
+ if (prefix_len && *prefix_len > dst - dst0)
+ *prefix_len = dst - dst0;
*dst = '\0';
return 0;
+int normalize_path_copy(char *dst, const char *src)
+ return normalize_path_copy_len(dst, src, NULL);
* path = Canonical absolute path
* prefixes = string_list containing normalized, absolute paths without