private async Task DetectVersionWhenNeccessary()
        {
            await _lock.WaitAsync();
            try
            {
                if (_repo != null)
                {
                    return;
                }

                bool r = await IsV3Async(_source);
                if (r)
                {
                    _repo = new V3SourceRepository(_source, _host);
                    return;
                }

                r = await IsV2Async(_source);
                if (r)
                {
                    _repo = new NuGet.Client.Interop.V2SourceRepository(
                        _source, _v2RepoFactory.CreateRepository(_source.Url), _host);
                    return;
                }

                throw new InvalidOperationException(
                    String.Format("source {0} is not available", _source.Url));
            }
            finally
            {
                _lock.Release();
            }
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken cancellationToken)
        {
            V3TotalsStatsResource totalsStatsResource = null;
            var serviceIndex = await source.GetResourceAsync<ServiceIndexResourceV3>(cancellationToken);

            if (serviceIndex != null)
            {
                // TODO: fix this for resource templates
                throw new NotImplementedException();

                //ResourceSelector resourceSelector = new ResourceSelector(source);

                //IList<Uri> resourceUrls = serviceIndex[ServiceTypes.TotalStats];
                //Uri resourceUri = await resourceSelector.DetermineResourceUrlAsync(resourceUrls, cancellationToken);

                //var messageHandlerResource = await source.GetResourceAsync<HttpHandlerResource>(cancellationToken);
                //DataClient client = new DataClient(messageHandlerResource.MessageHandler);


                //// construct a new resource
                //totalsStatsResource = new V3TotalsStatsResource(client, resourceUri);
            }

            return new Tuple<bool, INuGetResource>(totalsStatsResource != null, totalsStatsResource);
        }
        /// <summary>
        /// Sets <param name="targetPackageStream"></param> for a given <param name="packageIdentity"></param> 
        /// from the given <param name="sourceRepository"></param>. If successfully set, returns true. Otherwise, false
        /// </summary>
        public static async Task<bool> GetPackageStream(SourceRepository sourceRepository, PackageIdentity packageIdentity, Stream targetPackageStream, CancellationToken token)
        {
            // TODO: Tie up machine cache with CacheClient?!

            try
            {
                token.ThrowIfCancellationRequested();
                // Step-1 : Get the download stream for packageIdentity
                Stream downloadStream = await GetDownloadStream(sourceRepository, packageIdentity, token);

                if(downloadStream == null)
                {
                    return false;
                }

                token.ThrowIfCancellationRequested();
                // Step-2: Copy download stream to targetPackageStream if it is not null
                await downloadStream.CopyToAsync(targetPackageStream);
                return true;
            }
            catch (Exception)
            {
                return false;
            } 
        }
		void CreateAction ()
		{
			project = new FakeDotNetProject (@"d:\projects\MyProject\MyProject.csproj");
			solutionManager = new FakeSolutionManager ();
			nugetProject = new FakeNuGetProject (project);
			solutionManager.NuGetProjects[project] = nugetProject;

			var metadataResourceProvider = new FakePackageMetadataResourceProvider ();
			packageMetadataResource = metadataResourceProvider.PackageMetadataResource;
			var source = new PackageSource ("http://test.com");
			var providers = new INuGetResourceProvider[] {
				metadataResourceProvider
			};
			var sourceRepository = new SourceRepository (source, providers);
			primaryRepositories = new [] {
				sourceRepository
			}.ToList ();
			solutionManager.SourceRepositoryProvider.Repositories.AddRange (primaryRepositories);

			action = new TestableUpdateAllNuGetPackagesInProjectAction (
				solutionManager,
				project);

			packageManager = action.PackageManager;
			packageManagementEvents = action.PackageManagementEvents;
			fileRemover = action.FileRemover;
			restoreManager = action.RestoreManager;
		}
		void CreateAction (
			string packageId = "Test",
			string version = "2.1")
		{
			project = new FakeDotNetProject (@"d:\projects\MyProject\MyProject.csproj");
			solutionManager = new FakeSolutionManager ();
			nugetProject = new FakeNuGetProject (project);
			solutionManager.NuGetProjects[project] = nugetProject;

			var metadataResourceProvider = new FakePackageMetadataResourceProvider ();
			packageMetadataResource = metadataResourceProvider.PackageMetadataResource;
			var source = new PackageSource ("http://test.com");
			var providers = new INuGetResourceProvider[] {
				metadataResourceProvider
			};
			var sourceRepository = new SourceRepository (source, providers);
			primaryRepositories = new [] {
				sourceRepository
			}.ToList ();

			action = new TestableInstallNuGetPackageAction (
				primaryRepositories,
				solutionManager,
				project);

			packageManager = action.PackageManager;
			packageManagementEvents = action.PackageManagementEvents;
			fileRemover = action.FileRemover;

			action.PackageId = packageId;
			action.Version = new NuGetVersion (version);
		}
		public MultiSourcePackageMetadataProvider(
			IEnumerable<SourceRepository> sourceRepositories,
			SourceRepository optionalLocalRepository,
			IEnumerable<SourceRepository> optionalGlobalLocalRepositories,
			NuGetProject[] projects,
			bool isSolution,
			Common.ILogger logger)
		{
			if (sourceRepositories == null)
			{
				throw new ArgumentNullException(nameof(sourceRepositories));
			}

			if (projects == null)
			{
				throw new ArgumentNullException(nameof(projects));
			}
			_sourceRepositories = sourceRepositories;

			_localRepository = optionalLocalRepository;

			_globalLocalRepositories = optionalGlobalLocalRepositories;

			_projects = projects;

			_isSolution = isSolution;

			if (logger == null)
			{
				throw new ArgumentNullException(nameof(logger));
			}
			_logger = logger;
		}
