Skip to content

Commit 6b4bba4

Browse files
authored
Merge pull request #107 from kubernauts/add-copy-func
Use native go copy function instead of cp command
2 parents e9c1a63 + b019018 commit 6b4bba4

File tree

1 file changed

+98
-1
lines changed

1 file changed

+98
-1
lines changed

pkg/common/main.go

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import (
66
"os"
77
"os/exec"
88
"path/filepath"
9-
9+
10+
"io"
11+
"io/ioutil"
12+
1013
"github.com/spf13/viper"
1114
)
1215

@@ -100,3 +103,97 @@ func GetCredentials() AwsCredentials {
100103
AwsDefaultRegion: viper.GetString("aws.aws_default_region"),
101104
}
102105
}
106+
107+
func CopyFile(src, dst string) (err error) {
108+
in, err := os.Open(src)
109+
if err != nil {
110+
return
111+
}
112+
defer in.Close()
113+
114+
out, err := os.Create(dst)
115+
if err != nil {
116+
return
117+
}
118+
defer func() {
119+
if e := out.Close(); e != nil {
120+
err = e
121+
}
122+
}()
123+
124+
_, err = io.Copy(out, in)
125+
if err != nil {
126+
return
127+
}
128+
129+
err = out.Sync()
130+
if err != nil {
131+
return
132+
}
133+
134+
si, err := os.Stat(src)
135+
if err != nil {
136+
return
137+
}
138+
err = os.Chmod(dst, si.Mode())
139+
if err != nil {
140+
return
141+
}
142+
143+
return
144+
}
145+
146+
func CopyDir(src string, dst string) (err error) {
147+
src = filepath.Clean(src)
148+
dst = filepath.Clean(dst)
149+
150+
si, err := os.Stat(src)
151+
if err != nil {
152+
return err
153+
}
154+
if !si.IsDir() {
155+
return fmt.Errorf("source is not a directory")
156+
}
157+
158+
_, err = os.Stat(dst)
159+
if err != nil && !os.IsNotExist(err) {
160+
return
161+
}
162+
if err == nil {
163+
return fmt.Errorf("destination already exists")
164+
}
165+
166+
err = os.MkdirAll(dst, si.Mode())
167+
if err != nil {
168+
return
169+
}
170+
171+
entries, err := ioutil.ReadDir(src)
172+
if err != nil {
173+
return
174+
}
175+
176+
for _, entry := range entries {
177+
srcPath := filepath.Join(src, entry.Name())
178+
dstPath := filepath.Join(dst, entry.Name())
179+
180+
if entry.IsDir() {
181+
err = CopyDir(srcPath, dstPath)
182+
if err != nil {
183+
return
184+
}
185+
} else {
186+
// Skip symlinks.
187+
if entry.Mode()&os.ModeSymlink != 0 {
188+
continue
189+
}
190+
191+
err = CopyFile(srcPath, dstPath)
192+
if err != nil {
193+
return
194+
}
195+
}
196+
}
197+
198+
return
199+
}

0 commit comments

Comments
 (0)