From a4c0bec685807bdbff0e6e3582a87bd381dc20b5 Mon Sep 17 00:00:00 2001
From: Miguel Angel Reina Ortega <miguelangel.reinaortega@etsi.org>
Date: Mon, 14 Aug 2023 22:08:12 +0200
Subject: [PATCH] Fix for determining which clauses are changed

---
 generateChangemarks/changemarks.py | 43 ++++++++++++++++++++++++++----
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/generateChangemarks/changemarks.py b/generateChangemarks/changemarks.py
index 57a0bf0..55cbfa2 100644
--- a/generateChangemarks/changemarks.py
+++ b/generateChangemarks/changemarks.py
@@ -113,6 +113,7 @@ def find_all_clauses(progress:Progress, mdLines:list[str]):
     clause.to_id = index - 1
     clauses.append(clause)
 
+    logging.debug("Number of clauses: {len(clauses)}")
     return clauses
 
 class MR:
@@ -153,14 +154,15 @@ https://forge.etsi.org/rep/cdm/pipeline-scripts/-/blob/main/common/Dockerfile.st
         if patched_file.source_file.startswith("a/TS"):
             logging.debug(f"Looking at changes in {patched_file.source_file}")
             for change in patched_file:
+                change_start_line, change_end_line, lines_added, lines_removed = changeDetails(change)
                 # Check the previous changed_clause
-                if (changed_clause.from_id <= change.target_start) and (changed_clause.to_id >= (change.target_start - 1 + change.target_length)):
+                if (changed_clause.from_id <= change_start_line) and (changed_clause.to_id + lines_added - lines_removed >= change_end_line):
                     generateMDforChange(progress, mdLines, changed_clause, change, outDirectory, True)
                     break
                 i = 0 
                 # Check all clauses
                 for clause in clauses:
-                    if (clause.from_id <= change.target_start) and (clause.to_id >= (change.target_start - 1 + change.target_length)):
+                    if (clause.from_id <= change_start_line) and (clause.to_id + lines_added - lines_removed >= change_end_line):
                         changed_clause = clauses.pop(i)
                         changed_clauses.append(clause)
                         generateMDforChange(progress, mdLines, changed_clause, change, outDirectory, False)
@@ -172,6 +174,30 @@ https://forge.etsi.org/rep/cdm/pipeline-scripts/-/blob/main/common/Dockerfile.st
 
     return changed_clauses
 
+def changeDetails(change) -> (int, int, int, int):
+    i = 0
+    lines_added = 0
+    lines_removed = 0
+    change_start_line = change.target_start
+    change_end_line = change_start_line
+    for line in change:
+        if line.is_added or line.is_removed:
+            if change_start_line == change.target_start:
+                change_start_line = change.target_start + i
+                change_end_line = change_end_line + i
+            else:
+                change_end_line = change_end_line + i
+            i = 0
+            if line.is_added:
+                lines_added = lines_added + 1
+            elif line.is_removed:
+                lines_removed = lines_removed + 1
+
+        i = i + 1
+
+    change_end_line = change_end_line - lines_removed
+    return change_start_line, change_end_line, lines_added, lines_removed
+
 def generateMDforChange(progress:Progress, mdLines:list[str],changed_clause:Clause, change, outDirectory:str, existing_clause:bool):
     '''
     Generate the MD for the clauses that have been modified by the merge request
@@ -198,7 +224,10 @@ https://forge.etsi.org/rep/cdm/pipeline-scripts/-/blob/main/common/Dockerfile.st
                 for element in tableElements:
                     if not element.strip() == '':
                         modifiedElements.append("<span class=\"underline\">" + element.strip() + "</span>")
-                modifiedRow = "|" + "|".join(modifiedElements) + "|" + "\n"
+                #modifiedRow = "|" + "|".join(modifiedElements) + "|" + "\n"
+                    else:
+                        modifiedElements.append(element)
+                modifiedRow = "|".join(modifiedElements) + "\n"
                 clauseMDlines.insert(j,modifiedRow)
                 clauseMDlines.pop(j + 1)
             else:
@@ -212,13 +241,17 @@ https://forge.etsi.org/rep/cdm/pipeline-scripts/-/blob/main/common/Dockerfile.st
                 for element in tableElements:
                     if not element.strip() == '':
                         modifiedElements.append("~~" + element.strip() + "~~")
-                modifiedRow = "|" + "|".join(modifiedElements) + "|" + "\n"
+                #modifiedRow = "|" + "|".join(modifiedElements) + "|" + "\n"
+                    else:
+                        modifiedElements.append(element)
+                modifiedRow = "|".join(modifiedElements) + "\n"
                 clauseMDlines.insert(j, modifiedRow)
             else:
                 clauseMDlines.insert(j, "~~" + line.value.strip() + "~~")
             
         j = j + 1
-                     
+
+    clauseMDlines.insert(j, "\n\n<br />")
     writeMDFile(progress, clauseMDlines, changed_clause.clause_nr.replace(" ","") + '.md', outDirectory)
 
 def process(document:str, outDirectory:str, mr:MR) -> None:
-- 
GitLab