Merge branch 'spm'

This commit is contained in:
xcodereleases 2019-09-30 11:36:03 -06:00
commit 56971cca28
33 changed files with 364 additions and 490 deletions

2
.gitignore vendored
View File

@ -66,3 +66,5 @@ fastlane/Preview.html
fastlane/screenshots fastlane/screenshots
fastlane/test_output fastlane/test_output
xcuserdata xcuserdata
.DS_Store
Sources/.DS_Store

28
Package.swift Normal file
View File

@ -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"])
]
)

View File

@ -1,2 +1,3 @@
# data # XcodeReleases
The data generator that powers xcodereleases.com
The data and generator that powers xcodereleases.com

BIN
Sources/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -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

View File

@ -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
} }

View File

@ -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)

View File

@ -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

View File

@ -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
} }
} }

View File

@ -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
}
}

View File

@ -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
} }
} }

View File

@ -0,0 +1,8 @@
extension Xcode {
public static var allVersions: Array<Xcode> {
return xcodes11 + xcodes10 + xcodes9 + xcodes8 + xcodes7 + xcodes6 + xcodes5 + xcodes4 + xcodes3 + xcodes2 + xcodes1
}
}

View File

@ -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)")
}

View File

@ -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 ?? []
}
}

View File

@ -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
}
}

View File

@ -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)")
}
}
}

View File

@ -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

View File

@ -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 */;
}

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:xcodereleases.xcodeproj">
</FileRef>
</Workspace>

View File

@ -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>

View File

@ -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
}
}

View File

@ -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)")
}