Skip to content

Commit e18b9e6

Browse files
feat(record)!: use default commit message for --stash
But only when no message is explicitly supplied. This is a breaking change. Previously, the user would be prompted for a message if none was supplied.
1 parent 260d5a6 commit e18b9e6

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

git-branchless-record/src/lib.rs

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ use lib::core::rewrite::{
3131
RepoResource,
3232
};
3333
use lib::git::{
34-
process_diff_for_record, update_index, CategorizedReferenceName, FileMode, GitRunInfo,
35-
MaybeZeroOid, NonZeroOid, Repo, ResolvedReferenceInfo, Stage, UpdateIndexCommand,
36-
WorkingCopyChangesType, WorkingCopySnapshot,
34+
process_diff_for_record, summarize_diff_for_temporary_commit, update_index,
35+
CategorizedReferenceName, FileMode, GitRunInfo, MaybeZeroOid, NonZeroOid, Repo,
36+
ResolvedReferenceInfo, Stage, UpdateIndexCommand, WorkingCopyChangesType, WorkingCopySnapshot,
3737
};
3838
use lib::try_exit_code;
3939
use lib::util::{ExitCode, EyreExitOr};
@@ -158,6 +158,12 @@ fn record(
158158
)?);
159159
}
160160
} else {
161+
let messages = if messages.is_empty() && stash {
162+
get_default_stash_message(&repo, effects, &snapshot, &working_copy_changes_type)
163+
.map(|message| vec![message])?
164+
} else {
165+
messages
166+
};
161167
let args = {
162168
let mut args = vec!["commit"];
163169
args.extend(messages.iter().flat_map(|message| ["--message", message]));
@@ -568,3 +574,42 @@ To proceed anyways, run: git move -f -s 'siblings(.)",
568574
ExecuteRebasePlanResult::Failed { exit_code } => Ok(Err(exit_code)),
569575
}
570576
}
577+
578+
#[instrument]
579+
fn get_default_stash_message(
580+
repo: &Repo,
581+
effects: &Effects,
582+
snapshot: &WorkingCopySnapshot,
583+
working_copy_changes_type: &WorkingCopyChangesType,
584+
) -> eyre::Result<String> {
585+
let (old_tree, new_tree) = match working_copy_changes_type {
586+
WorkingCopyChangesType::Unstaged => {
587+
let old_tree = snapshot.commit_stage0.get_tree()?;
588+
let new_tree = snapshot.commit_unstaged.get_tree()?;
589+
(Some(old_tree), new_tree)
590+
}
591+
WorkingCopyChangesType::Staged => {
592+
let old_tree = match snapshot.head_commit {
593+
None => None,
594+
Some(ref commit) => Some(commit.get_tree()?),
595+
};
596+
let new_tree = snapshot.commit_stage0.get_tree()?;
597+
(old_tree, new_tree)
598+
}
599+
WorkingCopyChangesType::None | WorkingCopyChangesType::Conflicts => {
600+
unreachable!("already handled via early exit")
601+
}
602+
};
603+
604+
let diff = repo.get_diff_between_trees(
605+
effects,
606+
old_tree.as_ref(),
607+
&new_tree,
608+
0, // we don't care about the context here
609+
)?;
610+
611+
Ok(format!(
612+
"stash: {}",
613+
summarize_diff_for_temporary_commit(&diff)?
614+
))
615+
}

git-branchless-record/tests/test_record.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,42 @@ fn test_record_stash() -> eyre::Result<()> {
342342
Ok(())
343343
}
344344

345+
#[test]
346+
fn test_record_stash_default_message() -> eyre::Result<()> {
347+
let git = make_git()?;
348+
349+
if !git.supports_reference_transactions()? {
350+
return Ok(());
351+
}
352+
git.init_repo()?;
353+
354+
git.commit_file("test1", 1)?;
355+
356+
{
357+
git.write_file_txt("test1", "new test1 contents\n")?;
358+
359+
let (stdout, _stderr) = git.branchless("record", &["--stash"])?;
360+
insta::assert_snapshot!(stdout, @r###"
361+
[master fd2ffa4] stash: test1.txt (+1/-1)
362+
1 file changed, 1 insertion(+), 1 deletion(-)
363+
branchless: running command: <git-executable> branch -f master 62fc20d2a290daea0d52bdc2ed2ad4be6491010e
364+
branchless: running command: <git-executable> checkout master
365+
"###);
366+
}
367+
368+
{
369+
let stdout = git.smartlog()?;
370+
insta::assert_snapshot!(stdout, @r###"
371+
:
372+
@ 62fc20d (> master) create test1.txt
373+
|
374+
o fd2ffa4 stash: test1.txt (+1/-1)
375+
"###);
376+
}
377+
378+
Ok(())
379+
}
380+
345381
#[test]
346382
fn test_record_create_branch() -> eyre::Result<()> {
347383
let git = make_git()?;

0 commit comments

Comments
 (0)