-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.go
128 lines (103 loc) · 2.25 KB
/
utils.go
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
118
119
120
121
122
123
124
125
126
127
128
package libdatamanager
import (
"archive/tar"
"encoding/base64"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
func encodeBase64(b []byte) []byte {
return []byte(base64.StdEncoding.EncodeToString(b))
}
func decodeBase64(b []byte) []byte {
data, err := base64.StdEncoding.DecodeString(string(b))
if err != nil {
fmt.Println("Error: Bad Key!")
os.Exit(1)
}
return data
}
func archive(src string, buf io.Writer) error {
maxErrors := 10
tw := tar.NewWriter(buf)
buff := make([]byte, 1024*1024)
// baseDir := getBaseDir(src)
errChan := make(chan error, maxErrors)
// walk through every file in the folder
go func() {
filepath.Walk(src, func(file string, fi os.FileInfo, err error) error {
if len(file) < len(src)+1 {
return nil
}
// Follow link
var link string
if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
if link, err = os.Readlink(file); err != nil {
errChan <- err
return nil
}
}
// Generate tar header
header, err := tar.FileInfoHeader(fi, link)
if err != nil {
errChan <- err
return nil
}
// Set filename
header.Name = filepath.Join(src, strings.TrimPrefix(file, src))
//header.Name = filepath.ToSlash(file)
// write header
if err := tw.WriteHeader(header); err != nil {
errChan <- err
return nil
}
// Nothing more to do for non-regular
if !fi.Mode().IsRegular() {
return nil
}
// can only write file-
// contents to archives
if !fi.IsDir() {
data, err := os.Open(file)
if err != nil {
errChan <- err
return nil
}
if _, err := io.CopyBuffer(tw, data, buff); err != nil {
errChan <- err
return nil
}
data.Close()
}
return nil
})
close(errChan)
}()
errCounter := 0
for err := range errChan {
if errCounter >= maxErrors {
return errors.New("Too many errors")
}
fmt.Println(err)
errCounter++
}
// produce tar
if err := tw.Close(); err != nil {
return err
}
return nil
}
// Get Base dir without last dir
func getBaseDir(dir string) string {
if strings.HasSuffix(dir, string(filepath.Separator)) {
dir = dir[:len(dir)-1]
}
dir = filepath.Dir(dir)
if !strings.HasSuffix(dir, string(filepath.Separator)) {
dir += string(filepath.Separator)
}
return dir
}