Installer: Clean up RepoIO interface

Change-Id: If80d7be1460c725b7df9d1d27c9354cb9141acfe
diff --git a/core/installer/tasks/activate.go b/core/installer/tasks/activate.go
index 1333f28..dffdfbe 100644
--- a/core/installer/tasks/activate.go
+++ b/core/installer/tasks/activate.go
@@ -8,6 +8,8 @@
 	"path"
 	"strings"
 	"text/template"
+
+	"github.com/giolekva/pcloud/core/installer"
 )
 
 //go:embed env-tmpl
@@ -29,45 +31,43 @@
 			return err
 		}
 		repoHost := strings.Split(st.ssClient.Addr, ":")[0]
-		kust, err := st.repo.ReadKustomization("environments/kustomization.yaml")
-		if err != nil {
-			return err
-		}
-		kust.AddResources(env.Name)
-		tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
-		if err != nil {
-			return err
-		}
-		var knownHosts bytes.Buffer
-		for _, key := range ssPublicKeys {
-			fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
-		}
-		for _, tmpl := range tmpls.Templates() { // TODO(gio): migrate to cue
-			dstPath := path.Join("environments", env.Name, tmpl.Name())
-			dst, err := st.repo.Writer(dstPath)
+		return st.repo.Atomic(func(r installer.RepoFS) (string, error) {
+			kust, err := installer.ReadKustomization(r, "environments/kustomization.yaml")
 			if err != nil {
-				return err
+				return "", err
 			}
-			defer dst.Close()
-
-			if err := tmpl.Execute(dst, map[string]string{
-				"Name":       env.Name,
-				"PrivateKey": base64.StdEncoding.EncodeToString(st.keys.RawPrivateKey()),
-				"PublicKey":  base64.StdEncoding.EncodeToString(st.keys.RawAuthorizedKey()),
-				"RepoHost":   repoHost,
-				"RepoName":   "config",
-				"KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
-			}); err != nil {
-				return err
+			kust.AddResources(env.Name)
+			tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
+			if err != nil {
+				return "", err
 			}
-		}
-		if err := st.repo.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
-			return err
-		}
-		if err := st.repo.CommitAndPush(fmt.Sprintf("%s: initialize environment", env.Name)); err != nil {
-			return err
-		}
-		return nil
+			var knownHosts bytes.Buffer
+			for _, key := range ssPublicKeys {
+				fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
+			}
+			for _, tmpl := range tmpls.Templates() { // TODO(gio): migrate to cue
+				dstPath := path.Join("environments", env.Name, tmpl.Name())
+				dst, err := r.Writer(dstPath)
+				if err != nil {
+					return "", err
+				}
+				defer dst.Close()
+				if err := tmpl.Execute(dst, map[string]string{
+					"Name":       env.Name,
+					"PrivateKey": base64.StdEncoding.EncodeToString(st.keys.RawPrivateKey()),
+					"PublicKey":  base64.StdEncoding.EncodeToString(st.keys.RawAuthorizedKey()),
+					"RepoHost":   repoHost,
+					"RepoName":   "config",
+					"KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
+				}); err != nil {
+					return "", err
+				}
+			}
+			if err := installer.WriteYaml(r, "environments/kustomization.yaml", kust); err != nil {
+				return "", err
+			}
+			return fmt.Sprintf("%s: initialize environment", env.Name), nil
+		})
 	})
 	return &t
 }