Skip to content

Commit 160f097

Browse files
Add support to read list of refs for squash from a file (#1107)
Change: squash-file
1 parent 42e5064 commit 160f097

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

src/bin/josh-filter.rs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,14 @@ fn make_app() -> clap::Command {
3535
.default_value("FILTERED_HEAD"),
3636
)
3737
.arg(
38-
clap::Arg::new("squash")
38+
clap::Arg::new("squash-pattern")
3939
.help("Produce a history that contains only commits pointed to by references matching the given pattern")
40-
.long("squash")
40+
.long("squash-pattern")
41+
)
42+
.arg(
43+
clap::Arg::new("squash-file")
44+
.help("Produce a history that contains only commits listed in the given file")
45+
.long("squash-file")
4146
)
4247
.arg(
4348
clap::Arg::new("author")
@@ -172,7 +177,7 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
172177
filterobj = josh::filter::chain(josh::filter::squash(None), filterobj);
173178
}
174179

175-
if let Some(pattern) = args.get_one::<String>("squash") {
180+
if let Some(pattern) = args.get_one::<String>("squash-pattern") {
176181
let pattern = pattern.to_string();
177182
for reference in repo.references_glob(&pattern).unwrap() {
178183
let reference = reference?;
@@ -183,6 +188,23 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
183188
filterobj = josh::filter::chain(josh::filter::squash(Some(&ids)), filterobj);
184189
};
185190

191+
if let Some(filename) = args.get_one::<String>("squash-file") {
192+
let reflist = read_to_string(filename)?;
193+
194+
for line in reflist.lines() {
195+
let split = line.split(" ").collect::<Vec<_>>();
196+
if let [sha, name] = split.as_slice() {
197+
let target = git2::Oid::from_str(sha)?;
198+
let target = repo.find_object(target, None)?.peel_to_commit()?.id();
199+
ids.push((target, name.to_string()));
200+
refs.push((name.to_string(), target));
201+
} else if split.len() != 0 {
202+
eprintln!("Warning: malformed line: {:?}", line);
203+
}
204+
}
205+
filterobj = josh::filter::chain(josh::filter::squash(Some(&ids)), filterobj);
206+
};
207+
186208
if args.get_flag("print-filter") {
187209
let filterobj = if args.get_flag("reverse") {
188210
josh::filter::invert(filterobj)?

tests/filter/squash.t

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
$ git merge -q branch2 --no-ff
3030

31-
$ josh-filter -s --squash "refs/tags/*" --author "New Author" --email "new@e.mail" --update refs/heads/filtered
31+
$ josh-filter -s --squash-pattern "refs/tags/*" --author "New Author" --email "new@e.mail" --update refs/heads/filtered
3232
Warning: reference refs/heads/filtered wasn't updated
3333
[1] :squash(
3434

@@ -42,7 +42,7 @@
4242

4343
This one tag is an annotated tag, to make sure those are handled as well
4444
$ git tag -a tag_a -m "created a tag" 1d69b7d
45-
$ josh-filter -s --squash "refs/tags/*" :author=\"New\ Author\"\;\"new@e.mail\" --update refs/heads/filtered
45+
$ josh-filter -s --squash-pattern "refs/tags/*" :author=\"New\ Author\"\;\"new@e.mail\" --update refs/heads/filtered
4646
[1] :author="New Author";"new@e.mail"
4747
[1] :squash(
4848
@@ -65,7 +65,7 @@ This one tag is an annotated tag, to make sure those are handled as well
6565
|/
6666
* 0b4cf6c9efbbda1eada39fa9c1d21d2525b027bb (tag: tag_b) add file1
6767
68-
$ josh-filter -s --squash "refs/tags/*" :author=\"New\ Author\"\;\"new@e.mail\" --update refs/heads/filtered
68+
$ josh-filter -s --squash-pattern "refs/tags/*" :author=\"New\ Author\"\;\"new@e.mail\" --update refs/heads/filtered
6969
[1] :squash(
7070
7171
)
@@ -99,7 +99,20 @@ This one tag is an annotated tag, to make sure those are handled as well
9999
100100
$ git tag tag_c 975d4c4
101101
102-
$ josh-filter -s --squash "refs/tags/*" :author=\"New\ Author\"\;\"new@e.mail\" --update refs/heads/filtered -p > filter.josh
102+
$ git show-ref | grep refs/heads > squashlist
103+
$ cat squashlist
104+
86871b8775ad3baca86484337d1072aa1d386f7e refs/heads/branch2
105+
5b1a753860ca124024f6dfb4fd018fe7df8beae4 refs/heads/filtered
106+
1d69b7d2651f744be3416f2ad526aeccefb99310 refs/heads/master
107+
$ josh-filter -s --squash-file squashlist :author=\"John\ Doe\"\;\"new@e.mail\" --update refs/heads/filtered -p > filter.josh
108+
$ cat filter.josh
109+
:squash(
110+
1d69b7d2651f744be3416f2ad526aeccefb99310:"refs/heads/master"
111+
5b1a753860ca124024f6dfb4fd018fe7df8beae4:"refs/heads/filtered"
112+
86871b8775ad3baca86484337d1072aa1d386f7e:"refs/heads/branch2"
113+
):author="John Doe";"new@e.mail"
114+
115+
$ josh-filter -s --squash-pattern "refs/tags/*" :author=\"New\ Author\"\;\"new@e.mail\" --update refs/heads/filtered -p > filter.josh
103116
$ cat filter.josh
104117
:squash(
105118
0b4cf6c9efbbda1eada39fa9c1d21d2525b027bb:"refs/tags/tag_b"

0 commit comments

Comments
 (0)