@@ -643,6 +643,19 @@ let getNuspecProperties (nuspec : string) =
643643 PackageHashAlgorithm = String.Empty
644644 }
645645
646+ type NugetPackageInfo =
647+ { Id : string
648+ Version : string
649+ Description : string
650+ Summary : string
651+ IsLatestVersion : bool
652+ Authors : string
653+ Owners : string
654+ Tags : string
655+ ProjectUrl : string
656+ LicenseUrl : string
657+ Title : string }
658+
646659/// Returns the NuGet meta data from the given package file name.
647660/// ## Parameters
648661///
@@ -654,15 +667,12 @@ let getNuspecProperties (nuspec : string) =
654667// |> getNuspecProperties
655668
656669/// Default NuGet feed
657- [<Obsolete " This V1 NuGet feed url most likely doesn't work. Please consider using v3 nuget feed via `NuGet.galleryV3`." >]
658- let galleryV1 = " http://go.microsoft.com/fwlink/?LinkID=206669"
659- let galleryV2 = " https://www.nuget.org/api/v2/"
660670let galleryV3 = " https://api.nuget.org/v3/index.json"
661671
662672// TODO: Note that this is stolen from paket code. We might want to move that into a shared FAKE library..., see https://github.com/fsprojects/Paket/blob/06ef22ba79896cd9f2a2e2eefccde08b09ab7656/src/Paket.Core/Utils.fs
663673#if NETSTANDARD
664674open System.Net .Http
665- open System. Collections . Generic
675+ open Newtonsoft. Json . Linq
666676type WebClient = HttpClient
667677type HttpClient with
668678 member x.DownloadFileTaskAsync ( uri : Uri , filePath : string ) =
@@ -729,6 +739,7 @@ let internal addHeader (client:HttpClient) (headerKey:string) (headerVal:string)
729739 client.DefaultRequestHeaders.Add( headerKey, headerVal)
730740#else
731741
742+ open Newtonsoft.Json .Linq
732743open System.Net
733744type WebClient with
734745 member x.UploadFileAsMultipart ( url : Uri ) filename =
@@ -766,58 +777,57 @@ let private webClient = new WebClient()
766777
767778/// [omit]
768779let discoverRepoUrl =
769- lazy ( let resp = webClient.DownloadString( galleryV1)
770- let doc = Xml.createDoc resp
771- doc.[ " service" ]. GetAttribute( " xml:base" ))
780+ lazy ( let resp = webClient.DownloadString( galleryV3)
781+ let json = JObject.Parse resp
782+ let nugetSearchResource =
783+ ( json.Item( " resources" ) :?> JArray)
784+ |> Seq.find( fun resource -> resource.Item( " @type" ) .ToString() = " SearchQueryService" )
785+ :?> JObject
786+ nugetSearchResource.Item( " @id" ) .ToString())
772787
773788/// [omit]
774789let getRepoUrl () = discoverRepoUrl.Force()
775790
776791/// [omit]
777- let extractFeedPackageFromXml ( entry : Xml.XmlNode ) =
778- let properties = entry.[ " m:properties" ]
779- let property name =
780- let p = properties.[ " d:" + name]
781- if p = null || p.IsEmpty then " " else p.InnerText
782- let boolProperty name = ( property name) .ToLower() = " true"
783- let author = entry.[ " author" ]. InnerText
784- let dateTimeProperty name = DateTime.Parse( property name)
785- { Id = entry.[ " title" ]. InnerText
786- Version = property " Version"
787- Description = property " Description"
788- IsLatestVersion = boolProperty " IsLatestVersion"
789- Authors = author
790- Owners = author
791- Language = property " Language"
792- Tags = property " Tags"
793- ReleaseNotes = property " ReleaseNotes"
794- ProjectUrl = property " ProjectUrl"
795- LicenseUrl = property " LicenseUrl"
796- RequireLicenseAcceptance = boolProperty " RequireLicenseAcceptance"
797- PackageHash = property " PackageHash"
798- PackageHashAlgorithm = property " PackageHashAlgorithm"
799- Created = dateTimeProperty " Created"
800- Published = dateTimeProperty " Published"
801- Url = entry.[ " content" ]. GetAttribute( " src" ) }
792+ let extractFeedPackageFromJson ( data : JObject ) isLatestVersion =
793+ { Id = data.[ " id" ]. ToString()
794+ Version = data.[ " version" ]. ToString()
795+ Description = data.[ " description" ]. ToString()
796+ Summary = data.[ " summary" ]. ToString()
797+ IsLatestVersion = isLatestVersion
798+ Authors = String.Join( " ," , data.[ " authors" ] :?> JArray )
799+ Owners = String.Join( " ," , data.[ " authors" ] :?> JArray )
800+ Tags = String.Join( " ," , data.[ " tags" ] :?> JArray )
801+ ProjectUrl = data.[ " projectUrl" ]. ToString()
802+ LicenseUrl = data.[ " licenseUrl" ]. ToString()
803+ Title = data.[ " title" ]. ToString()
804+ }
802805
803- /// [omit]
804- let getPackage ( repoUrl : string ) packageName version =
805- let url : string = repoUrl.TrimEnd( '/' ) + " /Packages(Id='" + packageName + " ',Version='" + version + " ')"
806+ let getPackage ( repoUrl : string ) ( packageName : string ) ( version : string ) =
807+ let url : string = repoUrl.TrimEnd( '/' ) + " ?q=title:" + packageName + " &take=1"
806808 let resp = webClient.DownloadString( url)
807- let doc = Xml.createDoc resp
808- extractFeedPackageFromXml doc.[ " entry" ]
809+ let json = JObject.Parse resp
810+ let data = ( json.[ " data" ] :?> JArray).[ 0 ] :?> JObject
811+ let packageVersions = ( data.[ " versions" ] :?> JArray) .ToObject< List< JObject>>()
812+ let versionExists =
813+ packageVersions
814+ |> List.exists( fun listedVersion -> listedVersion.[ " version" ]. ToString() = version)
815+
816+ if not versionExists then
817+ failwithf " Requested %s for package %s is not registered on NuGet" version packageName
818+
819+ let isLatest = ( data.[ " version" ]. ToString() = version)
820+ // set the requested version instead of latest.
821+ data.[ " version" ] <- JValue version
822+ extractFeedPackageFromJson data isLatest
809823
810- /// [omit]
811- let getFeedPackagesFromUrl ( url : string ) =
812- let resp = webClient.DownloadString( url)
813- let doc = Xml.createDoc resp
814- [ for entry in doc.[ " feed" ]. GetElementsByTagName( " entry" ) -> extractFeedPackageFromXml entry ]
815824
816- /// [omit]
817825let getLatestPackage ( repoUrl : string ) packageName =
818- repoUrl.TrimEnd( '/' ) + " /Packages()?$filter=(Id%20e q%20'" + packageName + " ')%20a nd%20IsLatestVersion"
819- |> getFeedPackagesFromUrl
820- |> Seq.head
826+ let url : string = repoUrl.TrimEnd( '/' ) + " ?q=title:" + packageName + " &take=1"
827+ let resp = webClient.DownloadString( url)
828+ let json = JObject.Parse resp
829+ let data = ( json.[ " data" ] :?> JArray).[ 0 ] :?> JObject
830+ extractFeedPackageFromJson data true
821831
822832/// [omit]
823833let downloadPackage targetDir ( package : NuSpecPackage ) =
0 commit comments