示例#7
0
文件: Package.cs 项目: ibebbs/Wyam
 public async Task ResolveVersion(SourceRepository localRepository, 
     IReadOnlyList<SourceRepository> remoteRepositories, bool updatePackages, ILogger logger)
 {
     string versionRangeString = _versionRange == null ? string.Empty : " " + _versionRange;
     Trace.Verbose($"Resolving package version for {_packageId}{versionRangeString} (with dependencies)");
     IReadOnlyList<SourceRepository> sourceRepositories = GetSourceRepositories(remoteRepositories);
     NuGetVersion versionMatch = null;
     if (!_getLatest && !updatePackages)
     {
         // Get the latest matching version in the local repository
         versionMatch = await GetLatestMatchingVersion(localRepository, logger);
     }
     if (versionMatch != null)
     {
         Trace.Verbose($"Package {_packageId}{versionRangeString} is satisfied by version {versionMatch.Version}");
     }
     else
     {
         // The package either wasn't installed locally, the local version didn't match, or we requested a package update
         // Get the latest remote version, but only if we actually have remote repositories
         if (sourceRepositories != null && sourceRepositories.Count > 0)
         {
             versionMatch = await GetLatestMatchingVersion(sourceRepositories, logger);
         }
         if (versionMatch == null)
         {
             Trace.Verbose($"Package {_packageId}{versionRangeString} was not found on any remote source repositories");
         }
     }
     _versionMatch = versionMatch;
 }
        /// <summary>
        /// Get all versions for a specific package Id.
        /// </summary>
        /// <param name="sourceRepository"></param>
        /// <param name="packageId"></param>
        /// <param name="project"></param>
        /// <param name="includePrerelease"></param>
        /// <returns></returns>
        public static IEnumerable<NuGetVersion> GetAllVersionsForPackageId(SourceRepository sourceRepository, string packageId, NuGetProject project, bool includePrerelease)
        {
            IEnumerable<string> targetFrameworks = GetProjectTargetFrameworks(project);
            SearchFilter searchfilter = new SearchFilter();
            searchfilter.IncludePrerelease = includePrerelease;
            searchfilter.SupportedFrameworks = targetFrameworks;
            searchfilter.IncludeDelisted = false;
            PSSearchResource resource = sourceRepository.GetResource<PSSearchResource>();
            PSSearchMetadata result = null;
            IEnumerable<NuGetVersion> allVersions = Enumerable.Empty<NuGetVersion>();

            try
            {
                Task<IEnumerable<PSSearchMetadata>> task = resource.Search(packageId, searchfilter, 0, 30, CancellationToken.None);
                result = task.Result
                    .Where(p => string.Equals(p.Identity.Id, packageId, StringComparison.OrdinalIgnoreCase))
                    .FirstOrDefault();
                allVersions = result.Versions;
            }
            catch (Exception)
            {
                if (result == null || !allVersions.Any())
                {
                    throw new InvalidOperationException(
                        String.Format(CultureInfo.CurrentCulture,
                        Resources.UnknownPackage, packageId));
                }

            }
            return result.Versions;
        }
        /// <summary>
        /// Resolve package from online and local repository
        /// Used for Install-Package and Update-Package command to verify the specified package version exists in the repo.
        /// </summary>
        /// <param name="sourceRepository"></param>
        /// <param name="localRepository"></param>
        /// <param name="identity"></param>
        /// <param name="allowPrereleaseVersions"></param>
        /// <returns></returns>
        public static PackageIdentity ResolvePackage(SourceRepository sourceRepository, IPackageRepository localRepository,
            PackageIdentity identity, bool allowPrereleaseVersions)
        {
            string packageId = identity.Id;
            NuGetVersion nVersion = identity.Version;
            string version = identity.Version.ToNormalizedString();

            if (String.IsNullOrEmpty(identity.Id))
            {
                throw new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, "packageId");
            }

            PackageIdentity resolvedIdentity = null;

            // If we're looking for an exact version of a package then try local first
            if (version != null)
            {
                SemanticVersion sVersion = new SemanticVersion(version);
                IPackage package = localRepository.FindPackage(packageId, sVersion, allowPrereleaseVersions, allowUnlisted: false);
                if (package != null)
                {
                    resolvedIdentity = new PackageIdentity(packageId, NuGetVersion.Parse(package.Version.ToString()));
                }
            }

            if (resolvedIdentity == null)
            {
                if (nVersion == null)
                {
                    throw new InvalidOperationException(
                        String.Format(CultureInfo.CurrentCulture,
                        NuGetResources.UnknownPackageSpecificVersion, packageId, version));
                }
                else
                {
                    Task<JObject> task = sourceRepository.GetPackageMetadata(packageId, nVersion);
                    JObject package = task.Result;
                    if (package == null)
                    {
                        if (version != null)
                        {
                            throw new InvalidOperationException(
                                String.Format(CultureInfo.CurrentCulture,
                                NuGetResources.UnknownPackageSpecificVersion, packageId, version));
                        }
                        throw new InvalidOperationException(
                            String.Format(CultureInfo.CurrentCulture,
                            NuGetResources.UnknownPackage, packageId));
                    }
                    else
                    {
                        resolvedIdentity = new PackageIdentity(packageId, nVersion);
                    }
                }
            }

            return resolvedIdentity;
        }
 public SourceRepositoryDependencyProvider(
     SourceRepository sourceRepository,
     ILogger logger,
     bool noCache)
 {
     _sourceRepository = sourceRepository;
     _logger = logger;
     _noCache = noCache;
 }
        public static NuGetProjectAction CreateInstallProjectAction(PackageIdentity packageIdentity, SourceRepository sourceRepository)
        {
            if(sourceRepository == null)
            {
                throw new ArgumentNullException("sourceRepository");
            }

            return new NuGetProjectAction(packageIdentity, NuGetProjectActionType.Install, sourceRepository);
        }
示例#12
0
 public ActionResolver(
     SourceRepository source,
     SourceRepository dependencyResolutionSource,
     ResolutionContext context)
 {
     _source = source;
     _dependencyResolver = new DependencyResolverFromSourceRepo(dependencyResolutionSource);
     _context = context;
 }
示例#13
0
 public override void ValidateConnection(SourceRepository repo)
 {
     if (repo != null)
     {
         if (string.IsNullOrEmpty(repo.RemoteUrl))
             this.ExecuteGitCommand(repo, "log -n 1"); // show commit log, limit to 1 commit
         else
             this.ExecuteGitCommand(repo, "ls-remote --heads origin"); // list remote branches
     }
 }
示例#14
0
 public PackageAction(PackageActionType actionType, PackageIdentity packageName, JObject package, InstallationTarget target, SourceRepository source, PackageIdentity dependentPackage)
 {
     ActionType = actionType;
     PackageIdentity = packageName;
     Package = package;
     Target = target;
     Source = source;
     DependentPackage = dependentPackage;
     IsUpdate = false;
 }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            PSSearchResource resource = null;
            UISearchResource uiSearchResource = await source.GetResourceAsync<UISearchResource>(token);
            if (uiSearchResource != null)
            {
                resource = new PowerShellSearchResourceV2(uiSearchResource);
            }

            return new Tuple<bool, INuGetResource>(resource != null, resource);
        }
        protected async Task<V2Resource> GetRepository(SourceRepository source, CancellationToken token)
        {
            var repositoryResource = await source.GetResourceAsync<PackageRepositoryResourceV2>(token);

            if (repositoryResource != null && repositoryResource.V2Client != null)
            {
                return repositoryResource;
            }

            return null;
        }
        private NuGetProjectAction(PackageIdentity packageIdentity, NuGetProjectActionType nuGetProjectActionType, SourceRepository sourceRepository = null)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException("packageIdentity");
            }

            PackageIdentity = packageIdentity;
            NuGetProjectActionType = nuGetProjectActionType;
            SourceRepository = sourceRepository;
        }
        private static async Task<Stream> GetDownloadStream(SourceRepository sourceRepository, PackageIdentity packageIdentity, CancellationToken token)
        {
            Stream downloadStream = null;
            DownloadResource downloadResource = await sourceRepository.GetResourceAsync<DownloadResource>(token);
            if(downloadResource != null)
            {
                downloadStream = await downloadResource.GetStream(packageIdentity, token);
                return downloadStream;
            }

            return null;
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            DependencyInfoResource DependencyInfoResourceV2 = null;
            var v2repo = await GetRepository(source, token);

            if (v2repo != null)
            {
                DependencyInfoResourceV2 = new DependencyInfoResourceV2(v2repo, source);
            }

            return Tuple.Create<bool, INuGetResource>(DependencyInfoResourceV2 != null, DependencyInfoResourceV2);
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            HttpHandlerResourceV3 curResource = null;

#if !DNXCORE50
			// Everyone gets a dataclient
			var HttpHandler = TryGetCredentialAndProxy(source.PackageSource) ?? DataClient.DefaultHandler;
            curResource = new HttpHandlerResourceV3(HttpHandler);
#endif

            return new Tuple<bool, INuGetResource>(curResource != null, curResource);
        }
 private void Init()
 {
     _repositories.Clear();
     foreach (var source in _packageSourceProvider.LoadPackageSources())
     {
         if (source.IsEnabled)
         {
             var sourceRepo = new SourceRepository(source, _resourceProviders);
             _repositories.Add(sourceRepo);
         }
     }
 }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            SimpleSearchResourceV2 resource = null;
            var v2repo = await GetRepository(source, token);

            if (v2repo != null)
            {
                resource = new SimpleSearchResourceV2(v2repo);
            }

            return new Tuple<bool, INuGetResource>(resource != null, resource);
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            SimpleSearchResourceV3 curResource = null;

            var rawSearch = await source.GetResourceAsync<RawSearchResourceV3>(token);

            if (rawSearch != null && rawSearch is RawSearchResourceV3)
            {
                curResource = new SimpleSearchResourceV3(rawSearch);
            }

            return new Tuple<bool, INuGetResource>(curResource != null, curResource);
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository sourceRepository, CancellationToken token)
        {
            INuGetResource resource = null;

            var serviceIndexResource = await sourceRepository.GetResourceAsync<ServiceIndexResourceV3>();

            if (serviceIndexResource != null)
            {
                resource = new RemoteV3FindPackageByIdResource(sourceRepository);
            }

            return Tuple.Create(resource != null, resource);
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            DownloadResource DownloadResourceV2 = null;

            var v2repo = await GetRepository(source, token);

            if (v2repo != null)
            {
                DownloadResourceV2 = new DownloadResourceV2(v2repo);
            }

            return new Tuple<bool, INuGetResource>(DownloadResourceV2 != null, DownloadResourceV2);
        }
        public override Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository sourceRepository, CancellationToken token)
        {
            INuGetResource resource = null;

            if (sourceRepository.PackageSource.IsHttp
                &&
                !sourceRepository.PackageSource.Source.EndsWith("json", StringComparison.OrdinalIgnoreCase))
            {
                resource = new RemoteV2FindPackageByIdResourcce(sourceRepository.PackageSource);
            }

            return Task.FromResult(Tuple.Create(resource != null, resource));
        }
