Merge pull request #304 from leon-wolf/feature/281-add-beta-symlink

Adds an option to save beta versions with `-beta` symlink
This commit is contained in:
Matt Kiazyk 2022-11-22 21:33:24 -06:00 committed by GitHub
commit 9a61a94239
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 58 additions and 21 deletions

3
.gitignore vendored
View file

@ -36,6 +36,9 @@ Product/*
timeline.xctimeline
playground.xcworkspace
# Jetbrains IDEA
.idea
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.

View file

@ -610,10 +610,10 @@ class AppState: ObservableObject {
NSPasteboard.general.setString(url.absoluteString, forType: .string)
}
func createSymbolicLink(xcode: Xcode) {
func createSymbolicLink(xcode: Xcode, isBeta: Bool = false) {
guard let installedXcodePath = xcode.installedPath else { return }
let destinationPath: Path = Path.installDirectory/"Xcode.app"
let destinationPath: Path = Path.installDirectory/"Xcode\(isBeta ? "-Beta" : "").app"
// does an Xcode.app file exist?
if FileManager.default.fileExists(atPath: destinationPath.string) {
@ -635,7 +635,7 @@ class AppState: ObservableObject {
do {
try FileManager.default.createSymbolicLink(atPath: destinationPath.string, withDestinationPath: installedXcodePath.string)
Logger.appState.info("Successfully created symbolic link with Xcode.app")
Logger.appState.info("Successfully created symbolic link with Xcode\(isBeta ? "-Beta": "").app")
} catch {
Logger.appState.error("Unable to create symbolic Link")
self.error = error

View file

@ -189,6 +189,23 @@ struct CreateSymbolicLinkButton: View {
}
}
struct CreateSymbolicBetaLinkButton: View {
@EnvironmentObject var appState: AppState
let xcode: Xcode?
var body: some View {
Button(action: createSymbolicBetaLink) {
Text("CreateSymLinkBeta")
}
.help("CreateSymLinkBeta")
}
private func createSymbolicBetaLink() {
guard let xcode = xcode else { return }
appState.createSymbolicLink(xcode: xcode, isBeta: true)
}
}
// MARK: - Commands
struct InstallCommand: View {

View file

@ -6,16 +6,16 @@ struct XcodeListViewRow: View {
let xcode: Xcode
let selected: Bool
let appState: AppState
var body: some View {
HStack {
appIconView(for: xcode)
VStack(alignment: .leading) {
HStack {
Text(verbatim: "\(xcode.description) \(xcode.version.buildMetadataIdentifiersDisplay)")
.font(.body)
if !xcode.identicalBuilds.isEmpty {
Image(systemName: "square.fill.on.square.fill")
.font(.subheadline)
@ -25,7 +25,7 @@ struct XcodeListViewRow: View {
.help("IdenticalBuilds.help")
}
}
if case let .installed(path) = xcode.installState {
Text(verbatim: path.string)
.font(.caption)
@ -35,9 +35,9 @@ struct XcodeListViewRow: View {
.font(.caption)
}
}
Spacer()
selectControl(for: xcode)
.padding(.trailing, 16)
installControl(for: xcode)
@ -54,14 +54,17 @@ struct XcodeListViewRow: View {
RevealButton(xcode: xcode)
CopyPathButton(xcode: xcode)
CreateSymbolicLinkButton(xcode: xcode)
if xcode.version.isPrerelease {
CreateSymbolicBetaLinkButton(xcode: xcode)
}
Divider()
UninstallButton(xcode: xcode)
#if DEBUG
Divider()
Button("Perform post-install steps") {
appState.performPostInstallSteps(for: InstalledXcode(path: path)!) as Void
}
Divider()
Button("Perform post-install steps") {
appState.performPostInstallSteps(for: InstalledXcode(path: path)!) as Void
}
#endif
}
}
@ -77,7 +80,7 @@ struct XcodeListViewRow: View {
.foregroundColor(.secondary)
}
}
@ViewBuilder
private func selectControl(for xcode: Xcode) -> some View {
if xcode.installState.installed {
@ -97,7 +100,7 @@ struct XcodeListViewRow: View {
EmptyView()
}
}
@ViewBuilder
private func installControl(for xcode: Xcode) -> some View {
switch xcode.installState {
@ -129,31 +132,31 @@ struct XcodeListViewRow_Previews: PreviewProvider {
selected: false,
appState: AppState()
)
XcodeListViewRow(
xcode: Xcode(version: Version("12.2.0")!, installState: .notInstalled, selected: false, icon: nil),
selected: false,
appState: AppState()
)
XcodeListViewRow(
xcode: Xcode(version: Version("12.1.0")!, installState: .installing(.downloading(progress: configure(Progress(totalUnitCount: 100)) { $0.completedUnitCount = 40 })), selected: false, icon: nil),
selected: false,
appState: AppState()
)
XcodeListViewRow(
xcode: Xcode(version: Version("12.0.0")!, installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil),
selected: false,
appState: AppState()
)
XcodeListViewRow(
xcode: Xcode(version: Version("12.0.0+1234A")!, installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil),
selected: false,
appState: AppState()
)
XcodeListViewRow(
xcode: Xcode(version: Version("12.0.0+1234A")!, identicalBuilds: [Version("12.0.0-RC+1234A")!], installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil),
selected: false,

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Diese Version öffnen";
"CopyPath" = "Pfad kopieren";
"CreateSymLink" = "Symlink als Xcode.app erstellen";
"CreateSymLinkBeta" = "Symlink als Xcode-Beta.app erstellen";
"Uninstall" = "Deinstallieren";
"Selected" = "Ausgewählt";
"Select" = "Auswählen";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Open this version";
"CopyPath" = "Copy Path";
"CreateSymLink" = "Create Symlink as Xcode.app";
"CreateSymLinkBeta" = "Create Symlink as Xcode-Beta.app";
"Uninstall" = "Uninstall";
"Selected" = "Selected";
"Select" = "Select";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Abrir esta versión";
"CopyPath" = "Copiar Ruta";
"CreateSymLink" = "Crear Symlink como Xcode.app";
"CreateSymLinkBeta" = "Crear Symlink como Xcode-Beta.app";
"Uninstall" = "Desinstalar";
"Selected" = "Seleccionado";
"Select" = "Seleccionar";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Avaa tämä versio";
"CopyPath" = "Kopioi polku";
"CreateSymLink" = "Luo Symlink nimellä Xcode.app";
"CreateSymLinkBeta" = "Luo Symlink nimellä Xcode-Beta.app";
"Uninstall" = "Poista";
"Selected" = "Valittu";
"Select" = "Valitse";

View file

@ -17,6 +17,7 @@
"OpenDescription" = "Ouvrir cette version";
"CopyPath" = "Copier le chemin d'accès";
"CreateSymLink" = "Créer un Symlink pour Xcode.app";
"CreateSymLink" = "Créer un Symlink pour Xcode-Beta.app";
"Uninstall" = "Désinstaller";
"Selected" = "Sélectionné";
"Select" = "Sélectionner";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "इस संस्करण को खोलें";
"CopyPath" = "पथ की कॉपी करे";
"CreateSymLink" = "Xcode.app के रूप में सिमलिंक बनाएं";
"CreateSymLinkBeta" = "Xcode-Beta.app के रूप में सिमलिंक बनाएं";
"Uninstall" = "असंस्थापित करे";
"Selected" = "चयनित";
"Select" = "चयन करे";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Apri questa versione";
"CopyPath" = "Copia Percorso";
"CreateSymLink" = "Crea Symlink come Xcode.app";
"CreateSymLinkBeta" = "Crea Symlink come Xcode-Beta.app";
"Uninstall" = "Disinstalla";
"Selected" = "Selezionato";
"Select" = "Seleziona";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "このバージョンを開く";
"CopyPath" = "パスをコピー";
"CreateSymLink" = "Xcode.appとしてシンボリックリンクを作成";
"CreateSymLinkBeta" = "Xcode-Beta.appとしてシンボリックリンクを作成";
"Uninstall" = "アンインストール";
"Selected" = "アクティブ";
"Select" = "アクティブにする";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "이 버전 열기";
"CopyPath" = "경로 복사하기";
"CreateSymLink" = "Xcode.app과 같은 Symlink 만들기";
"CreateSymLinkBeta" = "Xcode-Beta.app과 같은 Symlink 만들기";
"Uninstall" = "제거";
"Selected" = "선택됨";
"Select" = "선택";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Открыть эту версию";
"CopyPath" = "Копировать путь";
"CreateSymLink" = "Создать символическую ссылку к Xcode.app";
"CreateSymLinkBeta" = "Создать символическую ссылку к Xcode-Beta.app";
"Uninstall" = "Удалить";
"Selected" = "Выбрано";
"Select" = "Выбрать";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Bu sürümü aç";
"CopyPath" = "Yolu Kopyala";
"CreateSymLink" = "Xcode.app olarak sembolik link yarat";
"CreateSymLinkBeta" = "Xcode-Beta.app olarak sembolik link yarat";
"Uninstall" = "Kaldır";
"Selected" = "Seçili";
"Select" = "Seç";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "Запустити цю версію";
"CopyPath" = "Скопіювати шлях";
"CreateSymLink" = "Створити символічну ссилку як Xcode.app";
"CreateSymLinkBeta" = "Створити символічну ссилку як Xcode-Beta.app";
"Uninstall" = "Видалити";
"Selected" = "Обрано";
"Select" = "Обрати";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "打开此版本";
"CopyPath" = "复制文件位置";
"CreateSymLink" = "以Xcode.app创建软链接";
"CreateSymLinkBeta" = "以Xcode-Beta.app创建软链接";
"Uninstall" = "卸载";
"Selected" = "已选定";
"Select" = "选定";

View file

@ -16,6 +16,7 @@
"OpenDescription" = "打開這個版本";
"CopyPath" = "拷貝路徑";
"CreateSymLink" = "製作 Xcode.app 的 Symlink";
"CreateSymLink" = "製作 Xcode-Beta.app 的 Symlink";
"Uninstall" = "解除安裝";
"Selected" = "已選取";
"Select" = "選取";