Michael Haggerty wrote: > Move the responsibility for normalizing prefixes from > longest_ancestor_length() to its callers. Use slightly different > normalizations at the two callers: > > In setup_git_directory_gently_1(), use the old normalization, which > ignores paths that are not usable. In the next commit we will change > this caller to also resolve symlinks in the paths from > GIT_CEILING_DIRECTORIES as part of the normalization. > > In "test-path-utils longest_ancestor_length", use the old > normalization, but die() if any paths are unusable. Also change t0060 > to only pass normalized paths to the test program (no empty entries or > non-absolute paths, strip trailing slashes from the paths, and remove > tests that thereby become redundant). > > The point of this change is to reduce the scope of the ancestor_length > tests in t0060 from testing normalization+longest_prefix to testing > only mostly longest_prefix. This is necessary because when > setup_git_directory_gently_1() starts resolving symlinks as part of > its normalization, it will not be reasonable to do the same in the > test suite, because that would make the test results depend on the > contents of the root directory of the filesystem on which the test is > run. HOWEVER: under Windows, bash mangles arguments that look like > absolute POSIX paths into DOS paths. Just to be clear, this is true for the MinGW port to Windows, but *not* the cygwin port. :-P > So we have to retain the level > of normalization done by normalize_path_copy() to convert the > bash-mangled DOS paths (which contain backslashes) into paths that use > forward slashes. > > Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> > --- > path.c | 26 +++++++++++--------------- > setup.c | 23 +++++++++++++++++++++++ > t/t0060-path-utils.sh | 41 +++++++++++++---------------------------- > test-path-utils.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- > 4 files changed, 91 insertions(+), 44 deletions(-) > [snip] > diff --git a/test-path-utils.c b/test-path-utils.c > index acb0560..0092cbf 100644 > --- a/test-path-utils.c > +++ b/test-path-utils.c > @@ -1,6 +1,33 @@ > #include "cache.h" > #include "string-list.h" > > +/* > + * A "string_list_each_func_t" function that normalizes an entry from > + * GIT_CEILING_DIRECTORIES. If the path is unusable for some reason, > + * die with an explanation. > + */ > +static int normalize_ceiling_entry(struct string_list_item *item, void *unused) > +{ > + const char *ceil = item->string; > + int len = strlen(ceil); > + char buf[PATH_MAX+1]; > + > + if (len == 0) > + die("Empty path is not supported"); > + if (len > PATH_MAX) > + die("Path \"%s\" is too long", ceil); > + if (!is_absolute_path(ceil)) > + die("Path \"%s\" is not absolute", ceil); > + if (normalize_path_copy(buf, ceil) < 0) > + die("Path \"%s\" could not be normalized", ceil); > + len = strlen(buf); > + if (len > 1 && buf[len-1] == '/') > + die("Normalized path \"%s\" ended with slash", buf); > + free(item->string); > + item->string = xstrdup(buf); > + return 1; > +} > + > int main(int argc, char **argv) > { > if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) { > @@ -33,10 +60,26 @@ int main(int argc, char **argv) > if (argc == 4 && !strcmp(argv[1], "longest_ancestor_length")) { > int len; > struct string_list ceiling_dirs = STRING_LIST_INIT_DUP; > + char *path = xstrdup(argv[2]); > > + /* > + * We have to normalize the arguments because under > + * Windows, bash mangles arguments that look like ditto > + * absolute POSIX paths or colon-separate lists of > + * absolute POSIX paths into DOS paths (e.g., > + * "/foo:/foo/bar" might be converted to > + * "D:\Src\msysgit\foo;D:\Src\msysgit\foo\bar"), > + * whereas longest_ancestor_length() requires paths > + * that use forward slashes. > + */ > + if (normalize_path_copy(path, path)) > + die("Path \"%s\" could not be normalized", argv[2]); > string_list_split(&ceiling_dirs, argv[3], PATH_SEP, -1); > - len = longest_ancestor_length(argv[2], &ceiling_dirs); > + filter_string_list(&ceiling_dirs, 0, > + normalize_ceiling_entry, NULL); > + len = longest_ancestor_length(path, &ceiling_dirs); > string_list_clear(&ceiling_dirs, 0); > + free(path); > printf("%d\n", len); > return 0; > } HTH ATB, Ramsay Jones -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html