From 889bcaf2504570a64c9b0a8e1f22b092a83e0c0c Mon Sep 17 00:00:00 2001 From: Miroslav Šulc Date: Fri, 1 Nov 2019 20:41:43 +0100 Subject: added parsing of ebuild file name components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miroslav Šulc --- src/main/java/org/gentoo/java/ebuilder/Config.java | 66 ++++++++++++++++++++++ src/main/java/org/gentoo/java/ebuilder/Main.java | 30 ++++++++++ .../java/ebuilder/portage/PortageParser.java | 45 +++++++++++++++ 3 files changed, 141 insertions(+) diff --git a/src/main/java/org/gentoo/java/ebuilder/Config.java b/src/main/java/org/gentoo/java/ebuilder/Config.java index 4127266..9bc98f8 100644 --- a/src/main/java/org/gentoo/java/ebuilder/Config.java +++ b/src/main/java/org/gentoo/java/ebuilder/Config.java @@ -28,6 +28,18 @@ public class Config { * Path to ebuild file that should be generated. */ private Path ebuild; + /** + * Ebuild name. + */ + private String ebuildName; + /** + * Ebuild version excluding suffix. + */ + private String ebuildVersion; + /** + * Ebuild version suffix (-r). + */ + private String ebuildVersionSuffix; /** * Writer for errors. */ @@ -144,6 +156,60 @@ public class Config { this.ebuild = ebuild; } + /** + * Getter for {@link #ebuildName}. + * + * @return {@link #ebuildName} + */ + public String getEbuildName() { + return ebuildName; + } + + /** + * Setter for {@link #ebuildName}. + * + * @param ebuildName {@link #ebuildName} + */ + public void setEbuildName(final String ebuildName) { + this.ebuildName = ebuildName; + } + + /** + * Getter for {@link #ebuildVersion}. + * + * @return {@link #ebuildVersion} + */ + public String getEbuildVersion() { + return ebuildVersion; + } + + /** + * Setter for {@link #ebuildVersion}. + * + * @param ebuildVersion {@link #ebuildVersion} + */ + public void setEbuildVersion(final String ebuildVersion) { + this.ebuildVersion = ebuildVersion; + } + + /** + * Getter for {@link #ebuildVersionSuffix}. + * + * @return {@link #ebuildVersionSuffix} + */ + public String getEbuildVersionSuffix() { + return ebuildVersionSuffix; + } + + /** + * Setter for {@link #ebuildVersionSuffix}. + * + * @param ebuildVersionSuffix {@link #ebuildVersionSuffix} + */ + public void setEbuildVersionSuffix(final String ebuildVersionSuffix) { + this.ebuildVersionSuffix = ebuildVersionSuffix; + } + /** * Getter for {@link #errorWriter}. * diff --git a/src/main/java/org/gentoo/java/ebuilder/Main.java b/src/main/java/org/gentoo/java/ebuilder/Main.java index 5921ea1..6c5cd13 100644 --- a/src/main/java/org/gentoo/java/ebuilder/Main.java +++ b/src/main/java/org/gentoo/java/ebuilder/Main.java @@ -9,6 +9,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Paths; import java.util.List; +import java.util.Map; import org.gentoo.java.ebuilder.maven.MavenCache; import org.gentoo.java.ebuilder.maven.MavenEbuilder; import org.gentoo.java.ebuilder.maven.MavenParser; @@ -159,6 +160,8 @@ public class Main { * @param config application configuration */ private static void generateEbuild(final Config config) { + parseEbuildName(config); + final MavenCache mavenCache = new MavenCache(); mavenCache.loadCache(config); @@ -253,6 +256,33 @@ public class Main { } } + /** + * Parses ebuild file name into its components. + * + * @param config app configuration containing ebuild information + */ + private static void parseEbuildName(final Config config) { + final Map result; + + try { + result = PortageParser.parseEbuildName( + config.getEbuild().getFileName().toString()); + + config.setEbuildName(result.get("name")); + config.setEbuildVersion(result.get("version")); + config.setEbuildVersionSuffix(result.get("suffix")); + + config.getStdoutWriter().println("Parsed ebuild file name - name: " + + config.getEbuildName() + " version: " + + config.getEbuildVersion() + " suffix: " + + config.getEbuildVersionSuffix()); + } catch (final IllegalArgumentException ex) { + config.getStdoutWriter().println("Cannot parse ebuild file name"); + + Runtime.getRuntime().exit(1); + } + } + /** * Prints application usage information. */ diff --git a/src/main/java/org/gentoo/java/ebuilder/portage/PortageParser.java b/src/main/java/org/gentoo/java/ebuilder/portage/PortageParser.java index d504b2c..a85fe6c 100644 --- a/src/main/java/org/gentoo/java/ebuilder/portage/PortageParser.java +++ b/src/main/java/org/gentoo/java/ebuilder/portage/PortageParser.java @@ -49,6 +49,11 @@ public class PortageParser { * Current java utilities eclass name. */ private static final String ECLASS_JAVA_UTILS = "java-utils-2"; + /** + * Pattern for parsing ebuild file name. + */ + private static final Pattern PATTERN_EBUILD_NAME = Pattern.compile( + "^(\\S+?)-([^-]+)(?:-(r\\d+))?\\.ebuild$"); /** * Pattern for parsing SLOT with bash substring. */ @@ -67,6 +72,46 @@ public class PortageParser { */ private static final Pattern PATTERN_VARIABLE = Pattern.compile( "^(\\S+?)=(.*)$"); + + /** + * Parses ebuild name into map. Keys are: + *
+ *
name
+ *
ebuild name
+ *
version
+ *
ebuild version
+ *
suffix
+ *
ebuild version suffix (-r)
+ *
+ * If suffix is not present in ebuild name, it is not put into the map + * aswell. + * + * @param name ebuild file name + * + * @return map of parsed values + * + * @throws IllegalArgumentException Thrown if the ebuild file name is not + * valid or it cannot be parsed. + */ + public static Map parseEbuildName(final String name) { + final Matcher matcher = PATTERN_EBUILD_NAME.matcher(name); + + if (!matcher.matches()) { + throw new IllegalArgumentException("Ebuild file name is not valid " + + "or parser does not support this ebuild name format"); + } + + final Map result = new HashMap<>(3); + result.put("name", matcher.group(1)); + result.put("version", matcher.group(2)); + + if (matcher.groupCount() > 2) { + result.put("suffix", matcher.group(3)); + } + + return result; + } + /** * List of cache items. This list is populated during parsing the tree. */ -- cgit v1.2.3-65-gdbad