From 50380b329e69c0a9fa423475aee59a2c9633db69 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 27 Mar 2014 09:39:25 -0400
Subject: [PATCH] Replace JCommander with args4j

---
 src/main/java/com/gitblit/GitBlitServer.java                |   64 ++++++------
 NOTICE                                                      |   24 +---
 src/main/java/com/gitblit/ReindexTickets.java               |   35 +++---
 src/site/design.mkd                                         |    2 
 .classpath                                                  |    2 
 src/test/java/de/akquinet/devops/GitBlitServer4UITests.java |   15 +-
 src/main/java/com/gitblit/FederationClient.java             |   43 +++----
 releases.moxie                                              |   10 +
 build.moxie                                                 |    2 
 gitblit.iml                                                 |   22 ++--
 src/main/java/com/gitblit/AddIndexedBranch.java             |   30 ++---
 11 files changed, 118 insertions(+), 131 deletions(-)

diff --git a/.classpath b/.classpath
index f0ff08e..764c1ea 100644
--- a/.classpath
+++ b/.classpath
@@ -10,7 +10,6 @@
 	<classpathentry kind="lib" path="ext/dagger-compiler-1.1.0.jar" sourcepath="ext/src/dagger-compiler-1.1.0.jar" />
 	<classpathentry kind="lib" path="ext/javawriter-2.1.1.jar" sourcepath="ext/src/javawriter-2.1.1.jar" />
 	<classpathentry kind="lib" path="ext/annotations-12.0.jar" sourcepath="ext/src/annotations-12.0.jar" />
-	<classpathentry kind="lib" path="ext/jcommander-1.17.jar" sourcepath="ext/src/jcommander-1.17.jar" />
 	<classpathentry kind="lib" path="ext/log4j-1.2.17.jar" sourcepath="ext/src/log4j-1.2.17.jar" />
 	<classpathentry kind="lib" path="ext/slf4j-api-1.6.6.jar" sourcepath="ext/src/slf4j-api-1.6.6.jar" />
 	<classpathentry kind="lib" path="ext/slf4j-log4j12-1.6.6.jar" sourcepath="ext/src/slf4j-log4j12-1.6.6.jar" />
@@ -73,6 +72,7 @@
 	<classpathentry kind="lib" path="ext/jna-3.5.0.jar" sourcepath="ext/src/jna-3.5.0.jar" />
 	<classpathentry kind="lib" path="ext/guava-13.0.1.jar" sourcepath="ext/src/guava-13.0.1.jar" />
 	<classpathentry kind="lib" path="ext/libpam4j-1.7.jar" sourcepath="ext/src/libpam4j-1.7.jar" />
+	<classpathentry kind="lib" path="ext/args4j-2.0.26.jar" sourcepath="ext/src/args4j-2.0.26.jar" />
 	<classpathentry kind="lib" path="ext/jedis-2.3.1.jar" sourcepath="ext/src/jedis-2.3.1.jar" />
 	<classpathentry kind="lib" path="ext/commons-pool2-2.0.jar" sourcepath="ext/src/commons-pool2-2.0.jar" />
 	<classpathentry kind="lib" path="ext/junit-4.11.jar" sourcepath="ext/src/junit-4.11.jar" />
diff --git a/NOTICE b/NOTICE
index 1417eca..359488f 100644
--- a/NOTICE
+++ b/NOTICE
@@ -152,22 +152,6 @@
    http://junit.org
 
 ---------------------------------------------------------------------------
-ant-googlecode
----------------------------------------------------------------------------
-   ant-googlecode, released under the
-   New BSD License
-   
-   http://code.google.com/p/ant-googlecode
-
----------------------------------------------------------------------------
-GenJar
----------------------------------------------------------------------------
-   GenJar, released under the
-   Apache Software License, Version 1.1.
-   
-   http://genjar.sourceforge.net
-   
----------------------------------------------------------------------------
 Fancybox image viewer
 ---------------------------------------------------------------------------
    Fancybox image viewer, released under the
@@ -342,3 +326,11 @@
    MIT license
    
    https://github.com/xetorthio/jedis
