Re: [PATCH v4 6/8] longest_ancestor_length(): require prefix list entries to be normalized
- From
Ramsay Jones <ramsay@ramsay1.demon.co.uk>
- Date
- Oct 30, 2012, 18:23 UTC
- Message-ID
- <50901B31.7000402@ramsay1.demon.co.uk>
- In-Reply-To
- <1351440987-26636-7-git-send-email-mhagger@alum.mit.edu>
Michael Haggerty wrote:
Show 24 quoted lines
> 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
Show 13 quoted lines
> 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@alum.mit.edu> > --- > 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]
Show 47 quoted lines
> 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 likeditto
Show 19 quoted lines
> + * 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