Skip to content

Commit a181e74

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 c6628ff commit a181e74

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

git-branchless-lib/src/git/diff.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ pub struct Diff<'repo> {
1515
pub(super) inner: git2::Diff<'repo>,
1616
}
1717

18+
impl Diff<'_> {
19+
/// TODO
20+
pub fn short_stats(&self) -> eyre::Result<String> {
21+
let stats = self.inner.stats()?;
22+
let buf = stats.to_buf(git2::DiffStatsFormat::SHORT, usize::MAX)?;
23+
Ok(buf.as_str().expect("TODO").trim().to_string())
24+
}
25+
}
26+
1827
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1928
struct GitHunk {
2029
old_start: usize,

git-branchless-record/src/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,42 @@ fn record(
157157
)?);
158158
}
159159
} else {
160+
let messages = if messages.is_empty() && stash {
161+
let diff_stats = {
162+
let (old_tree, new_tree) = match working_copy_changes_type {
163+
WorkingCopyChangesType::Unstaged => {
164+
let old_tree = snapshot.commit_stage0.get_tree()?;
165+
let new_tree = snapshot.commit_unstaged.get_tree()?;
166+
(Some(old_tree), new_tree)
167+
}
168+
WorkingCopyChangesType::Staged => {
169+
let old_tree = match snapshot.head_commit {
170+
None => None,
171+
Some(ref commit) => Some(commit.get_tree()?),
172+
};
173+
let new_tree = snapshot.commit_stage0.get_tree()?;
174+
(old_tree, new_tree)
175+
}
176+
WorkingCopyChangesType::None | WorkingCopyChangesType::Conflicts => {
177+
unreachable!("already handled via early exit")
178+
}
179+
};
180+
181+
let (effects, _progress) = effects.start_operation(OperationType::CalculateDiff);
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+
diff.short_stats()?
190+
};
191+
192+
vec![format!("stash: {diff_stats}")]
193+
} else {
194+
messages
195+
};
160196
let args = {
161197
let mut args = vec!["commit"];
162198
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)