示例#27
0
        public SiteExtensionManager(IContinuousJobsManager continuousJobManager, ITriggeredJobsManager triggeredJobManager, IEnvironment environment, IDeploymentSettingsManager settings, ITraceFactory traceFactory, HttpContextBase context, IAnalytics analytics)
        {
            _rootPath = Path.Combine(environment.RootPath, "SiteExtensions");
            _baseUrl = context.Request.Url == null ? String.Empty : context.Request.Url.GetLeftPart(UriPartial.Authority).TrimEnd('/');

            _localRepository = GetSourceRepository(_rootPath);
            _continuousJobManager = continuousJobManager;
            _triggeredJobManager = triggeredJobManager;
            _environment = environment;
            _settings = settings;
            _traceFactory = traceFactory;
            _analytics = analytics;
        }
        public async Task TryCreate_ReturnsFalse_IfSourceDoesNotHaveAJsonSuffix(string location)
        {
            // Arrange
            var packageSource = new PackageSource(location);
            var provider = new ServiceIndexResourceV3Provider();
            var sourceRepository = new SourceRepository(packageSource, new[] { provider });

            // Act
            var result = await provider.TryCreate(sourceRepository, default(CancellationToken));

            // Assert
            Assert.False(result.Item1);
            Assert.Null(result.Item2);
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository sourceRepository, CancellationToken token)
        {
            INuGetResource resource = null;
            var serviceIndexResource = await sourceRepository.GetResourceAsync<ServiceIndexResourceV3>();
            var packageBaseAddress = serviceIndexResource?[HttpFileSystemIndexType];

            if (packageBaseAddress != null
                && packageBaseAddress.Count > 0)
            {
                resource = new HttpFileSystemBasedFindPackageByIdResource(packageBaseAddress);
            }

            return Tuple.Create(resource != null, resource);
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            PowerShellSearchResource resource = null;

            // PS search depends on v3 json search
            RawSearchResourceV3 rawSearch = await source.GetResourceAsync<RawSearchResourceV3>();

            if (rawSearch != null)
            {
                resource = new PowerShellSearchResource(rawSearch);
            }

            return new Tuple<bool, INuGetResource>(resource != null, resource);
        }
示例#31
0
        private static void TransformSequences_RemoveCompilerGeneratedBranches(IEnumerable <Method> methods, SourceRepository sourceRepository, DateTime moduleTime)
        {
            foreach (var method in methods
                     .Where(m => m.FileRefUniqueId != 0 &&
                            m.SequencePoints.Length != 0))
            {
                // Get method source if availabile
                var source = sourceRepository.GetCodeCoverageStringTextSource(method.FileRefUniqueId);
                if (source != null)
                {
                    if (source.IsChanged(moduleTime))
                    {
                        ("Source file is modified: " + source.FilePath).InformUser();
                        return;
                    }

                    if (!TransformSequences_RemoveCompilerGeneratedBranches(method, source))
                    {
                        return; // empty sequence found -> source.IsChanged (failed access to file-times)
                    }
                }
            }
        }
示例#32
0
        /// <summary>
        /// Query source repository for latest package base given package id
        /// </summary>
        internal static async Task <UIPackageMetadata> GetLatestPackageByIdFromSrcRepo(this SourceRepository srcRepo, string packageId)
        {
            // 7 references none of which uses bool includePrerelease = true, bool includeUnlisted = false
            var metadataResource = await srcRepo.GetResourceAndValidateAsync <UIMetadataResource>();

            return(await metadataResource.GetLatestPackageByIdFromMetaRes(packageId,
                                                                          explicitTag : IsNuGetRepo(srcRepo.PackageSource.Source)));
        }
示例#33
0
 public StrykerNugetFeedClient()
 {
     _logger             = new Lazy <NuGet.Common.ILogger>(() => new NuGetLogger(ApplicationLogging.LoggerFactory.CreateLogger("NuGet")));
     _sourceRepository   = Repository.Factory.GetCoreV3(new PackageSource(NuGetConstants.V3FeedUrl));
     _sourceCacheContext = new SourceCacheContext();
 }
