diff --git a/builder/symlink/symlink.go b/builder/symlink/symlink.go index a49c255..e5ee0cd 100644 --- a/builder/symlink/symlink.go +++ b/builder/symlink/symlink.go @@ -3,7 +3,6 @@ package main import ( "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" "sort" @@ -16,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 := ioutil.ReadFile(os.Getenv("sourcesPath")) - if err != nil { - panic(err) - } + populateStruct("sourcesPath", &sources) - err = json.Unmarshal(b, &sources) - if err != nil { - panic(err) - } - } - - { - b, err := ioutil.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 { @@ -50,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] @@ -58,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 := ioutil.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 := ioutil.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) + } + } + } + } } diff --git a/internal/generate/generate.go b/internal/generate/generate.go index 833194d..12db73b 100644 --- a/internal/generate/generate.go +++ b/internal/generate/generate.go @@ -7,7 +7,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -16,9 +15,9 @@ import ( "sync" "github.com/nix-community/go-nix/pkg/nar" - log "github.com/sirupsen/logrus" "github.com/nix-community/gomod2nix/internal/lib" schema "github.com/nix-community/gomod2nix/internal/schema" + log "github.com/sirupsen/logrus" "golang.org/x/mod/modfile" ) @@ -45,7 +44,7 @@ func common(directory string) ([]*goModDownload, map[string]string, error) { }).Info("Parsing go.mod") // Read go.mod - data, err := ioutil.ReadFile(goModPath) + data, err := os.ReadFile(goModPath) if err != nil { return nil, nil, err }