threads / patch / 54031

patch, 2 partsImprove and test Fortran xfuncname regex

Subject: [PATCH 0/2] Improve and test Fortran xfuncname regex

## tl;dr

7 messages between Aug 12, 2020 and Aug 13, 2020. Diffs are folded; open one to read it.

replies: 6people: 3as markdown or json

Philippe Blain via GitGitGadget· Aug 12, 2020, 22:30 UTC · lore

This series adds tests for the Fortran xfuncname regex and fixes a shortcoming of the regex.

Philippe Blain (2):
  userdiff: add tests for Fortran xfuncname regex
  userdiff: improve Fortran xfuncname regex
 t/t4018/fortran-block-data          |  5 +++++
 t/t4018/fortran-comment             | 13 +++++++++++++
 t/t4018/fortran-comment-keyword     | 14 ++++++++++++++
 t/t4018/fortran-comment-legacy      | 13 +++++++++++++
 t/t4018/fortran-comment-legacy-star | 13 +++++++++++++
 t/t4018/fortran-external-function   |  9 +++++++++
 t/t4018/fortran-external-subroutine |  5 +++++
 t/t4018/fortran-module              |  5 +++++
 t/t4018/fortran-module-procedure    | 13 +++++++++++++
 t/t4018/fortran-program             |  5 +++++
 userdiff.c                          |  6 +++++-
 11 files changed, 100 insertions(+), 1 deletion(-)
 create mode 100644 t/t4018/fortran-block-data
 create mode 100644 t/t4018/fortran-comment
 create mode 100644 t/t4018/fortran-comment-keyword
 create mode 100644 t/t4018/fortran-comment-legacy
 create mode 100644 t/t4018/fortran-comment-legacy-star
 create mode 100644 t/t4018/fortran-external-function
 create mode 100644 t/t4018/fortran-external-subroutine
 create mode 100644 t/t4018/fortran-module
 create mode 100644 t/t4018/fortran-module-procedure
 create mode 100644 t/t4018/fortran-program
base-commit: 4f0a8be78499454eac3985b6e7e144b8376ab0a5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-700%2Fphil-blain%2Ffortran-better-userdiff-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-700/phil-blain/fortran-better-userdiff-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/700
-- 
gitgitgadget
Philippe Blain via GitGitGadget· Aug 12, 2020, 22:30 UTC · re: Philippe Blain via GitGitGadget · lore

[PATCH 1/2] userdiff: add tests for Fortran xfuncname regex

From: Philippe Blain <levraiphilippeblain@gmail.com>

The Fortran userdiff patterns, introduced in 909a5494f8 (userdiff.c: add builtin fortran regex patterns, 2010-09-10), predate the test infrastructure for xfuncname patterns, introduced in bfa7d01413 (t4018: an infrastructure to test hunk headers, 2014-03-21).

Add tests for the Fortran xfuncname patterns. The test 't/t4018/fortran-comment-keyword' documents a shortcoming of the regex that is fixed in a subsequent commit.

While at it, add descriptive comments for the different parts of the regex.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
---
 t/t4018/fortran-block-data          |  5 +++++
 t/t4018/fortran-comment             | 13 +++++++++++++
 t/t4018/fortran-comment-keyword     | 15 +++++++++++++++
 t/t4018/fortran-comment-legacy      | 13 +++++++++++++
 t/t4018/fortran-comment-legacy-star | 13 +++++++++++++
 t/t4018/fortran-external-function   |  9 +++++++++
 t/t4018/fortran-external-subroutine |  5 +++++
 t/t4018/fortran-module              |  5 +++++
 t/t4018/fortran-module-procedure    | 13 +++++++++++++
 t/t4018/fortran-program             |  5 +++++
 userdiff.c                          |  4 ++++
 11 files changed, 100 insertions(+)
 create mode 100644 t/t4018/fortran-block-data
 create mode 100644 t/t4018/fortran-comment
 create mode 100644 t/t4018/fortran-comment-keyword
 create mode 100644 t/t4018/fortran-comment-legacy
 create mode 100644 t/t4018/fortran-comment-legacy-star
 create mode 100644 t/t4018/fortran-external-function
 create mode 100644 t/t4018/fortran-external-subroutine
 create mode 100644 t/t4018/fortran-module
 create mode 100644 t/t4018/fortran-module-procedure
 create mode 100644 t/t4018/fortran-program
Show changes to 11 files +100 −0

