Rearrange some code, adds pm av
This commit is contained in:
parent
74d360f6d7
commit
dd3fecc699
12
available.go
12
available.go
@ -9,8 +9,20 @@ import (
|
|||||||
// Name exists to document the keys in Available
|
// Name exists to document the keys in Available
|
||||||
type Name string
|
type Name string
|
||||||
|
|
||||||
|
type Names []Name
|
||||||
|
|
||||||
|
func (n Names) Len() int { return len(n) }
|
||||||
|
func (n Names) Swap(a, b int) { n[a], n[b] = n[b], n[a] }
|
||||||
|
func (n Names) Less(a, b int) bool { return n[a] < n[b] }
|
||||||
|
|
||||||
// Version exists to document the keys in Available
|
// Version exists to document the keys in Available
|
||||||
type Version string
|
type Version string
|
||||||
|
type Versions []Version
|
||||||
|
|
||||||
|
// TODO (sm): make this semver sort?
|
||||||
|
func (n Versions) Len() int { return len(n) }
|
||||||
|
func (n Versions) Swap(a, b int) { n[a], n[b] = n[b], n[a] }
|
||||||
|
func (n Versions) Less(a, b int) bool { return n[a] < n[b] }
|
||||||
|
|
||||||
// Available is the structure used to represent the collection of all packages
|
// Available is the structure used to represent the collection of all packages
|
||||||
// that can be installed.
|
// that can be installed.
|
||||||
|
@ -8,14 +8,15 @@ import (
|
|||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"mcquay.me/fs"
|
"mcquay.me/fs"
|
||||||
|
"mcquay.me/pm/db"
|
||||||
"mcquay.me/pm/keyring"
|
"mcquay.me/pm/keyring"
|
||||||
"mcquay.me/pm/pkg"
|
"mcquay.me/pm/pkg"
|
||||||
"mcquay.me/pm/remote"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const usage = `pm: simple, cross-platform system package manager
|
const usage = `pm: simple, cross-platform system package manager
|
||||||
|
|
||||||
subcommands:
|
subcommands:
|
||||||
|
available (av) -- print out all installable packages
|
||||||
environ (env) -- print environment information
|
environ (env) -- print environment information
|
||||||
keyring (key) -- interact with pm's OpenPGP keyring
|
keyring (key) -- interact with pm's OpenPGP keyring
|
||||||
package (pkg) -- create packages
|
package (pkg) -- create packages
|
||||||
@ -193,25 +194,29 @@ func main() {
|
|||||||
if len(args) < 1 {
|
if len(args) < 1 {
|
||||||
fatalf("missing arg\n\nusage: pm remote add [<uris>]\n")
|
fatalf("missing arg\n\nusage: pm remote add [<uris>]\n")
|
||||||
}
|
}
|
||||||
if err := remote.Add(root, args); err != nil {
|
if err := db.AddRemotes(root, args); err != nil {
|
||||||
fatalf("remote add: %v\n", err)
|
fatalf("remote add: %v\n", err)
|
||||||
}
|
}
|
||||||
case "rm":
|
case "rm":
|
||||||
if len(args) < 1 {
|
if len(args) < 1 {
|
||||||
fatalf("missing arg\n\nusage: pm remote rm [<uris>]\n")
|
fatalf("missing arg\n\nusage: pm remote rm [<uris>]\n")
|
||||||
}
|
}
|
||||||
if err := remote.Remove(root, args); err != nil {
|
if err := db.RemoveRemotes(root, args); err != nil {
|
||||||
fatalf("remote remove: %v\n", err)
|
fatalf("remote remove: %v\n", err)
|
||||||
}
|
}
|
||||||
case "ls":
|
case "ls":
|
||||||
if err := remote.List(root, os.Stdout); err != nil {
|
if err := db.ListRemotes(root, os.Stdout); err != nil {
|
||||||
fatalf("list: %v\n", err)
|
fatalf("list: %v\n", err)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
fatalf("unknown package subcommand: %q\n\nusage: %v", sub, remoteUsage)
|
fatalf("unknown package subcommand: %q\n\nusage: %v", sub, remoteUsage)
|
||||||
}
|
}
|
||||||
case "pull":
|
case "pull":
|
||||||
if err := remote.Pull(root); err != nil {
|
if err := db.Pull(root); err != nil {
|
||||||
|
fatalf("pulling available packages: %v\n", err)
|
||||||
|
}
|
||||||
|
case "available", "av":
|
||||||
|
if err := db.ListAvailable(root, os.Stdout); err != nil {
|
||||||
fatalf("pulling available packages: %v\n", err)
|
fatalf("pulling available packages: %v\n", err)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
package remote
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"sort"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"mcquay.me/fs"
|
||||||
"mcquay.me/pm"
|
"mcquay.me/pm"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -46,6 +50,52 @@ func Pull(root string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListAvailable prints all installable packages
|
||||||
|
func ListAvailable(root string, w io.Writer) error {
|
||||||
|
db, err := loadAvailable(root)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "loading")
|
||||||
|
}
|
||||||
|
names := pm.Names{}
|
||||||
|
nvs := map[pm.Name]pm.Versions{}
|
||||||
|
for n, vers := range db {
|
||||||
|
names = append(names, n)
|
||||||
|
for v := range vers {
|
||||||
|
nvs[n] = append(nvs[n], v)
|
||||||
|
}
|
||||||
|
sort.Sort(nvs[n])
|
||||||
|
}
|
||||||
|
sort.Sort(names)
|
||||||
|
|
||||||
|
for _, n := range names {
|
||||||
|
for _, v := range nvs[n] {
|
||||||
|
m := db[n][v]
|
||||||
|
fmt.Fprintf(w, "%v\t%v\t%v\n", m.Name, m.Version, m.Remote.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadAvailable(root string) (pm.Available, error) {
|
||||||
|
r := pm.Available{}
|
||||||
|
dbn := filepath.Join(root, rn)
|
||||||
|
|
||||||
|
if !fs.Exists(dbn) {
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Open(filepath.Join(root, an))
|
||||||
|
if err != nil {
|
||||||
|
return r, errors.Wrap(err, "open")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := json.NewDecoder(f).Decode(&r); err != nil {
|
||||||
|
return r, errors.Wrap(err, "decoding db")
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
func saveAvailable(root string, db pm.Available) error {
|
func saveAvailable(root string, db pm.Available) error {
|
||||||
f, err := os.Create(filepath.Join(root, an))
|
f, err := os.Create(filepath.Join(root, an))
|
||||||
if err != nil {
|
if err != nil {
|
@ -1,4 +1,4 @@
|
|||||||
package remote
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@ -17,8 +17,8 @@ type DB []url.URL
|
|||||||
|
|
||||||
const rn = "var/lib/pm/remotes.json"
|
const rn = "var/lib/pm/remotes.json"
|
||||||
|
|
||||||
// Add appends the provided uri to the list of configured remotes.
|
// AddRemotes appends the provided uri to the list of configured remotes.
|
||||||
func Add(root string, uris []string) error {
|
func AddRemotes(root string, uris []string) error {
|
||||||
db, err := load(root)
|
db, err := load(root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "loading")
|
return errors.Wrap(err, "loading")
|
||||||
@ -46,8 +46,8 @@ func Add(root string, uris []string) error {
|
|||||||
return save(root, db)
|
return save(root, db)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes the given uri from the list of configured remotes.
|
// RemoveRemotes removes the given uri from the list of configured remotes.
|
||||||
func Remove(root string, uris []string) error {
|
func RemoveRemotes(root string, uris []string) error {
|
||||||
db, err := load(root)
|
db, err := load(root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "loading")
|
return errors.Wrap(err, "loading")
|
||||||
@ -79,8 +79,8 @@ func Remove(root string, uris []string) error {
|
|||||||
return save(root, o)
|
return save(root, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
// List prints all configured remotes to w.
|
// ListRemotes prints all configured remotes to w.
|
||||||
func List(root string, w io.Writer) error {
|
func ListRemotes(root string, w io.Writer) error {
|
||||||
db, err := load(root)
|
db, err := load(root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "loading")
|
return errors.Wrap(err, "loading")
|
@ -1,4 +1,4 @@
|
|||||||
package remote
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -46,7 +46,7 @@ func TestAdd(t *testing.T) {
|
|||||||
"http\ns://\nFoo|n",
|
"http\ns://\nFoo|n",
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := Add(root, bad); err == nil {
|
if err := AddRemotes(root, bad); err == nil {
|
||||||
t.Fatalf("didn't detect bad url")
|
t.Fatalf("didn't detect bad url")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ func TestAdd(t *testing.T) {
|
|||||||
"https://pm.mcquay.me/darwin/amd64",
|
"https://pm.mcquay.me/darwin/amd64",
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := Add(root, uris); err != nil {
|
if err := AddRemotes(root, uris); err != nil {
|
||||||
t.Fatalf("add: %v", err)
|
t.Fatalf("add: %v", err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user