Explorar o código

gitutils: remove checkout directory on error

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Tonis Tiigi %!s(int64=7) %!d(string=hai) anos
pai
achega
4ea320cb8e

+ 9 - 3
builder/remotecontext/git/gitutils.go

@@ -32,7 +32,7 @@ func Clone(remoteURL string) (string, error) {
 	return cloneGitRepo(repo)
 	return cloneGitRepo(repo)
 }
 }
 
 
-func cloneGitRepo(repo gitRepo) (string, error) {
+func cloneGitRepo(repo gitRepo) (checkoutDir string, err error) {
 	fetch := fetchArgs(repo.remote, repo.ref)
 	fetch := fetchArgs(repo.remote, repo.ref)
 
 
 	root, err := ioutil.TempDir("", "docker-build-git")
 	root, err := ioutil.TempDir("", "docker-build-git")
@@ -40,6 +40,12 @@ func cloneGitRepo(repo gitRepo) (string, error) {
 		return "", err
 		return "", err
 	}
 	}
 
 
+	defer func() {
+		if err != nil {
+			os.RemoveAll(root)
+		}
+	}()
+
 	if out, err := gitWithinDir(root, "init"); err != nil {
 	if out, err := gitWithinDir(root, "init"); err != nil {
 		return "", errors.Wrapf(err, "failed to init repo at %s: %s", root, out)
 		return "", errors.Wrapf(err, "failed to init repo at %s: %s", root, out)
 	}
 	}
@@ -54,7 +60,7 @@ func cloneGitRepo(repo gitRepo) (string, error) {
 		return "", errors.Wrapf(err, "error fetching: %s", output)
 		return "", errors.Wrapf(err, "error fetching: %s", output)
 	}
 	}
 
 
-	root, err = checkoutGit(root, repo.ref, repo.subdir)
+	checkoutDir, err = checkoutGit(root, repo.ref, repo.subdir)
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err
 	}
 	}
@@ -66,7 +72,7 @@ func cloneGitRepo(repo gitRepo) (string, error) {
 		return "", errors.Wrapf(err, "error initializing submodules: %s", output)
 		return "", errors.Wrapf(err, "error initializing submodules: %s", output)
 	}
 	}
 
 
-	return root, nil
+	return checkoutDir, nil
 }
 }
 
 
 func parseRemoteURL(remoteURL string) (gitRepo, error) {
 func parseRemoteURL(remoteURL string) (gitRepo, error) {

+ 10 - 10
builder/remotecontext/git/gitutils_test.go

@@ -234,17 +234,17 @@ func TestCheckoutGit(t *testing.T) {
 		if c.fail {
 		if c.fail {
 			assert.Error(t, err)
 			assert.Error(t, err)
 			continue
 			continue
-		} else {
+		}
+		require.NoError(t, err)
+		defer os.RemoveAll(r)
+		if c.submodule {
+			b, err := ioutil.ReadFile(filepath.Join(r, "sub/subfile"))
 			require.NoError(t, err)
 			require.NoError(t, err)
-			if c.submodule {
-				b, err := ioutil.ReadFile(filepath.Join(r, "sub/subfile"))
-				require.NoError(t, err)
-				assert.Equal(t, "subcontents", string(b))
-			} else {
-				_, err := os.Stat(filepath.Join(r, "sub/subfile"))
-				require.Error(t, err)
-				require.True(t, os.IsNotExist(err))
-			}
+			assert.Equal(t, "subcontents", string(b))
+		} else {
+			_, err := os.Stat(filepath.Join(r, "sub/subfile"))
+			require.Error(t, err)
+			require.True(t, os.IsNotExist(err))
 		}
 		}
 
 
 		b, err := ioutil.ReadFile(filepath.Join(r, "Dockerfile"))
 		b, err := ioutil.ReadFile(filepath.Join(r, "Dockerfile"))