diff options
author | Bartek Jaroszewski <jaroszewskibartek@gmail.com> | 2018-07-18 11:43:00 +0200 |
---|---|---|
committer | Santiago M. Mola <santi@mola.io> | 2018-10-30 11:43:00 +0100 |
commit | 507681b9a317a91c176460b6aaff1915ba4b9533 (patch) | |
tree | ca2f6f6d77dfa9366746f820b32bec2c30d16133 /repository.go | |
parent | dfd6c820e3dc7477eaaf517d4ad3b34b62e6c42e (diff) | |
download | go-git-507681b9a317a91c176460b6aaff1915ba4b9533.tar.gz |
repository: added cleanup for the PlainCloneContext()
Signed-off-by: Bartek Jaroszewski <jaroszewskibartek@gmail.com>
Diffstat (limited to 'repository.go')
-rw-r--r-- | repository.go | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/repository.go b/repository.go index 507ff44..bb89b28 100644 --- a/repository.go +++ b/repository.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "io" stdioutil "io/ioutil" "os" "path" @@ -50,6 +51,7 @@ var ( ErrIsBareRepository = errors.New("worktree not available in a bare repository") ErrUnableToResolveCommit = errors.New("unable to resolve commit") ErrPackedObjectsNotSupported = errors.New("Packed objects not supported") + ErrDirNotEmpty = errors.New("directory is not empty") ) // Repository represents a git repository @@ -342,12 +344,68 @@ func PlainClone(path string, isBare bool, o *CloneOptions) (*Repository, error) // // TODO(mcuadros): move isBare to CloneOptions in v5 func PlainCloneContext(ctx context.Context, path string, isBare bool, o *CloneOptions) (*Repository, error) { + dirEmpty := false + dirExist := false + + file, err := os.Stat(path) + if err != nil { + return nil, err + } + + if !os.IsNotExist(err) { + dirExist = file.IsDir() + } + + if dirExist { + fh, err := os.Open(path) + if err != nil { + return nil, err + } + defer fh.Close() + + names, err := fh.Readdirnames(1) + if err != io.EOF && err != nil { + return nil, err + } + if len(names) == 0 { + dirEmpty = true + } else { + return nil, ErrDirNotEmpty + } + } + r, err := PlainInit(path, isBare) if err != nil { return nil, err } - return r, r.clone(ctx, o) + err = r.clone(ctx, o) + if err != nil && err != ErrRepositoryAlreadyExists { + if dirEmpty { + fh, err := os.Open(path) + if err != nil { + return nil, err + } + defer fh.Close() + + names, err := fh.Readdirnames(-1) + if err != nil && err != io.EOF { + return nil, err + } + + for _, name := range names { + err = os.RemoveAll(filepath.Join(path, name)) + if err != nil { + return nil, err + } + } + } else if !dirExist { + os.RemoveAll(path) + return nil, err + } + } + + return r, err } func newRepository(s storage.Storer, worktree billy.Filesystem) *Repository { |