This extends the ChangeLog entries parsing machinery to handle entries
that cover multiple files spanning over multiple lines. For instance:

    * first_file_patched.c, second_file_patched.c, third_file_patched.c,
    fourth_file_patched.c: Do things.

contrib/

        * gcc-changelog/git_commit.py (ChangeLogEntry): Handle entries
        with multi-line file lists.
        * test_email.py: New testcase.
        * test_patches.txt: Likewise.
---
 contrib/gcc-changelog/git_commit.py    |  18 ++
 contrib/gcc-changelog/test_email.py    |   9 +
 contrib/gcc-changelog/test_patches.txt | 290 +++++++++++++++++++++++++
 3 files changed, 317 insertions(+)

diff --git a/contrib/gcc-changelog/git_commit.py 
b/contrib/gcc-changelog/git_commit.py
index 6f99d917b3b..a24a251d8f3 100755
--- a/contrib/gcc-changelog/git_commit.py
+++ b/contrib/gcc-changelog/git_commit.py
@@ -185,14 +185,32 @@ class ChangeLogEntry:
     @property
     def files(self):
         files = []
+
+        # Whether the content currently processed is between a star prefix the
+        # end of the file list: a colon or an open paren.
+        in_location = False
+
         for line in self.lines:
+            # If this line matches the star prefix, start the location
+            # processing on the information that follows the star.
             m = star_prefix_regex.match(line)
             if m:
+                in_location = True
                 line = m.group('content')
+
+            if in_location:
+                # Strip everything that is not a filename in "line": entities
+                # "(NAME)", entry text (the colon, if present, and anything
+                # that follows it).
                 if '(' in line:
                     line = line[:line.index('(')]
+                    in_location = False
                 if ':' in line:
                     line = line[:line.index(':')]
+                    in_location = False
+
+                # At this point, all that 's left is a list of filenames
+                # separated by commas and whitespaces.
                 for file in line.split(','):
                     file = file.strip()
                     if file:
diff --git a/contrib/gcc-changelog/test_email.py 
b/contrib/gcc-changelog/test_email.py
index 1379502e755..3d2c8ff2412 100755
--- a/contrib/gcc-changelog/test_email.py
+++ b/contrib/gcc-changelog/test_email.py
@@ -286,3 +286,12 @@ class TestGccChangelog(unittest.TestCase):
         email = self.from_patch_glob('0001-Update-merge.sh-to-reflect.patch')
         assert (email.changelog_entries[0].lines[0]
                 == '\t* LOCAL_PATCHES: Use git hash instead of SVN id.')
+
+    def test_multiline_file_list(self):
+        email = self.from_patch_glob(
+            '0001-Ada-Reuse-Is_Package_Or_Generic_Package-where-possib.patch')
+        assert (email.changelog_entries[0].files
+                == ['contracts.adb', 'einfo.adb', 'exp_ch9.adb',
+                    'sem_ch12.adb', 'sem_ch4.adb', 'sem_ch7.adb',
+                    'sem_ch8.adb', 'sem_elab.adb', 'sem_type.adb',
+                    'sem_util.adb'])
diff --git a/contrib/gcc-changelog/test_patches.txt 
b/contrib/gcc-changelog/test_patches.txt
index 84d4b81d818..3492fb4dcb8 100644
--- a/contrib/gcc-changelog/test_patches.txt
+++ b/contrib/gcc-changelog/test_patches.txt
@@ -2650,4 +2650,294 @@ index dfa7bf3d196..3f4f1629a22 100755
  
 -- 
 2.26.2
