コード例 #1
0
        /// <summary>
        /// Updates the add-in index of the provided repository
        /// </summary>
        /// <param name="statusMonitor">
        /// Progress monitor where to show progress status and log
        /// </param>
        /// <param name="url">
        /// URL of the repository
        /// </param>
        public void UpdateRepository(IProgressStatus statusMonitor, string url)
        {
            repoList = null;

            IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor(statusMonitor);

            monitor.BeginTask("Updating repositories", service.Configuration.Repositories.Count);
            try {
                int num = service.Configuration.Repositories.Count;
                for (int n = 0; n < num; n++)
                {
                    RepositoryRecord rr = (RepositoryRecord)service.Configuration.Repositories [n];
                    if (((url == null && rr.Enabled) || rr.Url == url) && !rr.IsReference)
                    {
                        UpdateRepository(monitor, new Uri(rr.Url), rr);
                    }
                    monitor.Step(1);
                }
            } catch (Exception ex) {
                statusMonitor.ReportError("Could not get information from repository", ex);
                return;
            } finally {
                monitor.EndTask();
            }

            PurgeUnusedRepositories();
            service.SaveConfiguration();
        }
コード例 #2
0
        public async Task CheckUpdates(ProgressMonitor monitor, bool automatic)
        {
            updateMonitor = monitor;
            try {
                if (UpdateService.UpdateLevel == UpdateLevel.Test)
                {
                    Runtime.AddinSetupService.RegisterMainRepository(UpdateLevel.Test, true);
                }

                currentTask = Task.Run(delegate {
                    using (ProgressStatusMonitor pm = new ProgressStatusMonitor(monitor)) {
                        Runtime.AddinSetupService.Repositories.UpdateAllRepositories(pm);
                        updates = Runtime.AddinSetupService.Repositories.GetAvailableUpdates();
                    }
                });
                await currentTask;
                if (updates.Length > 0)
                {
                    WarnAvailableUpdates();
                }
            } finally {
                updateMonitor = null;
                currentTask   = null;
            }
        }
コード例 #3
0
 void UpdateAddins()
 {
     PropertyService.Set("MonoDevelop.Ide.AddinUpdater.LastCheck", DateTime.Now);
     using (UpdateMonitor) {
         using (ProgressStatusMonitor pm = new ProgressStatusMonitor(UpdateMonitor)) {
             Runtime.AddinSetupService.Repositories.UpdateAllRepositories(pm);
             updates = Runtime.AddinSetupService.Repositories.GetAvailableUpdates();
             if (updates.Length > 0)
             {
                 DispatchService.GuiDispatch(new MessageHandler(WarnAvailableUpdates));
             }
         }
     }
 }
コード例 #4
0
        /// <summary>
        /// Generates an on-line repository
        /// </summary>
        /// <param name="statusMonitor">
        /// Progress monitor where to show progress status
        /// </param>
        /// <param name="path">
        /// Path to the directory that contains the add-ins and that is going to be published
        /// </param>
        /// <remarks>
        /// This method generates the index files required to publish a directory as an online repository
        /// of add-ins.
        /// </remarks>
        public void BuildRepository(IProgressStatus statusMonitor, string path)
        {
            string    mainPath  = Path.Combine(path, "main.mrep");
            ArrayList allAddins = new ArrayList();

            Repository rootrep = (Repository)AddinStore.ReadObject(mainPath, typeof(Repository));

            if (rootrep == null)
            {
                rootrep = new Repository();
            }

            IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor(statusMonitor);

            BuildRepository(monitor, rootrep, path, "root.mrep", allAddins);
            AddinStore.WriteObject(mainPath, rootrep);
            GenerateIndexPage(rootrep, allAddins, path);
            monitor.Log.WriteLine("Updated main.mrep");
        }
コード例 #5
0
 public void CheckUpdates(IProgressMonitor monitor, bool automatic)
 {
     updateMonitor = monitor;
     try {
         if (UpdateService.UpdateLevel == UpdateLevel.Test)
         {
             Runtime.AddinSetupService.RegisterMainRepository(UpdateLevel.Test, true);
         }
         using (ProgressStatusMonitor pm = new ProgressStatusMonitor(monitor)) {
             Runtime.AddinSetupService.Repositories.UpdateAllRepositories(pm);
             updates = Runtime.AddinSetupService.Repositories.GetAvailableUpdates();
             if (updates.Length > 0)
             {
                 DispatchService.GuiDispatch(new MessageHandler(WarnAvailableUpdates));
             }
         }
     } finally {
         updateMonitor = null;
     }
 }
