Skip to content
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Diff now returns all symbols as links.
  • Loading branch information
emilyychenn committed May 21, 2024
commit 098dc89c8a19ebcacbee55595d3a8ab280f4faac
45 changes: 41 additions & 4 deletions Sources/SwiftDocCUtilities/ArgumentParsing/Subcommands/File.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import Foundation
import SwiftDocC

extension Docc.ProcessArchive {

struct DiffDocCArchive: ParsableCommand {

// MARK: - Configuration
Expand Down Expand Up @@ -42,21 +43,48 @@ extension Docc.ProcessArchive {

public mutating func run() throws {

let initialDocCArchiveAPIs: [String] = try findAllSymbols(initialPath: initialDocCArchivePath)
let newDocCArchiveAPIs: [String] = try findAllSymbols(initialPath: newerDocCArchivePath)
// Process arguments to start from the /data/ subdirectory.
// This is where all the relevant renderJSON are contained.
let initialProcessedArchivePath = initialDocCArchivePath.appendingPathComponent("data")
let newerProcessedArchivePath = newerDocCArchivePath.appendingPathComponent("data")

let initialDocCArchiveAPIs: [URL] = try findAllSymbolLinks(initialPath: initialProcessedArchivePath)
let newDocCArchiveAPIs: [URL] = try findAllSymbolLinks(initialPath: newerProcessedArchivePath)

print("\ninitialDocCArchiveAPIs: ")
print(initialDocCArchiveAPIs)

print("\nnewDocCArchiveAPIs: ")
print(newDocCArchiveAPIs)

let initialSet = Set(initialDocCArchiveAPIs.map { $0.plainText })
let newSet = Set(newDocCArchiveAPIs.map { $0.plainText })
let initialSet = Set(initialDocCArchiveAPIs.map { $0 })
let newSet = Set(newDocCArchiveAPIs.map { $0 })
let difference = newSet.subtracting(initialSet)
print("\nDifference:\n\(difference)")
}

// Given a URL, return each of the symbols by their unique identifying links
func findAllSymbolLinks(initialPath: URL) throws -> [URL] {
guard let enumerator = FileManager.default.enumerator(
at: initialPath,
includingPropertiesForKeys: [],
options: .skipsHiddenFiles,
errorHandler: nil
) else {
return []
}

var returnSymbolLinks: [URL] = []
for case let filePath as URL in enumerator {
if filePath.lastPathComponent.hasSuffix(".json") {
let symbolLink = try findSymbolLink(symbolPath: filePath)
returnSymbolLinks.append(symbolLink)
}
}

return returnSymbolLinks
}

func findAllSymbols(initialPath: URL) throws -> [String] {
guard let enumerator = FileManager.default.enumerator(
at: initialPath,
Expand All @@ -76,6 +104,15 @@ extension Docc.ProcessArchive {

return returnSymbols
}

// Given a file path to a renderJSON, return that symbol's url from its identifier.
func findSymbolLink(symbolPath: URL) throws -> URL {
let renderJSONData = try Data(contentsOf: symbolPath)
let decoder = RenderJSONDecoder.makeDecoder()
let renderNode = try decoder.decode(RenderNode.self, from: renderJSONData)

return renderNode.identifier.url
}

}
}