Merge branch 'spm'
This commit is contained in:
commit
56971cca28
|
@ -66,3 +66,5 @@ fastlane/Preview.html
|
||||||
fastlane/screenshots
|
fastlane/screenshots
|
||||||
fastlane/test_output
|
fastlane/test_output
|
||||||
xcuserdata
|
xcuserdata
|
||||||
|
.DS_Store
|
||||||
|
Sources/.DS_Store
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
// swift-tools-version:5.0
|
||||||
|
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "XcodeReleases",
|
||||||
|
platforms: [
|
||||||
|
.macOS(.v10_14),
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
// Products define the executables and libraries produced by a package, and make them visible to other packages.
|
||||||
|
.library(name: "XcodeReleases", targets: ["XcodeReleases"]),
|
||||||
|
.executable(name: "json-export", targets: ["json-export"]),
|
||||||
|
.executable(name: "xccheck", targets: ["xccheck"])
|
||||||
|
],
|
||||||
|
dependencies: [
|
||||||
|
// Dependencies declare other packages that this package depends on.
|
||||||
|
// .package(url: /* package url */, from: "1.0.0"),
|
||||||
|
],
|
||||||
|
targets: [
|
||||||
|
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
|
||||||
|
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
|
||||||
|
.target(name: "XcodeReleases", dependencies: []),
|
||||||
|
.target(name: "json-export", dependencies: ["XcodeReleases"]),
|
||||||
|
.target(name: "xccheck", dependencies: ["XcodeReleases"])
|
||||||
|
]
|
||||||
|
)
|
|
@ -1,2 +1,3 @@
|
||||||
# data
|
# XcodeReleases
|
||||||
The data generator that powers xcodereleases.com
|
|
||||||
|
The data and generator that powers xcodereleases.com
|
||||||
|
|
Binary file not shown.
|
@ -8,14 +8,14 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct Compilers: Codable {
|
public struct Compilers: Codable {
|
||||||
let gcc: Array<Version>?
|
public let gcc: Array<Version>?
|
||||||
let llvm_gcc: Array<Version>?
|
public let llvm_gcc: Array<Version>?
|
||||||
let llvm: Array<Version>?
|
public let llvm: Array<Version>?
|
||||||
let clang: Array<Version>?
|
public let clang: Array<Version>?
|
||||||
let swift: Array<Version>?
|
public let swift: Array<Version>?
|
||||||
|
|
||||||
init(gcc: Version? = nil, llvm_gcc: Version? = nil, llvm: Version? = nil, clang: Version? = nil, swift: Version? = nil) {
|
public init(gcc: Version? = nil, llvm_gcc: Version? = nil, llvm: Version? = nil, clang: Version? = nil, swift: Version? = nil) {
|
||||||
self.gcc = gcc.map { [$0] }
|
self.gcc = gcc.map { [$0] }
|
||||||
self.llvm_gcc = llvm_gcc.map { [$0] }
|
self.llvm_gcc = llvm_gcc.map { [$0] }
|
||||||
self.llvm = llvm.map { [$0] }
|
self.llvm = llvm.map { [$0] }
|
||||||
|
@ -23,7 +23,7 @@ struct Compilers: Codable {
|
||||||
self.swift = swift.map { [$0] }
|
self.swift = swift.map { [$0] }
|
||||||
}
|
}
|
||||||
|
|
||||||
init(gcc: Array<Version>?, llvm_gcc: Array<Version>?, llvm: Array<Version>?, clang: Array<Version>?, swift: Array<Version>?) {
|
public init(gcc: Array<Version>?, llvm_gcc: Array<Version>?, llvm: Array<Version>?, clang: Array<Version>?, swift: Array<Version>?) {
|
||||||
self.gcc = gcc?.isEmpty == true ? nil : gcc
|
self.gcc = gcc?.isEmpty == true ? nil : gcc
|
||||||
self.llvm_gcc = llvm_gcc?.isEmpty == true ? nil : llvm_gcc
|
self.llvm_gcc = llvm_gcc?.isEmpty == true ? nil : llvm_gcc
|
||||||
self.llvm = llvm?.isEmpty == true ? nil : llvm
|
self.llvm = llvm?.isEmpty == true ? nil : llvm
|
|
@ -8,21 +8,21 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct Link: Codable {
|
public struct Link: Codable {
|
||||||
let url: URL
|
public let url: URL
|
||||||
let sizeMB: Int?
|
public let sizeMB: Int?
|
||||||
|
|
||||||
init(_ string: String, _ size: Int? = nil) {
|
public init(_ string: String, _ size: Int? = nil) {
|
||||||
self.url = URL(string: string)!
|
self.url = URL(string: string)!
|
||||||
self.sizeMB = size
|
self.sizeMB = size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Links: Codable {
|
public struct Links: Codable {
|
||||||
let download: Link?
|
public let download: Link?
|
||||||
let notes: Link?
|
public let notes: Link?
|
||||||
|
|
||||||
init(download: Link? = nil, notes: Link? = nil) {
|
public init(download: Link? = nil, notes: Link? = nil) {
|
||||||
self.download = download
|
self.download = download
|
||||||
self.notes = notes
|
self.notes = notes
|
||||||
}
|
}
|
|
@ -8,13 +8,13 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum Release: Codable {
|
public enum Release: Codable {
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey {
|
public enum CodingKeys: String, CodingKey {
|
||||||
case gm, gmSeed, beta, dp
|
case gm, gmSeed, beta, dp
|
||||||
}
|
}
|
||||||
|
|
||||||
var isGM: Bool {
|
public var isGM: Bool {
|
||||||
guard case .gm = self else { return false }
|
guard case .gm = self else { return false }
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ enum Release: Codable {
|
||||||
case beta(Int)
|
case beta(Int)
|
||||||
case dp(Int)
|
case dp(Int)
|
||||||
|
|
||||||
init(from decoder: Decoder) throws {
|
public init(from decoder: Decoder) throws {
|
||||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
if let _ = try container.decodeIfPresent(Bool.self, forKey: .gm) {
|
if let _ = try container.decodeIfPresent(Bool.self, forKey: .gm) {
|
||||||
self = .gm
|
self = .gm
|
||||||
|
@ -39,7 +39,7 @@ enum Release: Codable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func encode(to encoder: Encoder) throws {
|
public func encode(to encoder: Encoder) throws {
|
||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
switch self {
|
switch self {
|
||||||
case .gm: try container.encode(true, forKey: .gm)
|
case .gm: try container.encode(true, forKey: .gm)
|
|
@ -8,41 +8,41 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct SDKs: Codable {
|
public struct SDKs: Codable {
|
||||||
let macOS: Array<Version>?
|
public let macOS: Array<Version>?
|
||||||
let iOS: Array<Version>?
|
public let iOS: Array<Version>?
|
||||||
let watchOS: Array<Version>?
|
public let watchOS: Array<Version>?
|
||||||
let tvOS: Array<Version>?
|
public let tvOS: Array<Version>?
|
||||||
|
|
||||||
init(macOS: Version? = nil, iOS: Version? = nil, watchOS: Version? = nil, tvOS: Version? = nil) {
|
public init(macOS: Version? = nil, iOS: Version? = nil, watchOS: Version? = nil, tvOS: Version? = nil) {
|
||||||
self.macOS = macOS.map { [$0] }
|
self.macOS = macOS.map { [$0] }
|
||||||
self.iOS = iOS.map { [$0] }
|
self.iOS = iOS.map { [$0] }
|
||||||
self.watchOS = watchOS.map { [$0] }
|
self.watchOS = watchOS.map { [$0] }
|
||||||
self.tvOS = tvOS.map { [$0] }
|
self.tvOS = tvOS.map { [$0] }
|
||||||
}
|
}
|
||||||
|
|
||||||
init(macOS: Array<Version>?, iOS: Version? = nil, watchOS: Version? = nil, tvOS: Version? = nil) {
|
public init(macOS: Array<Version>?, iOS: Version? = nil, watchOS: Version? = nil, tvOS: Version? = nil) {
|
||||||
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
||||||
self.iOS = iOS.map { [$0] }
|
self.iOS = iOS.map { [$0] }
|
||||||
self.watchOS = watchOS.map { [$0] }
|
self.watchOS = watchOS.map { [$0] }
|
||||||
self.tvOS = tvOS.map { [$0] }
|
self.tvOS = tvOS.map { [$0] }
|
||||||
}
|
}
|
||||||
|
|
||||||
init(macOS: Array<Version>?, iOS: Array<Version>?, watchOS: Version? = nil, tvOS: Version? = nil) {
|
public init(macOS: Array<Version>?, iOS: Array<Version>?, watchOS: Version? = nil, tvOS: Version? = nil) {
|
||||||
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
||||||
self.iOS = iOS?.isEmpty == true ? nil : iOS
|
self.iOS = iOS?.isEmpty == true ? nil : iOS
|
||||||
self.watchOS = watchOS.map { [$0] }
|
self.watchOS = watchOS.map { [$0] }
|
||||||
self.tvOS = tvOS.map { [$0] }
|
self.tvOS = tvOS.map { [$0] }
|
||||||
}
|
}
|
||||||
|
|
||||||
init(macOS: Array<Version>?, iOS: Array<Version>?, watchOS: Array<Version>?, tvOS: Version? = nil) {
|
public init(macOS: Array<Version>?, iOS: Array<Version>?, watchOS: Array<Version>?, tvOS: Version? = nil) {
|
||||||
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
||||||
self.iOS = iOS?.isEmpty == true ? nil : iOS
|
self.iOS = iOS?.isEmpty == true ? nil : iOS
|
||||||
self.watchOS = watchOS?.isEmpty == true ? nil : watchOS
|
self.watchOS = watchOS?.isEmpty == true ? nil : watchOS
|
||||||
self.tvOS = tvOS.map { [$0] }
|
self.tvOS = tvOS.map { [$0] }
|
||||||
}
|
}
|
||||||
|
|
||||||
init(macOS: Array<Version>?, iOS: Array<Version>?, watchOS: Array<Version>?, tvOS: Array<Version>?) {
|
public init(macOS: Array<Version>?, iOS: Array<Version>?, watchOS: Array<Version>?, tvOS: Array<Version>?) {
|
||||||
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
self.macOS = macOS?.isEmpty == true ? nil : macOS
|
||||||
self.iOS = iOS?.isEmpty == true ? nil : iOS
|
self.iOS = iOS?.isEmpty == true ? nil : iOS
|
||||||
self.watchOS = watchOS?.isEmpty == true ? nil : watchOS
|
self.watchOS = watchOS?.isEmpty == true ? nil : watchOS
|
|
@ -8,13 +8,13 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
typealias V = Version
|
internal typealias V = Version
|
||||||
struct Version: Codable {
|
public struct Version: Codable {
|
||||||
let number: String?
|
public let number: String?
|
||||||
let build: String
|
public let build: String
|
||||||
let release: Release
|
public let release: Release
|
||||||
|
|
||||||
init(_ build: String, _ number: String? = nil, _ release: Release = .gm) {
|
public init(_ build: String, _ number: String? = nil, _ release: Release = .gm) {
|
||||||
self.number = number; self.build = build; self.release = release
|
self.number = number; self.build = build; self.release = release
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
//
|
||||||
|
// Xcode.swift
|
||||||
|
// xcodereleases
|
||||||
|
//
|
||||||
|
// Created by Xcode Releases on 4/3/18.
|
||||||
|
// Copyright © 2018 Xcode Releases. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public struct Xcode: Codable {
|
||||||
|
public let name: String
|
||||||
|
public let version: Version
|
||||||
|
public let date: YMD
|
||||||
|
public let requires: String
|
||||||
|
public let sdks: SDKs?
|
||||||
|
public let compilers: Compilers?
|
||||||
|
public let links: Links?
|
||||||
|
|
||||||
|
public init(name: String = "Xcode", version: Version, date: (Int, Int, Int), requires: String, sdks: SDKs? = nil, compilers: Compilers? = nil, links: Links? = nil) {
|
||||||
|
self.name = name
|
||||||
|
self.version = version;
|
||||||
|
self.date = YMD(date);
|
||||||
|
self.requires = requires;
|
||||||
|
self.sdks = sdks;
|
||||||
|
self.compilers = compilers
|
||||||
|
self.links = links
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,16 +8,16 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct YMD: Codable {
|
public struct YMD: Codable {
|
||||||
let year: Int
|
public let year: Int
|
||||||
let month: Int
|
public let month: Int
|
||||||
let day: Int
|
public let day: Int
|
||||||
|
|
||||||
init(_ ymd: (Int, Int, Int)) {
|
public init(_ ymd: (Int, Int, Int)) {
|
||||||
self.year = ymd.0; self.month = ymd.1; self.day = ymd.2
|
self.year = ymd.0; self.month = ymd.1; self.day = ymd.2
|
||||||
}
|
}
|
||||||
|
|
||||||
init(_ year: Int, _ month: Int, _ day: Int) {
|
public init(_ year: Int, _ month: Int, _ day: Int) {
|
||||||
self.year = year; self.month = month; self.day = day
|
self.year = year; self.month = month; self.day = day
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
extension Xcode {
|
||||||
|
|
||||||
|
public static var allVersions: Array<Xcode> {
|
||||||
|
return xcodes11 + xcodes10 + xcodes9 + xcodes8 + xcodes7 + xcodes6 + xcodes5 + xcodes4 + xcodes3 + xcodes2 + xcodes1
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
//
|
||||||
|
// main.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Xcode Releases on 9/11/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import XcodeReleases
|
||||||
|
|
||||||
|
let encoder = JSONEncoder()
|
||||||
|
|
||||||
|
if CommandLine.arguments.contains("--pretty") {
|
||||||
|
encoder.outputFormatting = .prettyPrinted
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
let data = try encoder.encode(Xcode.allVersions)
|
||||||
|
var s = String(data: data, encoding: .utf8) ?? "[]"
|
||||||
|
s = s.replacingOccurrences(of: "\\/", with: "/")
|
||||||
|
print("\(s)")
|
||||||
|
} catch let e {
|
||||||
|
fatalError("\(e)")
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
//
|
||||||
|
// Page.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Xcode Releases on 9/13/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct Page {
|
||||||
|
|
||||||
|
let url: URL
|
||||||
|
let document: XMLDocument
|
||||||
|
|
||||||
|
func xpath(_ xpath: String) -> Array<XMLNode> {
|
||||||
|
let results = try? document.nodes(forXPath: xpath)
|
||||||
|
return results ?? []
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Xcode Releases on 9/11/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import WebKit
|
||||||
|
|
||||||
|
let searchAllFrames = """
|
||||||
|
function x_look(str, where) {
|
||||||
|
var result = doc.evaluate(xpath, context || doc, null, XPathResult.ANY_TYPE, null);
|
||||||
|
}
|
||||||
|
function x(str) {
|
||||||
|
console.log("looking in document");
|
||||||
|
var result = $x(str, null);
|
||||||
|
if (result === null) {
|
||||||
|
var frames = document.getElementsByTagName("iframe");
|
||||||
|
for (var i = 0; i < frames.length; i++) {
|
||||||
|
console.log("looking in frame " + i);
|
||||||
|
result = $x(str, frames[i].contentDocument);
|
||||||
|
if (result !== null) { break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
function xpath(xpath, context) {
|
||||||
|
var doc = (context && context.ownerDocument) || document;
|
||||||
|
var result = doc.evaluate(xpath, context || doc, null, XPathResult.ANY_TYPE, null);
|
||||||
|
switch (result.resultType) {
|
||||||
|
case XPathResult.NUMBER_TYPE:
|
||||||
|
return result.numberValue;
|
||||||
|
case XPathResult.STRING_TYPE:
|
||||||
|
return result.stringValue;
|
||||||
|
case XPathResult.BOOLEAN_TYPE:
|
||||||
|
return result.booleanValue;
|
||||||
|
default:
|
||||||
|
var nodes = [];
|
||||||
|
var node;
|
||||||
|
while (node = result.iterateNext())
|
||||||
|
nodes.push(node);
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Scraper: NSObject, WKNavigationDelegate, WKUIDelegate {
|
||||||
|
|
||||||
|
private let config = WKWebViewConfiguration()
|
||||||
|
private let webView: WKWebView
|
||||||
|
|
||||||
|
private var _currentStep: Step?
|
||||||
|
private var _currentPage: Page?
|
||||||
|
private let stepQueue = DispatchQueue(label: "StepQueue")
|
||||||
|
|
||||||
|
private var loadCompletions = Dictionary<WKNavigation, (Page?) -> Void>()
|
||||||
|
|
||||||
|
override init() {
|
||||||
|
webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 320, height: 2048), configuration: config)
|
||||||
|
|
||||||
|
super.init()
|
||||||
|
webView.navigationDelegate = self
|
||||||
|
webView.uiDelegate = self
|
||||||
|
}
|
||||||
|
|
||||||
|
func run() {
|
||||||
|
guard _currentStep == nil else { return }
|
||||||
|
move(to: LoadDownloadsPage(context: self))
|
||||||
|
}
|
||||||
|
|
||||||
|
func load(page: String, completion: @escaping (Page?) -> Void) {
|
||||||
|
guard let u = URL(string: page) else { return }
|
||||||
|
let r = URLRequest(url: u)
|
||||||
|
if let nav = webView.load(r) {
|
||||||
|
loadCompletions[nav] = completion
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.async { completion(nil) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func currentPage() -> Page? {
|
||||||
|
return _currentPage
|
||||||
|
}
|
||||||
|
|
||||||
|
func move(to step: Step) {
|
||||||
|
stepQueue.sync {
|
||||||
|
_currentStep?.end()
|
||||||
|
_currentStep = step
|
||||||
|
_currentStep?.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
|
||||||
|
|
||||||
|
print("deciding policy for \(navigationAction)")
|
||||||
|
print("source: \(navigationAction.sourceFrame)")
|
||||||
|
print("target: \(navigationAction.targetFrame)")
|
||||||
|
|
||||||
|
decisionHandler(.allow)
|
||||||
|
}
|
||||||
|
|
||||||
|
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
|
||||||
|
webView.evaluateJavaScript(searchAllFrames, completionHandler: nil)
|
||||||
|
let url = webView.url
|
||||||
|
stepQueue.async {
|
||||||
|
self._currentPage = self.constructCurrentPage()
|
||||||
|
self.loadCompletions.removeValue(forKey: navigation)?(self._currentPage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func executeJS(_ js: String) -> Any? {
|
||||||
|
dispatchPrecondition(condition: .onQueue(stepQueue))
|
||||||
|
let g = DispatchGroup(); g.enter()
|
||||||
|
var result: Any?
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.webView.evaluateJavaScript(js, completionHandler: { (r, e) in
|
||||||
|
result = r
|
||||||
|
g.leave()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
g.wait()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
private func constructCurrentPage() -> Page? {
|
||||||
|
guard let html = executeJS("document.documentElement.outerHTML") as? String else { return nil }
|
||||||
|
guard let doc = try? XMLDocument(data: Data(html.utf8), options: [.documentTidyHTML]) else { return nil }
|
||||||
|
let frameNodes = (try? doc.nodes(forXPath: "//iframe")) ?? []
|
||||||
|
let frames = frameNodes.compactMap { constructPageForFrame($0) }
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func constructPageForFrame(_ frame: XMLNode) -> Page? {
|
||||||
|
guard let xp = frame.xPath else { return nil }
|
||||||
|
|
||||||
|
let output = executeJS("xpath(\"\(xp)\").contentDocument.outerHTML")
|
||||||
|
|
||||||
|
print(output)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
//
|
||||||
|
// Step.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Xcode Releases on 9/11/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import WebKit
|
||||||
|
|
||||||
|
class Step: NSObject, WKNavigationDelegate {
|
||||||
|
|
||||||
|
let context: Scraper
|
||||||
|
|
||||||
|
init(context: Scraper) {
|
||||||
|
self.context = context
|
||||||
|
}
|
||||||
|
|
||||||
|
func start() { }
|
||||||
|
func end() { }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadDownloadsPage: Step {
|
||||||
|
|
||||||
|
override func start() {
|
||||||
|
context.load(page: "https://developer.apple.com/download") { page in
|
||||||
|
guard let p = page else { return }
|
||||||
|
if p.url.host == "idmsa.apple.com" {
|
||||||
|
print("login")
|
||||||
|
}
|
||||||
|
print("\(p.url.absoluteString)")
|
||||||
|
|
||||||
|
let nodes = p.xpath(".//iframe")
|
||||||
|
print("Found: \(nodes)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
//
|
||||||
|
// main.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Xcode Releases on 9/11/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import WebKit
|
||||||
|
import AppKit
|
||||||
|
|
||||||
|
class XCCheckDelegate: NSObject, NSApplicationDelegate {
|
||||||
|
|
||||||
|
var lastPrintedString: String?
|
||||||
|
let scraper = Scraper()
|
||||||
|
|
||||||
|
func applicationDidFinishLaunching(_ notification: Notification) {
|
||||||
|
scraper.run()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var delegate: XCCheckDelegate? = XCCheckDelegate()
|
||||||
|
NSApplication.shared.delegate = delegate
|
||||||
|
NSApplication.shared.run()
|
||||||
|
delegate = nil
|
|
@ -1,379 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 50;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
552FE3A62074412700AF684D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3A52074412700AF684D /* main.swift */; };
|
|
||||||
552FE3AD2074412D00AF684D /* Xcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3AC2074412D00AF684D /* Xcode.swift */; };
|
|
||||||
552FE3B42075419300AF684D /* Xcode1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3B32075419300AF684D /* Xcode1.swift */; };
|
|
||||||
552FE3B6207545EE00AF684D /* Xcode2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3B5207545EE00AF684D /* Xcode2.swift */; };
|
|
||||||
552FE3B82075461100AF684D /* Xcode3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3B72075461100AF684D /* Xcode3.swift */; };
|
|
||||||
552FE3BA2075465000AF684D /* Xcode4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3B92075465000AF684D /* Xcode4.swift */; };
|
|
||||||
552FE3BC2075467D00AF684D /* Xcode5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3BB2075467D00AF684D /* Xcode5.swift */; };
|
|
||||||
552FE3BE207546AA00AF684D /* Xcode6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3BD207546AA00AF684D /* Xcode6.swift */; };
|
|
||||||
552FE3C0207546D200AF684D /* Xcode7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3BF207546D200AF684D /* Xcode7.swift */; };
|
|
||||||
552FE3C22075470000AF684D /* Xcode8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3C12075470000AF684D /* Xcode8.swift */; };
|
|
||||||
552FE3C42075472200AF684D /* Xcode9.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3C32075472200AF684D /* Xcode9.swift */; };
|
|
||||||
552FE3C8207550B100AF684D /* Compilers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3C7207550B100AF684D /* Compilers.swift */; };
|
|
||||||
552FE3CA207550C900AF684D /* Release.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3C9207550C900AF684D /* Release.swift */; };
|
|
||||||
552FE3CC207550D300AF684D /* Version.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3CB207550D300AF684D /* Version.swift */; };
|
|
||||||
552FE3CE207550E300AF684D /* SDKs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3CD207550E300AF684D /* SDKs.swift */; };
|
|
||||||
552FE3D02075510700AF684D /* YMD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3CF2075510700AF684D /* YMD.swift */; };
|
|
||||||
552FE3EC2076790600AF684D /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552FE3EB2076790600AF684D /* Link.swift */; };
|
|
||||||
556CC3E422A5B5750070A144 /* Xcode11.swift in Sources */ = {isa = PBXBuildFile; fileRef = 556CC3E322A5B5750070A144 /* Xcode11.swift */; };
|
|
||||||
55F3756C20BE0EBD00E7D742 /* Xcode10.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55F3756B20BE0EBD00E7D742 /* Xcode10.swift */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
|
||||||
552FE3A02074412700AF684D /* CopyFiles */ = {
|
|
||||||
isa = PBXCopyFilesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
dstPath = /usr/share/man/man1/;
|
|
||||||
dstSubfolderSpec = 0;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 1;
|
|
||||||
};
|
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
552FE3A22074412700AF684D /* xcodereleases */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xcodereleases; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
552FE3A52074412700AF684D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3AC2074412D00AF684D /* Xcode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3B32075419300AF684D /* Xcode1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode1.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3B5207545EE00AF684D /* Xcode2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode2.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3B72075461100AF684D /* Xcode3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode3.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3B92075465000AF684D /* Xcode4.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode4.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3BB2075467D00AF684D /* Xcode5.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode5.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3BD207546AA00AF684D /* Xcode6.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode6.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3BF207546D200AF684D /* Xcode7.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode7.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3C12075470000AF684D /* Xcode8.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode8.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3C32075472200AF684D /* Xcode9.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode9.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3C7207550B100AF684D /* Compilers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Compilers.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3C9207550C900AF684D /* Release.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Release.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3CB207550D300AF684D /* Version.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Version.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3CD207550E300AF684D /* SDKs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKs.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3CF2075510700AF684D /* YMD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YMD.swift; sourceTree = "<group>"; };
|
|
||||||
552FE3EB2076790600AF684D /* Link.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = "<group>"; };
|
|
||||||
556CC3E322A5B5750070A144 /* Xcode11.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode11.swift; sourceTree = "<group>"; };
|
|
||||||
55F3756B20BE0EBD00E7D742 /* Xcode10.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode10.swift; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
552FE39F2074412700AF684D /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
552FE3992074412700AF684D = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
552FE3A42074412700AF684D /* xcodereleases */,
|
|
||||||
552FE3A32074412700AF684D /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
552FE3A32074412700AF684D /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
552FE3A22074412700AF684D /* xcodereleases */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
552FE3A42074412700AF684D /* xcodereleases */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
552FE3A52074412700AF684D /* main.swift */,
|
|
||||||
552FE3C62075509800AF684D /* Model */,
|
|
||||||
552FE3C52075476E00AF684D /* Data */,
|
|
||||||
);
|
|
||||||
path = xcodereleases;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
552FE3C52075476E00AF684D /* Data */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
556CC3E322A5B5750070A144 /* Xcode11.swift */,
|
|
||||||
55F3756B20BE0EBD00E7D742 /* Xcode10.swift */,
|
|
||||||
552FE3C32075472200AF684D /* Xcode9.swift */,
|
|
||||||
552FE3C12075470000AF684D /* Xcode8.swift */,
|
|
||||||
552FE3BF207546D200AF684D /* Xcode7.swift */,
|
|
||||||
552FE3BD207546AA00AF684D /* Xcode6.swift */,
|
|
||||||
552FE3BB2075467D00AF684D /* Xcode5.swift */,
|
|
||||||
552FE3B92075465000AF684D /* Xcode4.swift */,
|
|
||||||
552FE3B72075461100AF684D /* Xcode3.swift */,
|
|
||||||
552FE3B5207545EE00AF684D /* Xcode2.swift */,
|
|
||||||
552FE3B32075419300AF684D /* Xcode1.swift */,
|
|
||||||
);
|
|
||||||
path = Data;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
552FE3C62075509800AF684D /* Model */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
552FE3AC2074412D00AF684D /* Xcode.swift */,
|
|
||||||
552FE3C7207550B100AF684D /* Compilers.swift */,
|
|
||||||
552FE3C9207550C900AF684D /* Release.swift */,
|
|
||||||
552FE3CB207550D300AF684D /* Version.swift */,
|
|
||||||
552FE3CD207550E300AF684D /* SDKs.swift */,
|
|
||||||
552FE3CF2075510700AF684D /* YMD.swift */,
|
|
||||||
552FE3EB2076790600AF684D /* Link.swift */,
|
|
||||||
);
|
|
||||||
path = Model;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
552FE3A12074412700AF684D /* xcodereleases */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 552FE3A92074412700AF684D /* Build configuration list for PBXNativeTarget "xcodereleases" */;
|
|
||||||
buildPhases = (
|
|
||||||
552FE39E2074412700AF684D /* Sources */,
|
|
||||||
552FE39F2074412700AF684D /* Frameworks */,
|
|
||||||
552FE3A02074412700AF684D /* CopyFiles */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = xcodereleases;
|
|
||||||
productName = xcodereleases;
|
|
||||||
productReference = 552FE3A22074412700AF684D /* xcodereleases */;
|
|
||||||
productType = "com.apple.product-type.tool";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
552FE39A2074412700AF684D /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastSwiftUpdateCheck = 1020;
|
|
||||||
LastUpgradeCheck = 0930;
|
|
||||||
ORGANIZATIONNAME = "Xcode Releases";
|
|
||||||
TargetAttributes = {
|
|
||||||
552FE3A12074412700AF684D = {
|
|
||||||
CreatedOnToolsVersion = 9.3;
|
|
||||||
};
|
|
||||||
55BA69D9225BAB1000AABBC4 = {
|
|
||||||
CreatedOnToolsVersion = 10.2;
|
|
||||||
LastSwiftMigration = 1020;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = 552FE39D2074412700AF684D /* Build configuration list for PBXProject "xcodereleases" */;
|
|
||||||
compatibilityVersion = "Xcode 9.3";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = 552FE3992074412700AF684D;
|
|
||||||
productRefGroup = 552FE3A32074412700AF684D /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
552FE3A12074412700AF684D /* xcodereleases */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
552FE39E2074412700AF684D /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
552FE3EC2076790600AF684D /* Link.swift in Sources */,
|
|
||||||
552FE3A62074412700AF684D /* main.swift in Sources */,
|
|
||||||
552FE3CC207550D300AF684D /* Version.swift in Sources */,
|
|
||||||
552FE3BE207546AA00AF684D /* Xcode6.swift in Sources */,
|
|
||||||
552FE3AD2074412D00AF684D /* Xcode.swift in Sources */,
|
|
||||||
552FE3C8207550B100AF684D /* Compilers.swift in Sources */,
|
|
||||||
552FE3B42075419300AF684D /* Xcode1.swift in Sources */,
|
|
||||||
552FE3C22075470000AF684D /* Xcode8.swift in Sources */,
|
|
||||||
552FE3BA2075465000AF684D /* Xcode4.swift in Sources */,
|
|
||||||
552FE3B6207545EE00AF684D /* Xcode2.swift in Sources */,
|
|
||||||
55F3756C20BE0EBD00E7D742 /* Xcode10.swift in Sources */,
|
|
||||||
552FE3CE207550E300AF684D /* SDKs.swift in Sources */,
|
|
||||||
552FE3D02075510700AF684D /* YMD.swift in Sources */,
|
|
||||||
556CC3E422A5B5750070A144 /* Xcode11.swift in Sources */,
|
|
||||||
552FE3B82075461100AF684D /* Xcode3.swift in Sources */,
|
|
||||||
552FE3BC2075467D00AF684D /* Xcode5.swift in Sources */,
|
|
||||||
552FE3C0207546D200AF684D /* Xcode7.swift in Sources */,
|
|
||||||
552FE3C42075472200AF684D /* Xcode9.swift in Sources */,
|
|
||||||
552FE3CA207550C900AF684D /* Release.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
552FE3A72074412700AF684D /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
552FE3A82074412700AF684D /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "Mac Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
552FE3AA2074412700AF684D /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
DEVELOPMENT_TEAM = 654LUM7646;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 4.0;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
552FE3AB2074412700AF684D /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
DEVELOPMENT_TEAM = 654LUM7646;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 4.0;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
552FE39D2074412700AF684D /* Build configuration list for PBXProject "xcodereleases" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
552FE3A72074412700AF684D /* Debug */,
|
|
||||||
552FE3A82074412700AF684D /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
552FE3A92074412700AF684D /* Build configuration list for PBXNativeTarget "xcodereleases" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
552FE3AA2074412700AF684D /* Debug */,
|
|
||||||
552FE3AB2074412700AF684D /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = 552FE39A2074412700AF684D /* Project object */;
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:xcodereleases.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,31 +0,0 @@
|
||||||
//
|
|
||||||
// Xcode.swift
|
|
||||||
// xcodereleases
|
|
||||||
//
|
|
||||||
// Created by Xcode Releases on 4/3/18.
|
|
||||||
// Copyright © 2018 Xcode Releases. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
let xcodes: Array<Xcode> = xcodes11 + xcodes10 + xcodes9 + xcodes8 + xcodes7 + xcodes6 + xcodes5 + xcodes4 + xcodes3 + xcodes2 + xcodes1
|
|
||||||
|
|
||||||
struct Xcode: Codable {
|
|
||||||
let name: String
|
|
||||||
let version: Version
|
|
||||||
let date: YMD
|
|
||||||
let requires: String
|
|
||||||
let sdks: SDKs?
|
|
||||||
let compilers: Compilers?
|
|
||||||
let links: Links?
|
|
||||||
|
|
||||||
init(name: String = "Xcode", version: Version, date: (Int, Int, Int), requires: String, sdks: SDKs? = nil, compilers: Compilers? = nil, links: Links? = nil) {
|
|
||||||
self.name = name
|
|
||||||
self.version = version;
|
|
||||||
self.date = YMD(date);
|
|
||||||
self.requires = requires;
|
|
||||||
self.sdks = sdks;
|
|
||||||
self.compilers = compilers
|
|
||||||
self.links = links
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
//
|
|
||||||
// main.swift
|
|
||||||
// xcodereleases
|
|
||||||
//
|
|
||||||
// Created by Xcode Releases on 4/3/18.
|
|
||||||
// Copyright © 2018 Xcode Releases. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
var encoder = JSONEncoder()
|
|
||||||
//encoder.outputFormatting = .prettyPrinted
|
|
||||||
do {
|
|
||||||
let data = try encoder.encode(xcodes)
|
|
||||||
var s = String(data: data, encoding: .utf8) ?? "[]"
|
|
||||||
s = s.replacingOccurrences(of: "\\/", with: "/")
|
|
||||||
print("\(s)")
|
|
||||||
} catch let e {
|
|
||||||
fatalError("\(e)")
|
|
||||||
}
|
|
Loading…
Reference in New Issue