This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-exec.git


The following commit(s) were added to refs/heads/master by this push:
     new 75ea3003 Add CommandLine.CommandLine(Path)
75ea3003 is described below

commit 75ea3003dfffe810df5252cd64da9838eaa3d4e0
Author: Gary D. Gregory <garydgreg...@gmail.com>
AuthorDate: Wed Feb 19 09:10:20 2025 -0500

    Add CommandLine.CommandLine(Path)
---
 pom.xml                                            |  6 ++--
 src/changes/changes.xml                            |  3 +-
 .../java/org/apache/commons/exec/CommandLine.java  | 16 +++++++--
 .../org/apache/commons/exec/AbstractExecTest.java  |  4 +--
 .../apache/commons/exec/DefaultExecutorTest.java   | 16 ++++-----
 .../apache/commons/exec/LogOutputStreamTest.java   |  5 +--
 .../org/apache/commons/exec/StandAloneTest.java    | 38 ++++++++++++++--------
 .../java/org/apache/commons/exec/TestUtil.java     | 14 +++++---
 .../java/org/apache/commons/exec/TutorialTest.java |  3 +-
 .../org/apache/commons/exec/issues/Exec33Test.java |  2 +-
 .../org/apache/commons/exec/issues/Exec34Test.java |  2 +-
 .../org/apache/commons/exec/issues/Exec36Test.java |  2 +-
 .../org/apache/commons/exec/issues/Exec41Test.java |  2 +-
 .../org/apache/commons/exec/issues/Exec44Test.java |  2 +-
 .../org/apache/commons/exec/issues/Exec62Test.java |  2 +-
 15 files changed, 75 insertions(+), 42 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1e3a9b4a..b029d965 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@ limitations under the License.
   <modelVersion>4.0.0</modelVersion>
   <name>Apache Commons Exec</name>
   <artifactId>commons-exec</artifactId>
-  <version>1.4.1-SNAPSHOT</version>
+  <version>1.5.0-SNAPSHOT</version>
 
   <inceptionYear>2005</inceptionYear>
   <description>Apache Commons Exec is a library to reliably execute external 
processes from within the JVM.</description>
@@ -56,8 +56,8 @@ limitations under the License.
     <maven.compiler.target>1.8</maven.compiler.target>
     <commons.rc.version>RC1</commons.rc.version>
     <commons.bc.version>1.3</commons.bc.version>
-    <commons.release.version>1.4.0</commons.release.version>
-    <commons.release.next>1.4.1</commons.release.next>
+    <commons.release.version>1.5.0</commons.release.version>
+    <commons.release.next>1.5.1</commons.release.next>
     <commons.release.isDistModule>true</commons.release.isDistModule>
     <commons.componentid>exec</commons.componentid>
     <commons.module.name>org.apache.commons.exec</commons.module.name>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7ae6f1a9..83bd6da8 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,9 +24,10 @@
         <title>Apache Commons Exec Release Notes</title>
     </properties>
     <body>
-        <release version="1.4.1" date="YYYY-MM-DD" description="Maintenance 
and feature Release (Java 8 or above)">
+        <release version="1.5.0" date="YYYY-MM-DD" description="Maintenance 
and feature Release (Java 8 or above)">
             <!-- ADD -->
             <action type="add" dev="ggregory" due-to="Gary Gregory">Add Maven 
property project.build.outputTimestamp for build reproducibility.</action>
+            <action type="add" dev="ggregory" due-to="Gary Gregory">Add 
CommandLine.CommandLine(Path).</action>
             <!-- FIX -->
             <action type="fix" dev="ggregory" issue="EXEC-122" 
due-to="Marcono1234">Document PumpStreamHandler stream thread-safety 
requirements.</action>
             <action type="fix" dev="ggregory" due-to="Marcono1234">Fix CI only 
running on Ubuntu and improve OS-specific tests #143.</action>
diff --git a/src/main/java/org/apache/commons/exec/CommandLine.java 
b/src/main/java/org/apache/commons/exec/CommandLine.java
index ab1ab264..967dbcdc 100644
--- a/src/main/java/org/apache/commons/exec/CommandLine.java
+++ b/src/main/java/org/apache/commons/exec/CommandLine.java
@@ -18,6 +18,7 @@
 package org.apache.commons.exec;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
