From e7317855f5d485e9b044825ef9466983096b5fbe Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Thu, 25 May 2017 13:28:53 -0600 Subject: [PATCH 1/4] git/odb: close temporary buffer early in FileStorer --- git/odb/file_storer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/git/odb/file_storer.go b/git/odb/file_storer.go index 522f6164..6d416442 100644 --- a/git/odb/file_storer.go +++ b/git/odb/file_storer.go @@ -50,6 +50,9 @@ func (fs *fileStorer) Store(sha []byte, r io.Reader) (n int64, err error) { if err != nil { return n, err } + if err = tmp.Close(); err != nil { + return n, err + } path := fs.path(sha) @@ -61,9 +64,6 @@ func (fs *fileStorer) Store(sha []byte, r io.Reader) (n int64, err error) { return n, err } - if err = tmp.Close(); err != nil { - return n, err - } return n, nil } From 1d7c82169baaeea5ce8c8a0f6e6068b692c015c0 Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Thu, 25 May 2017 13:31:20 -0600 Subject: [PATCH 2/4] git/odb: ensure that object directory exists before renaming into it --- git/odb/file_storer.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/git/odb/file_storer.go b/git/odb/file_storer.go index 6d416442..a5efe7a7 100644 --- a/git/odb/file_storer.go +++ b/git/odb/file_storer.go @@ -55,6 +55,17 @@ func (fs *fileStorer) Store(sha []byte, r io.Reader) (n int64, err error) { } path := fs.path(sha) + dir := filepath.Dir(path) + + if _, err := os.Stat(dir); os.IsNotExist(err) { + // Since .git/objects partitions objects based on the first two + // characters of their ASCII-encoded SHA1 object ID, ensure that + // the directory exists before copying a file into it. + err = os.MkdirAll(dir, 0755) + if err != nil { + return n, err + } + } if _, err := os.Stat(path); os.IsExist(err) { return n, errors.Errorf("git/odb: file storer cannot copy into file %q, which already exists", path) From c4fcc49884c165815c9d06a116d841dfe00cf26c Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Thu, 25 May 2017 14:39:48 -0600 Subject: [PATCH 3/4] git/odb: check for close error before copy --- git/odb/file_storer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/git/odb/file_storer.go b/git/odb/file_storer.go index a5efe7a7..eada2a4c 100644 --- a/git/odb/file_storer.go +++ b/git/odb/file_storer.go @@ -47,10 +47,10 @@ func (fs *fileStorer) Store(sha []byte, r io.Reader) (n int64, err error) { } n, err = io.Copy(tmp, r) - if err != nil { + if err = tmp.Close(); err != nil { return n, err } - if err = tmp.Close(); err != nil { + if err != nil { return n, err } From c96b962d64b77e974c45202fba002555efc00399 Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Thu, 25 May 2017 14:40:23 -0600 Subject: [PATCH 4/4] git/odb: no need to stat(1) the directory --- git/odb/file_storer.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/git/odb/file_storer.go b/git/odb/file_storer.go index eada2a4c..1642bbfc 100644 --- a/git/odb/file_storer.go +++ b/git/odb/file_storer.go @@ -57,14 +57,11 @@ func (fs *fileStorer) Store(sha []byte, r io.Reader) (n int64, err error) { path := fs.path(sha) dir := filepath.Dir(path) - if _, err := os.Stat(dir); os.IsNotExist(err) { - // Since .git/objects partitions objects based on the first two - // characters of their ASCII-encoded SHA1 object ID, ensure that - // the directory exists before copying a file into it. - err = os.MkdirAll(dir, 0755) - if err != nil { - return n, err - } + // Since .git/objects partitions objects based on the first two + // characters of their ASCII-encoded SHA1 object ID, ensure that + // the directory exists before copying a file into it. + if err = os.MkdirAll(dir, 0755); err != nil { + return n, err } if _, err := os.Stat(path); os.IsExist(err) {