From 7d4e23022ecd9aa0d1da5e12748a29fdac2c6daa Mon Sep 17 00:00:00 2001 From: Leonard Thomas Date: Sat, 20 Apr 2019 23:35:06 +0200 Subject: [PATCH] Added outdated + update commands --- .../MintCLI/Commands/OutdatedCommand.swift | 16 +++++ Sources/MintCLI/Commands/UpdateCommand.swift | 16 +++++ Sources/MintCLI/MintCLI.swift | 2 + Sources/MintKit/Mint.swift | 58 ++++++++++++++++++- Tests/MintTests/MintTests.swift | 27 +++++++++ 5 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 Sources/MintCLI/Commands/OutdatedCommand.swift create mode 100644 Sources/MintCLI/Commands/UpdateCommand.swift diff --git a/Sources/MintCLI/Commands/OutdatedCommand.swift b/Sources/MintCLI/Commands/OutdatedCommand.swift new file mode 100644 index 0000000..c7e66cc --- /dev/null +++ b/Sources/MintCLI/Commands/OutdatedCommand.swift @@ -0,0 +1,16 @@ +import Foundation +import MintKit + +class OutdatedCommand: MintCommand { + + init(mint: Mint) { + super.init(mint: mint, + name: "outdated", + description: "List all the currently installed and linked packages that are outdated.") + } + + override func execute() throws { + try super.execute() + try mint.outdated() + } +} diff --git a/Sources/MintCLI/Commands/UpdateCommand.swift b/Sources/MintCLI/Commands/UpdateCommand.swift new file mode 100644 index 0000000..78da44a --- /dev/null +++ b/Sources/MintCLI/Commands/UpdateCommand.swift @@ -0,0 +1,16 @@ +import Foundation +import MintKit + +class UpdateCommand: MintCommand { + + init(mint: Mint) { + super.init(mint: mint, + name: "update", + description: "Updates all currently installed and linked packages that are outdated.") + } + + override func execute() throws { + try super.execute() + try mint.update() + } +} diff --git a/Sources/MintCLI/MintCLI.swift b/Sources/MintCLI/MintCLI.swift index 917a18b..18ded0d 100644 --- a/Sources/MintCLI/MintCLI.swift +++ b/Sources/MintCLI/MintCLI.swift @@ -31,6 +31,8 @@ public class MintCLI { UninstallCommand(mint: mint), ListCommand(mint: mint), BootstrapCommand(mint: mint), + OutdatedCommand(mint: mint), + UpdateCommand(mint: mint) ]) } diff --git a/Sources/MintKit/Mint.swift b/Sources/MintKit/Mint.swift index 026e818..1a38639 100644 --- a/Sources/MintKit/Mint.swift +++ b/Sources/MintKit/Mint.swift @@ -130,7 +130,7 @@ public class Mint { return versionsByPackage } - func resolvePackage(_ package: PackageReference) throws { + func resolvePackage(_ package: PackageReference, silent: Bool = false) throws { // resolve version from MintFile if package.version.isEmpty, @@ -140,7 +140,9 @@ public class Mint { if let mintFilePackage = mintfile.package(for: package.repo), !mintFilePackage.version.isEmpty { package.version = mintFilePackage.version package.repo = mintFilePackage.repo - output("Using \(package.repo) \(package.version) from Mintfile.") + if !silent { + output("Using \(package.repo) \(package.version) from Mintfile.") + } } } @@ -157,7 +159,9 @@ public class Mint { // resove latest version from git repo if package.version.isEmpty { // we don't have a specific version, let's get the latest tag - output("Finding latest version of \(package.name)") + if !silent { + output("Finding latest version of \(package.name)") + } do { let tagOutput = try SwiftCLI.capture(bash: "git ls-remote --tags --refs \(package.gitPath)") @@ -450,4 +454,52 @@ public class Mint { } try? installPath.delete() } + + @discardableResult + public func outdated(silent: Bool = false) throws -> [String : (oldVersion: String, newReference: PackageReference) ] { + guard packagesPath.exists else { + if !silent { + output("No mint packages installed") + } + return [:] + } + + var outdatedPackageReferences: [String: (oldVersion: String, newReference: PackageReference)] = [:] + let outdatedPackages: [String] = try getLinkedPackages().compactMap { (name, version) in + guard let gitRepo = try getPackageGit(name: name) else { + return nil + } + let reference = PackageReference(repo: gitRepo) + try resolvePackage(reference, silent: true) + if reference.version > version { + outdatedPackageReferences[name] = (oldVersion: version, newReference: reference) + return "\(name): \(version) < \(reference.version)" + } else { + return nil + } + }.sorted { $0.localizedStandardCompare($1) == .orderedAscending } + + if outdatedPackages.isEmpty { + if !silent { + output("All packages are up to date") + } + } else { + if !silent { + output("Outdated mint packages:\n\(outdatedPackages.joined(separator: "\n"))") + } + } + return outdatedPackageReferences + } + + public func update() throws { + let outdatedPackages = try outdated(silent: true) + guard !outdatedPackages.isEmpty else { + output("All packages are already up to date") + return + } + for (name, value) in outdatedPackages { + try install(package: value.newReference, executable: name, force: true, link: true) + output("Updated \(value.newReference.name) from version \(value.oldVersion) to \(value.newReference.version)") + } + } } diff --git a/Tests/MintTests/MintTests.swift b/Tests/MintTests/MintTests.swift index 1bf1711..5854f77 100644 --- a/Tests/MintTests/MintTests.swift +++ b/Tests/MintTests/MintTests.swift @@ -10,6 +10,7 @@ class MintTests: XCTestCase { standardOut: WriteStream.null, standardError: WriteStream.null) let testRepo = "yonaskolb/SimplePackage" + let gitTestRepo = "https://github.com/yonaskolb/SimplePackage.git" let sshTestRepo = "git@github.com:yonaskolb/SimplePackage.git" let testVersion = "4.0.0" let latestVersion = "5.0.0" @@ -189,4 +190,30 @@ class MintTests: XCTestCase { try mint.install(package: PackageReference(repo: "yonaskolb/simplepackage", version: "compile_error")) } } + + func testOutdated() throws { + let specificPackage = PackageReference(repo: testRepo, version: testVersion) + let updatedPackage = PackageReference(repo: gitTestRepo, version: latestVersion) + try mint.install(package: specificPackage, link: true) + let outdatedResult = try mint.outdated() + XCTAssertEqual(outdatedResult.count, 1) + let result = outdatedResult["simplepackage"]! + XCTAssertEqual(result.oldVersion, testVersion) + XCTAssertEqual(result.newReference, updatedPackage) + + try mint.install(package: updatedPackage, force: true, link: true) + let outdatedResultAfterLatestInstallation = try mint.outdated() + XCTAssertEqual(outdatedResultAfterLatestInstallation.count, 0) + } + + func testUpdate() throws { + let specificPackage = PackageReference(repo: testRepo, version: testVersion) + try mint.install(package: specificPackage, link: true) + let outdatedResult = try mint.outdated() + XCTAssertEqual(outdatedResult.count, 1) + + try mint.update() + let outdatedResultAfterLatestInstallation = try mint.outdated() + XCTAssertEqual(outdatedResultAfterLatestInstallation.count, 0) + } }