diff --git a/gxutil/pkgfile.go b/gxutil/pkgfile.go index 3c1acaa..9e1a3bc 100644 --- a/gxutil/pkgfile.go +++ b/gxutil/pkgfile.go @@ -1,6 +1,7 @@ package gxutil import ( + "io/ioutil" "encoding/json" "fmt" "os" @@ -12,7 +13,7 @@ type PackageBase struct { Name string `json:"name,omitempty"` Author string `json:"author,omitempty"` Description string `json:"description,omitempty"` - Keywords string `json:"keywords,omitempty"` + Keywords []string `json:"keywords,omitempty"` Version string `json:"version,omitempty"` Dependencies []*Dependency `json:"gxDependencies,omitempty"` Bin string `json:"bin,omitempty"` @@ -20,8 +21,10 @@ type PackageBase struct { Test string `json:"test,omitempty"` Language string `json:"language,omitempty"` License string `json:"license"` - Issues string `json:"bugs"` + Issues *Issues `json:"bugs"` GxVersion string `json:"gxVersion"` + Repository *Repository `json:"repository,omitempty"` + NonGxFields map[string]interface{} `json:"-"` } type Package struct { @@ -30,6 +33,15 @@ type Package struct { Gx json.RawMessage `json:"gx,omitempty"` } +type Repository struct { + Type string `json:"type"` + Url string `json:"url"` +} + +type Issues struct { + Url string `json:"url"` +} + // Dependency represents a dependency of a package type Dependency struct { Author string `json:"author,omitempty"` @@ -50,17 +62,38 @@ func LoadPackageFile(pkg interface{}, fname string) error { return err } + file, err := ioutil.ReadFile(fname) + if err != nil { + return nil + } + json.Unmarshal(file, &pkg.(*Package).NonGxFields) + + return nil } -func SavePackageFile(pkg interface{}, fname string) error { +func SavePackageFile(pkg interface{}, fname string, nonGxFields map[string]interface{}) error { fi, err := os.Create(fname) if err != nil { return err } defer fi.Close() - out, err := json.MarshalIndent(pkg, "", " ") + base, err := json.Marshal(pkg) + if (err != nil) { + return err + } + var f map[string]interface{} + json.Unmarshal(base, &f) + var g map[string]interface{} = nonGxFields + if g == nil { + g = make(map[string]interface{}) + } + + for v, k := range f { + g[v] = k + } + out, err := json.MarshalIndent(g, "", " ") if err != nil { return err } diff --git a/gxutil/pm.go b/gxutil/pm.go index 725d202..a179b3e 100644 --- a/gxutil/pm.go +++ b/gxutil/pm.go @@ -184,11 +184,6 @@ func writePkgHook(dir, hook string) error { func (pm *PM) InitPkg(dir, name, lang string, setup func(*Package)) error { // check for existing packagefile - p := filepath.Join(dir, PkgFileName) - _, err := os.Stat(p) - if err == nil { - return errors.New("package file already exists in working dir") - } username := pm.cfg.User.Name if username == "" { @@ -208,6 +203,11 @@ func (pm *PM) InitPkg(dir, name, lang string, setup func(*Package)) error { GxVersion: GxVersion, }, } + p := filepath.Join(dir, PkgFileName) + _, err := os.Stat(p) + if err == nil { + LoadPackageFile(pkg, PkgFileName) + } if setup != nil { setup(pkg) @@ -216,7 +216,7 @@ func (pm *PM) InitPkg(dir, name, lang string, setup func(*Package)) error { // check if the user has a tool installed for the selected language CheckForHelperTools(lang) - err = SavePackageFile(pkg, p) + err = SavePackageFile(pkg, p, pkg.NonGxFields) if err != nil { return err } diff --git a/main.go b/main.go index f8640d5..8fff5cb 100644 --- a/main.go +++ b/main.go @@ -204,7 +204,7 @@ var ImportCommand = cli.Command{ } pkg.Dependencies = append(pkg.Dependencies, ndep) - err = gx.SavePackageFile(pkg, PkgFileName) + err = gx.SavePackageFile(pkg, PkgFileName, pkg.NonGxFields) if err != nil { log.Fatal("writing pkgfile: %s", err) } @@ -283,7 +283,7 @@ var InstallCommand = cli.Command{ } if save { - err := gx.SavePackageFile(pkg, PkgFileName) + err := gx.SavePackageFile(pkg, PkgFileName, pkg.NonGxFields) if err != nil { log.Fatal(err) } @@ -344,7 +344,12 @@ var InitCommand = cli.Command{ log.Log("initializing package %s...", pkgname) err := pm.InitPkg(cwd, pkgname, lang, func(p *gx.Package) { - p.Issues = promptUser("where should users go to report issues?") + if p.Issues == nil { + url := promptUser("where should users go to report issues?") + p.Issues = &gx.Issues{ + Url: url, + } + } }) if err != nil { @@ -444,7 +449,7 @@ continue?`, olddep.Name, olddep.Hash, npkg.Name, target) olddep.Hash = target olddep.Version = npkg.Version - err = gx.SavePackageFile(pkg, PkgFileName) + err = gx.SavePackageFile(pkg, PkgFileName, pkg.NonGxFields) if err != nil { log.Fatal("writing package file: %s", err) } @@ -513,7 +518,7 @@ EXAMPLE: } defer func() { - err := gx.SavePackageFile(pkg, PkgFileName) + err := gx.SavePackageFile(pkg, PkgFileName, pkg.NonGxFields) if err != nil { log.Fatal(err) } diff --git a/update.go b/update.go index debd794..ac0224f 100644 --- a/update.go +++ b/update.go @@ -88,7 +88,7 @@ func fetchAndUpdate(tofetch string, updates map[string]string, checked map[strin } if changed { - err := gx.SavePackageFile(pkg, filepath.Join(dir, pkg.Name, gx.PkgFileName)) + err := gx.SavePackageFile(pkg, filepath.Join(dir, pkg.Name, gx.PkgFileName), pkg.NonGxFields) if err != nil { return "", err }