mirror of
https://github.com/tweag/gomod2nix.git
synced 2024-11-23 05:34:50 +00:00
509b97c288
The difference in behaviour was unfortunate. The only downside I can see is that this doesn't allow for mixed origins in the same package, which probably shouldn't be done anyway.
110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
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)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|