Skip to content

Commit

Permalink
filter-repo: add new --replace-message option
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
gwymor authored and newren committed Aug 25, 2021
1 parent c5af37f commit 129a3bc
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 0 deletions.
25 changes: 25 additions & 0 deletions Documentation/git-filter-repo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,11 @@ Renaming of refs (see also --refname-callback)
Filtering of commit messages (see also --message-callback)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--replace-message <expressions_file>::
A file with expressions that, if found in commit or tag
messages, will be replaced. This file uses the same syntax as
--replace-text.

--preserve-commit-hashes::
By default, since commits are rewritten and thus gain new
hashes, references to old commit hashes in commit messages are
Expand Down Expand Up @@ -896,6 +901,26 @@ YYYY-MM-DD. In the expressions file, there are a few things to note:

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

Updating commit/tag messages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you want to modify commit or tag messages, you can do so with the
same syntax as `--replace-text`, explained above. For example, with a
file named expressions.txt containing

--------------------------------------------------
foo==>bar
--------------------------------------------------

then running
--------------------------------------------------
git filter-repo --replace-message expressions.txt
--------------------------------------------------

will replace `foo` in commit or tag messages with `bar`.

See also the `--message-callback` from <<CALLBACKS>>.

Refname based filtering
~~~~~~~~~~~~~~~~~~~~~~~

Expand Down
16 changes: 16 additions & 0 deletions git-filter-repo
Original file line number Diff line number Diff line change
Expand Up @@ -1843,6 +1843,10 @@ EXAMPLES

messages = parser.add_argument_group(title=_("Filtering of commit messages "
"(see also --message-callback)"))
messages.add_argument('--replace-message', metavar='EXPRESSIONS_FILE',
help=_("A file with expressions that, if found in commit messages, "
"will be replaced. This file uses the same syntax as "
"--replace-text."))
messages.add_argument('--preserve-commit-hashes', action='store_true',
help=_("By default, since commits are rewritten and thus gain new "
"hashes, references to old commit hashes in commit messages "
Expand Down Expand Up @@ -2189,6 +2193,8 @@ EXAMPLES
args.mailmap = MailmapInfo(args.mailmap)
if args.replace_text:
args.replace_text = FilteringOptions.get_replace_text(args.replace_text)
if args.replace_message:
args.replace_message = FilteringOptions.get_replace_text(args.replace_message)
if args.strip_blobs_with_ids:
with open(args.strip_blobs_with_ids, 'br') as f:
args.strip_blobs_with_ids = set(f.read().split())
Expand Down Expand Up @@ -3374,6 +3380,11 @@ class RepoFilter(object):
if not self._args.preserve_commit_hashes:
commit.message = self._hash_re.sub(self._translate_commit_hash,
commit.message)
if self._args.replace_message:
for literal, replacement in self._args.replace_message['literals']:
commit.message = commit.message.replace(literal, replacement)
for regex, replacement in self._args.replace_message['regexes']:
commit.message = regex.sub(replacement, commit.message)
if self._message_callback:
commit.message = self._message_callback(commit.message)

Expand Down Expand Up @@ -3474,6 +3485,11 @@ class RepoFilter(object):

def _tweak_tag(self, tag):
# Tweak the tag message according to callbacks
if self._args.replace_message:
for literal, replacement in self._args.replace_message['literals']:
tag.message = tag.message.replace(literal, replacement)
for regex, replacement in self._args.replace_message['regexes']:
tag.message = regex.sub(replacement, tag.message)
if self._message_callback:
tag.message = self._message_callback(tag.message)

Expand Down
1 change: 1 addition & 0 deletions t/t9390-filter-repo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ filter_testcase basic basic-filename --invert-paths --path-glob 't*en*'
filter_testcase basic basic-numbers --invert-paths --path-regex 'f.*e.*e'
filter_testcase basic basic-mailmap --mailmap ../t9390/sample-mailmap
filter_testcase basic basic-replace --replace-text ../t9390/sample-replace
filter_testcase basic basic-message --replace-message ../t9390/sample-message
filter_testcase empty empty-keepme --path keepme
filter_testcase empty more-empty-keepme --path keepme --prune-empty=always \
--prune-degenerate=always
Expand Down
78 changes: 78 additions & 0 deletions t/t9390/basic-message
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
feature done
blob
mark :1
data 8
initial

reset refs/heads/B
commit refs/heads/B
mark :2
author Little O. Me <[email protected]> 1535228562 -0700
committer Little O. Me <[email protected]> 1535228562 -0700
data 9
Modified
M 100644 :1 filename
M 100644 :1 ten
M 100644 :1 twenty

blob
mark :3
data 11
twenty-mod

commit refs/heads/B
mark :4
author Little 'ol Me <me@laptop.(none)> 1535229544 -0700
committer Little 'ol Me <me@laptop.(none)> 1535229544 -0700
data 18
add the number 20
from :2
M 100644 :3 twenty

blob
mark :5
data 8
ten-mod

commit refs/heads/A
mark :6
author Little O. Me <[email protected]> 1535229523 -0700
committer Little O. Me <[email protected]> 1535229523 -0700
data 8
add ten
from :2
M 100644 :5 ten

commit refs/heads/master
mark :7
author Lit.e Me <[email protected]> 1535229559 -0700
committer Lit.e Me <[email protected]> 1535229580 -0700
data 24
Merge branch 'A' into B
from :4
merge :6
M 100644 :5 ten

blob
mark :8
data 6
final

commit refs/heads/master
mark :9
author Little Me <[email protected]> 1535229601 -0700
committer Little Me <[email protected]> 1535229601 -0700
data 9
whatever
from :7
M 100644 :8 filename
M 100644 :8 ten
M 100644 :8 twenty

tag v1.0
from :9
tagger Little John <[email protected]> 1535229618 -0700
data 15
version one :)

done
4 changes: 4 additions & 0 deletions t/t9390/sample-message
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Initial==>Modified
regex:tw.nty==>the number 20
v1.0==>version one!
regex:!$==> :)

0 comments on commit 129a3bc

Please sign in to comment.