diff --git a/Packages/CrowProvider/Sources/CrowProvider/ProviderManager.swift b/Packages/CrowProvider/Sources/CrowProvider/ProviderManager.swift index bba374b..17c8970 100644 --- a/Packages/CrowProvider/Sources/CrowProvider/ProviderManager.swift +++ b/Packages/CrowProvider/Sources/CrowProvider/ProviderManager.swift @@ -91,9 +91,9 @@ public actor ProviderManager { } let repoSlug = "\(parsed.org)/\(parsed.repo)" if parsed.isMR { - output = try await shell(env: env, "glab", "mr", "view", "\(parsed.number)", "--repo", repoSlug) + output = try await shell(env: env, cwd: NSHomeDirectory(), "glab", "mr", "view", "\(parsed.number)", "--repo", repoSlug) } else { - output = try await shell(env: env, "glab", "issue", "view", "\(parsed.number)", "--repo", repoSlug) + output = try await shell(env: env, cwd: NSHomeDirectory(), "glab", "issue", "view", "\(parsed.number)", "--repo", repoSlug) } } @@ -122,7 +122,7 @@ public actor ProviderManager { return output.components(separatedBy: .newlines).first } - private func shell(env: [String: String] = [:], _ args: String...) async throws -> String { + private func shell(env: [String: String] = [:], cwd: String? = nil, _ args: String...) async throws -> String { let process = Process() let pipe = Pipe() process.executableURL = URL(fileURLWithPath: "/usr/bin/env") @@ -130,6 +130,7 @@ public actor ProviderManager { process.environment = env.isEmpty ? ShellEnvironment.shared.env : ShellEnvironment.shared.merging(env) + if let cwd { process.currentDirectoryURL = URL(fileURLWithPath: cwd) } process.standardOutput = pipe process.standardError = pipe try process.run() diff --git a/Sources/Crow/App/IssueTracker.swift b/Sources/Crow/App/IssueTracker.swift index 4d459c0..305f2b8 100644 --- a/Sources/Crow/App/IssueTracker.swift +++ b/Sources/Crow/App/IssueTracker.swift @@ -1144,7 +1144,7 @@ final class IssueTracker { let output: String do { - output = try await shell(env: ["GITLAB_HOST": host], "glab", "api", endpoint) + output = try await shell(env: ["GITLAB_HOST": host], cwd: NSHomeDirectory(), "glab", "api", endpoint) } catch { print("[IssueTracker] Reconcile glab api failed for \(candidate.repoSlug)#\(candidate.branch) on \(host): \(error.localizedDescription.prefix(200))") continue @@ -1553,6 +1553,7 @@ final class IssueTracker { do { output = try await shell( env: ["GITLAB_HOST": host], + cwd: NSHomeDirectory(), "glab", "issue", "list", "-a", "@me", "--output-format", "json" ) } catch { @@ -1736,14 +1737,15 @@ final class IssueTracker { // MARK: - Shell - private func shell(env: [String: String] = [:], _ args: String...) async throws -> String { - return try await shell(env: env, args: args) + private func shell(env: [String: String] = [:], cwd: String? = nil, _ args: String...) async throws -> String { + return try await shell(env: env, cwd: cwd, args: args) } - private func shell(env: [String: String] = [:], args: [String]) async throws -> String { + private func shell(env: [String: String] = [:], cwd: String? = nil, args: [String]) async throws -> String { currentRefreshGhCalls += 1 let args = args let env = env + let cwd = cwd return try await Task.detached { let process = Process() let outPipe = Pipe() @@ -1753,6 +1755,7 @@ final class IssueTracker { process.environment = env.isEmpty ? ShellEnvironment.shared.env : ShellEnvironment.shared.merging(env) + if let cwd { process.currentDirectoryURL = URL(fileURLWithPath: cwd) } process.standardOutput = outPipe process.standardError = errPipe try process.run()