diff --git a/builder/symlink/symlink.go b/builder/symlink/symlink.go index 941c14f..e5ee0cd 100644 --- a/builder/symlink/symlink.go +++ b/builder/symlink/symlink.go @@ -15,33 +15,33 @@ type Package struct { ReplacedPath string `json:"replaced,omitempty"` } +type Sources map[string]string + +func populateStruct(path string, data interface{}) { + pathVal := os.Getenv(path) + if len(path) == 0 { + panic(fmt.Sprintf("env var '%s' was unset", path)) + } + path = pathVal + + b, err := os.ReadFile(path) + if err != nil { + panic(err) + } + + err = json.Unmarshal(b, &data) + if err != nil { + panic(err) + } +} + func main() { - sources := make(map[string]string) + sources := make(Sources) pkgs := make(map[string]*Package) - { - b, err := os.ReadFile(os.Getenv("sourcesPath")) - if err != nil { - panic(err) - } + populateStruct("sourcesPath", &sources) - err = json.Unmarshal(b, &sources) - if err != nil { - panic(err) - } - } - - { - b, err := os.ReadFile(os.Getenv("jsonPath")) - if err != nil { - panic(err) - } - - err = json.Unmarshal(b, &pkgs) - if err != nil { - panic(err) - } - } + populateStruct("jsonPath", &pkgs) keys := make([]string, 0, len(pkgs)) for key := range pkgs { @@ -49,6 +49,10 @@ func main() { } sort.Strings(keys) + makeSymlinks(keys, sources) +} + +func makeSymlinks(keys []string, sources Sources) { // Iterate, in reverse order for i := len(keys) - 1; i >= 0; i-- { key := keys[i] @@ -57,46 +61,49 @@ func main() { paths := []string{key} for _, path := range paths { - vendorDir := filepath.Join("vendor", filepath.Dir(path)) - if err := os.MkdirAll(vendorDir, 0755); err != nil { + if err := os.MkdirAll(vendorDir, 0o755); err != nil { panic(err) } - if _, err := os.Stat(filepath.Join("vendor", path)); err == nil { - files, err := os.ReadDir(src) - if err != nil { - panic(err) - } - - for _, f := range files { - innerSrc := filepath.Join(src, f.Name()) - dst := filepath.Join("vendor", path, f.Name()) - if err := os.Symlink(innerSrc, dst); err != nil { - // assume it's an existing directory, try to link the directory content instead. - // TODO should we do this recursively - files, err := os.ReadDir(innerSrc) - if err != nil { - panic(err) - } - for _, f := range files { - if err := os.Symlink(filepath.Join(innerSrc, f.Name()), filepath.Join(dst, f.Name())); err != nil { - fmt.Println("ignore symlink error", filepath.Join(innerSrc, f.Name()), filepath.Join(dst, f.Name())) - } - } - } - } - + vendorPath := filepath.Join("vendor", path) + if _, err := os.Stat(vendorPath); err == nil { + populateVendorPath(vendorPath, src) continue } // If the file doesn't already exist, just create a simple symlink - err := os.Symlink(src, filepath.Join("vendor", path)) + err := os.Symlink(src, vendorPath) if err != nil { panic(err) } - } } - +} + +func populateVendorPath(vendorPath string, src string) { + files, err := os.ReadDir(src) + if err != nil { + panic(err) + } + + for _, f := range files { + innerSrc := filepath.Join(src, f.Name()) + dst := filepath.Join(vendorPath, f.Name()) + if err := os.Symlink(innerSrc, dst); err != nil { + // assume it's an existing directory, try to link the directory content instead. + // TODO should we do this recursively? + files, err := os.ReadDir(innerSrc) + if err != nil { + panic(err) + } + for _, f := range files { + srcFile := filepath.Join(innerSrc, f.Name()) + dstFile := filepath.Join(dst, f.Name()) + if err := os.Symlink(srcFile, dstFile); err != nil { + fmt.Println("ignoring symlink error", srcFile, dstFile) + } + } + } + } }