PHOENIX-6349 Add and use commons-cli to phoenix-thirdparty
includes a patch that lets us disable the double quote removing "feature"
diff --git a/phoenix-shaded-commons-cli/pom.xml b/phoenix-shaded-commons-cli/pom.xml
new file mode 100644
index 0000000..037be39
--- /dev/null
+++ b/phoenix-shaded-commons-cli/pom.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.phoenix.thirdparty</groupId>
+ <artifactId>phoenix-thirdparty</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>phoenix-shaded-commons-cli</artifactId>
+ <name>Apache Phoenix Patched and Relocated (Shaded) Commons-CLI</name>
+ <description>
+ Pulls down commons-cli, patches it, compiles, and then relocates/shades.
+ </description>
+ <build>
+ <plugins>
+ <plugin>
+ <!--Clean needs to purge src/main/java since this is where
+ the unpack of commons-cli is overlaid. Do it for usual
+ clean goal but also before we unpack in case patches
+ delete/add files. We use src/main/java instead of dir
+ under 'target' because the jar plugin is dumb, hard to
+ make it source from other then src/main/java.-->
+ <artifactId>maven-clean-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>pre-generate-sources</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>clean</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <filesets>
+ <fileset>
+ <directory>${basedir}/src/main/java</directory>
+ <includes>
+ <include>**/**</include>
+ </includes>
+ <followSymlinks>false</followSymlinks>
+ </fileset>
+ </filesets>
+ </configuration>
+ </plugin>
+ <plugin>
+ <!--Download our dependency src, i.e. commons-cli, and
+ unpack it. Overlays src/main/java so ready for
+ compile-time (the jar plugin expects src in
+ src/main/java)-->
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>unpack</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>commons-cli</groupId>
+ <artifactId>commons-cli</artifactId>
+ <version>${commons-cli.version}</version>
+ <classifier>sources</classifier>
+ <type>jar</type>
+ <overWrite>true</overWrite>
+ <outputDirectory>${basedir}/src/main/java</outputDirectory>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ </plugin>
+ <!--Apply our patches to the unpacked commons-cli src-->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-patch-plugin</artifactId>
+ <version>1.2</version>
+ <configuration>
+ <targetDirectory>${basedir}</targetDirectory>
+ <skipApplication>false</skipApplication>
+ </configuration>
+ <executions>
+ <execution>
+ <id>patch</id>
+ <phase>process-sources</phase>
+ <goals>
+ <goal>apply</goal>
+ </goals>
+ <configuration>
+ <strip>0</strip>
+ <patchDirectory>${basedir}/src/main/patches</patchDirectory>
+ <patchTrackingFile>${project.build.directory}/patches-applied.txt</patchTrackingFile>
+ <naturalOrderProcessing>true</naturalOrderProcessing>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <!--Above we built a jar. Now at package step, do relocation/shade-->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <shadeSourcesContent>true</shadeSourcesContent>
+ <createSourcesJar>true</createSourcesJar>
+ <relocations>
+ <relocation>
+ <pattern>org.apache.commons.cli</pattern>
+ <shadedPattern>${rename.offset}.org.apache.commons.cli</shadedPattern>
+ </relocation>
+ </relocations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/phoenix-shaded-commons-cli/src/main/patches/CLI-254-1.4.patch b/phoenix-shaded-commons-cli/src/main/patches/CLI-254-1.4.patch
new file mode 100644
index 0000000..4616fab
--- /dev/null
+++ b/phoenix-shaded-commons-cli/src/main/patches/CLI-254-1.4.patch
@@ -0,0 +1,72 @@
+diff --git src/main/java/org/apache/commons/cli/DefaultParser.java src/main/java/org/apache/commons/cli/DefaultParser.java
+index d762a3e..ebc324f 100644
+--- src/main/java/org/apache/commons/cli/DefaultParser.java
++++ src/main/java/org/apache/commons/cli/DefaultParser.java
+@@ -54,7 +54,44 @@ public class DefaultParser implements CommandLineParser
+
+ /** The required options and groups expected to be found when parsing the command line. */
+ protected List expectedOpts;
+-
++
++ public DefaultParser() {
++ this.stripLeadingAndTrailingQuotes = true;
++ }
++
++ /** Flag indicating if balanced leading and trailing double quotes should be stripped from option arguments. */
++ private final boolean stripLeadingAndTrailingQuotes;
++
++ /**
++ * Create a new DefaultParser instance with the specified partial matching and quote
++ * stripping policy.
++ *
++ * By "partial matching" we mean that given the following code:
++ * <pre>
++ * {@code
++ * final Options options = new Options();
++ * options.addOption(new Option("d", "debug", false, "Turn on debug."));
++ * options.addOption(new Option("e", "extract", false, "Turn on extract."));
++ * options.addOption(new Option("o", "option", true, "Turn on option with argument."));
++ * }
++ * </pre>
++ * with "partial matching" turned on, <code>-de</code> only matches the
++ * <code>"debug"</code> option. However, with "partial matching" disabled,
++ * <code>-de</code> would enable both <code>debug</code> as well as
++ * <code>extract</code> options.
++ * with "stripping of balanced leading and trailing double quotes from option arguments" turned
++ * on, the outermost balanced double quotes of option arguments values will be removed.
++ * ie.
++ * for <code>-o '"x"'</code> getValue() will return <code>x</code>, instead of <code>"x"</code>
++ * @param allowPartialMatching if partial matching of long options shall be enabled
++ * @param stripLeadingAndTrailingQuotes if balanced outer double quoutes should be stripped
++ */
++ public DefaultParser(final boolean allowPartialMatching,
++ final boolean stripLeadingAndTrailingQuotes) {
++ // We do not care about allowPartialMatching in this patch
++ this.stripLeadingAndTrailingQuotes = stripLeadingAndTrailingQuotes;
++ }
++
+ public CommandLine parse(Options options, String[] arguments) throws ParseException
+ {
+ return parse(options, arguments, null);
+@@ -232,7 +269,7 @@ public class DefaultParser implements CommandLineParser
+ }
+ else if (currentOption != null && currentOption.acceptsArg() && isArgument(token))
+ {
+- currentOption.addValueForProcessing(Util.stripLeadingAndTrailingQuotes(token));
++ currentOption.addValueForProcessing(conditionallyStripLeadingAndTrailingQuotes(token));
+ }
+ else if (token.startsWith("--"))
+ {
+@@ -704,4 +741,12 @@ public class DefaultParser implements CommandLineParser
+ }
+ }
+ }
++
++ protected String conditionallyStripLeadingAndTrailingQuotes(final String token) {
++ if(stripLeadingAndTrailingQuotes) {
++ return Util.stripLeadingAndTrailingQuotes(token);
++ } else {
++ return token;
++ }
++ }
+ }
diff --git a/phoenix-shaded-guava/pom.xml b/phoenix-shaded-guava/pom.xml
index dba90c6..9b5ebd6 100644
--- a/phoenix-shaded-guava/pom.xml
+++ b/phoenix-shaded-guava/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.phoenix.thirdparty</groupId>
<artifactId>phoenix-thirdparty</artifactId>
- <version>1.0.1-SNAPSHOT</version>
+ <version>1.1.0-SNAPSHOT</version>
</parent>
<artifactId>phoenix-shaded-guava</artifactId>
diff --git a/pom.xml b/pom.xml
index b72bffb..ce1ca05 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
<groupId>org.apache.phoenix.thirdparty</groupId>
<artifactId>phoenix-thirdparty</artifactId>
- <version>1.0.1-SNAPSHOT</version>
+ <version>1.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Apache Phoenix Third-Party Libs</name>
<description>Packaging of relocated (renamed, shaded) third-party libraries used by Phoenix.</description>
@@ -50,6 +50,7 @@
<modules>
<module>phoenix-shaded-guava</module>
+ <module>phoenix-shaded-commons-cli</module>
</modules>
<scm>
@@ -68,6 +69,7 @@
<properties>
<rename.offset>org.apache.phoenix.thirdparty</rename.offset>
<guava.version>29.0-android</guava.version>
+ <commons-cli.version>1.4</commons-cli.version>
</properties>
<build>