From 965fae96a75f91617f50dba7e1351c808bbf653d Mon Sep 17 00:00:00 2001 From: Ibrahim AshShohail Date: Tue, 22 Aug 2017 09:15:34 -0800 Subject: [PATCH] internal/fs: fix os.Chmod on Windows with long paths (#925) copy the same functions used in os to convert long paths on Windows to the extended-length form. Fixes #774 Signed-off-by: Ibrahim AshShohail Document generating graph visualizations #975 --- README.md | 9 +++ docs/img/StatusGraph.png | Bin 0 -> 11571 bytes internal/fs/fs.go | 137 +++++++++++++++++++++++++++++++++++++++ internal/fs/fs_test.go | 31 +++++++++ 4 files changed, 177 insertions(+) create mode 100644 docs/img/StatusGraph.png diff --git a/README.md b/README.md index 91b829f1dd..fe4b73cd19 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,15 @@ This happens when a new import is added. Run `dep ensure` to install the missing As `dep status` suggests, run `dep ensure` to update your lockfile. Then run `dep status` again, and the lock mismatch should go away. +### Visualizing dependencies + +Generate a visual representation of the dependency tree by piping the output of `dep status -dot` to [graphviz](http://www.graphviz.org/). +``` +$ brew install graphviz +$ dep status -dot | dot -T png | open -f -a /Applications/Preview.app +``` +

+ ### Updating dependencies Updating brings the version of a dependency in `Gopkg.lock` and `vendor/` to the latest version allowed by the constraints in `Gopkg.toml`. diff --git a/docs/img/StatusGraph.png b/docs/img/StatusGraph.png new file mode 100644 index 0000000000000000000000000000000000000000..ab506ca14625a2b8b0fb6e45895ca2a628c5198d GIT binary patch literal 11571 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 2 && path[:2] == `\\` { + // Don't canonicalize UNC paths. + return path + } + if !isAbs(path) { + // Relative path + return path + } + + const prefix = `\\?` + + pathbuf := make([]byte, len(prefix)+len(path)+len(`\`)) + copy(pathbuf, prefix) + n := len(path) + r, w := 0, len(prefix) + for r < n { + switch { + case os.IsPathSeparator(path[r]): + // empty block + r++ + case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])): + // /./ + r++ + case r+1 < n && path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])): + // /../ is currently unhandled + return path + default: + pathbuf[w] = '\\' + w++ + for ; r < n && !os.IsPathSeparator(path[r]); r++ { + pathbuf[w] = path[r] + w++ + } + } + } + // A drive's root directory needs a trailing \ + if w == len(`\\?\c:`) { + pathbuf[w] = '\\' + w++ + } + return string(pathbuf[:w]) +} + +func isAbs(path string) (b bool) { + v := volumeName(path) + if v == "" { + return false + } + path = path[len(v):] + if path == "" { + return false + } + return os.IsPathSeparator(path[0]) +} + +func volumeName(path string) (v string) { + if len(path) < 2 { + return "" + } + // with drive letter + c := path[0] + if path[1] == ':' && + ('0' <= c && c <= '9' || 'a' <= c && c <= 'z' || + 'A' <= c && c <= 'Z') { + return path[:2] + } + // is it UNC + if l := len(path); l >= 5 && os.IsPathSeparator(path[0]) && os.IsPathSeparator(path[1]) && + !os.IsPathSeparator(path[2]) && path[2] != '.' { + // first, leading `\\` and next shouldn't be `\`. its server name. + for n := 3; n < l-1; n++ { + // second, next '\' shouldn't be repeated. + if os.IsPathSeparator(path[n]) { + n++ + // third, following something characters. its share name. + if !os.IsPathSeparator(path[n]) { + if path[n] == '.' { + break + } + for ; n < l; n++ { + if os.IsPathSeparator(path[n]) { + break + } + } + return path[:n] + } + break + } + } + } + return "" +} diff --git a/internal/fs/fs_test.go b/internal/fs/fs_test.go index 163b26e647..e16f772c9c 100644 --- a/internal/fs/fs_test.go +++ b/internal/fs/fs_test.go @@ -547,6 +547,37 @@ func TestCopyFileSymlink(t *testing.T) { } } +func TestCopyFileLongFilePath(t *testing.T) { + if runtime.GOOS != "windows" { + // We want to ensure the temporary fix actually fixes the issue with + // os.Chmod and long file paths. This is only applicable on Windows. + t.Skip("skipping on non-windows") + } + + h := test.NewHelper(t) + h.TempDir(".") + + tmpPath := h.Path(".") + + // Create a directory with a long-enough path name to cause the bug in #774. + dirName := "" + for len(tmpPath+string(os.PathSeparator)+dirName) <= 300 { + dirName += "directory" + } + + h.TempDir(dirName) + h.TempFile(dirName+string(os.PathSeparator)+"src", "") + + tmpDirPath := tmpPath + string(os.PathSeparator) + dirName + string(os.PathSeparator) + + err := copyFile(tmpDirPath+"src", tmpDirPath+"dst") + if err != nil { + t.Fatalf("unexpected error while copying file: %v", err) + } +} + +// C:\Users\appveyor\AppData\Local\Temp\1\gotest639065787\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890\dir4567890 + func TestCopyFileFail(t *testing.T) { if runtime.GOOS == "windows" { // XXX: setting permissions works differently in