/src/AddIns/Misc/PackageManagement/Project/Src/UpdateSolutionPackagesAction.cs

https://github.com/ajadex/SharpDevelop · C# · 140 lines · 106 code · 17 blank · 17 comment · 6 complexity · c8d885f787cd016fb44807aeadf62fb6 MD5 · raw file

  1. // Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4. // software and associated documentation files (the "Software"), to deal in the Software
  5. // without restriction, including without limitation the rights to use, copy, modify, merge,
  6. // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7. // to whom the Software is furnished to do so, subject to the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be included in all copies or
  10. // substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  13. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  14. // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  15. // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  16. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  17. // DEALINGS IN THE SOFTWARE.
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Linq;
  21. using ICSharpCode.PackageManagement.Scripting;
  22. using NuGet;
  23. namespace ICSharpCode.PackageManagement
  24. {
  25. public class UpdateSolutionPackagesAction : IUpdatePackagesAction
  26. {
  27. List<IPackageFromRepository> packages = new List<IPackageFromRepository>();
  28. List<PackageOperation> operations = new List<PackageOperation>();
  29. List<IPackageManagementProject> projects;
  30. IPackageManagementEvents packageManagementEvents;
  31. public UpdateSolutionPackagesAction(
  32. IPackageManagementSolution solution,
  33. IPackageManagementEvents packageManagementEvents)
  34. {
  35. this.Solution = solution;
  36. this.UpdateDependencies = true;
  37. this.packageManagementEvents = packageManagementEvents;
  38. }
  39. public IPackageManagementSolution Solution { get; private set; }
  40. public IPackageScriptRunner PackageScriptRunner { get; set; }
  41. public bool UpdateDependencies { get; set; }
  42. public bool AllowPrereleaseVersions { get; set; }
  43. public ILogger Logger { get; set; }
  44. public IEnumerable<PackageOperation> Operations {
  45. get { return operations; }
  46. }
  47. public IEnumerable<IPackageFromRepository> Packages {
  48. get { return packages; }
  49. }
  50. public bool HasPackageScriptsToRun()
  51. {
  52. var files = new PackageFilesForOperations(Operations);
  53. return files.HasAnyPackageScripts();
  54. }
  55. public void AddOperations(IEnumerable<PackageOperation> operations)
  56. {
  57. this.operations.AddRange(operations);
  58. }
  59. public void AddPackages(IEnumerable<IPackageFromRepository> packages)
  60. {
  61. this.packages.AddRange(packages);
  62. }
  63. public void Execute()
  64. {
  65. if (PackageScriptRunner != null) {
  66. ExecuteWithScriptRunner();
  67. } else {
  68. ExecuteCore();
  69. }
  70. }
  71. void ExecuteWithScriptRunner()
  72. {
  73. using (RunAllProjectPackageScriptsAction runScriptsAction = CreateRunPackageScriptsAction()) {
  74. ExecuteCore();
  75. }
  76. }
  77. RunAllProjectPackageScriptsAction CreateRunPackageScriptsAction()
  78. {
  79. return CreateRunPackageScriptsAction(PackageScriptRunner, GetProjects());
  80. }
  81. void ExecuteCore()
  82. {
  83. RunPackageOperations();
  84. UpdatePackageReferences();
  85. packageManagementEvents.OnParentPackagesUpdated(Packages);
  86. }
  87. void RunPackageOperations()
  88. {
  89. IPackageManagementProject project = GetProjects().First();
  90. project.RunPackageOperations(operations);
  91. }
  92. IEnumerable<IPackageManagementProject> GetProjects()
  93. {
  94. if (projects == null) {
  95. IPackageFromRepository package = packages.First();
  96. projects = Solution
  97. .GetProjects(package.Repository)
  98. .Select(project => {
  99. project.Logger = Logger;
  100. return project;
  101. })
  102. .ToList();
  103. }
  104. return projects;
  105. }
  106. void UpdatePackageReferences()
  107. {
  108. foreach (IPackageManagementProject project in GetProjects()) {
  109. foreach (IPackageFromRepository package in packages) {
  110. if (project.HasOlderPackageInstalled(package)) {
  111. project.UpdatePackageReference(package, this);
  112. }
  113. }
  114. }
  115. }
  116. protected virtual RunAllProjectPackageScriptsAction CreateRunPackageScriptsAction(
  117. IPackageScriptRunner scriptRunner,
  118. IEnumerable<IPackageManagementProject> projects)
  119. {
  120. return new RunAllProjectPackageScriptsAction(scriptRunner, projects);
  121. }
  122. }
  123. }