bot/code_review_bot/tasks/docupload.py (85 lines of code) (raw):

import os import structlog from code_review_bot.tasks.base import NoticeTask logger = structlog.get_logger(__name__) MAX_LINKS = 21 # Should stay up-to-date with https://searchfox.org/mozilla-central/rev/2d24d893669ad0fe8d76b0427b25369d35fcc19b/docs/conf.py#79 DOC_FILE_SUFFIXES = (".rst", ".md") # Any additional files that could trigger doc rebuild. EXTRA_DOC_FILES = ("mots.yaml",) DOC_LINK = """ - file [{path}]({doc_url}) """ COMMENT_LINKS_TO_DOC = """ NOTE: {nb_docs_hint} modified in diff {diff_id} {pronoun} can be previewed for one week:{doc_urls} """ COMMENT_LINK_TO_DOC = """ NOTE: Several documentation files were modified in diff {diff_id} They can be previewed [here]({doc_url}) for one week. """ def direct_doc_url(path, docs_url, trees): base_docs_url = os.path.dirname(docs_url) filename, _ = os.path.splitext(os.path.basename(path)) dirname = os.path.dirname(path) for docs_match_in_trees, dirname_in_trees in trees.items(): if dirname.startswith(dirname_in_trees): truncated_dirname = dirname.replace(dirname_in_trees, "", 1) # Forging the link towards the documentation return "/".join( part.strip("/") for part in [ base_docs_url, docs_match_in_trees, truncated_dirname, f"{filename}.html", ] if part ) # We didn't find a mapping for the file in the trees artifact, this should never happen logger.warn( "Found no match in the trees.json mapping to build a direct documentation link", file=path, ) return docs_url class DocUploadTask(NoticeTask): """ Support doc-upload tasks """ artifacts = ["public/firefox-source-docs-url.txt", "public/trees.json"] @property def display_name(self): return "doc-upload" def build_notice(self, artifacts, revision): artifact = artifacts.get("public/firefox-source-docs-url.txt") if artifact is None: logger.warn("Missing firefox-source-docs-url.txt") return "" doc_url = artifact.decode("utf-8") trees = artifacts.get("public/trees.json") if trees is None: logger.warn("Missing trees.json") # The mapping is now mandatory to detect documentation changes return "" doc_files = [ file for file in revision.files if ( any( os.path.dirname(file).startswith(prefix) for prefix in trees.values() ) and file.endswith(DOC_FILE_SUFFIXES) ) or file in EXTRA_DOC_FILES ] nb_docs = len(doc_files) if not nb_docs: logger.info( "Found no documentation file in revision, skipping comment creation" ) return "" if nb_docs > MAX_LINKS: return COMMENT_LINK_TO_DOC.format(diff_id=revision.diff_id, doc_url=doc_url) nb_docs_hint = ( f"{nb_docs} documentation files were" if nb_docs > 1 else "A documentation file was" ) pronoun = "They" if nb_docs > 1 else "It" doc_urls = "".join( [ DOC_LINK.format(path=file, doc_url=direct_doc_url(file, doc_url, trees)) for file in doc_files ] ) return COMMENT_LINKS_TO_DOC.format( nb_docs_hint=nb_docs_hint, diff_id=revision.diff_id, pronoun=pronoun, doc_urls=doc_urls, )