'git am --scissors' allows cutting a patch from an email at a scissors
line.  Such a line should contain perforation, i.e. hyphens, and a
scissors symbol.  Only ASCII graphics scissors '8<' '>8' '%<' '>%' are
recognized by 'git am --scissors' command at the moment.

Unicode character 'BLACK SCISSORS' (U+2702) has been a part of Unicode
since version 1.0.0 [1].  Since then 'BLACK SCISSORS' also became part
of character set Emoji 1.0, published in 2015 [2].  With its adoption as
an emoji, availability of this character on keyboards has increased.

Support UTF-8 encoding of '✂' in function is_scissors_line, for 'git am
--scissors' to be able to cut at Unicode perforation lines in emails.
Note, that Unicode character '✂' is three bytes in UTF-8 encoding.

1. https://www.unicode.org/versions/Unicode1.0.0/CodeCharts1.pdf
   https://www.unicode.org/Public/reconstructed/1.0.0/UnicodeData.txt
2. https://unicode.org/Public/emoji/1.0/emoji-data.txt

Signed-off-by: Andrei Rybak <rybak....@gmail.com>
---

This applies on top of ar/t4150-remove-cruft merged into next in 
commit a0106a8d5c, which also edited the test setup in t4150.

 mailinfo.c    |  7 +++++++
 t/t4150-am.sh | 26 +++++++++++++++++++++++++-
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/mailinfo.c b/mailinfo.c
index b395adbdf2..4ef6cdee85 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -701,6 +701,13 @@ static int is_scissors_line(const char *line)
                        c++;
                        continue;
                }
+               if (!memcmp(c, "✂", 3)) {
+                       in_perforation = 1;
+                       perforation += 3;
+                       scissors += 3;
+                       c++;
+                       continue;
+               }
                in_perforation = 0;
        }
 
diff --git a/t/t4150-am.sh b/t/t4150-am.sh
index 3f7f750cc8..3ea8e8a2cf 100755
--- a/t/t4150-am.sh
+++ b/t/t4150-am.sh
@@ -77,12 +77,20 @@ test_expect_success 'setup: messages' '
 
        printf "Subject: " >subject-prefix &&
 
-       cat - subject-prefix msg-without-scissors-line >msg-with-scissors-line 
<<-\EOF
+       cat - subject-prefix msg-without-scissors-line >msg-with-scissors-line 
<<-\EOF &&
        This line should not be included in the commit message with --scissors 
enabled.
 
         - - >8 - - remove everything above this line - - >8 - -
 
        EOF
+
+       cat - subject-prefix msg-without-scissors-line 
>msg-with-unicode-scissors <<-\EOF
+       Lines above unicode scissors line should not be included in the commit
+       message with --scissors enabled.
+
+       - - - ✂ - - - ✂ - - -
+
+       EOF
 '
 
 test_expect_success setup '
@@ -161,6 +169,12 @@ test_expect_success setup '
        git format-patch --stdout expected-for-no-scissors^ 
>patch-with-scissors-line.eml &&
        git reset --hard HEAD^ &&
 
+       echo file >file &&
+       git add file &&
+       git commit -F msg-with-unicode-scissors &&
+       git format-patch --stdout HEAD^ >patch-with-unicode-scissors.eml &&
+       git reset --hard HEAD^ &&
+
        sed -n -e "3,\$p" msg >file &&
        git add file &&
        test_tick &&
@@ -421,6 +435,16 @@ test_expect_success 'am --scissors cuts the message at the 
scissors line' '
        test_cmp_rev expected-for-scissors HEAD
 '
 
+test_expect_success 'am --scissors cuts the message at the unicode scissors 
line' '
+       rm -fr .git/rebase-apply &&
+       git reset --hard &&
+       git checkout second &&
+       git am --scissors patch-with-unicode-scissors.eml &&
+       test_path_is_missing .git/rebase-apply &&
+       git diff --exit-code expected-for-scissors &&
+       test_cmp_rev expected-for-scissors HEAD
+'
+
 test_expect_success 'am --no-scissors overrides mailinfo.scissors' '
        rm -fr .git/rebase-apply &&
        git reset --hard &&
-- 
2.21.0

Reply via email to