diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2017-07-19 22:04:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-19 22:04:46 +0200 |
commit | 8738a04708b91683d5804b4c648c871fdeb87f82 (patch) | |
tree | 017b15080dee8bd64026c9358d832e61d12674d5 | |
parent | 595dfe6e53a038da4949263ea2d9a7a0020c48b7 (diff) | |
parent | 4a7e7cddc0e4f88085b263693c87635254de7f35 (diff) | |
download | go-git-8738a04708b91683d5804b4c648c871fdeb87f82.tar.gz |
Merge pull request #493 from src-d/windows
*: several windows support fixes
-rw-r--r-- | plumbing/format/config/encoder.go | 8 | ||||
-rw-r--r-- | plumbing/transport/git/receive_pack_test.go | 4 | ||||
-rw-r--r-- | plumbing/transport/server/loader.go | 2 | ||||
-rw-r--r-- | storage/filesystem/internal/dotgit/dotgit.go | 16 | ||||
-rw-r--r-- | storage/filesystem/internal/dotgit/dotgit_test.go | 1 | ||||
-rw-r--r-- | utils/merkletrie/filesystem/node.go | 6 | ||||
-rw-r--r-- | utils/merkletrie/filesystem/node_test.go | 10 | ||||
-rw-r--r-- | utils/merkletrie/index/node.go | 18 | ||||
-rw-r--r-- | utils/merkletrie/index/node_test.go | 29 | ||||
-rw-r--r-- | worktree.go | 5 | ||||
-rw-r--r-- | worktree_commit.go | 26 | ||||
-rw-r--r-- | worktree_linux.go | 1 | ||||
-rw-r--r-- | worktree_windows.go | 20 |
13 files changed, 95 insertions, 51 deletions
diff --git a/plumbing/format/config/encoder.go b/plumbing/format/config/encoder.go index 88bdf65..6d17a5a 100644 --- a/plumbing/format/config/encoder.go +++ b/plumbing/format/config/encoder.go @@ -3,6 +3,7 @@ package config import ( "fmt" "io" + "strings" ) // An Encoder writes config files to an output stream. @@ -61,7 +62,12 @@ func (e *Encoder) encodeSubsection(sectionName string, s *Subsection) error { func (e *Encoder) encodeOptions(opts Options) error { for _, o := range opts { - if err := e.printf("\t%s = %s\n", o.Key, o.Value); err != nil { + pattern := "\t%s = %s\n" + if strings.Index(o.Value, "\\") != -1 { + pattern = "\t%s = %q\n" + } + + if err := e.printf(pattern, o.Key, o.Value); err != nil { return err } } diff --git a/plumbing/transport/git/receive_pack_test.go b/plumbing/transport/git/receive_pack_test.go index 326ef1b..f9afede 100644 --- a/plumbing/transport/git/receive_pack_test.go +++ b/plumbing/transport/git/receive_pack_test.go @@ -99,9 +99,11 @@ func (s *ReceivePackSuite) SetUpTest(c *C) { } func (s *ReceivePackSuite) TearDownTest(c *C) { - err := s.daemon.Process.Signal(os.Interrupt) + err := s.daemon.Process.Signal(os.Kill) c.Assert(err, IsNil) + _ = s.daemon.Wait() + err = os.RemoveAll(s.base) c.Assert(err, IsNil) } diff --git a/plumbing/transport/server/loader.go b/plumbing/transport/server/loader.go index d4eccd4..028ead4 100644 --- a/plumbing/transport/server/loader.go +++ b/plumbing/transport/server/loader.go @@ -10,7 +10,7 @@ import ( ) // DefaultLoader is a filesystem loader ignoring host and resolving paths to /. -var DefaultLoader = NewFilesystemLoader(osfs.New("/")) +var DefaultLoader = NewFilesystemLoader(osfs.New("")) // Loader loads repository's storer.Storer based on an optional host and a path. type Loader interface { diff --git a/storage/filesystem/internal/dotgit/dotgit.go b/storage/filesystem/internal/dotgit/dotgit.go index f3a2308..b672d4b 100644 --- a/storage/filesystem/internal/dotgit/dotgit.go +++ b/storage/filesystem/internal/dotgit/dotgit.go @@ -348,7 +348,6 @@ func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err e return err } - defer ioutil.CheckClose(f, &err) // Creating the temp file in the same directory as the target file // improves our chances for rename operation to be atomic. @@ -357,10 +356,6 @@ func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err e return err } - tmpPath := tmp.Name() - defer ioutil.CheckClose(tmp, &err) - defer d.fs.Remove(tmpPath) - s := bufio.NewScanner(f) found := false for s.Scan() { @@ -388,7 +383,16 @@ func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err e return nil } - return d.fs.Rename(tmpPath, packedRefsPath) + if err := f.Close(); err != nil { + ioutil.CheckClose(tmp, &err) + return err + } + + if err := tmp.Close(); err != nil { + return err + } + + return d.fs.Rename(tmp.Name(), packedRefsPath) } // process lines from a packed-refs file diff --git a/storage/filesystem/internal/dotgit/dotgit_test.go b/storage/filesystem/internal/dotgit/dotgit_test.go index d4cda0e..d935ec5 100644 --- a/storage/filesystem/internal/dotgit/dotgit_test.go +++ b/storage/filesystem/internal/dotgit/dotgit_test.go @@ -373,6 +373,7 @@ func (s *SuiteDotGit) TestObjectPackIdx(c *C) { idx, err := dir.ObjectPackIdx(f.PackfileHash) c.Assert(err, IsNil) c.Assert(filepath.Ext(idx.Name()), Equals, ".idx") + c.Assert(idx.Close(), IsNil) } func (s *SuiteDotGit) TestObjectPackNotFound(c *C) { diff --git a/utils/merkletrie/filesystem/node.go b/utils/merkletrie/filesystem/node.go index a8f3b86..f763e08 100644 --- a/utils/merkletrie/filesystem/node.go +++ b/utils/merkletrie/filesystem/node.go @@ -3,7 +3,7 @@ package filesystem import ( "io" "os" - "path/filepath" + "path" "gopkg.in/src-d/go-billy.v3" "gopkg.in/src-d/go-git.v4/plumbing" @@ -53,7 +53,7 @@ func (n *node) Hash() []byte { } func (n *node) Name() string { - return filepath.Base(n.path) + return path.Base(n.path) } func (n *node) IsDir() bool { @@ -107,7 +107,7 @@ func (n *node) calculateChildren() error { } func (n *node) newChildNode(file os.FileInfo) (*node, error) { - path := filepath.Join(n.path, file.Name()) + path := path.Join(n.path, file.Name()) hash, err := n.calculateHash(path, file) if err != nil { diff --git a/utils/merkletrie/filesystem/node_test.go b/utils/merkletrie/filesystem/node_test.go index bf1178a..42dd82e 100644 --- a/utils/merkletrie/filesystem/node_test.go +++ b/utils/merkletrie/filesystem/node_test.go @@ -4,6 +4,7 @@ import ( "bytes" "io" "os" + "path" "testing" . "gopkg.in/check.v1" @@ -133,18 +134,19 @@ func (s *NoderSuite) TestDiffChangeModeNotRelevant(c *C) { } func (s *NoderSuite) TestDiffDirectory(c *C) { + dir := path.Join("qux", "bar") fsA := memfs.New() - fsA.MkdirAll("qux/bar", 0644) + fsA.MkdirAll(dir, 0644) fsB := memfs.New() - fsB.MkdirAll("qux/bar", 0644) + fsB.MkdirAll(dir, 0644) ch, err := merkletrie.DiffTree( NewRootNode(fsA, map[string]plumbing.Hash{ - "qux/bar": plumbing.NewHash("aa102815663d23f8b75a47e7a01965dcdc96468c"), + dir: plumbing.NewHash("aa102815663d23f8b75a47e7a01965dcdc96468c"), }), NewRootNode(fsB, map[string]plumbing.Hash{ - "qux/bar": plumbing.NewHash("19102815663d23f8b75a47e7a01965dcdc96468c"), + dir: plumbing.NewHash("19102815663d23f8b75a47e7a01965dcdc96468c"), }), IsEquals, ) diff --git a/utils/merkletrie/index/node.go b/utils/merkletrie/index/node.go index 859c097..9622622 100644 --- a/utils/merkletrie/index/node.go +++ b/utils/merkletrie/index/node.go @@ -1,7 +1,7 @@ package index import ( - "path/filepath" + "path" "strings" "gopkg.in/src-d/go-git.v4/plumbing/format/index" @@ -28,19 +28,19 @@ func NewRootNode(idx *index.Index) noder.Noder { m := map[string]*node{rootNode: {isDir: true}} for _, e := range idx.Entries { - parts := strings.Split(e.Name, string(filepath.Separator)) + parts := strings.Split(e.Name, string("/")) - var path string + var fullpath string for _, part := range parts { - parent := path - path = filepath.Join(path, part) + parent := fullpath + fullpath = path.Join(fullpath, part) - if _, ok := m[path]; ok { + if _, ok := m[fullpath]; ok { continue } - n := &node{path: path} - if path == e.Name { + n := &node{path: fullpath} + if fullpath == e.Name { n.entry = e } else { n.isDir = true @@ -74,7 +74,7 @@ func (n *node) Hash() []byte { } func (n *node) Name() string { - return filepath.Base(n.path) + return path.Base(n.path) } func (n *node) IsDir() bool { diff --git a/utils/merkletrie/index/node_test.go b/utils/merkletrie/index/node_test.go index 00da8da..283ca74 100644 --- a/utils/merkletrie/index/node_test.go +++ b/utils/merkletrie/index/node_test.go @@ -2,6 +2,7 @@ package index import ( "bytes" + "path/filepath" "testing" . "gopkg.in/check.v1" @@ -43,15 +44,17 @@ func (s *NoderSuite) TestDiff(c *C) { func (s *NoderSuite) TestDiffChange(c *C) { indexA := &index.Index{ - Entries: []*index.Entry{ - {Name: "bar/baz/bar", Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d")}, - }, + Entries: []*index.Entry{{ + Name: filepath.Join("bar", "baz", "bar"), + Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d"), + }}, } indexB := &index.Index{ - Entries: []*index.Entry{ - {Name: "bar/baz/foo", Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d")}, - }, + Entries: []*index.Entry{{ + Name: filepath.Join("bar", "baz", "foo"), + Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d"), + }}, } ch, err := merkletrie.DiffTree(NewRootNode(indexA), NewRootNode(indexB), isEquals) @@ -61,15 +64,17 @@ func (s *NoderSuite) TestDiffChange(c *C) { func (s *NoderSuite) TestDiffDir(c *C) { indexA := &index.Index{ - Entries: []*index.Entry{ - {Name: "foo", Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d")}, - }, + Entries: []*index.Entry{{ + Name: "foo", + Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d"), + }}, } indexB := &index.Index{ - Entries: []*index.Entry{ - {Name: "foo/bar", Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d")}, - }, + Entries: []*index.Entry{{ + Name: filepath.Join("foo", "bar"), + Hash: plumbing.NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d"), + }}, } ch, err := merkletrie.DiffTree(NewRootNode(indexA), NewRootNode(indexB), isEquals) diff --git a/worktree.go b/worktree.go index e0f5fdf..13b2497 100644 --- a/worktree.go +++ b/worktree.go @@ -496,6 +496,10 @@ func (w *Worktree) Submodules() (Submodules, error) { } c, err := w.r.Config() + if err != nil { + return nil, err + } + for _, s := range m.Submodules { l = append(l, w.newSubmodule(s, c.Submodules[s.Name])) } @@ -527,6 +531,7 @@ func (w *Worktree) readGitmodulesFile() (*config.Modules, error) { return nil, err } + defer f.Close() input, err := stdioutil.ReadAll(f) if err != nil { return nil, err diff --git a/worktree_commit.go b/worktree_commit.go index a342240..02a5d03 100644 --- a/worktree_commit.go +++ b/worktree_commit.go @@ -1,7 +1,7 @@ package git import ( - "path/filepath" + "path" "strings" "gopkg.in/src-d/go-git.v4/plumbing" @@ -128,36 +128,36 @@ func (h *buildTreeHelper) BuildTree(idx *index.Index) (plumbing.Hash, error) { } func (h *buildTreeHelper) commitIndexEntry(e *index.Entry) error { - parts := strings.Split(e.Name, string(filepath.Separator)) + parts := strings.Split(e.Name, "/") - var path string + var fullpath string for _, part := range parts { - parent := path - path = filepath.Join(path, part) + parent := fullpath + fullpath = path.Join(fullpath, part) - h.doBuildTree(e, parent, path) + h.doBuildTree(e, parent, fullpath) } return nil } -func (h *buildTreeHelper) doBuildTree(e *index.Entry, parent, path string) { - if _, ok := h.trees[path]; ok { +func (h *buildTreeHelper) doBuildTree(e *index.Entry, parent, fullpath string) { + if _, ok := h.trees[fullpath]; ok { return } - if _, ok := h.entries[path]; ok { + if _, ok := h.entries[fullpath]; ok { return } - te := object.TreeEntry{Name: filepath.Base(path)} + te := object.TreeEntry{Name: path.Base(fullpath)} - if path == e.Name { + if fullpath == e.Name { te.Mode = e.Mode te.Hash = e.Hash } else { te.Mode = filemode.Dir - h.trees[path] = &object.Tree{} + h.trees[fullpath] = &object.Tree{} } h.trees[parent].Entries = append(h.trees[parent].Entries, te) @@ -169,7 +169,7 @@ func (h *buildTreeHelper) copyTreeToStorageRecursive(parent string, t *object.Tr continue } - path := filepath.Join(parent, e.Name) + path := path.Join(parent, e.Name) var err error e.Hash, err = h.copyTreeToStorageRecursive(path, h.trees[path]) diff --git a/worktree_linux.go b/worktree_linux.go index 7209d7d..a33cd2f 100644 --- a/worktree_linux.go +++ b/worktree_linux.go @@ -12,7 +12,6 @@ import ( func init() { fillSystemInfo = func(e *index.Entry, sys interface{}) { if os, ok := sys.(*syscall.Stat_t); ok { - e.CreatedAt = time.Unix(int64(os.Ctim.Sec), int64(os.Ctim.Nsec)) e.Dev = uint32(os.Dev) e.Inode = uint32(os.Ino) diff --git a/worktree_windows.go b/worktree_windows.go new file mode 100644 index 0000000..d59448e --- /dev/null +++ b/worktree_windows.go @@ -0,0 +1,20 @@ +// +build windows + +package git + +import ( + "syscall" + "time" + + "gopkg.in/src-d/go-git.v4/plumbing/format/index" +) + +func init() { + fillSystemInfo = func(e *index.Entry, sys interface{}) { + if os, ok := sys.(*syscall.Win32FileAttributeData); ok { + seconds := os.CreationTime.Nanoseconds() / 1000000000 + nanoseconds := os.CreationTime.Nanoseconds() - seconds*1000000000 + e.CreatedAt = time.Unix(seconds, nanoseconds) + } + } +} |