aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKoni Marti <koni.marti@gmail.com>2023-11-24 16:03:01 +0100
committerRobin Jarry <robin@jarry.cc>2023-12-30 15:42:09 +0100
commitf98382d1dfc8970d3006fcc2175dd514bf7e07d0 (patch)
tree506a085a962d6d83ac223a2ad43e98a27afcc0f9
parent07c1cefcf62dbd094b6f97061c469264ee089898 (diff)
downloadaerc-f98382d1dfc8970d3006fcc2175dd514bf7e07d0.tar.gz
patch/init: add init sub-cmd
Implement the :patch init command to initialize a new project. Signed-off-by: Koni Marti <koni.marti@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r--commands/patch/init.go36
-rw-r--r--lib/pama/init.go34
-rw-r--r--lib/pama/pama.go51
3 files changed, 121 insertions, 0 deletions
diff --git a/commands/patch/init.go b/commands/patch/init.go
new file mode 100644
index 00000000..328fcd9f
--- /dev/null
+++ b/commands/patch/init.go
@@ -0,0 +1,36 @@
+package patch
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "git.sr.ht/~rjarry/aerc/lib/pama"
+)
+
+type Init struct {
+ Force bool `opt:"-f"`
+ Name string `opt:"name" required:"false"`
+}
+
+func init() {
+ register(Init{})
+}
+
+func (Init) Aliases() []string {
+ return []string{"init"}
+}
+
+func (i Init) Execute(args []string) error {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return fmt.Errorf("Could not get current directory: %w", err)
+ }
+
+ name := i.Name
+ if name == "" {
+ name = filepath.Base(cwd)
+ }
+
+ return pama.New().Init(name, cwd, i.Force)
+}
diff --git a/lib/pama/init.go b/lib/pama/init.go
new file mode 100644
index 00000000..cfb9c896
--- /dev/null
+++ b/lib/pama/init.go
@@ -0,0 +1,34 @@
+package pama
+
+import (
+ "git.sr.ht/~rjarry/aerc/lib/pama/models"
+)
+
+// Init creats a new revision control project
+func (m PatchManager) Init(name, path string, overwrite bool) error {
+ id, root, err := m.detect(path)
+ if err != nil {
+ return err
+ }
+ rc, err := m.rc(id, root)
+ if err != nil {
+ return err
+ }
+ headID, err := rc.Head()
+ if err != nil {
+ return err
+ }
+ p := models.Project{
+ Name: name,
+ Root: root,
+ RevctrlID: id,
+ Base: models.NewCommit(rc, headID, ""),
+ Commits: make([]models.Commit, 0),
+ }
+ store := m.store()
+ err = store.StoreProject(p, overwrite)
+ if err != nil {
+ return storeErr(err)
+ }
+ return storeErr(store.SetCurrent(name))
+}
diff --git a/lib/pama/pama.go b/lib/pama/pama.go
new file mode 100644
index 00000000..6fe91fee
--- /dev/null
+++ b/lib/pama/pama.go
@@ -0,0 +1,51 @@
+package pama
+
+import (
+ "fmt"
+
+ "git.sr.ht/~rjarry/aerc/lib/pama/models"
+ "git.sr.ht/~rjarry/aerc/lib/pama/revctrl"
+ "git.sr.ht/~rjarry/aerc/lib/pama/store"
+)
+
+type (
+ detectFn func(string) (string, string, error)
+ rcFn func(string, string) (models.RevisionController, error)
+ storeFn func() models.PersistentStorer
+)
+
+type PatchManager struct {
+ detect detectFn
+ rc rcFn
+ store storeFn
+}
+
+func New() PatchManager {
+ return PatchManager{
+ detect: revctrl.Detect,
+ rc: revctrl.New,
+ store: store.Store,
+ }
+}
+
+func FromFunc(d detectFn, r rcFn, s storeFn) PatchManager {
+ return PatchManager{
+ detect: d,
+ rc: r,
+ store: s,
+ }
+}
+
+func storeErr(err error) error {
+ if err == nil {
+ return nil
+ }
+ return fmt.Errorf("store error: %w", err)
+}
+
+func revErr(err error) error {
+ if err == nil {
+ return nil
+ }
+ return fmt.Errorf("revision control error: %w", err)
+}