Skip to content

Commit 7d7eb8e

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 6ec7f67 commit 7d7eb8e

File tree

2 files changed

+74
-3
lines changed

2 files changed

+74
-3
lines changed

git-branchless-record/src/lib.rs

Lines changed: 38 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,41 @@ fn record(
158158
)?);
159159
}
160160
} else {
161+
let messages = if messages.is_empty() && stash {
162+
let diff_stats = {
163+
let (old_tree, new_tree) = match working_copy_changes_type {
164+
WorkingCopyChangesType::Unstaged => {
165+
let old_tree = snapshot.commit_stage0.get_tree()?;
166+
let new_tree = snapshot.commit_unstaged.get_tree()?;
167+
(Some(old_tree), new_tree)
168+
}
169+
WorkingCopyChangesType::Staged => {
170+
let old_tree = match snapshot.head_commit {
171+
None => None,
172+
Some(ref commit) => Some(commit.get_tree()?),
173+
};
174+
let new_tree = snapshot.commit_stage0.get_tree()?;
175+
(old_tree, new_tree)
176+
}
177+
WorkingCopyChangesType::None | WorkingCopyChangesType::Conflicts => {
178+
unreachable!("already handled via early exit")
179+
}
180+
};
181+
182+
let diff = repo.get_diff_between_trees(
183+
effects,
184+
old_tree.as_ref(),
185+
&new_tree,
186+
0, // we don't care about the context here
187+
)?;
188+
189+
summarize_diff_for_temporary_commit(&diff)?
190+
};
191+
192+
vec![format!("stash: {diff_stats}")]
193+
} else {
194+
messages
195+
};
161196
let args = {
162197
let mut args = vec!["commit"];
163198
args.extend(messages.iter().flat_map(|message| ["--message", message]));

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 4f8603e] stash: 1 file changed, 1 insertion(+), 1 deletion(-)
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 4f8603e stash: 1 file changed, 1 insertion(+), 1 deletion(-)
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)