Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit 8f79658

Browse files
author
Priya Wadhwa
committed
Extract hard links from tar
1 parent 6a52189 commit 8f79658

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

pkg/util/tar_utils.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import (
2525
"strings"
2626
)
2727

28+
// Map of target:linkname
29+
var hardlinks = make(map[string]string)
30+
2831
func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
2932
for {
3033
header, err := tr.Next()
@@ -119,6 +122,31 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
119122
if err = os.Symlink(header.Linkname, target); err != nil {
120123
logrus.Errorf("Failed to create symlink between %s and %s: %s", header.Linkname, target, err)
121124
}
125+
case tar.TypeLink:
126+
linkname := filepath.Join(path, header.Linkname)
127+
// Check if the linkname already exists
128+
if _, err := os.Stat(linkname); !os.IsNotExist(err) {
129+
// If it exists, create the hard link
130+
if err := os.Link(linkname, target); err != nil {
131+
logrus.Warnf("Failed to create hard link between %s and %s: %v", linkname, target, err)
132+
}
133+
logrus.Debugf("Created hard link from %s to %s", linkname, target)
134+
} else {
135+
hardlinks[target] = linkname
136+
}
137+
}
138+
}
139+
140+
for target, linkname := range hardlinks {
141+
logrus.Info("Resolving hard links.")
142+
if _, err := os.Stat(linkname); !os.IsNotExist(err) {
143+
// If it exists, create the hard link
144+
if err := os.Link(linkname, target); err != nil {
145+
logrus.Warnf("Unable to create hard link from %s to %s: %v", linkname, target, err)
146+
}
147+
logrus.Debugf("Created hard link from %s to %s", linkname, target)
148+
} else {
149+
logrus.Warnf("Unable to create hard link from %s to %s", linkname, target)
122150
}
123151
}
124152
return nil

0 commit comments

Comments
 (0)