@@ -6,7 +6,10 @@ import (
6
6
"os"
7
7
"os/exec"
8
8
"path/filepath"
9
-
9
+
10
+ "io"
11
+ "io/ioutil"
12
+
10
13
"github.com/spf13/viper"
11
14
)
12
15
@@ -100,3 +103,97 @@ func GetCredentials() AwsCredentials {
100
103
AwsDefaultRegion : viper .GetString ("aws.aws_default_region" ),
101
104
}
102
105
}
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