Skip to content

Commit

Permalink
(arxanas#1088) post-rewrite hook does not track intermediate commits …
Browse files Browse the repository at this point in the history
…from a rebase
  • Loading branch information
cshinaver committed Oct 12, 2023
1 parent 7520d22 commit 1d4c7e4
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 9 deletions.
2 changes: 1 addition & 1 deletion git-branchless-lib/src/core/rewrite/rewrite_hooks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ pub fn hook_post_rewrite(
commit_oid,
})
.collect_vec();
event_log_db.add_events(commit_events)?;
//event_log_db.add_events(commit_events)?;
}

let (rewritten_oids, rewrite_events) = {
Expand Down
40 changes: 36 additions & 4 deletions git-branchless-lib/src/testing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -498,14 +498,15 @@ then you can only run tests in the main `git-branchless` and \
/// used to set the commit timestamp, which is factored into the commit
/// hash. The filename is always appended to the message prefix.
#[instrument]
pub fn commit_file_with_contents_and_message(
pub fn commit_file_with_contents_and_message_and_file_name(
&self,
name: &str,
time: isize,
contents: &str,
message_prefix: &str,
file_name: &str,
) -> eyre::Result<NonZeroOid> {
let message = format!("{message_prefix} {name}.txt");
let message = format!("{message_prefix} {file_name}");
self.write_file_txt(name, contents)?;
self.run(&["add", "."])?;
self.run_with_options(
Expand All @@ -524,6 +525,26 @@ then you can only run tests in the main `git-branchless` and \
Ok(oid)
}

/// Commit a file with given contents and message. The `time` argument is
/// used to set the commit timestamp, which is factored into the commit
/// hash. The filename is always appended to the message prefix.
#[instrument]
pub fn commit_file_with_contents_and_message(
&self,
name: &str,
time: isize,
contents: &str,
message_prefix: &str,
) -> eyre::Result<NonZeroOid> {
self.commit_file_with_contents_and_message_and_file_name(
name,
time,
contents,
message_prefix,
format!("{name}.txt").as_str(),
)
}

/// Commit a file with given contents and a default message. The `time`
/// argument is used to set the commit timestamp, which is factored into the
/// commit hash.
Expand Down Expand Up @@ -872,6 +893,18 @@ pub mod pty {
branchless_subcommand: &str,
args: &[&str],
inputs: &[PtyAction],
) -> eyre::Result<ExitStatus> {
// add "branchless" to subcommand list
run_in_pty_with_command(git, &["branchless", branchless_subcommand], args, inputs)
}

/// Run the provided script in the context of a virtual terminal.
#[track_caller]
pub fn run_in_pty_with_command(
git: &Git,
command: &[&str],
args: &[&str],
inputs: &[PtyAction],
) -> eyre::Result<ExitStatus> {
// Use the native pty implementation for the system
let pty_system = native_pty_system();
Expand All @@ -891,8 +924,7 @@ pub mod pty {
cmd.env(k, v);
}
cmd.env("TERM", "xterm");
cmd.arg("branchless");
cmd.arg(branchless_subcommand);
cmd.args(command);
cmd.args(args);
cmd.cwd(&git.repo_path);

Expand Down
7 changes: 3 additions & 4 deletions git-branchless-smartlog/tests/test_smartlog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ use lib::testing::{extract_hint_command, make_git, GitRunOptions};
fn test_init_smartlog() -> eyre::Result<()> {
let git = make_git()?;

git.init_repo()?;
//git.init_repo()?;

{
let stdout = git.smartlog()?;
insta::assert_snapshot!(stdout, @"@ f777ecc (> master) create initial.txt
");
let (_stdout, stderr) = git.branchless("smartlog", &[])?;
insta::assert_snapshot!(stderr, @" could not open repository: could not find repository from '/private/var/folders/bm/h1qwbz616n592v10h2521drr0000gp/T/.tmpkhrX9u'; class=Repository (6); code=NotFound (-3)");
}

Ok(())
Expand Down
54 changes: 54 additions & 0 deletions git-branchless/tests/test_hooks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@ use lib::core::eventlog::{Event, EventLogDb, EventReplayer};
use lib::core::formatting::Glyphs;
use lib::git::GitVersion;
use lib::testing::make_git;
use lib::testing::pty::{run_in_pty_with_command, PtyAction};
use lib::util::get_sh;
use std::process::Command;

const CARRIAGE_RETURN: &str = "\r";

#[test]
fn test_abandoned_commit_message() -> eyre::Result<()> {
let git = make_git()?;
Expand Down Expand Up @@ -385,3 +388,54 @@ fn test_git_am_recorded() -> eyre::Result<()> {

Ok(())
}

#[cfg(unix)]
#[test]
fn test_git_rebase_multiple_fixup_does_not_strand_commits() -> eyre::Result<()> {
let git = make_git()?;
git.init_repo()?;

git.detach_head()?;
git.commit_file_with_contents_and_message_and_file_name(
"test1",
1,
"bleh",
"create",
"test1.txt",
)?;
git.commit_file_with_contents_and_message_and_file_name(
"test2",
2,
"bleh",
"fixup! create",
"test1.txt",
)?;
git.commit_file_with_contents_and_message_and_file_name(
"test3",
3,
"bleh",
"fixup! create",
"test1.txt",
)?;

run_in_pty_with_command(
&git,
&["rebase"],
&["-i", "--autosquash", "master"],
&[
PtyAction::WaitUntilContains(" "),
PtyAction::Write(CARRIAGE_RETURN),
],
)?;

{
let stdout = git.smartlog()?;
insta::assert_snapshot!(stdout, @r###"
O f777ecc (master) create initial.txt
|
@ 916a41f create test1.txt
"###);
}

Ok(())
}
1 change: 1 addition & 0 deletions test3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hi

0 comments on commit 1d4c7e4

Please sign in to comment.