+
+---------------------------------------------------------------------------
+args4j
+---------------------------------------------------------------------------
+   args4j, release under the
+   Apache License 2.0
+   
+   http://args4j.kohsuke.org
diff --git a/build.moxie b/build.moxie
index ac85aa3..7ba9b4c 100644
--- a/build.moxie
+++ b/build.moxie
@@ -128,7 +128,6 @@
 - compile 'com.squareup.dagger:dagger-compiler:1.1.0' :war optional apt
 # Standard dependencies
 - compile 'com.intellij:annotations:12.0' :war
-- compile 'com.beust:jcommander:1.17' :fedclient :authority
 - compile 'log4j:log4j:1.2.17' :war :fedclient :authority
 - compile 'org.slf4j:slf4j-api:1.6.6' :war :fedclient :authority
 - compile 'org.slf4j:slf4j-log4j12:1.6.6' :war :fedclient :authority
@@ -169,6 +168,7 @@
 - compile 'org.freemarker:freemarker:2.3.19' :war
 - compile 'com.github.dblock.waffle:waffle-jna:1.5' :war
 - compile 'org.kohsuke:libpam4j:1.7' :war
+- compile 'args4j:args4j:2.0.26' :war :fedclient :authority
 - compile 'commons-codec:commons-codec:1.7' :war
 - compile 'redis.clients:jedis:2.3.1' :war
 - test 'junit'
diff --git a/gitblit.iml b/gitblit.iml
index fc9656f..ba8068e 100644
--- a/gitblit.iml
+++ b/gitblit.iml
@@ -69,17 +69,6 @@
       </library>
     </orderEntry>
     <orderEntry type="module-library">
-      <library name="jcommander-1.17.jar">
-        <CLASSES>
-          <root url="jar://$MODULE_DIR$/ext/jcommander-1.17.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES>
-          <root url="jar://$MODULE_DIR$/ext/src/jcommander-1.17.jar!/" />
-        </SOURCES>
-      </library>
-    </orderEntry>
-    <orderEntry type="module-library">
       <library name="log4j-1.2.17.jar">
         <CLASSES>
           <root url="jar://$MODULE_DIR$/ext/log4j-1.2.17.jar!/" />
@@ -758,6 +747,17 @@
       </library>
     </orderEntry>
     <orderEntry type="module-library">
+      <library name="args4j-2.0.26.jar">
+        <CLASSES>
+          <root url="jar://$MODULE_DIR$/ext/args4j-2.0.26.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES>
+          <root url="jar://$MODULE_DIR$/ext/src/args4j-2.0.26.jar!/" />
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
       <library name="jedis-2.3.1.jar">
         <CLASSES>
           <root url="jar://$MODULE_DIR$/ext/jedis-2.3.1.jar!/" />
diff --git a/releases.moxie b/releases.moxie
index 0a57d40..8b16294 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -13,11 +13,15 @@
     - Repository mailing lists could not be reset from the Edit Repository page (issue-399)
     - Ensure the Lucene ticket index is updated on repository deletion.
     changes:
-    - Option to allow LDAP users to directly authenticate without performing LDAP searches
+    - Option to allow LDAP users to directly authenticate without performing LDAP searches (pr-162))
+    - Replace JCommander with args4j to be consistent with other tools (ticket-28)
     additions:
-    - Added a French translation
-    dependencyChanges: ~
+    - Added a French translation (pr-163)
+    dependencyChanges:
+    - args4j 2.0.26
     contributors:
+    - James Moger
+    - David Ostrovsky
     - Johann Ollivier-Lapeyre
     - Jeremie Brebec
     settings:
diff --git a/src/main/java/com/gitblit/AddIndexedBranch.java b/src/main/java/com/gitblit/AddIndexedBranch.java
index 4b668c4..459e1f0 100644
--- a/src/main/java/com/gitblit/AddIndexedBranch.java
+++ b/src/main/java/com/gitblit/AddIndexedBranch.java
@@ -28,11 +28,10 @@
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
 import org.eclipse.jgit.util.FS;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
 
