private ICommand find_command(ChocolateyConfiguration config, Container container, bool isConsole, Action <ICommand> parseArgs) { var commands = container.GetAllInstances <ICommand>(); var command = commands.Where((c) => { var attributes = c.GetType().GetCustomAttributes(typeof(CommandForAttribute), false); return(attributes.Cast <CommandForAttribute>().Any(attribute => attribute.CommandName.is_equal_to(config.CommandName))); }).FirstOrDefault(); if (command == null) { //todo add a search among other location/extensions for the command if (!string.IsNullOrWhiteSpace(config.CommandName)) { throw new Exception("Could not find a command registered that meets '{0}'".format_with(config.CommandName)); } if (isConsole) { Environment.ExitCode = 1; } } else { if (command.may_require_admin_access()) { warn_when_admin_needs_elevation(config); } if (parseArgs != null) { parseArgs.Invoke(command); } set_source_type(config); this.Log().Debug(() => "Configuration: {0}".format_with(config.ToString())); if (isConsole && config.HelpRequested) { #if DEBUG Console.WriteLine("Press enter to continue..."); Console.ReadKey(); #endif Environment.Exit(1); } var token = Assembly.GetExecutingAssembly().get_public_key_token(); if (string.IsNullOrWhiteSpace(token) || token != ApplicationParameters.OfficialChocolateyPublicKey) { if (!config.AllowUnofficialBuild) { throw new Exception(@" Custom unofficial builds are not allowed by default. To override this behavior, explicitly set --allow-unofficial. See the help menu (choco -h) for options."); } else { this.Log().Warn(ChocolateyLoggers.Important, @" Chocolatey is not an official build (bypassed with --allow-unofficial). If you are seeing this message and it is not expected, your system may now be in a bad state. Only official builds are to be trusted. " ); } } if (config.Noop) { if (config.RegularOutput) { this.Log().Info("_ {0}:{1} - Noop Mode _".format_with(ApplicationParameters.Name, command.GetType().Name)); } command.noop(config); return(null); } } return(command); }