Skip to content
This repository was archived by the owner on Apr 24, 2021. It is now read-only.
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: ipfs/go-ipfs-cmdkit
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: master
Choose a base ref
...
head repository: djdv/go-ipfs-cmdkit
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: feat/resolve-links
Choose a head ref
Can’t automatically merge. Don’t worry, you can still create the pull request.
  • 1 commit
  • 2 files changed
  • 1 contributor

Commits on Sep 19, 2018

  1. Copy the full SHA
    4e29732 View commit details
Showing with 36 additions and 5 deletions.
  1. +4 −0 files/linkfile.go
  2. +32 −5 files/serialfile.go
4 changes: 4 additions & 0 deletions files/linkfile.go
Original file line number Diff line number Diff line change
@@ -48,3 +48,7 @@ func (f *Symlink) FullPath() string {
func (f *Symlink) Read(b []byte) (int, error) {
return f.reader.Read(b)
}

func (f *Symlink) Size() (int64, error) {
return int64(len(f.Target)), nil
}
37 changes: 32 additions & 5 deletions files/serialfile.go
Original file line number Diff line number Diff line change
@@ -20,9 +20,10 @@ type serialFile struct {
stat os.FileInfo
current *File
handleHiddenFiles bool
resolveLinks bool
}

func NewSerialFile(name, path string, hidden bool, stat os.FileInfo) (File, error) {
func NewSerialFile(name, path string, hidden bool, stat os.FileInfo, resolveLinks bool) (File, error) {
switch mode := stat.Mode(); {
case mode.IsRegular():
file, err := os.Open(path)
@@ -37,12 +38,27 @@ func NewSerialFile(name, path string, hidden bool, stat os.FileInfo) (File, erro
if err != nil {
return nil, err
}
return &serialFile{name, path, contents, stat, nil, hidden}, nil
return &serialFile{name, path, contents, stat, nil, hidden, resolveLinks}, nil
case mode&os.ModeSymlink != 0:
target, err := os.Readlink(path)
if err != nil {
return nil, err
}
if resolveLinks {
target, err := filepath.EvalSymlinks(path)
if err != nil {
return nil, err
}
target = filepath.ToSlash(target)

fi, err := os.Lstat(target)
if err != nil {
return nil, err
}

return NewSerialFile(name, target, hidden, fi, resolveLinks)
}

return NewLinkFile(name, path, target, stat), nil
default:
return nil, fmt.Errorf("Unrecognized file type for %s: %s", name, mode.String())
@@ -93,7 +109,7 @@ func (f *serialFile) NextFile() (File, error) {
// recursively call the constructor on the next file
// if it's a regular file, we will open it as a ReaderFile
// if it's a directory, files in it will be opened serially
sf, err := NewSerialFile(fileName, filePath, f.handleHiddenFiles, stat)
sf, err := NewSerialFile(fileName, filePath, f.handleHiddenFiles, stat, f.resolveLinks)
if err != nil {
return nil, err
}
@@ -139,13 +155,24 @@ func (f *serialFile) Size() (int64, error) {

var du int64
err := filepath.Walk(f.FullPath(), func(p string, fi os.FileInfo, err error) error {
if err != nil {
if err != nil || fi == nil {
return err
}

if fi != nil && fi.Mode().IsRegular() {
if fi.Mode().IsRegular() {
du += fi.Size()
}

if fi.Mode()&os.ModeSymlink != 0 {
if f.resolveLinks {
targetFi, err := os.Stat(p)
if err != nil {
return err
}
du += targetFi.Size()
}
}

return nil
})