RFR: 8173970: jar tool should have a way to extract to a directory [v3]
Jaikiran Pai
jpai at openjdk.java.net
Thu Apr 1 15:02:58 UTC 2021
On Wed, 31 Mar 2021 17:22:55 GMT, Lance Andersen <lancea at openjdk.org> wrote:
>> Jaikiran Pai has updated the pull request incrementally with two additional commits since the last revision:
>>
>> - Alan's review feedback for -C help text
>> - Keep -xfP backward compatible but don't allow -C/--dir with -xfP
>
> Some additional comments basically suggesting that we test --extract in addition to -x
Thank you for the reviews, Lance. The latest version of this PR has taken into account most of these comments. There's one review comment which hasn't resulted in a change and I've added a reply to that review comment explaining my thoughts.
> src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 1427:
>
>> 1425: return rc; // leading '/' or 'dot-dot' only path
>> 1426: }
>> 1427: File f = new File(xdestDir, name.replace('/', File.separatorChar));
>
> Could you please add a comment regarding xdestDir and also correct the typo on line 1418 'requres' -> 'requires'
Fixed the typo and also added code comment about the `xdestDir` usage and semantics. If the new comment needs clarification/changes, do let me know.
> src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties line 62:
>
>> 60: Could not create a temporary file
>> 61: error.extract.multiple.dest.dir=\
>> 62: You may not specify more than one directory for extracting the jar
>
> Perhaps something similar to:
>
> You may not specify the '-C' or '--dir' option more than once with the '-x' option
Done
> src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties line 64:
>
>> 62: You may not specify more than one directory for extracting the jar
>> 63: error.extract.pflag.not.allowed=\
>> 64: -P option cannot be used when extracting a jar to a specific location
>
> Perhaps something similar to
>
> You may not specify '-Px' with the '-C' or '--dir' options
Makes sense. I've updated the PR with this change.
> src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties line 167:
>
>> 165: (in = {0}) (out= {1})
>> 166: out.extract.dir=\
>> 167: extracting to {0}
>
> Perhaps 'Extracting to directory: {0}'
Updated the message to say `extracting to directory: {0}`. I decided to use lower case for `extracting` to keep it consistent with other similar messages that get logged here.
> src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties line 249:
>
>> 247: \ -C DIR Change to the specified directory and include the\n\
>> 248: \ following file. When used in extract mode, extracts\n\
>> 249: \ the jar to the specified directory
>
> Should this be updated on line 187 as well in the compatibility mode section?
Updated in latest version of the PR.
> test/jdk/tools/jar/JarExtractTest.java line 152:
>
>> 150: return abs;
>> 151: }
>> 152:
>
> Please add a comment to each test giving a high level overview of what it does as it will help future maintainers
Done in latest update to this PR
> test/jdk/tools/jar/JarExtractTest.java line 175:
>
>> 173: final String dest = "foo-bar";
>> 174: System.out.println("Extracting " + testJarPath + " to " + dest);
>> 175: final int exitCode = JAR_TOOL.run(System.out, System.err, "-x", "-f", testJarPath.toString(),
>
> Perhaps add a DataProvider so you can test --extract as well?
Not a data provider but the latest version of PR tests --extract as well
> test/jdk/tools/jar/JarExtractTest.java line 216:
>
>> 214: final Path jarPath = createJarWithPFlagSemantics();
>> 215: // extract with -P flag without any explicit destination directory (expect the extraction to work fine)
>> 216: final String[] args = new String[]{"-xvfP", jarPath.toString()};
>
> Perhaps add a DataProvider so you can test --extract as well?
Not a data provider but the latest version of PR tests --extract as well
> test/jdk/tools/jar/JarExtractTest.java line 239:
>
>> 237: */
>> 238: @Test
>> 239: public void testExtractWithDirPFlagNotAllowed() throws Exception {
>
> I would include --extract in your testing options
Done in latest version of the PR
> test/jdk/tools/jar/JarExtractTest.java line 240:
>
>> 238: @Test
>> 239: public void testExtractWithDirPFlagNotAllowed() throws Exception {
>> 240: final String expectedErrMsg = "-P option cannot be used when extracting a jar to a specific location";
>
> Probably need to add a comment that this must match the entry in jar.properties
Added a comment mentioning where this message is sourced from.
> test/jdk/tools/jar/JarExtractTest.java line 247:
>
>> 245: cmdArgs.add(new String[]{"-x", "-f", testJarPath.toString(), "-P", "-C", "."});
>> 246: cmdArgs.add(new String[]{"-x", "-f", testJarPath.toString(), "-P", "--dir", "."});
>> 247: cmdArgs.add(new String[]{"-xvfP", testJarPath.toString(), "-C", tmpDir});
>
> Perhaps add a DataProvider so you can test --extract as well?
Not a data provider but the latest version of PR tests `--extract` as well.
> test/jdk/tools/jar/JarExtractTest.java line 262:
>
>> 260: */
>> 261: @Test
>> 262: public void testLegacyCompatibilityMode() throws Exception {
>
> Perhaps add a DataProvider so you can test --extract as well?
So from what I understand of the code in the jar tool the "legacy compatibility" mode stands for using the single hypen option and clubbing multiple options into one. Something like `-xvfP` instead of `-x -v -f -P` and this legacy compatibility mode isn't applicable for the long form options like `--extract`. So IMO using `--extract` here won't work. Let me know if I have misunderstood this review comment or the semantics of the legacy compatibility mode.
> test/jdk/tools/jar/JarExtractTest.java line 282:
>
>> 280: cmdArgs.add(new String[]{"-x", "-f", testJarPath.toString(), "-C", tmpDir, "-C", tmpDir});
>> 281: cmdArgs.add(new String[]{"-x", "-f", testJarPath.toString(), "--dir", tmpDir, "--dir", tmpDir});
>> 282: cmdArgs.add(new String[]{"-x", "-f", testJarPath.toString(), "--dir", tmpDir, "-C", tmpDir});
>
> Perhaps use a DataProvider so you can test --extract as well?
Done
> test/jdk/tools/jar/JarExtractTest.java line 300:
>
>> 298: public void testExtractPartialContent() throws Exception {
>> 299: final String tmpDir = Files.createTempDirectory(Path.of("."), "8173970-").toString();
>> 300: final String[] cmdArgs = new String[]{"-x", "-f", testJarPath.toString(), "--dir", tmpDir,
>
> Perhaps add a DataProvider so you can test --extract as well?
Didn't use a data provider, but did add tests for `--extract` as well, in the latest version of this PR.
> test/jdk/tools/jar/JarExtractTest.java line 307:
>
>> 305: // make sure only the specific files were extracted
>> 306: final Stream<Path> paths = Files.walk(Path.of(tmpDir));
>> 307: Assert.assertEquals(paths.count(), 6, "Unexpected number of files/dirs in " + tmpDir);
>
> Should '6' be in a local variable to make it clearer or at a minimum a comment
The latest update to the PR includes a comment explaining what this number represents.
> test/jdk/tools/jar/JarExtractTest.java line 332:
>
>> 330: */
>> 331: private void testExtract(final String dest) throws Exception {
>> 332: final String[] args = new String[]{"-x", "-f", testJarPath.toString(), "-C", dest};
>
> Perhaps add a DataProvider so you can test --extract as well?
The latest version of the PR tests the `--extract` as well.
> test/jdk/tools/jar/JarExtractTest.java line 367:
>
>> 365: }
>> 366:
>> 367: private static Path createJarWithPFlagSemantics() throws IOException {
>
> Perhaps add a comment as to what the method does
Done
-------------
PR: https://git.openjdk.java.net/jdk/pull/2752
More information about the core-libs-dev
mailing list