@@ -218,15 +218,35 @@ module LockFileParser =
218218
219219/// Allows to parse and analyze paket.lock files.
220220type LockFile ( fileName : string , options , resolution : PackageResolution , remoteFiles : ResolvedSourceFile list ) =
221- let lowerCaseResolution =
222- resolution
223- |> Map.fold ( fun resolution name p -> Map.add name p resolution) Map.empty
224221
225222 member __.SourceFiles = remoteFiles
226223 member __.ResolvedPackages = resolution
227224 member __.FileName = fileName
228225 member __.Options = options
229226
227+ /// Gets all dependencies of the given package
228+ member this.GetAllDependenciesOf ( package ) =
229+ let usedPackages = HashSet<_>()
230+
231+ let rec addPackage ( packageName : PackageName ) =
232+ let identity = NormalizedPackageName packageName
233+ match resolution.TryFind identity with
234+ | Some package ->
235+ if usedPackages.Add packageName then
236+ if not this.Options.Strict then
237+ for d,_,_ in package.Dependencies do
238+ addPackage d
239+ | None ->
240+ failwithf " Package %O was referenced, but it was not found in the paket.lock file." packageName
241+
242+ addPackage package
243+
244+ usedPackages
245+
246+ /// Checks if the first package is a dependency of the second package
247+ member this.IsDependencyOf ( dependentPackage , package ) =
248+ this.GetAllDependenciesOf( package) .Contains dependentPackage
249+
230250 /// Updates the Lock file with the analyzed dependencies from the paket.dependencies file.
231251 member __.Save () =
232252 let output =
@@ -244,26 +264,22 @@ type LockFile(fileName:string,options,resolution:PackageResolution,remoteFiles:R
244264 lockFile.Save()
245265 lockFile
246266
247- /// Parses a paket.lock file from lines
267+ /// Parses a paket.lock file from file
248268 static member LoadFrom ( lockFileName ) : LockFile =
249- LockFileParser.Parse( File.ReadAllLines lockFileName)
269+ LockFile.Parse( lockFileName, File.ReadAllLines lockFileName)
270+
271+ /// Parses a paket.lock file from lines
272+ static member Parse ( lockFileName , lines ) : LockFile =
273+ LockFileParser.Parse lines
250274 |> fun state -> LockFile( lockFileName, state.Options , state.Packages |> Seq.fold ( fun map p -> Map.add ( NormalizedPackageName p.Name) p map) Map.empty, List.rev state.SourceFiles)
251275
252276 member this.GetPackageHull ( referencesFile : ReferencesFile ) =
253277 let usedPackages = HashSet<_>()
254278
255- let rec addPackage directly ( packageName : PackageName ) =
256- let identity = NormalizedPackageName packageName
257- match lowerCaseResolution.TryFind identity with
258- | Some package ->
259- if usedPackages.Add packageName then
260- if not this.Options.Strict then
261- for d,_,_ in package.Dependencies do
262- addPackage false d
263- | None ->
264- failwithf " %s references package %O , but it was not found in the paket.lock file." referencesFile.FileName packageName
265-
266279 referencesFile.NugetPackages
267- |> List.iter ( addPackage true )
280+ |> List.iter ( fun package ->
281+ try
282+ usedPackages.UnionWith( this.GetAllDependenciesOf( package))
283+ with exn -> failwithf " %s - in %s " exn.Message referencesFile.FileName)
268284
269- usedPackages
285+ usedPackages
0 commit comments