-
-
Save mezis/1605647 to your computer and use it in GitHub Desktop.
#!/bin/sh | |
# | |
# ******************************************* | |
# WARNING: this does *not* handle 3-way merges properly. | |
# Anything modified on the local branch since the common base will get ignored. | |
# | |
# FOR ANYONE LANDING HERE: | |
# This script is now updated as part of the git-whistles gem. | |
# https://github.com/mezis/git-whistles | |
# ******************************************* | |
# | |
# Custom Git merge driver - merges PO files using msgcat(1) | |
# | |
# - Install gettext | |
# | |
# - Place this script in your PATH | |
# | |
# - Add this to your .git/config : | |
# | |
# [merge "pofile"] | |
# name = Gettext merge driver | |
# driver = git merge-po %O %A %B | |
# | |
# - Add this to .gitattributes : | |
# | |
# *.po merge=pofile | |
# *.pot merge=pofile | |
# | |
# - When merging branches, conflicts in PO files will be maked with "#-#-#-#" | |
# | |
O=$1 | |
A=$2 | |
B=$3 | |
# Extract the PO header from the current branch (top of file until first empty line) | |
header=$(mktemp /tmp/merge-po.XXXX) | |
sed -e '/^$/q' < $A > $header | |
# Merge files, then repair header | |
temp=$(mktemp /tmp/merge-po.XXXX) | |
msgcat -o $temp $A $B | |
msgcat --use-first -o $A $header $temp | |
# Clean up | |
rm $header $temp | |
# Check for conflicts | |
conflicts=$(grep -c "#-#" $A) | |
test $conflicts -gt 0 && exit 1 | |
exit 0 |
For anyone still interested, git-whistles
is getting a proper 3-way PO merger. Doesn't rely on Perl and string wrangling line the SO suggestions pointed to by @mikkorantalainen (which were a great source of inspiration).
Here's a link to 3-way merge for PO files that I currently use: https://stackoverflow.com/a/68799310/334451
It has some ideas from my older driver and some ideas that @mezis used and I partially re-wrote it to run on multiple CPU cores as much as possible. I've been using it for a couple of years without any invalid merges so I consider that the best solution until gettext includes proper 3-way merge one day.
@mikkorantalainen: I found this page by searching on how to build a custom git merge strategy. This is one of the only examples that shows how you can build one and integrate it into your project.
me too
@mikkorantalainen: I found this page by searching on how to build a custom git merge strategy. This is one of the only examples that shows how you can build one and integrate it into your project.