From ee570f3b731d57600839fec7025f7f71081c6de5 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Sat, 7 May 2022 16:04:59 +0200 Subject: [PATCH 1/8] Fix #53 Unable to delete file on windows --- .../src/main/scala/com/karumi/shot/Shot.scala | 22 +++++++++++++++---- .../com/karumi/shot/domain/ShotFolder.scala | 10 +++++---- .../shot/mothers/ProjectFolderMother.scala | 4 +++- .../scala/com/karumi/shot/tasks/Tasks.scala | 3 ++- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/core/src/main/scala/com/karumi/shot/Shot.scala b/core/src/main/scala/com/karumi/shot/Shot.scala index fbd53a08..c0c76b39 100644 --- a/core/src/main/scala/com/karumi/shot/Shot.scala +++ b/core/src/main/scala/com/karumi/shot/Shot.scala @@ -123,7 +123,6 @@ class Shot( } else { console.showSuccess("✅ Yeah!!! Your tests are passing.") } - removeProjectTemporalScreenshotsFolder(shotFolder) reporter.generateVerificationReport( appId, comparison, @@ -134,6 +133,7 @@ class Shot( "🤓 You can review the execution report here: " + shotFolder .verificationReportFolder() + "index.html" ) + removeProjectTemporalScreenshotsFolder(shotFolder) comparison } } @@ -297,9 +297,23 @@ class Shot( } private def removeProjectTemporalScreenshotsFolder(shotFolder: ShotFolder): Unit = { - FileUtils.deleteDirectory(new File(shotFolder.pulledScreenshotsFolder())) - FileUtils.deleteDirectory(new File(shotFolder.pulledComposeScreenshotsFolder())) - FileUtils.deleteDirectory(new File(shotFolder.pulledComposeOrchestratedScreenshotsFolder())) + // Fix for https://github.com/pedrovgs/Shot/issues/53 + // Avoid crash when directory can't be deleted + try { + FileUtils.deleteDirectory(new File(shotFolder.pulledScreenshotsFolder())) + } catch { + case e: Throwable => println(Console.RED + s"Shot error: $e") + } + try { + FileUtils.deleteDirectory(new File(shotFolder.pulledComposeScreenshotsFolder())) + } catch { + case e: Throwable => println(Console.RED + s"Shot error: $e") + } + try { + FileUtils.deleteDirectory(new File(shotFolder.pulledComposeOrchestratedScreenshotsFolder())) + } catch { + case e: Throwable => println(Console.RED + s"Shot error: $e") + } } private def extractPicturesFromBundle(screenshotsFolder: String): Unit = { diff --git a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala index 38bf4c1d..5d9e367c 100644 --- a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala +++ b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala @@ -9,10 +9,12 @@ case class ShotFolder( private val flavor: Option[String], private val directorySuffix: Option[String], private val separator: String, - private val orchestrated: Boolean + private val orchestrated: Boolean, + private val uid: String ) { private val orchestratedSuffix = if (orchestrated) "-orchestrated" else "" + private val uidSuffix = if (uid.isEmpty) "" else s"-$uid" private def pathSuffix(): String = { s"${flavor.fold("") { s => s"$s$separator" }}" + @@ -25,15 +27,15 @@ case class ShotFolder( } def pulledScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-default$orchestratedSuffix$separator" + s"${screenshotsFolder()}screenshots-default$orchestratedSuffix$separator$uidSuffix" } def pulledComposeScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-compose-default$separator" + s"${screenshotsFolder()}screenshots-compose-default$separator$uidSuffix" } def pulledComposeOrchestratedScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-compose-default$orchestratedSuffix$separator" + s"${screenshotsFolder()}screenshots-compose-default$orchestratedSuffix$separator$uidSuffix" } def metadataFile(): FilePath = { diff --git a/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala b/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala index c8d2c21a..d9662a98 100644 --- a/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala +++ b/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala @@ -11,6 +11,7 @@ object ProjectFolderMother { val anyDirectorySuffix = "Api26" val anySeparator = "/" val anyOrchestrated = false + val anyUid = "" val anyShotFolder: ShotFolder = ShotFolder( anyProjectFolder, @@ -19,7 +20,8 @@ object ProjectFolderMother { Some(anyFlavor), Some(anyDirectorySuffix), anySeparator, - anyOrchestrated + anyOrchestrated, + anyUid ) } diff --git a/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala b/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala index 61f38224..7c343edf 100644 --- a/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala +++ b/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala @@ -52,7 +52,8 @@ abstract class ShotTask extends DefaultTask { flavor, directorySuffix, File.separator, - orchestrated + orchestrated, + System.currentTimeMillis().toString ) } From 7f24c7528bc5c6ece1684163742f0750a88acee8 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Sat, 7 May 2022 16:12:53 +0200 Subject: [PATCH 2/8] Fix folder template name --- core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala index 5d9e367c..adc93269 100644 --- a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala +++ b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala @@ -27,15 +27,15 @@ case class ShotFolder( } def pulledScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-default$orchestratedSuffix$separator$uidSuffix" + s"${screenshotsFolder()}screenshots-default$orchestratedSuffix$uidSuffix$separator" } def pulledComposeScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-compose-default$separator$uidSuffix" + s"${screenshotsFolder()}screenshots-compose-default$uidSuffix$separator" } def pulledComposeOrchestratedScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-compose-default$orchestratedSuffix$separator$uidSuffix" + s"${screenshotsFolder()}screenshots-compose-default$orchestratedSuffix$uidSuffix$separator" } def metadataFile(): FilePath = { From 96df8d9921de09ff38c39782acb1a80100eecedc Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Mon, 9 May 2022 08:44:59 +0200 Subject: [PATCH 3/8] Fix code style --- core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala index adc93269..5a2fbf9e 100644 --- a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala +++ b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala @@ -14,7 +14,7 @@ case class ShotFolder( ) { private val orchestratedSuffix = if (orchestrated) "-orchestrated" else "" - private val uidSuffix = if (uid.isEmpty) "" else s"-$uid" + private val uidSuffix = if (uid.isEmpty) "" else s"-$uid" private def pathSuffix(): String = { s"${flavor.fold("") { s => s"$s$separator" }}" + From bc77d9d205bd1e1e26ee23795ebbd48323bf9c33 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Tue, 10 May 2022 17:17:45 +0200 Subject: [PATCH 4/8] Use UUID instead of timestamp Factorize deleteDirectory --- .../src/main/scala/com/karumi/shot/Shot.scala | 26 ++++++++----------- .../scala/com/karumi/shot/tasks/Tasks.scala | 3 ++- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/core/src/main/scala/com/karumi/shot/Shot.scala b/core/src/main/scala/com/karumi/shot/Shot.scala index c0c76b39..2d63a6a4 100644 --- a/core/src/main/scala/com/karumi/shot/Shot.scala +++ b/core/src/main/scala/com/karumi/shot/Shot.scala @@ -299,21 +299,9 @@ class Shot( private def removeProjectTemporalScreenshotsFolder(shotFolder: ShotFolder): Unit = { // Fix for https://github.com/pedrovgs/Shot/issues/53 // Avoid crash when directory can't be deleted - try { - FileUtils.deleteDirectory(new File(shotFolder.pulledScreenshotsFolder())) - } catch { - case e: Throwable => println(Console.RED + s"Shot error: $e") - } - try { - FileUtils.deleteDirectory(new File(shotFolder.pulledComposeScreenshotsFolder())) - } catch { - case e: Throwable => println(Console.RED + s"Shot error: $e") - } - try { - FileUtils.deleteDirectory(new File(shotFolder.pulledComposeOrchestratedScreenshotsFolder())) - } catch { - case e: Throwable => println(Console.RED + s"Shot error: $e") - } + safeDeleteDirectory(new File(shotFolder.pulledScreenshotsFolder())) + safeDeleteDirectory(new File(shotFolder.pulledComposeScreenshotsFolder())) + safeDeleteDirectory(new File(shotFolder.pulledComposeOrchestratedScreenshotsFolder())) } private def extractPicturesFromBundle(screenshotsFolder: String): Unit = { @@ -322,4 +310,12 @@ class Shot( TinyZip.unzip(bundleFile, screenshotsFolder) } } + + private def safeDeleteDirectory(file: File): Unit = { + try { + FileUtils.deleteDirectory(file) + } catch { + case e: Throwable => println(Console.RED + s"Failed to delete directory: $e") + } + } } diff --git a/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala b/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala index 7c343edf..8644f418 100644 --- a/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala +++ b/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala @@ -17,6 +17,7 @@ import org.gradle.api.tasks.TaskAction import org.gradle.api.{DefaultTask, GradleException} import java.io.File +import java.util.UUID abstract class ShotTask extends DefaultTask { var appId: String = _ @@ -53,7 +54,7 @@ abstract class ShotTask extends DefaultTask { directorySuffix, File.separator, orchestrated, - System.currentTimeMillis().toString + UUID.randomUUID().toString.replace("-", "") ) } From df22a515aa09100fe44ba123759cd33408fad5f3 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Tue, 10 May 2022 17:44:53 +0200 Subject: [PATCH 5/8] Fix log color --- core/src/main/scala/com/karumi/shot/Shot.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/com/karumi/shot/Shot.scala b/core/src/main/scala/com/karumi/shot/Shot.scala index 2d63a6a4..a175d0cd 100644 --- a/core/src/main/scala/com/karumi/shot/Shot.scala +++ b/core/src/main/scala/com/karumi/shot/Shot.scala @@ -315,7 +315,7 @@ class Shot( try { FileUtils.deleteDirectory(file) } catch { - case e: Throwable => println(Console.RED + s"Failed to delete directory: $e") + case e: Throwable => println(Console.YELLOW + s"Failed to delete directory: $e") } } } From 603b36df872b18940dacd0e3e5113cc9bde45348 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Tue, 10 May 2022 18:47:19 +0200 Subject: [PATCH 6/8] Revert UUID changes --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 79a61165..c715ff5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=5.14.0 +VERSION_NAME=5.15.0-SNAPSHOT VERSION_CODE=501400 GROUP=com.karumi POM_DESCRIPTION=Gradle plugin developed to facilitate screenshot testing for Android. From 335cdecc0737cd9ea3a85f3f683f55f06eaf2576 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Tue, 10 May 2022 18:47:33 +0200 Subject: [PATCH 7/8] Revert UUID changes --- .../main/scala/com/karumi/shot/domain/ShotFolder.scala | 10 ++++------ .../com/karumi/shot/mothers/ProjectFolderMother.scala | 4 +--- shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala | 4 +--- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala index 5a2fbf9e..38bf4c1d 100644 --- a/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala +++ b/core/src/main/scala/com/karumi/shot/domain/ShotFolder.scala @@ -9,12 +9,10 @@ case class ShotFolder( private val flavor: Option[String], private val directorySuffix: Option[String], private val separator: String, - private val orchestrated: Boolean, - private val uid: String + private val orchestrated: Boolean ) { private val orchestratedSuffix = if (orchestrated) "-orchestrated" else "" - private val uidSuffix = if (uid.isEmpty) "" else s"-$uid" private def pathSuffix(): String = { s"${flavor.fold("") { s => s"$s$separator" }}" + @@ -27,15 +25,15 @@ case class ShotFolder( } def pulledScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-default$orchestratedSuffix$uidSuffix$separator" + s"${screenshotsFolder()}screenshots-default$orchestratedSuffix$separator" } def pulledComposeScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-compose-default$uidSuffix$separator" + s"${screenshotsFolder()}screenshots-compose-default$separator" } def pulledComposeOrchestratedScreenshotsFolder(): FilePath = { - s"${screenshotsFolder()}screenshots-compose-default$orchestratedSuffix$uidSuffix$separator" + s"${screenshotsFolder()}screenshots-compose-default$orchestratedSuffix$separator" } def metadataFile(): FilePath = { diff --git a/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala b/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala index d9662a98..c8d2c21a 100644 --- a/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala +++ b/core/src/test/scala/com/karumi/shot/mothers/ProjectFolderMother.scala @@ -11,7 +11,6 @@ object ProjectFolderMother { val anyDirectorySuffix = "Api26" val anySeparator = "/" val anyOrchestrated = false - val anyUid = "" val anyShotFolder: ShotFolder = ShotFolder( anyProjectFolder, @@ -20,8 +19,7 @@ object ProjectFolderMother { Some(anyFlavor), Some(anyDirectorySuffix), anySeparator, - anyOrchestrated, - anyUid + anyOrchestrated ) } diff --git a/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala b/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala index 8644f418..61f38224 100644 --- a/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala +++ b/shot/src/main/scala/com/karumi/shot/tasks/Tasks.scala @@ -17,7 +17,6 @@ import org.gradle.api.tasks.TaskAction import org.gradle.api.{DefaultTask, GradleException} import java.io.File -import java.util.UUID abstract class ShotTask extends DefaultTask { var appId: String = _ @@ -53,8 +52,7 @@ abstract class ShotTask extends DefaultTask { flavor, directorySuffix, File.separator, - orchestrated, - UUID.randomUUID().toString.replace("-", "") + orchestrated ) } From 396ea216f443302b716da984235a3b5ad686a187 Mon Sep 17 00:00:00 2001 From: Yann Badoual Date: Tue, 10 May 2022 18:48:06 +0200 Subject: [PATCH 8/8] Revert gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c715ff5b..79a61165 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=5.15.0-SNAPSHOT +VERSION_NAME=5.14.0 VERSION_CODE=501400 GROUP=com.karumi POM_DESCRIPTION=Gradle plugin developed to facilitate screenshot testing for Android.