示例#34
0
        public static async Task UpdateLocalPackage(this SourceRepository srcRepo, SourceRepository localRepo, PackageIdentity identity, string destinationFolder, string pathToLocalCopyOfNupkg, ITracer tracer)
        {
            tracer.Trace("Performing incremental package update for {0}", identity.Id);
            using (Stream newPackageStream = await srcRepo.GetPackageStream(identity))
            {
                // update file
                var localPackage = await localRepo.GetLatestPackageByIdFromSrcRepo(identity.Id);

                if (localPackage == null)
                {
                    throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, "Package {0} not found from local repo.", identity.Id));
                }
                using (Stream oldPackageStream = await localRepo.GetPackageStream(localPackage.Identity))
                    using (ZipFile oldPackageZip = ZipFile.Read(oldPackageStream))
                        using (ZipFile newPackageZip = ZipFile.Read(newPackageStream))
                        {
                            // we only care about stuff under "content" folder
                            IEnumerable <ZipEntry>        oldContentEntries = oldPackageZip.Entries.Where(e => e.FileName.StartsWith(@"content/", StringComparison.InvariantCultureIgnoreCase));
                            IEnumerable <ZipEntry>        newContentEntries = newPackageZip.Entries.Where(e => e.FileName.StartsWith(@"content/", StringComparison.InvariantCultureIgnoreCase));
                            List <ZipEntry>               filesNeedToUpdate = new List <ZipEntry>();
                            Dictionary <string, ZipEntry> indexedOldFiles   = new Dictionary <string, ZipEntry>();
                            foreach (var item in oldContentEntries)
                            {
                                indexedOldFiles.Add(item.FileName.ToLowerInvariant(), item);
                            }

                            foreach (var newEntry in newContentEntries)
                            {
                                var fileName = newEntry.FileName.ToLowerInvariant();
                                if (indexedOldFiles.ContainsKey(fileName))
                                {
                                    // file name existed, only update if file has been touched
                                    ZipEntry oldEntry = indexedOldFiles[fileName];
                                    if (oldEntry.LastModified != newEntry.LastModified)
                                    {
                                        filesNeedToUpdate.Add(newEntry);
                                    }

                                    // remove from old index files buffer, the rest will be files that need to be deleted
                                    indexedOldFiles.Remove(fileName);
                                }
                                else
                                {
                                    // new files
                                    filesNeedToUpdate.Add(newEntry);
                                }
                            }

                            int substringStartIndex = @"content/".Length;

                            foreach (var entry in filesNeedToUpdate)
                            {
                                string fullPath = Path.Combine(destinationFolder, entry.FileName.Substring(substringStartIndex));

                                if (entry.IsDirectory)
                                {
                                    using (tracer.Step("Ensure directory: {0}", fullPath))
                                    {
                                        FileSystemHelpers.EnsureDirectory(fullPath.Replace('/', '\\'));
                                    }

                                    continue;
                                }

                                using (tracer.Step("Adding/Updating file: {0}", fullPath))
                                {
                                    FileSystemHelpers.EnsureDirectory(Path.GetDirectoryName(fullPath));
                                    using (Stream writeStream = FileSystemHelpers.OpenWrite(fullPath))
                                    {
                                        // reset length of file stream
                                        writeStream.SetLength(0);

                                        // let the thread go with itself, so that once file finishes writing, doesn't need to request thread context from main thread
                                        await entry.OpenReader().CopyToAsync(writeStream).ConfigureAwait(false);
                                    }
                                }
                            }

                            foreach (var entry in indexedOldFiles.Values)
                            {
                                string fullPath = Path.Combine(destinationFolder, entry.FileName.Substring(substringStartIndex));

                                if (entry.IsDirectory)
                                {
                                    // in case the two zip file was created from different tool. some tool will include folder as seperate entry, some don`t.
                                    // to be sure that foder is meant to be deleted, double check there is no files under it
                                    var entryNameInLower = entry.FileName.ToLower();
                                    if (!string.Equals(destinationFolder, fullPath, StringComparison.OrdinalIgnoreCase) &&
                                        newContentEntries.FirstOrDefault(e => e.FileName.ToLowerInvariant().StartsWith(entryNameInLower)) == null)
                                    {
                                        using (tracer.Step("Deleting directory: {0}", fullPath))
                                        {
                                            FileSystemHelpers.DeleteDirectorySafe(fullPath);
                                        }
                                    }
                                    continue;
                                }

                                using (tracer.Step("Deleting file: {0}", fullPath))
                                {
                                    FileSystemHelpers.DeleteFileSafe(fullPath);
                                }
                            }
                        }

                // update nupkg
                newPackageStream.Position = 0;
                using (tracer.Step("Updating nupkg file."))
                {
                    WriteStreamToFile(newPackageStream, pathToLocalCopyOfNupkg);
                    if (!identity.Version.Equals(localPackage.Identity.Version))
                    {
                        using (tracer.Step("New package has difference version {0} from old package {1}. Remove old nupkg file.", identity.Version, localPackage.Identity.Version))
                        {
                            // if version is difference, nupkg file name will be difference. will need to clean up the old one.
                            var oldNupkg = pathToLocalCopyOfNupkg.Replace(
                                string.Format(CultureInfo.InvariantCulture, "{0}.{1}.nupkg", identity.Id, identity.Version.ToNormalizedString()),
                                string.Format(CultureInfo.InvariantCulture, "{0}.{1}.nupkg", localPackage.Identity.Id, localPackage.Identity.Version.ToNormalizedString()));

                            FileSystemHelpers.DeleteFileSafe(oldNupkg);
                        }
                    }
                }
            }
        }
        internal async Task<(IPackageFeed? mainFeed, IPackageFeed? recommenderFeed)> CreatePackageFeedAsync(
            IReadOnlyCollection<IProjectContextInfo> projectContextInfos,
            IReadOnlyCollection<string> targetFrameworks,
            ItemFilter itemFilter,
            bool isSolution,
            bool recommendPackages,
            IEnumerable<SourceRepository> sourceRepositories,
            CancellationToken cancellationToken)
        {
            var logger = new VisualStudioActivityLogger();
            var uiLogger = await ServiceLocator.GetComponentModelServiceAsync<INuGetUILogger>();
            var packageFeeds = (mainFeed: (IPackageFeed?)null, recommenderFeed: (IPackageFeed?)null);

            if (itemFilter == ItemFilter.All && recommendPackages == false)
            {
                packageFeeds.mainFeed = new MultiSourcePackageFeed(sourceRepositories, uiLogger, TelemetryActivity.NuGetTelemetryService);
                return packageFeeds;
            }

            IInstalledAndTransitivePackages installedAndTransitivePackages = await GetInstalledAndTransitivePackagesAsync(projectContextInfos, cancellationToken);

            PackageCollection installedPackageCollection = PackageCollection.FromPackageReferences(installedAndTransitivePackages.InstalledPackages);
            PackageCollection transitivePackageCollection = PackageCollection.FromPackageReferences(installedAndTransitivePackages.TransitivePackages);

            IEnumerable<SourceRepository> globalPackageFolderRepositories = await GetAllPackageFoldersAsync(projectContextInfos, cancellationToken);
            SourceRepository packagesFolderSourceRepository = await _packagesFolderLocalRepositoryLazy.GetValueAsync(cancellationToken);
            var metadataProvider = new MultiSourcePackageMetadataProvider(
                sourceRepositories,
                packagesFolderSourceRepository,
                globalPackageFolderRepositories,
                logger);

            if (itemFilter == ItemFilter.All)
            {
                // if we get here, recommendPackages == true
                packageFeeds.mainFeed = new MultiSourcePackageFeed(sourceRepositories, uiLogger, TelemetryActivity.NuGetTelemetryService);
                packageFeeds.recommenderFeed = new RecommenderPackageFeed(
                    sourceRepositories,
                    installedPackageCollection,
                    transitivePackageCollection,
                    targetFrameworks,
                    metadataProvider,
                    logger);
                return packageFeeds;
            }

            if (itemFilter == ItemFilter.Installed)
            {
                if (!isSolution && await ExperimentUtility.IsTransitiveOriginExpEnabled.GetValueAsync(cancellationToken))
                {
                    packageFeeds.mainFeed = new InstalledAndTransitivePackageFeed(installedPackageCollection, transitivePackageCollection, metadataProvider);
                }
                else
                {
                    packageFeeds.mainFeed = new InstalledPackageFeed(installedPackageCollection, metadataProvider);
                }

                return packageFeeds;
            }

            if (itemFilter == ItemFilter.Consolidate)
            {
                packageFeeds.mainFeed = new ConsolidatePackageFeed(installedPackageCollection, metadataProvider, logger);
                return packageFeeds;
            }

            // Search all / updates available cannot work without a source repo
            if (sourceRepositories == null)
            {
                return packageFeeds;
            }

            if (itemFilter == ItemFilter.UpdatesAvailable)
            {
                packageFeeds.mainFeed = new UpdatePackageFeed(
                    _serviceBroker,
                    installedPackageCollection,
                    metadataProvider,
                    projectContextInfos.ToArray());

                return packageFeeds;
            }

            throw new InvalidOperationException(
                string.Format(CultureInfo.CurrentCulture, Strings.UnsupportedFeedType, itemFilter));
        }
