From 4c9665a41b9f2ff898d3e7c92621f8f6d14f399a Mon Sep 17 00:00:00 2001 From: cdricms <36056008+cdricms@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:40:17 +0200 Subject: [PATCH] Update button + some bug fixes --- .gitignore | 2 +- Brewer.xcodeproj/project.pbxproj | 4 ++ Brewer/BrewerApp.swift | 1 + Brewer/Components/UpdateButton.swift | 61 ++++++++++++++++++++++++++++ Brewer/InstalledView.swift | 29 ++----------- Brewer/Model/Homebrew.swift | 40 ++++++++++++++---- 6 files changed, 103 insertions(+), 34 deletions(-) create mode 100644 Brewer/Components/UpdateButton.swift diff --git a/.gitignore b/.gitignore index 2cbab10..bfeaaf8 100644 --- a/.gitignore +++ b/.gitignore @@ -97,4 +97,4 @@ fastlane/test_output # https://github.com/johnno1962/injectionforxcode iOSInjectionProject/ - +.DS_Store diff --git a/Brewer.xcodeproj/project.pbxproj b/Brewer.xcodeproj/project.pbxproj index cc098aa..b196d3c 100644 --- a/Brewer.xcodeproj/project.pbxproj +++ b/Brewer.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 9E6C730C2C3D796D0056ADDC /* DownloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6C730B2C3D796D0056ADDC /* DownloadButton.swift */; }; 9E6C730E2C3DB16F0056ADDC /* UninstallButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6C730D2C3DB16F0056ADDC /* UninstallButton.swift */; }; 9E6C73112C3DB5940056ADDC /* CaskDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6C73102C3DB5940056ADDC /* CaskDetailView.swift */; }; + 9E6C73182C3E853E0056ADDC /* UpdateButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6C73172C3E853E0056ADDC /* UpdateButton.swift */; }; 9E8CE5362C3C545600A39146 /* BrewerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E8CE5352C3C545600A39146 /* BrewerApp.swift */; }; 9E8CE5382C3C545600A39146 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E8CE5372C3C545600A39146 /* ContentView.swift */; }; 9E8CE53A2C3C545700A39146 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9E8CE5392C3C545700A39146 /* Assets.xcassets */; }; @@ -45,6 +46,7 @@ 9E6C730B2C3D796D0056ADDC /* DownloadButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadButton.swift; sourceTree = ""; }; 9E6C730D2C3DB16F0056ADDC /* UninstallButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UninstallButton.swift; sourceTree = ""; }; 9E6C73102C3DB5940056ADDC /* CaskDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaskDetailView.swift; sourceTree = ""; }; + 9E6C73172C3E853E0056ADDC /* UpdateButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateButton.swift; sourceTree = ""; }; 9E8CE5322C3C545600A39146 /* Brewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Brewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9E8CE5352C3C545600A39146 /* BrewerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrewerApp.swift; sourceTree = ""; }; 9E8CE5372C3C545600A39146 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -88,6 +90,7 @@ isa = PBXGroup; children = ( 9E6C730B2C3D796D0056ADDC /* DownloadButton.swift */, + 9E6C73172C3E853E0056ADDC /* UpdateButton.swift */, 9E6C730D2C3DB16F0056ADDC /* UninstallButton.swift */, ); path = Components; @@ -304,6 +307,7 @@ 9E6C73072C3D5E570056ADDC /* SearchView.swift in Sources */, 9E6C730C2C3D796D0056ADDC /* DownloadButton.swift in Sources */, 9E8CE5382C3C545600A39146 /* ContentView.swift in Sources */, + 9E6C73182C3E853E0056ADDC /* UpdateButton.swift in Sources */, 9E6C730E2C3DB16F0056ADDC /* UninstallButton.swift in Sources */, 9E8CE5622C3C5A6A00A39146 /* Homebrew.swift in Sources */, 9E6C73092C3D5E950056ADDC /* InstalledView.swift in Sources */, diff --git a/Brewer/BrewerApp.swift b/Brewer/BrewerApp.swift index 5efbe2c..ebc36b8 100644 --- a/Brewer/BrewerApp.swift +++ b/Brewer/BrewerApp.swift @@ -17,6 +17,7 @@ struct BrewerApp: App { if let number = Int( res.trimmingCharacters(in: .whitespacesAndNewlines)), number > 0 { + print(number) isUpToDate = false } } catch { diff --git a/Brewer/Components/UpdateButton.swift b/Brewer/Components/UpdateButton.swift new file mode 100644 index 0000000..59cf959 --- /dev/null +++ b/Brewer/Components/UpdateButton.swift @@ -0,0 +1,61 @@ +// +// UpdateButton.swift +// Brewer +// +// Created by Cédric MAS on 10/07/2024. +// + +import SwiftUI + +struct UpdateButton: View { + let name: String + @State private var brew = Homebrew() + @State private var newInfo = Homebrew() + + private var updated: String? { + if let cask = newInfo.data?.casks.first(where: { $0.fullToken == name } + ), !cask.outdated { + return cask.version + } + if let formulae = newInfo.data?.formulae.first(where: { + $0.fullName == name + }), !formulae.outdated { + return formulae.versions.stable + } + + return nil + } + + var body: some View { + if let newVersion = updated { + Text("Updated: \(newVersion)") + } else if brew.isLoading { + ProgressView() + .controlSize(.small) + } else if brew.errorMessage != nil { + Image(systemName: "x") + .symbolRenderingMode(.palette) + .symbolVariant(.circle) + .symbolVariant(.fill) + .foregroundStyle(.white, .red) + } else { + Button { + Task { + await brew.update(name) + newInfo.getInfo(on: name) + } + } label: { + Label( + "Update", + systemImage: + "arrow.counterclockwise" + ) + .symbolRenderingMode(.palette) + .symbolVariant(.circle) + .symbolVariant(.fill) + .foregroundStyle( + .white, .orange) + } + } + } +} diff --git a/Brewer/InstalledView.swift b/Brewer/InstalledView.swift index 1784da4..081aa04 100644 --- a/Brewer/InstalledView.swift +++ b/Brewer/InstalledView.swift @@ -26,18 +26,7 @@ struct InstalledView: View { Text(cask.name.first ?? cask.fullToken) Spacer() if cask.outdated { - Button { - - } label: { - Label( - "Update", - systemImage: - "arrow.counterclockwise.circle.fill" - ) - .symbolRenderingMode(.palette) - .foregroundStyle( - .white, .orange) - } + UpdateButton(name: cask.fullToken) } else { Text(cask.version) } @@ -65,17 +54,7 @@ struct InstalledView: View { Text(formulae.fullName) Spacer() if formulae.outdated { - Button { - - } label: { - Label( - "Update", - systemImage: - "arrow.counterclockwise.circle.fill" - ) - .symbolRenderingMode(.palette) - .foregroundStyle(.white, .orange) - } + UpdateButton(name: formulae.fullName) } else { Text(formulae.versions.stable) } @@ -97,8 +76,8 @@ struct InstalledView: View { } .listStyle(.inset(alternatesRowBackgrounds: true)) let areOutdated = - data.casks.map(\.outdated).count - + data.formulae.map(\.outdated).count + data.casks.filter(\.outdated).count + + data.formulae.filter(\.outdated).count let _ = UserDefaults.standard.set( !(areOutdated > 0), forKey: "isUpToDate") if areOutdated > 0 { diff --git a/Brewer/Model/Homebrew.swift b/Brewer/Model/Homebrew.swift index 6131939..0da1b38 100644 --- a/Brewer/Model/Homebrew.swift +++ b/Brewer/Model/Homebrew.swift @@ -41,7 +41,7 @@ struct Cask: Codable { let url: String let version: String let installed: String? - let outdated: Bool + var outdated: Bool enum CodingKeys: String, CodingKey { case token, tap, name, desc, homepage, url, version, installed, outdated @@ -191,7 +191,7 @@ class Homebrew { return switch await task.result { case .success(let success): success - case .failure(let fail): + case .failure: false } } @@ -201,11 +201,9 @@ class Homebrew { self.data = nil let task = Task { [weak self] in do { - let res = - try shell( - "/opt/homebrew/bin/brew uninstall \(fullToken); echo $?" - ) - .trimmingCharacters(in: .whitespacesAndNewlines) + try shell( + "/opt/homebrew/bin/brew uninstall \(fullToken)" + ) } catch { self?.errorMessage = error.localizedDescription } @@ -216,9 +214,35 @@ class Homebrew { return switch await task.result { case .success(let success): success - case .failure(let failure): + case .failure: false } + } + func update(_ name: String) async -> Bool { + self.isLoading = true + self.errorMessage = nil + self.data = nil + let task = Task { [weak self] in + do { + let res = try shell( + "/opt/homebrew/bin/brew upgrade \(name); echo $?" + ) + .trimmingCharacters(in: .whitespacesAndNewlines) + self?.isLoading = false + return res == "0" + } catch { + self?.errorMessage = error.localizedDescription + } + self?.isLoading = false + return false + } + + return switch await task.result { + case .success(let success): + success + case .failure: + false + } } }