github.com/falafeljan/pkger@v0.18.0/pkging/pkgtest/load_ref.go (about) 1 package pkgtest 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "path/filepath" 8 "strings" 9 10 "github.com/markbates/pkger/here" 11 "github.com/markbates/pkger/pkging" 12 ) 13 14 func LoadFile(name string, ref *Ref, pkg pkging.Pkger) (os.FileInfo, error) { 15 root := filepath.Join(ref.root, name) 16 17 info, err := os.Stat(root) 18 if err != nil { 19 return nil, err 20 } 21 22 if info.IsDir() { 23 return nil, fmt.Errorf("%s is a directory", name) 24 } 25 26 _, err = pkg.Current() 27 if err != nil { 28 return nil, err 29 } 30 31 af, err := os.Open(root) 32 if err != nil { 33 return nil, err 34 } 35 defer af.Close() 36 37 bf, err := pkg.Create(name) 38 if err != nil { 39 return nil, err 40 } 41 defer bf.Close() 42 43 xp := strings.TrimPrefix(root, filepath.Dir(root)) 44 xp = filepath.Join(ref.Dir, xp) 45 46 cf, err := os.Create(xp) 47 if err != nil { 48 return nil, err 49 } 50 defer cf.Close() 51 52 mw := io.MultiWriter(bf, cf) 53 54 _, err = io.Copy(mw, af) 55 if err != nil { 56 return nil, err 57 } 58 return info, nil 59 } 60 61 func LoadFiles(name string, ref *Ref, pkg pkging.Pkger) ([]os.FileInfo, error) { 62 var infos []os.FileInfo 63 64 her, err := here.Package("github.com/markbates/pkger") 65 if err != nil { 66 return nil, err 67 } 68 69 root := filepath.Join(ref.root, name) 70 71 info, err := os.Stat(root) 72 if err != nil { 73 return nil, err 74 } 75 76 if !info.IsDir() { 77 return nil, fmt.Errorf("%s is not a directory", name) 78 } 79 80 her, err = pkg.Current() 81 if err != nil { 82 return nil, err 83 } 84 85 err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error { 86 if err != nil { 87 return err 88 } 89 90 if strings.HasPrefix(filepath.Base(path), ".") { 91 return nil 92 } 93 94 infos = append(infos, info) 95 96 xp := strings.TrimPrefix(path, root) 97 xp = filepath.Join(name, xp) 98 99 pt, err := pkg.Parse(xp) 100 if err != nil { 101 return err 102 } 103 104 if info.IsDir() { 105 if err := pkg.MkdirAll(pt.Name, info.Mode()); err != nil { 106 return err 107 } 108 if err := os.MkdirAll(filepath.Join(her.Dir, xp), info.Mode()); err != nil { 109 return err 110 } 111 return nil 112 } 113 114 af, err := os.Open(path) 115 if err != nil { 116 return err 117 } 118 defer af.Close() 119 120 bf, err := pkg.Create(pt.Name) 121 if err != nil { 122 return err 123 } 124 defer bf.Close() 125 126 xp = filepath.Join(her.Dir, xp) 127 128 cf, err := os.Create(xp) 129 if err != nil { 130 return err 131 } 132 defer cf.Close() 133 134 mw := io.MultiWriter(bf, cf) 135 136 _, err = io.Copy(mw, af) 137 if err != nil { 138 return err 139 } 140 141 return nil 142 }) 143 144 if err != nil { 145 return nil, err 146 } 147 148 if len(infos) == 0 { 149 return nil, fmt.Errorf("did not load any infos for %s", name) 150 } 151 152 return infos, nil 153 }