示例#36
0
 public IPackage GetUpdate(IPackage package)
 {
     return(SourceRepository.GetUpdates(new[] { package }, includePrerelease: false).SingleOrDefault());
 }
 public void AddSourceRepository(SourceRepository source)
 {
     _cachedSources.TryAdd(source.PackageSource.Source, source);
 }
示例#38
0
 static NuGetDiff()
 {
     source = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
     cache  = new SourceCacheContext();
     logger = NullLogger.Instance;
 }
示例#39
0
 public AdminController(SourceRepository repository)
 {
     db = repository;
 }
示例#40
0
        private Task <string?> DownloadWithProgress(SourceRepository sourceRepository, PackageIdentity packageIdentity)
        {
            var progressDialogText = Resources.Dialog_DownloadingPackage;

            if (packageIdentity.HasVersion)
            {
                progressDialogText = string.Format(CultureInfo.CurrentCulture, progressDialogText, packageIdentity.Id, packageIdentity.Version);
            }
            else
            {
                progressDialogText = string.Format(CultureInfo.CurrentCulture, progressDialogText, packageIdentity.Id, string.Empty);
            }

            string?description = null;
            int?   percent     = null;
            var    updated     = 0;

            var progressDialogLock = new object();

#pragma warning disable CA2000 // Dispose objects before losing scope (handled in finally below)
            var progressDialog = new ProgressDialog
            {
                Text              = progressDialogText,
                WindowTitle       = Resources.Dialog_Title,
                ShowTimeRemaining = true,
                CancellationText  = "Canceling download..."
            };

            // polling for Cancel button being clicked
            var cts   = new CancellationTokenSource();
            var timer = new System.Timers.Timer(100);
#pragma warning restore CA2000 // Dispose objects before losing scope

            timer.Elapsed += (o, e) =>
            {
                lock (progressDialogLock)
                {
                    if (progressDialog.CancellationPending)
                    {
                        timer.Stop();
                        cts.Cancel();
                    }
                    else if (Interlocked.CompareExchange(ref updated, 0, 1) == 1)
                    {
                        progressDialog.ReportProgress(percent.GetValueOrDefault(), null, description);
                    }
                }
            };


            var tcs = new TaskCompletionSource <string?>();
            progressDialog.DoWork += (object sender, DoWorkEventArgs args) =>
            {
                var t = DoWorkAsync();
                t.Wait(cts.Token);
                tcs.TrySetResult(t.Result);
            };
            progressDialog.RunWorkerCompleted += (object sender, RunWorkerCompletedEventArgs args) =>
            {
                MainWindow.Value.Activate();
            };

            progressDialog.ShowDialog(MainWindow.Value);
            timer.Start();

            async Task <string?> DoWorkAsync()
            {
                try
                {
                    var httpProgressProvider = new ProgressHttpHandlerResourceV3Provider(OnProgress);
                    var repository           = PackageRepositoryFactory.CreateRepository(sourceRepository.PackageSource, new[] { new Lazy <INuGetResourceProvider>(() => httpProgressProvider) });
                    var downloadResource     = await repository.GetResourceAsync <DownloadResource>(cts.Token).ConfigureAwait(false);

                    using var sourceCacheContext = new SourceCacheContext()
                          {
                              NoCache = true
                          };
                    var context = new PackageDownloadContext(sourceCacheContext, Path.GetTempPath(), true);

                    using var result = await downloadResource.GetDownloadResourceResultAsync(packageIdentity, context, string.Empty, NullLogger.Instance, cts.Token).ConfigureAwait(false);

                    if (result.Status == DownloadResourceResultStatus.Cancelled)
                    {
                        throw new OperationCanceledException();
                    }

                    if (result.Status == DownloadResourceResultStatus.NotFound)
                    {
                        throw new Exception($"Package '{packageIdentity.Id} {packageIdentity.Version}' not found");
                    }

                    var tempFilePath = Path.GetTempFileName();
                    using (var fileStream = File.OpenWrite(tempFilePath))
                    {
                        await result.PackageStream.CopyToAsync(fileStream).ConfigureAwait(false);
                    }

                    return(tempFilePath);
                }
                catch (OperationCanceledException)
                {
                    return(null);
                }
                catch (Exception exception)
                {
                    OnError(exception);
                    return(null);
                }
                finally
                {
                    timer.Stop();
                    timer.Dispose();
                    cts.Dispose();
                    // close progress dialog when done
                    lock (progressDialogLock)
                    {
                        progressDialog.Dispose();
                    }
                }
            }

            void OnProgress(long bytesReceived, long?totalBytes)
            {
                if (totalBytes.HasValue)
                {
                    // TODO: remove ! once https://github.com/dotnet/roslyn/issues/33330 is fixed
                    percent     = (int)((bytesReceived * 100L) / totalBytes) !;
                    description = string.Format(
                        CultureInfo.CurrentCulture,
                        "Downloaded {0} of {1}...",
                        FileSizeConverter.Convert(bytesReceived, typeof(string), null, CultureInfo.CurrentCulture),
                        FileSizeConverter.Convert(totalBytes.Value, typeof(string), null, CultureInfo.CurrentCulture));
                }
                else
                {
                    percent     = null;
                    description = string.Format(
                        CultureInfo.CurrentCulture,
                        "Downloaded {0}...",
                        FileSizeConverter.Convert(bytesReceived, typeof(string), null, CultureInfo.CurrentCulture));
                }
                Interlocked.Exchange(ref updated, 1);
            }

            return(tcs.Task);
        }
示例#41
0
 public static async Task <DownloadResourceResult> GetDownloadResourceResult(string depsFolder, SourceCacheContext cache, SourceRepository repository, DownloadResource resource, string packageId, NuGetVersion packageVersion)
 {
     return(await resource.GetDownloadResourceResultAsync(
                new SourcePackageDependencyInfo(packageId, packageVersion, null, true, repository),
                new PackageDownloadContext(cache),
                depsFolder,
                NuGet.Common.NullLogger.Instance,
                CancellationToken.None));
 }
