Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a read-execute-print-loop prompt for Cmdline #2273

Merged
merged 1 commit into from
Feb 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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