-import com.beust.jcommander.JCommander;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.ParameterException;
-import com.beust.jcommander.Parameters;
 import com.gitblit.models.RefModel;
 import com.gitblit.utils.ArrayUtils;
 import com.gitblit.utils.JGitUtils;
@@ -48,12 +47,12 @@
 
 	public static void main(String... args) {
 		Params params = new Params();
-		JCommander jc = new JCommander(params);
+		CmdLineParser parser = new CmdLineParser(params);
 		try {
-			jc.parse(args);
-		} catch (ParameterException t) {
+			parser.parseArgument(args);
+		} catch (CmdLineException t) {
 			System.err.println(t.getMessage());
-			jc.usage();
+			parser.printUsage(System.out);
 			return;
 		}
 
@@ -95,7 +94,7 @@
 				Set<String> indexedBranches = new LinkedHashSet<String>();
 
 				// add all local branches to index
-				if(params.addAllLocalBranches) {
+				if (params.addAllLocalBranches) {
 					List<RefModel> list = JGitUtils.getLocalBranches(repository, true, -1);
 					for (RefModel refModel : list) {
 						System.out.println(MessageFormat.format("adding [gitblit] indexBranch={0} for {1}", refModel.getName(), repo));
@@ -129,21 +128,20 @@
 
 
 	/**
-	 * JCommander Parameters class for AddIndexedBranch.
+	 * Parameters class for AddIndexedBranch.
 	 */
-	@Parameters(separators = " ")
 	private static class Params {
 
-		@Parameter(names = { "--repositoriesFolder" }, description = "The root repositories folder ", required = true)
+		@Option(name =  "--repositoriesFolder", usage = "The root repositories folder ", required = true, metaVar = "PATH")
 		public String folder;
 
-		@Parameter(names = { "--branch" }, description = "The branch to index", required = false)
+		@Option(name = "--branch", usage = "The branch to index", metaVar = "BRANCH")
 		public String branch = "default";
 
-		@Parameter(names = { "--skip" }, description = "Skip the named repository (simple fizzy matching is supported)", required = false)
+		@Option(name = "--skip", usage = "Skip the named repository (simple fizzy matching is supported)")
 		public List<String> exclusions = new ArrayList<String>();
 
-		@Parameter(names = { "--all-local-branches" }, description = "Add all local branches to index. If specified, the --branch parameter is not considered.", required = false)
-		public boolean addAllLocalBranches = false;
+		@Option(name = "--all-local-branches", usage = "Add all local branches to index. If specified, the --branch parameter is not considered.")
+		public boolean addAllLocalBranches;
 	}
 }
diff --git a/src/main/java/com/gitblit/FederationClient.java b/src/main/java/com/gitblit/FederationClient.java
index 628a05d..792a638 100644
--- a/src/main/java/com/gitblit/FederationClient.java
+++ b/src/main/java/com/gitblit/FederationClient.java
@@ -20,10 +20,10 @@
 import java.util.Collection;
 import java.util.List;
 
-import com.beust.jcommander.JCommander;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.ParameterException;
-import com.beust.jcommander.Parameters;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+
 import com.gitblit.manager.FederationManager;
 import com.gitblit.manager.GitblitManager;
 import com.gitblit.manager.IGitblit;
@@ -47,11 +47,11 @@
 
 	public static void main(String[] args) {
 		Params params = new Params();
-		JCommander jc = new JCommander(params);
+		CmdLineParser parser = new CmdLineParser(params);
 		try {
-			jc.parse(args);
-		} catch (ParameterException t) {
-			usage(jc, t);
+			parser.parseArgument(args);
+		} catch (CmdLineException t) {
+			usage(parser, t);
 		}
 
 		System.out.println("Gitblit Federation Client v" + Constants.getVersion() + " (" + Constants.getBuildDate() + ")");
@@ -77,7 +77,6 @@
 			model.token = params.token;
 			model.mirror = params.mirror;
 			model.bare = params.bare;
-			model.frequency = params.frequency;
 			model.folder = "";
 			registrations.add(model);
 		}
@@ -112,7 +111,7 @@
 		System.exit(0);
 	}
 
-	private static void usage(JCommander jc, ParameterException t) {
+	private static void usage(CmdLineParser parser, CmdLineException t) {
 		System.out.println(Constants.getGitBlitVersion());
 		System.out.println();
 		if (t != null) {
@@ -120,40 +119,36 @@
 			System.out.println();
 		}
 
-		if (jc != null) {
-			jc.usage();
+		if (parser != null) {
+			parser.printUsage(System.out);
 		}
 		System.exit(0);
 	}
 
 	/**
-	 * JCommander Parameters class for FederationClient.
+	 * Parameters class for FederationClient.
 	 */
-	@Parameters(separators = " ")
 	private static class Params {
 
-		@Parameter(names = { "--registrations" }, description = "Gitblit Federation Registrations File", required = false)
+		@Option(name = "--registrations", usage = "Gitblit Federation Registrations File", metaVar = "FILE")
 		public String registrationsFile = "${baseFolder}/federation.properties";
 
-		@Parameter(names = { "--url" }, description = "URL of Gitblit instance to mirror from", required = false)
+		@Option(name = "--url", usage = "URL of Gitblit instance to mirror from", metaVar = "URL")
 		public String url;
 
-		@Parameter(names = { "--mirror" }, description = "Mirror repositories", required = false)
+		@Option(name = "--mirror", usage = "Mirror repositories")
 		public boolean mirror;
 
-		@Parameter(names = { "--bare" }, description = "Create bare repositories", required = false)
+		@Option(name = "--bare", usage = "Create bare repositories")
 		public boolean bare;
 
-		@Parameter(names = { "--token" }, description = "Federation Token", required = false)
+		@Option(name = "--token", usage = "Federation Token", metaVar = "TOKEN")
 		public String token;
 
-		@Parameter(names = { "--frequency" }, description = "Period to wait between pull attempts (requires --daemon)", required = false)
-		public String frequency = "60 mins";
-
-		@Parameter(names = { "--baseFolder" }, description = "Base folder for received data", required = false)
+		@Option(name = "--baseFolder", usage = "Base folder for received data", metaVar = "PATH")
 		public String baseFolder;
 
-		@Parameter(names = { "--repositoriesFolder" }, description = "Destination folder for cloned repositories", required = false)
+		@Option(name = "--repositoriesFolder", usage = "Destination folder for cloned repositories", metaVar = "PATH")
 		public String repositoriesFolder;
 
 	}
diff --git a/src/main/java/com/gitblit/GitBlitServer.java b/src/main/java/com/gitblit/GitBlitServer.java
index 1e51577..64d3cad 100644
--- a/src/main/java/com/gitblit/GitBlitServer.java
+++ b/src/main/java/com/gitblit/GitBlitServer.java
@@ -55,13 +55,12 @@
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
 import org.eclipse.jgit.util.FileUtils;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.beust.jcommander.JCommander;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.ParameterException;
-import com.beust.jcommander.Parameters;
 import com.gitblit.authority.GitblitAuthority;
 import com.gitblit.authority.NewCertificateConfig;
 import com.gitblit.servlet.GitblitContext;
@@ -96,7 +95,7 @@
 		// filter out the baseFolder parameter
 		List<String> filtered = new ArrayList<String>();
 		String folder = "data";
-		for (int i = 0; i< args.length; i++) {
+		for (int i = 0; i < args.length; i++) {
 			String arg = args[i];
 			if (arg.equals("--baseFolder")) {
 				if (i + 1 == args.length) {
@@ -113,14 +112,14 @@
 
 		Params.baseFolder = folder;
 		Params params = new Params();
-		JCommander jc = new JCommander(params);
+		CmdLineParser parser = new CmdLineParser(params);
 		try {
-			jc.parse(filtered.toArray(new String[filtered.size()]));
+			parser.parseArgument(filtered);
 			if (params.help) {
-				server.usage(jc, null);
+				server.usage(parser, null);
 			}
-		} catch (ParameterException t) {
-			server.usage(jc, t);
+		} catch (CmdLineException t) {
+			server.usage(parser, t);
 		}
 
 		if (params.stop) {
@@ -133,10 +132,10 @@
 	/**
 	 * Display the command line usage of Gitblit GO.
 	 *
-	 * @param jc
+	 * @param parser
 	 * @param t
 	 */
-	protected final void usage(JCommander jc, ParameterException t) {
+	protected final void usage(CmdLineParser parser, CmdLineException t) {
 		System.out.println(Constants.BORDER);
 		System.out.println(Constants.getGitBlitVersion());
 		System.out.println(Constants.BORDER);
@@ -145,8 +144,8 @@
 			System.out.println(t.getMessage());
 			System.out.println();
 		}
-		if (jc != null) {
-			jc.usage();
+		if (parser != null) {
+			parser.printUsage(System.out);
 			System.out
 					.println("\nExample:\n  java -server -Xmx1024M -jar gitblit.jar --repositoriesFolder c:\\git --httpPort 80 --httpsPort 443");
 		}
@@ -624,9 +623,8 @@
 	}
 
 	/**
-	 * JCommander Parameters class for GitBlitServer.
+	 * Parameters class for GitBlitServer.
 	 */
-	@Parameters(separators = " ")
 	public static class Params {
 
 		public static String baseFolder;
@@ -636,69 +634,69 @@
 		/*
 		 * Server parameters
 		 */
-		@Parameter(names = { "-h", "--help" }, description = "Show this help")
+		@Option(name = "--help", aliases = { "-h"}, usage = "Show this help")
 		public Boolean help = false;
 
-		@Parameter(names = { "--stop" }, description = "Stop Server")
+		@Option(name = "--stop", usage = "Stop Server")
 		public Boolean stop = false;
 
-		@Parameter(names = { "--tempFolder" }, description = "Folder for server to extract built-in webapp")
+		@Option(name = "--tempFolder", usage = "Folder for server to extract built-in webapp", metaVar="PATH")
 		public String temp = FILESETTINGS.getString(Keys.server.tempFolder, "temp");
 
-		@Parameter(names = { "--dailyLogFile" }, description = "Log to a rolling daily log file INSTEAD of stdout.")
+		@Option(name = "--dailyLogFile", usage = "Log to a rolling daily log file INSTEAD of stdout.")
 		public Boolean dailyLogFile = false;
 
 		/*
 		 * GIT Servlet Parameters
 		 */
-		@Parameter(names = { "--repositoriesFolder" }, description = "Git Repositories Folder")
+		@Option(name = "--repositoriesFolder", usage = "Git Repositories Folder", metaVar="PATH")
 		public String repositoriesFolder = FILESETTINGS.getString(Keys.git.repositoriesFolder,
 				"git");
 
 		/*
 		 * Authentication Parameters
 		 */
-		@Parameter(names = { "--userService" }, description = "Authentication and Authorization Service (filename or fully qualified classname)")
+		@Option(name = "--userService", usage = "Authentication and Authorization Service (filename or fully qualified classname)")
 		public String userService = FILESETTINGS.getString(Keys.realm.userService,
 				"users.conf");
 
 		/*
 		 * JETTY Parameters
 		 */
-		@Parameter(names = { "--useNio" }, description = "Use NIO Connector else use Socket Connector.")
+		@Option(name = "--useNio", usage = "Use NIO Connector else use Socket Connector.")
 		public Boolean useNIO = FILESETTINGS.getBoolean(Keys.server.useNio, true);
 
-		@Parameter(names = "--httpPort", description = "HTTP port for to serve. (port <= 0 will disable this connector)")
+		@Option(name = "--httpPort", usage = "HTTP port for to serve. (port <= 0 will disable this connector)", metaVar="PORT")
 		public Integer port = FILESETTINGS.getInteger(Keys.server.httpPort, 0);
 
-		@Parameter(names = "--httpsPort", description = "HTTPS port to serve.  (port <= 0 will disable this connector)")
+		@Option(name = "--httpsPort", usage = "HTTPS port to serve.  (port <= 0 will disable this connector)", metaVar="PORT")
 		public Integer securePort = FILESETTINGS.getInteger(Keys.server.httpsPort, 8443);
 
-		@Parameter(names = "--ajpPort", description = "AJP port to serve.  (port <= 0 will disable this connector)")
+		@Option(name = "--ajpPort", usage = "AJP port to serve.  (port <= 0 will disable this connector)", metaVar="PORT")
 		public Integer ajpPort = FILESETTINGS.getInteger(Keys.server.ajpPort, 0);
 
-		@Parameter(names = "--gitPort", description = "Git Daemon port to serve.  (port <= 0 will disable this connector)")
+		@Option(name = "--gitPort", usage = "Git Daemon port to serve.  (port <= 0 will disable this connector)", metaVar="PORT")
 		public Integer gitPort = FILESETTINGS.getInteger(Keys.git.daemonPort, 9418);
 
-		@Parameter(names = "--alias", description = "Alias of SSL certificate in keystore for serving https.")
+		@Option(name = "--alias", usage = "Alias of SSL certificate in keystore for serving https.", metaVar="ALIAS")
 		public String alias = FILESETTINGS.getString(Keys.server.certificateAlias, "");
 
-		@Parameter(names = "--storePassword", description = "Password for SSL (https) keystore.")
+		@Option(name = "--storePassword", usage = "Password for SSL (https) keystore.", metaVar="PASSWORD")
 		public String storePassword = FILESETTINGS.getString(Keys.server.storePassword, "");
 
-		@Parameter(names = "--shutdownPort", description = "Port for Shutdown Monitor to listen on. (port <= 0 will disable this monitor)")
+		@Option(name = "--shutdownPort", usage = "Port for Shutdown Monitor to listen on. (port <= 0 will disable this monitor)", metaVar="PORT")
 		public Integer shutdownPort = FILESETTINGS.getInteger(Keys.server.shutdownPort, 8081);
 
-		@Parameter(names = "--requireClientCertificates", description = "Require client X509 certificates for https connections.")
+		@Option(name = "--requireClientCertificates", usage = "Require client X509 certificates for https connections.")
 		public Boolean requireClientCertificates = FILESETTINGS.getBoolean(Keys.server.requireClientCertificates, false);
 
 		/*
 		 * Setting overrides
 		 */
-		@Parameter(names = { "--settings" }, description = "Path to alternative settings")
+		@Option(name = "--settings", usage = "Path to alternative settings", metaVar="FILE")
 		public String settingsfile;
 
-		@Parameter(names = { "--ldapLdifFile" }, description = "Path to LDIF file.  This will cause an in-memory LDAP server to be started according to gitblit settings")
+		@Option(name = "--ldapLdifFile", usage = "Path to LDIF file.  This will cause an in-memory LDAP server to be started according to gitblit settings", metaVar="FILE")
 		public String ldapLdifFile;
 
 	}
diff --git a/src/main/java/com/gitblit/ReindexTickets.java b/src/main/java/com/gitblit/ReindexTickets.java
index af3ca0b..f3d6d26 100644
--- a/src/main/java/com/gitblit/ReindexTickets.java
+++ b/src/main/java/com/gitblit/ReindexTickets.java
@@ -20,10 +20,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import com.beust.jcommander.JCommander;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.ParameterException;
-import com.beust.jcommander.Parameters;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+
 import com.gitblit.manager.IRepositoryManager;
 import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.manager.RepositoryManager;
@@ -66,15 +66,15 @@
 
 		Params.baseFolder = folder;
 		Params params = new Params();
-		JCommander jc = new JCommander(params);
+		CmdLineParser parser = new CmdLineParser(params);
 		try {
-			jc.parse(filtered.toArray(new String[filtered.size()]));
+			parser.parseArgument(filtered);
 			if (params.help) {
-				reindex.usage(jc, null);
+				reindex.usage(parser, null);
 				return;
 			}
-		} catch (ParameterException t) {
-			reindex.usage(jc, t);
+		} catch (CmdLineException t) {
+			reindex.usage(parser, t);
 			return;
 		}
 
@@ -94,10 +94,10 @@
 	/**
 	 * Display the command line usage of ReindexTickets.
 	 *
-	 * @param jc
+	 * @param parser
 	 * @param t
 	 */
-	protected final void usage(JCommander jc, ParameterException t) {
+	protected final void usage(CmdLineParser parser, CmdLineException t) {
 		System.out.println(Constants.BORDER);
 		System.out.println(Constants.getGitBlitVersion());
 		System.out.println(Constants.BORDER);
@@ -106,8 +106,8 @@
 			System.out.println(t.getMessage());
 			System.out.println();
 		}
-		if (jc != null) {
-			jc.usage();
+		if (parser != null) {
+			parser.printUsage(System.out);
 			System.out
 					.println("\nExample:\n  java -gitblit.jar com.gitblit.ReindexTickets --baseFolder c:\\gitblit-data");
 		}
@@ -162,22 +162,21 @@
 	}
 
 	/**
-	 * JCommander Parameters.
+	 * Parameters.
 	 */
-	@Parameters(separators = " ")
 	public static class Params {
 
 		public static String baseFolder;
 
-		@Parameter(names = { "-h", "--help" }, description = "Show this help")
+		@Option(name = "--help", aliases = { "-h"}, usage = "Show this help")
 		public Boolean help = false;
 
 		private final FileSettings FILESETTINGS = new FileSettings(new File(baseFolder, Constants.PROPERTIES_FILE).getAbsolutePath());
 
-		@Parameter(names = { "--repositoriesFolder" }, description = "Git Repositories Folder")
+		@Option(name = "--repositoriesFolder", usage = "Git Repositories Folder", metaVar = "PATH")
 		public String repositoriesFolder = FILESETTINGS.getString(Keys.git.repositoriesFolder, "git");
 
-		@Parameter(names = { "--settings" }, description = "Path to alternative settings")
+		@Option(name = "--settings", usage = "Path to alternative settings", metaVar = "FILE")
 		public String settingsfile;
 	}
 }
diff --git a/src/site/design.mkd b/src/site/design.mkd
index 9f77e30..8351dd9 100644
--- a/src/site/design.mkd
+++ b/src/site/design.mkd
@@ -32,7 +32,7 @@
 - [Jetty](http://eclipse.org/jetty) (Apache 2.0, EPL 1.0)
 - [SLF4J](http://www.slf4j.org) (MIT/X11)
 - [Log4j](http://logging.apache.org/log4j) (Apache 2.0)
-- [JCommander](http://jcommander.org) (Apache 2.0)
+- [args4j](http://args4j.kohsuke.org) (Apache 2.0)
 - [BouncyCastle](http://www.bouncycastle.org) (MIT/X11)
 - [JSch - Java Secure Channel](http://www.jcraft.com/jsch) (BSD)
 - [Rome](http://rome.dev.java.net) (Apache 1.1)
diff --git a/src/test/java/de/akquinet/devops/GitBlitServer4UITests.java b/src/test/java/de/akquinet/devops/GitBlitServer4UITests.java
index 5e361b9..8d6d703 100644
--- a/src/test/java/de/akquinet/devops/GitBlitServer4UITests.java
+++ b/src/test/java/de/akquinet/devops/GitBlitServer4UITests.java
@@ -4,8 +4,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import com.beust.jcommander.JCommander;
-import com.beust.jcommander.ParameterException;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+
 import com.gitblit.GitBlitServer;
 import com.gitblit.IStoredSettings;
 import com.gitblit.Keys;
@@ -36,14 +37,14 @@
 
 		Params.baseFolder = folder;
 		Params params = new Params();
-		JCommander jc = new JCommander(params);
+		CmdLineParser parser = new CmdLineParser(params);
 		try {
-			jc.parse(filtered.toArray(new String[filtered.size()]));
+			parser.parseArgument(filtered);
 			if (params.help) {
-				server.usage(jc, null);
+				server.usage(parser, null);
 			}
-		} catch (ParameterException t) {
-			server.usage(jc, t);
+		} catch (CmdLineException t) {
+			server.usage(parser, t);
 		}
 
 		if (params.stop) {

--
Gitblit v1.9.1