diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/Git.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/Git.kt index 8f36731..6f412c7 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/Git.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/Git.kt @@ -8,22 +8,33 @@ import org.domaindrivenarchitecture.provs.framework.ubuntu.keys.base.trustHost import java.io.File -fun Prov.gitClone(repo: String, path: String, pullIfExisting: Boolean = true): ProvResult = task { - val dir = cmdNoEval("basename $repo .git").out?.trim() - - if (dir == null) { - return@task ProvResult(false, err = "$repo is not a valid git repository") - } - - val pathToDir = if (path.endsWith("/")) path + dir else path + "/" + dir - if (checkDir(pathToDir + "/.git/")) { +/** + * Clones a git repository in the specified targetPath or tries git pull if repo already existing and parameter pullIfExisting is true. + * If specified, the targetFolderName is used as basename for the repo, otherwise the basename (directory) is retrieved from repoSource + */ +fun Prov.gitClone( + repoSource: String, + targetPath: String = "", + pullIfExisting: Boolean = true, + targetFolderName: String? = null +): ProvResult = task { + // if specified, use targetFolderName as basename or otherwise retrieve basename from repoSource + val basename = targetFolderName ?: cmdNoEval("basename $repoSource .git").out?.trim() + // return err if basename could not be retrieved from repoSource + ?: return@task ProvResult(false, err = "$repoSource is not a valid git repository source path.") + + val pathWithBasename = targetPath.normalizePath() + basename + if (checkDir(pathWithBasename + "/.git/")) { if (pullIfExisting) { - cmd("cd $pathToDir && git pull") + cmd("cd $pathWithBasename && git pull") } else { - ProvResult(true, out = "Repo $repo is already existing") + ProvResult(true, out = "Repo [$pathWithBasename] already exists, but might not be up-to-date.") } } else { - cmd("cd $path && git clone $repo") + if (!checkDir(targetPath)) { + createDirs(targetPath) + } + cmd("cd $targetPath && git clone $repoSource ${targetFolderName ?: ""}") } } diff --git a/src/test/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/GitKtTest.kt b/src/test/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/GitKtTest.kt index be3f928..37c0edb 100644 --- a/src/test/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/GitKtTest.kt +++ b/src/test/kotlin/org/domaindrivenarchitecture/provs/framework/ubuntu/git/base/GitKtTest.kt @@ -1,11 +1,12 @@ package org.domaindrivenarchitecture.provs.framework.ubuntu.git.base +import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.checkDir import org.domaindrivenarchitecture.provs.framework.ubuntu.install.base.aptInstall import org.domaindrivenarchitecture.provs.framework.ubuntu.keys.base.isHostKnown import org.domaindrivenarchitecture.provs.test.defaultTestContainer import org.domaindrivenarchitecture.provs.test.tags.ContainerTest import org.domaindrivenarchitecture.provs.test.tags.ExtensiveContainerTest -import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test @@ -34,14 +35,31 @@ internal class GitKtTest { @ExtensiveContainerTest fun gitClone() { // given + val repo = "https://gitlab.com/domaindrivenarchitecture/overview.git" val prov = defaultTestContainer() - prov.aptInstall("openssh-client ssh git") + prov.aptInstall("git") // when prov.trustGithub() - val res = prov.gitClone("https://gitlab.com/domaindrivenarchitecture/overview.git", "~/") + val res1 = prov.gitClone("https://gitlab.com/domaindrivenarchitecture/not a valid basename.git", "~/") + val res2 = prov.gitClone(repo) + val res3 = prov.gitClone(repo, pullIfExisting = false) + val res4 = prov.gitClone(repo, "pathtocreate") + val res5 = prov.gitClone(repo, "pathtocreate", targetFolderName = "alternativeBasename") + val res6 = prov.gitClone(repo, "pathtocreate", targetFolderName = "alternativeBasename") + val res7 = prov.gitClone(repo, "pathtocreate", false, targetFolderName = "alternativeBasename") // then - assertTrue(res.success) + assertFalse(res1.success) + assertTrue(res2.success) + assertTrue(res3.success) + assertEquals("Repo [overview] already exists, but might not be up-to-date.", res3.out) + assertTrue(res4.success) + assertTrue(prov.checkDir("pathtocreate/overview")) + assertTrue(res5.success) + assertTrue(prov.checkDir("pathtocreate/alternativeBasename/.git")) + assertTrue(res6.success) + assertTrue(res7.success) + assertEquals("Repo [pathtocreate/alternativeBasename] already exists, but might not be up-to-date.", res7.out) } } \ No newline at end of file