private async Task <List <Version> > InstallingVersion(IEnumerable <IVersion> versions, ToolsContext toolsContext) { var effectivePortalVersions = new List <Version>(); var dicVersions = new Dictionary <string, List <string> >(); var availableGroupVersions = versions.Select(a => a.VersionNumber).Distinct(); IPatchProcessor patchProcessor = new PatchProcessor(); foreach (var groupVersion in availableGroupVersions) { Console.WriteLine(""); Console.WriteLine("----------------------------------------------------------------"); Console.WriteLine($"------------------Installing Version: {groupVersion}---------------------"); Console.WriteLine("----------------------------------------------------------------"); var matchingVersions = versions.Where(a => a.VersionNumber == groupVersion); var executingVersions = new List <string>(); foreach (var version in matchingVersions) { var executionName = version.GetType().GetTypeInfo().Name; await version.Upgrade(toolsContext.VersionContext); executingVersions.Add(executionName); Console.WriteLine(string.Format("Installing {0} Version {1} Completely!", executionName, version.VersionNumber)); } if (toolsContext.AllowPatch) { var result = await patchProcessor.Proceed(Path.Combine(toolsContext.PatchesFolder, groupVersion), toolsContext.VersionContext.DatabaseOptions as DatabaseOptions); if (result.Any()) { foreach (var file in result) { Console.WriteLine(string.Format("Patched file: {0}", file)); } } } dicVersions.Add(groupVersion, executingVersions); } foreach (var kvp in dicVersions) { effectivePortalVersions.Add(new Version { Id = DataUtil.GenerateUniqueId(), AppName = toolsContext.Arguments.App, VersionNumber = kvp.Key, AffectiveFiles = ConvertUtil.SerializeObject(kvp.Value), CreatedDate = DateTime.UtcNow }); } return(effectivePortalVersions); }