From bff6dfb1a709b70926dea0bc0e8152acbb679605 Mon Sep 17 00:00:00 2001 From: Darius Peters <38152878+dariusptrs@users.noreply.github.com> Date: Sun, 14 Jul 2024 18:31:58 +0200 Subject: [PATCH] update ci + footer (#9) * update to new template * Update README.md * update ci * Revert "update to new template" This reverts commit 8a21c5ce3f0ddc25f04dfe182ddace4a79f9f8b8. * update original template * update authors * Update FSDigitaltechnik-detailed-version-ws2012-13.tex * fix footer in extended fs --- .../ISSUE_TEMPLATE/inhaltlicher_fehler.yaml | 1 - .github/workflows/ci.yml | 32 ++++++-- .github/workflows/update.yml | 38 ++++++++++ ...italtechnik-detailed-version-ws2012-13.tex | 73 +++++++++++++++--- FSDigitaltechnik.tex | 73 +++++++++++++++--- README.md | 2 +- scripts/__init__.py | 0 scripts/requirements.txt | 2 + scripts/tests/__init__.py | 0 scripts/tests/test_update_files.py | 75 +++++++++++++++++++ scripts/update_files.py | 42 +++++++++++ write-gitid.sh | 11 ++- 12 files changed, 321 insertions(+), 28 deletions(-) create mode 100644 .github/workflows/update.yml create mode 100644 scripts/__init__.py create mode 100644 scripts/requirements.txt create mode 100644 scripts/tests/__init__.py create mode 100644 scripts/tests/test_update_files.py create mode 100644 scripts/update_files.py diff --git a/.github/ISSUE_TEMPLATE/inhaltlicher_fehler.yaml b/.github/ISSUE_TEMPLATE/inhaltlicher_fehler.yaml index e994e5e..95b8d1e 100644 --- a/.github/ISSUE_TEMPLATE/inhaltlicher_fehler.yaml +++ b/.github/ISSUE_TEMPLATE/inhaltlicher_fehler.yaml @@ -1,6 +1,5 @@ name: Inhaltlicher Fehler description: Hilf uns Fehler zu Verbessern -title: '' labels: [bug] assignees: [] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b70f6d..0cae205 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,34 +2,56 @@ name: CI on: push: - branches: [ master ] + branches: [ master, main ] pull_request: - branches: [ master ] - + branches: [ master, main ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12.2' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r scripts/requirements.txt + - name: Run pytest + run: pytest + build: runs-on: ubuntu-latest container: makeappdev/uselatex:latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Configure Git safe directory with GITHUB_WORKSPACE + run: git config --global --add safe.directory $GITHUB_WORKSPACE + - name: Build run: | cmake --version; pdflatex --version mkdir -p build && cd build cmake .. make + - name: Prepare Deployment - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' run: | mkdir -p export echo "# This branch is for deployment only" >> export/README.md cp build/*.pdf export cp build/git.id export + - name: Deploy - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' uses: JamesIves/github-pages-deploy-action@v4.5.0 with: branch: gh-pages diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml new file mode 100644 index 0000000..9fe823a --- /dev/null +++ b/.github/workflows/update.yml @@ -0,0 +1,38 @@ +name: Update README and LaTeX Build File + +on: + workflow_dispatch: + +jobs: + update-and-create-pr: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12.2' + + - name: Run update script + run: python scripts/update_files.py + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - name: Commit changes to a new branch + run: | + git checkout -b changes/${{ github.run_id }} + git add . + git commit -m "Apply automated updates" + git push -u origin changes/${{ github.run_id }} + + - name: Create Pull Request + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr create --base main --head changes/${{ github.run_id }} --title "Specify project URLs and CMake project" --body "Please review the changes applied by the automated script." diff --git a/FSDigitaltechnik-detailed-version-ws2012-13.tex b/FSDigitaltechnik-detailed-version-ws2012-13.tex index 529cebb..8405c22 100644 --- a/FSDigitaltechnik-detailed-version-ws2012-13.tex +++ b/FSDigitaltechnik-detailed-version-ws2012-13.tex @@ -36,16 +36,69 @@ \definecolor{lightgray}{rgb}{0.8,0.8,0.8} \definecolor{gray}{rgb}{0.9,0.9,0.9} -%Kopf- und Fußzeile -\usepackage{fancyhdr} -\pagestyle{fancy} -\fancyhf{} - - \fancyfoot[C]{von Emanuel Regnath (Emanuel.Regnath@tum.de), Martin Zellner (martin.zellner@mytum.de) und Hendrik Böttcher (hendrik.boettcher@tum.de)} - \renewcommand{\headrulewidth}{0.0pt} %obere Linie ausblenden - \renewcommand{\footrulewidth}{0.1pt} %obere Linie ausblenden - \fancyfoot[R]{Stand: \todayV \ um \thistime \ Uhr \qquad \thepage} - \fancyfoot[L]{Homepage: www.latex4ei.de - Fehler bitte \emph{sofort} melden.} +% UPDATE WITHOUT CLASS CHANGE +% ---------------------------------------------------------------------- + +% LastPage +\usepackage{lastpage} + +% Allow hyperlinks + \RequirePackage[pagebackref=true,pdfpagelabels]{hyperref} + +% Colors + \RequirePackage{latex4ei/latex4ei_colors} + \colorlet{col_link}{tum_blue_dark} + \hypersetup{ + colorlinks=true, + linkcolor=col_link, + urlcolor=col_link, + citecolor=col_link, +} + +% set pdfoptions + \AtBeginDocument{ + \hypersetup{ + pdftitle={Digitaltechnik}, + pdfauthor={Emanuel Regnath, Martin Zellner, Hendrik Böttcher}, + pdfcreator={LaTeX4EI template (www.latex4ei.de)}, + pdfkeywords={latex4ei} + } + } + +% Date with git commit number + \newcommand{\themydate}{\today} % Default URL placeholder + \newcommand{\mydate}[1]{\renewcommand{\themydate}{#1}} + +% Header and Footer + \RequirePackage{fancyhdr} + + \pagestyle{fancy} + \fancyhf{} + + \AtBeginDocument{ + \IfFileExists{git.id}{\input{git.id}}{} + \ifdefined\GitNiceDate\mydate{\GitNiceDate\ (git \GitRevision)}\fi + \ifdefined\GitIssuesURL + \ifdefined\setissueslinkurl + \setissueslinkurl{\GitIssuesURL} % Set the actual URL + \fi + \fi + } + +% Define Email + \providecommand{\email}[1]{\href{mailto:#1}{\nolinkurl{#1}}} + +% + \fancyfoot[C]{von Emanuel Regnath (\email{emanuel.regnath@tum.de}), Martin Zellner (\email{martin.zellner@mytum.de}), Hendrik Böttcher (\email{hendrik.boettcher@tum.de})} + \fancyfoot[R]{Stand: \themydate \qquad \thepage/\pageref{LastPage}} + \fancyfoot[L]{Homepage: \url{www.latex4ei.de} -- Fehler bitte \emph{sofort} \href{\issueslinkurl}{melden}.} + + \renewcommand{\headrulewidth}{0.0pt} %obere Linie ausblenden + \renewcommand{\footrulewidth}{0.1pt} %obere Linie ausblenden + + \newcommand{\issueslinkurl}{https://github.com/latex4ei/Allgemein/issues} % Default URL placeholder + \newcommand{\setissueslinkurl}[1]{\renewcommand{\issueslinkurl}{#1}} +% ---------------------------------------------------------------------- % Schriftart SANS für bessere Lesbarkeit bei kleiner Schrift \renewcommand{\familydefault}{\sfdefault} diff --git a/FSDigitaltechnik.tex b/FSDigitaltechnik.tex index d2c0133..972c360 100644 --- a/FSDigitaltechnik.tex +++ b/FSDigitaltechnik.tex @@ -36,16 +36,69 @@ \definecolor{lightgray}{rgb}{0.8,0.8,0.8} \definecolor{gray}{rgb}{0.9,0.9,0.9} -%Kopf- und Fußzeile -\usepackage{fancyhdr} -\pagestyle{fancy} -\fancyhf{} - - \fancyfoot[C]{Emanuel Regnath (Emanuel.Regnath@tum.de), Martin Zellner (martin.zellner@mytum.de), Hendrik Böttcher (hendrik.boettcher@tum.de)} - \renewcommand{\headrulewidth}{0.0pt} %obere Linie ausblenden - \renewcommand{\footrulewidth}{0.1pt} %obere Linie ausblenden - \fancyfoot[R]{(Gekürzt, überarbeitet - lukas.kompatscher@tum.de) Stand: \todayV \qquad \thepage} - \fancyfoot[L]{Homepage: www.latex4ei.de - Fehler bitte \emph{sofort} melden.} +% UPDATE WITHOUT CLASS CHANGE +% ---------------------------------------------------------------------- + +% LastPage +\usepackage{lastpage} + +% Allow hyperlinks + \RequirePackage[pagebackref=true,pdfpagelabels]{hyperref} + +% Colors + \RequirePackage{latex4ei/latex4ei_colors} + \colorlet{col_link}{tum_blue_dark} + \hypersetup{ + colorlinks=true, + linkcolor=col_link, + urlcolor=col_link, + citecolor=col_link, +} + +% set pdfoptions + \AtBeginDocument{ + \hypersetup{ + pdftitle={Digitaltechnik}, + pdfauthor={Emanuel Regnath, Martin Zellner, Hendrik Böttcher}, + pdfcreator={LaTeX4EI template (www.latex4ei.de)}, + pdfkeywords={latex4ei} + } + } + +% Date with git commit number + \newcommand{\themydate}{\today} % Default URL placeholder + \newcommand{\mydate}[1]{\renewcommand{\themydate}{#1}} + +% Header and Footer + \RequirePackage{fancyhdr} + + \pagestyle{fancy} + \fancyhf{} + + \AtBeginDocument{ + \IfFileExists{git.id}{\input{git.id}}{} + \ifdefined\GitNiceDate\mydate{\GitNiceDate\ (git \GitRevision)}\fi + \ifdefined\GitIssuesURL + \ifdefined\setissueslinkurl + \setissueslinkurl{\GitIssuesURL} % Set the actual URL + \fi + \fi + } + +% Define Email + \providecommand{\email}[1]{\href{mailto:#1}{\nolinkurl{#1}}} + +% + \fancyfoot[C]{von Emanuel Regnath (\email{emanuel.regnath@tum.de}), Martin Zellner (\email{martin.zellner@mytum.de}), Hendrik Böttcher (\email{hendrik.boettcher@tum.de}) } + \fancyfoot[R]{Stand: \themydate \qquad \thepage/\pageref{LastPage}} + \fancyfoot[L]{Homepage: \url{www.latex4ei.de} -- Fehler bitte \emph{sofort} \href{\issueslinkurl}{melden}.} + + \renewcommand{\headrulewidth}{0.0pt} %obere Linie ausblenden + \renewcommand{\footrulewidth}{0.1pt} %obere Linie ausblenden + + \newcommand{\issueslinkurl}{https://github.com/latex4ei/Allgemein/issues} % Default URL placeholder + \newcommand{\setissueslinkurl}[1]{\renewcommand{\issueslinkurl}{#1}} +% ---------------------------------------------------------------------- % Schriftart SANS für bessere Lesbarkeit bei kleiner Schrift \renewcommand{\familydefault}{\sfdefault} diff --git a/README.md b/README.md index 10f343c..ef1b864 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# +# Digitaltechnik [![Actions Status](https://github.com/latex4ei/Digitaltechnik/workflows/CI/badge.svg)](https://github.com/latex4ei/Digitaltechnik) [![Join the chat at https://gitter.im/LaTeX4Ei/Lobby](https://badges.gitter.im/LaTeX4Ei/Lobby.svg)](https://gitter.im/LaTeX4Ei/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/requirements.txt b/scripts/requirements.txt new file mode 100644 index 0000000..fe79a98 --- /dev/null +++ b/scripts/requirements.txt @@ -0,0 +1,2 @@ +pyfakefs==5.3.5 +pytest==8.1.1 diff --git a/scripts/tests/__init__.py b/scripts/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/tests/test_update_files.py b/scripts/tests/test_update_files.py new file mode 100644 index 0000000..efbc556 --- /dev/null +++ b/scripts/tests/test_update_files.py @@ -0,0 +1,75 @@ +import pytest +from scripts.update_files import check_tex_file_exists, update_readme_content, update_cmake_content +from pathlib import Path +import os + +@pytest.fixture +def fake_base_path(fs): + """Fixture to create a base path and mock environment variable.""" + base_path = Path("/test/project") + fs.create_dir(base_path) + os.environ['GITHUB_REPOSITORY'] = 'user/correct_title' + return base_path + +def test_check_tex_file_exists__file_does_not_exist__should_raise(fake_base_path, fs): + repo_name = "correct_title" + fs.create_file(fake_base_path / f"{repo_name}.tex") + check_tex_file_exists(repo_name, fake_base_path) + + with pytest.raises(FileNotFoundError): + check_tex_file_exists("nonexistent_repo", Path(fake_base_path)) + +def test_update_readme_content(fake_base_path, fs): + initial_readme_content = """ + # WrongTitle + Some content in the README file. + [![Actions Status](https://github.com/latex4ei/WrongCheatsheetTemplate/workflows/CI/badge.svg)](https://github.com/latex4ei/WrongCheatsheetTemplate) + ## Section + More details here. + """.strip() + fs.create_file(fake_base_path / "README.md", contents=initial_readme_content) + repo_name = "correct_title" + github_repository = 'user/correct_title' + + updated_content = update_readme_content(initial_readme_content, repo_name, github_repository) + + expected_content = """ + # correct_title + Some content in the README file. + [![Actions Status](https://github.com/user/correct_title/workflows/CI/badge.svg)](https://github.com/user/correct_title) + ## Section + More details here. + """.strip() + assert updated_content == expected_content, "README.md content was not updated correctly." + +def test_update_cmake_content(fake_base_path, fs): + initial_cmake_content = """ + cmake_minimum_required(VERSION 3.12) + project(WrongProjectName NONE) + # Add the main LaTeX document + add_latex_document( + CheatsheetTemplate.tex + AnotherDoc.tex + FORCE_PDF + IMAGE_DIRS img + DEPENDS writegitid + ) + """.strip() + fs.create_file(fake_base_path / "CMakeLists.txt", contents=initial_cmake_content) + repo_name = "correct_title" + + updated_content = update_cmake_content(initial_cmake_content, repo_name) + + expected_content = """ + cmake_minimum_required(VERSION 3.12) + project(correct_title NONE) + # Add the main LaTeX document + add_latex_document( + correct_title.tex + AnotherDoc.tex + FORCE_PDF + IMAGE_DIRS img + DEPENDS writegitid + ) + """.strip() + assert updated_content == expected_content, "CMakeLists.txt content was not updated correctly." diff --git a/scripts/update_files.py b/scripts/update_files.py new file mode 100644 index 0000000..ab0c3e1 --- /dev/null +++ b/scripts/update_files.py @@ -0,0 +1,42 @@ +from pathlib import Path +import re +import os +import sys + +def check_tex_file_exists(repo_name: str, base_path: Path): + """Check if a .tex file with the same name as the repository exists.""" + tex_file_path = base_path / f"{repo_name}.tex" + if not tex_file_path.exists(): + msg = f"No .tex file found with the name {tex_file_path.name}. File name must match repo name." + raise FileNotFoundError(msg) + +def update_readme_content(content: str, repo_name: str, github_repository: str) -> str: + """Updates the README.md content.""" + content = re.sub(r'^# .+', f'# {repo_name}', content, count=1, flags=re.MULTILINE) + actions_status_line = f'[![Actions Status](https://github.com/{github_repository}/workflows/CI/badge.svg)](https://github.com/{github_repository})' + return re.sub(r'\[!\[Actions Status\].*', actions_status_line, content) + +def update_cmake_content(content: str, repo_name: str) -> str: + """Updates the CMakeLists.txt content.""" + content = re.sub(r'project\(([^ ]*)', f'project({repo_name}', content, count=1) + return re.sub(r'^( *)[^\s#].*?\.tex', r'\1' + f'{repo_name}.tex', content, flags=re.MULTILINE, count=1) + +def main(github_repository: str): + repo_name = Path(github_repository).name + base_path = Path(__file__).parent.parent + + check_tex_file_exists(repo_name, base_path) + + readme_path = base_path / 'README.md' + cmake_path = base_path / 'CMakeLists.txt' + + readme_content = readme_path.read_text() + updated_readme_content = update_readme_content(readme_content, repo_name, github_repository) + readme_path.write_text(updated_readme_content) + + cmake_content = cmake_path.read_text() + updated_cmake_content = update_cmake_content(cmake_content, repo_name) + cmake_path.write_text(updated_cmake_content) + +if __name__ == "__main__": + main(os.getenv('GITHUB_REPOSITORY')) diff --git a/write-gitid.sh b/write-gitid.sh index 85d217d..b441cae 100755 --- a/write-gitid.sh +++ b/write-gitid.sh @@ -11,4 +11,13 @@ fi GITREV=$(git rev-list HEAD --count) echo "\\def\\GitRevision{$GITREV}"> git.id -git show -s --format=%ci | xargs -I var_d $DATEBIN -d "var_d" +\\def\\GitNiceDate{%-d.\ %B\ %Y\ um\ %H:%M\ Uhr} >> git.id +git show -s --format=%ci | xargs -I var_d $DATEBIN -d "var_d" +\\def\\GitNiceDate{%-d.\ %B\ %Y} >> git.id + +# Get the repository's remote URL +REPO_URL=$(git remote get-url origin) + +# Convert SSH URL to HTTPS URL and append /issues for the issues page +# This also ensures it works for URLs ending with .git and without +ISSUES_URL=$(echo $REPO_URL | sed -e 's/^git@github\.com:/https:\/\/github\.com\//' -e 's/\.git$//' -e 's/$/\/issues/') + +echo "\\def\\GitIssuesURL{$ISSUES_URL}" >> git.id