@@ -336,7 +336,7 @@ let inline isExtracted fileName =
336336/// Extracts the given package to the ./packages folder
337337let ExtractPackage ( fileName : string , targetFolder , name , version : SemVerInfo ) =
338338 async {
339- if isExtracted fileName then
339+ if isExtracted fileName then
340340 verbosefn " %s %A already extracted" name version
341341 else
342342 use zip = ZipFile.Read( fileName)
@@ -367,8 +367,24 @@ let ExtractPackage(fileName:string, targetFolder, name, version:SemVerInfo) =
367367 return targetFolder
368368 }
369369
370+ let CopyLicenseFromCache ( root , cacheFileName , name , version : SemVerInfo , force ) =
371+ async {
372+ try
373+ if String.IsNullOrWhiteSpace cacheFileName then return () else
374+ let cacheFile = FileInfo cacheFileName
375+ if cacheFile.Exists then
376+ let targetFolder = DirectoryInfo( Path.Combine( root, Constants.PackagesFolderName, name)). FullName
377+ let targetFile = FileInfo( Path.Combine( targetFolder, " license.html" ))
378+ if not force && targetFile.Exists then
379+ verbosefn " License %s %A already copied" name version
380+ else
381+ File.Copy( cacheFile.FullName, targetFile.FullName, true )
382+ with
383+ | exn -> traceWarnfn " Could not copy license for %s %A from %s .%s %s " name version cacheFileName Environment.NewLine exn.Message
384+ }
385+
370386/// Extracts the given package to the ./packages folder
371- let CopyFromCache ( root , cacheFileName , name , version : SemVerInfo , force ) =
387+ let CopyFromCache ( root , cacheFileName , licenseCacheFile , name , version : SemVerInfo , force ) =
372388 async {
373389 let targetFolder = DirectoryInfo( Path.Combine( root, Constants.PackagesFolderName, name)). FullName
374390 let fi = FileInfo( cacheFileName)
@@ -378,20 +394,58 @@ let CopyFromCache(root, cacheFileName, name, version:SemVerInfo, force) =
378394 else
379395 CleanDir targetFolder
380396 File.Copy( cacheFileName, targetFile.FullName)
381- try
382- return ! ExtractPackage( targetFile.FullName, targetFolder, name, version)
397+ try
398+ let! extracted = ExtractPackage( targetFile.FullName, targetFolder, name, version)
399+ do ! CopyLicenseFromCache( root, licenseCacheFile, name, version, force)
400+ return extracted
383401 with
384402 | exn ->
385403 File.Delete targetFile.FullName
386404 Directory.Delete( targetFolder, true )
387405 return ! raise exn
388406 }
389407
408+ let DownloadLicense ( root , force , name , version : SemVerInfo , licenseUrl , targetFileName ) =
409+ async {
410+ if String.IsNullOrWhiteSpace licenseUrl then return () else
411+
412+ let targetFile = FileInfo targetFileName
413+ if not force && targetFile.Exists && targetFile.Length > 0 L then
414+ verbosefn " License for %s %A already downloaded" name version
415+ else
416+ try
417+ verbosefn " Downloading license for %s %A to %s " name version targetFileName
418+
419+ let request = HttpWebRequest.Create( Uri licenseUrl) :?> HttpWebRequest
420+ request.AutomaticDecompression <- DecompressionMethods.GZip ||| DecompressionMethods.Deflate
421+ request.UserAgent <- " Paket"
422+ request.UseDefaultCredentials <- true
423+ request.Proxy <- Utils.getDefaultProxyFor licenseUrl
424+ use! httpResponse = request.AsyncGetResponse()
425+
426+ use httpResponseStream = httpResponse.GetResponseStream()
427+
428+ let bufferSize = 4096
429+ let buffer : byte [] = Array.zeroCreate bufferSize
430+ let bytesRead = ref - 1
431+
432+ use fileStream = File.Create( targetFileName)
433+
434+ while ! bytesRead <> 0 do
435+ let! bytes = httpResponseStream.AsyncRead( buffer, 0 , bufferSize)
436+ bytesRead := bytes
437+ do ! fileStream.AsyncWrite( buffer, 0 , ! bytesRead)
438+
439+ with
440+ | exn -> traceWarnfn " Could not download license for %s %A from %s .%s %s " name version licenseUrl Environment.NewLine exn.Message
441+ }
442+
390443/// Downloads the given package to the NuGet Cache folder
391444let DownloadPackage ( root , auth , url , name , version : SemVerInfo , force ) =
392445 async {
393446 let targetFileName = Path.Combine( CacheFolder, name + " ." + version.Normalize() + " .nupkg" )
394447 let targetFile = FileInfo targetFileName
448+ let licenseFileName = Path.Combine( CacheFolder, name + " ." + version.Normalize() + " .license.html" )
395449 if not force && targetFile.Exists && targetFile.Length > 0 L then
396450 verbosefn " %s %A already downloaded" name version
397451 else
@@ -432,10 +486,12 @@ let DownloadPackage(root, auth, url, name, version:SemVerInfo, force) =
432486 let! bytes = httpResponseStream.AsyncRead( buffer, 0 , bufferSize)
433487 bytesRead := bytes
434488 do ! fileStream.AsyncWrite( buffer, 0 , ! bytesRead)
435-
489+
490+ do ! DownloadLicense( root, force, name, version, nugetPackage.LicenseUrl, licenseFileName)
436491 with
437492 | exn -> failwithf " Could not download %s %A .%s %s " name version Environment.NewLine exn.Message
438- return ! CopyFromCache( root, targetFile.FullName, name, version, force)
493+
494+ return ! CopyFromCache( root, targetFile.FullName, licenseFileName, name, version, force)
439495 }
440496
441497/// Finds all libraries in a nuget package.
0 commit comments