public void DownloadPackage(string packageId, NuGetVersion version, string feedId, Uri feedUri, ICredentials feedCredentials, bool forcePackageDownload, out string downloadedTo, out string hash, out long size)
        {
            var cacheDirectory = GetPackageRoot(feedId);

            LocalNuGetPackage downloaded = null;

            downloadedTo = null;
            if (!forcePackageDownload)
            {
                AttemptToGetPackageFromCache(packageId, version, feedId, cacheDirectory, out downloaded, out downloadedTo);
            }

            if (downloaded == null)
            {
                DownloadPackage(packageId, version, feedUri, feedCredentials, cacheDirectory, out downloaded, out downloadedTo);
            }
            else
            {
                Log.VerboseFormat("Package was found in cache. No need to download. Using file: '{0}'", downloadedTo);
            }

            size = fileSystem.GetFileSize(downloadedTo);
            string packageHash = null;

            downloaded.GetStream(stream => packageHash = HashCalculator.Hash(stream));
            hash = packageHash;
        }
        private void DownloadPackage(
            string packageId,
            IVersion version,
            Uri feedUri,
            ICredentials feedCredentials,
            string cacheDirectory,
            int maxDownloadAttempts,
            TimeSpan downloadAttemptBackoff,
            out LocalNuGetPackage downloaded,
            out string downloadedTo)
        {
            Log.Info("Downloading NuGet package {0} {1} from feed: '{2}'", packageId, version, feedUri);
            Log.VerboseFormat("Downloaded package will be stored in: '{0}'", cacheDirectory);
            fileSystem.EnsureDirectoryExists(cacheDirectory);
            fileSystem.EnsureDiskHasEnoughFreeSpace(cacheDirectory);

            var fullPathToDownloadTo = GetFilePathToDownloadPackageTo(cacheDirectory, packageId, version.ToString());

            var downloader = new NuGet.NuGetPackageDownloader(fileSystem);

            downloader.DownloadPackage(packageId, version, feedUri, feedCredentials, fullPathToDownloadTo,
                                       maxDownloadAttempts, downloadAttemptBackoff);

            downloaded   = new LocalNuGetPackage(fullPathToDownloadTo);
            downloadedTo = fullPathToDownloadTo;
            CheckWhetherThePackageHasDependencies(downloaded.Metadata);
        }
Beispiel #3
0
        void CheckWhetherThePackageHasDependencies(PackagePhysicalFileMetadata pkg)
        {
            var nuGetMetadata = new LocalNuGetPackage(pkg.FullFilePath).Metadata;

#if USE_NUGET_V3_LIBS
            var dependencies = nuGetMetadata.DependencyGroups.SelectMany(ds => ds.Packages).ToArray();
#else
            var dependencies = nuGetMetadata.DependencySets.SelectMany(ds => ds.Dependencies).ToArray();
#endif
            if (dependencies.Any())
            {
                Log.Info(
                    "NuGet packages with dependencies are not currently supported, and dependencies won't be installed on the Tentacle. The package '{0} {1}' appears to have the following dependencies: {2}. For more information please see {3}",
                    pkg.PackageId,
                    pkg.Version,
                    string.Join(", ", dependencies.Select(dependency => $"{dependency.Id}")),
                    WhyAmINotAllowedToUseDependencies);
            }
        }
        private void AttemptToGetPackageFromCache(string packageId, IVersion version, string cacheDirectory,
                                                  out LocalNuGetPackage downloaded, out string downloadedTo)
        {
            downloaded   = null;
            downloadedTo = null;

            Log.VerboseFormat("Checking package cache for package {0} {1}", packageId, version.ToString());

            var name = GetNameOfPackage(packageId, version.ToString());

            fileSystem.EnsureDirectoryExists(cacheDirectory);

            var files = fileSystem.EnumerateFilesRecursively(cacheDirectory, name + "*.nupkg");

            foreach (var file in files)
            {
                var package = ReadPackageFile(file);
                if (package == null)
                {
                    continue;
                }


                var idMatches         = string.Equals(package.Metadata.Id, packageId, StringComparison.OrdinalIgnoreCase);
                var versionExactMatch = string.Equals(package.Metadata.Version.ToString(), version.ToString(),
                                                      StringComparison.OrdinalIgnoreCase);

                var packageMetadata = new MetadataFactory().GetMetadataFromPackageID(packageId);
                var nugetVerMatches = VersionFactory.TryCreateVersion(package.Metadata.Version.ToString(),
                                                                      out IVersion packageVersion, packageMetadata.VersionFormat) &&
                                      version.Equals(packageVersion);

                if (idMatches && (nugetVerMatches || versionExactMatch))
                {
                    downloaded   = package;
                    downloadedTo = file;
                    return;
                }
            }
        }
