rename createParentDirs and make it only creating a result in case directories are actually created

This commit is contained in:
ansgarz 2022-05-28 22:54:24 +02:00
parent 3f9121f8f5
commit 0f5afd9825
2 changed files with 38 additions and 9 deletions

View file

@ -96,7 +96,7 @@ fun Prov.createFile(
val file = File(fullyQualifiedFilename) val file = File(fullyQualifiedFilename)
if (createDirIfMissing) { if (createDirIfMissing) {
createParentDir(file, sudo) createParentDirs(file, sudo)
} }
posixFilePermission?.let { posixFilePermission?.let {
@ -324,8 +324,10 @@ fun Prov.createDirs(
fun Prov.deleteDir(dir: String, path: String, sudo: Boolean = false): ProvResult { fun Prov.deleteDir(dir: String, path: String, sudo: Boolean = false): ProvResult {
if ("" == path) // parameter "path" must not be empty in order to prevent accidental deletion of a directory in the wrong path
if ("" == path) {
throw RuntimeException("In deleteDir: path must not be empty.") throw RuntimeException("In deleteDir: path must not be empty.")
}
val cmd = "cd $path && rmdir $dir" val cmd = "cd $path && rmdir $dir"
return if (!sudo) { return if (!sudo) {
cmd(cmd) cmd(cmd)
@ -348,7 +350,7 @@ fun Prov.createSymlink(
createLinkDirIfMissing: Boolean = true, createLinkDirIfMissing: Boolean = true,
): ProvResult = task { ): ProvResult = task {
if (createLinkDirIfMissing) { if (createLinkDirIfMissing) {
createParentDir(link, sudo) createParentDirs(link, sudo)
} }
val overwriteFlag = if (overwriteIfExisting) "f" else "" val overwriteFlag = if (overwriteIfExisting) "f" else ""
cmd("ln -s$overwriteFlag $originalFile $link", sudo = sudo) cmd("ln -s$overwriteFlag $originalFile $link", sudo = sudo)
@ -376,12 +378,18 @@ fun Prov.userHome(): String {
/** /**
* Creates the parent-dir (parent path) of the specified file if parent-dir id not yet existing * Creates the parent-dir (parent path) of the specified file if parent-dir id not yet existing
*/ */
internal fun Prov.createParentDir(file: File, sudo: Boolean = false) = task { internal fun Prov.createParentDirs(file: File, sudo: Boolean = false) {
// This method is not defined itself as a Prov task as its main purpose is to check if the parent dir needs to be created,
// and this check needs neither to be included in the overall result nor being listed in the results report.
// But if directories need to be created, the creation itself is placed within the task "createParentDirs"
// in order to be included in the results.
val dir = file.parent?.toString() val dir = file.parent?.toString()
if (dir != null && dir != "" && !checkDir(dir, sudo = sudo)) { if (dir != null && dir != "" && !checkDir(dir, sudo = sudo)) {
task("createParentDirs") {
createDirs(dir, sudo = sudo) createDirs(dir, sudo = sudo)
} }
}
} }
/** /**

View file

@ -396,21 +396,42 @@ internal class FilesystemKtTest {
// given // given
val prov = defaultTestContainer() val prov = defaultTestContainer()
val filename = "parent_dir/test/file" val filename = "parent_dir/test/file"
prov.deleteDir("test", "parent_dir")
prov.deleteDir("parent_dir", "~/")
// when // when
val res = prov.createParentDir(File(filename)) prov.createParentDirs(File(filename))
val dirExists = prov.checkDir("parent_dir/test") val dirExists = prov.checkDir("parent_dir/test")
val res2 = prov.createParentDir(File(filename)) // test idempotence prov.createParentDirs(File(filename)) // test idempotence
val dirExists2 = prov.checkDir("parent_dir/test") val dirExists2 = prov.checkDir("parent_dir/test")
// then // then
assertTrue(res.success)
assertTrue(dirExists) assertTrue(dirExists)
assertTrue(res2.success)
assertTrue(dirExists2) assertTrue(dirExists2)
} }
@ContainerTest
fun test_createParentDir_with_sudo() {
// given
val prov = defaultTestContainer()
val filename = "/parent_dir_sudo/test_sudo/file"
prov.deleteDir("test_sudo", "/parent_dir_sudo", sudo = true)
prov.deleteDir("parent_dir_sudo", "/", sudo = true)
// when
prov.task { createParentDirs(File(filename), sudo = true) }
val dirExists = prov.checkDir("/parent_dir_sudo/test_sudo", sudo = true)
// test idempotence
prov.task { createParentDirs(File(filename), sudo = true) } // include in task in order to output a result summary
val dirExists2 = prov.checkDir("/parent_dir_sudo/test_sudo", sudo = true)
// then
assertTrue(dirExists)
assertTrue(dirExists2)
}
@ContainerTest @ContainerTest
fun test_createLink_without_dir() { fun test_createLink_without_dir() {
// given // given