1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See http://swift.org/LICENSE.txt for license information
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
import class Foundation.ProcessInfo
import TSCBasic
public enum Git {
/// A shell command to run for Git. Can be either a name or a path.
/// - Note: modification is not thread safe, designed for testing only
public static var tool: String = "git\(executableFileSuffix)"
/// Returns true if the git reference name is well formed.
public static func checkRefFormat(ref: String) -> Bool {
do {
let result = try Process.popen(args: tool, "check-ref-format", "--allow-onelevel", ref)
return result.exitStatus == .terminated(code: 0)
} catch {
return false
}
}
private static var _gitEnvironment = ProcessEnv.block
@available(*,
deprecated,
renamed: "environmentBlock",
message: "Previous `[String: String]` representation did not account for case insensitivity on Windows."
)
public static var environment: [String: String] {
get {
var env = Self._gitEnvironment
// These variables are inserted into the environment when shelling out
// to git if not already present.
let underrideVariables: ProcessEnvironmentBlock = [
// Disable terminal prompts in git. This will make git error out and return
// when it needs a user/pass etc instead of hanging the terminal (SR-3981).
"GIT_TERMINAL_PROMPT": "0",
// The above is env variable is not enough. However, ssh_config's batch
// mode is made for this purpose. see: https://linux.die.net/man/5/ssh_config
"GIT_SSH_COMMAND": "ssh -oBatchMode=yes",
]
for (key, value) in underrideVariables {
// Skip this key is already present in the env.
if env.keys.contains(key) { continue }
env[key] = value
}
return Dictionary(env.map { ($0.value, $1) }, uniquingKeysWith: { $1 })
}
set {
Self._gitEnvironment = .init(newValue)
}
}
/// Returns the environment variables for launching the git subprocess.
///
/// This contains the current environment with custom overrides for using
/// git from swift build.
/// - Note: modification is not thread safe, designed for testing only
public static var environmentBlock: ProcessEnvironmentBlock {
get {
var env = Self._gitEnvironment
// These variables are inserted into the environment when shelling out
// to git if not already present.
let underrideVariables: ProcessEnvironmentBlock = [
// Disable terminal prompts in git. This will make git error out and return
// when it needs a user/pass etc instead of hanging the terminal (SR-3981).
"GIT_TERMINAL_PROMPT": "0",
// The above is env variable is not enough. However, ssh_config's batch
// mode is made for this purpose. see: https://linux.die.net/man/5/ssh_config
"GIT_SSH_COMMAND": "ssh -oBatchMode=yes",
]
for (key, value) in underrideVariables {
// Skip this key is already present in the env.
if env.keys.contains(key) { continue }
env[key] = value
}
return env
}
set {
Self._gitEnvironment = newValue
}
}
}
|