From 9ceaa8fbca3a6aa0de368c9cd4c7ff08d60d145c Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Fri, 14 Nov 2025 14:04:58 +0000 Subject: [PATCH 1/3] Fix screenshot overwrite bug --- lib/src/screenshots.dart | 20 ++++++++++++-------- test/screenshot_test.dart | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/lib/src/screenshots.dart b/lib/src/screenshots.dart index c66adf3f7..eefb5cf7e 100644 --- a/lib/src/screenshots.dart +++ b/lib/src/screenshots.dart @@ -140,21 +140,26 @@ Future _processScreenshot( p.Screenshot e, String tempDir, ) async { - final basename = path.basenameWithoutExtension(e.path); - final webpName = '$basename.webp'; + final nameWithNoExt = path.withoutExtension(e.path); + final webpName = '$nameWithNoExt.webp'; + final pngName = '$nameWithNoExt.png'; + final genDir = 'gen'; final thumbnail100Dir = path.join(genDir, '100x100'); final thumbnail190Dir = path.join(genDir, '190x190'); final webpPath = path.join(genDir, webpName); final webp100ThumbnailPath = path.join(thumbnail100Dir, webpName); final webp190ThumbnailPath = path.join(thumbnail190Dir, webpName); - final pngName = '$basename.png'; final png100ThumbnailPath = path.join(thumbnail100Dir, pngName); final png190ThumbnailPath = path.join(thumbnail190Dir, pngName); final originalPath = path.join(pkgDir, e.path); - Directory(path.join(tempDir, thumbnail100Dir)).createSync(recursive: true); - Directory(path.join(tempDir, thumbnail190Dir)).createSync(recursive: true); + Directory(path.join(tempDir, path.dirname(webpPath))) + .createSync(recursive: true); + Directory(path.join(tempDir, path.dirname(webp100ThumbnailPath))) + .createSync(recursive: true); + Directory(path.join(tempDir, path.dirname(webp190ThumbnailPath))) + .createSync(recursive: true); final webpScreenshotProblems = await _generateWebpScreenshot( originalPath, @@ -444,9 +449,8 @@ Future> _checkedRunProc( } } on ProcessException catch (e) { log.severe("'${cmdAndArgs[0]}' tool not found."); - final message = e.message.isEmpty - ? "'${cmdAndArgs[0]}' tool not found." - : e.message; + final message = + e.message.isEmpty ? "'${cmdAndArgs[0]}' tool not found." : e.message; return [message]; } } diff --git a/test/screenshot_test.dart b/test/screenshot_test.dart index f999dc7c3..95b4b37f4 100644 --- a/test/screenshot_test.dart +++ b/test/screenshot_test.dart @@ -120,6 +120,43 @@ void main() { ); }); + test('same name screenshots are not overridden', () async { + final descriptor = package('my_package', pubspecExtras: { + 'screenshots': [ + {'description': 'description', 'path': 's1/static.webp'}, + {'description': 'description', 'path': 's2/static.webp'}, + ], + }, extraFiles: [ + d.dir('s1', [ + d.file( + 'static.webp', + File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), + ), + ]), + d.dir('s2', [ + d.file( + 'static.webp', + File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), + ), + ]), + ]); + + await descriptor.create(); + final screenshots = [ + Screenshot('description', 's1/static.webp'), + Screenshot('description', 's2/static.webp') + ]; + final result = await processAllScreenshots(screenshots, descriptor.io.path); + + expect(result.length, 2); + expect(result[0].problems, isEmpty); + expect(result[0].processedScreenshot, isNotNull); + expect(result[1].problems, isEmpty); + expect(result[1].processedScreenshot, isNotNull); + expect(result[0].processedScreenshot!.webpImage, + isNot(equals(result[1].processedScreenshot!.webpImage))); + }, skip: !hasWebpTools); + test('success - process WebP, PNG and GIFs', () async { if (!hasWebpTools) return; final pkgDir = _testImagesDir; From 30962e72a3949a108bd33c71117dbc8d99fbd779 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Mon, 17 Nov 2025 09:02:41 +0000 Subject: [PATCH 2/3] Format + changelog --- CHANGELOG.md | 1 + lib/src/screenshots.dart | 20 +++++++++------- test/screenshot_test.dart | 48 ++++++++++++++++++++++----------------- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3abf91f34..6b3870c1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.23.2 - Allow `package:analyzer` range to accept `^9.0.0` too. +- Fix issue where screenshots with same filenames but located in different subdirectories were overwriting each other during processing. ## 0.23.1 diff --git a/lib/src/screenshots.dart b/lib/src/screenshots.dart index eefb5cf7e..f5794e0e8 100644 --- a/lib/src/screenshots.dart +++ b/lib/src/screenshots.dart @@ -154,12 +154,15 @@ Future _processScreenshot( final png190ThumbnailPath = path.join(thumbnail190Dir, pngName); final originalPath = path.join(pkgDir, e.path); - Directory(path.join(tempDir, path.dirname(webpPath))) - .createSync(recursive: true); - Directory(path.join(tempDir, path.dirname(webp100ThumbnailPath))) - .createSync(recursive: true); - Directory(path.join(tempDir, path.dirname(webp190ThumbnailPath))) - .createSync(recursive: true); + Directory( + path.join(tempDir, path.dirname(webpPath)), + ).createSync(recursive: true); + Directory( + path.join(tempDir, path.dirname(webp100ThumbnailPath)), + ).createSync(recursive: true); + Directory( + path.join(tempDir, path.dirname(webp190ThumbnailPath)), + ).createSync(recursive: true); final webpScreenshotProblems = await _generateWebpScreenshot( originalPath, @@ -449,8 +452,9 @@ Future> _checkedRunProc( } } on ProcessException catch (e) { log.severe("'${cmdAndArgs[0]}' tool not found."); - final message = - e.message.isEmpty ? "'${cmdAndArgs[0]}' tool not found." : e.message; + final message = e.message.isEmpty + ? "'${cmdAndArgs[0]}' tool not found." + : e.message; return [message]; } } diff --git a/test/screenshot_test.dart b/test/screenshot_test.dart index 95b4b37f4..07a6290cb 100644 --- a/test/screenshot_test.dart +++ b/test/screenshot_test.dart @@ -121,30 +121,34 @@ void main() { }); test('same name screenshots are not overridden', () async { - final descriptor = package('my_package', pubspecExtras: { - 'screenshots': [ - {'description': 'description', 'path': 's1/static.webp'}, - {'description': 'description', 'path': 's2/static.webp'}, + final descriptor = package( + 'my_package', + pubspecExtras: { + 'screenshots': [ + {'description': 'description', 'path': 's1/static.webp'}, + {'description': 'description', 'path': 's2/static.webp'}, + ], + }, + extraFiles: [ + d.dir('s1', [ + d.file( + 'static.webp', + File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), + ), + ]), + d.dir('s2', [ + d.file( + 'static.webp', + File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), + ), + ]), ], - }, extraFiles: [ - d.dir('s1', [ - d.file( - 'static.webp', - File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), - ), - ]), - d.dir('s2', [ - d.file( - 'static.webp', - File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), - ), - ]), - ]); + ); await descriptor.create(); final screenshots = [ Screenshot('description', 's1/static.webp'), - Screenshot('description', 's2/static.webp') + Screenshot('description', 's2/static.webp'), ]; final result = await processAllScreenshots(screenshots, descriptor.io.path); @@ -153,8 +157,10 @@ void main() { expect(result[0].processedScreenshot, isNotNull); expect(result[1].problems, isEmpty); expect(result[1].processedScreenshot, isNotNull); - expect(result[0].processedScreenshot!.webpImage, - isNot(equals(result[1].processedScreenshot!.webpImage))); + expect( + result[0].processedScreenshot!.webpImage, + isNot(equals(result[1].processedScreenshot!.webpImage)), + ); }, skip: !hasWebpTools); test('success - process WebP, PNG and GIFs', () async { From 73266dbfe2db3b81f2c0c2f709a3e12899e1c0da Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Mon, 17 Nov 2025 10:05:17 +0000 Subject: [PATCH 3/3] simplify test --- test/screenshot_test.dart | 35 ++++++--------------------------- test/testImages/s2/static.webp | Bin 0 -> 3352 bytes 2 files changed, 6 insertions(+), 29 deletions(-) create mode 100644 test/testImages/s2/static.webp diff --git a/test/screenshot_test.dart b/test/screenshot_test.dart index 07a6290cb..dbb583895 100644 --- a/test/screenshot_test.dart +++ b/test/screenshot_test.dart @@ -121,36 +121,13 @@ void main() { }); test('same name screenshots are not overridden', () async { - final descriptor = package( - 'my_package', - pubspecExtras: { - 'screenshots': [ - {'description': 'description', 'path': 's1/static.webp'}, - {'description': 'description', 'path': 's2/static.webp'}, - ], - }, - extraFiles: [ - d.dir('s1', [ - d.file( - 'static.webp', - File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), - ), - ]), - d.dir('s2', [ - d.file( - 'static.webp', - File(p.join(_testImagesDir, 'static.webp')).readAsBytesSync(), - ), - ]), - ], - ); + if (!hasWebpTools) return; - await descriptor.create(); - final screenshots = [ - Screenshot('description', 's1/static.webp'), - Screenshot('description', 's2/static.webp'), - ]; - final result = await processAllScreenshots(screenshots, descriptor.io.path); + final pkgDir = _testImagesDir; + final s = Screenshot('description', 'static.webp'); + final s2 = Screenshot('description', 's2/static.webp'); + + final result = await processAllScreenshots([s, s2], pkgDir); expect(result.length, 2); expect(result[0].problems, isEmpty); diff --git a/test/testImages/s2/static.webp b/test/testImages/s2/static.webp new file mode 100644 index 0000000000000000000000000000000000000000..7e0aaf5d109006dd7f797c5fd68a25ce6e635a82 GIT binary patch literal 3352 zcmds(`8O1d8pnq$$u`Iy!yrqR%2t_1NXC}k2w6gwDcckh8Iq+*B8+_vJ@4P}KIeSS`JU&O=lgtr`r4Y_xB=t^0N}=k){fSfWY~V| zS4n^Z78NH}Cst@0tkgmQTUH9rpaA|5M&(q{&|Rxh(Hn1Qp!uRCX^j~F9m1P$ zrTTHvAUEBWH!Fk!MjQjcl-TCnC@R(P(CE;|#8ho-FZTu9bw3>K=ceeV9_2onICvMp zK2h+pLYQfOE7uw|BLd$n}IZ6MkEiscA}~>h^`5QKH_-)xMx_188OC zx~kgP#1X`1@%rF-9~cavU@t9xdb3VO1%3~p*XwM!RV}aQe{wk;oYmJ zp*EJYGb2}et7xLc_RavroK*aJUL@wbZUylrd(`FBh62W^i29xy$2K`fQUre)$Yqr;!%}FhcpXJ97 z`Jr5{Zh?u@Xh_d3Pc$hwtO6R+&w1PCamu3o{Y0ggHXBWd{47v?omF$cxXjRJgz!i-P<$wlZA#;oCECnC(Tq*H(?UOs z%rHdio5(o}EqAy3s|AN+fBwpN3S>h`i){9}ZY_1(QD`b24)13kgMiTRgwEk*<>3W=bX|ts z#|6ouPo%dXP@z1UpJ_9@tvT5n8xlg#++ej)|G2(c0SUS2XD*!(#pAOfxhXP4SN*0n z2zk;5@@IUJe6M-^r?YwszmAP$MJZ)Hld65gR`mM&Qrs9g-B`Uyd!x>RcUtxyuLb-|0#>r%xRj82 zsE+9h5K6!exqnbIS*}vPpcU(Hy=oR3Q0fZ}?C7%$JqfGyEQ!1r`1#vej?=o6qF1gZ z4%=Zgu&=T`@-LSaZ!r5sm~D^uBCBdASjHODmR~+6Gjk;}VIZR)JuTi-uj~5_rZ#9s zEcsKfB;T4=dC=un^UI<|1u#=$Wb&Mka@6K7>E;x{J+3TvA~&v^`JH=(C>(nnRPrZ#xB-gA$F(@(l{(s^^eYelbP z!Jmy64weK3i-lZ2e@N}>fR5)`gM%rfcfZ00PMY0bywpv>nrJRw87k8C@~voM1MgQd zMg+OR^T9gJ^JeL~S*_rUYG{K`@a-k2@I4^Xz>#?82WR6Y@#N=bqDj-M)YIQ$5jyGM$%<3i z3lYc+nfqADT4&d=z&vyGv`FlS_3FKToxQjic`?$Muy|MBwPmPqAXbldpQpET2(MOH29e0VxZA`h{ynwYhYAmKV6H(i*vNs}D z0x)a*Za9bAGr58Kg;Z11_Jc!4abv*|FXE3#^PnFhV_xSS8<_D#j~mUNS*rx$8P}qE z;aHpbgmSNCtKg;`=@hCL|3+?BL?_5LL2;z>`^8nzi^ll=Rz$w>$+C3YxgFHDrBG$x zWh@yVBTu*%amr5ze{6!)Hnvp@7qqRI4 z(9W~vARZW5=H6(~{jh#tXUXMlL(}&koF}6 zqPuB#n;yu1JrWYCU(;`{6MuDP7l!|;_S_gQ%=ZX;Kq(kYC%%6hv1r3p z@K$Og1HwRAH7_oC|Q#SXd53UsYErB{hU_4??XzBKDEAMV9FR(dN~P^TZ3(1 zy#$c4@vF|t;&YrsT%C%UQJ!As$cwr_9(u+RiGH1tpAE`0S}Gr_uG4jPwpMr3dtM2H zfWOTaaWvKHvY>{74b(D$&0ls;EHnux*nOdoz&dMM^TlUlllnqsZHq;9 z1Vznj2Qx_gE0)Qd2G)tyRDm;_xMt+onm#USd^HtvqM>bqq;q>1^jJHgd0i@&(N`oL)-^6f?+8j!uRa8puv% zj8a8VOQZ)5A)z^@e6A)STBw>jurbcBP;Uq!m-1od_@J1DOIS64hWcAY`7Qqqal?Ih literal 0 HcmV?d00001