diff --git a/git-repository/src/lib.rs b/git-repository/src/lib.rs index 46fd9fcd5ef..07da578a390 100644 --- a/git-repository/src/lib.rs +++ b/git-repository/src/lib.rs @@ -321,31 +321,25 @@ pub mod state { #[derive(Debug, PartialEq)] pub enum InProgress { /// A mailbox is being applied. - // TODO: test ApplyMailbox, /// A rebase is happening while a mailbox is being applied. // TODO: test ApplyMailboxRebase, /// A git bisect operation has not yet been concluded. - // TODO: test Bisect, /// A cherry pick operation. CherryPick, /// A cherry pick with multiple commits pending. - // TODO: test CherryPickSequence, /// A merge operation. - // TODO: test Merge, /// A rebase operation. - // TODO: test Rebase, /// An interactive rebase operation. RebaseInteractive, /// A revert operation. Revert, /// A revert operation with multiple commits pending. - // TODO: test RevertSequence, } } diff --git a/git-repository/src/repository/state.rs b/git-repository/src/repository/state.rs index 022f150f4da..41145cd4cfe 100644 --- a/git-repository/src/repository/state.rs +++ b/git-repository/src/repository/state.rs @@ -20,7 +20,7 @@ impl crate::Repository { } else if git_dir.join("rebase-merge").is_dir() { Some(state::InProgress::Rebase) } else if git_dir.join("CHERRY_PICK_HEAD").is_file() { - if git_dir.join("todo").is_file() { + if git_dir.join("sequencer/todo").is_file() { Some(state::InProgress::CherryPickSequence) } else { Some(state::InProgress::CherryPick) @@ -30,7 +30,7 @@ impl crate::Repository { } else if git_dir.join("BISECT_LOG").is_file() { Some(state::InProgress::Bisect) } else if git_dir.join("REVERT_HEAD").is_file() { - if git_dir.join("todo").is_file() { + if git_dir.join("sequencer/todo").is_file() { Some(state::InProgress::RevertSequence) } else { Some(state::InProgress::Revert) diff --git a/git-repository/tests/fixtures/generated-archives/make_am_repo.tar.xz b/git-repository/tests/fixtures/generated-archives/make_am_repo.tar.xz new file mode 100644 index 00000000000..79078167099 Binary files /dev/null and b/git-repository/tests/fixtures/generated-archives/make_am_repo.tar.xz differ diff --git a/git-repository/tests/fixtures/generated-archives/make_bisect_repo.tar.xz b/git-repository/tests/fixtures/generated-archives/make_bisect_repo.tar.xz new file mode 100644 index 00000000000..d587e2fec91 Binary files /dev/null and b/git-repository/tests/fixtures/generated-archives/make_bisect_repo.tar.xz differ diff --git a/git-repository/tests/fixtures/generated-archives/make_cherry_pick_sequence_repo.tar.xz b/git-repository/tests/fixtures/generated-archives/make_cherry_pick_sequence_repo.tar.xz new file mode 100644 index 00000000000..5a912a9cdf9 Binary files /dev/null and b/git-repository/tests/fixtures/generated-archives/make_cherry_pick_sequence_repo.tar.xz differ diff --git a/git-repository/tests/fixtures/generated-archives/make_merge_repo.tar.xz b/git-repository/tests/fixtures/generated-archives/make_merge_repo.tar.xz new file mode 100644 index 00000000000..ec232d12d85 Binary files /dev/null and b/git-repository/tests/fixtures/generated-archives/make_merge_repo.tar.xz differ diff --git a/git-repository/tests/fixtures/generated-archives/make_revert_sequence_repo.tar.xz b/git-repository/tests/fixtures/generated-archives/make_revert_sequence_repo.tar.xz new file mode 100644 index 00000000000..5095081dae9 Binary files /dev/null and b/git-repository/tests/fixtures/generated-archives/make_revert_sequence_repo.tar.xz differ diff --git a/git-repository/tests/fixtures/make_am_repo.sh b/git-repository/tests/fixtures/make_am_repo.sh new file mode 100644 index 00000000000..3923e0e4fd0 --- /dev/null +++ b/git-repository/tests/fixtures/make_am_repo.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -eu -o pipefail + +git init -q + +echo 1.main > 1 +git add 1 +git commit -m 1.main 1 + +git checkout -b other-branch +echo 1.other-branch > 1 +git commit -m 1.other-branch 1 +# Create an mbox formatted patch and save the path +patch_path=$(git format-patch main) + +git checkout main +# Create a conflict +echo 1.main.update > 1 +git commit -m 1.main.update 1 + +# This will fail due to the merge conflict and leave us in a 'apply mbox in progress' state +git am 0001-1.other-branch.patch || true diff --git a/git-repository/tests/fixtures/make_bisect_repo.sh b/git-repository/tests/fixtures/make_bisect_repo.sh new file mode 100644 index 00000000000..0b890bab39e --- /dev/null +++ b/git-repository/tests/fixtures/make_bisect_repo.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -eu -o pipefail + +git init -q + +touch 1 2 + +git add 1 +git commit -m 1 1 + +git add 2 +git commit -m 2 2 + +git bisect start diff --git a/git-repository/tests/fixtures/make_cherry_pick_sequence_repo.sh b/git-repository/tests/fixtures/make_cherry_pick_sequence_repo.sh new file mode 100644 index 00000000000..53f18a274ac --- /dev/null +++ b/git-repository/tests/fixtures/make_cherry_pick_sequence_repo.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -eu -o pipefail + +git init -q + +touch 1 2 3 + +git add 1 +git commit -m 1 1 + +git checkout -b other-branch +echo 2.other-branch > 2 +git add 2 +git commit -m 2.other-branch 2 +git add 3 +git commit -m 3 3 + +git checkout main +echo 2.main > 2 +git add 2 +git commit -m 2.main 2 + +# This should fail and leave us in a cherry-pick + sequencer state +git cherry-pick other-branch~2..other-branch || true diff --git a/git-repository/tests/fixtures/make_merge_repo.sh b/git-repository/tests/fixtures/make_merge_repo.sh new file mode 100644 index 00000000000..9beda889138 --- /dev/null +++ b/git-repository/tests/fixtures/make_merge_repo.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -eu -o pipefail + +git init -q + +echo 1.main > 1 +git add 1 +git commit -m 1.main 1 + +git checkout -b other-branch +echo 1.other-branch > 1 +git add 1 +git commit -m 1.other-branch 1 + +git checkout main +echo 1.main changed > 1 +git commit -m 1.main\ changed 1 + +git merge other-branch || true diff --git a/git-repository/tests/fixtures/make_revert_sequence_repo.sh b/git-repository/tests/fixtures/make_revert_sequence_repo.sh new file mode 100644 index 00000000000..37f182deac7 --- /dev/null +++ b/git-repository/tests/fixtures/make_revert_sequence_repo.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -eu -o pipefail + +git init -q + +echo 1.0 > 1 +git add 1 +git commit -m 1.0 1 + +echo 1.1 > 1 +git commit -m 1.1 1 + +echo 1.2 > 1 +git commit -m 1.2 1 +touch 2 +git add 2 +git commit -m 2 2 + +# This should fail and leave us in a revert + sequencer state +git revert --no-commit HEAD HEAD~2 || true diff --git a/git-repository/tests/repository/state.rs b/git-repository/tests/repository/state.rs index 0f85ba8767d..ee221d7c8d1 100644 --- a/git-repository/tests/repository/state.rs +++ b/git-repository/tests/repository/state.rs @@ -1,6 +1,31 @@ use crate::{named_repo, Result}; use git_repository as git; +#[test] +fn apply_mailbox() -> Result { + let repo = named_repo("make_am_repo.sh")?; + + let head = repo.head()?; + let head_name = head.referent_name().expect("no detached head").shorten(); + assert_eq!(head_name, "main"); + + assert_eq!(repo.in_progress_operation(), Some(git::state::InProgress::ApplyMailbox)); + Ok(()) +} + +#[test] +fn bisect() -> Result { + let repo = named_repo("make_bisect_repo.sh")?; + + let head = repo.head()?; + let head_name = head.referent_name().expect("no detached head").shorten(); + assert_eq!(head_name, "main"); + + assert_eq!(repo.in_progress_operation(), Some(git::state::InProgress::Bisect)); + + Ok(()) +} + #[test] fn cherry_pick() -> Result { let repo = named_repo("make_cherry_pick_repo.sh")?; @@ -13,6 +38,35 @@ fn cherry_pick() -> Result { Ok(()) } +#[test] +fn cherry_pick_sequence() -> Result { + let repo = named_repo("make_cherry_pick_sequence_repo.sh")?; + + let head = repo.head()?; + let head_name = head.referent_name().expect("no detached head").shorten(); + assert_eq!(head_name, "main"); + + assert_eq!( + repo.in_progress_operation(), + Some(git::state::InProgress::CherryPickSequence) + ); + + Ok(()) +} + +#[test] +fn merge() -> Result { + let repo = named_repo("make_merge_repo.sh")?; + + let head = repo.head()?; + let head_name = head.referent_name().expect("no detached head").shorten(); + assert_eq!(head_name, "main"); + + assert_eq!(repo.in_progress_operation(), Some(git::state::InProgress::Merge)); + + Ok(()) +} + #[test] fn rebase_interactive() -> Result { let repo = named_repo("make_rebase_i_repo.sh")?; @@ -39,3 +93,19 @@ fn revert() -> Result { Ok(()) } + +#[test] +fn revert_sequence() -> Result { + let repo = named_repo("make_revert_sequence_repo.sh")?; + + let head = repo.head()?; + let head_name = head.referent_name().expect("no detached head").shorten(); + assert_eq!(head_name, "main"); + + assert_eq!( + repo.in_progress_operation(), + Some(git::state::InProgress::RevertSequence) + ); + + Ok(()) +}