コード例 #6
0
        public void UpdateRepository(IProgressStatus statusMonitor, string url)
        {
            repoList = null;

            IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor(statusMonitor);

            monitor.BeginTask("Updating repositories", service.Configuration.Repositories.Count);
            try {
                int num = service.Configuration.Repositories.Count;
                for (int n = 0; n < num; n++)
                {
                    RepositoryRecord rr = (RepositoryRecord)service.Configuration.Repositories [n];
                    if ((url == null || rr.Url == url) && !rr.IsReference)
                    {
                        UpdateRepository(monitor, new Uri(rr.Url), rr);
                    }
                    monitor.Step(1);
                }
            } finally {
                monitor.EndTask();
            }
            service.SaveConfiguration();
        }
コード例 #7
0
        public bool ResolveDependencies(IProgressStatus statusMonitor, PackageCollection packages, out PackageCollection toUninstall, out DependencyCollection unresolved)
        {
            IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor(statusMonitor);

            return(ResolveDependencies(monitor, packages, out toUninstall, out unresolved));
        }
コード例 #8
0
        public void Uninstall(IProgressStatus statusMonitor, IEnumerable <string> ids)
        {
            IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor(statusMonitor);

            monitor.BeginTask("Uninstalling add-ins", ids.Count());

            foreach (string id in ids)
            {
                bool      rollback          = false;
                ArrayList toUninstall       = new ArrayList();
                ArrayList uninstallPrepared = new ArrayList();

                Addin ia = service.Registry.GetAddin(id);
                if (ia == null)
                {
                    throw new InstallException("The add-in '" + id + "' is not installed.");
                }

                toUninstall.Add(AddinPackage.FromInstalledAddin(ia));

                Addin[] deps = GetDependentAddins(id, true);
                foreach (Addin dep in deps)
                {
                    toUninstall.Add(AddinPackage.FromInstalledAddin(dep));
                }

                monitor.BeginTask("Deleting files", toUninstall.Count * 2 + uninstallPrepared.Count + 1);

                // Prepare install

                foreach (Package mpack in toUninstall)
                {
                    try
                    {
                        mpack.PrepareUninstall(monitor, this);
                        monitor.Step(1);
                        uninstallPrepared.Add(mpack);
                    }
                    catch (Exception ex)
                    {
                        ReportException(monitor, ex);
                        rollback = true;
                        break;
                    }
                }

                // Commit install

                if (!rollback)
                {
                    foreach (Package mpack in toUninstall)
                    {
                        try
                        {
                            mpack.CommitUninstall(monitor, this);
                            monitor.Step(1);
                        }
                        catch (Exception ex)
                        {
                            ReportException(monitor, ex);
                            rollback = true;
                            break;
                        }
                    }
                }

                // Rollback if failed

                if (rollback)
                {
                    monitor.BeginTask("Rolling back uninstall", uninstallPrepared.Count);
                    foreach (Package mpack in uninstallPrepared)
                    {
                        try
                        {
                            mpack.RollbackUninstall(monitor, this);
                        }
                        catch (Exception ex)
                        {
                            ReportException(monitor, ex);
                        }
                    }
                    monitor.EndTask();
                }
                monitor.Step(1);

                // Cleanup

                foreach (Package mpack in uninstallPrepared)
                {
                    try
                    {
                        mpack.EndUninstall(monitor, this);
                        monitor.Step(1);
                    }
                    catch (Exception ex)
                    {
                        monitor.Log.WriteLine(ex);
                    }
                }

                monitor.EndTask();
                monitor.Step(1);
            }

            // Update the extension maps
            service.Registry.Update(statusMonitor);

            monitor.EndTask();

            service.SaveConfiguration();
            ResetCachedData();
        }
