private void UpdateOtherPackages(SitecoreConfigModel sitecoreConfigModel, ProjectModel prj,
                                         IEnumerable <PackageModel> pkgToUpdate, IEnumerable <PackageModel> prjPkgs,
                                         Action <int, object> progressReport)
        {
            progressReport(-1, $"Updating other packages for {prj.Name}");
            foreach (var oldPkg in pkgToUpdate)
            {
                var newPkg = sitecoreConfigModel.OtherPackages.FirstOrDefault(pkg => pkg.Id == oldPkg.Id);
                if (newPkg == null)
                {
                    progressReport(-1, $"Sitecore {sitecoreConfigModel.SitecoreVersion} config does not have an equivelant for {oldPkg.Id}. Reinstalling the same version");
                    newPkg = oldPkg;
                }
                // this will be a pain if the user mistakenly upgrade packages first
                //else if(newPkg.Version == oldPkg.Version)
                //{
                //    projectsUpdateList.State = $"Package {oldPkg.Id} is already up to date with version {oldPkg.Version} ";
                //    continue;
                //}
                try
                {
                    pkgMnger.UpdatePackage(prj.DteProject, newPkg, false);
                    progressReport(-1, $"Package {oldPkg.Id} updated to version {newPkg.Version} ");
                }
                catch (Exception e)
                {
                    progressReport(-1, "Could not install a package " + e.Message);
                }
            }

            progressReport(100, $"done with othe packages for {prj.Name}");
        }
        private void UpdateGlassPackages(SitecoreConfigModel sitecoreConfigModel, ProjectModel prj,
                                         IEnumerable <PackageModel> pkgToUpdate, IEnumerable <PackageModel> prjPkgs,
                                         Action <int, object> progressReport)
        {
            var glassVersionText = sitecoreConfigModel.GlassVersion;

            foreach (var oldPkg in pkgToUpdate)
            {
                var glsPkgNameWithoutVersion =
                    string.IsNullOrEmpty(projectsUpdateList.CurrentGlassVersion) ? oldPkg.Id :
                    oldPkg.Id.Replace(projectsUpdateList.CurrentGlassVersion, string.Empty);
                var newPkg = sitecoreConfigModel.GlassPackages.
                             FirstOrDefault(
                    pkg => pkg.Id.Replace(glassVersionText, string.Empty)
                    .Equals(glsPkgNameWithoutVersion, StringComparison.OrdinalIgnoreCase));
                if (newPkg == null)
                {
                    progressReport(-1, $"Sitecore {sitecoreConfigModel.SitecoreVersion} config does not have an equivelant for {oldPkg.Id}. Reinstalling the same version");
                    newPkg = oldPkg;
                }
                else
                {
                    progressReport(-1, "uninstalling " + oldPkg.Id);
                    try
                    {
                        pkgMnger.UninstallPackage(prj.DteProject, oldPkg, false);
                    }
                    catch (Exception e)
                    {
                        progressReport(-1, "Could not uninstall a package " + e.Message);
                    }
                }


                // this will be a pain if the user mistakenly upgrade packages first
                //else if(newPkg.Version == oldPkg.Version)
                //{
                //    projectsUpdateList.State = $"Package {oldPkg.Id} is already up to date with version {oldPkg.Version} ";
                //    continue;
                //}
                try
                {
                    pkgMnger.UpdatePackage(prj.DteProject, newPkg, false);
                    progressReport(-1, $"installed {newPkg.Id} version {newPkg.Version} ");
                }
                catch (Exception e)
                {
                    progressReport(-1, "Could not install a package " + e.Message);
                }
            }

            progressReport(-1, $"done with glass upgrade for {prj.Name}");
        }
        public static SitecoreConfigModel GetSitecoreConfigModel(string sitecoreVersion)
        {
            var result        = new SitecoreConfigModel();
            var otherPackages = new List <PackageModel>();
            var config        = new XmlDocument();

            try
            {
                config.Load(Path.Combine(PackageConfigFolderPath, $"{sitecoreVersion}.xml"));
                foreach (XmlNode node in config.DocumentElement.ChildNodes)
                {
                    if (node.Name == "SitecorePkgVersion")
                    {
                        result.SitecoreVersion = node.Attributes["Value"].Value;
                    }
                    else if (node.Name == "Framework")
                    {
                        result.Framework = new FrameworkModel {
                            Id = uint.Parse(node.Attributes["id"].Value), Name = node.Attributes["name"].Value
                        };
                    }
                    else if (node.Name == "UnicornPackages")
                    {
                        result.UnicornPackages = ReadChildPackages(node);
                    }
                    else if (node.Name == "GlassPackages")
                    {
                        result.GlassVersion  = node.Attributes["version"].Value;
                        result.GlassPackages = ReadChildPackages(node);
                    }
                    else if (node.Name == "MSPackages")
                    {
                        result.MSPackages = ReadChildPackages(node);
                    }
                    else
                    {
                        otherPackages.AddRange(ReadChildPackages(node));
                    }
                }
                result.OtherPackages = otherPackages;
            }
            catch (Exception e)
            {
                result.Error = "Could not read configuration for file " +
                               Path.Combine(PackageConfigFolderPath, $"{sitecoreVersion}.xml") +
                               e.Message + Environment.NewLine + e.StackTrace;
            }
            return(result);
        }
        UpdateSCPackages(SitecoreConfigModel sitecoreConfigModel, ProjectModel prj,
                         IEnumerable <PackageModel> pkgToUpdate, IEnumerable <PackageModel> prjPkgs,
                         Action <int, object> progressReport)
        {
            progressReport(-1, $"Updating Sitecore packages for {prj.Name}");

            foreach (var oldPkg in pkgToUpdate)
            {
                try
                {
                    var tempPkg = oldPkg;
                    if (tempPkg.Id.EndsWith(".NoReferences"))
                    {
                        progressReport(-1, "uninstalling " + tempPkg.Id);
                        pkgMnger.UninstallPackage(prj.DteProject, tempPkg, false);

                        tempPkg.Id = oldPkg.Id.Replace(".NoReferences", string.Empty);
                    }
                    else if (tempPkg.Id.StartsWith("Sitecore.XA") &&
                             tempPkg.Version != sitecoreConfigModel.SXAVersion)
                    {
                        progressReport(-1, "uninstalling " + tempPkg.Id);
                        pkgMnger.UninstallPackage(prj.DteProject, tempPkg, false);

                        tempPkg.Version = sitecoreConfigModel.SXAVersion;
                        progressReport(-1, "installing " + tempPkg.Id + " with version " + tempPkg.Version);
                        pkgMnger.UpdateScPackage(prj.DteProject, tempPkg, false);
                        progressReport(-1, $"done with Sitecore for {prj.Name}");

                        continue;
                    }
                    else if (tempPkg.Version != sitecoreConfigModel.SitecoreVersion)
                    {
                        progressReport(-1, "uninstalling " + tempPkg.Id);
                        pkgMnger.UninstallPackage(prj.DteProject, tempPkg, false);
                    }
                    tempPkg.Version = sitecoreConfigModel.SitecoreVersion;
                    progressReport(-1, "installing " + tempPkg.Id + " with version " + tempPkg.Version);
                    pkgMnger.UpdateScPackage(prj.DteProject, tempPkg, false);
                }catch (Exception e)
                {
                    progressReport(-1, "Could not install a package " + e.Message);
                }
            }
            progressReport(-1, $"done with Sitecore for {prj.Name}");
        }