Skip to content

Commit

Permalink
Merge #2273 Add a read-execute-print-loop prompt for Cmdline
Browse files Browse the repository at this point in the history
  • Loading branch information
politas committed Feb 13, 2018
2 parents 09309e3 + 99420ba commit de628b7
Show file tree
Hide file tree
Showing 12 changed files with 144 additions and 50 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file.
- [Core] Accept header and infrastructure for auth tokens (#2263 by: HebaruSan; reviewed: dbent)
- [CLI] Add Cmdline import command (#2264 by: HebaruSan; reviewed: politas)
- [Multiple] User interfaces for auth tokens (#2266 by: HebaruSan; reviewed: politas)
- [CLI] Add a read-execute-print-loop prompt for Cmdline (#2273 by: HebaruSan; reviewed: politas)

### Bugfixes

Expand Down
9 changes: 6 additions & 3 deletions Cmdline/Action/AuthToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public AuthToken() { }
/// <returns>
/// Exit code
/// </returns>
public int RunSubCommand(SubCommandOptions unparsed)
public int RunSubCommand(KSPManager manager, CommonOptions opts, SubCommandOptions unparsed)
{
string[] args = unparsed.options.ToArray();
int exitCode = Exit.OK;
Expand All @@ -33,8 +33,12 @@ public int RunSubCommand(SubCommandOptions unparsed)
if (!string.IsNullOrEmpty(option) && suboptions != null)
{
CommonOptions options = (CommonOptions)suboptions;
options.Merge(opts);
user = new ConsoleUser(options.Headless);
manager = new KSPManager(user);
if (manager == null)
{
manager = new KSPManager(user);
}
exitCode = options.Handle(manager, user);
if (exitCode == Exit.OK)
{
Expand Down Expand Up @@ -115,7 +119,6 @@ private int removeAuthToken(RemoveAuthTokenOptions opts)
private const string tokenHeader = "Token";

private IUser user;
private KSPManager manager;
private static readonly ILog log = LogManager.GetLogger(typeof(AuthToken));
}

Expand Down
16 changes: 8 additions & 8 deletions Cmdline/Action/CompatSubCommand.cs → Cmdline/Action/Compat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

namespace CKAN.CmdLine.Action
{
public class CompatSubCommand : ISubCommand
public class Compat : ISubCommand
{
public CompatSubCommand() { }
public Compat() { }

public class CompatOptions : VerbCommandOptions
{
Expand Down Expand Up @@ -65,7 +65,7 @@ public class CompatForgetOptions : InstanceSpecificOptions
[ValueOption(0)] public string Version { get; set; }
}

public int RunSubCommand(SubCommandOptions options)
public int RunSubCommand(KSPManager manager, CommonOptions opts, SubCommandOptions options)
{
var exitCode = Exit.OK;

Expand All @@ -75,9 +75,10 @@ public int RunSubCommand(SubCommandOptions options)
if (!string.IsNullOrEmpty(option) && suboptions != null)
{
CommonOptions comOpts = (CommonOptions)suboptions;
_user = new ConsoleUser(comOpts.Headless);
_kspManager = new KSPManager(_user);
exitCode = comOpts.Handle(_kspManager, _user);
comOpts.Merge(opts);
_user = new ConsoleUser(comOpts.Headless);
_kspManager = manager ?? new KSPManager(_user);
exitCode = comOpts.Handle(_kspManager, _user);
if (exitCode != Exit.OK)
return;
Expand All @@ -88,7 +89,7 @@ public int RunSubCommand(SubCommandOptions options)
var ksp = MainClass.GetGameInstance(_kspManager);
const string versionHeader = "Version";
const string actualHeader = "Actual";
const string actualHeader = "Actual";
var output = ksp
.GetCompatibleVersions()
Expand Down Expand Up @@ -196,7 +197,6 @@ public int RunSubCommand(SubCommandOptions options)
}
}
}, () => { exitCode = MainClass.AfterHelp(); });
RegistryManager.DisposeAll();
return exitCode;
}

Expand Down
3 changes: 1 addition & 2 deletions Cmdline/Action/ISubCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
{
internal interface ISubCommand
{
int RunSubCommand(SubCommandOptions options);
int RunSubCommand(KSPManager manager, CommonOptions opts, SubCommandOptions options);
}
}

16 changes: 8 additions & 8 deletions Cmdline/Action/KSP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ public KSP() { }
internal class KSPSubOptions : VerbCommandOptions
{
[VerbOption("list", HelpText = "List KSP installs")]
public CommonOptions ListOptions { get; set; }
public CommonOptions ListOptions { get; set; }

[VerbOption("add", HelpText = "Add a KSP install")]
public AddOptions AddOptions { get; set; }
public AddOptions AddOptions { get; set; }

[VerbOption("rename", HelpText = "Rename a KSP install")]
public RenameOptions RenameOptions { get; set; }
public RenameOptions RenameOptions { get; set; }

[VerbOption("forget", HelpText = "Forget a KSP install")]
public ForgetOptions ForgetOptions { get; set; }
public ForgetOptions ForgetOptions { get; set; }

[VerbOption("default", HelpText = "Set the default KSP install")]
public DefaultOptions DefaultOptions { get; set; }
Expand Down Expand Up @@ -94,7 +94,7 @@ internal class DefaultOptions : CommonOptions
}

// This is required by ISubCommand
public int RunSubCommand(SubCommandOptions unparsed)
public int RunSubCommand(KSPManager manager, CommonOptions opts, SubCommandOptions unparsed)
{
string[] args = unparsed.options.ToArray();

Expand Down Expand Up @@ -123,8 +123,9 @@ public int RunSubCommand(SubCommandOptions unparsed)
if (!string.IsNullOrEmpty(option) && suboptions != null)
{
CommonOptions options = (CommonOptions)suboptions;
User = new ConsoleUser(options.Headless);
Manager = new KSPManager(User);
options.Merge(opts);
User = new ConsoleUser(options.Headless);
Manager = manager ?? new KSPManager(User);
exitCode = options.Handle(Manager, User);
if (exitCode != Exit.OK)
return;
Expand Down Expand Up @@ -159,7 +160,6 @@ public int RunSubCommand(SubCommandOptions unparsed)
}
}
}, () => { exitCode = MainClass.AfterHelp(); });
RegistryManager.DisposeAll();
return exitCode;
}

Expand Down
47 changes: 47 additions & 0 deletions Cmdline/Action/Prompt.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System;
using CommandLine;
using CommandLine.Text;
using log4net;

namespace CKAN.CmdLine
{

public class Prompt
{
public Prompt() { }

public int RunCommand(KSPManager manager, object raw_options)
{
CommonOptions opts = raw_options as CommonOptions;
bool done = false;
while (!done)
{
// Prompt if not in headless mode
if (!(opts?.Headless ?? false))
{
Console.Write(
manager.CurrentInstance != null
? $"CKAN {Meta.GetVersion()}: KSP {manager.CurrentInstance.Version().ToString()} ({manager.CurrentInstance.Name})> "
: $"CKAN {Meta.GetVersion()}> "
);
}
// Get input
string command = Console.ReadLine();
if (command == null || command == exitCommand)
{
done = true;
}
else if (command != "")
{
// Parse input as if it was a normal command line,
// but with a persistent KSPManager object.
MainClass.Execute(manager, opts, command.Split(' '));
}
}
return Exit.OK;
}

private const string exitCommand = "exit";
}

}
11 changes: 7 additions & 4 deletions Cmdline/Action/Repair.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public string GetUsage(string verb)
}
}

