Пример #1
0
        public IPackageContent GetBinaryPackage(string url, string gitHash, string platform)
        {
            string format;

            if (this.HasBinaryPackage(url, gitHash, platform, out format))
            {
                // We have it already downloaded in the cache.
                var file = Path.Combine(
                    _packageCacheConfiguration.GetCacheDirectory(),
                    this.GetPackageName(url, gitHash, platform, format));
                using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var data = new byte[stream.Length];
                    stream.Read(data, 0, data.Length);
                    return(new BinaryPackageContent
                    {
                        Format = format,
                        PackageData = data,
                    });
                }
            }

            // We must use the package retrieval interface to download a copy
            // of the package.
            var tempFile = Path.Combine(
                _packageCacheConfiguration.GetCacheDirectory(),
                this.GetPackageName(url, gitHash, platform, string.Empty) + ".tmp");

            if (!_packageRetrieval.DownloadBinaryPackage(url, gitHash, platform, out format, tempFile))
            {
                return(null);
            }

            var saveFile = Path.Combine(
                _packageCacheConfiguration.GetCacheDirectory(),
                this.GetPackageName(url, gitHash, platform, format));

            try
            {
                File.Move(tempFile, saveFile);
            }
            catch (Exception)
            {
                Console.WriteLine("WARNING: Unable to save package to cache.");
                saveFile = tempFile;
            }

            byte[] saveData;
            using (var stream = new FileStream(saveFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                saveData = new byte[stream.Length];
                stream.Read(saveData, 0, saveData.Length);
            }

            if (saveFile == tempFile)
            {
                File.Delete(tempFile);
            }

            return(new BinaryPackageContent
            {
                Format = format,
                PackageData = saveData,
            });
        }