                                                                message: "Extracting info for \(targets.count) rules")
 
     let semaphore = DispatchSemaphore(value: 0)
-    var artifacts = [String]()
+    var artifacts = Set<String>()
     var processDebugInfo: String? = nil
     let process = bazelAspectProcessForTargets(targets.map({ $0.value }),
                                                aspect: "tulsi_sources_aspect",

        defer { semaphore.signal() }
        processDebugInfo = debugInfo
        if let generatedArtifacts = generatedArtifacts {
          artifacts = generatedArtifacts.filter { $0.hasSuffix(".tulsiinfo") }
        }
    }


  }

  /// Builds a list of RuleEntry instances using the data in the given set of .tulsiinfo files.
  private func extractRuleEntriesFromArtifacts(_ files: Set<String>,
                                               progressNotifier: ProgressNotifier? = nil) -> [BuildLabel: RuleEntry] {
    let fileManager = FileManager.default

