DodoApp: clone with submodules

Change-Id: I82d53cb91e9629cc7735f92608d9b0ddaef9b913
diff --git a/apps/app-runner/main.go b/apps/app-runner/main.go
index ee2476a..ca99831 100644
--- a/apps/app-runner/main.go
+++ b/apps/app-runner/main.go
@@ -28,7 +28,7 @@
 }
 
 func CloneRepository(addr string, signer ssh.Signer, path string) error {
-	_, err := git.Clone(memory.NewStorage(), osfs.New(path, osfs.WithBoundOS()), &git.CloneOptions{
+	c, err := git.Clone(memory.NewStorage(), osfs.New(path, osfs.WithBoundOS()), &git.CloneOptions{
 		URL: addr,
 		Auth: &gitssh.PublicKeys{
 			User:   "git",
@@ -41,13 +41,32 @@
 				},
 			},
 		},
-		RemoteName:        "origin",
-		ReferenceName:     "refs/heads/master",
-		Depth:             1,
-		RecurseSubmodules: git.DefaultSubmoduleRecursionDepth,
-		ShallowSubmodules: true,
-		InsecureSkipTLS:   true,
+		RemoteName:      "origin",
+		ReferenceName:   "refs/heads/master",
+		SingleBranch:    true,
+		Depth:           1,
+		InsecureSkipTLS: true,
+		Progress:        os.Stdout,
 	})
+	if err != nil {
+		return err
+	}
+	wt, err := c.Worktree()
+	if err != nil {
+		return err
+	}
+	sb, err := wt.Submodules()
+	if err != nil {
+		return err
+	}
+	if err := sb.Init(); err != nil {
+		return err
+	}
+	if err := sb.Update(&git.SubmoduleUpdateOptions{
+		Depth: 1,
+	}); err != nil {
+		return err
+	}
 	return err
 }
 
diff --git a/core/installer/soft/client.go b/core/installer/soft/client.go
index 08103be..1c93666 100644
--- a/core/installer/soft/client.go
+++ b/core/installer/soft/client.go
@@ -205,6 +205,7 @@
 		},
 		RemoteName:      "origin",
 		ReferenceName:   "refs/heads/master",
+		SingleBranch:    true,
 		Depth:           1,
 		InsecureSkipTLS: true,
 		Progress:        os.Stdout,
@@ -212,6 +213,22 @@
 	if err != nil && !errors.Is(err, transport.ErrEmptyRemoteRepository) {
 		return nil, err
 	}
+	wt, err := c.Worktree()
+	if err != nil {
+		return nil, err
+	}
+	sb, err := wt.Submodules()
+	if err != nil {
+		return nil, err
+	}
+	if err := sb.Init(); err != nil {
+		return nil, err
+	}
+	if err := sb.Update(&git.SubmoduleUpdateOptions{
+		Depth: 1,
+	}); err != nil {
+		return nil, err
+	}
 	return &Repository{
 		Repository: c,
 		Addr:       addr,
diff --git a/core/installer/soft/repoio.go b/core/installer/soft/repoio.go
index 6df9dcd..7df75dc 100644
--- a/core/installer/soft/repoio.go
+++ b/core/installer/soft/repoio.go
@@ -172,7 +172,7 @@
 		return nil
 	}
 	// TODO(gio): check `remote repository is empty`
-	fmt.Println(err)
+	fmt.Printf("-- GIT PULL: %s\n", err.Error())
 	return nil
 }