about summary refs log tree commit diff stats
path: root/internal/importer/package.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/importer/package.go')
-rw-r--r--internal/importer/package.go66
1 files changed, 59 insertions, 7 deletions
diff --git a/internal/importer/package.go b/internal/importer/package.go
index 34293a7..619b10c 100644
--- a/internal/importer/package.go
+++ b/internal/importer/package.go
@@ -71,7 +71,7 @@ func NewPackageProcessor(
 	programsDB *programs.DB,
 ) (*PackageIngester, errors.E) {
 	i := &PackageIngester{
-		dec:      jstream.NewDecoder(infile, 2).EmitKV(),
+		dec:      jstream.NewDecoder(infile, source.JSONDepth).EmitKV(),
 		log:      log,
 		pkg:      packageJSON{},
 		infile:   infile,
@@ -192,18 +192,27 @@ func (i *PackageIngester) Process(ctx context.Context) (<-chan nix.Importable, <
 
 			if meta["platforms"] != nil {
 				var plats = make([]any, len(meta["platforms"].([]any)))
-				for i, plat := range meta["platforms"].([]interface{}) {
+				i := 0
+				for _, plat := range meta["platforms"].([]interface{}) {
 					switch v := reflect.ValueOf(plat); v.Kind() {
 					case reflect.String:
 						plats[i] = v.String()
 					case reflect.Map:
 						plats[i] = makeAdhocPlatform(v.Interface())
+					case reflect.Slice:
+						ps := make([]any, v.Len())
+						for j, item := range v.Slice(0, v.Len()).Interface().([]any) {
+							ps[j] = item.(string)
+						}
+						plats = append(plats, ps...)
 					default:
 						errs <- errors.Errorf(
-							"don't know how to convert platform type %s",
+							"don't know how to convert platform type %s: %v",
 							v.Kind().String(),
+							v.Interface(),
 						)
 					}
+					i++
 				}
 				meta["platforms"] = plats
 			}
@@ -221,6 +230,43 @@ func (i *PackageIngester) Process(ctx context.Context) (<-chan nix.Importable, <
 				}
 			}
 
+			var maints []nix.Maintainer
+			if meta["maintainers"] != nil {
+				switch maint := reflect.ValueOf(meta["maintainers"]); maint.Kind() {
+				case reflect.String:
+					maints = []nix.Maintainer{nix.Maintainer{Name: maint.String(), Github: maint.String()}}
+				case reflect.Slice, reflect.Array:
+					maints = make([]nix.Maintainer, maint.Len())
+					for i, val := range maint.Slice(0, maint.Len()).Interface().([]any) {
+						switch v := reflect.ValueOf(val); v.Kind() {
+						case reflect.String:
+							maints[i] = nix.Maintainer{Name: v.String(), Github: v.String()}
+						case reflect.Map:
+							m := v.Interface().(map[string]any)
+							maints[i] = nix.Maintainer{}
+							if m["name"] != nil && m["name"].(string) != "" {
+								maints[i].Name = m["name"].(string)
+							}
+							if m["github"] != nil && m["github"].(string) != "" {
+								maints[i].Github = m["github"].(string)
+							}
+						default:
+							errs <- errors.Errorf(
+								"don't know how to handle maintainer entry of type %s: %v",
+								v.Kind().String(),
+								v,
+							)
+						}
+					}
+				default:
+					errs <- errors.Errorf(
+						"don't know how to interpret maintainers type %s'",
+						maint.Kind().String(),
+					)
+				}
+				meta["maintainers"] = maints
+			}
+
 			i.pkg = packageJSON{}
 			if err := i.ms.Decode(x); err != nil { // stores in i.pkg
 				errs <- errors.WithMessagef(err, "failed to decode package %#v", x)
@@ -250,13 +296,19 @@ func (i *PackageIngester) Process(ctx context.Context) (<-chan nix.Importable, <
 				pkgSet = ""
 			}
 
-			url, err := makeRepoURL(i.source.Repo, subpath, line)
-			if err != nil {
-				errs <- err
+			var url string
+			if meta["position"] != nil {
+				url = meta["position"].(string)
+			} else {
+				url, err = makeRepoURL(i.source.Repo, subpath, line)
+				if err != nil {
+					errs <- err
+				}
 			}
+
 			results <- &nix.Package{
 				Name:            i.pkg.Name,
-				Attribute:       kv.Key,
+				Attribute:       strings.TrimPrefix(kv.Key, "nur.repos."),
 				Source:          i.source.Key,
 				PackageSet:      pkgSet,
 				Version:         i.pkg.Version,