@@ -205,7 +206,7 @@ public class CommandLine {
     }
 
     /**
-     * Create a command line without any arguments.
+     * Constructs a command line without any arguments.
      *
      * @param executable the executable file.
      */
@@ -215,7 +216,18 @@ public class CommandLine {
     }
 
     /**
-     * Create a command line without any arguments.
+     * Constructs a command line without any arguments.
+     *
+     * @param executable the executable file.
+     * @since 1.5.0
+     */
+    public CommandLine(final Path executable) {
+        this.isFile = true;
+        this.executable = 
toCleanExecutable(executable.toAbsolutePath().toString());
+    }
+
+    /**
+     * Constructs a command line without any arguments.
      *
      * @param executable the executable.
      * @throws NullPointerException     on null input.
diff --git a/src/test/java/org/apache/commons/exec/AbstractExecTest.java 
b/src/test/java/org/apache/commons/exec/AbstractExecTest.java
index 95e4d626..d503abbc 100644
--- a/src/test/java/org/apache/commons/exec/AbstractExecTest.java
+++ b/src/test/java/org/apache/commons/exec/AbstractExecTest.java
@@ -30,7 +30,7 @@ public abstract class AbstractExecTest {
      * Resolve the OS-specific test file to execute.
      */
     protected File resolveTestScript(final String baseName) {
-        final File result = TestUtil.resolveScriptForOS(testDir + "/" + 
baseName);
+        final File result = TestUtil.resolveScriptFileForOS(testDir + "/" + 
baseName);
         if (!result.exists()) {
             throw new IllegalArgumentException("Unable to find the following 
file: " + result.getAbsolutePath());
         }
@@ -41,7 +41,7 @@ public abstract class AbstractExecTest {
      * Resolve the OS-specific test file to execute.
      */
     protected File resolveTestScript(final String directoryName, final String 
baseName) {
-        final File result = TestUtil.resolveScriptForOS(testDir + "/" + 
directoryName + "/" + baseName);
+        final File result = TestUtil.resolveScriptFileForOS(testDir + "/" + 
directoryName + "/" + baseName);
         if (!result.exists()) {
             throw new IllegalArgumentException("Unable to find the following 
file: " + result.getAbsolutePath());
         }
diff --git a/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java 
b/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java
index 49d8ac4c..9d764e89 100644
--- a/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java
+++ b/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java
@@ -75,17 +75,17 @@ public class DefaultExecutorTest {
     private final File testDir = new File("src/test/scripts");
     private final File foreverOutputFile = new File("./target/forever.txt");
     private ByteArrayOutputStream baos;
-    private final File testScript = TestUtil.resolveScriptForOS(testDir + 
"/test");
-    private final File errorTestScript = TestUtil.resolveScriptForOS(testDir + 
"/error");
-    private final File foreverTestScript = TestUtil.resolveScriptForOS(testDir 
+ "/forever");
-    private final File nonExistingTestScript = 
TestUtil.resolveScriptForOS(testDir + "/grmpffffff");
-    private final File redirectScript = TestUtil.resolveScriptForOS(testDir + 
"/redirect");
+    private final Path testScript = TestUtil.resolveScriptPathForOS(testDir + 
"/test");
+    private final Path errorTestScript = 
TestUtil.resolveScriptPathForOS(testDir + "/error");
+    private final Path foreverTestScript = 
TestUtil.resolveScriptPathForOS(testDir + "/forever");
+    private final Path nonExistingTestScript = 
TestUtil.resolveScriptPathForOS(testDir + "/grmpffffff");
+    private final Path redirectScript = 
TestUtil.resolveScriptPathForOS(testDir + "/redirect");
 
-    private final File printArgsScript = TestUtil.resolveScriptForOS(testDir + 
"/printargs");
+    private final Path printArgsScript = 
TestUtil.resolveScriptPathForOS(testDir + "/printargs");
     // private final File acroRd32Script = TestUtil.resolveScriptForOS(testDir 
+ "/acrord32");
-    private final File stdinSript = TestUtil.resolveScriptForOS(testDir + 
"/stdin");
+    private final Path stdinSript = TestUtil.resolveScriptPathForOS(testDir + 
"/stdin");
 
-    private final File environmentSript = TestUtil.resolveScriptForOS(testDir 
+ "/environment");
+    private final Path environmentSript = 
TestUtil.resolveScriptPathForOS(testDir + "/environment");
 //    private final File wrapperScript = TestUtil.resolveScriptForOS(testDir + 
"/wrapper");
 
     /**
diff --git a/src/test/java/org/apache/commons/exec/LogOutputStreamTest.java 
b/src/test/java/org/apache/commons/exec/LogOutputStreamTest.java
index 5eecb201..bcbea236 100644
--- a/src/test/java/org/apache/commons/exec/LogOutputStreamTest.java
+++ b/src/test/java/org/apache/commons/exec/LogOutputStreamTest.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.OutputStream;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Disabled;
@@ -64,9 +65,9 @@ public class LogOutputStreamTest {
     private final File testDir = new File("src/test/scripts");
     private OutputStream systemOut;
 
-    private final File environmentScript = TestUtil.resolveScriptForOS(testDir 
+ "/environment");
+    private final Path environmentScript = 
TestUtil.resolveScriptPathForOS(testDir + "/environment");
 
-    private final File utf8CharacterScript = 
TestUtil.resolveScriptForOS(testDir + "/utf8Characters");
+    private final Path utf8CharacterScript = 
TestUtil.resolveScriptPathForOS(testDir + "/utf8Characters");
 
     @AfterEach
     public void tearDown() throws Exception {
diff --git a/src/test/java/org/apache/commons/exec/StandAloneTest.java 
b/src/test/java/org/apache/commons/exec/StandAloneTest.java
index 84cef702..b9fa8e71 100644
--- a/src/test/java/org/apache/commons/exec/StandAloneTest.java
+++ b/src/test/java/org/apache/commons/exec/StandAloneTest.java
@@ -20,6 +20,7 @@ package org.apache.commons.exec;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.concurrent.Executors;
 
 import org.junit.jupiter.api.Test;
@@ -33,21 +34,10 @@ import org.junitpioneer.jupiter.SetSystemProperty;
 @SetSystemProperty(key = "org.apache.commons.exec.debug", value = "true")
 public class StandAloneTest {
 
-    @Test
-    @DisabledOnOs(org.junit.jupiter.api.condition.OS.WINDOWS)
-    public void testDefaultExecutor() throws Exception {
-        final File testScript = 
TestUtil.resolveScriptForOS("./src/test/scripts/standalone");
-        final Executor exec = new DefaultExecutor();
-        exec.setStreamHandler(new PumpStreamHandler());
-        final CommandLine cl = new CommandLine(testScript);
-        exec.execute(cl);
-        assertTrue(new File("./target/mybackup.gz").exists());
-    }
-
     @Test
     @DisabledOnOs(org.junit.jupiter.api.condition.OS.WINDOWS)
     public void testDefaultExecutorBuilder() throws Exception {
-        final File testScript = 
TestUtil.resolveScriptForOS("./src/test/scripts/standalone");
+        final Path testScript = 
TestUtil.resolveScriptPathForOS("./src/test/scripts/standalone");
         // @formatter:off
         final Executor exec = DefaultExecutor.builder()
                 .setThreadFactory(Executors.defaultThreadFactory())
@@ -64,11 +54,33 @@ public class StandAloneTest {
     @Test
     @DisabledOnOs(org.junit.jupiter.api.condition.OS.WINDOWS)
     public void testDefaultExecutorDefaultBuilder() throws Exception {
-        final File testScript = 
TestUtil.resolveScriptForOS("./src/test/scripts/standalone");
+        final Path testScript = 
TestUtil.resolveScriptPathForOS("./src/test/scripts/standalone");
         final Executor exec = DefaultExecutor.builder().get();
         exec.setStreamHandler(new PumpStreamHandler());
         final CommandLine cl = new CommandLine(testScript);
         exec.execute(cl);
         assertTrue(new File("./target/mybackup.gz").exists());
     }
+
+    @Test
+    @DisabledOnOs(org.junit.jupiter.api.condition.OS.WINDOWS)
+    public void testDefaultExecutorFromFile() throws Exception {
+        final Path testScript = 
TestUtil.resolveScriptPathForOS("./src/test/scripts/standalone");
+        final Executor exec = new DefaultExecutor();
+        exec.setStreamHandler(new PumpStreamHandler());
+        final CommandLine cl = new CommandLine(testScript);
+        exec.execute(cl);
+        assertTrue(new File("./target/mybackup.gz").exists());
+    }
+
+    @Test
+    @DisabledOnOs(org.junit.jupiter.api.condition.OS.WINDOWS)
+    public void testDefaultExecutorFromPath() throws Exception {
+        final Path testScript = 
TestUtil.resolveScriptPathForOS("./src/test/scripts/standalone");
+        final Executor exec = new DefaultExecutor();
+        exec.setStreamHandler(new PumpStreamHandler());
+        final CommandLine cl = new CommandLine(testScript);
+        exec.execute(cl);
+        assertTrue(new File("./target/mybackup.gz").exists());
+    }
 }
diff --git a/src/test/java/org/apache/commons/exec/TestUtil.java 
b/src/test/java/org/apache/commons/exec/TestUtil.java
index 20d125d1..a4835adb 100644
--- a/src/test/java/org/apache/commons/exec/TestUtil.java
+++ b/src/test/java/org/apache/commons/exec/TestUtil.java
@@ -20,6 +20,8 @@ package org.apache.commons.exec;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 /**
  */
@@ -44,15 +46,19 @@ public final class TestUtil {
         return null; // unreachable.
     }
 
-    public static File resolveScriptForOS(final String script) {
+    public static File resolveScriptFileForOS(final String script) {
+        return resolveScriptPathForOS(script).toFile();
+    }
+
+    public static Path resolveScriptPathForOS(final String script) {
         if (OS.isFamilyWindows()) {
-            return new File(script + ".bat");
+            return Paths.get(script + ".bat");
         }
         if (OS.isFamilyUnix()) {
-            return new File(script + ".sh");
+            return Paths.get(script + ".sh");
         }
         if (OS.isFamilyOpenVms()) {
-            return new File(script + ".dcl");
+            return Paths.get(script + ".dcl");
         }
         fail("Test not supported for this OS");
         return null; // unreachable.
diff --git a/src/test/java/org/apache/commons/exec/TutorialTest.java 
b/src/test/java/org/apache/commons/exec/TutorialTest.java
index 87a49123..2978d659 100644
--- a/src/test/java/org/apache/commons/exec/TutorialTest.java
+++ b/src/test/java/org/apache/commons/exec/TutorialTest.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.time.Duration;
 import java.util.HashMap;
 import java.util.Map;
@@ -70,7 +71,7 @@ public class TutorialTest {
     private final File testDir = new File("src/test/scripts");
 
     /** Simulates a PDF print job */
-    private final File acroRd32Script = TestUtil.resolveScriptForOS(testDir + 
"/acrord32");
+    private final Path acroRd32Script = 
TestUtil.resolveScriptPathForOS(testDir + "/acrord32");
 
     /**
      * Simulate printing a PDF document.
diff --git a/src/test/java/org/apache/commons/exec/issues/Exec33Test.java 
b/src/test/java/org/apache/commons/exec/issues/Exec33Test.java
index af4f6da3..cc46541c 100644
--- a/src/test/java/org/apache/commons/exec/issues/Exec33Test.java
+++ b/src/test/java/org/apache/commons/exec/issues/Exec33Test.java
@@ -37,7 +37,7 @@ public class Exec33Test {
 
     private final Executor exec = DefaultExecutor.builder().get();
     private final File testDir = new File("src/test/scripts");
-    private final File testScript = TestUtil.resolveScriptForOS(testDir + 
"/test");
+    private final File testScript = TestUtil.resolveScriptFileForOS(testDir + 
"/test");
 
     @Test
     public void testExec33() throws Exception {
diff --git a/src/test/java/org/apache/commons/exec/issues/Exec34Test.java 
b/src/test/java/org/apache/commons/exec/issues/Exec34Test.java
index 2f7e8302..11ddb4bb 100644
--- a/src/test/java/org/apache/commons/exec/issues/Exec34Test.java
+++ b/src/test/java/org/apache/commons/exec/issues/Exec34Test.java
@@ -38,7 +38,7 @@ public class Exec34Test {
 
     private final Executor exec = DefaultExecutor.builder().get();
     private final File testDir = new File("src/test/scripts");
-    private final File pingScript = TestUtil.resolveScriptForOS(testDir + 
"/ping");
+    private final File pingScript = TestUtil.resolveScriptFileForOS(testDir + 
"/ping");
 
     /**
      *
diff --git a/src/test/java/org/apache/commons/exec/issues/Exec36Test.java 
b/src/test/java/org/apache/commons/exec/issues/Exec36Test.java
index 8d07d90b..3e343b53 100644
--- a/src/test/java/org/apache/commons/exec/issues/Exec36Test.java
+++ b/src/test/java/org/apache/commons/exec/issues/Exec36Test.java
@@ -44,7 +44,7 @@ public class Exec36Test {
 
     private final Executor exec = DefaultExecutor.builder().get();
     private final File testDir = new File("src/test/scripts");
-    private final File printArgsScript = TestUtil.resolveScriptForOS(testDir + 
"/printargs");
+    private final File printArgsScript = 
TestUtil.resolveScriptFileForOS(testDir + "/printargs");
 
     private ByteArrayOutputStream baos;
 
diff --git a/src/test/java/org/apache/commons/exec/issues/Exec41Test.java 
b/src/test/java/org/apache/commons/exec/issues/Exec41Test.java
index 1fa4ab78..477ea5aa 100644
--- a/src/test/java/org/apache/commons/exec/issues/Exec41Test.java
+++ b/src/test/java/org/apache/commons/exec/issues/Exec41Test.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.api.Test;
 public class Exec41Test {
 
     private final File testDir = new File("src/test/scripts");
-    private final File pingScript = TestUtil.resolveScriptForOS(testDir + 
"/ping");
+    private final File pingScript = TestUtil.resolveScriptFileForOS(testDir + 
"/ping");
 
     /**
      * Test EXEC-41 with a disabled PumpStreamHandler to check if we could 
return immediately after killing the process (no streams implies no blocking 
stream
diff --git a/src/test/java/org/apache/commons/exec/issues/Exec44Test.java 
b/src/test/java/org/apache/commons/exec/issues/Exec44Test.java
index d4c19a24..c4d444ac 100644
--- a/src/test/java/org/apache/commons/exec/issues/Exec44Test.java
+++ b/src/test/java/org/apache/commons/exec/issues/Exec44Test.java
@@ -37,7 +37,7 @@ public class Exec44Test {
 
     private final Executor exec = DefaultExecutor.builder().get();
     private final File testDir = new File("src/test/scripts");
-    private final File foreverTestScript = TestUtil.resolveScriptForOS(testDir 
+ "/forever");
+    private final File foreverTestScript = 
TestUtil.resolveScriptFileForOS(testDir + "/forever");
 
     /**
      *
diff --git a/src/test/java/org/apache/commons/exec/issues/Exec62Test.java 
b/src/test/java/org/apache/commons/exec/issues/Exec62Test.java
index c22ca596..a9e75ff6 100644
--- a/src/test/java/org/apache/commons/exec/issues/Exec62Test.java
+++ b/src/test/java/org/apache/commons/exec/issues/Exec62Test.java
@@ -45,7 +45,7 @@ public class Exec62Test {
     private void execute(final String scriptName) throws Exception {
         final ExecuteWatchdog watchdog = new ExecuteWatchdog(4000);
         final CommandLine commandLine = new CommandLine("/bin/sh");
-        final File testScript = 
TestUtil.resolveScriptForOS("./src/test/scripts/issues/" + scriptName);
+        final File testScript = 
TestUtil.resolveScriptFileForOS("./src/test/scripts/issues/" + scriptName);
 
         commandLine.addArgument(testScript.getAbsolutePath());
 

Reply via email to