コード例 #9
0
        internal bool Install(IProgressStatus statusMonitor, PackageCollection packs)
        {
            // Make sure the registry is up to date
            service.Registry.Update(statusMonitor);

            IProgressMonitor monitor = ProgressStatusMonitor.GetProgressMonitor(statusMonitor);

            PackageCollection    toUninstall;
            DependencyCollection unresolved;

            if (!ResolveDependencies(monitor, packs, out toUninstall, out unresolved))
            {
                monitor.ReportError("Not all dependencies could be resolved.", null);
                return(false);
            }

            ArrayList prepared          = new ArrayList();
            ArrayList uninstallPrepared = new ArrayList();
            bool      rollback          = false;

            monitor.BeginTask("Installing add-ins...", 100);

            // Prepare install

            monitor.BeginStepTask("Initializing installation", toUninstall.Count + packs.Count + 1, 75);

            foreach (Package mpack in toUninstall)
            {
                try
                {
                    mpack.PrepareUninstall(monitor, this);
                    uninstallPrepared.Add(mpack);
                    if (monitor.IsCancelRequested)
                    {
                        throw new InstallException("Installation cancelled.");
                    }
                    monitor.Step(1);
                }
                catch (Exception ex)
                {
                    ReportException(monitor, ex);
                    rollback = true;
                    break;
                }
            }

            monitor.Step(1);

            foreach (Package mpack in packs)
            {
                try
                {
                    mpack.PrepareInstall(monitor, this);
                    if (monitor.IsCancelRequested)
                    {
                        throw new InstallException("Installation cancelled.");
                    }
                    prepared.Add(mpack);
                    monitor.Step(1);
                }
                catch (Exception ex)
                {
                    ReportException(monitor, ex);
                    rollback = true;
                    break;
                }
            }

            monitor.EndTask();

            monitor.BeginStepTask("Installing", toUninstall.Count + packs.Count + 1, 20);

            // Commit install

            if (!rollback)
            {
                foreach (Package mpack in toUninstall)
                {
                    try
                    {
                        mpack.CommitUninstall(monitor, this);
                        if (monitor.IsCancelRequested)
                        {
                            throw new InstallException("Installation cancelled.");
                        }
                        monitor.Step(1);
                    }
                    catch (Exception ex)
                    {
                        ReportException(monitor, ex);
                        rollback = true;
                        break;
                    }
                }
            }

            monitor.Step(1);

            if (!rollback)
            {
                foreach (Package mpack in packs)
                {
                    try
                    {
                        mpack.CommitInstall(monitor, this);
                        if (monitor.IsCancelRequested)
                        {
                            throw new InstallException("Installation cancelled.");
                        }
                        monitor.Step(1);
                    }
                    catch (Exception ex)
                    {
                        ReportException(monitor, ex);
                        rollback = true;
                        break;
                    }
                }
            }

            monitor.EndTask();

            // Rollback if failed

            if (monitor.IsCancelRequested)
            {
                monitor = new NullProgressMonitor();
            }

            if (rollback)
            {
                monitor.BeginStepTask("Finishing installation", (prepared.Count + uninstallPrepared.Count) * 2 + 1, 5);

                foreach (Package mpack in prepared)
                {
                    try
                    {
                        mpack.RollbackInstall(monitor, this);
                        monitor.Step(1);
                    }
                    catch (Exception ex)
                    {
                        ReportException(monitor, ex);
                    }
                }

                foreach (Package mpack in uninstallPrepared)
                {
                    try
                    {
                        mpack.RollbackUninstall(monitor, this);
                        monitor.Step(1);
                    }
                    catch (Exception ex)
                    {
                        ReportException(monitor, ex);
                    }
                }
            }
            else
            {
                monitor.BeginStepTask("Finishing installation", prepared.Count + uninstallPrepared.Count + 1, 5);
            }

            // Cleanup

            foreach (Package mpack in prepared)
            {
                try
                {
                    mpack.EndInstall(monitor, this);
                    monitor.Step(1);
                }
                catch (Exception ex)
                {
                    monitor.Log.WriteLine(ex);
                }
            }

            monitor.Step(1);

            foreach (Package mpack in uninstallPrepared)
            {
                try
                {
                    mpack.EndUninstall(monitor, this);
                    monitor.Step(1);
                }
                catch (Exception ex)
                {
                    monitor.Log.WriteLine(ex);
                }
            }

            // Update the extension maps
            service.Registry.Update(statusMonitor);

            monitor.EndTask();

            monitor.EndTask();

            service.SaveConfiguration();
            ResetCachedData();

            return(!rollback);
        }