Example #1
0
        private void InstallExtension(IVsExtensionRepository repository, IVsExtensionManager manager, KeyValuePair <string, string> product)
        {
#if DEBUG
            System.Threading.Thread.Sleep(1000);
            return;
#endif

            try
            {
                GalleryEntry entry = repository.CreateQuery <GalleryEntry>(includeTypeInQuery: false, includeSkuInQuery: true, searchSource: "ExtensionManagerUpdate")
                                     .Where(e => e.VsixID == product.Key)
                                     .AsEnumerable()
                                     .FirstOrDefault();

                if (entry != null)
                {
                    IInstallableExtension installable = repository.Download(entry);
                    manager.Install(installable, false);

                    Telemetry.TrackEvent(installable.Header.Name);
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
            }
        }
Example #2
0
        private void InstallExtension(IVsExtensionRepository repository, IVsExtensionManager manager, KeyValuePair <string, string> product, DataStore store)
        {
#if DEBUG
            System.Threading.Thread.Sleep(1000);
            return;
#endif

            GalleryEntry entry = null;

            try
            {
                entry = repository.CreateQuery <GalleryEntry>(includeTypeInQuery: false, includeSkuInQuery: true, searchSource: "ExtensionManagerUpdate")
                        .Where(e => e.VsixID == product.Key)
                        .AsEnumerable()
                        .FirstOrDefault();

                if (entry != null)
                {
                    var installable = repository.Download(entry);
                    manager.Install(installable, false);
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
            }
            finally
            {
                if (entry != null)
                {
                    store.PreviouslyInstalledExtensions.Add(entry.VsixID);
                }
            }
        }
        public async Task InstallExtensions(IEnumerable <IExtensionModel> extensionModels)
        {
            bool hasInstalled = false;
            int  count        = extensionModels.Count();

            _progress = new InstallerProgress(count, $"Downloading and installing {count} extension(s)...");
            _progress.Show();

            await Task.Run(() =>
            {
                foreach (IExtensionModel model in extensionModels)
                {
                    try
                    {
                        GalleryEntry entry = _repository.CreateQuery <GalleryEntry>(includeTypeInQuery: false, includeSkuInQuery: true, searchSource: "ExtensionManagerUpdate")
                                             .Where(e => e.VsixID == model.ProductId)
                                             .AsEnumerable()
                                             .FirstOrDefault();

                        if (!_progress.IsVisible)
                        {
                            break;
                        }

                        if (entry != null)
                        {
                            IInstallableExtension installable = _repository.Download(entry);

                            if (!_progress.IsVisible)
                            {
                                break;
                            }

                            _manager.Install(installable, false);
                            hasInstalled = true;

                            var props = new Dictionary <string, string> {
                                { "extension", model.Name }
                            };
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(ex);
                    }
                }
            });

            if (_progress.IsVisible)
            {
                _progress.Close();
                _progress = null;
            }

            if (hasInstalled)
            {
                PromptForRestart();
            }
        }
Example #4
0
        private void InstallExtension(ExtensionEntry extension, IVsExtensionRepository repository, IVsExtensionManager manager)
        {
            GalleryEntry entry = null;

            OnUpdate(string.Format(Resources.Text.InstallingExtension, extension.Name));

            try
            {
                Logger.Log($"{Environment.NewLine}{extension.Name}");
                Logger.Log("  " + Resources.Text.Verifying, false);

                entry = repository.GetVSGalleryExtensions <GalleryEntry>(new List <string> {
                    extension.Id
                }, 1033, false)?.FirstOrDefault();

                if (entry != null)
                {
                    Logger.Log(Resources.Text.Ok); // Marketplace ok
                    Logger.Log("  " + Resources.Text.Downloading, false);
#if !DEBUG
                    IInstallableExtension installable = repository.Download(entry);
#endif
                    Logger.Log(Resources.Text.Ok); // Download ok
                    Logger.Log("  " + Resources.Text.Installing, false);
#if !DEBUG
                    manager.Install(installable, false);
#else
                    Thread.Sleep(2000);
#endif
                    Logger.Log(Resources.Text.Ok); // Install ok
                    Telemetry.Install(extension.Id, true);
                }
                else
                {
                    Logger.Log(Resources.Text.Failed); // Markedplace failed
                }
            }
            catch (Exception)
            {
                Logger.Log(Resources.Text.Failed);
                Telemetry.Install(extension.Id, false);
            }
            finally
            {
                if (entry != null)
                {
                    Store.MarkInstalled(extension);
                }
            }
        }
    //Checks the version of the extension on the VS Gallery and downloads it if necessary.
    private IInstallableExtension FetchIfUpdated(IInstalledExtension extension, CodeConnectRepositoryEntry entry)
    {
        var version       = extension.Header.Version;
        var strNewVersion = _extensionRepository.GetCurrentExtensionVersions("ExtensionManagerQuery", new List <string>()
        {
            "6767f237-b6e4-4d95-9982-c9e898f72502"
        }, 1033).Single();
        var newVersion = Version.Parse(strNewVersion);

        if (newVersion > version)
        {
            var newestVersion = _extensionRepository.Download(entry);
            return(newestVersion);
        }
        return(null);
    }
Example #6
0
        public static RestartReason CheckForUpdates(string identifier, string updateUrl)
        {
            // Don't check for updates on non-DEPLOY builds; the URLs don't work and it seems
            // undesirable anyway.
#if DEPLOY
            IVsExtensionManager extensionManager   = Package.GetGlobalService(typeof(SVsExtensionManager)) as IVsExtensionManager;
            IInstalledExtension installedExtension = extensionManager.GetInstalledExtension(identifier);
            if (installedExtension == null)
            {
                throw new Exception(String.Format("Unable to find extension: {0}", identifier));
            }

            RepositoryEntry entry = new RepositoryEntry();
            entry.DownloadUrl = updateUrl;

            IVsExtensionRepository repository      = Package.GetGlobalService(typeof(SVsExtensionRepository)) as IVsExtensionRepository;
            IInstallableExtension  latestExtension = repository.Download(entry);

            if (latestExtension.Header.Version > installedExtension.Header.Version)
            {
                RestartReason reason = RestartReason.None;
                reason |= extensionManager.Disable(installedExtension);
                extensionManager.Uninstall(installedExtension);

                try {
                    reason |= extensionManager.Install(latestExtension, /*perMachine*/ false);

                    // Enable the new one.
                    IInstalledExtension latestInstalledExtension = extensionManager.GetInstalledExtension(latestExtension.Header.Identifier);
                    reason |= extensionManager.Enable(latestInstalledExtension);
                    return(reason);
                } catch {
                    // Revert the uninstallation.
                    extensionManager.RevertUninstall(installedExtension);
                    extensionManager.Enable(installedExtension);
                    throw;
                }
            }
#endif
            return(RestartReason.None);
        }
Example #7
0
        public void InstallExtension(ExtensionEntry extension, IVsExtensionRepository repository, IVsExtensionManager manager)
        {
            GalleryEntry entry = null;

            OnUpdate(string.Format("Installing Extension: ", extension.Name));

            try
            {
                Logger.Log($"{Environment.NewLine}{extension.Name}");
                Logger.Log("  " + "Verifying ", false);

                entry = repository.GetVSGalleryExtensions <GalleryEntry>(new List <string> {
                    extension.Id
                }, 1033, false)?.FirstOrDefault();

                if (entry != null)
                {
                    Logger.Log("Marketplace OK"); // Marketplace ok
                    Logger.Log("  " + "Downloading", false);

                    IInstallableExtension installable = repository.Download(entry);
                    Logger.Log("Downloading OK"); // Download ok
                    Logger.Log("  " + "Installing", false);
                    manager.Install(installable, false);
                    Logger.Log("Install OK"); // Install ok
                    Telemetry.Install(extension.Id, true);
                }
                else
                {
                    Logger.Log("Marketplace failed"); // Markedplace failed
                }
            }
            catch (Exception)
            {
                Logger.Log("Install failed exception");
                Telemetry.Install(extension.Id, false);
            }
            finally
            {
            }
        }
        public bool CheckForUpdate(IInstalledExtension extension, out IInstallableExtension update)
        {
            // Find the vsix on the vs gallery
            // IMPORTANT: The .AsEnumerble() call is REQUIRED. Don't remove it or the update service won't work.
            GalleryEntry entry = _repository.CreateQuery <GalleryEntry>(includeTypeInQuery: false, includeSkuInQuery: true, searchSource: "ExtensionManagerUpdate")
                                 .Where(e => e.VsixID == extension.Header.Identifier)
                                 .AsEnumerable()
                                 .FirstOrDefault();

            // If we're running an older version then update
            if (entry != null && entry.NonNullVsixVersion > extension.Header.Version)
            {
                update = _repository.Download(entry);
                return(true);
            }
            else
            {
                update = null;
                return(false);
            }
        }
Example #9
0
        private RestartReason InstallExtension(ExtensionEntry extension, IVsExtensionRepository repository, IVsExtensionManager manager)
        {
            GalleryEntry entry = null;

            OnUpdate(string.Format("{0} ({1})", _settings.ResourceProvider.InstallingExtension, extension.Name));
            var ret = RestartReason.None;

            try
            {
                _logger.Log($"{Environment.NewLine}{extension.Name}");
                _logger.Log("  " + _settings.ResourceProvider.Verifying, false);

                entry = repository.GetVSGalleryExtensions <GalleryEntry>(new List <string> {
                    extension.Id
                }, 1033, false)?.FirstOrDefault();

                if (entry != null)
                {
                    _logger.Log(_settings.ResourceProvider.Ok); // Marketplace ok
#if DEBUG || true
                    var extensionsByAuthor = manager.GetInstalledExtensions().GroupBy(x => x.Header.Author).Select(y => new { y.Key, items = y }).ToArray();
#endif
                    var installed = manager.GetInstalledExtensions().SingleOrDefault(n => n.Header.Identifier == extension.Id);
                    _logger.Log("  " + _settings.ResourceProvider.Verifying, false);
                    IInstallableExtension installable = null;

                    if (installed != null)
                    {
                        if (NewerVersionExists(installed, repository, entry))
                        {
                            installed = null;
                        }
                    }
                    _logger.Log("  " + _settings.ResourceProvider.Ok);
                    if (installed == null)
                    {
                        _logger.Log("  " + _settings.ResourceProvider.Downloading, false);
                        installable = repository.Download(entry);
                        _logger.Log(_settings.ResourceProvider.Ok); // Download ok
                    }

                    if (installable == null)
                    {
                        _logger.Log(" nothing to do");
                    }
                    else
                    {
                        _logger.Log("  " + _settings.ResourceProvider.Installing, false);

                        ret = manager.Install(installable, false);
                        _logger.Log(_settings.ResourceProvider.Ok); // Install ok
                    }

                    Telemetry.Install(extension.Id, true);
                }
                else
                {
                    _logger.Log(_settings.ResourceProvider.Failed); // Markedplace failed
                }
            }
            catch (Exception e)
            {
                _logger.Log(_settings.ResourceProvider.Failed);
                _logger.Log("Failed to install package: " + e.Message);
                _log.Error(e);
                Telemetry.Install(extension.Id, false);
            }
            finally
            {
                if (entry != null)
                {
                    Store.MarkInstalled(extension);
                }
            }

            return(ret);
        }
Example #10
0
        private void InstallExtension(IVsExtensionRepository repository, IVsExtensionManager manager, KeyValuePair<string, string> product)
        {
            try
            {
                GalleryEntry entry = repository.CreateQuery<GalleryEntry>(includeTypeInQuery: false, includeSkuInQuery: true, searchSource: "ExtensionManagerUpdate")
                                                                                 .Where(e => e.VsixID == product.Key)
                                                                                 .AsEnumerable()
                                                                                 .FirstOrDefault();

                if (entry != null)
                {
                    IInstallableExtension installable = repository.Download(entry);
                    manager.Install(installable, false);

                    Telemetry.TrackEvent(installable.Header.Name);
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
            }
        }
        private void InstallExtension(IVsExtensionRepository repository, IVsExtensionManager manager, KeyValuePair<string, string> product, DataStore store)
        {
#if DEBUG
            System.Threading.Thread.Sleep(1000);
            return;
#endif

            try
            {
                GalleryEntry entry = repository.CreateQuery<GalleryEntry>(includeTypeInQuery: false, includeSkuInQuery: true, searchSource: "ExtensionManagerUpdate")
                                                                                 .Where(e => e.VsixID == product.Key)
                                                                                 .AsEnumerable()
                                                                                 .FirstOrDefault();

                if (entry != null)
                {
                    IInstallableExtension installable = repository.Download(entry);
                    manager.Install(installable, false);
                    store.PreviouslyInstalledExtensions.Add(entry.VsixID);
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
            }
        }
        private void Query_ExecuteCompleted(object sender, ExecuteCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                WriteToOutputPane("Error looking up new extension/s in the gallery...");
                _isImportProcessing = false;
                return;
            }

            // Extract results of found extensions
            var foundExtensions       = e.Results.Cast <GalleryEntry>().ToArray();
            var installableExtensions = foundExtensions.Where(entry => _toInstallExtensions.Any(l => l != entry.VsixID)).ToArray();
            var missingExtensions     = _toInstallExtensions.Except(foundExtensions.Select(fe => fe.VsixID)).ToArray();

            if (!installableExtensions.Any())
            {
                WriteToOutputPane("Couldn't find any of the new extension/s in the gallery.");
                _isImportProcessing = false;
                return;
            }

            if (missingExtensions.Any())
            {
                WriteToOutputPane("Couldn't find " + missingExtensions.Length + " of the new extension/s in the gallery.");
            }

            // Download and install the new ones
            WriteToOutputPane("Installing new extension/s:");
            var wasAnInstallSuccessful = false;

            foreach (var installableExtension in installableExtensions)
            {
                var msg = string.Format(" - '{0}' ", installableExtension.Name);

                IInstallableExtension extension = null;
                try
                {
                    extension = _repository.Download(installableExtension);
                    _manager.Install(extension, false);
                    msg += "installed.";
                    wasAnInstallSuccessful = true;
                }
                catch (Exception ex)
                {
                    msg += "install failed. " + ex.Message;
                }

                WriteToOutputPane(msg);
            }

            if (wasAnInstallSuccessful)
            {
                WriteToOutputPane(Environment.NewLine + Environment.NewLine + "Please restart for changes to take affect.");
            }

            WriteToOutputPane("Extensions imported.");

            // Reset
            _isImportProcessing  = false;
            _toInstallExtensions = new string[] { };
        }
Example #13
0
        private async System.Threading.Tasks.Task ExtMgrInstallExtensionAsync()
        {
            GalleryEntry entry = null;

            try
            {
                // Waits for MEF to initialize before the extension manager is ready to use
                var scComponentModel = VSPackageInstaller.VSPackage.GetGlobalService(typeof(SComponentModel));

                IVsExtensionRepository repository = VSPackageInstaller.VSPackage.GetGlobalService(typeof(SVsExtensionRepository)) as IVsExtensionRepository;
                IVsExtensionManager    manager    = VSPackageInstaller.VSPackage.GetGlobalService(typeof(SVsExtensionManager)) as IVsExtensionManager;

                Logger.Log($"{Environment.NewLine}{this.Extension.Title}");
                Logger.Log("  " + "Verifying ", false);


                entry = repository.GetVSGalleryExtensions <GalleryEntry>(new System.Collections.Generic.List <string> {
                    this.Extension.VsixId.ToString()
                }, 1033, false)?.FirstOrDefault();

                if (entry != null)
                {
                    // ensure that we update the URL if it is empty
                    if (entry.DownloadUrl == null)
                    {
                        entry.DownloadUrl = this.Extension.Installer;
                        throw new Exception("This is not a VsiX");
                    }

                    Logger.Log("Marketplace OK"); // Marketplace ok
                    Logger.Log("  " + "Downloading");

                    IInstallableExtension installable = repository.Download(entry);
                    if (installable == null)
                    {
                        throw new Exception("This is not a VsiX");
                    }

                    Logger.Log("Downloading OK"); // Download ok
                    Logger.Log("  " + "Installing");
                    manager.Install(installable, false);
                    Logger.Log("Installation queued OK"); // Install ok
                    Logger.Log("This extension package will now be automatically installed when you exist all instances of Visual Studio");
                }
                else
                {
                    Logger.Log("Marketplace failed"); // Markedplace failed
                    // This is not a VsiX
                    throw new Exception("This is not a VsiX");
                    Logger.Log("Done");
                }
            }
            catch (Exception ex)
            {
                Logger.Log("Extension Manager installtion failed exception: " + ex);
                Logger.Log("Trying manual downloand and install");
                await this.ManualInstallExtensionAsync();
            }
            finally
            {
                await System.Threading.Tasks.Task.Yield();
            }
        }