示例#1
0
    static async Task <int> Main(string[] rawArgs)
    {
        var args = new CommandArguments(rawArgs.Select(CommandLineParser.ParseArgument));

        if ((bool?)args["help"] ?? (bool?)args["h"] ?? (bool?)args["?"] ?? false)
        {
            ShowHelp();
            return(1);
        }
        var tasksFileName = (string)args[0];

        if (string.IsNullOrWhiteSpace(tasksFileName))
        {
            tasksFileName = Path.GetFullPath("tasks.json");
            if (!File.Exists(tasksFileName))
            {
                Console.Error.WriteLine("Cannot find tasks.json in the current directory.");
                ShowHelp();
                return(1);
            }
        }
        var config       = LoadTasksConfig(tasksFileName);
        var loggerConfig = new LoggerConfiguration();

        if (config.Logging != null)
        {
            loggerConfig.ReadFrom.KeyValuePairs(config.Logging);
        }
        else
        {
            loggerConfig
            .MinimumLevel.Information()
            .WriteTo.Console();
        }
        if ((bool?)args["v"] ?? false)
        {
            loggerConfig.MinimumLevel.Verbose();
        }
        logger = loggerConfig.CreateLogger();
        try
        {
            using (var siteProvider = new WikiSiteProvider(config.MwSites ?? Enumerable.Empty <MwSite>(), logger))
            {
                var dispatcher = new TaskActionDispatcher(logger, siteProvider);
                foreach (var action in config.Actions)
                {
                    await dispatcher.DispatchAction_(action);
                }
            }

            using (var proc = Process.GetCurrentProcess())
            {
                logger.Information("Peak working set = {PeakWS:0.00}MB", proc.PeakWorkingSet64 / 1024.0 / 1024.0);
            }
        }
        catch (Exception ex)
        {
            logger.Error(ex, "Unhandled exception.");
            if (ex is MediaWikiRemoteException remoteEx)
            {
                logger.Information("Remote stack trace: {StackTrace}", remoteEx.RemoteStackTrace);
            }
            return(-1);
        }
        finally
        {
            logger.Dispose();
        }
        return(0);
    }
示例#2
0
 public TaskActionDispatcher(ILogger rootLogger, WikiSiteProvider mwSiteProvider)
 {
     this.rootLogger     = rootLogger ?? throw new ArgumentNullException(nameof(rootLogger));
     this.mwSiteProvider = mwSiteProvider;
 }