Skip to content

Commit 1a02043

Browse files
tinchengrli
andauthored
fix Windows file path in zip entries (#4094)
* fix Windows file paths in zip entries * Update string replacement syntax Co-authored-by: Richard Li <[email protected]> * Improvement to unit test syntax --------- Co-authored-by: Richard Li <[email protected]>
1 parent 6dafec4 commit 1a02043

File tree

3 files changed

+120
-78
lines changed

3 files changed

+120
-78
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix Code Transform uploaded artifact file paths when submitting from Windows machine"
4+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,23 @@ data class CodeModernizerSessionContext(
127127
dependencyfiles.forEach { depfile ->
128128
val relativePath = File(depfile.path).relativeTo(depDirectory.parentFile)
129129
val paddedPath = depSources.resolve(relativePath)
130-
it.putNextEntry(paddedPath.toPath().toString(), depfile.inputStream())
130+
var paddedPathString = paddedPath.toPath().toString()
131+
// Convert Windows file path to work on Linux
132+
if (File.separatorChar != '/') {
133+
paddedPathString = paddedPathString.replace('\\', '/')
134+
}
135+
it.putNextEntry(paddedPathString, depfile.inputStream())
131136
}
132137
}
133138
files.forEach { file ->
134139
val relativePath = File(file.path).relativeTo(sourceFolder)
135140
val paddedPath = zipSources.resolve(relativePath)
136-
it.putNextEntry(paddedPath.toPath().toString(), file.inputStream)
141+
var paddedPathString = paddedPath.toPath().toString()
142+
// Convert Windows file path to work on Linux
143+
if (File.separatorChar != '/') {
144+
paddedPathString = paddedPathString.replace('\\', '/')
145+
}
146+
it.putNextEntry(paddedPathString, file.inputStream)
137147
}
138148
}.toFile()
139149
if (depDirectory != null) ZipCreationResult.Succeeded(outputFile) else ZipCreationResult.Missing1P(outputFile)

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/codemodernizer/CodeWhispererCodeModernizerSessionTest.kt

Lines changed: 104 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import com.intellij.openapi.application.ApplicationManager
1212
import com.intellij.openapi.projectRoots.JavaSdkVersion
1313
import com.intellij.openapi.roots.ModuleRootManager
1414
import com.intellij.testFramework.common.ThreadLeakTracker
15+
import com.intellij.testFramework.runInEdtAndGet
1516
import com.intellij.testFramework.runInEdtAndWait
1617
import kotlinx.coroutines.runBlocking
1718
import org.apache.commons.codec.digest.DigestUtils
1819
import org.assertj.core.api.Assertions.assertThat
20+
import org.assertj.core.api.Assertions.fail
1921
import org.gradle.internal.impldep.com.amazonaws.ResponseMetadata
2022
import org.junit.Assert.assertEquals
2123
import org.junit.Assert.assertFalse
@@ -94,7 +96,6 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
9496
val fileText = "Morning"
9597
projectRule.fixture.addFileToModule(module, "src/tmp.txt", fileText)
9698

