use testutils::git;
use crate::common::CommandOutput;
use crate::common::TestEnvironment;
use crate::common::TestWorkDir;
#[test]
fn test_revert_root_operation() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
let output = work_dir.run_jj(["op", "revert", "000000000000"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Error: Cannot revert root operation
[EOF]
[exit status: 1]
");
}
#[test]
fn test_revert_merge_operation() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["new"]).success();
work_dir.run_jj(["new", "--at-op=@-"]).success();
let output = work_dir.run_jj(["op", "revert"]);
insta::assert_snapshot!(output, @r"
------- stderr -------
Concurrent modification detected, resolving automatically.
Error: Cannot revert a merge operation
[EOF]
[exit status: 1]
");
}
#[test]
fn test_revert_rewrite_with_child() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["describe", "-m", "initial"]).success();
work_dir.run_jj(["describe", "-m", "modified"]).success();
work_dir.run_jj(["new", "-m", "child"]).success();
let output = work_dir.run_jj(["log", "-T", "description"]);
insta::assert_snapshot!(output, @r"
@ child
â—‹ modified
â—†
[EOF]
");
work_dir.run_jj(["op", "revert", "@-"]).success();
let output = work_dir.run_jj(["log", "-T", "description"]);
insta::assert_snapshot!(output, @r"
@ child
â—‹ initial
â—†
[EOF]
");
}
#[test]
fn test_git_push_revert() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"revset-aliases."immutable_heads()" = "none()""#);
let git_repo_path = test_env.env_root().join("git-repo");
git::init_bare(git_repo_path);
test_env
.run_jj_in(".", ["git", "clone", "git-repo", "repo"])
.success();
let work_dir = test_env.work_dir("repo");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir
.run_jj(["bookmark", "create", "-r@", "main"])
.success();
work_dir.run_jj(["describe", "-m", "AA"]).success();
work_dir.run_jj(["git", "push", "--allow-new"]).success();
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "BB"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
let pre_push_opid = work_dir.current_operation_id();
work_dir.run_jj(["git", "push"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin: qpvuntsm d9a9f6a0 (empty) BB
[EOF]
");
work_dir.run_jj(["op", "restore", &pre_push_opid]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "CC"]).success();
work_dir.run_jj(["git", "fetch"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main (conflicted):
- qpvuntsm hidden 3a44d6c5 (empty) AA
+ qpvuntsm?? 1e742089 (empty) CC
+ qpvuntsm?? d9a9f6a0 (empty) BB
@origin (behind by 1 commits): qpvuntsm?? d9a9f6a0 (empty) BB
[EOF]
");
}
#[test]
fn test_git_push_revert_with_import() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"revset-aliases."immutable_heads()" = "none()""#);
let git_repo_path = test_env.env_root().join("git-repo");
git::init_bare(git_repo_path);
test_env
.run_jj_in(".", ["git", "clone", "git-repo", "repo"])
.success();
let work_dir = test_env.work_dir("repo");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir
.run_jj(["bookmark", "create", "-r@", "main"])
.success();
work_dir.run_jj(["describe", "-m", "AA"]).success();
work_dir.run_jj(["git", "push", "--allow-new"]).success();
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "BB"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
let pre_push_opid = work_dir.current_operation_id();
work_dir.run_jj(["git", "push"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin: qpvuntsm d9a9f6a0 (empty) BB
[EOF]
");
work_dir.run_jj(["op", "restore", &pre_push_opid]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
work_dir.run_jj(["git", "import"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin: qpvuntsm d9a9f6a0 (empty) BB
[EOF]
");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "CC"]).success();
work_dir.run_jj(["git", "fetch"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm 1e742089 (empty) CC
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden d9a9f6a0 (empty) BB
[EOF]
");
}
#[test]
fn test_git_push_revert_colocated() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"revset-aliases."immutable_heads()" = "none()""#);
let git_repo_path = test_env.env_root().join("git-repo");
git::init_bare(git_repo_path.clone());
let work_dir = test_env.work_dir("clone");
git::clone(work_dir.root(), git_repo_path.to_str().unwrap(), None);
work_dir.run_jj(["git", "init", "--git-repo=."]).success();
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir
.run_jj(["bookmark", "create", "-r@", "main"])
.success();
work_dir.run_jj(["describe", "-m", "AA"]).success();
work_dir.run_jj(["git", "push", "--allow-new"]).success();
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "BB"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@git: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
let pre_push_opid = work_dir.current_operation_id();
work_dir.run_jj(["git", "push"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@git: qpvuntsm d9a9f6a0 (empty) BB
@origin: qpvuntsm d9a9f6a0 (empty) BB
[EOF]
");
work_dir.run_jj(["op", "restore", &pre_push_opid]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@git: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "CC"]).success();
work_dir.run_jj(["git", "fetch"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main (conflicted):
- qpvuntsm hidden 3a44d6c5 (empty) AA
+ qpvuntsm?? 1e742089 (empty) CC
+ qpvuntsm?? d9a9f6a0 (empty) BB
@git (behind by 1 commits): qpvuntsm?? 1e742089 (empty) CC
@origin (behind by 1 commits): qpvuntsm?? d9a9f6a0 (empty) BB
[EOF]
");
}
#[test]
fn test_git_push_revert_repo_only() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"revset-aliases."immutable_heads()" = "none()""#);
let git_repo_path = test_env.env_root().join("git-repo");
git::init_bare(git_repo_path);
test_env
.run_jj_in(".", ["git", "clone", "git-repo", "repo"])
.success();
let work_dir = test_env.work_dir("repo");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir
.run_jj(["bookmark", "create", "-r@", "main"])
.success();
work_dir.run_jj(["describe", "-m", "AA"]).success();
work_dir.run_jj(["git", "push", "--allow-new"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm 3a44d6c5 (empty) AA
@origin: qpvuntsm 3a44d6c5 (empty) AA
[EOF]
");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "BB"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden 3a44d6c5 (empty) AA
[EOF]
");
let pre_push_opid = work_dir.current_operation_id();
work_dir.run_jj(["git", "push"]).success();
work_dir
.run_jj(["op", "restore", "--what=repo", &pre_push_opid])
.success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm d9a9f6a0 (empty) BB
@origin: qpvuntsm d9a9f6a0 (empty) BB
[EOF]
");
test_env.advance_test_rng_seed_to_multiple_of(100_000);
work_dir.run_jj(["describe", "-m", "CC"]).success();
work_dir.run_jj(["git", "fetch"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
main: qpvuntsm 1e742089 (empty) CC
@origin (ahead by 1 commits, behind by 1 commits): qpvuntsm hidden d9a9f6a0 (empty) BB
[EOF]
");
}
#[test]
fn test_bookmark_track_untrack_revert() {
let test_env = TestEnvironment::default();
test_env.add_config(r#"revset-aliases."immutable_heads()" = "none()""#);
let git_repo_path = test_env.env_root().join("git-repo");
git::init_bare(git_repo_path);
test_env
.run_jj_in(".", ["git", "clone", "git-repo", "repo"])
.success();
let work_dir = test_env.work_dir("repo");
work_dir.run_jj(["describe", "-mcommit"]).success();
work_dir
.run_jj(["bookmark", "create", "-r@", "feature1", "feature2"])
.success();
work_dir.run_jj(["git", "push", "--allow-new"]).success();
work_dir
.run_jj(["bookmark", "delete", "feature2"])
.success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
feature1: qpvuntsm bab5b5ef (empty) commit
@origin: qpvuntsm bab5b5ef (empty) commit
feature2 (deleted)
@origin: qpvuntsm bab5b5ef (empty) commit
[EOF]
");
work_dir
.run_jj(["bookmark", "untrack", "feature1@origin", "feature2@origin"])
.success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
feature1: qpvuntsm bab5b5ef (empty) commit
feature1@origin: qpvuntsm bab5b5ef (empty) commit
feature2@origin: qpvuntsm bab5b5ef (empty) commit
[EOF]
");
work_dir.run_jj(["op", "revert"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
feature1: qpvuntsm bab5b5ef (empty) commit
@origin: qpvuntsm bab5b5ef (empty) commit
feature2 (deleted)
@origin: qpvuntsm bab5b5ef (empty) commit
[EOF]
");
work_dir.run_jj(["op", "revert"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
feature1: qpvuntsm bab5b5ef (empty) commit
feature1@origin: qpvuntsm bab5b5ef (empty) commit
feature2@origin: qpvuntsm bab5b5ef (empty) commit
[EOF]
");
work_dir
.run_jj(["bookmark", "track", "feature1@origin"])
.success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
feature1: qpvuntsm bab5b5ef (empty) commit
@origin: qpvuntsm bab5b5ef (empty) commit
feature2@origin: qpvuntsm bab5b5ef (empty) commit
[EOF]
");
work_dir.run_jj(["op", "revert"]).success();
insta::assert_snapshot!(get_bookmark_output(&work_dir), @r"
feature1: qpvuntsm bab5b5ef (empty) commit
feature1@origin: qpvuntsm bab5b5ef (empty) commit
feature2@origin: qpvuntsm bab5b5ef (empty) commit
[EOF]
");
}
#[must_use]
fn get_bookmark_output(work_dir: &TestWorkDir) -> CommandOutput {
work_dir.run_jj(["bookmark", "list", "--all-remotes", "--quiet"])
}