Fix git repo root detection in tools (#1169)

This commit is contained in:
John DiSanti 2022-02-08 17:45:57 -08:00 committed by GitHub
parent 2cf4a3bbd9
commit 03a2692fd2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 218 additions and 21 deletions

View File

@ -1234,6 +1234,7 @@ dependencies = [
"anyhow",
"async-trait",
"tokio",
"tracing",
]
[[package]]

View File

@ -161,6 +161,12 @@ dependencies = [
"winapi",
]
[[package]]
name = "pin-project-lite"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
[[package]]
name = "pretty_assertions"
version = "1.0.0"
@ -257,6 +263,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"tracing",
]
[[package]]
@ -333,6 +340,38 @@ dependencies = [
"serde",
]
[[package]]
name = "tracing"
version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9"
dependencies = [
"cfg-if",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tracing-core"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23"
dependencies = [
"lazy_static",
]
[[package]]
name = "unicode-segmentation"
version = "1.8.0"

View File

@ -258,6 +258,12 @@ version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]]
name = "pin-project-lite"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
[[package]]
name = "pkg-config"
version = "0.3.24"
@ -383,6 +389,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"tracing",
]
[[package]]
@ -454,6 +461,38 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "tracing"
version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9"
dependencies = [
"cfg-if",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tracing-core"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23"
dependencies = [
"lazy_static",
]
[[package]]
name = "unicode-bidi"
version = "0.3.7"

View File

@ -19,6 +19,18 @@ dependencies = [
"syn",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "pin-project-lite"
version = "0.2.8"
@ -50,6 +62,7 @@ dependencies = [
"anyhow",
"async-trait",
"tokio",
"tracing",
]
[[package]]
@ -84,6 +97,38 @@ dependencies = [
"syn",
]
[[package]]
name = "tracing"
version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9"
dependencies = [
"cfg-if",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tracing-core"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23"
dependencies = [
"lazy_static",
]
[[package]]
name = "unicode-xid"
version = "0.2.2"

View File

@ -15,3 +15,4 @@ async-shell = ["tokio"]
anyhow = "1"
async-trait = "0.1"
tokio = { version = "1", features = ["rt", "macros"], optional = true }
tracing = "0.1"

View File

@ -0,0 +1,6 @@
#!/bin/bash
if [[ "$1" != "rev-parse" || "$2" != "--show-toplevel" ]]; then
echo "wrong arguments" >&2
exit 1
fi
echo "/git/repo/root/path"

View File

@ -3,9 +3,11 @@
* SPDX-License-Identifier: Apache-2.0.
*/
use anyhow::{bail, Result};
use crate::shell::ShellOperation;
use anyhow::Result;
use std::ffi::OsStr;
use std::path::{Path, PathBuf};
use tracing::warn;
mod checkout_revision;
pub use checkout_revision::CheckoutRevision;
@ -16,26 +18,17 @@ pub use get_current_tag::GetCurrentTag;
mod get_last_commit;
pub use get_last_commit::GetLastCommit;
mod get_repo_root;
pub use get_repo_root::GetRepoRoot;
/// Attempts to find git repository root from the given location.
pub fn find_git_repository_root(repo_name: &str, location: impl AsRef<Path>) -> Result<PathBuf> {
let mut current_dir = location.as_ref().canonicalize()?;
let os_name = OsStr::new(repo_name);
loop {
if is_git_root(&current_dir) {
if let Some(file_name) = current_dir.file_name() {
if os_name == file_name {
return Ok(current_dir);
let path = GetRepoRoot::new(location.as_ref()).run()?;
if path.file_name() != Some(OsStr::new(repo_name)) {
warn!(
"repository root {:?} doesn't have expected name '{}'",
path, repo_name
);
}
}
break;
} else if !current_dir.pop() {
break;
}
}
bail!("failed to find {0} repository root", repo_name)
}
fn is_git_root(path: &Path) -> bool {
let path = path.join(".git");
path.exists() && path.is_dir()
Ok(path)
}

View File

@ -54,7 +54,7 @@ mod tests {
}
#[test]
fn get_last_commit_faijlure() {
fn get_last_commit_failure() {
let result = GetLastCommit {
program: "./git_fails",
repo_path: "./fake_git".into(),

View File

@ -0,0 +1,73 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
use crate::shell::{handle_failure, output_text, ShellOperation};
use anyhow::Result;
use std::path::PathBuf;
use std::process::Command;
pub struct GetRepoRoot {
program: &'static str,
start_path: PathBuf,
}
impl GetRepoRoot {
pub fn new(start_path: impl Into<PathBuf>) -> GetRepoRoot {
GetRepoRoot {
program: "git",
start_path: start_path.into(),
}
}
}
impl ShellOperation for GetRepoRoot {
type Output = PathBuf;
fn run(&self) -> Result<PathBuf> {
let mut command = Command::new(self.program);
command.arg("rev-parse");
command.arg("--show-toplevel");
command.current_dir(&self.start_path);
let output = command.output()?;
handle_failure("determine git repo root", &output)?;
let (stdout, _) = output_text(&output);
Ok(stdout.trim().into())
}
}
#[cfg(all(test, not(target_os = "windows")))]
mod tests {
use super::*;
#[test]
fn get_repo_root_success() {
let last_commit = GetRepoRoot {
program: "./git_revparse_show_toplevel",
start_path: "./fake_git".into(),
}
.run()
.unwrap();
assert_eq!(PathBuf::from("/git/repo/root/path"), last_commit);
}
#[test]
fn get_repo_root_failure() {
let result = GetRepoRoot {
program: "./git_fails",
start_path: "./fake_git".into(),
}
.run();
assert!(result.is_err(), "expected error, got {:?}", result);
assert_eq!(
"Failed to determine git repo root:\n\
Status: 1\n\
Stdout: some stdout failure message\n\n\
Stderr: some stderr failure message\n\n",
format!("{}", result.err().unwrap())
);
}
}