This repository was archived by the owner on Sep 28, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathtar.go
More file actions
117 lines (96 loc) · 2.06 KB
/
tar.go
File metadata and controls
117 lines (96 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package tar
import (
"archive/tar"
"crypto/sha256"
"encoding/hex"
"io"
"io/ioutil"
"os"
"path/filepath"
"github.com/erikh/box/log"
)
// Archive takes a source and target directory and returns a filename and/or
// error. The source will be archived relative to the target. The file will
// live in the user's os.TempDir().
func Archive(rel, target string) (string, error) {
fi, err := os.Lstat(rel)
if err != nil {
return "", err
}
f, err := ioutil.TempFile("", "box-copy.")
if err != nil {
return "", err
}
tw := tar.NewWriter(f)
if fi.IsDir() {
err := filepath.Walk(rel, func(path string, fi os.FileInfo, err error) error {
if err != nil {
return err
}
log.CopyPath(path, filepath.Join(target, path))
header, err := tar.FileInfoHeader(fi, filepath.Join(target, path))
if err != nil {
return err
}
header.Linkname = filepath.Join(target, path)
header.Name = filepath.Join(target, path)
if err := tw.WriteHeader(header); err != nil {
return err
}
p, err := os.Open(path)
if err != nil {
return err
}
if header.Typeflag == tar.TypeReg {
_, err = io.Copy(tw, p)
if err != nil && err != io.EOF {
p.Close()
return err
}
p.Close()
}
return nil
})
if err != nil {
return "", err
}
} else if !fi.IsDir() {
header, err := tar.FileInfoHeader(fi, target)
if err != nil {
return "", err
}
header.Name = target
header.Linkname = target
if err := tw.WriteHeader(header); err != nil {
return "", err
}
p, err := os.Open(rel)
if err != nil {
return "", err
}
_, err = io.Copy(tw, p)
if err != nil && err != io.EOF {
p.Close()
return "", err
}
p.Close()
}
tw.Close()
f.Close()
return f.Name(), nil
}
// SumFile reads a file an returns a hex-encoded sha512/256.
func SumFile(fn string) (string, error) {
f, err := os.Open(fn)
if err != nil {
return "", err
}
hash := sha256.New()
_, err = io.Copy(hash, f)
if err != nil && err != io.EOF {
f.Close()
return "", err
}
f.Close()
return hex.EncodeToString(hash.Sum(nil)), nil
}