Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit c2dd2c8

Browse files
author
Matthieu Nottale
committed
pack: Fix mode and type, pack eventual images.
1 parent 510a89e commit c2dd2c8

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed

packager/extract.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func extract(appname, outputDir string) error {
4444
return err
4545
}
4646
tarReader := tar.NewReader(f)
47+
outputDir = outputDir + "/"
4748
for {
4849
header, err := tarReader.Next()
4950
if err == io.EOF {
@@ -52,7 +53,6 @@ func extract(appname, outputDir string) error {
5253
if err != nil {
5354
return err
5455
}
55-
outputDir = outputDir + "/"
5656
switch header.Typeflag {
5757
case tar.TypeDir: // = directory
5858
os.Mkdir(outputDir+header.Name, 0755)
@@ -62,7 +62,10 @@ func extract(appname, outputDir string) error {
6262
if err != nil {
6363
return err
6464
}
65-
ioutil.WriteFile(outputDir+header.Name, data, 0644)
65+
err = ioutil.WriteFile(outputDir+header.Name, data, 0644)
66+
if err != nil {
67+
return err
68+
}
6669
}
6770
}
6871
return nil

packager/packing.go

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,35 @@ import (
1212
"golang.org/x/crypto/ssh/terminal"
1313
)
1414

15+
func tarAdd(tarout *tar.Writer, path, file string) error {
16+
payload, err := ioutil.ReadFile(file)
17+
if err != nil {
18+
return err
19+
}
20+
h := &tar.Header{
21+
Name: path,
22+
Size: int64(len(payload)),
23+
Mode: 0644,
24+
Typeflag: tar.TypeReg,
25+
}
26+
err = tarout.WriteHeader(h)
27+
if err != nil {
28+
return err
29+
}
30+
_, err = tarout.Write(payload)
31+
return err
32+
}
33+
34+
func tarAddDir(tarout *tar.Writer, path string) error {
35+
h := &tar.Header{
36+
Name: path,
37+
Size: 0,
38+
Typeflag: tar.TypeDir,
39+
Mode: 0755,
40+
}
41+
return tarout.WriteHeader(h)
42+
}
43+
1544
// Pack packs the app as a single file
1645
func Pack(appname, output string) error {
1746
if output == "-" && terminal.IsTerminal(int(os.Stdout.Fd())) {
@@ -34,22 +63,32 @@ func Pack(appname, output string) error {
3463
tarout := tar.NewWriter(target)
3564
files := []string{"metadata.yml", "services.yml", "settings.yml"}
3665
for _, f := range files {
37-
payload, err := ioutil.ReadFile(path.Join(appname, f))
66+
err = tarAdd(tarout, f, path.Join(appname, f))
3867
if err != nil {
3968
return err
4069
}
41-
h := &tar.Header{
42-
Name: f,
43-
Size: int64(len(payload)),
70+
}
71+
// check for images
72+
_, err = os.Stat(path.Join(appname, "images"))
73+
if err == nil {
74+
err = tarAddDir(tarout, "images")
75+
if err != nil {
76+
return err
4477
}
45-
err = tarout.WriteHeader(h)
78+
imageDir, err := os.Open(path.Join(appname, "images"))
4679
if err != nil {
4780
return err
4881
}
49-
_, err = tarout.Write(payload)
82+
images, err := imageDir.Readdirnames(0)
5083
if err != nil {
5184
return err
5285
}
86+
for _, i := range images {
87+
err = tarAdd(tarout, path.Join("images", i), path.Join(appname, "images", i))
88+
if err != nil {
89+
return err
90+
}
91+
}
5392
}
5493
return tarout.Close()
5594
}

0 commit comments

Comments
 (0)