From ef05c15f87468e0f4f1c688b0b9359cee2181c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 10 Feb 2021 18:22:21 +0100 Subject: [PATCH] entity: implement remove --- entity/dag/entity_actions.go | 28 ++++++++++++++++++++++++++-- entity/dag/entity_actions_test.go | 25 +++++++++++++++++++++++++ repository/repo.go | 1 + repository/repo_testing.go | 4 ++++ 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/entity/dag/entity_actions.go b/entity/dag/entity_actions.go index 6f6fe45ce7ffcef40274f80ee11bf9ae83c1e850..fa50473cde906df035a3d8aa1080b76d55762369 100644 --- a/entity/dag/entity_actions.go +++ b/entity/dag/entity_actions.go @@ -228,6 +228,30 @@ func merge(def Definition, repo repository.ClockedRepo, remoteRef string, author return entity.NewMergeUpdatedStatus(id, localEntity) } -func Remove() error { - panic("") +// Remove delete an Entity. +// Remove is idempotent. +func Remove(def Definition, repo repository.ClockedRepo, id entity.Id) error { + var matches []string + + ref := fmt.Sprintf("refs/%s/%s", def.namespace, id.String()) + matches = append(matches, ref) + + remotes, err := repo.GetRemotes() + if err != nil { + return err + } + + for remote := range remotes { + ref = fmt.Sprintf("refs/remotes/%s/%s/%s", remote, def.namespace, id.String()) + matches = append(matches, ref) + } + + for _, ref = range matches { + err = repo.RemoveRef(ref) + if err != nil { + return err + } + } + + return nil } diff --git a/entity/dag/entity_actions_test.go b/entity/dag/entity_actions_test.go index 78baf41fee70697f144b30a64579b6bc7d2917a0..79afe525c07e755b57420a5cfc554d27bc10cc56 100644 --- a/entity/dag/entity_actions_test.go +++ b/entity/dag/entity_actions_test.go @@ -385,3 +385,28 @@ func TestMerge(t *testing.T) { // fast-forward assertEqualRefs(t, repoA, repoB, "refs/"+def.namespace) } + +func TestRemove(t *testing.T) { + repoA, repoB, remote, id1, _, def := makeTestContextRemote(t) + defer repository.CleanupTestRepos(repoA, repoB, remote) + + e := New(def) + e.Append(newOp1(id1, "foo")) + require.NoError(t, e.Commit(repoA)) + + _, err := Push(def, repoA, "remote") + require.NoError(t, err) + + err = Remove(def, repoA, e.Id()) + require.NoError(t, err) + + _, err = Read(def, repoA, e.Id()) + require.Error(t, err) + + _, err = readRemote(def, repoA, "remote", e.Id()) + require.Error(t, err) + + // Remove is idempotent + err = Remove(def, repoA, e.Id()) + require.NoError(t, err) +} diff --git a/repository/repo.go b/repository/repo.go index 8d162c6d9dbb1249c9ad53f94998d3acba140dd0..80bb7ce7e5fc65ad35036d2e9de10bddc13998ac 100644 --- a/repository/repo.go +++ b/repository/repo.go @@ -147,6 +147,7 @@ type RepoData interface { UpdateRef(ref string, hash Hash) error // RemoveRef will remove a Git reference + // RemoveRef is idempotent. RemoveRef(ref string) error // ListRefs will return a list of Git ref matching the given refspec diff --git a/repository/repo_testing.go b/repository/repo_testing.go index cdcb9008067b41bd1070c0502e97612cb70201a9..1f80d89871a1dae9419fa7cd278f14522454a1db 100644 --- a/repository/repo_testing.go +++ b/repository/repo_testing.go @@ -202,6 +202,10 @@ func RepoDataTest(t *testing.T, repo RepoData) { err = repo.RemoveRef("refs/bugs/ref1") require.NoError(t, err) + + // RemoveRef is idempotent + err = repo.RemoveRef("refs/bugs/ref1") + require.NoError(t, err) } func RepoDataSignatureTest(t *testing.T, repo RepoData) {