97-
var file: File? = null
9899
// get project.projectFile because project.projectFile can not be null
99100
val rootManager = ModuleRootManager.getInstance(module)
100101
val roots = rootManager.contentRoots
@@ -105,24 +106,23 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
105106
val codeContext = mock(CodeModernizerSessionContext::class.java)
106107
val mockFile = mock(File::class.java)
107108
`when`(codeContext.runMavenCommand(mockFile)).thenReturn(mock(File::class.java))
108-
runInEdtAndWait {
109-
file = context.createZipWithModuleFiles().payload
109+
val file = runInEdtAndGet {
110+
context.createZipWithModuleFiles().payload
110111
}
111-
assertNotNull(file)
112-
val zipFile = ZipFile(file)
113-
val entries = zipFile.entries()
114-
var numEntries = 0
115-
while (entries.hasMoreElements()) {
116-
numEntries += 1
117-
val entry = entries.nextElement() ?: continue
118-
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
119-
when (Path(entry.name)) {
120-
Path("manifest.json") -> assertNotNull(fileContent)
121-
Path("sources/src/tmp.txt") -> assertEquals(fileText, fileContent)
122-
else -> throw AssertionError("Unexpected entry in zip file: $entry")
112+
ZipFile(file).use { zipFile ->
113+
var numEntries = 0
114+
assertThat(zipFile.entries().toList()).allSatisfy { entry ->
115+
numEntries += 1
116+
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
117+
when (Path(entry.name)) {
118+
Path("manifest.json") -> assertNotNull(fileContent)
119+
Path("sources/src/tmp.txt") -> assertEquals(fileText, fileContent)
120+
else -> fail("Unexpected entry in zip file: $entry")
121+
}
123122
}
123+
zipFile.close()
124+
assert(numEntries == 2)
124125
}
125-
assert(numEntries == 2)
126126
}
127127

128128
@Test
@@ -134,7 +134,6 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
134134
projectRule.fixture.addFileToModule(module, "target/somedir/anotherthing.class", fileText)
135135
projectRule.fixture.addFileToModule(module, "pom.xml", fileText)
136136

137-
var file: File? = null
138137
// get project.projectFile because project.projectFile can not be null
139138
val rootManager = ModuleRootManager.getInstance(module)
140139
val roots = rootManager.contentRoots
@@ -145,21 +144,20 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
145144
val codeContext = mock(CodeModernizerSessionContext::class.java)
146145
val mockFile = mock(File::class.java)
147146
`when`(codeContext.runMavenCommand(mockFile)).thenReturn(mock(File::class.java))
148-
runInEdtAndWait {
149-
file = context.createZipWithModuleFiles().payload
147+
val file = runInEdtAndGet {
148+
context.createZipWithModuleFiles().payload
150149
}
151-
assertNotNull(file)
152-
val zipFile = ZipFile(file)
153-
val entries = zipFile.entries()
154-
while (entries.hasMoreElements()) {
155-
val entry = entries.nextElement() ?: continue
156-
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
157-
when (Path(entry.name)) {
158-
Path("manifest.json") -> assertNotNull(fileContent)
159-
Path("sources/src/tmp.java") -> assertEquals(fileText, fileContent)
160-
Path("sources/pom.xml") -> assertEquals(fileText, fileContent)
161-
else -> throw AssertionError("Unexpected entry in zip file: $entry")
150+
ZipFile(file).use { zipFile ->
151+
assertThat(zipFile.entries().toList()).allSatisfy { entry ->
152+
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
153+
when (Path(entry.name)) {
154+
Path("manifest.json") -> assertNotNull(fileContent)
155+
Path("sources/src/tmp.java") -> assertEquals(fileText, fileContent)
156+
Path("sources/pom.xml") -> assertEquals(fileText, fileContent)
157+
else -> fail("Unexpected entry in zip file: $entry")
158+
}
162159
}
160+
zipFile.close()
163161
}
164162
}
165163

@@ -172,34 +170,32 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
172170
projectRule.fixture.addFileToModule(module, "target/somedir/anotherthing.class", fileText)
173171
projectRule.fixture.addFileToModule(module, "pom.xml", fileText)
174172

175-
var file: File? = null
176173
// get project.projectFile because project.projectFile can not be null
177174
val rootManager = ModuleRootManager.getInstance(module)
178175
val roots = rootManager.contentRoots
179176
assertFalse(roots.isEmpty() || roots.size > 1)
180177

181178
val pom = roots[0].children.first { it.name == "pom.xml" }
182179
val context = CodeModernizerSessionContext(project, pom, JavaSdkVersion.JDK_1_8, JavaSdkVersion.JDK_11)
183-
runInEdtAndWait {
184-
file = context.createZipWithModuleFiles().payload
180+
val file = runInEdtAndGet {
181+
context.createZipWithModuleFiles().payload
185182
}
186-
assertNotNull(file)
187-
val zipFile = ZipFile(file)
188-
val entries = zipFile.entries()
189-
while (entries.hasMoreElements()) {
190-
val entry = entries.nextElement() ?: continue
191-
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
192-
when (Path(entry.name)) {
193-
Path("manifest.json") -> assertNotNull(fileContent)
194-
Path("sources/src/tmp.java") -> assertEquals(fileText, fileContent)
195-
Path("sources/pom.xml") -> assertEquals(fileText, fileContent)
196-
else -> throw AssertionError("Unexpected entry in zip file: $entry")
183+
ZipFile(file).use { zipFile ->
184+
assertThat(zipFile.entries().toList()).allSatisfy { entry ->
185+
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
186+
when (Path(entry.name)) {
187+
Path("manifest.json") -> assertNotNull(fileContent)
188+
Path("sources/src/tmp.java") -> assertEquals(fileText, fileContent)
189+
Path("sources/pom.xml") -> assertEquals(fileText, fileContent)
190+
else -> fail("Unexpected entry in zip file: $entry")
191+
}
197192
}
193+
zipFile.close()
198194
}
199195
}
200196

201197
@Test
202-
fun `CodeModernizerSession can create zip and exludes nested target`() {
198+
fun `CodeModernizerSession can create zip and exclude nested target`() {
203199
addFilesToProjectModule(
204200
"src/tmp.java",
205201
"target/smth.java",
@@ -209,30 +205,64 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
209205
"someModule/target/smth.class",
210206
"someModule/src/helloworld.java",
211207
)
212-
var file: File? = null
213208
val rootManager = ModuleRootManager.getInstance(module)
214209
val roots = rootManager.contentRoots
215210
assertFalse(roots.isEmpty() || roots.size > 1)
216211

217212
val pom = roots[0].children.first { it.name == "pom.xml" }
218213
val context = CodeModernizerSessionContext(project, pom, JavaSdkVersion.JDK_1_8, JavaSdkVersion.JDK_11)
219-
runInEdtAndWait {
220-
file = context.createZipWithModuleFiles().payload
214+
val file = runInEdtAndGet {
215+
context.createZipWithModuleFiles().payload
216+
}
217+
ZipFile(file).use { zipFile ->
218+
assertThat(zipFile.entries().toList()).allSatisfy { entry ->
219+
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
220+
when (Path(entry.name)) {
221+
Path("manifest.json") -> assertNotNull(fileContent)
222+
Path("sources/src/tmp.java") -> assertEquals("src/tmp.java", fileContent)
223+
Path("sources/pom.xml") -> assertEquals("pom.xml", fileContent)
224+
Path("sources/someModule/src/helloworld.java") -> assertEquals("someModule/src/helloworld.java", fileContent)
225+
Path("sources/someModule/pom.xml") -> assertEquals("someModule/pom.xml", fileContent)
226+
else -> fail("Unexpected entry in zip file: $entry")
227+
}
228+
}
229+
zipFile.close()
230+
}
231+
}
232+
233+
@Test
234+
fun `CodeModernizerSession can create zip and replace Windows file path`() {
235+
addFilesToProjectModule(
236+
"src\\tmp.java",
237+
"target\\smth.java",
238+
"target\\somedir\\anotherthing.class",
239+
"pom.xml",
240+
"someModule\\pom.xml",
241+
"someModule\\target\\smth.class",
242+
"someModule\\src\\helloworld.java",
243+
)
244+
val rootManager = ModuleRootManager.getInstance(module)
245+
val roots = rootManager.contentRoots
246+
assertFalse(roots.isEmpty() || roots.size > 1)
247+
248+
val pom = roots[0].children.first { it.name == "pom.xml" }
249+
val context = CodeModernizerSessionContext(project, pom, JavaSdkVersion.JDK_1_8, JavaSdkVersion.JDK_11)
250+
val file = runInEdtAndGet {
251+
context.createZipWithModuleFiles().payload
221252
}
222-
assertNotNull(file)
223-
val zipFile = ZipFile(file)
224-
val entries = zipFile.entries()
225-
while (entries.hasMoreElements()) {
226-
val entry = entries.nextElement() ?: continue
227-
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
228-
when (Path(entry.name)) {
229-
Path("manifest.json") -> assertNotNull(fileContent)
230-
Path("sources/src/tmp.java") -> assertEquals("src/tmp.java", fileContent)
231-
Path("sources/pom.xml") -> assertEquals("pom.xml", fileContent)
232-
Path("sources/someModule/src/helloworld.java") -> assertEquals("someModule/src/helloworld.java", fileContent)
233-
Path("sources/someModule/pom.xml") -> assertEquals("someModule/pom.xml", fileContent)
234-
else -> throw AssertionError("Unexpected entry in zip file: $entry")
253+
ZipFile(file).use { zipFile ->
254+
assertThat(zipFile.entries().toList()).allSatisfy { entry ->
255+
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
256+
when (Path(entry.name)) {
257+
Path("manifest.json") -> assertNotNull(fileContent)
258+
Path("sources/src/tmp.java") -> assertEquals("src\\tmp.java", fileContent)
259+
Path("sources/pom.xml") -> assertEquals("pom.xml", fileContent)
260+
Path("sources/someModule/src/helloworld.java") -> assertEquals("someModule\\src\\helloworld.java", fileContent)
261+
Path("sources/someModule/pom.xml") -> assertEquals("someModule\\pom.xml", fileContent)
262+
else -> fail("Unexpected entry in zip file: $entry")
263+
}
235264
}
265+
zipFile.close()
236266
}
237267
}
238268

@@ -245,30 +275,28 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
245275
"someModule/pom.xml",
246276
"someModule/.idea/smthelse.iml"
247277
)
248-
var file: File? = null
249278
// get project.projectFile because project.projectFile can not be null
250279
val rootManager = ModuleRootManager.getInstance(module)
251280
val roots = rootManager.contentRoots
252281
assertFalse(roots.isEmpty() || roots.size > 1)
253282

254283
val pom = roots[0].children.first { it.name == "pom.xml" }
255284
val context = CodeModernizerSessionContext(project, pom, JavaSdkVersion.JDK_1_8, JavaSdkVersion.JDK_11)
256-
runInEdtAndWait {
257-
file = context.createZipWithModuleFiles().payload
285+
val file = runInEdtAndGet {
286+
context.createZipWithModuleFiles().payload
258287
}
259-
assertNotNull(file)
260-
val zipFile = ZipFile(file)
261-
val entries = zipFile.entries()
262-
while (entries.hasMoreElements()) {
263-
val entry = entries.nextElement() ?: continue
264-
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
265-
when (Path(entry.name)) {
266-
Path("manifest.json") -> assertNotNull(fileContent)
267-
Path("sources/pom.xml") -> assertEquals("pom.xml", fileContent)
268-
Path("sources/src/tmp.java") -> assertEquals("src/tmp.java", fileContent)
269-
Path("sources/someModule/pom.xml") -> assertEquals("someModule/pom.xml", fileContent)
270-
else -> throw AssertionError("Unexpected entry in zip file: $entry")
288+
ZipFile(file).use { zipFile ->
289+
assertThat(zipFile.entries().toList()).allSatisfy { entry ->
290+
val fileContent = zipFile.getInputStream(entry).bufferedReader().readLine()
291+
when (Path(entry.name)) {
292+
Path("manifest.json") -> assertNotNull(fileContent)
293+
Path("sources/pom.xml") -> assertEquals("pom.xml", fileContent)
294+
Path("sources/src/tmp.java") -> assertEquals("src/tmp.java", fileContent)
295+
Path("sources/someModule/pom.xml") -> assertEquals("someModule/pom.xml", fileContent)
296+
else -> throw AssertionError("Unexpected entry in zip file: $entry")
297+
}
271298
}
299+
zipFile.close()
272300
}
273301
}
274302

0 commit comments

Comments
 (0)