public void RevertFile(Func <Stream> fileStreamFactory, string targetPath, IEnumerable <InternalZipFileInfo> matchingFiles, IMSBuildNuGetProjectSystem msBuildNuGetProjectSystem) { // Get the xml snippet var xmlFragment = GetXml(fileStreamFactory, msBuildNuGetProjectSystem); var document = XmlUtility.GetOrCreateDocument(xmlFragment.Name, msBuildNuGetProjectSystem.ProjectFullPath, targetPath, msBuildNuGetProjectSystem.NuGetProjectContext); // Merge the other xml elements into one element within this xml hierarchy (matching the config file path) var mergedFragments = matchingFiles.Select(f => GetXml(f, msBuildNuGetProjectSystem)) .Aggregate(new XElement(xmlFragment.Name), (left, right) => left.MergeWith(right, _nodeActions)); // Take the difference of the xml and remove it from the main xml file document.Root.Except(xmlFragment.Except(mergedFragments)); // Save the new content to the file system using (var fileStream = FileSystemUtility.CreateFile(msBuildNuGetProjectSystem.ProjectFullPath, targetPath, msBuildNuGetProjectSystem.NuGetProjectContext)) { document.Save(fileStream); } }
/// <summary> /// Asynchronously reverses the transform on the targetPath, using all the potential source of change. /// </summary> /// <param name="streamTaskFactory">A factory for accessing the file to be reverted from the nupkg being uninstalled.</param> /// <param name="targetPath">A path to the file to be reverted.</param> /// <param name="matchingFiles">Other files in other packages that may have changed the <paramref name="targetPath" />.</param> /// <param name="projectSystem">The project where this change is taking place.</param> /// <param name="cancellationToken">A cancellation token.</param> /// <returns>A task that represents the asynchronous operation.</returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="streamTaskFactory" /> /// is <c>null</c>.</exception> /// <exception cref="ArgumentNullException">Thrown if <paramref name="projectSystem" /> /// is <c>null</c>.</exception> /// <exception cref="OperationCanceledException">Thrown if <paramref name="cancellationToken" /> /// is cancelled.</exception> public async Task RevertFileAsync( Func <Task <Stream> > streamTaskFactory, string targetPath, IEnumerable <InternalZipFileInfo> matchingFiles, IMSBuildProjectSystem projectSystem, CancellationToken cancellationToken) { if (streamTaskFactory == null) { throw new ArgumentNullException(nameof(streamTaskFactory)); } if (projectSystem == null) { throw new ArgumentNullException(nameof(projectSystem)); } cancellationToken.ThrowIfCancellationRequested(); // Get the xml snippet var xmlFragment = await GetXmlAsync(streamTaskFactory, projectSystem, cancellationToken); var document = XmlUtility.GetOrCreateDocument(xmlFragment.Name, projectSystem.ProjectFullPath, targetPath, projectSystem.NuGetProjectContext); // Merge the other xml elements into one element within this xml hierarchy (matching the config file path) var elements = new List <XElement>(); foreach (var matchingFile in matchingFiles) { elements.Add(await GetXmlAsync(matchingFile, projectSystem, cancellationToken)); } var mergedFragments = elements.Aggregate( new XElement(xmlFragment.Name), (left, right) => left.MergeWith(right, _nodeActions)); // Take the difference of the xml and remove it from the main xml file document.Root.Except(xmlFragment.Except(mergedFragments)); // Save the new content to the file system using (var fileStream = FileSystemUtility.CreateFile( projectSystem.ProjectFullPath, targetPath, projectSystem.NuGetProjectContext)) { document.Save(fileStream); } }
public override Task <bool> InstallPackageAsync(PackageIdentity packageIdentity, Stream packageStream, INuGetProjectContext nuGetProjectContext, CancellationToken token) { if (packageIdentity == null) { throw new ArgumentNullException("packageIdentity"); } if (nuGetProjectContext == null) { throw new ArgumentNullException("nuGetProjectContext"); } var newPackageReference = new PackageReference(packageIdentity, TargetFramework); List <PackageReference> installedPackagesList = GetInstalledPackagesList(); var packageReferenceWithSameId = installedPackagesList.Where(p => p.PackageIdentity.Id.Equals(packageIdentity.Id, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); if (packageReferenceWithSameId != null) { if (packageReferenceWithSameId.PackageIdentity.Equals(packageIdentity)) { nuGetProjectContext.Log(MessageLevel.Warning, Strings.PackageAlreadyExistsInPackagesConfig, packageIdentity, Path.GetFileName(FullPath)); return(Task.FromResult(false)); } else { // Higher version of an installed package is being installed. Remove old and add new installedPackagesList.Remove(packageReferenceWithSameId); installedPackagesList.Add(newPackageReference); } } else { installedPackagesList.Add(newPackageReference); } // Create new file or overwrite existing file using (var stream = FileSystemUtility.CreateFile(FullPath, nuGetProjectContext)) { var writer = new PackagesConfigWriter(stream); foreach (var pr in installedPackagesList) { writer.WritePackageEntry(pr); } writer.Close(); } nuGetProjectContext.Log(MessageLevel.Info, Strings.AddedPackageToPackagesConfig, packageIdentity, Path.GetFileName(FullPath)); return(Task.FromResult(true)); }
public override Task <bool> UninstallPackageAsync(PackageIdentity packageIdentity, INuGetProjectContext nuGetProjectContext, CancellationToken token) { if (packageIdentity == null) { throw new ArgumentNullException("packageIdentity"); } if (nuGetProjectContext == null) { throw new ArgumentNullException("nuGetProjectContext"); } List <PackageReference> installedPackagesList = GetInstalledPackagesList(); var packageReference = installedPackagesList.Where(p => p.PackageIdentity.Equals(packageIdentity)).FirstOrDefault(); if (packageReference == null) { nuGetProjectContext.Log(MessageLevel.Warning, Strings.PackageDoesNotExisttInPackagesConfig, packageIdentity, Path.GetFileName(FullPath)); return(Task.FromResult(false)); } installedPackagesList.Remove(packageReference); if (installedPackagesList.Count > 0) { // Create new file or overwrite existing file using (var stream = FileSystemUtility.CreateFile(FullPath, nuGetProjectContext)) { var writer = new PackagesConfigWriter(stream); foreach (var pr in installedPackagesList) { writer.WritePackageEntry(pr); } writer.Close(); } } else { FileSystemUtility.DeleteFile(FullPath, nuGetProjectContext); } nuGetProjectContext.Log(MessageLevel.Info, Strings.RemovedPackageFromPackagesConfig, packageIdentity, Path.GetFileName(FullPath)); return(Task.FromResult(true)); }
public override Stream CreateFile(string fullPath, INuGetProjectContext nuGetProjectContext) { PendAddedFiles.Add(fullPath); return(FileSystemUtility.CreateFile(fullPath)); }