Beispiel #1
0
        static void Main(string[] args)
        {
            var          indexJsonUrl                = args[0];
            var          tfsUserName                 = args.Length > 1 ? args[1] : null;
            var          tfsPwd                      = args.Length > 2 ? args[2] : null;
            var          workDir                     = $"Backup_{DateTime.Now:yyyyMMddHHmmss}";
            const string packageFolderName           = "Packages";
            const string packageHashAlgorithm        = "sha512";
            var          backupPath                  = $"{workDir}\\{packageFolderName}";
            var          cachePackageRootPath        = $"{workDir}\\Caches";
            var          cachePackagesBatchBuilder   = new StringBuilder();
            var          publishPackagesBatchBuilder = new StringBuilder("set source=%1\r\nset apiKey=%2\r\n");

            if (!Directory.Exists(backupPath))
            {
                Directory.CreateDirectory(backupPath);
            }

            if (!Directory.Exists(cachePackageRootPath))
            {
                Directory.CreateDirectory(cachePackageRootPath);
            }

            if (indexJsonUrl.ToLower().EndsWith("v3/index.json"))
            {
                Console.WriteLine("Detected v3 feed URL, try to find legacy v2 feed URL...");

                var client = new RestClient(indexJsonUrl)
                {
                    Authenticator = new NtlmAuthenticator(tfsUserName, tfsPwd)
                };

                var request  = new RestRequest(Method.GET);
                var response = client.Execute <NugetV3IndexJson>(request);

                if (response.IsSuccessful)
                {
                    SaveTextFile($"{workDir}\\index.json", response.Content);

                    var v2Feed = response.Data.Resources.FirstOrDefault(r => r.Type.Contains("LegacyGallery/2.0.0"));

                    if (v2Feed != null)
                    {
                        Console.WriteLine($"Found legacy v2 feed URL: {v2Feed.Id}");
                        indexJsonUrl = v2Feed.Id;
                    }
                }
                else
                {
                    Console.WriteLine($"Failed to find legacy v2 feed URL: {response.ErrorMessage}");
                    return;
                }
            }

            IList <IPackage> packages;

            try
            {
                var packageRepository = PackageRepositoryFactory.Default.CreateRepository(indexJsonUrl);
                packages = packageRepository.GetPackages().ToList();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return;
            }

            foreach (var package in packages.OrderBy(p => p.Id).ThenBy(p => p.Version))
            {
                var dataServicePackage  = (DataServicePackage)package;
                var packageFileName     = $"{package.Id}.{package.Version}.nupkg";
                var downloadPackagePath = $"{backupPath}\\{packageFileName}";

                cachePackagesBatchBuilder.AppendLine($"nuget.exe install {package.Id} -OutputDirectory tempPackages -Version {package.Version} -NonInteractive");
                publishPackagesBatchBuilder.AppendLine($"nuget.exe push -Source \"%source%\" -ApiKey %apiKey% {packageFolderName}\\{packageFileName}");

                var request = new RestRequest(dataServicePackage.DownloadUrl.PathAndQuery, Method.GET)
                {
                    ResponseWriter = stream =>
                    {
                        using (var fileStream = File.Create(downloadPackagePath))
                        {
                            stream.CopyTo(fileStream);
                        }

                        var zipPackage       = new ZipPackage(downloadPackagePath);
                        var cachePackagePath = $"{package.Id}\\{package.Version}".ToLower();
                        zipPackage.ExtractContents(new PhysicalFileSystem(cachePackageRootPath), cachePackagePath);
                        var packageHash          = zipPackage.GetHash(packageHashAlgorithm);
                        var cachePackageFileName = $"{cachePackageRootPath}\\{cachePackagePath}\\{packageFileName.ToLower()}";
                        var fastZip = new FastZip();
                        fastZip.ExtractZip(downloadPackagePath, $"{cachePackageRootPath}\\{cachePackagePath}", @"\.nuspec$;\.nupkg$");
                        var nuspecFilePath = $"{cachePackageRootPath}\\{cachePackagePath}\\{package.Id}.nuspec";
                        if (File.Exists(nuspecFilePath))
                        {
                            File.Move(nuspecFilePath, nuspecFilePath.ToLower());
                        }

                        File.Copy(downloadPackagePath, cachePackageFileName, true);

                        var sha512FileName = $"{cachePackageFileName}.{packageHashAlgorithm}";
                        SaveTextFile(sha512FileName, packageHash);
                    }
                };

                var restClient = new RestClient($"http://{dataServicePackage.DownloadUrl.Host}")
                {
                    Authenticator = new NtlmAuthenticator(tfsUserName, tfsPwd)
                };
                var response = restClient.DownloadData(request);

                Console.WriteLine($"{packageFileName} is download.");
            }

            cachePackagesBatchBuilder.AppendLine("rmdir /Q /S tempPackages");

            SaveTextFile($"{workDir}\\BuildNugetCacheBatch.bat", cachePackagesBatchBuilder.ToString());
            SaveTextFile($"{workDir}\\PublishNugetPackagesBatch.bat", publishPackagesBatchBuilder.ToString());
        }