(source, dst string, mode os.FileMode)
| 220 | } |
| 221 | |
| 222 | func copyFile(source, dst string, mode os.FileMode) (err error) { |
| 223 | var op errors.Op = "plugins.copyFile" |
| 224 | sf, err := os.Open(source) |
| 225 | if err != nil { |
| 226 | return errors.E(op, err) |
| 227 | } |
| 228 | defer sf.Close() |
| 229 | |
| 230 | df, err := os.Create(dst) |
| 231 | if err != nil { |
| 232 | return errors.E(op, err) |
| 233 | } |
| 234 | defer df.Close() |
| 235 | |
| 236 | _, err = io.Copy(df, sf) |
| 237 | if err != nil { |
| 238 | return errors.E(op, err) |
| 239 | } |
| 240 | err = os.Chmod(dst, mode) |
| 241 | if err != nil { |
| 242 | return errors.E(op, err) |
| 243 | } |
| 244 | return nil |
| 245 | } |
| 246 | |
| 247 | // isCrossDeviceRenameErr determines if a os.Rename error is due to cross-fs/drive/volume copying. |
| 248 | func isCrossDeviceRenameErr(err error) bool { |
no test coverage detected