aboutsummaryrefslogtreecommitdiff
path: root/nix/builder/symlink/symlink.go
diff options
context:
space:
mode:
Diffstat (limited to 'nix/builder/symlink/symlink.go')
-rw-r--r--nix/builder/symlink/symlink.go110
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)
+ }
+
+ }
+ }
+
+}