Beispiel #5
0
        public static PackageFileNameMetadata FromFile(string path)
        {
            var fileName = Path.GetFileName(path) ?? "";

            if (!TryParseEncodedFileName(fileName, out var packageId, out var version, out var extension) &&
                !TryParseUnsafeFileName(fileName, out packageId, out version, out extension))
            {
                throw new Exception($"Unexpected file format in {fileName}.\nExpected Octopus cached file format: `<PackageId>{SectionDelimiter}<Version>{SectionDelimiter}<CacheBuster>.<Extension>` or `<PackageId>.<SemverVersion>.<Extension>`");
            }

            //TODO: Extract... Obviously _could_ be an issue for .net core
            if (extension.Equals(".nupkg", StringComparison.InvariantCultureIgnoreCase) && File.Exists(path))
            {
//                var metaData = new FileSystemNuGetPackage(path);
//                version = metaData.Version;
//                packageId = metaData.PackageId;
                var metaData = new LocalNuGetPackage(path).Metadata;
                version   = SemVerFactory.CreateVersion(metaData.Version.ToString());
                packageId = metaData.Id;
            }

            return(new PackageFileNameMetadata(packageId, version, extension));
        }
        private void AttemptToGetPackageFromCache(string packageId, NuGetVersion version, string feedId, string cacheDirectory, out LocalNuGetPackage downloaded, out string downloadedTo)
        {
            downloaded   = null;
            downloadedTo = null;

            Log.VerboseFormat("Checking package cache for package {0} {1}", packageId, version.ToString());

            var name = GetNameOfPackage(packageId, version.ToString());

            fileSystem.EnsureDirectoryExists(cacheDirectory);

            var files = fileSystem.EnumerateFilesRecursively(cacheDirectory, name + "*.nupkg");

            foreach (var file in files)
            {
                var package = ReadPackageFile(file);
                if (package == null)
                {
                    continue;
                }

                if (!string.Equals(package.Metadata.Id, packageId, StringComparison.OrdinalIgnoreCase) || !string.Equals(package.Metadata.Version.ToString(), version.ToString(), StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                downloaded   = package;
                downloadedTo = file;
            }
        }
        private void AttemptToGetPackageFromCache(string packageId, NuGetVersion version, string cacheDirectory, out LocalNuGetPackage downloaded, out string downloadedTo)
        {
            downloaded = null;
            downloadedTo = null;

            Log.VerboseFormat("Checking package cache for package {0} {1}", packageId, version.ToString());

            var name = GetNameOfPackage(packageId, version.ToString());
            fileSystem.EnsureDirectoryExists(cacheDirectory);

            var files = fileSystem.EnumerateFilesRecursively(cacheDirectory, name + "*.nupkg");

            foreach (var file in files)
            {
                var package = ReadPackageFile(file);
                if (package == null)
                    continue;

                var idMatches = string.Equals(package.Metadata.Id, packageId, StringComparison.OrdinalIgnoreCase);
                var versionExactMatch = string.Equals(package.Metadata.Version.ToString(), version.ToString(), StringComparison.OrdinalIgnoreCase);
            #if USE_NUGET_V2_LIBS
                var nugetVerMatches = NuGetVersion.TryParse(package.Metadata.Version, out NuGetVersion packageVersion) &&
                        VersionComparer.Default.Equals(version, packageVersion);
            #else
                var nugetVerMatches = package.Metadata.Version.Equals(version);
            #endif

                if (idMatches && (nugetVerMatches || versionExactMatch))
                {
                    downloaded = package;
                    downloadedTo = file;
                    return;
                }
            }
        }