From 29b1bf60b5dc61d96196a4170c91bee09f21dee2 Mon Sep 17 00:00:00 2001 From: Miguel Angel Reina Ortega <miguelangel.reinaortega@etsi.org> Date: Thu, 20 Jul 2023 10:21:31 +0200 Subject: [PATCH] Generation of changemark CR: - generation of changemark MD files per modified Clause - conversion of MD files to docx files - combination of the docx files into the CR docx file --- .gitlab-ci.yml | 4 +- generate_changemarks.sh | 23 +++- onem2m_coversheet_template.docx | Bin 42519 -> 42296 bytes onem2m_delimiter_end.docx | Bin 24204 -> 23984 bytes onem2m_delimiter_start.docx | Bin 23849 -> 23837 bytes pandocFilter/changemarks.py | 236 ++++++++++++++++++++++++++++++++ pandocFilter/requirements.txt | 2 + pandocFilter/setup.py | 3 +- 8 files changed, 261 insertions(+), 7 deletions(-) create mode 100644 pandocFilter/changemarks.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cecaed0..03517a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,7 +28,7 @@ Build pythonForPandocFilter docker image: - pandocFilter/setup.py - pandocFilter/requirements.txt - pandocFilter/pandocFilter.py - + - pandocFilter/changemarks.py Word CR text: stage: generation @@ -36,7 +36,7 @@ Word CR text: - merge_requests before_script: - | - curl "${CI_API_V4_URL}/projects/$TOOLS_SCRIPTS_PROJECT_ID/repository/files/generate_changemarks%2Esh/raw?ref=master" >> generate_changemarks.sh + curl "${CI_API_V4_URL}/projects/$TOOLS_SCRIPTS_PROJECT_ID/repository/files/generate_changemarks%2Esh/raw?ref=miguel" >> generate_changemarks.sh - chmod +x generate_changemarks.sh - | curl "${CI_API_V4_URL}/projects/$TOOLS_SCRIPTS_PROJECT_ID/repository/files/onem2m_delimiter_start%2Edocx/raw?ref=master" >> onem2m_delimiter_start.docx diff --git a/generate_changemarks.sh b/generate_changemarks.sh index 0861f57..2bf7be3 100644 --- a/generate_changemarks.sh +++ b/generate_changemarks.sh @@ -1,6 +1,8 @@ #!/bin/bash -DOCKER_IMAGE=forge.3gpp.org:5050/tools/3gpp-scripts/forgelib:v2.2.0 +FORGELIB_DOCKER_IMAGE=forge.3gpp.org:5050/tools/3gpp-scripts/forgelib:miguel +PANDOC_FILTER_DOCKER_IMAGE=pandocfilter:latest +DOCKER_IMAGE=pandoc/core:3.1.1.0 echo "\n------ Checking for docker image --------" docker pull "$DOCKER_IMAGE" @@ -11,13 +13,26 @@ rm **/*.docx echo "------ Parsing repo URL --------" HOST_URL=$(echo $1 | cut -d'/' -f 1-3) -PROJECT_NAME=$(echo $1 | cut -d'/' -f 4- | cut -d'.' -f 1) +PROJECT_NAME=$(echo $1 | cut -d'/' -f 6- | cut -d'.' -f 1) echo "HOST URL:" $HOST_URL echo "PROJECT NAME:" $PROJECT_NAME echo "PROJECT ID:" $2 echo "MERGE IID:" $3 -echo "\n------ Generating change marks --------" -docker container run --rm -v $(pwd):/tmp/ "$DOCKER_IMAGE" forgelib-changedocs -vv --combine --diffs --preprocessor onem2m --outPath=/tmp/docs --startdelimiter "/tmp/$4" --enddelimiter "/tmp/$5" --coversheet "/tmp/$6" "$HOST_URL" "$2" "$PROJECT_NAME" "$3" +echo "\n------ Generating change marks MD --------" +#docker container run --rm -v $(pwd):/tmp/ "$DOCKER_IMAGE" forgelib-changedocs -vv --combine --diffs --preprocessor onem2m --outPath=/tmp/docs --startdelimiter "/tmp/$4" --enddelimiter "/tmp/$5" --coversheet "/tmp/$6" "$HOST_URL" "$2" "$PROJECT_NAME" "$3" +docker container run --rm -v $(pwd):/tmp/ -u $(id -u):$(id -g) "$PANDOC_FILTER_DOCKER_IMAGE" changemarks -o "/tmp/out" "$HOST_URL" "$2" "$3" + +echo "\n------ Generating changemarks docx --------" +for i in out/*.md ; do + DOCUMENT_NAME=$(echo $i | cut -d'/' -f 2) + echo "\n------ Preparaing spec --------" + docker run --rm -v $(pwd):/tmp/ -u $(id -u):$(id -g) "$PANDOC_FILTER_DOCKER_IMAGE" pandocFilter -o "/tmp/out" "/tmp/$i" + echo "\n------ Publishing spec --------" + docker run --rm -v $(pwd):/data -u $(id -u):$(id -g) "$DOCKER_IMAGE" "/data/$i" -f markdown -t docx --reference-doc "Spec-template.docx" -o "/data/out/${DOCUMENT_NAME}.docx" +done + +echo "\n------ Combining docx --------" +docker container run --rm -v $(pwd):/tmp/ -u $(id -u):$(id -g) "$FORGELIB_DOCKER_IMAGE" forgelib-changedocs -vv -sf "/tmp/out/" --preprocessor onem2m --outPath=/tmp/docs --startdelimiter "/tmp/$4" --enddelimiter "/tmp/$5" --coversheet "/tmp/$6" "$HOST_URL" "$2" "$3" exit 0 diff --git a/onem2m_coversheet_template.docx b/onem2m_coversheet_template.docx index e93264f9c2751c408774ea4965565b0cec72a962..e59b7a310a864a161e843427276c01f11ee9516f 100644 GIT binary patch delta 10443 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 delta 10728 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 diff --git a/onem2m_delimiter_end.docx b/onem2m_delimiter_end.docx index 4e5bfed1ded1ae4614de8815b33a3ac60ba81044..c86f45b8583c94167a34463367014cdff113e749 100644 GIT binary patch delta 6292 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 delta 6572 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 At^fc4 diff --git a/onem2m_delimiter_start.docx b/onem2m_delimiter_start.docx index 5b786d7e9db7dcaff417f932cb010364ed502c4f..ec52d4eb637802df8f3514ce4ca68c39763e7f17 100644 GIT binary patch delta 5525 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 Xy2qMo7?}UOMe)!DA6C<P|2+K<j9f}+ delta 5514 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 HAL;)Aq4i)V diff --git a/pandocFilter/changemarks.py b/pandocFilter/changemarks.py new file mode 100644 index 0000000..9d4a0a5 --- /dev/null +++ b/pandocFilter/changemarks.py @@ -0,0 +1,236 @@ +## +# changemarks.py +# +# Script to generate a markdown file per clause modified in a merge request +# +# (c) 2023 by Miguel Angel Reina Ortega +# License: BSD 3-Clause License. See the LICENSE file for further details. +# + +import argparse, os, re, sys +from rich import print +from rich.progress import Progress, TextColumn, TimeElapsedColumn +import logging +import requests +from unidiff import PatchSet + +def fetch(url : str, expected_content_type : str = None) -> requests.Response: + r = requests.get(url) + logging.debug(f"Fetching {url}") + if (r.status_code != 200): + errorMessage = f"Failed attempting to retrieve {url}, status code {r.status_code}" + logging.error(errorMessage) + raise ValueError(errorMessage) + if expected_content_type: + if r.headers['Content-Type'] != expected_content_type: + errorMessage = f"Unexpected content type retrieving {url}. Expected {expected_content_type}, got {r.headers['Content-Type']}" + logging.error(errorMessage) + raise ValueError(errorMessage) + return r + +def fetch_text(url : str, expected_content_type : str = None) -> str: + r = fetch(url, expected_content_type) + return r.text + +def fetch_json(url : str, expected_content_type : str = None) -> requests.Response: + r = fetch(url, expected_content_type) + return r.json() + +def readMDFile(progress:Progress, document:str) -> list[str]: + """ Read the markdown file and return a list of lines. + """ + _taskID = progress.add_task('[blue]Reading document', start=False, total=0) + + # Check if file exists + if not os.path.exists(document): + print(f'File {document} does not exist') + exit(1) + + # Read the file + with open(document, 'r', encoding='utf-8', errors = 'replace') as f: + progress.stop_task(_taskID) + return f.readlines() + + +def writeMDFile(progress:Progress, mdLines:list[str], document:str, outDirectory:str) -> None: + """ Write the markdown file. + + """ + _taskID = progress.add_task('[blue]Writing document', start=False, total=0) + + # Write the file + with open(f'{outDirectory}/{os.path.basename(document)}', 'w', encoding='utf-8', errors = 'replace') as f: + f.writelines(mdLines) + progress.stop_task(_taskID) + + +class Clause(): + ''' + Defines a clause of the base document + ''' + + def __init__(self, line, from_id, to_id, clause_nr): + self.raw = line + self.from_id = from_id + self.to_id = to_id + self.clause_nr = clause_nr + + + +def find_all_clauses(progress:Progress, mdLines:list[str]): + ''' + Scans the body of the document to find all clauses + Returns a list of Clauses, start index and end index + ''' + + _taskID = progress.add_task('[blue]Find all available clauses', start=False, total=0) + + clauseregex = re.compile('^#+\s(\d(\.\d)*|Annex \w|\w*(\.\d)*).*') + clauses:list[Clause] = [] + + index = 1 + empty = "" + clause = Clause(empty,0,0,empty) + + for line in mdLines: + if line.startswith('#'): + matches = re.findall(clauseregex, line) # Match heading + if matches: # It may be the end of the clause or the start of a subclause + if index - 2 == clause.from_id: # It is a subclause + clause.from_id = index + clause.raw = line + clause.clause_nr = matches[0][0] + else: # It is the end of the clause + clause.to_id = index - 1 + clauses.append(clause) + clause = Clause(line,index,index,matches[0][0]) + else: # it is last clause + print("Unknown heading") + + index = index + 1 + + # Append last clause (usually History) + clause.to_id = index - 1 + clauses.append(clause) + + return clauses + +class MR: + def __init__(self, project_id, mr_id, root = "https://git.onem2m.org"): + self.project_id = project_id + self.mr_id = mr_id + self.root = root + self.raw_project_details = fetch_json(self.api_url()) + self.web_url = self.raw_project_details['web_url'] + self.raw_mr_details = fetch_json(self.api_url(f'/merge_requests/{self.mr_id}')) + self.author = self.raw_mr_details['author']['name'] + self.target_branch = self.raw_mr_details['target_branch'] + self.source_branch = self.raw_mr_details['source_branch'] + self.title = self.raw_mr_details['title'] + self.description = self.raw_mr_details['description'] + self.raw_diff = fetch_text(f'{self.web_url}/-/merge_requests/{self.mr_id}.diff', expected_content_type='text/plain') + self.patch_set = PatchSet.from_string(self.raw_diff) + + def api_url(self, route : str = "") -> str: + return f"{self.root}/api/v4/projects/{self.project_id}/{route}" + def retrieve_text(self, branch: str, filename: str) -> str: + return fetch_text(f"{self.web_url}/-/raw/{branch}/{filename}") + +def find_changed_clauses(progress:Progress, mdLines:list[str], clauses:list[Clause], mr:MR, outDirectory:str ): + ''' + Determine the clauses that have been modified by the merge request +https://forge.etsi.org/rep/cdm/pipeline-scripts/-/blob/main/common/Dockerfile.stfubuntu Returns a list of Clauses, start index and end index + ''' + + _taskID = progress.add_task('[blue]Find changed clauses', start=False, total=0) + + changed_clauses:list[Clause] = [] + empty = "" + changed_clause = Clause(empty,0,0,empty) + + for patched_file in mr.patch_set: + if patched_file.source_file.startswith("a/TS"): + logging.debug(f"Looking at changes in {patched_file.source_file}") + for change in patched_file: + # 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)): + 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)): + changed_clause = clauses.pop(i) + changed_clauses.append(clause) + generateMDforChange(progress, mdLines, changed_clause, change, outDirectory, False) + break + i = i + 1 + + for clause in changed_clauses: + logging.debug(f"Clause {clause.clause_nr} contains modifications") + + return changed_clauses + +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 +https://forge.etsi.org/rep/cdm/pipeline-scripts/-/blob/main/common/Dockerfile.stfubuntu Returns a list of Clauses, start index and end index + ''' + + _taskID = progress.add_task('[blue]Generate MD for changed clauses', start=False, total=0) + + if not existing_clause: + index = changed_clause.from_id - 1 + clauseMDlines: list[str] = [] + while index < changed_clause.to_id: + clauseMDlines.append(mdLines[index]+'\n') + index = index + 1 + else: + clauseMDlines = readMDFile(progress, changed_clause.clause_nr +'.md') + + j = change.target_start - changed_clause.from_id # index gap + for line in change: + if (not (line.value.strip() == '') and (line.is_added)): + clauseMDlines.insert(j, "<span class=\"underline\">" + line.value + "</span>\n\n") + #clauseMDlines.insert(j, "<mark>" + line.value.strip("\n") + "</mark>\n\n") + clauseMDlines.pop(j+1) + elif line.is_removed: + clauseMDlines.insert(j, "~~" + line.value.strip() + "~~") + + j = j + 1 + + writeMDFile(progress, clauseMDlines, changed_clause.clause_nr.replace(" ","") + '.md', outDirectory) + +def process(document:str, outDirectory:str, mr:MR) -> None: + with Progress(TextColumn('{task.description}'), TimeElapsedColumn()) as progress: + sourceText = mr.retrieve_text(mr.source_branch, document) + sourceMdLines = sourceText.splitlines(keepends=False) + clauses = find_all_clauses(progress, sourceMdLines) + changed_clauses = find_changed_clauses(progress, sourceMdLines, clauses, mr, outDirectory) + +def main(args=None): + # Parse command line arguments + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--outdir', '-o', action='store', dest='outDirectory', default = 'out', metavar = '<output directory>', help = 'specify output directory') + parser.add_argument('rootURL', help="Forge root URL") + parser.add_argument('projectID', help="Forge project ID") + parser.add_argument('mergeID', help="Merge IID") + + pargs = parser.parse_args() + + # Process documents and print output + + os.makedirs(pargs.outDirectory, exist_ok = True) + + mr = MR(pargs.projectID, pargs.mergeID, pargs.rootURL) + + for patched_file in mr.patch_set: + if patched_file.source_file.startswith("a/TS"): + filename = patched_file.source_file.split("/")[1] + process(filename, pargs.outDirectory, mr) + else: + logging.debug(f"Cannot process file named {patched_file.source_file}") + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/pandocFilter/requirements.txt b/pandocFilter/requirements.txt index 4c6b806..986b28e 100644 --- a/pandocFilter/requirements.txt +++ b/pandocFilter/requirements.txt @@ -12,3 +12,5 @@ pygments==2.15.1 # via rich rich==13.3.5 # via oneM2M-markdown-to-pandoc-filter (setup.py) +requests==2.31.0 +unidiff==0.7.5 diff --git a/pandocFilter/setup.py b/pandocFilter/setup.py index 7d47e52..066d12e 100644 --- a/pandocFilter/setup.py +++ b/pandocFilter/setup.py @@ -11,7 +11,8 @@ setup( 'rich', ], entry_points= { - 'console_scripts' : ['pandocFilter=pandocFilter:main'] + 'console_scripts' : ['pandocFilter=pandocFilter:main', + 'changemarks=changemarks:main'] } ) -- GitLab