You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/12/08 17:12:26 UTC

[13/16] geode git commit: GEODE-734: Remove txt file restriction when exporting stack traces

GEODE-734: Remove txt file restriction when exporting stack traces

Adding throws clause to signature instead of catching it in Test.

Separating test scenarios into multiple test cases. Creating files in
TemporaryFolder.

Applying spotless checks

Updated export stack-traces in controller. Removed compulsory file
option. If file is not provided then name is generated. Added one
boolean option fail-if-file-present, if true and file already exists
then command will fail.

Updated Offline help file.

Added test cases to verify new added options

Removed compulsory file option. If file is not provided then name is
generated. Added one boolean option fail-if-file-present, if true and
file already exists then command will fail.

Added message warning user about possible overwrite of file if already
present.

Added test to check if non txt extension file is allowed.

This closes #297


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/90313511
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/90313511
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/90313511

Branch: refs/heads/feature/GEODE-1027
Commit: 903135115a0466d86fa663e965ace3ff47eba6b4
Parents: 67dafd8
Author: Deepak Dixit <de...@gmail.com>
Authored: Sat Nov 26 19:11:52 2016 +0530
Committer: Kirk Lund <kl...@apache.org>
Committed: Thu Dec 8 08:44:52 2016 -0800

----------------------------------------------------------------------
 .../cli/commands/MiscellaneousCommands.java     |  50 +++++-
 .../internal/cli/i18n/CliStrings.java           |  10 +-
 .../MiscellaneousCommandsController.java        |  15 +-
 .../cli/commands/ShowStackTraceDUnitTest.java   | 158 ++++++++++++++++---
 .../cli/commands/golden-help-offline.properties |   9 +-
 5 files changed, 204 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/90313511/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
index 9acdcf1..4ef710c 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
@@ -1023,22 +1023,31 @@ public class MiscellaneousCommands implements CommandMarker {
           optionContext = ConverterHint.ALL_MEMBER_IDNAME,
           help = CliStrings.EXPORT_STACKTRACE__GROUP) String group,
 