示例#42
0
        private async Task <SiteExtensionInfo> TryInstallExtension(string id, string version, string feedUrl, SiteExtensionInfo.SiteExtensionType type, ITracer tracer)
        {
            SiteExtensionInfo info   = null;
            HttpStatusCode    status = HttpStatusCode.OK; // final status when success
            bool alreadyInstalled    = false;

            if (_preInstalledExtensionDictionary.ContainsKey(id))
            {
                tracer.Trace("Pre-installed site extension found: {0}, not going to perform new installation.", id);
                info             = EnablePreInstalledExtension(_preInstalledExtensionDictionary[id], tracer);
                alreadyInstalled = true;
            }
            else
            {
                try
                {
                    // Check if site extension already installed (id, version, feedUrl), if already install return right away
                    if (await this.IsSiteExtensionInstalled(id, version, feedUrl))
                    {
                        // package already installed, return package from local repo.
                        tracer.Trace("Package {0} with version {1} from {2} already installed.", id, version, feedUrl);
                        info = await GetLocalExtension(id);

                        alreadyInstalled = true;
                    }
                    else
                    {
                        JsonSettings siteExtensionSettings = GetSettingManager(id);
                        feedUrl = (string.IsNullOrEmpty(feedUrl) ? siteExtensionSettings.GetValue(_feedUrlSetting) : feedUrl);
                        SourceRepository  remoteRepo   = GetRemoteRepository(feedUrl);
                        UIPackageMetadata localPackage = null;
                        UIPackageMetadata repoPackage  = null;

                        if (string.IsNullOrWhiteSpace(version))
                        {
                            using (tracer.Step("Version is null, search latest package by id: {0}, will not search for unlisted package.", id))
                            {
                                repoPackage = await remoteRepo.GetLatestPackageById(id);
                            }
                        }
                        else
                        {
                            using (tracer.Step("Search package by id: {0} and version: {1}, will also search for unlisted package.", id, version))
                            {
                                repoPackage = await remoteRepo.GetPackageByIdentity(id, version);
                            }
                        }

                        if (repoPackage != null)
                        {
                            using (tracer.Step("Install package: {0}.", id))
                            {
                                string installationDirectory = GetInstallationDirectory(id);
                                localPackage = await InstallExtension(repoPackage, installationDirectory, feedUrl, type, tracer);

                                siteExtensionSettings.SetValues(new KeyValuePair <string, JToken>[] {
                                    new KeyValuePair <string, JToken>(_versionSetting, localPackage.Identity.Version.ToNormalizedString()),
                                    new KeyValuePair <string, JToken>(_feedUrlSetting, feedUrl),
                                    new KeyValuePair <string, JToken>(_installUtcTimestampSetting, DateTime.UtcNow.ToString("u")),
                                    new KeyValuePair <string, JToken>(_packageType, Enum.GetName(typeof(SiteExtensionInfo.SiteExtensionType), type))
                                });
                            }
                        }

                        info = await ConvertLocalPackageToSiteExtensionInfo(localPackage, checkLatest : true, tracer : tracer);
                    }
                }
                catch (FileNotFoundException ex)
                {
                    _analytics.UnexpectedException(
                        ex,
                        method: "PUT",
                        path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id),
                        result: Constants.SiteExtensionProvisioningStateFailed,
                        message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl),
                        trace: false);

                    tracer.TraceError(ex);
                    info    = new SiteExtensionInfo();
                    info.Id = id;
                    info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed;
                    info.Comment           = string.Format(Constants.SiteExtensionProvisioningStateNotFoundMessageFormat, id);
                    status = HttpStatusCode.NotFound;
                }
                catch (WebException ex)
                {
                    _analytics.UnexpectedException(
                        ex,
                        method: "PUT",
                        path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id),
                        result: Constants.SiteExtensionProvisioningStateFailed,
                        message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl),
                        trace: false);

                    tracer.TraceError(ex);
                    info    = new SiteExtensionInfo();
                    info.Id = id;
                    info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed;
                    info.Comment           = string.Format(Constants.SiteExtensionProvisioningStateDownloadFailureMessageFormat, id);
                    status = HttpStatusCode.BadRequest;
                }
                catch (InvalidEndpointException ex)
                {
                    _analytics.UnexpectedException(ex, trace: false);

                    tracer.TraceError(ex);
                    info    = new SiteExtensionInfo();
                    info.Id = id;
                    info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed;
                    info.Comment           = ex.Message;
                    status = HttpStatusCode.BadRequest;
                }
                catch (Exception ex)
                {
                    _analytics.UnexpectedException(
                        ex,
                        method: "PUT",
                        path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id),
                        result: Constants.SiteExtensionProvisioningStateFailed,
                        message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl),
                        trace: false);

                    tracer.TraceError(ex);
                    info    = new SiteExtensionInfo();
                    info.Id = id;
                    info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed;
                    info.Comment           = string.Format(Constants.SiteExtensionProvisioningStateInvalidPackageMessageFormat, id);
                    status = HttpStatusCode.BadRequest;
                }
            }

            if (info == null)
            {
                // treat this as an error case since no result return from repo
                _analytics.UnexpectedException(
                    new FileNotFoundException(id),
                    method: "PUT",
                    path: string.Format(CultureInfo.InvariantCulture, "/api/siteextensions/{0}", id),
                    result: Constants.SiteExtensionProvisioningStateFailed,
                    message: string.Format(CultureInfo.InvariantCulture, "{{\"version\": {0}, \"feed_url\": {1}}}", version, feedUrl),
                    trace: false);

                info = new SiteExtensionInfo();
                info.ProvisioningState = Constants.SiteExtensionProvisioningStateFailed;
                info.Comment           = string.Format(Constants.SiteExtensionProvisioningStateNotFoundMessageFormat, id);
                status = HttpStatusCode.NotFound;
            }
            else if (!string.Equals(Constants.SiteExtensionProvisioningStateFailed, info.ProvisioningState, StringComparison.OrdinalIgnoreCase))
            {
                info.ProvisioningState = Constants.SiteExtensionProvisioningStateSucceeded;
                info.Comment           = null;
            }

            using (tracer.Step("Update arm settings for {0} installation. Status: {1}", id, status))
            {
                SiteExtensionStatus armSettings = new SiteExtensionStatus(_environment.SiteExtensionSettingsPath, id, tracer);
                armSettings.ReadSiteExtensionInfo(info);
                armSettings.Status    = status;
                armSettings.Operation = alreadyInstalled ? null : Constants.SiteExtensionOperationInstall;
            }

            return(info);
        }
 public Task <Tuple <bool, INuGetResource> > TryCreate(SourceRepository source, CancellationToken token)
 {
     throw new NotImplementedException();
 }
示例#44
0
        public static HttpSourceTestHost Create(SourceRepository source, HttpClient client)
        {
            Func <Task <HttpHandlerResource> > factory = () => source.GetResourceAsync <HttpHandlerResource>();

            return(new HttpSourceTestHost(source.PackageSource, factory, NullThrottle.Instance, client));
        }
 public override Task <IEnumerable <JObject> > SearchInstalled(SourceRepository source, string searchText, int skip, int take, System.Threading.CancellationToken cancelToken)
 {
     throw new System.NotImplementedException();
 }
示例#46
0
        public override async Task <Tuple <bool, INuGetResource> > TryCreate(SourceRepository source, CancellationToken token)
        {
            ServiceIndexResourceV3 index     = null;
            ServiceIndexCacheInfo  cacheInfo = null;
            var url = source.PackageSource.Source;

            // the file type can easily rule out if we need to request the url
            if (source.PackageSource.ProtocolVersion == 3 ||
                (source.PackageSource.IsHttp &&
                 url.EndsWith(".json", StringComparison.OrdinalIgnoreCase)))
            {
                var utcNow           = DateTime.UtcNow;
                var entryValidCutoff = utcNow.Subtract(MaxCacheDuration);

                // check the cache before downloading the file
                if (!_cache.TryGetValue(url, out cacheInfo) ||
                    entryValidCutoff > cacheInfo.CachedTime)
                {
                    // Track if the semaphore needs to be released
                    var release = false;
                    try
                    {
                        await _semaphore.WaitAsync(token);

                        release = true;

                        token.ThrowIfCancellationRequested();

                        // check the cache again, another thread may have finished this one waited for the lock
                        if (!_cache.TryGetValue(url, out cacheInfo) ||
                            entryValidCutoff > cacheInfo.CachedTime)
                        {
                            index = await GetServiceIndexResourceV3(source, utcNow, NullLogger.Instance, token);

                            // cache the value even if it is null to avoid checking it again later
                            var cacheEntry = new ServiceIndexCacheInfo
                            {
                                CachedTime = utcNow,
                                Index      = index
                            };

                            // If the cache entry has expired it will already exist
                            _cache.AddOrUpdate(url, cacheEntry, (key, value) => cacheEntry);
                        }
                    }
                    finally
                    {
                        if (release)
                        {
                            _semaphore.Release();
                        }
                    }
                }
            }

            if (index == null && cacheInfo != null)
            {
                index = cacheInfo.Index;
            }

            return(new Tuple <bool, INuGetResource>(index != null, index));
        }
