aboutsummaryrefslogtreecommitdiffstats
path: root/worktree_commit.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_commit.go
parent1fd0a4963b4a5002b23bf4faa7814adca73818d6 (diff)
downloadgo-git-ada10c2978a6c7dea8109f2d92dd092f57f9de84.tar.gz
worktree: support for symlinks
Diffstat (limited to 'worktree_commit.go')
-rw-r--r--worktree_commit.go32
1 files changed, 31 insertions, 1 deletions
diff --git a/worktree_commit.go b/worktree_commit.go
index 5307b41..fc63d16 100644
--- a/worktree_commit.go
+++ b/worktree_commit.go
@@ -2,6 +2,7 @@ package git
import (
"io"
+ "os"
"path/filepath"
"strings"
@@ -186,11 +187,15 @@ func (h *commitIndexHelper) copyIndexEntryToStorage(e *index.Entry) error {
}
func (h *commitIndexHelper) doCopyIndexEntryToStorage(e *index.Entry) (err error) {
- fi, err := h.fs.Stat(e.Name)
+ fi, err := h.fs.Lstat(e.Name)
if err != nil {
return err
}
+ if fi.Mode()&os.ModeSymlink != 0 {
+ return h.doCopyIndexEntryFromSymlinkToStorage(e, fi)
+ }
+
obj := h.s.NewEncodedObject()
obj.SetType(plumbing.BlobObject)
obj.SetSize(fi.Size())
@@ -217,6 +222,31 @@ func (h *commitIndexHelper) doCopyIndexEntryToStorage(e *index.Entry) (err error
return err
}
+func (h *commitIndexHelper) doCopyIndexEntryFromSymlinkToStorage(e *index.Entry, fi os.FileInfo) error {
+ obj := h.s.NewEncodedObject()
+ obj.SetType(plumbing.BlobObject)
+ obj.SetSize(fi.Size())
+
+ writer, err := obj.Writer()
+ if err != nil {
+ return err
+ }
+
+ defer ioutil.CheckClose(writer, &err)
+
+ target, err := h.fs.Readlink(e.Name)
+ if err != nil {
+ return err
+ }
+
+ if _, err := writer.Write([]byte(target)); err != nil {
+ return err
+ }
+
+ _, err = h.s.SetEncodedObject(obj)
+ return err
+}
+
func (h *commitIndexHelper) copyTreeToStorageRecursive(parent string, t *object.Tree) (plumbing.Hash, error) {
for i, e := range t.Entries {
if e.Mode != filemode.Dir && !e.Hash.IsZero() {