Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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.");
            });
        }