Skip to content

Commit

Permalink
Automatically download package licenses to package folder - closes #735
Browse files Browse the repository at this point in the history
  • Loading branch information
forki committed Mar 30, 2015
1 parent 62be8ce commit 959ae94
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 10 deletions.
68 changes: 62 additions & 6 deletions src/Paket.Core/NuGetV2.fs
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ let inline isExtracted fileName =
/// Extracts the given package to the ./packages folder
let ExtractPackage(fileName:string, targetFolder, name, version:SemVerInfo) =
async {
if isExtracted fileName then
if isExtracted fileName then
verbosefn "%s %A already extracted" name version
else
use zip = ZipFile.Read(fileName)
Expand Down Expand Up @@ -367,8 +367,24 @@ let ExtractPackage(fileName:string, targetFolder, name, version:SemVerInfo) =
return targetFolder
}

let CopyLicenseFromCache(root, cacheFileName, name, version:SemVerInfo, force) =
async {
try
if String.IsNullOrWhiteSpace cacheFileName then return () else
let cacheFile = FileInfo cacheFileName
if cacheFile.Exists then
let targetFolder = DirectoryInfo(Path.Combine(root, Constants.PackagesFolderName, name)).FullName
let targetFile = FileInfo(Path.Combine(targetFolder, "license.html"))
if not force && targetFile.Exists then
verbosefn "License %s %A already copied" name version
else
File.Copy(cacheFile.FullName, targetFile.FullName, true)
with
| exn -> traceWarnfn "Could not copy license for %s %A from %s.%s %s" name version cacheFileName Environment.NewLine exn.Message
}

/// Extracts the given package to the ./packages folder
let CopyFromCache(root, cacheFileName, name, version:SemVerInfo, force) =
let CopyFromCache(root, cacheFileName, licenseCacheFile, name, version:SemVerInfo, force) =
async {
let targetFolder = DirectoryInfo(Path.Combine(root, Constants.PackagesFolderName, name)).FullName
let fi = FileInfo(cacheFileName)
Expand All @@ -378,20 +394,58 @@ let CopyFromCache(root, cacheFileName, name, version:SemVerInfo, force) =
else
CleanDir targetFolder
File.Copy(cacheFileName, targetFile.FullName)
try
return! ExtractPackage(targetFile.FullName,targetFolder,name,version)
try
let! extracted = ExtractPackage(targetFile.FullName,targetFolder,name,version)
do! CopyLicenseFromCache(root, licenseCacheFile, name, version, force)
return extracted
with
| exn ->
File.Delete targetFile.FullName
Directory.Delete(targetFolder,true)
return! raise exn
}

let DownloadLicense(root,force,name,version:SemVerInfo,licenseUrl,targetFileName) =
async {
if String.IsNullOrWhiteSpace licenseUrl then return () else

let targetFile = FileInfo targetFileName
if not force && targetFile.Exists && targetFile.Length > 0L then
verbosefn "License for %s %A already downloaded" name version
else
try
verbosefn "Downloading license for %s %A to %s" name version targetFileName

let request = HttpWebRequest.Create(Uri licenseUrl) :?> HttpWebRequest
request.AutomaticDecompression <- DecompressionMethods.GZip ||| DecompressionMethods.Deflate
request.UserAgent <- "Paket"
request.UseDefaultCredentials <- true
request.Proxy <- Utils.getDefaultProxyFor licenseUrl
use! httpResponse = request.AsyncGetResponse()

use httpResponseStream = httpResponse.GetResponseStream()

let bufferSize = 4096
let buffer : byte [] = Array.zeroCreate bufferSize
let bytesRead = ref -1

use fileStream = File.Create(targetFileName)

while !bytesRead <> 0 do
let! bytes = httpResponseStream.AsyncRead(buffer, 0, bufferSize)
bytesRead := bytes
do! fileStream.AsyncWrite(buffer, 0, !bytesRead)

with
| exn -> traceWarnfn "Could not download license for %s %A from %s.%s %s" name version licenseUrl Environment.NewLine exn.Message
}

/// Downloads the given package to the NuGet Cache folder
let DownloadPackage(root, auth, url, name, version:SemVerInfo, force) =
async {
let targetFileName = Path.Combine(CacheFolder, name + "." + version.Normalize() + ".nupkg")
let targetFile = FileInfo targetFileName
let licenseFileName = Path.Combine(CacheFolder, name + "." + version.Normalize() + ".license.html")
if not force && targetFile.Exists && targetFile.Length > 0L then
verbosefn "%s %A already downloaded" name version
else
Expand Down Expand Up @@ -432,10 +486,12 @@ let DownloadPackage(root, auth, url, name, version:SemVerInfo, force) =
let! bytes = httpResponseStream.AsyncRead(buffer, 0, bufferSize)
bytesRead := bytes
do! fileStream.AsyncWrite(buffer, 0, !bytesRead)


do! DownloadLicense(root,force,name,version,nugetPackage.LicenseUrl,licenseFileName)
with
| exn -> failwithf "Could not download %s %A.%s %s" name version Environment.NewLine exn.Message
return! CopyFromCache(root, targetFile.FullName, name, version, force)

return! CopyFromCache(root, targetFile.FullName, licenseFileName, name, version, force)
}

/// Finds all libraries in a nuget package.
Expand Down
2 changes: 1 addition & 1 deletion src/Paket.Core/PackageResolver.fs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ type ResolvedPackage =
{ Name : PackageName
Version : SemVerInfo
Dependencies : DependencySet
Unlisted : bool
Unlisted : bool
Settings : InstallSettings
Source : PackageSource }

Expand Down
2 changes: 1 addition & 1 deletion src/Paket.Core/RestoreProcess.fs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ let ExtractPackage(root, sources, force, package : ResolvedPackage) =
| LocalNuget path ->
let path = Utils.normalizeLocalPath path
let packageFile = Path.Combine(root, path, sprintf "%s.%A.nupkg" name v)
let! folder = NuGetV2.CopyFromCache(root, packageFile, name, v, force)
let! folder = NuGetV2.CopyFromCache(root, packageFile, "", name, v, force) // TODO: Restore license
return package, NuGetV2.GetLibFiles folder, NuGetV2.GetTargetsFiles folder
}

Expand Down
2 changes: 1 addition & 1 deletion src/Paket/Paket.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<WarningLevel>3</WarningLevel>
<DocumentationFile>
</DocumentationFile>
<StartArguments>update</StartArguments>
<StartArguments>restore -f</StartArguments>
<StartAction>Project</StartAction>
<StartProgram>paket.exe</StartProgram>
<StartWorkingDirectory>D:\code\Paketkopie</StartWorkingDirectory>
Expand Down
2 changes: 1 addition & 1 deletion tests/Paket.Tests/Nuspec/NuspecSpecs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ let ``can detect framework assemblies for SqlCLient``() =
{ AssemblyName = "System.Xml"; FrameworkRestrictions = [] } ]

[<Test>]
let ``can detect ´license for SqlCLient``() =
let ``can detect license for SqlCLient``() =
Nuspec.Load("Nuspec/FSharp.Data.SqlClient.nuspec").LicenseUrl
|> shouldEqual "http://github.com/fsprojects/FSharp.Data.SqlClient/blob/master/LICENSE.md"

Expand Down

0 comments on commit 959ae94

Please sign in to comment.