entity: implement remove

Michael Muré created

Change summary

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(-)

Detailed changes

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
 }

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)
+}

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

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) {