public int RunSubCommand(SubCommandOptions unparsed)
public int RunSubCommand(KSPManager manager, CommonOptions opts, SubCommandOptions unparsed)
{
int exitCode = Exit.OK;
// Parse and process our sub-verbs
Expand All @@ -49,8 +49,12 @@ public int RunSubCommand(SubCommandOptions unparsed)
if (!string.IsNullOrEmpty(option) && suboptions != null)
{
CommonOptions options = (CommonOptions)suboptions;
options.Merge(opts);
User = new ConsoleUser(options.Headless);
KSPManager manager = new KSPManager(User);
if (manager == null)
{
manager = new KSPManager(User);
}
exitCode = options.Handle(manager, User);
if (exitCode != Exit.OK)
return;
Expand All @@ -68,7 +72,6 @@ public int RunSubCommand(SubCommandOptions unparsed)
}
}
}, () => { exitCode = MainClass.AfterHelp(); });
RegistryManager.DisposeAll();
return exitCode;
}

Expand All @@ -79,7 +82,7 @@ public int RunSubCommand(SubCommandOptions unparsed)
/// </summary>
private int Registry(CKAN.KSP ksp)
{
var manager = RegistryManager.Instance(ksp);
RegistryManager manager = RegistryManager.Instance(ksp);
manager.registry.Repair();
manager.Save();
User.RaiseMessage("Registry repairs attempted. Hope it helped.");
Expand Down
8 changes: 4 additions & 4 deletions Cmdline/Action/Repo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ internal class ForgetOptions : InstanceSpecificOptions
}

// This is required by ISubCommand
public int RunSubCommand(SubCommandOptions unparsed)
public int RunSubCommand(KSPManager manager, CommonOptions opts, SubCommandOptions unparsed)
{
string[] args = unparsed.options.ToArray();

Expand All @@ -118,8 +118,9 @@ public int RunSubCommand(SubCommandOptions unparsed)
if (!string.IsNullOrEmpty(option) && suboptions != null)
{
CommonOptions options = (CommonOptions)suboptions;
User = new ConsoleUser(options.Headless);
Manager = new KSPManager(User);
options.Merge(opts);
User = new ConsoleUser(options.Headless);
Manager = manager ?? new KSPManager(User);
exitCode = options.Handle(Manager, User);
if (exitCode != Exit.OK)
return;
Expand Down Expand Up @@ -154,7 +155,6 @@ public int RunSubCommand(SubCommandOptions unparsed)
}
}
}, () => { exitCode = MainClass.AfterHelp(); });
RegistryManager.DisposeAll();
return exitCode;
}

