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) 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:: --preserve-commit-hashes::
By default, since commits are rewritten and thus gain new By default, since commits are rewritten and thus gain new
hashes, references to old commit hashes in commit messages are 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>>. 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 Refname based filtering
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~

@ -1843,6 +1843,10 @@ EXAMPLES
messages = parser.add_argument_group(title=_("Filtering of commit messages " messages = parser.add_argument_group(title=_("Filtering of commit messages "
"(see also --message-callback)")) "(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', messages.add_argument('--preserve-commit-hashes', action='store_true',
help=_("By default, since commits are rewritten and thus gain new " help=_("By default, since commits are rewritten and thus gain new "
"hashes, references to old commit hashes in commit messages " "hashes, references to old commit hashes in commit messages "
@ -2189,6 +2193,8 @@ EXAMPLES
args.mailmap = MailmapInfo(args.mailmap) args.mailmap = MailmapInfo(args.mailmap)
if args.replace_text: if args.replace_text:
args.replace_text = FilteringOptions.get_replace_text(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: if args.strip_blobs_with_ids:
with open(args.strip_blobs_with_ids, 'br') as f: with open(args.strip_blobs_with_ids, 'br') as f:
args.strip_blobs_with_ids = set(f.read().split()) args.strip_blobs_with_ids = set(f.read().split())
@ -3374,6 +3380,11 @@ class RepoFilter(object):
if not self._args.preserve_commit_hashes: if not self._args.preserve_commit_hashes:
commit.message = self._hash_re.sub(self._translate_commit_hash, commit.message = self._hash_re.sub(self._translate_commit_hash,
commit.message) 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: if self._message_callback:
commit.message = self._message_callback(commit.message) commit.message = self._message_callback(commit.message)
@ -3474,6 +3485,11 @@ class RepoFilter(object):
def _tweak_tag(self, tag): def _tweak_tag(self, tag):
# Tweak the tag message according to callbacks # 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: if self._message_callback:
tag.message = self._message_callback(tag.message) 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-numbers --invert-paths --path-regex 'f.*e.*e'
filter_testcase basic basic-mailmap --mailmap ../t9390/sample-mailmap filter_testcase basic basic-mailmap --mailmap ../t9390/sample-mailmap
filter_testcase basic basic-replace --replace-text ../t9390/sample-replace 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 empty-keepme --path keepme
filter_testcase empty more-empty-keepme --path keepme --prune-empty=always \ filter_testcase empty more-empty-keepme --path keepme --prune-empty=always \
--prune-degenerate=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