Skip to content

Commit 129a3bc

Browse files
gwymornewren
authored andcommitted
filter-repo: add new --replace-message option
Like --replace-text, add an option --replace-message which replaces text in commit/tag message bodies, so that users can easily replace text without constructing a --message-callback. Signed-off-by: Gwyneth Morgan <[email protected]> Signed-off-by: Elijah Newren <[email protected]>
1 parent c5af37f commit 129a3bc

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

Documentation/git-filter-repo.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ Renaming of refs (see also --refname-callback)
181181
Filtering of commit messages (see also --message-callback)
182182
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183183

184+
--replace-message <expressions_file>::
185+
A file with expressions that, if found in commit or tag
186+
messages, will be replaced. This file uses the same syntax as
187+
--replace-text.
188+
184189
--preserve-commit-hashes::
185190
By default, since commits are rewritten and thus gain new
186191
hashes, references to old commit hashes in commit messages are
@@ -896,6 +901,26 @@ YYYY-MM-DD. In the expressions file, there are a few things to note:
896901

897902
See also the `--blob-callback` from <<CALLBACKS>>.
898903

904+
Updating commit/tag messages
905+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
906+
907+
If you want to modify commit or tag messages, you can do so with the
908+
same syntax as `--replace-text`, explained above. For example, with a
909+
file named expressions.txt containing
910+
911+
--------------------------------------------------
912+
foo==>bar
913+
--------------------------------------------------
914+
915+
then running
916+
--------------------------------------------------
917+
git filter-repo --replace-message expressions.txt
918+
--------------------------------------------------
919+
920+
will replace `foo` in commit or tag messages with `bar`.
921+
922+
See also the `--message-callback` from <<CALLBACKS>>.
923+
899924
Refname based filtering
900925
~~~~~~~~~~~~~~~~~~~~~~~
901926

git-filter-repo

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,6 +1843,10 @@ EXAMPLES
18431843

18441844
messages = parser.add_argument_group(title=_("Filtering of commit messages "
18451845
"(see also --message-callback)"))
1846+
messages.add_argument('--replace-message', metavar='EXPRESSIONS_FILE',
1847+
help=_("A file with expressions that, if found in commit messages, "
1848+
"will be replaced. This file uses the same syntax as "
1849+
"--replace-text."))
18461850
messages.add_argument('--preserve-commit-hashes', action='store_true',
18471851
help=_("By default, since commits are rewritten and thus gain new "
18481852
"hashes, references to old commit hashes in commit messages "
@@ -2189,6 +2193,8 @@ EXAMPLES
21892193
args.mailmap = MailmapInfo(args.mailmap)
21902194
if args.replace_text:
21912195
args.replace_text = FilteringOptions.get_replace_text(args.replace_text)
2196+
if args.replace_message:
2197+
args.replace_message = FilteringOptions.get_replace_text(args.replace_message)
21922198
if args.strip_blobs_with_ids:
21932199
with open(args.strip_blobs_with_ids, 'br') as f:
21942200
args.strip_blobs_with_ids = set(f.read().split())
@@ -3374,6 +3380,11 @@ class RepoFilter(object):
33743380
if not self._args.preserve_commit_hashes:
33753381
commit.message = self._hash_re.sub(self._translate_commit_hash,
33763382
commit.message)
3383+
if self._args.replace_message:
3384+
for literal, replacement in self._args.replace_message['literals']:
3385+
commit.message = commit.message.replace(literal, replacement)
3386+
for regex, replacement in self._args.replace_message['regexes']:
3387+
commit.message = regex.sub(replacement, commit.message)
33773388
if self._message_callback:
33783389
commit.message = self._message_callback(commit.message)
33793390

@@ -3474,6 +3485,11 @@ class RepoFilter(object):
34743485

34753486
def _tweak_tag(self, tag):
34763487
# Tweak the tag message according to callbacks
3488+
if self._args.replace_message:
3489+
for literal, replacement in self._args.replace_message['literals']:
3490+
tag.message = tag.message.replace(literal, replacement)
3491+
for regex, replacement in self._args.replace_message['regexes']:
3492+
tag.message = regex.sub(replacement, tag.message)
34773493
if self._message_callback:
34783494
tag.message = self._message_callback(tag.message)
34793495

t/t9390-filter-repo.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ filter_testcase basic basic-filename --invert-paths --path-glob 't*en*'
3939
filter_testcase basic basic-numbers --invert-paths --path-regex 'f.*e.*e'
4040
filter_testcase basic basic-mailmap --mailmap ../t9390/sample-mailmap
4141
filter_testcase basic basic-replace --replace-text ../t9390/sample-replace
42+
filter_testcase basic basic-message --replace-message ../t9390/sample-message
4243
filter_testcase empty empty-keepme --path keepme
4344
filter_testcase empty more-empty-keepme --path keepme --prune-empty=always \
4445
--prune-degenerate=always

t/t9390/basic-message

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
feature done
2+
blob
3+
mark :1
4+
data 8
5+
initial
6+
7+
reset refs/heads/B
8+
commit refs/heads/B
9+
mark :2
10+
author Little O. Me <[email protected]> 1535228562 -0700
11+
committer Little O. Me <[email protected]> 1535228562 -0700
12+
data 9
13+
Modified
14+
M 100644 :1 filename
15+
M 100644 :1 ten
16+
M 100644 :1 twenty
17+
18+
blob
19+
mark :3
20+
data 11
21+
twenty-mod
22+
23+
commit refs/heads/B
24+
mark :4
25+
author Little 'ol Me <me@laptop.(none)> 1535229544 -0700
26+
committer Little 'ol Me <me@laptop.(none)> 1535229544 -0700
27+
data 18
28+
add the number 20
29+
from :2
30+
M 100644 :3 twenty
31+
32+
blob
33+
mark :5
34+
data 8
35+
ten-mod
36+
37+
commit refs/heads/A
38+
mark :6
39+
author Little O. Me <[email protected]> 1535229523 -0700
40+
committer Little O. Me <[email protected]> 1535229523 -0700
41+
data 8
42+
add ten
43+
from :2
44+
M 100644 :5 ten
45+
46+
commit refs/heads/master
47+
mark :7
48+
author Lit.e Me <[email protected]> 1535229559 -0700
49+
committer Lit.e Me <[email protected]> 1535229580 -0700
50+
data 24
51+
Merge branch 'A' into B
52+
from :4
53+
merge :6
54+
M 100644 :5 ten
55+
56+
blob
57+
mark :8
58+
data 6
59+
final
60+
61+
commit refs/heads/master
62+
mark :9
63+
author Little Me <[email protected]> 1535229601 -0700
64+
committer Little Me <[email protected]> 1535229601 -0700
65+
data 9
66+
whatever
67+
from :7
68+
M 100644 :8 filename
69+
M 100644 :8 ten
70+
M 100644 :8 twenty
71+
72+
tag v1.0
73+
from :9
74+
tagger Little John <[email protected]> 1535229618 -0700
75+
data 15
76+
version one :)
77+
78+
done

t/t9390/sample-message

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Initial==>Modified
2+
regex:tw.nty==>the number 20
3+
v1.0==>version one!
4+
regex:!$==> :)

0 commit comments

Comments
 (0)