svn commit: r1924117 - /subversion/trunk/tools/dist/backport/status.py

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: dsahlberg
Date: Sat Mar  1 19:52:37 2025
New Revision: 1924117

URL: http://svn.apache.org/viewvc?rev=1924117&view=rev
Log:
Update backport/status parser with the end goal of creating an interactive
backport nomination script.

Fix a bug in logsummary parsing where a missing logsummary didn't raise 
an expected exception. This caused unittests to fail.

* dist/backport/status.py
  (StatusEntry.__init__): When parsing the logsummary, also check if the first
    line is a subheader (otherwise the logsummary may incorrectly contain
    that subheader).
  (StatusEntry._is_subheader): Check subheaders against explicit list of known
    subheaders to avoid spurious matches if a text starts with a subheader-
    like text.
  (Test_StatusEntry.test__is_subheader): Test for returning false on subheader-
    like text and non-subheader.


Modified:
    subversion/trunk/tools/dist/backport/status.py

Modified: subversion/trunk/tools/dist/backport/status.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport/status.py?rev=1924117&r1=1924116&r2=1924117&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport/status.py (original)
+++ subversion/trunk/tools/dist/backport/status.py Sat Mar  1 19:52:37 2025
@@ -380,10 +380,10 @@ class StatusEntry:
 
     # Parse the logsummary.
     while True:
-      self.logsummary.append(lines[0])
-      lines = lines[1:]
       if (not lines) or self._is_subheader(lines[0]):
         break
+      self.logsummary.append(lines[0])
+      lines = lines[1:]
 
     # Parse votes.
     if "Votes:" in lines:
@@ -515,7 +515,11 @@ class StatusEntry:
     #
     # This is currently only used for finding the end of logsummary, and all
     # explicitly special-cased headers (e.g., "Depends:") match this, though.
-    return re.compile(r'^\s*[A-Z]\w*:').match(string)
+    subheaders = "Justification: Notes: Depends: Branch: Votes:".split()
+    for subheader in subheaders:
+      if string.strip().startswith(subheader):
+        return True
+    return False
 
   def unparse(self, stream):
     "Write this entry to STREAM, an open file-like object."
@@ -691,6 +695,9 @@ class Test_StatusEntry(unittest.TestCase
     for subheader in subheaders:
       self.assertTrue(StatusEntry._is_subheader(subheader))
       self.assertTrue(StatusEntry._is_subheader(subheader + " with value"))
+    self.assertFalse(StatusEntry._is_subheader("UnknownSubheader: with value"))
+    self.assertFalse(StatusEntry._is_subheader("UnknownSubheader:"))
+    self.assertFalse(StatusEntry._is_subheader("regular text"))
 
 
 def setUpModule():
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.