aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/cespare/cp/cp.go
blob: d71dbb4ba20327e75010fe3fe8edf9f11d2631e6 (plain) (blame)
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
// Package cp offers simple file and directory copying for Go.
package cp

import (
    "errors"
    "io"
    "os"
    "path/filepath"
    "strings"
)

var errCopyFileWithDir = errors.New("dir argument to CopyFile")

// CopyFile copies the file with path src to dst. The new file must not exist.
// It is created with the same permissions as src.
func CopyFile(dst, src string) error {
    rf, err := os.Open(src)
    if err != nil {
        return err
    }
    defer rf.Close()
    rstat, err := rf.Stat()
    if err != nil {
        return err
    }
    if rstat.IsDir() {
        return errCopyFileWithDir
    }

    wf, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_EXCL, rstat.Mode())
    if err != nil {
        return err
    }
    if _, err := io.Copy(wf, rf); err != nil {
        wf.Close()
        return err
    }
    return wf.Close()
}

// CopyAll copies the file or (recursively) the directory at src to dst.
// Permissions are preserved. dst must not already exist.
func CopyAll(dst, src string) error {
    return filepath.Walk(src, makeWalkFn(dst, src))
}

func makeWalkFn(dst, src string) filepath.WalkFunc {
    return func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        dstPath := filepath.Join(dst, strings.TrimPrefix(path, src))
        if info.IsDir() {
            return os.Mkdir(dstPath, info.Mode())
        }
        return CopyFile(dstPath, path)
    }
}