+=== 0001-Ada-Reuse-Is_Package_Or_Generic_Package-where-possib.patch ===
+From 557b268fffffdeb0980a17411f458eee333f55c6 Mon Sep 17 00:00:00 2001
+From: Piotr Trojanek <troja...@adacore.com>
+Date: Thu, 12 Dec 2019 11:45:24 +0100
+Subject: [PATCH] [Ada] Reuse Is_Package_Or_Generic_Package where possible
+
+2020-05-26  Piotr Trojanek  <troja...@adacore.com>
+
+gcc/ada/
+
+       * contracts.adb, einfo.adb, exp_ch9.adb, sem_ch12.adb,
+       sem_ch4.adb, sem_ch7.adb, sem_ch8.adb, sem_elab.adb,
+       sem_type.adb, sem_util.adb: Reuse Is_Package_Or_Generic_Package
+       where possible (similarly, reuse Is_Concurrent_Type if it was
+       possible in the same expressions).
+---
+ gcc/ada/contracts.adb |  2 +-
+ gcc/ada/einfo.adb     | 22 +++++++++++-----------
+ gcc/ada/exp_ch9.adb   |  2 +-
+ gcc/ada/sem_ch12.adb  |  2 +-
+ gcc/ada/sem_ch4.adb   |  2 +-
+ gcc/ada/sem_ch7.adb   |  6 +++---
+ gcc/ada/sem_ch8.adb   |  6 +++---
+ gcc/ada/sem_elab.adb  |  2 +-
+ gcc/ada/sem_type.adb  |  2 +-
+ gcc/ada/sem_util.adb  |  6 +++---
+ 10 files changed, 26 insertions(+), 26 deletions(-)
+
+diff --git a/gcc/ada/contracts.adb b/gcc/ada/contracts.adb
+index 981bb91..d58f136 100644
+--- a/gcc/ada/contracts.adb
++++ b/gcc/ada/contracts.adb
+@@ -213,7 +213,7 @@ package body Contracts is
+       --    Initializes
+       --    Part_Of (instantiation only)
+ 
+-      elsif Ekind_In (Id, E_Generic_Package, E_Package) then
++      elsif Is_Package_Or_Generic_Package (Id) then
+          if Nam_In (Prag_Nam, Name_Abstract_State,
+                               Name_Initial_Condition,
+                               Name_Initializes)
+diff --git a/gcc/ada/einfo.adb b/gcc/ada/einfo.adb
+index 98b508f..1df8ed0 100644
+--- a/gcc/ada/einfo.adb
++++ b/gcc/ada/einfo.adb
+@@ -713,7 +713,7 @@ package body Einfo is
+ 
+    function Abstract_States (Id : E) return L is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Generic_Package, E_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+       return Elist25 (Id);
+    end Abstract_States;
+ 
+@@ -837,7 +837,7 @@ package body Einfo is
+ 
+    function Body_Entity (Id : E) return E is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Package, E_Generic_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+       return Node19 (Id);
+    end Body_Entity;
+ 
+@@ -1424,8 +1424,8 @@ package body Einfo is
+ 
+    function First_Private_Entity (Id : E) return E is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Package, E_Generic_Package)
+-                       or else Ekind (Id) in Concurrent_Kind);
++      pragma Assert (Is_Package_Or_Generic_Package (Id)
++                       or else Is_Concurrent_Type (Id));
+       return Node16 (Id);
+    end First_Private_Entity;
+ 
+@@ -3044,7 +3044,7 @@ package body Einfo is
+ 
+    function Package_Instantiation (Id : E) return N is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Package, E_Generic_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+       return Node26 (Id);
+    end Package_Instantiation;
+ 
+@@ -3883,7 +3883,7 @@ package body Einfo is
+ 
+    procedure Set_Abstract_States (Id : E; V : L) is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Generic_Package, E_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+       Set_Elist25 (Id, V);
+    end Set_Abstract_States;
+ 
+@@ -4006,7 +4006,7 @@ package body Einfo is
+ 
+    procedure Set_Body_Entity (Id : E; V : E) is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Package, E_Generic_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+       Set_Node19 (Id, V);
+    end Set_Body_Entity;
+ 
+@@ -4593,8 +4593,8 @@ package body Einfo is
+ 
+    procedure Set_First_Private_Entity (Id : E; V : E) is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Package, E_Generic_Package)
+-                       or else Ekind (Id) in Concurrent_Kind);
++      pragma Assert (Is_Package_Or_Generic_Package (Id)
++                       or else Is_Concurrent_Type (Id));
+       Set_Node16 (Id, V);
+    end Set_First_Private_Entity;
+ 
+@@ -7827,7 +7827,7 @@ package body Einfo is
+ 
+    function Has_Non_Null_Abstract_State (Id : E) return B is
+    begin
+-      pragma Assert (Ekind_In (Id, E_Generic_Package, E_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+ 
+       return
+         Present (Abstract_States (Id))
+@@ -7863,7 +7863,7 @@ package body Einfo is
+    -----------------------------
+ 
+    function Has_Null_Abstract_State (Id : E) return B is
+-      pragma Assert (Ekind_In (Id, E_Generic_Package, E_Package));
++      pragma Assert (Is_Package_Or_Generic_Package (Id));
+ 
+       States : constant Elist_Id := Abstract_States (Id);
+ 
+diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
+index 64ac353..392a221 100644
+--- a/gcc/ada/exp_ch9.adb
++++ b/gcc/ada/exp_ch9.adb
+@@ -6167,7 +6167,7 @@ package body Exp_Ch9 is
+                --  this safe. This is a common (if dubious) idiom.
+ 
+                elsif S = Scope (Prot)
+-                 and then Ekind_In (S, E_Package, E_Generic_Package)
++                 and then Is_Package_Or_Generic_Package (S)
+                  and then Nkind (Parent (E)) = N_Object_Declaration
+                  and then Nkind (Parent (Parent (E))) = N_Package_Body
+                then
+diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
+index dc3a3c2..209e060 100644
+--- a/gcc/ada/sem_ch12.adb
++++ b/gcc/ada/sem_ch12.adb
+@@ -10364,7 +10364,7 @@ package body Sem_Ch12 is
+       --  such as a parent generic within the body of a generic child.
+ 
+       if not Is_Entity_Name (Actual)
+-        or else not Ekind_In (Entity (Actual), E_Generic_Package, E_Package)
++        or else not Is_Package_Or_Generic_Package (Entity (Actual))
+       then
+          Error_Msg_N
+            ("expect package instance to instantiate formal", Actual);
+diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
+index 5910112..702f265 100644
+--- a/gcc/ada/sem_ch4.adb
++++ b/gcc/ada/sem_ch4.adb
+@@ -9480,7 +9480,7 @@ package body Sem_Ch4 is
+             Type_Scope : constant Entity_Id := Scope (T);
+             Op_List    : Elist_Id := Primitive_Operations (T);
+          begin
+-            if Ekind_In (Type_Scope, E_Package, E_Generic_Package)
++            if Is_Package_Or_Generic_Package (Type_Scope)
+               and then ((In_Package_Body (Type_Scope)
+               and then In_Open_Scopes (Type_Scope)) or else In_Instance_Body)
+             then
+diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb
+index 6d9a1db..f217dfd 100644
+--- a/gcc/ada/sem_ch7.adb
++++ b/gcc/ada/sem_ch7.adb
+@@ -2428,7 +2428,7 @@ package body Sem_Ch7 is
+       --  defined in the associated package, subject to at least one Part_Of
+       --  constituent.
+ 
+-      if Ekind_In (P, E_Generic_Package, E_Package) then
++      if Is_Package_Or_Generic_Package (P) then
+          declare
+             States     : constant Elist_Id := Abstract_States (P);
+             State_Elmt : Elmt_Id;
+@@ -3322,7 +3322,7 @@ package body Sem_Ch7 is
+       --  performed if the caller requests this behavior.
+ 
+       if Do_Abstract_States
+-        and then Ekind_In (Pack_Id, E_Generic_Package, E_Package)
++        and then Is_Package_Or_Generic_Package (Pack_Id)
+         and then Has_Non_Null_Abstract_State (Pack_Id)
+         and then Requires_Body
+       then
+@@ -3380,7 +3380,7 @@ package body Sem_Ch7 is
+       --  provided). If Ignore_Abstract_State is True, we don't do this check
+       --  (so we can use Unit_Requires_Body to check for some other reason).
+ 
+-      elsif Ekind_In (Pack_Id, E_Generic_Package, E_Package)
++      elsif Is_Package_Or_Generic_Package (Pack_Id)
+         and then Present (Abstract_States (Pack_Id))
+         and then not Is_Null_State
+                        (Node (First_Elmt (Abstract_States (Pack_Id))))
+diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
+index f083f7c..7f50b40 100644
+--- a/gcc/ada/sem_ch8.adb
++++ b/gcc/ada/sem_ch8.adb
+@@ -5950,7 +5950,7 @@ package body Sem_Ch8 is
+ 
+                   --  Package or generic package is always a simple reference
+ 
+-                  if Ekind_In (E, E_Package, E_Generic_Package) then
++                  if Is_Package_Or_Generic_Package (E) then
+                      Generate_Reference (E, N, 'r');
+ 
+                   --  Else see if we have a left hand side
+@@ -8779,7 +8779,7 @@ package body Sem_Ch8 is
+ 
+       --  Set Default_Storage_Pool field of the library unit if necessary
+ 
+-      if Ekind_In (S, E_Package, E_Generic_Package)
++      if Is_Package_Or_Generic_Package (S)
+         and then
+           Nkind (Parent (Unit_Declaration_Node (S))) = N_Compilation_Unit
+       then
+@@ -8949,7 +8949,7 @@ package body Sem_Ch8 is
+ 
+       if Is_Child_Unit (S)
+         and then Present (E)
+-        and then Ekind_In (E, E_Package, E_Generic_Package)
++        and then Is_Package_Or_Generic_Package (E)
+         and then
+           Nkind (Parent (Unit_Declaration_Node (E))) = N_Compilation_Unit
+       then
+diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb
+index f3cac46..dbf3fac 100644
+--- a/gcc/ada/sem_elab.adb
++++ b/gcc/ada/sem_elab.adb
+@@ -13826,7 +13826,7 @@ package body Sem_Elab is
+          --  be on another machine.
+ 
+          if Ekind (Body_Id) = E_Package_Body
+-           and then Ekind_In (Spec_Id, E_Generic_Package, E_Package)
++           and then Is_Package_Or_Generic_Package (Spec_Id)
+            and then (Is_Remote_Call_Interface (Spec_Id)
+                       or else Is_Remote_Types (Spec_Id))
+          then
+diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb
+index e5d01dd..1868568 100644
+--- a/gcc/ada/sem_type.adb
++++ b/gcc/ada/sem_type.adb
+@@ -1383,7 +1383,7 @@ package body Sem_Type is
+       begin
+          return In_Same_List (Parent (Typ), Op_Decl)
+            or else
+-             (Ekind_In (Scop, E_Package, E_Generic_Package)
++             (Is_Package_Or_Generic_Package (Scop)
+                and then List_Containing (Op_Decl) =
+                               Visible_Declarations (Parent (Scop))
+                and then List_Containing (Parent (Typ)) =
+diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
+index b980b4c..c1b1d9e 100644
+--- a/gcc/ada/sem_util.adb
++++ b/gcc/ada/sem_util.adb
+@@ -3407,7 +3407,7 @@ package body Sem_Util is
+          --  Stop the traversal when a package subject to a null abstract 
state
+          --  has been found.
+ 
+-         if Ekind_In (Context, E_Generic_Package, E_Package)
++         if Is_Package_Or_Generic_Package (Context)
+            and then Has_Null_Abstract_State (Context)
+          then
+             exit;
+@@ -12978,7 +12978,7 @@ package body Sem_Util is
+ 
+       begin
+          if Present (Pkg)
+-           and then Ekind_In (Pkg, E_Generic_Package, E_Package)
++           and then Is_Package_Or_Generic_Package (Pkg)
+          then
+             while Nkind (Pkg_Decl) /= N_Package_Specification loop
+                Pkg_Decl := Parent (Pkg_Decl);
+@@ -25283,7 +25283,7 @@ package body Sem_Util is
+               or else
+                 (Present (Scope (Val))
+                   and then Is_Implementation_Defined (Scope (Val))))
+-           and then not (Ekind_In (Val, E_Package, E_Generic_Package)
++           and then not (Is_Package_Or_Generic_Package (Val)
+                           and then Is_Library_Level_Entity (Val))
+          then
+             Check_Restriction (No_Implementation_Identifiers, Post_Node);
+-- 
+2.1.4
 
-- 
2.20.1

Reply via email to