diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..1b520dd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,4 @@ +# Version Bumps + +1. Update `Cargo.toml` workspace version +2. Run `./demo/generate.sh` to regenerate the demo gif and update README diff --git a/Cargo.lock b/Cargo.lock index 07f9fe8..2fd853b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -222,7 +222,7 @@ dependencies = [ [[package]] name = "f" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anstyle", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 060469e..c11b6a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ members = [ ] [workspace.package] -version = "0.1.0" +version = "0.1.1" edition = "2024" authors = ["David Beesley"] license = "MIT" diff --git a/README.md b/README.md index 1933549..16fc294 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![CI](https://github.com/davidbeesley/f/actions/workflows/ci.yml/badge.svg)](https://github.com/davidbeesley/f/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) -![Version](https://img.shields.io/badge/version-0.1.0-blue) +![Version](https://img.shields.io/badge/version-0.1.1-blue) ![Linux](https://img.shields.io/badge/Linux-supported-green) ![macOS](https://img.shields.io/badge/macOS-supported-green) ![Windows](https://img.shields.io/badge/Windows-unsupported-red) @@ -10,7 +10,7 @@ A keyboard-driven git file manager for the terminal. -![demo](demo/demo-0.1.0.gif) +![demo](demo/demo-0.1.1.gif) ## The Problem diff --git a/crates/f/src/git_status.rs b/crates/f/src/git_status.rs index 2b8d2a0..05245b2 100644 --- a/crates/f/src/git_status.rs +++ b/crates/f/src/git_status.rs @@ -289,10 +289,14 @@ pub enum IdMatch { pub fn find_file_by_id(files: &[GitFile], id: &str) -> IdMatch { let matches: Vec<_> = files.iter().filter(|f| f.stable_id.matches(id)).collect(); - match matches.len() { - 0 => IdMatch::NotFound, - 1 => IdMatch::Unique(matches[0].clone()), - n => IdMatch::Ambiguous(n), + if matches.is_empty() { + return IdMatch::NotFound; + } + let unique_paths: std::collections::HashSet<_> = matches.iter().map(|f| &f.rel_path).collect(); + if unique_paths.len() == 1 { + IdMatch::Unique(matches[0].clone()) + } else { + IdMatch::Ambiguous(unique_paths.len()) } } @@ -423,6 +427,20 @@ mod tests { } } + #[test] + fn find_file_same_path_staged_and_unstaged_is_unique() { + let mut staged = make_file("src/main.rs", "fk", "fkkabcdefghi"); + staged.file_type = FileType::Staged; + let mut unstaged = make_file("src/main.rs", "fk", "fkkabcdefghi"); + unstaged.file_type = FileType::Unstaged; + let files = vec![staged, unstaged]; + match find_file_by_id(&files, "fk") { + IdMatch::Unique(f) => assert_eq!(f.rel_path, "src/main.rs"), + IdMatch::Ambiguous(n) => panic!("expected unique, got ambiguous({})", n), + IdMatch::NotFound => panic!("expected unique, got not found"), + } + } + #[test] fn generate_ids_no_collision() { let paths = vec!["src/main.rs".to_string()]; diff --git a/demo/demo-0.1.0.gif b/demo/demo-0.1.0.gif deleted file mode 100644 index ba132c2..0000000 Binary files a/demo/demo-0.1.0.gif and /dev/null differ diff --git a/demo/demo-0.1.1.gif b/demo/demo-0.1.1.gif new file mode 100644 index 0000000..d15a112 Binary files /dev/null and b/demo/demo-0.1.1.gif differ diff --git a/demo/generate.sh b/demo/generate.sh index 2b40b78..d58af3b 100755 --- a/demo/generate.sh +++ b/demo/generate.sh @@ -21,7 +21,7 @@ echo "Output: $OUTPUT_FILE" find "$SCRIPT_DIR" -name 'demo-*.gif' -delete 2>/dev/null || true # Build the project first so demo uses current version -cargo build --release -p f --quiet +cargo build --release -p f # Add to PATH for vhs export PATH="$PROJECT_ROOT/target/release:$PATH" @@ -30,8 +30,9 @@ export PATH="$PROJECT_ROOT/target/release:$PATH" cd "$SCRIPT_DIR" vhs demo.tape -o "demo-${VERSION}.gif" -# Update README to reference new demo +# Update README to reference new demo and version badge sed -i "s|demo/demo-[0-9]*\.[0-9]*\.[0-9]*\.gif|demo/demo-${VERSION}.gif|g" "$PROJECT_ROOT/README.md" +sed -i "s|version-[0-9]*\.[0-9]*\.[0-9]*-blue|version-${VERSION}-blue|g" "$PROJECT_ROOT/README.md" echo "Demo generated: $OUTPUT_FILE" echo "README.md updated to reference demo/demo-${VERSION}.gif"