| package twrp |
| |
| import ( |
| "android/soong/android" |
| "fmt" |
| "io" |
| "io/ioutil" |
| "os" |
| "path" |
| "runtime" |
| "path/filepath" |
| "strings" |
| ) |
| |
| func getRecoveryAbsDir(ctx android.BaseContext) string { |
| return getBuildAbsDir(ctx) + "bootable/recovery/" |
| } |
| |
| func getBuildAbsDir(ctx android.BaseContext) string { |
| var b string |
| _, b, _, _ = runtime.Caller(0) |
| absIndex := strings.Index(filepath.Dir(b), "bootable") |
| return string(b[0:absIndex]) |
| } |
| |
| func copyDir(src string, dest string) error { |
| var err error |
| var fds []os.FileInfo |
| var srcinfo os.FileInfo |
| |
| if srcinfo, err = os.Stat(src); err != nil { |
| return err |
| } |
| |
| if err = os.MkdirAll(dest, srcinfo.Mode()); err != nil { |
| return err |
| } |
| |
| if fds, err = ioutil.ReadDir(src); err != nil { |
| return err |
| } |
| for _, fd := range fds { |
| srcfp := path.Join(src, fd.Name()) |
| dstfp := path.Join(dest, fd.Name()) |
| |
| if fd.IsDir() { |
| if err = copyDir(srcfp, dstfp); err != nil { |
| fmt.Println(err) |
| } |
| } else { |
| if err = copyFile(srcfp, dstfp); err != nil { |
| fmt.Println(err) |
| } |
| } |
| } |
| return nil |
| } |
| |
| func copyFile(src string, dest string) error { |
| var err error |
| var srcfd *os.File |
| var dstfd *os.File |
| var srcinfo os.FileInfo |
| |
| if srcfd, err = os.Open(src); err != nil { |
| return err |
| } |
| defer srcfd.Close() |
| |
| if dstfd, err = os.Create(dest); err != nil { |
| return err |
| } |
| defer dstfd.Close() |
| |
| if _, err = io.Copy(dstfd, srcfd); err != nil { |
| return err |
| } |
| if srcinfo, err = os.Stat(src); err != nil { |
| return err |
| } |
| return os.Chmod(dest, srcinfo.Mode()) |
| } |