Add import and list commands, cleanup
Signed-off-by: jolheiser <john.olheiser@gmail.com>pull/1/head
parent
62ad64516c
commit
afe09ba524
|
@ -0,0 +1,29 @@
|
|||
# GPM
|
||||
|
||||
Go Package Mapping
|
||||
|
||||
### Motivation
|
||||
|
||||
I personally use a lot of nice libraries in Go, but every time I start a new project I have to go hunting for import paths again!
|
||||
|
||||
Enter GPM, a glorified mapping of simple names to go-get imports.
|
||||
|
||||
For example, I use [urfave/cli](https://github.com/urfave/cli) for all of my CLI projects. I've used it enough times to remember the import path, but let's say I didn't.
|
||||
Using either a GPM server or local config, I can instead `gpm get cli` which finds `cli` in my map and runs `go get github.com/urfave/cli/v2`.
|
||||
|
||||
### Commands
|
||||
|
||||
* `add` - Add a local package
|
||||
* `remove` - Remove a local package
|
||||
* `list` - List local packages
|
||||
* `config` - Change local configuration (GPM server)
|
||||
* `export` - Export local packages to JSON
|
||||
* `import` - Import JSON to local packages
|
||||
|
||||
|
||||
### Server
|
||||
|
||||
If GPM doesn't find a package locally, it can call out to a configurable [gpm server](https://gitea.com/jolheiser/gpm-server) to find a package there.
|
||||
This makes it much simpler to have a central library of packages rather than exporting and importing between environments.
|
||||
|
||||
The `import` and `export` commands should work between the CLI and server for easy transitions.
|
36
cmd/add.go
36
cmd/add.go
|
@ -1,27 +1,29 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gitea.com/gpm/gpm/modules/config"
|
||||
"gitea.com/jolheiser/beaver"
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"github.com/urfave/cli/v2"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var Add = cli.Command{
|
||||
Name: "add",
|
||||
Usage: "Add a gpm package",
|
||||
Usage: "Add a package",
|
||||
Flags: []cli.Flag{
|
||||
&cli.BoolFlag{
|
||||
Name: "force",
|
||||
Aliases: []string{"f"},
|
||||
Usage: "Overwrite if the package already exists",
|
||||
Usage: "Overwrite existing package without prompt",
|
||||
},
|
||||
},
|
||||
Action: doAdd,
|
||||
}
|
||||
|
||||
var vPattern = regexp.MustCompile(`v\d+$`)
|
||||
|
||||
func doAdd(ctx *cli.Context) error {
|
||||
|
||||
goGetQuestion := &survey.Input{
|
||||
|
@ -36,7 +38,7 @@ func doAdd(ctx *cli.Context) error {
|
|||
goGet := strings.Split(goGetAnswer, "/")
|
||||
defaultName := goGet[len(goGet)-1]
|
||||
// Check if go-get is actually pointing to a versioned module
|
||||
if strings.HasPrefix(defaultName, "v") {
|
||||
if vPattern.MatchString(defaultName) {
|
||||
defaultName = goGet[len(goGet)-2]
|
||||
}
|
||||
|
||||
|
@ -54,31 +56,7 @@ func doAdd(ctx *cli.Context) error {
|
|||
Name: nameAnswer,
|
||||
Import: goGetAnswer,
|
||||
}
|
||||
if !ctx.Bool("force") {
|
||||
for idx, p := range config.Packages {
|
||||
if strings.EqualFold(p.Name, nameAnswer) {
|
||||
forceQuestion := &survey.Confirm{
|
||||
Message: "This package already exists, do you want to overwrite?",
|
||||
Default: false,
|
||||
}
|
||||
var force bool
|
||||
|
||||
if err := survey.AskOne(forceQuestion, &force); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !force {
|
||||
return fmt.Errorf("leaving package `%s` as-is", nameAnswer)
|
||||
}
|
||||
|
||||
config.Packages[idx] = pkg
|
||||
break
|
||||
}
|
||||
}
|
||||
config.Packages = append(config.Packages, pkg)
|
||||
} else {
|
||||
config.Packages = append(config.Packages, pkg)
|
||||
}
|
||||
config.AddPackages(ctx.Bool("force"), pkg)
|
||||
|
||||
if err := config.Save(); err != nil {
|
||||
return err
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
var Config = cli.Command{
|
||||
Name: "config",
|
||||
Aliases: []string{"cfg"},
|
||||
Usage: "Configure local gpm",
|
||||
Action: doConfig,
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
|
||||
var Export = cli.Command{
|
||||
Name: "export",
|
||||
Usage: "Export local gpm packages",
|
||||
Usage: "Export JSON for local packages",
|
||||
Action: doExport,
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ import (
|
|||
|
||||
var Get = cli.Command{
|
||||
Name: "get",
|
||||
Usage: "Get gpm package(s)",
|
||||
Usage: "Get package(s)",
|
||||
Flags: []cli.Flag{
|
||||
&cli.BoolFlag{
|
||||
Name: "ignore-local",
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"gitea.com/gpm/gpm/modules/config"
|
||||
"gitea.com/jolheiser/beaver"
|
||||
"github.com/urfave/cli/v2"
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
var Import = cli.Command{
|
||||
Name: "import",
|
||||
Usage: "Import JSON for local packages",
|
||||
Flags: []cli.Flag{
|
||||
&cli.BoolFlag{
|
||||
Name: "force",
|
||||
Aliases: []string{"f"},
|
||||
Usage: "Overwrite any existing packages without prompt",
|
||||
},
|
||||
},
|
||||
Action: doImport,
|
||||
}
|
||||
|
||||
func doImport(ctx *cli.Context) error {
|
||||
files := ctx.Args().Slice()
|
||||
if len(files) == 0 {
|
||||
return errors.New("must provide a list of JSON files to import from")
|
||||
}
|
||||
|
||||
for _, file := range files {
|
||||
body, err := ioutil.ReadFile(file)
|
||||
if err != nil {
|
||||
beaver.Error(err)
|
||||
continue
|
||||
}
|
||||
|
||||
var cfg config.Config
|
||||
if err := json.Unmarshal(body, &cfg); err != nil {
|
||||
beaver.Error(err)
|
||||
continue
|
||||
}
|
||||
config.AddPackages(ctx.Bool("force"), cfg.Packages...)
|
||||
}
|
||||
|
||||
if err := config.Save(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
beaver.Info("Import complete")
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"gitea.com/gpm/gpm/modules/config"
|
||||
"gitea.com/jolheiser/beaver"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
var List = cli.Command{
|
||||
Name: "list",
|
||||
Aliases: []string{"l"},
|
||||
Usage: "List local packages",
|
||||
Action: doList,
|
||||
}
|
||||
|
||||
func doList(ctx *cli.Context) error {
|
||||
for _, pkg := range config.Packages {
|
||||
beaver.Infof("%s -> %s", pkg.Name, pkg.Import)
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -10,9 +10,10 @@ import (
|
|||
)
|
||||
|
||||
var Remove = cli.Command{
|
||||
Name: "remove",
|
||||
Usage: "Remove a gpm package",
|
||||
Action: doRemove,
|
||||
Name: "remove",
|
||||
Aliases: []string{"rm"},
|
||||
Usage: "Remove a package",
|
||||
Action: doRemove,
|
||||
}
|
||||
|
||||
func doRemove(ctx *cli.Context) error {
|
||||
|
|
2
main.go
2
main.go
|
@ -20,7 +20,9 @@ func main() {
|
|||
app.Commands = []*cli.Command{
|
||||
&cmd.Add,
|
||||
&cmd.Remove,
|
||||
&cmd.List,
|
||||
&cmd.Get,
|
||||
&cmd.Import,
|
||||
&cmd.Export,
|
||||
&cmd.Config,
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"encoding/json"
|
||||
"fmt"
|
||||
"gitea.com/jolheiser/beaver"
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"github.com/BurntSushi/toml"
|
||||
"github.com/mitchellh/go-homedir"
|
||||
"os"
|
||||
|
@ -13,7 +14,7 @@ import (
|
|||
|
||||
var (
|
||||
configPath string
|
||||
cfg *config
|
||||
cfg *Config
|
||||
|
||||
// Config items
|
||||
|
||||
|
@ -21,7 +22,7 @@ var (
|
|||
Packages []Package
|
||||
)
|
||||
|
||||
type config struct {
|
||||
type Config struct {
|
||||
GPMURL string `toml:"gpm-url" json:"gpm_url"`
|
||||
Packages []Package `toml:"package" json:"packages"`
|
||||
}
|
||||
|
@ -95,3 +96,35 @@ func PackageMap() map[string]string {
|
|||
}
|
||||
return pkgs
|
||||
}
|
||||
|
||||
func AddPackages(force bool, pkgs ...Package) {
|
||||
for _, pkg := range pkgs {
|
||||
for idx, p := range Packages {
|
||||
if strings.EqualFold(p.Name, pkg.Name) {
|
||||
if force {
|
||||
Packages[idx] = pkg
|
||||
break
|
||||
}
|
||||
|
||||
forceQuestion := &survey.Confirm{
|
||||
Message: fmt.Sprintf("Package `%s` (%s) already exists. Overwrite with `%s`?", p.Name, p.Import, p.Import),
|
||||
Default: false,
|
||||
}
|
||||
var forceAnswer bool
|
||||
|
||||
if err := survey.AskOne(forceQuestion, &forceAnswer); err != nil {
|
||||
beaver.Error(err)
|
||||
break
|
||||
}
|
||||
|
||||
if !forceAnswer {
|
||||
beaver.Errorf("leaving package `%s` as-is", pkg.Name)
|
||||
break
|
||||
}
|
||||
|
||||
Packages[idx] = pkg
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue