--- t/t4018-diff-funcname | 115 +++++++++++++++++++++++++++++++++++++++ t/t4018-diff-funcname.sh | 1 + t/t4018/elixir-function | 5 ++ t/t4018/elixir-module | 9 +++ userdiff.c | 7 +++ 5 files changed, 137 insertions(+) create mode 100755 t/t4018-diff-funcname create mode 100644 t/t4018/elixir-function create mode 100644 t/t4018/elixir-module diff --git a/t/t4018-diff-funcname b/t/t4018-diff-funcname new file mode 100755 index 0000000000..194310377e --- /dev/null +++ b/t/t4018-diff-funcname @@ -0,0 +1,115 @@ +#!/bin/sh +# +# Copyright (c) 2007 Johannes E. Schindelin +# + +test_description='Test custom diff function name patterns' + +. ./test-lib.sh + +test_expect_success 'setup' ' + # a non-trivial custom pattern + git config diff.custom1.funcname "!static +!String +[^ ].*s.*" && + + # a custom pattern which matches to end of line + git config diff.custom2.funcname "......Beer\$" && + + # alternation in pattern + git config diff.custom3.funcname "Beer$" && + git config diff.custom3.xfuncname "^[ ]*((public|static).*)$" && + + # for regexp compilation tests + echo A >A.java && + echo B >B.java +' + +diffpatterns=" + ada + bibtex + cpp + csharp + css + elixir + dts + fortran + fountain + golang + html + java + matlab + objc + pascal + perl + php + python + ruby + rust + tex + custom1 + custom2 + custom3 +" + +for p in $diffpatterns +do + test_expect_success "builtin $p pattern compiles" ' + echo "*.java diff=$p" >.gitattributes && + test_expect_code 1 git diff --no-index \ + A.java B.java 2>msg && + test_i18ngrep ! fatal msg && + test_i18ngrep ! error msg + ' + test_expect_success "builtin $p wordRegex pattern compiles" ' + echo "*.java diff=$p" >.gitattributes && + test_expect_code 1 git diff --no-index --word-diff \ + A.java B.java 2>msg && + test_i18ngrep ! fatal msg && + test_i18ngrep ! error msg + ' +done + +test_expect_success 'last regexp must not be negated' ' + echo "*.java diff=java" >.gitattributes && + test_config diff.java.funcname "!static" && + test_expect_code 128 git diff --no-index A.java B.java 2>msg && + test_i18ngrep ": Last expression must not be negated:" msg +' + +test_expect_success 'setup hunk header tests' ' + for i in $diffpatterns + do + echo "$i-* diff=$i" + done > .gitattributes && + + # add all test files to the index + ( + cd "$TEST_DIRECTORY"/t4018 && + git --git-dir="$TRASH_DIRECTORY/.git" add . + ) && + + # place modified files in the worktree + for i in $(git ls-files) + do + sed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1 + done +' + +# check each individual file +for i in $(git ls-files) +do + if grep broken "$i" >/dev/null 2>&1 + then + result=failure + else + result=success + fi + test_expect_$result "hunk header: $i" " + test_when_finished 'cat actual' && # for debugging only + git diff -U1 $i >actual && + grep '@@ .* @@.*RIGHT' actual + " +done + +test_done diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh index 6f5ef0035e..194310377e 100755 --- a/t/t4018-diff-funcname.sh +++ b/t/t4018-diff-funcname.sh @@ -31,6 +31,7 @@ diffpatterns=" cpp csharp css + elixir dts fortran fountain diff --git a/t/t4018/elixir-function b/t/t4018/elixir-function new file mode 100644 index 0000000000..d452f495a7 --- /dev/null +++ b/t/t4018/elixir-function @@ -0,0 +1,5 @@ +def function(RIGHT, arg) do + # comment + # comment + ChangeMe +end diff --git a/t/t4018/elixir-module b/t/t4018/elixir-module new file mode 100644 index 0000000000..91a4e7aa20 --- /dev/null +++ b/t/t4018/elixir-module @@ -0,0 +1,9 @@ +defmodule RIGHT do + @moduledoc """ + Foo bar + """ + + def ChangeMe(a) where is_map(a) do + a + end +end diff --git a/userdiff.c b/userdiff.c index e187d356f6..31fff34e1e 100644 --- a/userdiff.c +++ b/userdiff.c @@ -32,6 +32,13 @@ PATTERNS("dts", /* Property names and math operators */ "[a-zA-Z0-9,._+?#-]+" "|[-+*/%&^|!~]|>>|<<|&&|\\|\\|"), +PATTERNS("elixir", + "^[ \t]*((def(macro|module|impl|guard|protocol)?p?|test)[ \t].*)$", + "[a-zA-Z0-9_.]+" + "|:[a-zA-Z0-9@_]+" + "|:'a-zA-Z0-9@_]+'" + "|:\"[a-zA-Z0-9@_]+\"" + "|@[a-zA-Z0-9_]+"), IPATTERN("fortran", "!^([C*]|[ \t]*!)\n" "!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n" -- 2.23.0