mirror of
https://github.com/vbatts/dedupe-linker.git
synced 2024-11-23 17:05:41 +00:00
*.go: firm up whether it is the same file
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
parent
022dad64e7
commit
2835d1a77d
3 changed files with 23 additions and 16 deletions
16
base/base.go
16
base/base.go
|
@ -53,21 +53,7 @@ type ReadSeekCloser interface {
|
||||||
// SameFile checks whether the object of `sum` address, and `path` file path are the same file.
|
// SameFile checks whether the object of `sum` address, and `path` file path are the same file.
|
||||||
// This checks by inode and device.
|
// This checks by inode and device.
|
||||||
func (b Base) SameFile(sum, path string) bool {
|
func (b Base) SameFile(sum, path string) bool {
|
||||||
var (
|
return file.SameFile(b.blobPath(sum), path)
|
||||||
bInode, dInode uint64
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
if bInode, err = file.GetInode(b.blobPath(sum)); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if dInode, err = file.GetInode(path); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if bInode == dInode {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBlob store the content from src, for the sum and hashType
|
// GetBlob store the content from src, for the sum and hashType
|
||||||
|
|
21
file/dev.go
21
file/dev.go
|
@ -83,6 +83,27 @@ func GetDev(path string) (uint64, error) {
|
||||||
return stat.Dev, nil
|
return stat.Dev, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SameFile checks whether the two paths are same device and inode
|
||||||
|
func SameFile(fpath1, fpath2 string) bool {
|
||||||
|
bStat, err := GetStat(fpath1)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
dStat, err := GetStat(fpath2)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if bStat.Dev != dStat.Dev {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if bStat.Ino != dStat.Ino {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// if we made it here, we must be ok
|
||||||
|
return true
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// GetNlink returns the number of links for path. For directories, that is
|
// GetNlink returns the number of links for path. For directories, that is
|
||||||
// number of entries. For regular files, that is number of hardlinks.
|
// number of entries. For regular files, that is number of hardlinks.
|
||||||
func GetNlink(path string) (uint64, error) {
|
func GetNlink(path string) (uint64, error) {
|
||||||
|
|
2
main.go
2
main.go
|
@ -83,7 +83,7 @@ func main() {
|
||||||
fmt.Printf("%s [%d] %s\n", fi.Hash, fi.Size, fi.Path)
|
fmt.Printf("%s [%d] %s\n", fi.Hash, fi.Size, fi.Path)
|
||||||
} else {
|
} else {
|
||||||
if os.Getenv("DEBUG") != "" {
|
if os.Getenv("DEBUG") != "" {
|
||||||
fmt.Printf("%q: %t\n", fi.Path, ourbase.HasBlob(fi.Hash))
|
fmt.Printf("[%s] exists? %t (%q)\n", fi.Hash, ourbase.HasBlob(fi.Hash), fi.Path)
|
||||||
}
|
}
|
||||||
if ourbase.HasBlob(fi.Hash) && !ourbase.SameFile(fi.Hash, fi.Path) {
|
if ourbase.HasBlob(fi.Hash) && !ourbase.SameFile(fi.Hash, fi.Path) {
|
||||||
if err := ourbase.LinkTo(fi.Path, fi.Hash); err != nil {
|
if err := ourbase.LinkTo(fi.Path, fi.Hash); err != nil {
|
||||||
|
|
Loading…
Reference in a new issue