On 5/26/20 4:47 PM, Pierre-Marie de Rodat wrote:
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.
Hi.
That was simpler than I expected ;) I compared results for all 2000 patches
since
we switched to git and there are no changes!
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)
The only nit: please replace it with:
@@ -1 +1,2 @@
+
in order to shrink the file.
Please install it with the change.
Martin
+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