@@ -25,6 +25,9 @@ import (
25
25
"strings"
26
26
)
27
27
28
+ // Map of target:linkname
29
+ var hardlinks = make (map [string ]string )
30
+
28
31
func unpackTar (tr * tar.Reader , path string , whitelist []string ) error {
29
32
for {
30
33
header , err := tr .Next ()
@@ -119,6 +122,31 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
119
122
if err = os .Symlink (header .Linkname , target ); err != nil {
120
123
logrus .Errorf ("Failed to create symlink between %s and %s: %s" , header .Linkname , target , err )
121
124
}
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 )
122
150
}
123
151
}
124
152
return nil
0 commit comments