aboutsummaryrefslogtreecommitdiffstats
path: root/worktree_status.go
diff options
context:
space:
mode:
authorMáximo Cuadros <mcuadros@gmail.com>2017-06-19 10:36:37 +0200
committerMáximo Cuadros <mcuadros@gmail.com>2017-06-19 10:36:37 +0200
commitada10c2978a6c7dea8109f2d92dd092f57f9de84 (patch)
tree5bfe6efbe152d1c90bf14a12681afbc74accb7d3 /worktree_status.go
parent1fd0a4963b4a5002b23bf4faa7814adca73818d6 (diff)
downloadgo-git-ada10c2978a6c7dea8109f2d92dd092f57f9de84.tar.gz
worktree: support for symlinks
Diffstat (limited to 'worktree_status.go')
-rw-r--r--worktree_status.go33
1 files changed, 27 insertions, 6 deletions
diff --git a/worktree_status.go b/worktree_status.go
index eb4a83a..ba0509a 100644
--- a/worktree_status.go
+++ b/worktree_status.go
@@ -212,11 +212,15 @@ func (w *Worktree) Add(path string) (plumbing.Hash, error) {
}
func (w *Worktree) calculateBlobHash(filename string) (hash plumbing.Hash, err error) {
- fi, err := w.fs.Stat(filename)
+ fi, err := w.fs.Lstat(filename)
if err != nil {
return plumbing.ZeroHash, err
}
+ if fi.Mode()&os.ModeSymlink != 0 {
+ return w.calculateBlobHashFromSymlink(filename)
+ }
+
f, err := w.fs.Open(filename)
if err != nil {
return plumbing.ZeroHash, err
@@ -233,6 +237,21 @@ func (w *Worktree) calculateBlobHash(filename string) (hash plumbing.Hash, err e
return
}
+func (w *Worktree) calculateBlobHashFromSymlink(link string) (plumbing.Hash, error) {
+ target, err := w.fs.Readlink(link)
+ if err != nil {
+ return plumbing.ZeroHash, err
+ }
+
+ h := plumbing.NewHasher(plumbing.BlobObject, int64(len(target)))
+ _, err = h.Write([]byte(target))
+ if err != nil {
+ return plumbing.ZeroHash, err
+ }
+
+ return h.Sum(), nil
+}
+
func (w *Worktree) addOrUpdateFileToIndex(filename string, h plumbing.Hash) error {
idx, err := w.r.Storer.Index()
if err != nil {
@@ -265,7 +284,7 @@ func (w *Worktree) doAddFileToIndex(idx *index.Index, filename string, h plumbin
}
func (w *Worktree) doUpdateFileToIndex(e *index.Entry, filename string, h plumbing.Hash) error {
- info, err := w.fs.Stat(filename)
+ info, err := w.fs.Lstat(filename)
if err != nil {
return err
}
@@ -273,12 +292,14 @@ func (w *Worktree) doUpdateFileToIndex(e *index.Entry, filename string, h plumbi
e.Hash = h
e.ModifiedAt = info.ModTime()
e.Mode, err = filemode.NewFromOSFileMode(info.Mode())
- e.Size = uint32(info.Size())
-
if err != nil {
return err
}
+ if e.Mode.IsRegular() {
+ e.Size = uint32(info.Size())
+ }
+
fillSystemInfo(e, info.Sys())
return nil
}
@@ -319,11 +340,11 @@ func (w *Worktree) deleteFromFilesystem(path string) error {
// Move moves or rename a file in the worktree and the index, directories are
// not supported.
func (w *Worktree) Move(from, to string) (plumbing.Hash, error) {
- if _, err := w.fs.Stat(from); err != nil {
+ if _, err := w.fs.Lstat(from); err != nil {
return plumbing.ZeroHash, err
}
- if _, err := w.fs.Stat(to); err == nil {
+ if _, err := w.fs.Lstat(to); err == nil {
return plumbing.ZeroHash, ErrDestinationExists
}