示例#47
0
        public IPackageSearchMetadata GetPackageFromRepoWithoutVersion(string packageName, PackageMetadataResource packageMetadataResource, SourceCacheContext sourceCacheContext, SourceRepository sourceRepository)
        {
            IPackageSearchMetadata rootPackage = null;

            var exacactsearchMetadata = packageMetadataResource.GetMetadataAsync(packageName, true, true, sourceCacheContext, Logger, CancellationToken.None)
                                        .Result;

            if (exacactsearchMetadata.Count() == 0)
            {
                Logger.LogDebug("GetPackageFromRepoWithoutVersion - No Package & any version  found in Repo " + $"{sourceRepository.PackageSource.Source} for package : {packageName}");
            }
            else //select latest version
            {
                rootPackage = exacactsearchMetadata.OrderByDescending(x => x.Identity.Version)
                              .FirstOrDefault();
            }

            return(rootPackage);
        }
示例#48
0
 /// <summary>
 /// If the remote package is already determined, consider using the overload which directly takes in the remote package
 /// Can avoid calls FindPackage calls to source repository. However, it should also be remembered that SourceRepository of ProjectManager
 /// is an aggregate of "SharedPackageRepository" and the selected repository. So, if the package is present on the repository path (by default, the packages folder)
 /// It would not result in a call to the server
 /// </summary>
 public virtual void UpdatePackageReference(string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
 {
     UpdatePackageReference(packageId, () => SourceRepository.FindPackage(packageId, version, ConstraintProvider, allowPrereleaseVersions, allowUnlisted: false), updateDependencies, allowPrereleaseVersions, targetVersionSetExplicitly: version != null);
 }
 private SourceValidationResult(SourceValidity validity, string source, SourceRepository sourceRepository)
 {
     Validity         = validity;
     Source           = source;
     SourceRepository = sourceRepository;
 }
示例#50
0
 public SourceResource(SourceRepository source, DependencyInfoResource resource)
 {
     Source   = source;
     Resource = resource;
 }
示例#51
0
        private static async Task <Stream> GetPackageStream(this SourceRepository srcRepo, PackageIdentity identity)
        {
            var downloadResource = await srcRepo.GetResourceAsync <DownloadResource>();

            Stream sourceStream  = null;
            Stream packageStream = null;

            try
            {
                sourceStream = await downloadResource.GetStream(identity, CancellationToken.None);

                if (sourceStream == null)
                {
                    // package not exist from feed
                    throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, "Package {0} - {1} not found when try to download.", identity.Id, identity.Version.ToNormalizedString()));
                }

                packageStream = sourceStream;
                if (!sourceStream.CanSeek)
                {
                    // V3 DownloadResource.GetStream does not support seek operations.
                    // https://github.com/NuGet/NuGet.Protocol/issues/15

                    MemoryStream memStream = new MemoryStream();

                    try
                    {
                        byte[] buffer = new byte[2048];

                        int bytesRead = 0;
                        do
                        {
                            bytesRead = sourceStream.Read(buffer, 0, buffer.Length);
                            memStream.Write(buffer, 0, bytesRead);
                        } while (bytesRead != 0);

                        await memStream.FlushAsync();

                        memStream.Position = 0;

                        packageStream = memStream;
                    }
                    catch
                    {
                        memStream.Dispose();
                        throw;
                    }
                }

                return(packageStream);
            }
            catch
            {
                if (packageStream != null && packageStream != sourceStream)
                {
                    packageStream.Dispose();
                }

                if (sourceStream != null)
                {
                    sourceStream.Dispose();
                }

                throw;
            }
            finally
            {
                if (packageStream != null && sourceStream != null && !sourceStream.CanSeek)
                {
                    // packageStream is a copy of sourceStream, dispose sourceStream
                    sourceStream.Dispose();
                }
            }
        }
示例#52
0
 public static HttpSource Create(SourceRepository source)
 {
     return(Create(source, NullThrottle.Instance));
 }
示例#53
0
 public PackageDownloadManager(IModulesDirectory modulesDirectory, SourceRepository sourceRepository)
 {
     _modulesDirectory = modulesDirectory;
     _sourceRepository = sourceRepository;
 }
示例#54
0
        private static void TransformSequences_RemoveFalsePositiveUnvisited(IEnumerable <Method> methods, SourceRepository sourceRepository, DateTime moduleTime)
        {
            var sequencePointsSet           = new HashSet <SequencePoint>(new SequencePointComparer());
            var toRemoveMethodSequencePoint = new List <Tuple <Method, SequencePoint> >();

            // Initialise sequencePointsSet
            TransformSequences_RemoveFalsePositiveUnvisited(methods, sequencePointsSet);

            // Check generated methods
            foreach (var method in methods
                     .Where(m => m.FileRefUniqueId != 0 &&
                            m.SequencePoints.Length != 0 &&
                            m.IsGenerated))
            {
                // Select duplicate and false-positive unvisited sequence points
                // (Sequence point duplicated by generated method and left unvisited)
                foreach (var sp in method.SequencePoints
                         .Where(sp => sp.FileId == method.FileRefUniqueId &&
                                sp.VisitCount == 0))
                {
                    if (sequencePointsSet.Contains(sp))
                    {
                        // Unvisited duplicate found, add to remove list
                        toRemoveMethodSequencePoint.Add(new Tuple <Method, SequencePoint>(method, sp));
                    }
                }

                // Get method source if availabile
                var source = sourceRepository.GetCodeCoverageStringTextSource(method.FileRefUniqueId);
                if (source != null && !source.IsChanged(moduleTime))
                {
                    TransformSequences_RemoveFalsePositiveUnvisited(method, source, toRemoveMethodSequencePoint);
                }
            }

            // Remove selected SequencePoints
            foreach (var tuple in toRemoveMethodSequencePoint)
            {
                tuple.Item1.SequencePoints = tuple.Item1.SequencePoints.Where(sp => sp != tuple.Item2).ToArray();
            }
        }
示例#55
0
 /// <summary>
 /// Searches installed packages across this target and any sub-targets (Projects in a Solution, for example)
 /// </summary>
 /// <param name="searchText"></param>
 /// <param name="skip"></param>
 /// <param name="take"></param>
 /// <param name="cancelToken"></param>
 /// <returns></returns>
 public abstract Task <IEnumerable <JObject> > SearchInstalled(SourceRepository source, string searchText, int skip, int take, CancellationToken cancelToken);
