diff options
Diffstat (limited to 'nix/builder/symlink')
-rw-r--r-- | nix/builder/symlink/symlink.go | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/nix/builder/symlink/symlink.go b/nix/builder/symlink/symlink.go new file mode 100644 index 0000000..3dbb383 --- /dev/null +++ b/nix/builder/symlink/symlink.go @@ -0,0 +1,110 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sort" +) + +type Package struct { + GoPackagePath string `json:"-"` + Version string `json:"version"` + Hash string `json:"hash"` + ReplacedPath string `json:"replaced,omitempty"` +} + +// type Output struct { +// SchemaVersion int `json:"schema"` +// Mod map[string]*Package `json:"mod"` +// } + +func main() { + + // var output Output + sources := make(map[string]string) + pkgs := make(map[string]*Package) + + { + b, err := ioutil.ReadFile(os.Getenv("sourcesPath")) + if err != nil { + panic(err) + } + + 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) + } + } + + keys := make([]string, 0, len(pkgs)) + for key := range pkgs { + keys = append(keys, key) + } + sort.Strings(keys) + + // Iterate, in reverse order + for i := len(keys) - 1; i >= 0; i-- { + key := keys[i] + src := sources[key] + + paths := []string{key} + + for _, path := range paths { + + vendorDir := filepath.Join("vendor", filepath.Dir(path)) + if err := os.MkdirAll(vendorDir, 0755); 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())) + } + } + } + } + + continue + } + + // If the file doesn't already exist, just create a simple symlink + err := os.Symlink(src, filepath.Join("vendor", path)) + if err != nil { + panic(err) + } + + } + } + +} |