Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mingwandroid/4de33791da01278b5196 to your computer and use it in GitHub Desktop.
Save mingwandroid/4de33791da01278b5196 to your computer and use it in GitHub Desktop.
t0060-path-utils.sh
From fd11980f9b2d258cfa877b4bddebf81c7dd89eb8 Mon Sep 17 00:00:00 2001
From: Ray Donnelly <mingw.android@gmail.com>
Date: Sat, 16 Jan 2016 16:25:34 +0000
Subject: [PATCH] MSYS2: Fixes for respecting trailing slashes during path
conversion.
Allow '/' at end of path and prefixes in longest_ancestor_length
.. when new 'GIT_RUNNING_ANCESTOR_TEST' environment variable is set.
Unfortunately, there comes times that we run into semantic mismatches
between the Unix and the Windows worlds and this is one of those times.
This is a play to make more of the test-suite pass, but it is because
some of the assumptions about '/' don't hold true on Windows.
For a start, there isn't really a '/' on Windows since it doesn't obey
FHS; rather there's a bunch of drive letters. Instead Cygwin implements
a POSIX layer that obeys FHS above all of those drive letters and MSYS2
takes all of that good stuff and adds a few of its own bits and pieces:
When MSYS2 calls native Windows software it converts things that look
like Unix paths to Windows paths, so when it sees '/' it converts it
to whereever MSYS2 was intalled (actually based on where msys-2.0.dll
is located). One of the rules of this path conversion is to respect
the existence or not of any trailing '/', so if there was one at the
end of the Unix path then there'll still be one at the end of the
Windows version. This also applies to the root, '/', a decision which
simplifies things (i.e. fixes bugs) a lot and is eminently sensible
(i.e. it makes simple path concatenation just work without needing to
check whether we need to insert an '/' in-between).
By applying the hack when _WIN32 is defined and GIT_RUNNING_ANCESTOR_TEST
is set, the chances of distrubing other things should be minimized.
Also, in t/t0060-path-utils.sh, rootoff must be adjusted by an extra 1
due to '/' retaining it's trailing '/' post-conversion.
Signed-off-by: Ray Donnelly <mingw.android@gmail.com>
---
path.c | 23 +++++++++++++++++++++--
t/t0060-path-utils.sh | 3 ++-
test-path-utils.c | 1 +
3 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/path.c b/path.c
index bbe1ef2..099be61 100644
--- a/path.c
+++ b/path.c
@@ -1035,8 +1035,12 @@ int normalize_path_copy(char *dst, const char *src)
/*
* path = Canonical absolute path
* prefixes = string_list containing normalized, absolute paths without
- * trailing slashes (except for the root directory, which is denoted by "/").
- *
+ * trailing slashes (except for the root directory, which is denoted by "/"
+ * .. except On MSYS2, where it is possible that 'root' paths from the
+ * msys2 shell's perspective appear due to MSYS2 POSIX to Windows path
+ * conversion rules. For example, "/" is often translated to "C:/msys64/"
+ * Briefly, one rule is that path conversion respects the state of trailing
+ * slashes.)
* Determines, for each path in prefixes, whether the "prefix"
* is an ancestor directory of path. Returns the length of the longest
* ancestor directory, excluding any trailing slashes, or -1 if no prefix
@@ -1053,6 +1057,13 @@ int longest_ancestor_length(const char *path, struct string_list *prefixes)
if (!strcmp(path, "/"))
return -1;
+#ifdef _WIN32
+ if (path[strlen(path) - 1] == '/' && getenv("GIT_RUNNING_ANCESTOR_TEST"))
+ {
+ fprintf(stderr, "longest_ancestor_length: MSYS2 root detected in path %s\n", path);
+ return -1;
+ }
+#endif
for (i = 0; i < prefixes->nr; i++) {
const char *ceil = prefixes->items[i].string;
int len = strlen(ceil);
@@ -1061,6 +1072,14 @@ int longest_ancestor_length(const char *path, struct string_list *prefixes)
len = 0; /* root matches anything, with length 0 */
else if (!strncmp(path, ceil, len) && path[len] == '/')
; /* match of length len */
+#ifdef _WIN32
+ else if (len > 1 && !strncmp(path, ceil, len - 1) && ceil[len - 1] == '/' && getenv("GIT_RUNNING_ANCESTOR_TEST"))
+ {
+ fprintf(stderr, "longest_ancestor_length: MSYS2 root detected in prefix[%d] %s\n", i, ceil);
+ ; /* MSYS2 prefix ended in /, path matched prefix[0 .. len - 1] */
+ len--;
+ }
+#endif
else
continue; /* no match */
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 627ef85..ccb022e 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -35,7 +35,7 @@ rootoff=$(test-path-utils normalize_path_copy / | wc -c)
if test $rootoff = 2; then
rootoff= # we are on Unix
else
- rootoff=$(($rootoff-1))
+ rootoff=$(($rootoff-2))
fi
ancestor() {
@@ -44,6 +44,7 @@ ancestor() {
if test -n "$rootoff" && test "x$expected" != x-1; then
expected=$(($expected+$rootoff))
fi
+ GIT_RUNNING_ANCESTOR_TEST=yes \
test_expect_success "longest ancestor: $1 $2 => $expected" \
"actual=\$(test-path-utils longest_ancestor_length '$1' '$2') &&
test \"\$actual\" = '$expected'"
diff --git a/test-path-utils.c b/test-path-utils.c
index c67bf65..e26f77b 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c
@@ -85,6 +85,7 @@ int main(int argc, char **argv)
*/
if (normalize_path_copy(path, path))
die("Path \"%s\" could not be normalized", argv[2]);
+ fprintf(stderr, "normalize_path_copy returned %s\n", path);
string_list_split(&ceiling_dirs, argv[3], PATH_SEP, -1);
filter_string_list(&ceiling_dirs, 0,
normalize_ceiling_entry, NULL);
--
2.7.0
ok 1 - normalize path: =>
ok 2 - normalize path: . =>
ok 3 - normalize path: ./ =>
ok 4 - normalize path: ./. =>
ok 5 - normalize path: ./.. => ++failed++
ok 6 - normalize path: ../. => ++failed++
ok 7 - normalize path: ./../.// => ++failed++
ok 8 - normalize path: dir/.. =>
ok 9 - normalize path: dir/sub/../.. =>
ok 10 - normalize path: dir/sub/../../.. => ++failed++
ok 11 - normalize path: dir => dir
ok 12 - normalize path: dir// => dir/
ok 13 - normalize path: ./dir => dir
ok 14 - normalize path: dir/. => dir/
ok 15 - normalize path: dir///./ => dir/
ok 16 - normalize path: dir//sub/.. => dir/
ok 17 - normalize path: dir/sub/../ => dir/
ok 18 - normalize path: dir/sub/../. => dir/
ok 19 - normalize path: dir/s1/../s2/ => dir/s2/
ok 20 - normalize path: d1/s1///s2/..//../s3/ => d1/s3/
ok 21 - normalize path: d1/s1//../s2/../../d2 => d2
ok 22 - normalize path: d1/.../d2 => d1/.../d2
ok 23 - normalize path: d1/..././../d2 => d1/d2
ok 24 - normalize path: / => /
not ok 25 - normalize path: // => /
# test "$(test-path-utils normalize_path_copy '//')" = 'E:/git-sdk-64'
not ok 26 - normalize path: /// => /
# test "$(test-path-utils normalize_path_copy '///')" = 'E:/git-sdk-64'
ok 27 - normalize path: /. => /
ok 28 - normalize path: /./ => /
not ok 29 - normalize path: /./.. => ++failed++
# test "$(test-path-utils normalize_path_copy '/./..')" = '++failed++'
ok 30 - normalize path: /../. => ++failed++
not ok 31 - normalize path: /./../.// => ++failed++
# test "$(test-path-utils normalize_path_copy '/./.././/')" = '++failed++'
not ok 32 - normalize path: /dir/.. => /
# test "$(test-path-utils normalize_path_copy '/dir/..')" = 'E:/git-sdk-64'
not ok 33 - normalize path: /dir/sub/../.. => /
# test "$(test-path-utils normalize_path_copy '/dir/sub/../..')" = 'E:/git-sdk-64'
ok 34 - normalize path: /dir/sub/../../.. => ++failed++
ok 35 - normalize path: /dir => /dir
ok 36 - normalize path: /dir// => /dir/
ok 37 - normalize path: /./dir => /dir
ok 38 - normalize path: /dir/. => /dir/
ok 39 - normalize path: /dir///./ => /dir/
ok 40 - normalize path: /dir//sub/.. => /dir/
ok 41 - normalize path: /dir/sub/../ => /dir/
ok 42 - normalize path: //dir/sub/../. => /dir/
ok 43 - normalize path: /dir/s1/../s2/ => /dir/s2/
ok 44 - normalize path: /d1/s1///s2/..//../s3/ => /d1/s3/
ok 45 - normalize path: /d1/s1//../s2/../../d2 => /d2
ok 46 - normalize path: /d1/.../d2 => /d1/.../d2
ok 47 - normalize path: /d1/..././../d2 => /d1/d2
ok 48 - longest ancestor: / / => -1
ok 49 - longest ancestor: /foo / => 13
ok 50 - longest ancestor: /foo /fo => -1
ok 51 - longest ancestor: /foo /foo => -1
ok 52 - longest ancestor: /foo /bar => -1
ok 53 - longest ancestor: /foo /foo/bar => -1
ok 54 - longest ancestor: /foo /foo:/bar => -1
ok 55 - longest ancestor: /foo /:/foo:/bar => 13
ok 56 - longest ancestor: /foo /foo:/:/bar => 13
ok 57 - longest ancestor: /foo /:/bar:/foo => 13
ok 58 - longest ancestor: /foo/bar / => 13
ok 59 - longest ancestor: /foo/bar /fo => -1
ok 60 - longest ancestor: /foo/bar /foo => 17
ok 61 - longest ancestor: /foo/bar /foo/ba => -1
ok 62 - longest ancestor: /foo/bar /:/fo => 13
ok 63 - longest ancestor: /foo/bar /foo:/foo/ba => 17
ok 64 - longest ancestor: /foo/bar /bar => -1
ok 65 - longest ancestor: /foo/bar /fo => -1
ok 66 - longest ancestor: /foo/bar /foo:/bar => 17
ok 67 - longest ancestor: /foo/bar /:/foo:/bar => 17
ok 68 - longest ancestor: /foo/bar /foo:/:/bar => 17
ok 69 - longest ancestor: /foo/bar /:/bar:/fo => 13
ok 70 - longest ancestor: /foo/bar /:/bar => 13
ok 71 - longest ancestor: /foo/bar /foo => 17
ok 72 - longest ancestor: /foo/bar /foo:/bar => 17
ok 73 - longest ancestor: /foo/bar /bar => -1
ok 74 - strip_path_suffix
ok 75 - absolute path rejects the empty string
ok 76 - real path rejects the empty string
not ok 77 - real path works on absolute paths 1
#
# nopath="hopefully-absent-path" &&
# test "/" = "$(test-path-utils real_path "/")" &&
# test "/$nopath" = "$(test-path-utils real_path "/$nopath")"
#
not ok 78 - real path works on absolute paths 2
#
# nopath="hopefully-absent-path" &&
# # Find an existing top-level directory for the remaining tests:
# d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
# test "$d" = "$(test-path-utils real_path "$d")" &&
# test "$d/$nopath" = "$(test-path-utils real_path "$d/$nopath")"
#
not ok 79 - real path removes extra leading slashes
#
# nopath="hopefully-absent-path" &&
# test "/" = "$(test-path-utils real_path "///")" &&
# test "/$nopath" = "$(test-path-utils real_path "///$nopath")" &&
# # Find an existing top-level directory for the remaining tests:
# d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
# test "$d" = "$(test-path-utils real_path "//$d")" &&
# test "$d/$nopath" = "$(test-path-utils real_path "//$d/$nopath")"
#
not ok 80 - real path removes other extra slashes
#
# nopath="hopefully-absent-path" &&
# # Find an existing top-level directory for the remaining tests:
# d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
# test "$d" = "$(test-path-utils real_path "$d///")" &&
# test "$d/$nopath" = "$(test-path-utils real_path "$d///$nopath")"
#
ok 81 # skip real path works on symlinks (missing SYMLINKS)
ok 82 # skip prefix_path works with absolute paths to work tree symlinks (missing SYMLINKS)
ok 83 - prefix_path works with only absolute path to work tree
ok 84 - prefix_path rejects absolute path to dir with same beginning as work tree
ok 85 # skip prefix_path works with absolute path to a symlink to work tree having same beginning as work tree (missing SYMLINKS)
ok 86 - relative path: /foo/a/b/c/ /foo/a/b/ => c/
ok 87 - relative path: /foo/a/b/c/ /foo/a/b => c/
not ok 88 - relative path: /foo/a//b//c/ ///foo/a/b// => c/
# test "$(test-path-utils relative_path '/foo/a//b//c/' '///foo/a/b//')" = 'c/'
ok 89 - relative path: /foo/a/b /foo/a/b => ./
ok 90 - relative path: /foo/a/b/ /foo/a/b => ./
ok 91 - relative path: /foo/a /foo/a/b => ../
ok 92 - relative path: / /foo/a/b/ => ../../../
ok 93 - relative path: /foo/a/c /foo/a/b/ => ../c
ok 94 - relative path: /foo/a/c /foo/a/b => ../c
ok 95 - relative path: /foo/x/y /foo/a/b/ => ../../x/y
ok 96 - relative path: /foo/a/b <empty> => /foo/a/b
ok 97 - relative path: /foo/a/b <null> => /foo/a/b
ok 98 - relative path: foo/a/b/c/ foo/a/b/ => c/
ok 99 - relative path: foo/a/b/c/ foo/a/b => c/
ok 100 - relative path: foo/a/b//c foo/a//b => c
ok 101 - relative path: foo/a/b/ foo/a/b/ => ./
ok 102 - relative path: foo/a/b/ foo/a/b => ./
ok 103 - relative path: foo/a foo/a/b => ../
ok 104 - relative path: foo/x/y foo/a/b => ../../x/y
ok 105 - relative path: foo/a/c foo/a/b => ../c
ok 106 - relative path: foo/a/b /foo/x/y => foo/a/b
ok 107 - relative path: /foo/a/b foo/x/y => /foo/a/b
ok 108 # skip relative path: d:/a/b D:/a/c => ../b (missing MINGW)
ok 109 # skip relative path: C:/a/b D:/a/c => C:/a/b (missing MINGW)
ok 110 - relative path: foo/a/b <empty> => foo/a/b
ok 111 - relative path: foo/a/b <null> => foo/a/b
ok 112 - relative path: <empty> /foo/a/b => ./
ok 113 - relative path: <empty> <empty> => ./
ok 114 - relative path: <empty> <null> => ./
ok 115 - relative path: <null> <empty> => ./
ok 116 - relative path: <null> <null> => ./
ok 117 - relative path: <null> /foo/a/b => ./
ok 118 - git-path A=B info/grafts => .git/info/grafts
ok 119 - git-path GIT_GRAFT_FILE=foo info/grafts => foo
ok 120 - git-path GIT_GRAFT_FILE=foo info/////grafts => foo
ok 121 - git-path GIT_INDEX_FILE=foo index => foo
ok 122 - git-path GIT_INDEX_FILE=foo index/foo => .git/index/foo
ok 123 - git-path GIT_INDEX_FILE=foo index2 => .git/index2
ok 124 - setup fake objects directory foo
ok 125 - git-path GIT_OBJECT_DIRECTORY=foo objects => foo
ok 126 - git-path GIT_OBJECT_DIRECTORY=foo objects/foo => foo/foo
ok 127 - git-path GIT_OBJECT_DIRECTORY=foo objects2 => .git/objects2
ok 128 - setup common repository
ok 129 - git-path GIT_COMMON_DIR=bar index => .git/index
ok 130 - git-path GIT_COMMON_DIR=bar HEAD => .git/HEAD
ok 131 - git-path GIT_COMMON_DIR=bar logs/HEAD => .git/logs/HEAD
ok 132 - git-path GIT_COMMON_DIR=bar logs/refs/bisect/foo => .git/logs/refs/bisect/foo
ok 133 - git-path GIT_COMMON_DIR=bar logs/refs/bisec/foo => bar/logs/refs/bisec/foo
ok 134 - git-path GIT_COMMON_DIR=bar logs/refs/bisec => bar/logs/refs/bisec
ok 135 - git-path GIT_COMMON_DIR=bar logs/refs/bisectfoo => bar/logs/refs/bisectfoo
ok 136 - git-path GIT_COMMON_DIR=bar objects => bar/objects
ok 137 - git-path GIT_COMMON_DIR=bar objects/bar => bar/objects/bar
ok 138 - git-path GIT_COMMON_DIR=bar info/exclude => bar/info/exclude
ok 139 - git-path GIT_COMMON_DIR=bar info/grafts => bar/info/grafts
ok 140 - git-path GIT_COMMON_DIR=bar info/sparse-checkout => .git/info/sparse-checkout
ok 141 - git-path GIT_COMMON_DIR=bar info//sparse-checkout => .git/info//sparse-checkout
ok 142 - git-path GIT_COMMON_DIR=bar remotes/bar => bar/remotes/bar
ok 143 - git-path GIT_COMMON_DIR=bar branches/bar => bar/branches/bar
ok 144 - git-path GIT_COMMON_DIR=bar logs/refs/heads/master => bar/logs/refs/heads/master
ok 145 - git-path GIT_COMMON_DIR=bar refs/heads/master => bar/refs/heads/master
ok 146 - git-path GIT_COMMON_DIR=bar refs/bisect/foo => .git/refs/bisect/foo
ok 147 - git-path GIT_COMMON_DIR=bar hooks/me => bar/hooks/me
ok 148 - git-path GIT_COMMON_DIR=bar config => bar/config
ok 149 - git-path GIT_COMMON_DIR=bar packed-refs => bar/packed-refs
ok 150 - git-path GIT_COMMON_DIR=bar shallow => bar/shallow
# failed 11 among 150 test(s)
1..150
ok 1 - normalize path: =>
ok 2 - normalize path: . =>
ok 3 - normalize path: ./ =>
ok 4 - normalize path: ./. =>
ok 5 - normalize path: ./.. => ++failed++
ok 6 - normalize path: ../. => ++failed++
ok 7 - normalize path: ./../.// => ++failed++
ok 8 - normalize path: dir/.. =>
ok 9 - normalize path: dir/sub/../.. =>
ok 10 - normalize path: dir/sub/../../.. => ++failed++
ok 11 - normalize path: dir => dir
ok 12 - normalize path: dir// => dir/
ok 13 - normalize path: ./dir => dir
ok 14 - normalize path: dir/. => dir/
ok 15 - normalize path: dir///./ => dir/
ok 16 - normalize path: dir//sub/.. => dir/
ok 17 - normalize path: dir/sub/../ => dir/
ok 18 - normalize path: dir/sub/../. => dir/
ok 19 - normalize path: dir/s1/../s2/ => dir/s2/
ok 20 - normalize path: d1/s1///s2/..//../s3/ => d1/s3/
ok 21 - normalize path: d1/s1//../s2/../../d2 => d2
ok 22 - normalize path: d1/.../d2 => d1/.../d2
ok 23 - normalize path: d1/..././../d2 => d1/d2
ok 24 - normalize path: / => /
not ok 25 - normalize path: // => /
# test "$(test-path-utils normalize_path_copy '//')" = 'E:/msys64/'
not ok 26 - normalize path: /// => /
# test "$(test-path-utils normalize_path_copy '///')" = 'E:/msys64/'
ok 27 - normalize path: /. => /
ok 28 - normalize path: /./ => /
not ok 29 - normalize path: /./.. => ++failed++
# test "$(test-path-utils normalize_path_copy '/./..')" = '++failed++'
ok 30 - normalize path: /../. => ++failed++
not ok 31 - normalize path: /./../.// => ++failed++
# test "$(test-path-utils normalize_path_copy '/./.././/')" = '++failed++'
ok 32 - normalize path: /dir/.. => /
ok 33 - normalize path: /dir/sub/../.. => /
not ok 34 - normalize path: /dir/sub/../../.. => ++failed++
# test "$(test-path-utils normalize_path_copy '/dir/sub/../../..')" = '++failed++'
ok 35 - normalize path: /dir => /dir
ok 36 - normalize path: /dir// => /dir/
ok 37 - normalize path: /./dir => /dir
ok 38 - normalize path: /dir/. => /dir/
ok 39 - normalize path: /dir///./ => /dir/
ok 40 - normalize path: /dir//sub/.. => /dir/
ok 41 - normalize path: /dir/sub/../ => /dir/
not ok 42 - normalize path: //dir/sub/../. => /dir/
# test "$(test-path-utils normalize_path_copy '//dir/sub/../.')" = 'E:/msys64/dir/'
ok 43 - normalize path: /dir/s1/../s2/ => /dir/s2/
ok 44 - normalize path: /d1/s1///s2/..//../s3/ => /d1/s3/
ok 45 - normalize path: /d1/s1//../s2/../../d2 => /d2
ok 46 - normalize path: /d1/.../d2 => /d1/.../d2
ok 47 - normalize path: /d1/..././../d2 => /d1/d2
ok 48 - longest ancestor: / / => -1
ok 49 - longest ancestor: /foo / => 9
ok 50 - longest ancestor: /foo /fo => -1
ok 51 - longest ancestor: /foo /foo => -1
ok 52 - longest ancestor: /foo /bar => -1
ok 53 - longest ancestor: /foo /foo/bar => -1
ok 54 - longest ancestor: /foo /foo:/bar => -1
ok 55 - longest ancestor: /foo /:/foo:/bar => 9
ok 56 - longest ancestor: /foo /foo:/:/bar => 9
ok 57 - longest ancestor: /foo /:/bar:/foo => 9
ok 58 - longest ancestor: /foo/bar / => 9
ok 59 - longest ancestor: /foo/bar /fo => -1
ok 60 - longest ancestor: /foo/bar /foo => 13
ok 61 - longest ancestor: /foo/bar /foo/ba => -1
ok 62 - longest ancestor: /foo/bar /:/fo => 9
ok 63 - longest ancestor: /foo/bar /foo:/foo/ba => 13
ok 64 - longest ancestor: /foo/bar /bar => -1
ok 65 - longest ancestor: /foo/bar /fo => -1
ok 66 - longest ancestor: /foo/bar /foo:/bar => 13
ok 67 - longest ancestor: /foo/bar /:/foo:/bar => 13
ok 68 - longest ancestor: /foo/bar /foo:/:/bar => 13
ok 69 - longest ancestor: /foo/bar /:/bar:/fo => 9
ok 70 - longest ancestor: /foo/bar /:/bar => 9
ok 71 - longest ancestor: /foo/bar /foo => 13
ok 72 - longest ancestor: /foo/bar /foo:/bar => 13
ok 73 - longest ancestor: /foo/bar /bar => -1
ok 74 - strip_path_suffix
ok 75 - absolute path rejects the empty string
ok 76 - real path rejects the empty string
not ok 77 - real path works on absolute paths 1
#
# nopath="hopefully-absent-path" &&
# test "/" = "$(test-path-utils real_path "/")" &&
# test "/$nopath" = "$(test-path-utils real_path "/$nopath")"
#
not ok 78 - real path works on absolute paths 2
#
# nopath="hopefully-absent-path" &&
# # Find an existing top-level directory for the remaining tests:
# d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
# test "$d" = "$(test-path-utils real_path "$d")" &&
# test "$d/$nopath" = "$(test-path-utils real_path "$d/$nopath")"
#
not ok 79 - real path removes extra leading slashes
#
# nopath="hopefully-absent-path" &&
# test "/" = "$(test-path-utils real_path "///")" &&
# test "/$nopath" = "$(test-path-utils real_path "///$nopath")" &&
# # Find an existing top-level directory for the remaining tests:
# d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
# test "$d" = "$(test-path-utils real_path "//$d")" &&
# test "$d/$nopath" = "$(test-path-utils real_path "//$d/$nopath")"
#
not ok 80 - real path removes other extra slashes
#
# nopath="hopefully-absent-path" &&
# # Find an existing top-level directory for the remaining tests:
# d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
# test "$d" = "$(test-path-utils real_path "$d///")" &&
# test "$d/$nopath" = "$(test-path-utils real_path "$d///$nopath")"
#
ok 81 # skip real path works on symlinks (missing SYMLINKS)
ok 82 # skip prefix_path works with absolute paths to work tree symlinks (missing SYMLINKS)
ok 83 - prefix_path works with only absolute path to work tree
ok 84 - prefix_path rejects absolute path to dir with same beginning as work tree
ok 85 # skip prefix_path works with absolute path to a symlink to work tree having same beginning as work tree (missing SYMLINKS)
ok 86 - relative path: /foo/a/b/c/ /foo/a/b/ => c/
ok 87 - relative path: /foo/a/b/c/ /foo/a/b => c/
not ok 88 - relative path: /foo/a//b//c/ ///foo/a/b// => c/
# test "$(test-path-utils relative_path '/foo/a//b//c/' '///foo/a/b//')" = 'c/'
ok 89 - relative path: /foo/a/b /foo/a/b => ./
ok 90 - relative path: /foo/a/b/ /foo/a/b => ./
ok 91 - relative path: /foo/a /foo/a/b => ../
ok 92 - relative path: / /foo/a/b/ => ../../../
ok 93 - relative path: /foo/a/c /foo/a/b/ => ../c
ok 94 - relative path: /foo/a/c /foo/a/b => ../c
ok 95 - relative path: /foo/x/y /foo/a/b/ => ../../x/y
ok 96 - relative path: /foo/a/b <empty> => /foo/a/b
ok 97 - relative path: /foo/a/b <null> => /foo/a/b
ok 98 - relative path: foo/a/b/c/ foo/a/b/ => c/
ok 99 - relative path: foo/a/b/c/ foo/a/b => c/
ok 100 - relative path: foo/a/b//c foo/a//b => c
ok 101 - relative path: foo/a/b/ foo/a/b/ => ./
ok 102 - relative path: foo/a/b/ foo/a/b => ./
ok 103 - relative path: foo/a foo/a/b => ../
ok 104 - relative path: foo/x/y foo/a/b => ../../x/y
ok 105 - relative path: foo/a/c foo/a/b => ../c
ok 106 - relative path: foo/a/b /foo/x/y => foo/a/b
ok 107 - relative path: /foo/a/b foo/x/y => /foo/a/b
ok 108 # skip relative path: d:/a/b D:/a/c => ../b (missing MINGW)
ok 109 # skip relative path: C:/a/b D:/a/c => C:/a/b (missing MINGW)
ok 110 - relative path: foo/a/b <empty> => foo/a/b
ok 111 - relative path: foo/a/b <null> => foo/a/b
ok 112 - relative path: <empty> /foo/a/b => ./
ok 113 - relative path: <empty> <empty> => ./
ok 114 - relative path: <empty> <null> => ./
ok 115 - relative path: <null> <empty> => ./
ok 116 - relative path: <null> <null> => ./
ok 117 - relative path: <null> /foo/a/b => ./
ok 118 - git-path A=B info/grafts => .git/info/grafts
ok 119 - git-path GIT_GRAFT_FILE=foo info/grafts => foo
ok 120 - git-path GIT_GRAFT_FILE=foo info/////grafts => foo
ok 121 - git-path GIT_INDEX_FILE=foo index => foo
ok 122 - git-path GIT_INDEX_FILE=foo index/foo => .git/index/foo
ok 123 - git-path GIT_INDEX_FILE=foo index2 => .git/index2
ok 124 - setup fake objects directory foo
ok 125 - git-path GIT_OBJECT_DIRECTORY=foo objects => foo
ok 126 - git-path GIT_OBJECT_DIRECTORY=foo objects/foo => foo/foo
ok 127 - git-path GIT_OBJECT_DIRECTORY=foo objects2 => .git/objects2
ok 128 - setup common repository
ok 129 - git-path GIT_COMMON_DIR=bar index => .git/index
ok 130 - git-path GIT_COMMON_DIR=bar HEAD => .git/HEAD
ok 131 - git-path GIT_COMMON_DIR=bar logs/HEAD => .git/logs/HEAD
ok 132 - git-path GIT_COMMON_DIR=bar logs/refs/bisect/foo => .git/logs/refs/bisect/foo
ok 133 - git-path GIT_COMMON_DIR=bar logs/refs/bisec/foo => bar/logs/refs/bisec/foo
ok 134 - git-path GIT_COMMON_DIR=bar logs/refs/bisec => bar/logs/refs/bisec
ok 135 - git-path GIT_COMMON_DIR=bar logs/refs/bisectfoo => bar/logs/refs/bisectfoo
ok 136 - git-path GIT_COMMON_DIR=bar objects => bar/objects
ok 137 - git-path GIT_COMMON_DIR=bar objects/bar => bar/objects/bar
ok 138 - git-path GIT_COMMON_DIR=bar info/exclude => bar/info/exclude
ok 139 - git-path GIT_COMMON_DIR=bar info/grafts => bar/info/grafts
ok 140 - git-path GIT_COMMON_DIR=bar info/sparse-checkout => .git/info/sparse-checkout
ok 141 - git-path GIT_COMMON_DIR=bar info//sparse-checkout => .git/info//sparse-checkout
ok 142 - git-path GIT_COMMON_DIR=bar remotes/bar => bar/remotes/bar
ok 143 - git-path GIT_COMMON_DIR=bar branches/bar => bar/branches/bar
ok 144 - git-path GIT_COMMON_DIR=bar logs/refs/heads/master => bar/logs/refs/heads/master
ok 145 - git-path GIT_COMMON_DIR=bar refs/heads/master => bar/refs/heads/master
ok 146 - git-path GIT_COMMON_DIR=bar refs/bisect/foo => .git/refs/bisect/foo
ok 147 - git-path GIT_COMMON_DIR=bar hooks/me => bar/hooks/me
ok 148 - git-path GIT_COMMON_DIR=bar config => bar/config
ok 149 - git-path GIT_COMMON_DIR=bar packed-refs => bar/packed-refs
ok 150 - git-path GIT_COMMON_DIR=bar shallow => bar/shallow
# failed 11 among 150 test(s)
1..150
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment