Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Worktree test utils #36

Merged
merged 1 commit into from
Oct 17, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Add Worktree test utils
This makes it easier to write `Worktree` instances in tests
  • Loading branch information
9999years committed Oct 17, 2024
commit fff9a630058c534aed1236c5e96713fa5cba97fd
6 changes: 6 additions & 0 deletions src/git/commit_hash.rs
Original file line number Diff line number Diff line change
@@ -15,6 +15,12 @@ use winnow::Parser;
pub struct CommitHash(String);

impl CommitHash {
/// A fake commit hash for testing purposes.
#[cfg(test)]
pub fn fake() -> Self {
Self("a".repeat(40))
}

/// Get an abbreviated 8-character Git hash.
pub fn abbrev(&self) -> &str {
&self.0[..8]
145 changes: 88 additions & 57 deletions src/git/worktree/parse.rs
Original file line number Diff line number Diff line change
@@ -35,9 +35,9 @@ use crate::ResolvedCommitish;
pub struct Worktrees {
/// The path of the main worktree. This contains the common `.git` directory, or, in the
/// case of a bare repository, _is_ a `.git` directory.
main: Utf8PathBuf,
pub(crate) main: Utf8PathBuf,
/// A map from worktree paths to worktree information.
inner: HashMap<Utf8PathBuf, Worktree>,
pub(crate) inner: HashMap<Utf8PathBuf, Worktree>,
}

impl Worktrees {
@@ -53,6 +53,10 @@ impl Worktrees {
self.inner.remove(&self.main).unwrap()
}

pub fn into_inner(self) -> HashMap<Utf8PathBuf, Worktree> {
self.inner
}

pub fn for_branch(&self, branch: &LocalBranchRef) -> Option<&Worktree> {
self.iter()
.map(|(_path, worktree)| worktree)
@@ -277,6 +281,61 @@ impl Worktree {
})
}

#[cfg(test)]
pub fn new_bare(path: impl Into<Utf8PathBuf>) -> Self {
Self {
path: path.into(),
head: WorktreeHead::Bare,
is_main: true,
locked: None,
prunable: None,
}
}

#[cfg(test)]
pub fn new_detached(path: impl Into<Utf8PathBuf>, commit: impl Into<CommitHash>) -> Self {
Self {
path: path.into(),
head: WorktreeHead::Detached(commit.into()),
is_main: false,
locked: None,
prunable: None,
}
}

#[cfg(test)]
pub fn new_branch(
path: impl Into<Utf8PathBuf>,
commit: impl Into<CommitHash>,
branch: impl Into<LocalBranchRef>,
) -> Self {
Self {
path: path.into(),
head: WorktreeHead::Branch(commit.into(), branch.into()),
is_main: false,
locked: None,
prunable: None,
}
}

#[cfg(test)]
pub fn with_is_main(mut self, is_main: bool) -> Self {
self.is_main = is_main;
self
}

#[cfg(test)]
pub fn with_locked(mut self, locked: impl Into<String>) -> Self {
self.locked = Some(locked.into());
self
}

#[cfg(test)]
pub fn with_prunable(mut self, prunable: impl Into<String>) -> Self {
self.prunable = Some(prunable.into());
self
}

fn parse_locked(input: &mut &str) -> PResult<String> {
let _ = "locked".parse_next(input)?;
let reason = Self::parse_reason.parse_next(input)?;
@@ -363,61 +422,33 @@ mod tests {
assert_eq!(
worktrees,
vec![
Worktree {
path: "/Users/wiggles/cabal/accept".into(),
head: WorktreeHead::Branch(
CommitHash::from("0685cb3fec8b7144f865638cfd16768e15125fc2"),
LocalBranchRef::from_str("refs/heads/rebeccat/fix-accept-flag").unwrap(),
),
is_main: false,
locked: None,
prunable: None,
},
Worktree {
path: "/Users/wiggles/lix".into(),
head: WorktreeHead::Detached(CommitHash::from(
"0d484aa498b3c839991d11afb31bc5fcf368493d"
)),
is_main: false,
locked: None,
prunable: None,
},
Worktree {
path: "/path/to/bare-source".into(),
head: WorktreeHead::Bare,
is_main: true,
locked: None,
prunable: None,
},
Worktree {
path: "/path/to/linked-worktree-locked-no-reason".into(),
head: WorktreeHead::Branch(
CommitHash::from("5678abc5678abc5678abc5678abc5678abc5678c"),
LocalBranchRef::from_str("refs/heads/locked-no-reason").unwrap()
),
is_main: false,
locked: Some("".into()),
prunable: None,
},
Worktree {
path: "/path/to/linked-worktree-locked-with-reason".into(),
head: WorktreeHead::Branch(
CommitHash::from("3456def3456def3456def3456def3456def3456b"),
LocalBranchRef::from_str("refs/heads/locked-with-reason").unwrap()
),
is_main: false,
locked: Some("reason why is locked".into()),
prunable: None,
},
Worktree {
path: "/path/to/linked-worktree-prunable".into(),
head: WorktreeHead::Detached(CommitHash::from(
"1233def1234def1234def1234def1234def1234b"
),),
is_main: false,
locked: None,
prunable: Some("gitdir file points to non-existent location".into()),
},
Worktree::new_branch(
"/Users/wiggles/cabal/accept",
"0685cb3fec8b7144f865638cfd16768e15125fc2",
"rebeccat/fix-accept-flag"
),
Worktree::new_detached(
"/Users/wiggles/lix",
"0d484aa498b3c839991d11afb31bc5fcf368493d"
),
Worktree::new_bare("/path/to/bare-source"),
Worktree::new_branch(
"/path/to/linked-worktree-locked-no-reason",
"5678abc5678abc5678abc5678abc5678abc5678c",
"locked-no-reason"
)
.with_locked(""),
Worktree::new_branch(
"/path/to/linked-worktree-locked-with-reason",
"3456def3456def3456def3456def3456def3456b",
"locked-with-reason"
)
.with_locked("reason why is locked"),
Worktree::new_detached(
"/path/to/linked-worktree-prunable",
"1233def1234def1234def1234def1234def1234b",
)
.with_prunable("gitdir file points to non-existent location"),
]
);
}
Loading