t/t4018/fortran-block-data, t/t4018/fortran-comment, t/t4018/fortran-comment-keyword, t/t4018/fortran-comment-legacy, t/t4018/fortran-comment-legacy-star, t/t4018/fortran-external-function, t/t4018/fortran-external-subroutine, t/t4018/fortran-module, t/t4018/fortran-module-procedure, t/t4018/fortran-program, userdiff.c

diff --git a/t/t4018/fortran-block-data b/t/t4018/fortran-block-data
new file mode 100644
index 0000000000..63d4e21d0a
--- /dev/null
+++ b/t/t4018/fortran-block-data
@@ -0,0 +1,5 @@
+       BLOCK DATA RIGHT
+       
+       COMMON /B/ C, ChangeMe
+       DATA C, ChangeMe  / 2.0, 6.0 / 
+       END 
diff --git a/t/t4018/fortran-comment b/t/t4018/fortran-comment
new file mode 100644
index 0000000000..7b10d17658
--- /dev/null
+++ b/t/t4018/fortran-comment
@@ -0,0 +1,13 @@
+      module a
+
+      contains
+
+      ! subroutine wrong
+      subroutine RIGHT
+      ! subroutine wrong
+
+      real ChangeMe
+
+      end subroutine RIGHT
+
+      end module a
diff --git a/t/t4018/fortran-comment-keyword b/t/t4018/fortran-comment-keyword
new file mode 100644
index 0000000000..c5dbdb4c61
--- /dev/null
+++ b/t/t4018/fortran-comment-keyword
@@ -0,0 +1,15 @@
+      module a
+
+      contains
+
+      subroutine RIGHT (funcA, funcB)
+
+      real funcA  ! grid function a
+      real funcB  ! grid function b
+
+      real ChangeMe
+      integer broken
+
+      end subroutine RIGHT
+
+      end module a
diff --git a/t/t4018/fortran-comment-legacy b/t/t4018/fortran-comment-legacy
new file mode 100644
index 0000000000..53cd062c1e
--- /dev/null
+++ b/t/t4018/fortran-comment-legacy
@@ -0,0 +1,13 @@
+      module a
+
+      contains
+
+C subroutine wrong
+      subroutine RIGHT
+C subroutine wrong
+
+      real ChangeMe
+
+      end subroutine RIGHT
+
+      end module a
diff --git a/t/t4018/fortran-comment-legacy-star b/t/t4018/fortran-comment-legacy-star
new file mode 100644
index 0000000000..2cbcdc3d8a
--- /dev/null
+++ b/t/t4018/fortran-comment-legacy-star
@@ -0,0 +1,13 @@
+      module a
+
+      contains
+
+* subroutine wrong
+      subroutine RIGHT
+* subroutine wrong
+
+      real ChangeMe
+
+      end subroutine RIGHT
+
+      end module a
diff --git a/t/t4018/fortran-external-function b/t/t4018/fortran-external-function
new file mode 100644
index 0000000000..5a2d85d3aa
--- /dev/null
+++ b/t/t4018/fortran-external-function
@@ -0,0 +1,9 @@
+function RIGHT(a, b) result(c)
+
+integer, intent(in) :: ChangeMe
+integer, intent(in) :: b
+integer, intent(out) :: c
+
+c = a+b
+
+end function RIGHT
diff --git a/t/t4018/fortran-external-subroutine b/t/t4018/fortran-external-subroutine
new file mode 100644
index 0000000000..4ce85fea13
--- /dev/null
+++ b/t/t4018/fortran-external-subroutine
@@ -0,0 +1,5 @@
+subroutine RIGHT
+
+real ChangeMe
+
+end subroutine RIGHT
diff --git a/t/t4018/fortran-module b/t/t4018/fortran-module
new file mode 100644
index 0000000000..c4b737dac3
--- /dev/null
+++ b/t/t4018/fortran-module
@@ -0,0 +1,5 @@
+module RIGHT
+
+use ChangeMe
+
+end module RIGHT
diff --git a/t/t4018/fortran-module-procedure b/t/t4018/fortran-module-procedure
new file mode 100644
index 0000000000..1ce6d854c2
--- /dev/null
+++ b/t/t4018/fortran-module-procedure
@@ -0,0 +1,13 @@
+ module RIGHT
+
+   implicit none
+   private
+
+   interface letters  ! generic interface
+      module procedure aaaa, &
+                       bbbb, &
+                       ChangeMe, &
+                       dddd
+   end interface
+   
+end module RIGHT
diff --git a/t/t4018/fortran-program b/t/t4018/fortran-program
new file mode 100644
index 0000000000..4616895e4b
--- /dev/null
+++ b/t/t4018/fortran-program
@@ -0,0 +1,5 @@
+program RIGHT
+
+call ChangeMe
+
+end program RIGHT
diff --git a/userdiff.c b/userdiff.c
index 1df884ef0b..707d82435a 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -46,9 +46,13 @@ PATTERNS("elixir",
 	 /* Not real operators, but should be grouped */
 	 "|:?%[A-Za-z0-9_.]\\{\\}?"),
 IPATTERN("fortran",
+	 /* Don't match comment lines */
 	 "!^([C*]|[ \t]*!)\n"
+	 /* Don't match 'module procedure' lines */
 	 "!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n"
+	 /* Program, module, block data */
 	 "^[ \t]*((END[ \t]+)?(PROGRAM|MODULE|BLOCK[ \t]+DATA"
+		/* Subroutines and functions */
 		"|([^'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$",
 	 /* -- */
 	 "[a-zA-Z][a-zA-Z0-9_]*"
-- 
gitgitgadget
Philippe Blain via GitGitGadget· Aug 12, 2020, 22:30 UTC · re: Philippe Blain via GitGitGadget · lore

[PATCH 2/2] userdiff: improve Fortran xfuncname regex

From: Philippe Blain <levraiphilippeblain@gmail.com>

The third part of the Fortran xfuncname regex wants to match the beginning of a subroutine or function, so it allows for all characters except `'`, `"` or whitespace before the keyword 'function' or 'subroutine'. This is meant to match the 'recursive', 'elemental' or 'pure' keywords, as well as function return types, and to prevent matches inside strings.

However, the negated set does not contain the `!` comment character, so a line with an end-of-line comment containing the keyword 'function' or 'subroutine' followed by another word is mistakenly chosen as a hunk header.

Improve the regex by adding `!` to the negated set.
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
---
 t/t4018/fortran-comment-keyword | 1 -
 userdiff.c                      | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)
