Import upstream changes up to constabulary/gb@9e201fb
diff --git a/delete.go b/delete.go index 9a0476c..13e9789 100644 --- a/delete.go +++ b/delete.go
@@ -5,6 +5,8 @@ "fmt" "path/filepath" + "github.com/constabulary/gb/fileutils" + "github.com/FiloSottile/gvt/gbvendor" ) @@ -59,7 +61,7 @@ return fmt.Errorf("dependency could not be deleted: %v", err) } - if err := vendor.RemoveAll(filepath.Join(vendorDir(), filepath.FromSlash(path))); err != nil { + if err := fileutils.RemoveAll(filepath.Join(vendorDir(), filepath.FromSlash(path))); err != nil { // TODO(dfc) need to apply vendor.cleanpath here to remove indermediate directories. return fmt.Errorf("dependency could not be deleted: %v", err) }
diff --git a/gbvendor/copy.go b/gbvendor/copy.go index 52d4c98..f2d5d2c 100644 --- a/gbvendor/copy.go +++ b/gbvendor/copy.go
@@ -6,6 +6,8 @@ "os" "path/filepath" "strings" + + "github.com/constabulary/gb/fileutils" ) const debugCopypath = true @@ -42,7 +44,7 @@ }) if err != nil { // if there was an error during copying, remove the partial copy. - RemoveAll(dst) + fileutils.RemoveAll(dst) } return err }
diff --git a/gbvendor/imports_test.go b/gbvendor/imports_test.go index 37d029d..283f9db 100644 --- a/gbvendor/imports_test.go +++ b/gbvendor/imports_test.go
@@ -2,6 +2,7 @@ import ( "bytes" + "fmt" "io" "os" "path/filepath" @@ -134,10 +135,9 @@ importpath: "gopkg.in/mgo.v2", vcs: "git", reporoot: "https://gopkg.in/mgo.v2", - // disabled: certificate has expired - // }, { - // path: "speter.net/go/exp", - // err: fmt.Errorf("go-import metadata not found"), + }, { + path: "speter.net/go/exp", + err: fmt.Errorf("go-import metadata not found"), }} for _, tt := range tests {
diff --git a/gbvendor/manifest_test.go b/gbvendor/manifest_test.go index 479f588..a2dc1f7 100644 --- a/gbvendor/manifest_test.go +++ b/gbvendor/manifest_test.go
@@ -5,6 +5,8 @@ "os" "path/filepath" "testing" + + "github.com/constabulary/gb/fileutils" ) func mktemp(t *testing.T) string { @@ -31,7 +33,7 @@ func TestManifest(t *testing.T) { root := mktemp(t) - defer RemoveAll(root) + defer fileutils.RemoveAll(root) mf := filepath.Join(root, "vendor")
diff --git a/gbvendor/path.go b/gbvendor/path.go deleted file mode 100644 index bb8334d..0000000 --- a/gbvendor/path.go +++ /dev/null
@@ -1,32 +0,0 @@ -package vendor - -import ( - "os" - "path/filepath" - "runtime" -) - -// RemoveAll removes path and any children it contains. Unlike os.RemoveAll it -// deletes read only files on Windows. -func RemoveAll(path string) error { - if runtime.GOOS == "windows" { - // Simple case: if Remove works, we're done. - err := os.Remove(path) - if err == nil || os.IsNotExist(err) { - return nil - } - // make sure all files are writable so we can delete them - filepath.Walk(path, func(path string, info os.FileInfo, err error) error { - if err != nil { - // walk gave us some error, give it back. - return err - } - mode := info.Mode() - if mode|0200 == mode { - return nil - } - return os.Chmod(path, mode|0200) - }) - } - return os.RemoveAll(path) -}
diff --git a/gbvendor/repo.go b/gbvendor/repo.go index 95393d6..5dbccd4 100644 --- a/gbvendor/repo.go +++ b/gbvendor/repo.go
@@ -12,6 +12,8 @@ "path/filepath" "regexp" "strings" + + "github.com/constabulary/gb/fileutils" ) // RemoteRepo describes a remote dvcs repository. @@ -323,7 +325,7 @@ func (w workingcopy) Dir() string { return w.path } func (w workingcopy) Destroy() error { - if err := RemoveAll(w.path); err != nil { + if err := fileutils.RemoveAll(w.path); err != nil { return err } parent := filepath.Dir(w.path) @@ -380,18 +382,19 @@ "clone", h.url, dir, + "--noninteractive", } if branch != "" { args = append(args, "--branch", branch) } if err := runOut(os.Stderr, "hg", args...); err != nil { - RemoveAll(dir) + fileutils.RemoveAll(dir) return nil, err } if revision != "" { if err := runOut(os.Stderr, "hg", "--cwd", dir, "update", "-r", revision); err != nil { - RemoveAll(dir) + fileutils.RemoveAll(dir) return nil, err } } @@ -449,7 +452,7 @@ } wc := filepath.Join(dir, "wc") if err := runOut(os.Stderr, "bzr", "branch", b.url, wc); err != nil { - RemoveAll(dir) + fileutils.RemoveAll(dir) return nil, err } @@ -478,7 +481,7 @@ return nil } parent := filepath.Dir(path) - if err := RemoveAll(path); err != nil { + if err := fileutils.RemoveAll(path); err != nil { return err } return cleanPath(parent) @@ -500,6 +503,7 @@ func runOut(w io.Writer, c string, args ...string) error { cmd := exec.Command(c, args...) + cmd.Stdin = nil cmd.Stdout = w cmd.Stderr = os.Stderr return cmd.Run() @@ -514,6 +518,7 @@ func runOutPath(w io.Writer, path string, c string, args ...string) error { cmd := exec.Command(c, args...) cmd.Dir = path + cmd.Stdin = nil cmd.Stdout = w cmd.Stderr = os.Stderr return cmd.Run()
diff --git a/main.go b/main.go index c95d30b..6245927 100644 --- a/main.go +++ b/main.go
@@ -10,10 +10,7 @@ var fs = flag.NewFlagSet(os.Args[0], flag.ExitOnError) func init() { - fs.Usage = func() { - printUsage(os.Stderr) - os.Exit(2) - } + fs.Usage = usage } type Command struct { @@ -38,8 +35,8 @@ switch { case len(args) < 1, args[0] == "-h", args[0] == "-help": - fs.Usage() - os.Exit(1) + printUsage(os.Stdout) + os.Exit(0) case args[0] == "help": help(args[1:]) return
diff --git a/rebuild.go b/rebuild.go index 87f13cd..0f523c2 100644 --- a/rebuild.go +++ b/rebuild.go
@@ -9,6 +9,8 @@ "sync" "sync/atomic" + "github.com/constabulary/gb/fileutils" + "github.com/FiloSottile/gvt/gbvendor" ) @@ -92,7 +94,7 @@ func downloadDependency(dep vendor.Dependency) error { dst := filepath.Join(vendorDir(), dep.Importpath) if _, err := os.Stat(dst); err == nil { - if err := vendor.RemoveAll(dst); err != nil { + if err := fileutils.RemoveAll(dst); err != nil { // TODO need to apply vendor.cleanpath here too return fmt.Errorf("dependency could not be deleted: %v", err) }
diff --git a/update.go b/update.go index 86d0fb1..a719ced 100644 --- a/update.go +++ b/update.go
@@ -5,6 +5,8 @@ "fmt" "path/filepath" + "github.com/constabulary/gb/fileutils" + "github.com/FiloSottile/gvt/gbvendor" ) @@ -97,7 +99,7 @@ Path: extra, } - if err := vendor.RemoveAll(filepath.Join(vendorDir(), filepath.FromSlash(d.Importpath))); err != nil { + if err := fileutils.RemoveAll(filepath.Join(vendorDir(), filepath.FromSlash(d.Importpath))); err != nil { // TODO(dfc) need to apply vendor.cleanpath here to remove intermediate directories. return fmt.Errorf("dependency could not be deleted: %v", err) }
diff --git a/vendor/github.com/constabulary/gb/fileutils/_testdata/copyfile/a/rick b/vendor/github.com/constabulary/gb/fileutils/_testdata/copyfile/a/rick new file mode 120000 index 0000000..0db35ec --- /dev/null +++ b/vendor/github.com/constabulary/gb/fileutils/_testdata/copyfile/a/rick
@@ -0,0 +1 @@ +/never/going/to/give/you/up \ No newline at end of file
diff --git a/vendor/github.com/constabulary/gb/fileutils/fileutils.go b/vendor/github.com/constabulary/gb/fileutils/fileutils.go new file mode 100644 index 0000000..c2c2dc7 --- /dev/null +++ b/vendor/github.com/constabulary/gb/fileutils/fileutils.go
@@ -0,0 +1,101 @@ +// package fileutils provides utililty methods to copy and move files and directories. +package fileutils + +import ( + "fmt" + "io" + "os" + "path/filepath" + "runtime" + "strings" +) + +const debugCopypath = true +const debugCopyfile = false + +// Copypath copies the contents of src to dst, excluding any file or +// directory that starts with a period. +func Copypath(dst string, src string) error { + err := filepath.Walk(src, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if strings.HasPrefix(filepath.Base(path), ".") { + if info.IsDir() { + return filepath.SkipDir + } + return nil + } + + if info.IsDir() { + return nil + } + + if info.Mode()&os.ModeSymlink != 0 { + if debugCopypath { + fmt.Printf("skipping symlink: %v\n", path) + } + return nil + } + + dst := filepath.Join(dst, path[len(src):]) + return copyfile(dst, path) + }) + if err != nil { + // if there was an error during copying, remove the partial copy. + RemoveAll(dst) + } + return err +} + +func copyfile(dst, src string) error { + err := mkdir(filepath.Dir(dst)) + if err != nil { + return fmt.Errorf("copyfile: mkdirall: %v", err) + } + r, err := os.Open(src) + if err != nil { + return fmt.Errorf("copyfile: open(%q): %v", src, err) + } + defer r.Close() + w, err := os.Create(dst) + if err != nil { + return fmt.Errorf("copyfile: create(%q): %v", dst, err) + } + defer w.Close() + if debugCopyfile { + fmt.Printf("copyfile(dst: %v, src: %v)\n", dst, src) + } + _, err = io.Copy(w, r) + return err +} + +// RemoveAll removes path and any children it contains. Unlike os.RemoveAll it +// deletes read only files on Windows. +func RemoveAll(path string) error { + if runtime.GOOS == "windows" { + // Simple case: if Remove works, we're done. + err := os.Remove(path) + if err == nil || os.IsNotExist(err) { + return nil + } + // make sure all files are writable so we can delete them + filepath.Walk(path, func(path string, info os.FileInfo, err error) error { + if err != nil { + // walk gave us some error, give it back. + return err + } + mode := info.Mode() + if mode|0200 == mode { + return nil + } + return os.Chmod(path, mode|0200) + }) + } + return os.RemoveAll(path) +} + +func mkdir(path string) error { + return os.MkdirAll(path, 0755) +}
diff --git a/gbvendor/copy_test.go b/vendor/github.com/constabulary/gb/fileutils/fileutils_test.go similarity index 68% rename from gbvendor/copy_test.go rename to vendor/github.com/constabulary/gb/fileutils/fileutils_test.go index 297d198..cfc40a2 100644 --- a/gbvendor/copy_test.go +++ b/vendor/github.com/constabulary/gb/fileutils/fileutils_test.go
@@ -1,6 +1,7 @@ -package vendor +package fileutils import ( + "io/ioutil" "path/filepath" "runtime" "testing" @@ -17,3 +18,11 @@ t.Fatalf("copypath(%s, %s): %v", dst, src, err) } } + +func mktemp(t *testing.T) string { + s, err := ioutil.TempDir("", "fileutils_test") + if err != nil { + t.Fatal(err) + } + return s +}
diff --git a/gbvendor/path_test.go b/vendor/github.com/constabulary/gb/fileutils/path_test.go similarity index 98% rename from gbvendor/path_test.go rename to vendor/github.com/constabulary/gb/fileutils/path_test.go index 2bba91b..1bdf9b1 100644 --- a/gbvendor/path_test.go +++ b/vendor/github.com/constabulary/gb/fileutils/path_test.go
@@ -1,7 +1,7 @@ // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package vendor +package fileutils import ( "os"
diff --git a/vendor/manifest b/vendor/manifest new file mode 100644 index 0000000..60981a3 --- /dev/null +++ b/vendor/manifest
@@ -0,0 +1,12 @@ +{ + "version": 0, + "dependencies": [ + { + "importpath": "github.com/constabulary/gb/fileutils", + "repository": "https://github.com/constabulary/gb", + "revision": "9e201fb977e3dff7e0c94b73640be2a97285c418", + "branch": "master", + "path": "/fileutils" + } + ] +} \ No newline at end of file