Expand Down
3 changes: 2 additions & 1 deletion Cmdline/CKAN-cmdline.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,15 @@
<Compile Include="Action\AuthToken.cs" />
<Compile Include="Action\Available.cs" />
<Compile Include="Action\Compare.cs" />
<Compile Include="Action\CompatSubCommand.cs" />
<Compile Include="Action\Compat.cs" />
<Compile Include="Action\ICommand.cs" />
<Compile Include="Action\Import.cs" />
<Compile Include="Action\Install.cs" />
<Compile Include="Action\ISubCommand.cs" />
<Compile Include="Action\KSP.cs" />
<Compile Include="Action\List.cs" />
<Compile Include="Action\Remove.cs" />
<Compile Include="Action\Prompt.cs" />
<Compile Include="Action\Repair.cs" />
<Compile Include="Action\Repo.cs" />
<Compile Include="Action\Search.cs" />
Expand Down
49 changes: 34 additions & 15 deletions Cmdline/Main.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,26 +56,38 @@ public static int Main(string[] args)
return Gui(new GuiOptions(), args);
}

try
{
return Execute(null, null, args);
}
finally
{
RegistryManager.DisposeAll();
}
}

public static int Execute(KSPManager manager, CommonOptions opts, string[] args)
{
// We shouldn't instantiate Options if it's a subcommand.
// It breaks command-specific help, for starters.
try
{
switch (args[0])
{
case "repair":
return (new Repair()).RunSubCommand(new SubCommandOptions(args));
return (new Repair()).RunSubCommand(manager, opts, new SubCommandOptions(args));

case "ksp":
return (new KSP()).RunSubCommand(new SubCommandOptions(args));
return (new KSP()).RunSubCommand(manager, opts, new SubCommandOptions(args));

case "compat":
return (new CompatSubCommand()).RunSubCommand(new SubCommandOptions(args));
return (new Compat()).RunSubCommand(manager, opts, new SubCommandOptions(args));

case "repo":
return (new Repo()).RunSubCommand(new SubCommandOptions(args));
return (new Repo()).RunSubCommand(manager, opts, new SubCommandOptions(args));

case "authtoken":
return (new AuthToken()).RunSubCommand(new SubCommandOptions(args));
return (new AuthToken()).RunSubCommand(manager, opts, new SubCommandOptions(args));
}
}
catch (NoGameInstanceKraken)
Expand Down Expand Up @@ -103,8 +115,16 @@ public static int Main(string[] args)

// Process commandline options.
CommonOptions options = (CommonOptions)cmdline.options;
options.Merge(opts);
IUser user = new ConsoleUser(options.Headless);
KSPManager manager = new KSPManager(user);
if (manager == null)
{
manager = new KSPManager(user);
}
else
{
manager.User = user;
}

try
{
Expand Down Expand Up @@ -154,28 +174,31 @@ private static int RunSimpleAction(Options cmdline, CommonOptions options, strin
case "consoleui":
return ConsoleUi(options, args);

case "prompt":
return new Prompt().RunCommand(manager, cmdline.options);

case "version":
return Version(user);

case "update":
return (new Update(user)).RunCommand(GetGameInstance(manager), (UpdateOptions)cmdline.options);
return (new Update(user)).RunCommand(GetGameInstance(manager), cmdline.options);

case "available":
return (new Available(user)).RunCommand(GetGameInstance(manager), (AvailableOptions)cmdline.options);
return (new Available(user)).RunCommand(GetGameInstance(manager), cmdline.options);

case "add":
case "install":
Scan(GetGameInstance(manager), user, cmdline.action);
return (new Install(user)).RunCommand(GetGameInstance(manager), (InstallOptions)cmdline.options);
return (new Install(user)).RunCommand(GetGameInstance(manager), cmdline.options);

case "scan":
return Scan(GetGameInstance(manager), user);

case "list":
return (new List(user)).RunCommand(GetGameInstance(manager), (ListOptions)cmdline.options);
return (new List(user)).RunCommand(GetGameInstance(manager), cmdline.options);

case "show":
return (new Show(user)).RunCommand(GetGameInstance(manager), (ShowOptions)cmdline.options);
return (new Show(user)).RunCommand(GetGameInstance(manager), cmdline.options);

case "search":
return (new Search(user)).RunCommand(GetGameInstance(manager), options);
Expand Down Expand Up @@ -206,10 +229,6 @@ private static int RunSimpleAction(Options cmdline, CommonOptions options, strin
{
return printMissingInstanceError(user);
}
finally
{
RegistryManager.DisposeAll();
}
}

private static int printMissingInstanceError(IUser user)
Expand Down
Loading

0 comments on commit de628b7

Please sign in to comment.