Show changes to 2 files +1 −2

t/t4018/fortran-comment-keyword, userdiff.c

diff --git a/t/t4018/fortran-comment-keyword b/t/t4018/fortran-comment-keyword
index c5dbdb4c61..e9206a5379 100644
--- a/t/t4018/fortran-comment-keyword
+++ b/t/t4018/fortran-comment-keyword
@@ -8,7 +8,6 @@
       real funcB  ! grid function b
 
       real ChangeMe
-      integer broken
 
       end subroutine RIGHT
 
diff --git a/userdiff.c b/userdiff.c
index 707d82435a..fde02f225b 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -53,7 +53,7 @@ IPATTERN("fortran",
 	 /* Program, module, block data */
 	 "^[ \t]*((END[ \t]+)?(PROGRAM|MODULE|BLOCK[ \t]+DATA"
 		/* Subroutines and functions */
-		"|([^'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$",
+		"|([^!'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$",
 	 /* -- */
 	 "[a-zA-Z][a-zA-Z0-9_]*"
 	 "|\\.([Ee][Qq]|[Nn][Ee]|[Gg][TtEe]|[Ll][TtEe]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|[Aa][Nn][Dd]|[Oo][Rr]|[Nn]?[Ee][Qq][Vv]|[Nn][Oo][Tt])\\."
-- 
gitgitgadget
Elijah Newren· Aug 13, 2020, 02:10 UTC · re: Philippe Blain via GitGitGadget · lore

Re: [PATCH 2/2] userdiff: improve Fortran xfuncname regex

On Wed, Aug 12, 2020 at 3:34 PM Philippe Blain via GitGitGadget <gitgitgadget@gmail.com> wrote:

Show 34 quoted lines
>
> From: Philippe Blain <levraiphilippeblain@gmail.com>
>
> The third part of the Fortran xfuncname regex wants to match the
> beginning of a subroutine or function, so it allows for all characters
> except `'`, `"` or whitespace before the keyword 'function' or
> 'subroutine'. This is meant to match the 'recursive', 'elemental' or
> 'pure' keywords, as well as function return types, and to prevent
> matches inside strings.
>
> However, the negated set does not contain the `!` comment character,
> so a line with an end-of-line comment containing the keyword 'function' or
> 'subroutine' followed by another word is mistakenly chosen as a hunk header.
>
> Improve the regex by adding `!` to the negated set.
>
> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
> ---
>  t/t4018/fortran-comment-keyword | 1 -
>  userdiff.c                      | 2 +-
>  2 files changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/t/t4018/fortran-comment-keyword b/t/t4018/fortran-comment-keyword
> index c5dbdb4c61..e9206a5379 100644
> --- a/t/t4018/fortran-comment-keyword
> +++ b/t/t4018/fortran-comment-keyword
> @@ -8,7 +8,6 @@
>        real funcB  ! grid function b
>
>        real ChangeMe
> -      integer broken
>
>        end subroutine RIGHT
>

This change seems orthogonal to the explanation in the commit message. What is its purpose, and does it belong in this commit or a different one?

Show 15 quoted lines
> diff --git a/userdiff.c b/userdiff.c
> index 707d82435a..fde02f225b 100644
> --- a/userdiff.c
> +++ b/userdiff.c
> @@ -53,7 +53,7 @@ IPATTERN("fortran",
>          /* Program, module, block data */
>          "^[ \t]*((END[ \t]+)?(PROGRAM|MODULE|BLOCK[ \t]+DATA"
>                 /* Subroutines and functions */
> -               "|([^'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$",
> +               "|([^!'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$",
>          /* -- */
>          "[a-zA-Z][a-zA-Z0-9_]*"
>          "|\\.([Ee][Qq]|[Nn][Ee]|[Gg][TtEe]|[Ll][TtEe]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|[Aa][Nn][Dd]|[Oo][Rr]|[Nn]?[Ee][Qq][Vv]|[Nn][Oo][Tt])\\."
> --
> gitgitgadget
Philippe Blain· Aug 13, 2020, 12:45 UTC · re: Elijah Newren · lore

Re: [PATCH 2/2] userdiff: improve Fortran xfuncname regex

Hi Elijah, 
Show 42 quoted lines
> Le 12 août 2020 à 22:10, Elijah Newren <newren@gmail.com> a écrit :
> 
> On Wed, Aug 12, 2020 at 3:34 PM Philippe Blain via GitGitGadget
> <gitgitgadget@gmail.com> wrote:
>> 
>> From: Philippe Blain <levraiphilippeblain@gmail.com>
>> 
>> The third part of the Fortran xfuncname regex wants to match the
>> beginning of a subroutine or function, so it allows for all characters
>> except `'`, `"` or whitespace before the keyword 'function' or
>> 'subroutine'. This is meant to match the 'recursive', 'elemental' or
>> 'pure' keywords, as well as function return types, and to prevent
>> matches inside strings.
>> 
>> However, the negated set does not contain the `!` comment character,
>> so a line with an end-of-line comment containing the keyword 'function' or
>> 'subroutine' followed by another word is mistakenly chosen as a hunk header.
>> 
>> Improve the regex by adding `!` to the negated set.
>> 
>> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
>> ---
>> t/t4018/fortran-comment-keyword | 1 -
>> userdiff.c                      | 2 +-
>> 2 files changed, 1 insertion(+), 2 deletions(-)
>> 
>> diff --git a/t/t4018/fortran-comment-keyword b/t/t4018/fortran-comment-keyword
>> index c5dbdb4c61..e9206a5379 100644
>> --- a/t/t4018/fortran-comment-keyword
>> +++ b/t/t4018/fortran-comment-keyword
>> @@ -8,7 +8,6 @@
>>       real funcB  ! grid function b
>> 
>>       real ChangeMe
>> -      integer broken
>> 
>>       end subroutine RIGHT
>> 
> 
> This change seems orthogonal to the explanation in the commit message.
> What is its purpose, and does it belong in this commit or a different
> one?

If you take a look at t/t4018/README, the way to mark t4018 tests as "known failures" is to insert "broken" somewhere in the file. Since I'm fixing the regex in this commit to be able to cope with the situation in t/t4018/fortran-comment-keyword, I'm unmarking this test as broken.

Cheers,
Philippe.
Elijah Newren· Aug 13, 2020, 14:04 UTC · re: Philippe Blain · lore

Re: [PATCH 2/2] userdiff: improve Fortran xfuncname regex

Hi Philippe,

On Thu, Aug 13, 2020 at 5:45 AM Philippe Blain <levraiphilippeblain@gmail.com> wrote:

Show 49 quoted lines
>
> Hi Elijah,
>
> > Le 12 août 2020 à 22:10, Elijah Newren <newren@gmail.com> a écrit :
> >
> > On Wed, Aug 12, 2020 at 3:34 PM Philippe Blain via GitGitGadget
> > <gitgitgadget@gmail.com> wrote:
> >>
> >> From: Philippe Blain <levraiphilippeblain@gmail.com>
> >>
> >> The third part of the Fortran xfuncname regex wants to match the
> >> beginning of a subroutine or function, so it allows for all characters
> >> except `'`, `"` or whitespace before the keyword 'function' or
> >> 'subroutine'. This is meant to match the 'recursive', 'elemental' or
> >> 'pure' keywords, as well as function return types, and to prevent
> >> matches inside strings.
> >>
> >> However, the negated set does not contain the `!` comment character,
> >> so a line with an end-of-line comment containing the keyword 'function' or
> >> 'subroutine' followed by another word is mistakenly chosen as a hunk header.
> >>
> >> Improve the regex by adding `!` to the negated set.
> >>
> >> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
> >> ---
> >> t/t4018/fortran-comment-keyword | 1 -
> >> userdiff.c                      | 2 +-
> >> 2 files changed, 1 insertion(+), 2 deletions(-)
> >>
> >> diff --git a/t/t4018/fortran-comment-keyword b/t/t4018/fortran-comment-keyword
> >> index c5dbdb4c61..e9206a5379 100644
> >> --- a/t/t4018/fortran-comment-keyword
> >> +++ b/t/t4018/fortran-comment-keyword
> >> @@ -8,7 +8,6 @@
> >>       real funcB  ! grid function b
> >>
> >>       real ChangeMe
> >> -      integer broken
> >>
> >>       end subroutine RIGHT
> >>
> >
> > This change seems orthogonal to the explanation in the commit message.
> > What is its purpose, and does it belong in this commit or a different
> > one?
>
> If you take a look at t/t4018/README, the way to mark t4018 tests as "known failures"
> is to insert "broken" somewhere in the file. Since I'm fixing the regex in this commit to be able
> to cope with the situation in t/t4018/fortran-comment-keyword, I'm unmarking this test as broken.

Ah, gotcha. I guess that's what I get for trying to review a random patch outside my area of expertise. :-) Thanks for explaining how this works to me.

Elijah
Junio C Hamano· Aug 13, 2020, 18:22 UTC · re: Philippe Blain via GitGitGadget · lore

Re: [PATCH 0/2] Improve and test Fortran xfuncname regex

"Philippe Blain via GitGitGadget" <gitgitgadget@gmail.com> writes:
> This series adds tests for the Fortran xfuncname regex and fixes a
> shortcoming of the regex.
Will queue.  Thanks.
Show 33 quoted lines
>
> Philippe Blain (2):
>   userdiff: add tests for Fortran xfuncname regex
>   userdiff: improve Fortran xfuncname regex
>
>  t/t4018/fortran-block-data          |  5 +++++
>  t/t4018/fortran-comment             | 13 +++++++++++++
>  t/t4018/fortran-comment-keyword     | 14 ++++++++++++++
>  t/t4018/fortran-comment-legacy      | 13 +++++++++++++
>  t/t4018/fortran-comment-legacy-star | 13 +++++++++++++
>  t/t4018/fortran-external-function   |  9 +++++++++
>  t/t4018/fortran-external-subroutine |  5 +++++
>  t/t4018/fortran-module              |  5 +++++
>  t/t4018/fortran-module-procedure    | 13 +++++++++++++
>  t/t4018/fortran-program             |  5 +++++
>  userdiff.c                          |  6 +++++-
>  11 files changed, 100 insertions(+), 1 deletion(-)
>  create mode 100644 t/t4018/fortran-block-data
>  create mode 100644 t/t4018/fortran-comment
>  create mode 100644 t/t4018/fortran-comment-keyword
>  create mode 100644 t/t4018/fortran-comment-legacy
>  create mode 100644 t/t4018/fortran-comment-legacy-star
>  create mode 100644 t/t4018/fortran-external-function
>  create mode 100644 t/t4018/fortran-external-subroutine
>  create mode 100644 t/t4018/fortran-module
>  create mode 100644 t/t4018/fortran-module-procedure
>  create mode 100644 t/t4018/fortran-program
>
>
> base-commit: 4f0a8be78499454eac3985b6e7e144b8376ab0a5
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-700%2Fphil-blain%2Ffortran-better-userdiff-v1
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-700/phil-blain/fortran-better-userdiff-v1
> Pull-Request: https://github.com/gitgitgadget/git/pull/700

← back to recent threads