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 <gwymor@tilde.club>
Signed-off-by: Elijah Newren <newren@gmail.com>
pull/305/head
Gwyneth Morgan 3 years ago committed by Elijah Newren
parent c5af37f82c
commit 129a3bcb8b

@ -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
@ -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
~~~~~~~~~~~~~~~~~~~~~~~

@ -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 "
@ -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())
@ -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)
@ -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)

@ -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

@ -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 <me@little.net> 1535228562 -0700
committer Little O. Me <me@little.net> 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 <me@machine52.little.net> 1535229523 -0700
committer Little O. Me <me@machine52.little.net> 1535229523 -0700
data 8
add ten
from :2
M 100644 :5 ten
commit refs/heads/master
mark :7
author Lit.e Me <me@fire.com> 1535229559 -0700
committer Lit.e Me <me@fire.com> 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 <me@bigcompany.com> 1535229601 -0700
committer Little Me <me@bigcompany.com> 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 <second@merry.men> 1535229618 -0700
data 15
version one :)
done

@ -0,0 +1,4 @@
Initial==>Modified
regex:tw.nty==>the number 20
v1.0==>version one!
regex:!$==> :)
Loading…
Cancel
Save