diff options
author | Koni Marti <koni.marti@gmail.com> | 2023-11-24 16:03:04 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-12-30 15:42:09 +0100 |
commit | 41e066768c18268fe3deecc60b5797e26f44cf4e (patch) | |
tree | e3e14165ef3a5308d9205bc8f6d4f1831ec654c8 /lib/pama/pama_test.go | |
parent | cf47763e5582563f712b4a40a9b299378aba9003 (diff) | |
download | aerc-41e066768c18268fe3deecc60b5797e26f44cf4e.tar.gz |
patch/remove: add remove sub-cmd
Implement the :patch remove command. Remove a patch set from the
respository and from the internal storage. Note that in git, this will
change all commit hashes that appear after the removed one since the
commit hash depends on its parents. Adjust the code to handle such cases
and add tests for this.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib/pama/pama_test.go')
-rw-r--r-- | lib/pama/pama_test.go | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/lib/pama/pama_test.go b/lib/pama/pama_test.go new file mode 100644 index 00000000..7a4d1961 --- /dev/null +++ b/lib/pama/pama_test.go @@ -0,0 +1,166 @@ +package pama_test + +import ( + "errors" + + "git.sr.ht/~rjarry/aerc/lib/pama" + "git.sr.ht/~rjarry/aerc/lib/pama/models" +) + +var errNotFound = errors.New("not found") + +func newCommit(id, subj, tag string) models.Commit { + return models.Commit{ID: id, Subject: subj, Tag: tag} +} + +func newTestManager( + commits []string, + subjects []string, + data map[string]models.Project, + current string, +) (pama.PatchManager, models.RevisionController, models.PersistentStorer) { + rc := mockRevctrl{ + commitIDs: commits, + titles: subjects, + } + store := mockStore{ + data: data, + current: current, + } + return pama.FromFunc( + nil, + func(_ string, _ string) (models.RevisionController, error) { + return &rc, nil + }, + func() models.PersistentStorer { + return &store + }, + ), &rc, &store +} + +type mockRevctrl struct { + commitIDs []string + titles []string +} + +func (c *mockRevctrl) Support() bool { + return true +} + +func (c *mockRevctrl) Clean() bool { + return true +} + +func (c *mockRevctrl) Root() (string, error) { + return "", nil +} + +func (c *mockRevctrl) Head() (string, error) { + return c.commitIDs[len(c.commitIDs)-1], nil +} + +func (c *mockRevctrl) History(commit string) ([]string, error) { + for i, s := range c.commitIDs { + if s == commit { + cp := make([]string, len(c.commitIDs[i+1:])) + copy(cp, c.commitIDs[i+1:]) + return cp, nil + } + } + return nil, errNotFound +} + +func (c *mockRevctrl) Exists(commit string) bool { + for _, s := range c.commitIDs { + if s == commit { + return true + } + } + return false +} + +func (c *mockRevctrl) Subject(commit string) string { + for i, s := range c.commitIDs { + if s == commit { + return c.titles[i] + } + } + return "" +} + +func (c *mockRevctrl) Author(commit string) string { + return "" +} + +func (c *mockRevctrl) Date(commit string) string { + return "" +} + +func (c *mockRevctrl) Remove(commit string) error { + for i, s := range c.commitIDs { + if s == commit { + c.commitIDs = append(c.commitIDs[:i], c.commitIDs[i+1:]...) + c.titles = append(c.titles[:i], c.titles[i+1:]...) + // modify commitIDs to simulate a "real" change in + // commit history that will also change all subsequent + // commitIDs + for j := i; j < len(c.commitIDs); j++ { + c.commitIDs[j] += "_new" + } + return nil + } + } + return errNotFound +} + +func (c *mockRevctrl) ApplyCmd() string { + return "" +} + +type mockStore struct { + data map[string]models.Project + current string +} + +func (s *mockStore) StoreProject(p models.Project, ow bool) error { + _, ok := s.data[p.Name] + if ok && !ow { + return errors.New("alreay there") + } + s.data[p.Name] = p + return nil +} + +func (s *mockStore) DeleteProject(name string) error { + delete(s.data, name) + return nil +} + +func (s *mockStore) CurrentName() (string, error) { + return s.current, nil +} + +func (s *mockStore) SetCurrent(c string) error { + s.current = c + return nil +} + +func (s *mockStore) Current() (models.Project, error) { + return s.data[s.current], nil +} + +func (s *mockStore) Names() ([]string, error) { + var names []string + for name := range s.data { + names = append(names, name) + } + return names, nil +} + +func (s *mockStore) Projects() ([]models.Project, error) { + var ps []models.Project + for _, p := range s.data { + ps = append(ps, p) + } + return ps, nil +} |