using System.Collections.Generic;
public static void Main()
foreach(var args in new List<string[]> {
new string[] { "--help" }
,new string[] { "clone", "--help" }
,new string[] { "clone", "git://github.com/commandlineparser/commandline.git" }
,new string[] { "add","--help" }
,new string[] { "add", "addfile.cs" }
,new string[] { "commit", "-m", "initial commit" }
,new string[] { "push", "-f" }
,new string[] { "push", "--force" }
Console.WriteLine("** RUN #{0}. Args: {1}", runcount++, String.Join(" ", args));
static int __YourMain(string[] args)
exitcode = CommandLine.Parser.Default
.ParseArguments<CommitOptions,CloneOptions>(args)
(CommitOptions opts) => RunCommitCommand(opts),
(CloneOptions opts) => RunCloneCommand(opts),
static int __YourMain2(string[] args)
TextWriter helpWriter= new StringWriter();
var parser = new Parser (config=>{
config.HelpWriter=helpWriter;
exitcode = CommandLine.Parser.Default
.ParseArguments<CommitOptions,CloneOptions>(args)
(CommitOptions opts) => RunCommitCommand(opts),
(CloneOptions opts) => RunCloneCommand(opts),
(parserErrors) => DisplayHelp(parserErrors,helpWriter)
static int DisplayHelp (IEnumerable<Error> errs, TextWriter helpWriter) {
Console.WriteLine (helpWriter.ToString ());
static int RunCommitCommand(CommitOptions CommitOptions)
WriteProgramOptions(CommitOptions);
Console.WriteLine("commit message: '{0}'", CommitOptions.Message);
Console.WriteLine("commit amend: {0}", CommitOptions.Amend);
if(string.IsNullOrEmpty(CommitOptions.Message)==true) {
Console.WriteLine("Aborting commit due to empty commit message.");
static int RunCloneCommand(CloneOptions CloneOptions)
WriteProgramOptions(CloneOptions);
if(string.IsNullOrEmpty(CloneOptions.DestinationDirectory))
if(System.Uri.TryCreate(CloneOptions.Source, UriKind.Absolute, out Uri))
CloneOptions.DestinationDirectory = Uri.Segments.Last().TrimStart('/').Replace(".git","");
Console.WriteLine("clone source: {0}", CloneOptions.Source);
Console.WriteLine("clone destination: {0}", String.Join(" ", CloneOptions.DestinationDirectory));
static void WriteProgramOptions(ProgramOptions ProgramOptions)
Console.WriteLine("ProgramOptions type: {0}", ProgramOptions.GetType().Name);
Console.WriteLine("Verbose: {0}", ProgramOptions.Verbose);
Console.WriteLine("Porcelain: {0}", ProgramOptions.Porcelain);
public abstract class ProgramOptions
public bool Verbose { get; set; }
[Option("porcelain", HelpText="use output that can be parsed")]
public bool Porcelain { get; set; }
public class CommitOptions : ProgramOptions
public IEnumerable<string> InputFiles { get; set; }
public string Message { get; set; }
public string Amend { get; set; }
public class CloneOptions : ProgramOptions
public string Source { get; set; }
public string DestinationDirectory { get; set; }