anchor.diff:          )
       })
       |> Async.Parallel
  +
     return
       targetIdentifiers
       |> Seq.collect id
  
positive.code:   do! Files.writeFile receiptPath receipt
  }
  
  let compareReceipt (context : TaskContext) installPath location = async {
    let receiptPath = getReceiptPath installPath
  
    if File.Exists receiptPath
    then
      context.Console.Write("Reading receipt at " + receiptPath, LoggingLevel.Trace)
      let! content = Files.readFile receiptPath
      let maybePackageLocation =
        content
        |> Toml.parse
        |> Result.mapError Toml.TomlError.show
        |> Result.bind PackageLock.fromToml
      match maybePackageLocation with
      | Result.Ok receiptLocation ->
        if receiptLocation = location
        then
          return true
        else
          context.Console.Write("Outdated receipt at " + installPath, LoggingLevel.Trace)
          return false
      | Result.Error error ->
        context.Console.Write(error, LoggingLevel.Debug)
        context.Console.Write("Invalid receipt at " + receiptPath + "; it will be deleted. ", LoggingLevel.Info)
        do! Files.delete receiptPath
        return false
    else
      context.Console.Write("No receipt found for " + installPath, LoggingLevel.Trace)
      return false
  }
  
  let installPackageSources (context : Tasks.TaskContext) (installPath : string) (location : PackageLock) (versions : Set<Version>) = async {
    let log x =
      x
      |> RichOutput.text
      |> context.Console.Write
  
    let logSuccess x =
      x
      |> RichOutput.text
      |> RichOutput.foreground ConsoleColor.Green
      |> context.Console.Write
  
    let downloadManager = context.DownloadManager
    let gitManager = context.GitManager
    let! isSame = compareReceipt context installPath location
    if isSame = false
    then
      log("Installing " + installPath + "... ")
      let installFromGit url revision versions = async {
        let hint =
          versions
  
negative.code:             let! manifest = fetchManifestFromLock lock sourceExplorer d.Package
              return manifest.Targets |> Set.toSeq
            }
  
        return
          targets
          |> Seq.map (fun target ->
  