Skip to content

Commit 3af1e39

Browse files
authored
Merge pull request #130 from criteo/fix-large-zip-extraction
Pkg install - Zip extraction - Close files as soon as they're copied.
2 parents 8daa945 + 4f646d1 commit 3af1e39

File tree

1 file changed

+49
-41
lines changed

1 file changed

+49
-41
lines changed

internal/pkg/zip-package.go

+49-41
Original file line numberDiff line numberDiff line change
@@ -50,47 +50,8 @@ func (pkg *zipPackage) InstallTo(targetDir string) (command.PackageManifest, err
5050
zipReader, _ := zip.OpenReader(pkg.ZipFile)
5151
defer zipReader.Close()
5252
for _, file := range zipReader.Reader.File {
53-
zippedFile, err := file.Open()
54-
if err != nil {
55-
return nil, fmt.Errorf("installation failed: %s", err)
56-
}
57-
defer zippedFile.Close()
58-
59-
extractedFilePath := filepath.Join(targetDir, file.Name)
60-
if file.FileInfo().IsDir() {
61-
log.Println("Directory Created:", extractedFilePath)
62-
err := os.MkdirAll(extractedFilePath, file.Mode())
63-
if err != nil {
64-
return nil, fmt.Errorf("directory extraction failed: %s", err)
65-
}
66-
67-
fileStats, err := os.Stat(extractedFilePath)
68-
if err != nil {
69-
return nil, fmt.Errorf("failed to stat %s: %s", extractedFilePath, err)
70-
}
71-
permissions := fileStats.Mode().Perm()
72-
if permissions != 0o755 {
73-
// chmod to 755
74-
if err := os.Chmod(extractedFilePath, 0755); err != nil {
75-
return nil, fmt.Errorf("failed to chmod %s to 0755: %s", extractedFilePath, err)
76-
}
77-
}
78-
} else {
79-
log.Println("File extracted:", file.Name)
80-
outputFile, err := os.OpenFile(
81-
extractedFilePath,
82-
os.O_WRONLY|os.O_CREATE|os.O_TRUNC,
83-
file.Mode(),
84-
)
85-
if err != nil {
86-
return nil, fmt.Errorf("file extraction failed: %s", err)
87-
}
88-
defer outputFile.Close()
89-
90-
_, err = io.Copy(outputFile, zippedFile)
91-
if err != nil {
92-
return nil, fmt.Errorf("file data extraction failed: %s", err)
93-
}
53+
if err := extractZipEntry(targetDir, file); err != nil {
54+
return nil, err
9455
}
9556
}
9657

@@ -133,3 +94,50 @@ func packageChecksum(pkgFile string) ([]byte, error) {
13394

13495
return h.Sum(nil), nil
13596
}
97+
98+
func extractZipEntry(targetDir string, file *zip.File) error {
99+
zippedFile, err := file.Open()
100+
if err != nil {
101+
return fmt.Errorf("installation failed: %s", err)
102+
}
103+
defer zippedFile.Close()
104+
105+
extractedFilePath := filepath.Join(targetDir, file.Name)
106+
if file.FileInfo().IsDir() {
107+
log.Println("Directory Created:", extractedFilePath)
108+
err := os.MkdirAll(extractedFilePath, file.Mode())
109+
if err != nil {
110+
return fmt.Errorf("directory extraction failed: %s", err)
111+
}
112+
113+
fileStats, err := os.Stat(extractedFilePath)
114+
if err != nil {
115+
return fmt.Errorf("failed to stat %s: %s", extractedFilePath, err)
116+
}
117+
permissions := fileStats.Mode().Perm()
118+
if permissions != 0o755 {
119+
// chmod to 755
120+
if err := os.Chmod(extractedFilePath, 0755); err != nil {
121+
return fmt.Errorf("failed to chmod %s to 0755: %s", extractedFilePath, err)
122+
}
123+
}
124+
} else {
125+
log.Println("File extracted:", file.Name)
126+
outputFile, err := os.OpenFile(
127+
extractedFilePath,
128+
os.O_WRONLY|os.O_CREATE|os.O_TRUNC,
129+
file.Mode(),
130+
)
131+
if err != nil {
132+
return fmt.Errorf("file extraction failed: %s", err)
133+
}
134+
defer outputFile.Close()
135+
136+
_, err = io.Copy(outputFile, zippedFile)
137+
if err != nil {
138+
return fmt.Errorf("file data extraction failed: %s", err)
139+
}
140+
}
141+
142+
return nil
143+
}

0 commit comments

Comments
 (0)