示例#56
0
        /// <summary>
        /// <para>1. Download package</para>
        /// <para>2. Generate xdt file if not exist</para>
        /// <para>3. Deploy site extension job</para>
        /// <para>4. Execute install.cmd if exist</para>
        /// </summary>
        private async Task <UIPackageMetadata> InstallExtension(UIPackageMetadata package, string installationDirectory, string feedUrl, SiteExtensionInfo.SiteExtensionType type, ITracer tracer)
        {
            try
            {
                bool             packageExisted = FileSystemHelpers.DirectoryExists(installationDirectory);
                SourceRepository remoteRepo     = GetRemoteRepository(feedUrl);

                // package path from local repo
                string packageLocalFilePath = GetNuGetPackageFile(package.Identity.Id, package.Identity.Version.ToString());
                using (tracer.Step("Download site extension: {0}", package.Identity))
                {
                    string extractPath = installationDirectory;
                    if (SiteExtensionInfo.SiteExtensionType.WebRoot == type)
                    {
                        extractPath = _environment.WebRootPath;
                        FileSystemHelpers.EnsureDirectory(extractPath);
                    }

                    // Copy/update content folder
                    // Copy/update nupkg file for package list/lookup
                    if (packageExisted)
                    {
                        await remoteRepo.UpdateLocalPackage(_localRepository, package.Identity, extractPath, packageLocalFilePath, tracer);
                    }
                    else
                    {
                        FileSystemHelpers.EnsureDirectory(installationDirectory);
                        await remoteRepo.DownloadPackageToFolder(package.Identity, extractPath, packageLocalFilePath);
                    }

                    if (SiteExtensionInfo.SiteExtensionType.WebRoot == type)
                    {
                        // if install to WebRoot, check if there is any xdt file come with package
                        // if there is one, move it to site extension folder
                        string xdtFile = Path.Combine(extractPath, Constants.ApplicationHostXdtFileName);
                        if (File.Exists(xdtFile))
                        {
                            tracer.Trace("Use xdt file from package.");
                            string newXdtFile = Path.Combine(installationDirectory, Constants.ApplicationHostXdtFileName);

                            tracer.Trace("Moving {0} to {1}", xdtFile, newXdtFile);
                            FileSystemHelpers.MoveFile(xdtFile, newXdtFile);
                        }
                        else
                        {
                            tracer.Trace("No xdt file come with package.");
                        }
                    }
                }

                // ignore below action if we install packge to wwwroot
                if (SiteExtensionInfo.SiteExtensionType.WebRoot != type)
                {
                    // If there is no xdt file, generate default.
                    using (tracer.Step("Check if applicationhost.xdt file existed."))
                    {
                        GenerateApplicationHostXdt(installationDirectory, '/' + package.Identity.Id, isPreInstalled: false, tracer: tracer);
                    }

                    using (tracer.Step("Trigger site extension job"))
                    {
                        OperationManager.Attempt(() => DeploySiteExtensionJobs(package.Identity.Id));
                    }

                    var    externalCommandFactory = new ExternalCommandFactory(_environment, _settings, installationDirectory);
                    string installScript          = Path.Combine(installationDirectory, _installScriptName);
                    if (FileSystemHelpers.FileExists(installScript))
                    {
                        using (tracer.Step("Execute install.cmd"))
                        {
                            OperationManager.Attempt(() =>
                            {
                                Executable exe = externalCommandFactory.BuildCommandExecutable(installScript,
                                                                                               installationDirectory,
                                                                                               _settings.GetCommandIdleTimeout(), NullLogger.Instance);
                                exe.ExecuteWithProgressWriter(NullLogger.Instance, _traceFactory.GetTracer(), String.Empty);
                            });
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                tracer.TraceError(ex);
                FileSystemHelpers.DeleteDirectorySafe(installationDirectory);
                throw;
            }

            return(await _localRepository.GetLatestPackageById(package.Identity.Id));
        }
示例#57
0
            internal static async Task <RemoteV3FindPackageByIdResourceTest> CreateAsync()
            {
                var serviceAddress  = ProtocolUtility.CreateServiceAddress();
                var packageIdentity = new PackageIdentity(
                    id: "xunit",
                    version: NuGetVersion.Parse("2.2.0-beta1-build3239"));
                var testDirectory = TestDirectory.Create();
                var packageSource = new PackageSource(serviceAddress);

                var dependencyInfoResourceProvider = new Mock <INuGetResourceProvider>();
                var dependencyInfoResource         = new Mock <DependencyInfoResource>();
                var remoteSourceDependencyInfo     = new RemoteSourceDependencyInfo(
                    packageIdentity,
                    listed: true,
                    dependencyGroups: Enumerable.Empty <PackageDependencyGroup>(),
                    contentUri: serviceAddress + "api/v2/package/xunit/2.2.0-beta1-build3239");

                dependencyInfoResource.Setup(x => x.ResolvePackages(
                                                 It.Is <string>(id => id == packageIdentity.Id),
                                                 It.IsAny <SourceCacheContext>(),
                                                 It.IsNotNull <ILogger>(),
                                                 It.IsAny <CancellationToken>()))
                .ReturnsAsync(new[] { remoteSourceDependencyInfo });

                dependencyInfoResourceProvider.SetupGet(x => x.Before)
                .Returns(Enumerable.Empty <string>());
                dependencyInfoResourceProvider.SetupGet(x => x.After)
                .Returns(Enumerable.Empty <string>());
                dependencyInfoResourceProvider.SetupGet(x => x.ResourceType)
                .Returns(typeof(DependencyInfoResource));
                dependencyInfoResourceProvider.SetupGet(x => x.Name)
                .Returns("DependencyInfoResourceProvider");
                dependencyInfoResourceProvider.Setup(
                    x => x.TryCreate(It.IsNotIn <SourceRepository>(), It.IsAny <CancellationToken>()))
                .ReturnsAsync(new Tuple <bool, INuGetResource>(true, dependencyInfoResource.Object));

                var sourceRepository = new SourceRepository(
                    packageSource,
                    new[] { dependencyInfoResourceProvider.Object });
                var package = await SimpleTestPackageUtility.CreateFullPackageAsync(
                    testDirectory.Path,
                    packageIdentity.Id,
                    packageIdentity.Version.ToNormalizedString());

                var packageBytes = File.ReadAllBytes(package.FullName);

                var responses = new Dictionary <string, Func <HttpRequestMessage, Task <HttpResponseMessage> > >
                {
                    {
                        serviceAddress,
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new TestContent(string.Empty)
                        })
                    },
                    {
                        serviceAddress + "api/v2/package/xunit/2.2.0-beta1-build3239",
                        request => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                        {
                            Content = new ByteArrayContent(packageBytes)
                        })
                    }
                };

                var httpSource = new TestHttpSource(packageSource, responses);
                var resource   = new RemoteV3FindPackageByIdResource(
                    sourceRepository,
                    httpSource);

                return(new RemoteV3FindPackageByIdResourceTest(
                           resource,
                           sourceRepository,
                           package,
                           packageIdentity,
                           new SourceCacheContext(),
                           httpSource,
                           testDirectory));
            }
示例#58
0
 public void UpdatePackage(string packageId, SemanticVersion version, bool updateDependencies, bool allowPrereleaseVersions)
 {
     UpdatePackage(packageId, () => SourceRepository.FindPackage(packageId, version, allowPrereleaseVersions, allowUnlisted: false),
                   updateDependencies, allowPrereleaseVersions);
 }
示例#59
0
 public void Dispose()
 {
     this.sourceRepository = null;
     this.sourceCacheContext?.Dispose();
     this.sourceCacheContext = null;
 }
示例#60
0
 public TestDependencyInfo(SourceRepository source, List <SourcePackageDependencyInfo> packages)
 {
     Source   = source;
     Packages = packages;
 }