DodoApp: Implement commit status page

Render used volume, postgresql and ingress resource details.

Change-Id: I87f34fd19d0d0d31ec495d2798c9f5ce99c0fd43
diff --git a/core/installer/soft/repoio.go b/core/installer/soft/repoio.go
index f4c05bb..191b291 100644
--- a/core/installer/soft/repoio.go
+++ b/core/installer/soft/repoio.go
@@ -98,8 +98,8 @@
 	RepoFS
 	FullAddress() string
 	Pull() error
-	CommitAndPush(message string, opts ...PushOption) error
-	Do(op DoFn, opts ...DoOption) error
+	CommitAndPush(message string, opts ...PushOption) (string, error)
+	Do(op DoFn, opts ...DoOption) (string, error)
 }
 
 type repoFS struct {
@@ -190,32 +190,33 @@
 	return nil
 }
 
-func (r *repoIO) CommitAndPush(message string, opts ...PushOption) error {
+func (r *repoIO) CommitAndPush(message string, opts ...PushOption) (string, error) {
 	var o pushOptions
 	for _, i := range opts {
 		i(&o)
 	}
 	wt, err := r.repo.Worktree()
 	if err != nil {
-		return err
+		return "", err
 	}
 	if err := wt.AddGlob("*"); err != nil {
-		return err
+		return "", err
 	}
 	st, err := wt.Status()
 	if err != nil {
-		return err
+		return "", err
 	}
 	if len(st) == 0 {
-		return nil // TODO(gio): maybe return ErrorNothingToCommit
+		return "", nil // TODO(gio): maybe return ErrorNothingToCommit
 	}
-	if _, err := wt.Commit(message, &git.CommitOptions{
+	hash, err := wt.Commit(message, &git.CommitOptions{
 		Author: &object.Signature{
 			Name: "pcloud-installer",
 			When: time.Now(),
 		},
-	}); err != nil {
-		return err
+	})
+	if err != nil {
+		return "", err
 	}
 	gopts := &git.PushOptions{
 		RemoteName: "origin",
@@ -227,10 +228,10 @@
 	if o.Force {
 		gopts.Force = true
 	}
-	return r.repo.Push(gopts)
+	return hash.String(), r.repo.Push(gopts)
 }
 
-func (r *repoIO) Do(op DoFn, opts ...DoOption) error {
+func (r *repoIO) Do(op DoFn, opts ...DoOption) (string, error) {
 	o := &doOptions{}
 	for _, i := range opts {
 		i(o)
@@ -241,15 +242,15 @@
 	}
 	if !o.NoPull {
 		if err := r.pullWithoutLock(); err != nil {
-			return err
+			return "", err
 		}
 	}
 	msg, err := op(r)
 	if err != nil {
-		return err
+		return "", err
 	}
 	if o.NoCommit {
-		return nil
+		return "", nil
 	}
 	popts := []PushOption{}
 	if o.Force {