private static void SetupRobot(Options options) { var childAppDomain = AppDomain.CreateDomain(Guid.NewGuid().ToString("N")); var wrapper = childAppDomain.CreateInstanceAndUnwrap(typeof(RobotWrapper).Assembly.FullName, typeof(RobotWrapper).FullName) as RobotWrapper; wrapper.Start(options); //Blocks, waiting on a reset event. AppDomain.Unload(childAppDomain); PackageDirCleaner.CleanUpPackages(); SetupRobot(options); }
public static void Run(Options options) { var childAppDomain = AppDomain.CreateDomain(Guid.NewGuid().ToString("N")); _wrapper = childAppDomain.CreateInstanceAndUnwrap(typeof(RobotWrapper).Assembly.FullName, typeof(RobotWrapper).FullName) as RobotWrapper; _wrapper.Start(options); //Blocks, waiting on a reset event. //Select and ToList called to force re-instantiation of all strings and list itself inside of this outer AppDomain //or we will get crazy exceptions related to disposing/unloading of the child AppDomain in which the bot itself runs AppDomain.Unload(childAppDomain); PackageDirCleaner.CleanUpPackages(); if (!_stopRequested) { Run(options); } }
static void Main(string[] args) { var options = new Options(); CommandLine.Parser.Default.ParseArguments(args, options); if (options.ShowHelp) { return; } //always cleanup if needed PackageDirCleaner.CleanUpPackages(); if (options.RunAsService) { ServiceBase.Run(new ServiceBase[] { new Service(options) }); } else { if (options.LastParserState != null && options.LastParserState.Errors.Any()) { return; } if (options.Parameters != null && options.Parameters.Any()) { options.Parameters.ForEach(Console.WriteLine); } if (options.Init) { Initializer.InitializeCurrentDirectory(); return; } SetupRobot(options); } }
public void Register(Robot robot) { RememberConfiguredSources(robot); RememberConfiguredAliases(robot); RememberConfiguredAutoReset(robot); robot.Respond(BuildCommand(new[] { List, Package, Source }), msg => msg.Send(GetRememberedSources(robot).ToArray())); robot.Respond(BuildCommand(new[] { Add, Package, Source, ParamWithNoSpaces }), msg => { var source = msg.Match[4].ToString(CultureInfo.InvariantCulture); msg.Send(!AddSource(source, robot) ? "I already know about this one." : "Consider it done."); }); robot.Respond(BuildCommand(new[] { Remove, Package, Source, ParamWithNoSpaces }), msg => { var source = msg.Match[4].ToString(CultureInfo.InvariantCulture); msg.Send(RemoveSource(source, robot) ? "I'll forget it immediately." : "It's easy to forget what you never knew."); }); robot.Respond(BuildCommand(new[] { Update, Package, ParamWithNoSpaces, Restart }, new[] { 3 }), msg => { //ID of the package to be looked up var packageId = msg.Match[3].ToString(CultureInfo.InvariantCulture); string unaliasedPackageId; var knownAliases = GetRememberedAliases(robot); if (!knownAliases.TryGetValue(packageId.ToLower(), out unaliasedPackageId)) { unaliasedPackageId = packageId; } msg.Send("Building repositories..."); IPackageRepository repo = BuildPackagesRepository(robot); //Get the list of all NuGet packages with ID 'EntityFramework' msg.Send("Finding package..."); List <IPackage> packages = repo.FindPackagesById(unaliasedPackageId).ToList(); IPackage latestPackageVersion; if (packages.Any()) { //try to get the "absolute latest version" and fall back to packages.Last() if none are marked as such latestPackageVersion = packages.Any(p => p.IsAbsoluteLatestVersion) ? packages.First(p => p.IsAbsoluteLatestVersion) : packages.Last(); msg.Send("Found it! Downloading..."); } else { msg.Send("I couldn't find it...sorry!"); return; } //Initialize the package manager string path = GetPackagesPath(); var packageManager = new PackageManager(repo, path); //Download and unzip the package packageManager.InstallPackage(latestPackageVersion, false, true);//TODO: allow these flags to be configurable? allow user to specify version? msg.Send("Finished downloading..."); var postInstallState = packageManager.LocalRepository.GetPackages().Cast <LocalPackage>().ToList(); var packageGroups = postInstallState.GroupBy(p => p.Id); var latestVersions = new List <IPackage>(); foreach (var packageGroup in packageGroups) { var latestPackage = packageGroup.First(p => packageGroup.Max(p2 => p2.Version) == p.Version); latestVersions.Add(latestPackage); } var packageFoldersToDelete = postInstallState.Except(latestVersions).Select(p => Path.Combine(path, p.Id + "." + p.Version)).ToList(); if (packageFoldersToDelete.Any()) { PackageDirCleaner.RegisterDirectoriesToDelete(packageFoldersToDelete); msg.Send("Old package versions to cleanup on next reset: ", string.Join(", ", packageFoldersToDelete)); } if (ShouldAutoResetAfterUpdate(robot) || (msg.Match.Length >= 5 && Regex.IsMatch(msg.Match[4], Restart))) { //They submitted the reset parameter or auto-reset is on. msg.Send("Resetting...please wait."); robot.Reset(); } }); robot.Respond(BuildCommand(new[] { List, Package, Alias }), msg => msg.Send(GetRememberedAliases(robot).Select(kvp => string.Format("{0} = {1}", kvp.Key, kvp.Value)).ToArray())); robot.Respond(BuildCommand(new[] { List, "installed", "packages" }), msg => msg.Send(GetInstalledPackages().Select(kvp => string.Format("{0} - {1}", kvp.Id, kvp.Version)).ToArray())); robot.Respond(BuildCommand(new[] { Add, Package, Alias, ParamWithNoSpaces }), msg => { var alias = msg.Match[4].ToString(CultureInfo.InvariantCulture); AddAlias(alias, robot); msg.Send("I'll be sure to remember that."); }); robot.Respond(BuildCommand(new[] { Remove, Package, Alias, ParamWithNoSpaces }), msg => { var alias = msg.Match[4].ToString(CultureInfo.InvariantCulture); RemoveAlias(alias, robot); msg.Send("As you wish."); }); }