-      @CliOption(key = CliStrings.EXPORT_STACKTRACE__FILE, mandatory = true,
-          help = CliStrings.EXPORT_STACKTRACE__FILE__HELP) String fileName) {
+      @CliOption(key = CliStrings.EXPORT_STACKTRACE__FILE,
+          help = CliStrings.EXPORT_STACKTRACE__FILE__HELP) String fileName,
+
+      @CliOption(key = CliStrings.EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT,
+          unspecifiedDefaultValue = "false",
+          help = CliStrings.EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT__HELP) boolean failIfFilePresent) {
 
     Result result = null;
+    StringBuffer filePrefix = new StringBuffer("stacktrace");
     try {
+      if (fileName == null) {
+        fileName = filePrefix.append("_").append(System.currentTimeMillis()).toString();
+      }
+      final File outFile = new File(fileName);
+      if (outFile.exists() && failIfFilePresent) {
+        return ResultBuilder.createShellClientErrorResult(CliStrings.format(
+            CliStrings.EXPORT_STACKTRACE__ERROR__FILE__PRESENT, outFile.getCanonicalPath()));
+      }
+
       Cache cache = CacheFactory.getAnyInstance();
       GemFireCacheImpl gfeCacheImpl = (GemFireCacheImpl) cache;
       InternalDistributedSystem ads = gfeCacheImpl.getSystem();
 
       InfoResultData resultData = ResultBuilder.createInfoResultData();
 
-      if (!fileName.endsWith(".txt")) {
-        return ResultBuilder
-            .createUserErrorResult(CliStrings.format(CliStrings.INVALID_FILE_EXTENTION, ".txt"));
-      }
-
       Map<String, byte[]> dumps = new HashMap<String, byte[]>();
       Set<DistributedMember> targetMembers = null;
 
@@ -1074,6 +1083,33 @@ public class MiscellaneousCommands implements CommandMarker {
     return result;
   }
 
+  /**
+   * Interceptor used by gfsh to intercept execution of shutdownall.
+   */
+  public static class ExportStackTraceInterceptor extends AbstractCliAroundInterceptor {
+    @Override
+    public Result preExecution(GfshParseResult parseResult) {
+
+      Map<String, String> paramValueMap = parseResult.getParamValueStrings();
+      String fileName = paramValueMap.get(CliStrings.EXPORT_STACKTRACE__FILE);
+
+      Response response = readYesNo(
+          CliStrings.format(CliStrings.EXPORT_STACKTRACE_WARN_USER, fileName), Response.YES);
+      if (response == Response.NO) {
+        return ResultBuilder
+            .createShellClientAbortOperationResult(CliStrings.EXPORT_STACKTRACE_MSG_ABORTING);
+      } else {
+        // we dont to show any info result
+        return ResultBuilder.createInfoResult("");
+      }
+    }
+
+    @Override
+    public Result postExecution(GfshParseResult parseResult, Result commandResult) {
+      return commandResult;
+    }
+  }
+
   /***
    * Writes the Stack traces member-wise to a text file
    * 

http://git-wip-us.apache.org/repos/asf/geode/blob/90313511/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
index 9aaef4d..68dd438 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
@@ -1427,12 +1427,18 @@ public class CliStrings {
   public static final String EXPORT_STACKTRACE__FILE = "file";
   public static final String EXPORT_STACKTRACE__FILE__HELP =
       "Name of the file to which the stack traces will be written.";
+  public static final String EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT = "abort-if-file-exists";
+  public static final String EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT__HELP =
+      "Abort the command if already exists at locator directory";
   public static final String EXPORT_STACKTRACE__MEMBER__NOT__FOUND = "Member not found";
   public static final String EXPORT_STACKTRACE__SUCCESS = "stack-trace(s) exported to file: {0}";
   public static final String EXPORT_STACKTRACE__ERROR = "Error occured while showing stack-traces";
+  public static final String EXPORT_STACKTRACE__ERROR__FILE__PRESENT =
+      "Error occured while exporting stack-traces, file {0} already present";
   public static final String EXPORT_STACKTRACE__HOST = "On host : ";
-  public static final String EXPORT_STACKTRACE__INVALID_FILE_TYPE =
-      "Invalid file extension. File must be a text file (.txt)";
+  public static final String EXPORT_STACKTRACE_WARN_USER =
+      "If file {0} already present at locator directory it will be overwritten, do you want to continue?";
+  public static final String EXPORT_STACKTRACE_MSG_ABORTING = "Aborting export stack-traces";
 
   /* 'gc' command */
   public static final String GC = "gc";

http://git-wip-us.apache.org/repos/asf/geode/blob/90313511/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/MiscellaneousCommandsController.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/MiscellaneousCommandsController.java b/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/MiscellaneousCommandsController.java
index a0fc1e3..ac912c8 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/MiscellaneousCommandsController.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/MiscellaneousCommandsController.java
@@ -100,14 +100,18 @@ public class MiscellaneousCommandsController extends AbstractCommandsController
   @RequestMapping(method = RequestMethod.GET, value = "/stacktraces")
   @ResponseBody
   public String exportStackTraces(
-      @RequestParam(value = CliStrings.EXPORT_STACKTRACE__FILE) final String file,
+      @RequestParam(value = CliStrings.EXPORT_STACKTRACE__FILE, required = false) final String file,
       @RequestParam(value = CliStrings.EXPORT_STACKTRACE__GROUP,
           required = false) final String groupName,
       @RequestParam(value = CliStrings.EXPORT_STACKTRACE__MEMBER,
-          required = false) final String memberNameId) {
+          required = false) final String memberNameId,
+      @RequestParam(value = CliStrings.EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT,
+          required = false) final boolean failIfFilePresent) {
     CommandStringBuilder command = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
 
-    command.addOption(CliStrings.EXPORT_STACKTRACE__FILE, decode(file));
+    if (hasValue(file)) {
+      command.addOption(CliStrings.EXPORT_STACKTRACE__FILE, decode(file));
+    }
 
     if (hasValue(groupName)) {
       command.addOption(CliStrings.EXPORT_STACKTRACE__GROUP, groupName);
@@ -117,6 +121,11 @@ public class MiscellaneousCommandsController extends AbstractCommandsController
       command.addOption(CliStrings.EXPORT_STACKTRACE__MEMBER, memberNameId);
     }
 
+    if (hasValue(failIfFilePresent)) {
+      command.addOption(CliStrings.EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT,
+          String.valueOf(failIfFilePresent));
+    }
+
     return processCommand(command.toString());
   }
 

http://git-wip-us.apache.org/repos/asf/geode/blob/90313511/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowStackTraceDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowStackTraceDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowStackTraceDUnitTest.java
index f5d6cde..dda50f6 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowStackTraceDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowStackTraceDUnitTest.java
@@ -15,26 +15,27 @@
 package org.apache.geode.management.internal.cli.commands;
 
 import static org.apache.geode.distributed.ConfigurationProperties.*;
+import static org.apache.geode.test.dunit.Assert.*;
+import static org.apache.geode.test.dunit.LogWriterUtils.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Properties;
 
 import org.apache.geode.management.cli.Result.Status;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
+import org.apache.geode.management.internal.cli.json.GfJsonException;
 import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.SerializableRunnable;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.junit.categories.DistributedTest;
+import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Properties;
-
-import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
-import static org.apache.geode.test.dunit.Assert.assertFalse;
-import static org.apache.geode.test.dunit.Assert.assertTrue;
-import static org.apache.geode.test.dunit.LogWriterUtils.getLogWriter;
+import org.junit.rules.TemporaryFolder;
 
 /***
  * DUnit test for 'show stack-trace' command
@@ -44,6 +45,9 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
 
   private static final long serialVersionUID = 1L;
 
+  @Rule
+  public TemporaryFolder workDirectory = new SerializableTemporaryFolder();
+
   private void createCache(Properties props) {
     getSystem(props);
     getCache();
@@ -90,9 +94,7 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
   public void testExportStacktrace() throws ClassNotFoundException, IOException {
     setupSystem();
 
-    File allStacktracesFile = new File("allStackTraces.txt");
-    allStacktracesFile.createNewFile();
-    allStacktracesFile.deleteOnExit();
+    File allStacktracesFile = workDirectory.newFile("allStackTraces.txt");
     CommandStringBuilder csb = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
     csb.addOption(CliStrings.EXPORT_STACKTRACE__FILE, allStacktracesFile.getCanonicalPath());
     String commandString = csb.toString();
@@ -101,9 +103,7 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
     getLogWriter().info("Output : \n" + commandResultToString(commandResult));
     assertTrue(commandResult.getStatus().equals(Status.OK));
 
-    File mgrStacktraceFile = new File("managerStacktrace.txt");
-    mgrStacktraceFile.createNewFile();
-    mgrStacktraceFile.deleteOnExit();
+    File mgrStacktraceFile = workDirectory.newFile("managerStacktrace.txt");
     csb = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
     csb.addOption(CliStrings.EXPORT_STACKTRACE__FILE, mgrStacktraceFile.getCanonicalPath());
     csb.addOption(CliStrings.EXPORT_STACKTRACE__MEMBER, "Manager");
@@ -113,9 +113,7 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
     getLogWriter().info("Output : \n" + commandResultToString(commandResult));
     assertTrue(commandResult.getStatus().equals(Status.OK));
 
-    File serverStacktraceFile = new File("serverStacktrace.txt");
-    serverStacktraceFile.createNewFile();
-    serverStacktraceFile.deleteOnExit();
+    File serverStacktraceFile = workDirectory.newFile("serverStacktrace.txt");
     csb = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
     csb.addOption(CliStrings.EXPORT_STACKTRACE__FILE, serverStacktraceFile.getCanonicalPath());
     csb.addOption(CliStrings.EXPORT_STACKTRACE__MEMBER, "Server");
@@ -125,9 +123,7 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
     getLogWriter().info("Output : \n" + commandResultToString(commandResult));
     assertTrue(commandResult.getStatus().equals(Status.OK));
 
-    File groupStacktraceFile = new File("groupstacktrace.txt");
-    groupStacktraceFile.createNewFile();
-    groupStacktraceFile.deleteOnExit();
+    File groupStacktraceFile = workDirectory.newFile("groupstacktrace.txt");
     csb = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
     csb.addOption(CliStrings.EXPORT_STACKTRACE__FILE, groupStacktraceFile.getCanonicalPath());
     csb.addOption(CliStrings.EXPORT_STACKTRACE__GROUP, "G2");
@@ -137,9 +133,7 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
     getLogWriter().info("Output : \n" + commandResultToString(commandResult));
     assertTrue(commandResult.getStatus().equals(Status.OK));
 
-    File wrongStackTraceFile = new File("wrongStackTrace.txt");
-    wrongStackTraceFile.createNewFile();
-    wrongStackTraceFile.deleteOnExit();
+    File wrongStackTraceFile = workDirectory.newFile("wrongStackTrace.txt");
     csb = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
     csb.addOption(CliStrings.EXPORT_STACKTRACE__FILE, wrongStackTraceFile.getCanonicalPath());
     csb.addOption(CliStrings.EXPORT_STACKTRACE__MEMBER, "WrongMember");
@@ -149,4 +143,120 @@ public class ShowStackTraceDUnitTest extends CliCommandTestBase {
     getLogWriter().info("Output : \n" + commandResultToString(commandResult));
     assertFalse(commandResult.getStatus().equals(Status.OK));
   }
+
+  /***
+   * Tests the behavior of the show stack-trace command to verify that files with any extension are
+   * allowed Refer: GEODE-734
+   *
+   * @throws ClassNotFoundException
+   * @throws IOException
+   */
+  @Test
+  public void testExportStacktraceWithNonTXTFile() throws ClassNotFoundException, IOException {
+    setupSystem();
+
+    // Test non txt extension file is allowed
+    File stacktracesFile = workDirectory.newFile("allStackTraces.log");
+    CommandStringBuilder commandStringBuilder =
+        new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
+    commandStringBuilder.addOption(CliStrings.EXPORT_STACKTRACE__FILE,
+        stacktracesFile.getCanonicalPath());
+    String exportCommandString = commandStringBuilder.toString();
+    getLogWriter().info("CommandString : " + exportCommandString);
+    CommandResult exportCommandResult = executeCommand(exportCommandString);
+    getLogWriter().info("Output : \n" + commandResultToString(exportCommandResult));
+    assertTrue(exportCommandResult.getStatus().equals(Status.OK));
+
+    // test file with-out any extension
+    File allStacktracesFile = workDirectory.newFile("allStackTraces");
+    commandStringBuilder = new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
+    commandStringBuilder.addOption(CliStrings.EXPORT_STACKTRACE__FILE,
+        allStacktracesFile.getCanonicalPath());
+    exportCommandString = commandStringBuilder.toString();
+    getLogWriter().info("CommandString : " + exportCommandString);
+    exportCommandResult = executeCommand(exportCommandString);
+    getLogWriter().info("Output : \n" + commandResultToString(exportCommandResult));
+    assertTrue(exportCommandResult.getStatus().equals(Status.OK));
+  }
+
+  /***
+   * Tests the behavior of the show stack-trace command when file is already present and
+   * abort-if-file-exists option is set to false(which is default). As a result it should overwrite
+   * the file and return OK status
+   *
+   * @throws ClassNotFoundException
+   * @throws IOException
+   */
+  @Test
+  public void testExportStacktraceWhenFilePresent() throws ClassNotFoundException, IOException {
+    setupSystem();
+
+    // test pass although file present
+    File stacktracesFile = workDirectory.newFile("allStackTraces.log");
+    CommandStringBuilder commandStringBuilder =
+        new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
+    commandStringBuilder.addOption(CliStrings.EXPORT_STACKTRACE__FILE,
+        stacktracesFile.getCanonicalPath());
+    String exportCommandString = commandStringBuilder.toString();
+    getLogWriter().info("CommandString : " + exportCommandString);
+    CommandResult exportCommandResult = executeCommand(exportCommandString);
+    getLogWriter().info("Output : \n" + commandResultToString(exportCommandResult));
+    assertTrue(exportCommandResult.getStatus().equals(Status.OK));
+
+  }
+
+  /***
+   * Tests the behavior of the show stack-trace command when file is already present and when
+   * abort-if-file-exists option is set to true. As a result it should fail with ERROR status
+   *
+   * @throws ClassNotFoundException
+   * @throws IOException
+   */
+  @Test
+  public void testExportStacktraceFilePresentWithAbort()
+      throws ClassNotFoundException, IOException, GfJsonException {
+    setupSystem();
+
+    File stacktracesFile = workDirectory.newFile("allStackTraces.log");
+    CommandStringBuilder commandStringBuilder =
+        new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
+    commandStringBuilder.addOption(CliStrings.EXPORT_STACKTRACE__FILE,
+        stacktracesFile.getCanonicalPath());
+    commandStringBuilder.addOption(CliStrings.EXPORT_STACKTRACE__FAIL__IF__FILE__PRESENT,
+        Boolean.TRUE.toString());
+    String exportCommandString = commandStringBuilder.toString();
+    getLogWriter().info("CommandString : " + exportCommandString);
+    CommandResult exportCommandResult = executeCommand(exportCommandString);
+    getLogWriter().info("Output : \n" + commandResultToString(exportCommandResult));
+    assertTrue(exportCommandResult.getStatus().equals(Status.ERROR));
+    assertTrue(((String) exportCommandResult.getResultData().getGfJsonObject()
+        .getJSONObject("content").getJSONArray("message").get(0))
+            .contains("file " + stacktracesFile.getCanonicalPath() + " already present"));
+  }
+
+  /***
+   * Tests the behavior of the show stack-trace command when file option is not provided File should
+   * get auto-generated
+   *
+   * @throws ClassNotFoundException
+   * @throws IOException
+   */
+  @Test
+  public void testExportStacktraceAutoGenerateFile()
+      throws ClassNotFoundException, IOException, GfJsonException {
+    setupSystem();
+
+    // test auto generated file when file name is not provided
+    CommandStringBuilder commandStringBuilder =
+        new CommandStringBuilder(CliStrings.EXPORT_STACKTRACE);
+    String exportCommandString = commandStringBuilder.toString();
+    getLogWriter().info("CommandString : " + exportCommandString);
+    CommandResult exportCommandResult = executeCommand(exportCommandString);
+    getLogWriter().info("Output : \n" + commandResultToString(exportCommandResult));
+    assertTrue(exportCommandResult.getStatus().equals(Status.OK));
+    assertTrue(
+        ((String) exportCommandResult.getResultData().getGfJsonObject().getJSONObject("content")
+            .getJSONArray("message").get(0)).contains("stack-trace(s) exported to file:"));
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/90313511/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
----------------------------------------------------------------------
diff --git a/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties b/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
index f08a257..786dd40 100644
--- a/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
+++ b/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
@@ -1511,7 +1511,8 @@ IS AVAILABLE\n\
 SYNOPSIS\n\
 \ \ \ \ Export the stack trace for a member or members.\n\
 SYNTAX\n\
-\ \ \ \ export stack-traces --file=value [--member=value] [--group=value]\n\
+\ \ \ \ export stack-traces [--member=value] [--group=value] [--file=value]\n\
+\ \ \ \ [--abort-if-file-exists=value]\n\
 PARAMETERS\n\
 \ \ \ \ member\n\
 \ \ \ \ \ \ \ \ Export the stack trace for a member or members.\n\
@@ -1521,7 +1522,11 @@ PARAMETERS\n\
 \ \ \ \ \ \ \ \ Required: false\n\
 \ \ \ \ file\n\
 \ \ \ \ \ \ \ \ Name of the file to which the stack traces will be written.\n\
-\ \ \ \ \ \ \ \ Required: true\n\
+\ \ \ \ \ \ \ \ Required: false\n\
+\ \ \ \ abort-if-file-exists\n\
+\ \ \ \ \ \ \ \ Abort the command if already exists at locator directory\n\
+\ \ \ \ \ \ \ \ Required: false\n\
+\ \ \ \ \ \ \ \ Default (if the parameter is not specified): false\n\
 
 gc.help=\
 NAME\n\