use std::collections::HashMap; use lib::testing::{make_git, GitRunOptions, GitWrapper}; fn mock_env(git: &GitWrapper) -> HashMap { git.get_base_env(0) .into_iter() .map(|(k, v)| { ( k.to_str().unwrap().to_string(), v.to_str().unwrap().to_string(), ) }) .chain([( git_branchless_submit::phabricator::SHOULD_MOCK_ENV_KEY.to_string(), "1".to_string(), )]) .collect() } #[test] fn test_submit_phabricator_strategy_working_copy() -> eyre::Result<()> { let git = make_git()?; git.init_repo()?; git.detach_head()?; git.commit_file("test1", 1)?; git.commit_file("test2", 2)?; git.write_file_txt("test1", "uncommitted changes\n")?; { let (stdout, stderr) = git.branchless_with_options( "submit", &["--create", "--forge", "phabricator"], &GitRunOptions { expected_exit_code: 1, ..Default::default() }, )?; insta::assert_snapshot!(stderr, @""); insta::assert_snapshot!(stdout, @r###" branchless: running command: diff --quiet This operation would modify the working copy, but you have uncommitted changes in your working copy which might be overwritten as a result. Commit your changes and then try again. "###); } git.run(&["checkout", "--", "."])?; { let (stdout, _stderr) = git.branchless_with_options( "submit", &["--create", "--forge", "phabricator"], &GitRunOptions { env: mock_env(&git), ..Default::default() }, )?; insta::assert_snapshot!(stdout, @r###" branchless: running command: diff --quiet Calling Git for on-disk rebase... branchless: running command: rebase --continue Using command execution strategy: working-copy branchless: running command: rebase --abort Attempting rebase in-memory... [1/2] Committed as: 55af3db create test1.txt [2/2] Committed as: ccb7fd5 create test2.txt branchless: processing 2 rewritten commits branchless: running command: checkout ccb7fd5d90c1888bea906a41c197e9215d6b9bb3 In-memory rebase succeeded. Setting D0002 as stack root (no dependencies) Stacking D0003 on top of D0002 branchless: running command: diff --quiet Calling Git for on-disk rebase... branchless: running command: rebase --continue Using command execution strategy: working-copy branchless: running command: rebase --abort Submitted 2 commits: D0002, D0003 "###); } { let stdout = git.smartlog()?; insta::assert_snapshot!(stdout, @r###" O f777ecc (master) create initial.txt | o 55af3db D0002 create test1.txt | @ ccb7fd5 D0003 create test2.txt "###); } Ok(()) } #[test] fn test_submit_phabricator_strategy_worktree() -> eyre::Result<()> { let git = make_git()?; if !git.supports_reference_transactions()? { return Ok(()); } git.init_repo()?; git.detach_head()?; git.commit_file("test1", 1)?; git.commit_file("test2", 2)?; { let stdout = git.smartlog()?; insta::assert_snapshot!(stdout, @r###" O f777ecc (master) create initial.txt | o 62fc20d create test1.txt | @ 96d1c37 create test2.txt "###); } { let (stdout, stderr) = git.branchless_with_options( "submit", &[ "--create", "--forge", "phabricator", "--strategy", "worktree", ], &GitRunOptions { env: mock_env(&git), ..Default::default() }, )?; insta::assert_snapshot!(stderr, @r###" branchless: creating working copy snapshot Previous HEAD position was 96d1c37 create test2.txt branchless: processing 1 update: ref HEAD HEAD is now at ccb7fd5 create test2.txt branchless: processing checkout "###); insta::assert_snapshot!(stdout, @r###" Using command execution strategy: worktree Attempting rebase in-memory... [1/2] Committed as: 55af3db create test1.txt [2/2] Committed as: ccb7fd5 create test2.txt branchless: processing 2 rewritten commits branchless: running command: checkout ccb7fd5d90c1888bea906a41c197e9215d6b9bb3 In-memory rebase succeeded. Setting D0002 as stack root (no dependencies) Stacking D0003 on top of D0002 Using command execution strategy: worktree Submitted 2 commits: D0002, D0003 "###); } { let stdout = git.smartlog()?; insta::assert_snapshot!(stdout, @r###" O f777ecc (master) create initial.txt | o 55af3db D0002 create test1.txt | @ ccb7fd5 D0003 create test2.txt "###); } Ok(()) } #[test] fn test_submit_phabricator_update() -> eyre::Result<()> { let git = make_git()?; git.init_repo()?; git.detach_head()?; git.commit_file("test1", 1)?; git.commit_file("test2", 2)?; { let (stdout, _stderr) = git.branchless_with_options( "submit", &["--create", "--forge", "phabricator"], &GitRunOptions { env: mock_env(&git), ..Default::default() }, )?; insta::assert_snapshot!(stdout, @r###" branchless: running command: diff --quiet Calling Git for on-disk rebase... branchless: running command: rebase --continue Using command execution strategy: working-copy branchless: running command: rebase --abort Attempting rebase in-memory... [1/2] Committed as: 55af3db create test1.txt [2/2] Committed as: ccb7fd5 create test2.txt branchless: processing 2 rewritten commits branchless: running command: checkout ccb7fd5d90c1888bea906a41c197e9215d6b9bb3 In-memory rebase succeeded. Setting D0002 as stack root (no dependencies) Stacking D0003 on top of D0002 branchless: running command: diff --quiet Calling Git for on-disk rebase... branchless: running command: rebase --continue Using command execution strategy: working-copy branchless: running command: rebase --abort Submitted 2 commits: D0002, D0003 "###); } { let (stdout, _stderr) = git.branchless_with_options( "submit", &["--forge", "phabricator"], &GitRunOptions { env: mock_env(&git), ..Default::default() }, )?; insta::assert_snapshot!(stdout, @r###" branchless: running command: diff --quiet Calling Git for on-disk rebase... branchless: running command: rebase --continue Using command execution strategy: working-copy branchless: running command: rebase --abort Setting D0002 as stack root (no dependencies) Stacking D0003 on top of D0002 "###); } Ok(()) }