Allow nested worktree directories

This commit is contained in:
2021-12-23 18:33:14 +01:00
parent 92e4856dd9
commit 61a8d63374
4 changed files with 61 additions and 5 deletions

View File

@@ -157,7 +157,22 @@ fn main() {
None => None,
};
match grm::add_worktree(&cwd, &action_args.name, track, action_args.no_track) {
let mut name: &str = &action_args.name;
let subdirectory;
let split = name.split_once('/');
match split {
None => subdirectory = None,
Some(split) => {
if split.0.is_empty() || split.1.is_empty() {
print_error("Worktree name cannot start or end with a slash");
process::exit(1);
} else {
(subdirectory, name) = (Some(Path::new(split.0)), split.1);
}
}
}
match grm::add_worktree(&cwd, name, subdirectory, track, action_args.no_track) {
Ok(_) => print_success(&format!("Worktree {} created", &action_args.name)),
Err(error) => {
print_error(&format!("Error creating worktree: {}", error));

View File

@@ -461,6 +461,7 @@ pub fn find_in_tree(path: &Path) -> Result<(Tree, Vec<String>), String> {
pub fn add_worktree(
directory: &Path,
name: &str,
subdirectory: Option<&Path>,
track: Option<(&str, &str)>,
no_track: bool,
) -> Result<(), String> {
@@ -473,7 +474,12 @@ pub fn add_worktree(
let config = repo::read_worktree_root_config(directory)?;
if repo.find_worktree(name).is_ok() {
let path = match subdirectory {
Some(dir) => dir.join(name),
None => Path::new(name).to_path_buf(),
};
if repo.find_worktree(&path).is_ok() {
return Err(format!("Worktree {} already exists", &name));
}
@@ -605,7 +611,10 @@ pub fn add_worktree(
}
}
repo.new_worktree(name, &directory.join(&name), &target_branch)?;
if let Some(subdirectory) = subdirectory {
std::fs::create_dir_all(subdirectory).map_err(|error| error.to_string())?;
}
repo.new_worktree(name, &path, &target_branch)?;
Ok(())
}

View File

@@ -362,8 +362,10 @@ impl Repo {
self.0.config().map_err(convert_libgit2_error)
}
pub fn find_worktree(&self, name: &str) -> Result<(), String> {
self.0.find_worktree(name).map_err(convert_libgit2_error)?;
pub fn find_worktree(&self, path: &Path) -> Result<(), String> {
self.0
.find_worktree(path.to_str().expect("Worktree path is not valid utf-8"))
.map_err(convert_libgit2_error)?;
Ok(())
}