Skip to content

Commit 7147ce0

Browse files
committed
Automatically download package licenses to package folder - closes #735
1 parent 62be8ce commit 7147ce0

4 files changed

Lines changed: 65 additions & 9 deletions

File tree

‎src/Paket.Core/NuGetV2.fs‎

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ let inline isExtracted fileName =
336336
/// Extracts the given package to the ./packages folder
337337
let 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 > 0L 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
391444
let 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 > 0L 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.

‎src/Paket.Core/PackageResolver.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type ResolvedPackage =
5454
{ Name : PackageName
5555
Version : SemVerInfo
5656
Dependencies : DependencySet
57-
Unlisted : bool
57+
Unlisted : bool
5858
Settings : InstallSettings
5959
Source : PackageSource }
6060

‎src/Paket.Core/RestoreProcess.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ let ExtractPackage(root, sources, force, package : ResolvedPackage) =
3131
| LocalNuget path ->
3232
let path = Utils.normalizeLocalPath path
3333
let packageFile = Path.Combine(root, path, sprintf "%s.%A.nupkg" name v)
34-
let! folder = NuGetV2.CopyFromCache(root, packageFile, name, v, force)
34+
let! folder = NuGetV2.CopyFromCache(root, packageFile, "", name, v, force) // TODO: Restore license
3535
return package, NuGetV2.GetLibFiles folder, NuGetV2.GetTargetsFiles folder
3636
}
3737

‎src/Paket/Paket.fsproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<WarningLevel>3</WarningLevel>
2828
<DocumentationFile>
2929
</DocumentationFile>
30-
<StartArguments>update</StartArguments>
30+
<StartArguments>restore -f</StartArguments>
3131
<StartAction>Project</StartAction>
3232
<StartProgram>paket.exe</StartProgram>
3333
<StartWorkingDirectory>D:\code\Paketkopie</StartWorkingDirectory>

0 commit comments

Comments
 (0)