From 18a684789dbcbd601383a3d5f1d46f07e9e8384d Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 16:03:04 +0200 Subject: [PATCH 1/8] feat(web): add version info display --- .github/workflows/docker-build.ecr.yml | 16 +++++++ .github/workflows/docker-build.ghcr.yml | 16 +++++++ Dockerfile | 6 ++- src/server/main.py | 6 ++- src/server/routers/dynamic.py | 18 ++++---- src/server/routers/index.py | 18 ++++---- src/server/server_config.py | 45 ++++++++++++++++++++ src/server/templates/components/footer.jinja | 8 ++++ 8 files changed, 112 insertions(+), 21 deletions(-) diff --git a/.github/workflows/docker-build.ecr.yml b/.github/workflows/docker-build.ecr.yml index 0a819e12..9ff5eac3 100644 --- a/.github/workflows/docker-build.ecr.yml +++ b/.github/workflows/docker-build.ecr.yml @@ -47,6 +47,19 @@ jobs: echo "timestamp=$(date +%s)" >> $GITHUB_OUTPUT echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + - name: Determine version + id: version + run: | + if [[ "${{ github.ref_type }}" == "tag" ]]; then + # If we're on a tag, use the tag name as version + echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + else + # If we're not on a tag, use branch-commit-hash format + BRANCH_NAME="${{ github.ref_name }}" + COMMIT_HASH="${{ steps.vars.outputs.sha_short }}" + echo "version=${BRANCH_NAME}-${COMMIT_HASH}" >> $GITHUB_OUTPUT + fi + - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v2 @@ -78,5 +91,8 @@ jobs: push: ${{ github.event_name != 'pull_request' || env.PUSH_FROM_PR == 'true' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: | + VERSION=${{ steps.version.outputs.version }} + REPOSITORY_URL=https://github.com/${{ github.repository }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/docker-build.ghcr.yml b/.github/workflows/docker-build.ghcr.yml index de72fbaa..05328ac9 100644 --- a/.github/workflows/docker-build.ghcr.yml +++ b/.github/workflows/docker-build.ghcr.yml @@ -51,6 +51,19 @@ jobs: echo "timestamp=$(date +%s)" >> $GITHUB_OUTPUT echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + - name: Determine version + id: version + run: | + if [[ "${{ github.ref_type }}" == "tag" ]]; then + # If we're on a tag, use the tag name as version + echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + else + # If we're not on a tag, use branch-commit-hash format + BRANCH_NAME="${{ github.ref_name }}" + COMMIT_HASH="${{ steps.vars.outputs.sha_short }}" + echo "version=${BRANCH_NAME}-${COMMIT_HASH}" >> $GITHUB_OUTPUT + fi + - name: Log in to the Container registry uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 with: @@ -87,6 +100,9 @@ jobs: push: ${{ github.event_name != 'pull_request' || env.PUSH_FROM_PR == 'true' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: | + VERSION=${{ steps.version.outputs.version }} + REPOSITORY_URL=https://github.com/${{ github.repository }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index d686922e..863298a6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,9 +20,13 @@ FROM python:3.13.5-slim@sha256:4c2cf9917bd1cbacc5e9b07320025bdb7cdf2df7b0ceaccb5 ARG UID=1000 ARG GID=1000 +ARG VERSION=unknown +ARG REPOSITORY_URL=https://github.com/coderamp-labs/gitingest ENV PYTHONUNBUFFERED=1 \ - PYTHONDONTWRITEBYTECODE=1 + PYTHONDONTWRITEBYTECODE=1 \ + VERSION=${VERSION} \ + REPOSITORY_URL=${REPOSITORY_URL} RUN set -eux; \ apt-get update; \ diff --git a/src/server/main.py b/src/server/main.py index d973c387..f66f674f 100644 --- a/src/server/main.py +++ b/src/server/main.py @@ -18,7 +18,7 @@ from gitingest.utils.logging_config import get_logger from server.metrics_server import start_metrics_server from server.routers import dynamic, index, ingest -from server.server_config import templates +from server.server_config import get_version_info, templates from server.server_utils import limiter, rate_limit_exception_handler # Load environment variables from .env file @@ -169,7 +169,9 @@ async def custom_swagger_ui(request: Request) -> HTMLResponse: - **HTMLResponse**: Custom Swagger UI documentation page """ - return templates.TemplateResponse("swagger_ui.jinja", {"request": request}) + context = {"request": request} + context.update(get_version_info()) + return templates.TemplateResponse("swagger_ui.jinja", context) @app.get("/api", include_in_schema=True) diff --git a/src/server/routers/dynamic.py b/src/server/routers/dynamic.py index 93b9d68b..49fdf1b9 100644 --- a/src/server/routers/dynamic.py +++ b/src/server/routers/dynamic.py @@ -3,7 +3,7 @@ from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse -from server.server_config import templates +from server.server_config import get_version_info, templates router = APIRouter() @@ -29,11 +29,11 @@ async def catch_all(request: Request, full_path: str) -> HTMLResponse: and other default parameters such as file size. """ - return templates.TemplateResponse( - "git.jinja", - { - "request": request, - "repo_url": full_path, - "default_max_file_size": 243, - }, - ) + context = { + "request": request, + "repo_url": full_path, + "default_max_file_size": 243, + } + context.update(get_version_info()) + + return templates.TemplateResponse("git.jinja", context) diff --git a/src/server/routers/index.py b/src/server/routers/index.py index af4abd51..e8dfdfdb 100644 --- a/src/server/routers/index.py +++ b/src/server/routers/index.py @@ -3,7 +3,7 @@ from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse -from server.server_config import EXAMPLE_REPOS, templates +from server.server_config import EXAMPLE_REPOS, get_version_info, templates router = APIRouter() @@ -27,11 +27,11 @@ async def home(request: Request) -> HTMLResponse: and other default parameters such as file size. """ - return templates.TemplateResponse( - "index.jinja", - { - "request": request, - "examples": EXAMPLE_REPOS, - "default_max_file_size": 243, - }, - ) + context = { + "request": request, + "examples": EXAMPLE_REPOS, + "default_max_file_size": 243, + } + context.update(get_version_info()) + + return templates.TemplateResponse("index.jinja", context) diff --git a/src/server/server_config.py b/src/server/server_config.py index d333e6a1..92be7203 100644 --- a/src/server/server_config.py +++ b/src/server/server_config.py @@ -2,6 +2,7 @@ from __future__ import annotations +import os from pathlib import Path from fastapi.templating import Jinja2Templates @@ -21,6 +22,50 @@ ] +# Version and repository configuration +VERSION = os.getenv("VERSION", "unknown") +REPOSITORY_URL = os.getenv("REPOSITORY_URL", "https://github.com/coderamp-labs/gitingest") + +# Minimum number of parts expected in branch-commit format (e.g., "main-abc1234") +MIN_BRANCH_COMMIT_PARTS = 2 + + +def get_version_info() -> dict[str, str]: + """Get version information including display version and link. + + Returns + ------- + dict[str, str] + Dictionary containing 'version' and 'version_link' keys. + + """ + version = VERSION + repo_url = REPOSITORY_URL.rstrip("/") + + # Check if version looks like a tag (doesn't contain branch-commit pattern) + if version != "unknown" and "-" in version and len(version.split("-")) >= MIN_BRANCH_COMMIT_PARTS: + # This looks like branch-commit format (e.g., "main-abc1234") + parts = version.split("-") + if len(parts) >= MIN_BRANCH_COMMIT_PARTS: + # Take the last part as commit hash + commit_hash = parts[-1] + version_link = f"{repo_url}/commit/{commit_hash}" + else: + # Fallback to main branch + version_link = f"{repo_url}/tree/main" + elif version != "unknown": + # This looks like a tag version + version_link = f"{repo_url}/releases/tag/{version}" + else: + # Unknown version, link to main branch + version_link = f"{repo_url}/tree/main" + + return { + "version": version, + "version_link": version_link, + } + + # Use absolute path to templates directory templates_dir = Path(__file__).parent / "templates" templates = Jinja2Templates(directory=templates_dir) diff --git a/src/server/templates/components/footer.jinja b/src/server/templates/components/footer.jinja index 9784dfeb..7c33ae8d 100644 --- a/src/server/templates/components/footer.jinja +++ b/src/server/templates/components/footer.jinja @@ -18,5 +18,13 @@ 'Discord') }} + {# Version information row #} +
+ Version: + {{ version }} +
From b645ee71eb1b9f83d8c6431c08d4dac40662899d Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 16:25:31 +0200 Subject: [PATCH 2/8] refactor(server): improve version link parsing --- src/server/server_config.py | 22 ++++++++++++++------ src/server/templates/components/footer.jinja | 8 ------- src/server/templates/components/navbar.jinja | 17 +++++++++------ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/server/server_config.py b/src/server/server_config.py index 92be7203..e6cd4dd9 100644 --- a/src/server/server_config.py +++ b/src/server/server_config.py @@ -42,14 +42,24 @@ def get_version_info() -> dict[str, str]: version = VERSION repo_url = REPOSITORY_URL.rstrip("/") - # Check if version looks like a tag (doesn't contain branch-commit pattern) - if version != "unknown" and "-" in version and len(version.split("-")) >= MIN_BRANCH_COMMIT_PARTS: - # This looks like branch-commit format (e.g., "main-abc1234") + # Check if version contains PR number (e.g., "pr-123", "pull-456") + if version != "unknown" and ("-" in version): parts = version.split("-") if len(parts) >= MIN_BRANCH_COMMIT_PARTS: - # Take the last part as commit hash - commit_hash = parts[-1] - version_link = f"{repo_url}/commit/{commit_hash}" + # Check if first part indicates a PR + if parts[0].lower() in ("pr", "pull"): + # Extract PR number from the second part + try: + pr_number = int(parts[1]) + version_link = f"{repo_url}/pull/{pr_number}" + except (ValueError, IndexError): + # If PR number is invalid, fallback to main branch + version_link = f"{repo_url}/tree/main" + else: + # This looks like branch-commit format (e.g., "main-abc1234") + # Take the last part as commit hash + commit_hash = parts[-1] + version_link = f"{repo_url}/commit/{commit_hash}" else: # Fallback to main branch version_link = f"{repo_url}/tree/main" diff --git a/src/server/templates/components/footer.jinja b/src/server/templates/components/footer.jinja index 7c33ae8d..9784dfeb 100644 --- a/src/server/templates/components/footer.jinja +++ b/src/server/templates/components/footer.jinja @@ -18,13 +18,5 @@ 'Discord') }} - {# Version information row #} -
- Version: - {{ version }} -
diff --git a/src/server/templates/components/navbar.jinja b/src/server/templates/components/navbar.jinja index 6d0ec784..06031163 100644 --- a/src/server/templates/components/navbar.jinja +++ b/src/server/templates/components/navbar.jinja @@ -3,11 +3,17 @@
{# Logo #} {# Navigation with updated styling #}
-{# Load GitHub stars script #} From 3df7681f3325b8f64a9240c30657a7e9d690b6da Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 16:45:29 +0200 Subject: [PATCH 3/8] feat(web): update navbar version display --- src/server/templates/components/navbar.jinja | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/server/templates/components/navbar.jinja b/src/server/templates/components/navbar.jinja index 06031163..00408d1b 100644 --- a/src/server/templates/components/navbar.jinja +++ b/src/server/templates/components/navbar.jinja @@ -3,8 +3,8 @@
{# Logo #}
-
-

+
+

Gitingest @@ -12,7 +12,9 @@ {{ version }} + class="relative self-end text-sm text-blue-600 hover:text-blue-800 no-underline ml-4 -mt-1"> + {{ version }} +

{# Navigation with updated styling #} From 3e92e50f3316607a366063d4fd26fe429b909a10 Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 16:51:17 +0200 Subject: [PATCH 4/8] feat(web): update navbar version display --- src/server/server_config.py | 41 +++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/server/server_config.py b/src/server/server_config.py index e6cd4dd9..697ff23b 100644 --- a/src/server/server_config.py +++ b/src/server/server_config.py @@ -29,6 +29,12 @@ # Minimum number of parts expected in branch-commit format (e.g., "main-abc1234") MIN_BRANCH_COMMIT_PARTS = 2 +# Minimum length for a git commit hash +MIN_COMMIT_HASH_LENGTH = 6 + +# Minimum number of parts in PR format to include commit hash (pr-number-commit) +MIN_PR_PARTS_WITH_COMMIT = 2 + def get_version_info() -> dict[str, str]: """Get version information including display version and link. @@ -41,37 +47,60 @@ def get_version_info() -> dict[str, str]: """ version = VERSION repo_url = REPOSITORY_URL.rstrip("/") + display_version = version + version_link = f"{repo_url}/tree/main" # Default fallback + + def _looks_like_commit_hash(text: str) -> bool: + """Check if text looks like a git commit hash (alphanumeric, 6+ chars).""" + return len(text) >= MIN_COMMIT_HASH_LENGTH and text.isalnum() and any(c.isalpha() for c in text) - # Check if version contains PR number (e.g., "pr-123", "pull-456") + # Check if version contains dashes if version != "unknown" and ("-" in version): parts = version.split("-") if len(parts) >= MIN_BRANCH_COMMIT_PARTS: # Check if first part indicates a PR if parts[0].lower() in ("pr", "pull"): - # Extract PR number from the second part + # Extract PR number and commit hash from the parts try: pr_number = int(parts[1]) - version_link = f"{repo_url}/pull/{pr_number}" + display_version = f"pr-{pr_number}" + # If there's a commit hash after the PR number, link to the commit in the PR + if len(parts) > MIN_PR_PARTS_WITH_COMMIT: + commit_hash = parts[-1] + version_link = f"{repo_url}/pull/{pr_number}/commits/{commit_hash}" + else: + # No commit hash, link to the PR page + version_link = f"{repo_url}/pull/{pr_number}" except (ValueError, IndexError): # If PR number is invalid, fallback to main branch + display_version = version version_link = f"{repo_url}/tree/main" - else: + elif _looks_like_commit_hash(parts[-1]): # This looks like branch-commit format (e.g., "main-abc1234") - # Take the last part as commit hash + # Display only the branch name, link to the commit + branch_name = parts[0] commit_hash = parts[-1] + display_version = branch_name version_link = f"{repo_url}/commit/{commit_hash}" + else: + # This looks like a tag version with dashes (e.g., "release-2.1.0") + display_version = version + version_link = f"{repo_url}/releases/tag/{version}" else: # Fallback to main branch + display_version = version version_link = f"{repo_url}/tree/main" elif version != "unknown": # This looks like a tag version + display_version = version version_link = f"{repo_url}/releases/tag/{version}" else: # Unknown version, link to main branch + display_version = "unknown" version_link = f"{repo_url}/tree/main" return { - "version": version, + "version": display_version, "version_link": version_link, } From 05cc6e3b256cb3a358231d636a91a210245d5c4f Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 17:57:04 +0200 Subject: [PATCH 5/8] refactor(server,ci): simplify version and repository handling --- .github/workflows/docker-build.ecr.yml | 29 ++++++++-- .github/workflows/docker-build.ghcr.yml | 29 ++++++++-- Dockerfile | 8 ++- src/server/server_config.py | 73 ++++--------------------- 4 files changed, 64 insertions(+), 75 deletions(-) diff --git a/.github/workflows/docker-build.ecr.yml b/.github/workflows/docker-build.ecr.yml index 9ff5eac3..5c2d301e 100644 --- a/.github/workflows/docker-build.ecr.yml +++ b/.github/workflows/docker-build.ecr.yml @@ -46,18 +46,35 @@ jobs: run: | echo "timestamp=$(date +%s)" >> $GITHUB_OUTPUT echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + echo "sha_full=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT - - name: Determine version + - name: Determine version and deployment context id: version run: | + REPO_URL="https://github.com/${{ github.repository }}" + if [[ "${{ github.ref_type }}" == "tag" ]]; then - # If we're on a tag, use the tag name as version + # Tag deployment - display version, link to release echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + echo "deployment_type=tag" >> $GITHUB_OUTPUT + echo "app_version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + echo "app_version_url=${REPO_URL}/releases/tag/${{ github.ref_name }}" >> $GITHUB_OUTPUT + elif [[ "${{ github.event_name }}" == "pull_request" ]]; then + # PR deployment - display pr-XXX, link to PR commit + PR_NUMBER="${{ github.event.pull_request.number }}" + COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" + echo "version=${PR_NUMBER}/merge-${COMMIT_HASH}" >> $GITHUB_OUTPUT + echo "deployment_type=pr" >> $GITHUB_OUTPUT + echo "app_version=pr-${PR_NUMBER}" >> $GITHUB_OUTPUT + echo "app_version_url=${REPO_URL}/pull/${PR_NUMBER}/commits/${COMMIT_HASH}" >> $GITHUB_OUTPUT else - # If we're not on a tag, use branch-commit-hash format + # Branch deployment - display branch name, link to commit BRANCH_NAME="${{ github.ref_name }}" - COMMIT_HASH="${{ steps.vars.outputs.sha_short }}" + COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" echo "version=${BRANCH_NAME}-${COMMIT_HASH}" >> $GITHUB_OUTPUT + echo "deployment_type=branch" >> $GITHUB_OUTPUT + echo "app_version=${BRANCH_NAME}" >> $GITHUB_OUTPUT + echo "app_version_url=${REPO_URL}/commit/${COMMIT_HASH}" >> $GITHUB_OUTPUT fi - name: Login to Amazon ECR @@ -93,6 +110,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} build-args: | VERSION=${{ steps.version.outputs.version }} - REPOSITORY_URL=https://github.com/${{ github.repository }} + APP_REPOSITORY=https://github.com/${{ github.repository }} + APP_VERSION=${{ steps.version.outputs.app_version }} + APP_VERSION_URL=${{ steps.version.outputs.app_version_url }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/docker-build.ghcr.yml b/.github/workflows/docker-build.ghcr.yml index 05328ac9..8bfc5146 100644 --- a/.github/workflows/docker-build.ghcr.yml +++ b/.github/workflows/docker-build.ghcr.yml @@ -50,18 +50,35 @@ jobs: run: | echo "timestamp=$(date +%s)" >> $GITHUB_OUTPUT echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + echo "sha_full=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT - - name: Determine version + - name: Determine version and deployment context id: version run: | + REPO_URL="https://github.com/${{ github.repository }}" + if [[ "${{ github.ref_type }}" == "tag" ]]; then - # If we're on a tag, use the tag name as version + # Tag deployment - display version, link to release echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + echo "deployment_type=tag" >> $GITHUB_OUTPUT + echo "app_version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + echo "app_version_url=${REPO_URL}/releases/tag/${{ github.ref_name }}" >> $GITHUB_OUTPUT + elif [[ "${{ github.event_name }}" == "pull_request" ]]; then + # PR deployment - display pr-XXX, link to PR commit + PR_NUMBER="${{ github.event.pull_request.number }}" + COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" + echo "version=${PR_NUMBER}/merge-${COMMIT_HASH}" >> $GITHUB_OUTPUT + echo "deployment_type=pr" >> $GITHUB_OUTPUT + echo "app_version=pr-${PR_NUMBER}" >> $GITHUB_OUTPUT + echo "app_version_url=${REPO_URL}/pull/${PR_NUMBER}/commits/${COMMIT_HASH}" >> $GITHUB_OUTPUT else - # If we're not on a tag, use branch-commit-hash format + # Branch deployment - display branch name, link to commit BRANCH_NAME="${{ github.ref_name }}" - COMMIT_HASH="${{ steps.vars.outputs.sha_short }}" + COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" echo "version=${BRANCH_NAME}-${COMMIT_HASH}" >> $GITHUB_OUTPUT + echo "deployment_type=branch" >> $GITHUB_OUTPUT + echo "app_version=${BRANCH_NAME}" >> $GITHUB_OUTPUT + echo "app_version_url=${REPO_URL}/commit/${COMMIT_HASH}" >> $GITHUB_OUTPUT fi - name: Log in to the Container registry @@ -102,7 +119,9 @@ jobs: labels: ${{ steps.meta.outputs.labels }} build-args: | VERSION=${{ steps.version.outputs.version }} - REPOSITORY_URL=https://github.com/${{ github.repository }} + APP_REPOSITORY=https://github.com/${{ github.repository }} + APP_VERSION=${{ steps.version.outputs.app_version }} + APP_VERSION_URL=${{ steps.version.outputs.app_version_url }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 863298a6..d345e184 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,12 +21,16 @@ FROM python:3.13.5-slim@sha256:4c2cf9917bd1cbacc5e9b07320025bdb7cdf2df7b0ceaccb5 ARG UID=1000 ARG GID=1000 ARG VERSION=unknown -ARG REPOSITORY_URL=https://github.com/coderamp-labs/gitingest +ARG APP_REPOSITORY=https://github.com/coderamp-labs/gitingest +ARG APP_VERSION=unknown +ARG APP_VERSION_URL=https://github.com/coderamp-labs/gitingest ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ VERSION=${VERSION} \ - REPOSITORY_URL=${REPOSITORY_URL} + APP_REPOSITORY=${APP_REPOSITORY} \ + APP_VERSION=${APP_VERSION} \ + APP_VERSION_URL=${APP_VERSION_URL} RUN set -eux; \ apt-get update; \ diff --git a/src/server/server_config.py b/src/server/server_config.py index 697ff23b..0fa41735 100644 --- a/src/server/server_config.py +++ b/src/server/server_config.py @@ -24,16 +24,9 @@ # Version and repository configuration VERSION = os.getenv("VERSION", "unknown") -REPOSITORY_URL = os.getenv("REPOSITORY_URL", "https://github.com/coderamp-labs/gitingest") - -# Minimum number of parts expected in branch-commit format (e.g., "main-abc1234") -MIN_BRANCH_COMMIT_PARTS = 2 - -# Minimum length for a git commit hash -MIN_COMMIT_HASH_LENGTH = 6 - -# Minimum number of parts in PR format to include commit hash (pr-number-commit) -MIN_PR_PARTS_WITH_COMMIT = 2 +APP_REPOSITORY = os.getenv("APP_REPOSITORY", "https://github.com/coderamp-labs/gitingest") +APP_VERSION = os.getenv("APP_VERSION", "unknown") +APP_VERSION_URL = os.getenv("APP_VERSION_URL", "https://github.com/coderamp-labs/gitingest") def get_version_info() -> dict[str, str]: @@ -45,59 +38,13 @@ def get_version_info() -> dict[str, str]: Dictionary containing 'version' and 'version_link' keys. """ - version = VERSION - repo_url = REPOSITORY_URL.rstrip("/") - display_version = version - version_link = f"{repo_url}/tree/main" # Default fallback - - def _looks_like_commit_hash(text: str) -> bool: - """Check if text looks like a git commit hash (alphanumeric, 6+ chars).""" - return len(text) >= MIN_COMMIT_HASH_LENGTH and text.isalnum() and any(c.isalpha() for c in text) - - # Check if version contains dashes - if version != "unknown" and ("-" in version): - parts = version.split("-") - if len(parts) >= MIN_BRANCH_COMMIT_PARTS: - # Check if first part indicates a PR - if parts[0].lower() in ("pr", "pull"): - # Extract PR number and commit hash from the parts - try: - pr_number = int(parts[1]) - display_version = f"pr-{pr_number}" - # If there's a commit hash after the PR number, link to the commit in the PR - if len(parts) > MIN_PR_PARTS_WITH_COMMIT: - commit_hash = parts[-1] - version_link = f"{repo_url}/pull/{pr_number}/commits/{commit_hash}" - else: - # No commit hash, link to the PR page - version_link = f"{repo_url}/pull/{pr_number}" - except (ValueError, IndexError): - # If PR number is invalid, fallback to main branch - display_version = version - version_link = f"{repo_url}/tree/main" - elif _looks_like_commit_hash(parts[-1]): - # This looks like branch-commit format (e.g., "main-abc1234") - # Display only the branch name, link to the commit - branch_name = parts[0] - commit_hash = parts[-1] - display_version = branch_name - version_link = f"{repo_url}/commit/{commit_hash}" - else: - # This looks like a tag version with dashes (e.g., "release-2.1.0") - display_version = version - version_link = f"{repo_url}/releases/tag/{version}" - else: - # Fallback to main branch - display_version = version - version_link = f"{repo_url}/tree/main" - elif version != "unknown": - # This looks like a tag version - display_version = version - version_link = f"{repo_url}/releases/tag/{version}" - else: - # Unknown version, link to main branch - display_version = "unknown" - version_link = f"{repo_url}/tree/main" + # Use pre-computed values from GitHub Actions + display_version = APP_VERSION + version_link = APP_VERSION_URL + + # Fallback to repository root if no URL is provided + if version_link == APP_REPOSITORY or not version_link: + version_link = f"{APP_REPOSITORY.rstrip('/')}/tree/main" return { "version": display_version, From 57fa2e84f9e33267067d00d4090075f4050dbf0e Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 18:06:55 +0200 Subject: [PATCH 6/8] ci: ensure correct commit ref is used for PR workflows --- .github/workflows/docker-build.ecr.yml | 2 ++ .github/workflows/docker-build.ghcr.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/docker-build.ecr.yml b/.github/workflows/docker-build.ecr.yml index 5c2d301e..5f9455e6 100644 --- a/.github/workflows/docker-build.ecr.yml +++ b/.github/workflows/docker-build.ecr.yml @@ -33,6 +33,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - name: configure aws credentials uses: aws-actions/configure-aws-credentials@v4 diff --git a/.github/workflows/docker-build.ghcr.yml b/.github/workflows/docker-build.ghcr.yml index 8bfc5146..96acc85f 100644 --- a/.github/workflows/docker-build.ghcr.yml +++ b/.github/workflows/docker-build.ghcr.yml @@ -44,6 +44,8 @@ jobs: egress-policy: audit - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - name: Set current timestamp id: vars From 30f846f13876490b4fba7b0aa0fec7ef43bd9443 Mon Sep 17 00:00:00 2001 From: mickael Date: Thu, 31 Jul 2025 18:15:02 +0200 Subject: [PATCH 7/8] refactor(server,ci): remove unused variables --- .github/workflows/docker-build.ecr.yml | 5 ----- .github/workflows/docker-build.ghcr.yml | 5 ----- Dockerfile | 2 -- src/server/server_config.py | 1 - 4 files changed, 13 deletions(-) diff --git a/.github/workflows/docker-build.ecr.yml b/.github/workflows/docker-build.ecr.yml index 5f9455e6..ec4a36ef 100644 --- a/.github/workflows/docker-build.ecr.yml +++ b/.github/workflows/docker-build.ecr.yml @@ -58,7 +58,6 @@ jobs: if [[ "${{ github.ref_type }}" == "tag" ]]; then # Tag deployment - display version, link to release echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT - echo "deployment_type=tag" >> $GITHUB_OUTPUT echo "app_version=${{ github.ref_name }}" >> $GITHUB_OUTPUT echo "app_version_url=${REPO_URL}/releases/tag/${{ github.ref_name }}" >> $GITHUB_OUTPUT elif [[ "${{ github.event_name }}" == "pull_request" ]]; then @@ -66,15 +65,12 @@ jobs: PR_NUMBER="${{ github.event.pull_request.number }}" COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" echo "version=${PR_NUMBER}/merge-${COMMIT_HASH}" >> $GITHUB_OUTPUT - echo "deployment_type=pr" >> $GITHUB_OUTPUT echo "app_version=pr-${PR_NUMBER}" >> $GITHUB_OUTPUT echo "app_version_url=${REPO_URL}/pull/${PR_NUMBER}/commits/${COMMIT_HASH}" >> $GITHUB_OUTPUT else # Branch deployment - display branch name, link to commit BRANCH_NAME="${{ github.ref_name }}" COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" - echo "version=${BRANCH_NAME}-${COMMIT_HASH}" >> $GITHUB_OUTPUT - echo "deployment_type=branch" >> $GITHUB_OUTPUT echo "app_version=${BRANCH_NAME}" >> $GITHUB_OUTPUT echo "app_version_url=${REPO_URL}/commit/${COMMIT_HASH}" >> $GITHUB_OUTPUT fi @@ -111,7 +107,6 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | - VERSION=${{ steps.version.outputs.version }} APP_REPOSITORY=https://github.com/${{ github.repository }} APP_VERSION=${{ steps.version.outputs.app_version }} APP_VERSION_URL=${{ steps.version.outputs.app_version_url }} diff --git a/.github/workflows/docker-build.ghcr.yml b/.github/workflows/docker-build.ghcr.yml index 96acc85f..1b68c6aa 100644 --- a/.github/workflows/docker-build.ghcr.yml +++ b/.github/workflows/docker-build.ghcr.yml @@ -62,7 +62,6 @@ jobs: if [[ "${{ github.ref_type }}" == "tag" ]]; then # Tag deployment - display version, link to release echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT - echo "deployment_type=tag" >> $GITHUB_OUTPUT echo "app_version=${{ github.ref_name }}" >> $GITHUB_OUTPUT echo "app_version_url=${REPO_URL}/releases/tag/${{ github.ref_name }}" >> $GITHUB_OUTPUT elif [[ "${{ github.event_name }}" == "pull_request" ]]; then @@ -70,15 +69,12 @@ jobs: PR_NUMBER="${{ github.event.pull_request.number }}" COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" echo "version=${PR_NUMBER}/merge-${COMMIT_HASH}" >> $GITHUB_OUTPUT - echo "deployment_type=pr" >> $GITHUB_OUTPUT echo "app_version=pr-${PR_NUMBER}" >> $GITHUB_OUTPUT echo "app_version_url=${REPO_URL}/pull/${PR_NUMBER}/commits/${COMMIT_HASH}" >> $GITHUB_OUTPUT else # Branch deployment - display branch name, link to commit BRANCH_NAME="${{ github.ref_name }}" COMMIT_HASH="${{ steps.vars.outputs.sha_full }}" - echo "version=${BRANCH_NAME}-${COMMIT_HASH}" >> $GITHUB_OUTPUT - echo "deployment_type=branch" >> $GITHUB_OUTPUT echo "app_version=${BRANCH_NAME}" >> $GITHUB_OUTPUT echo "app_version_url=${REPO_URL}/commit/${COMMIT_HASH}" >> $GITHUB_OUTPUT fi @@ -120,7 +116,6 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | - VERSION=${{ steps.version.outputs.version }} APP_REPOSITORY=https://github.com/${{ github.repository }} APP_VERSION=${{ steps.version.outputs.app_version }} APP_VERSION_URL=${{ steps.version.outputs.app_version_url }} diff --git a/Dockerfile b/Dockerfile index d345e184..08fdef45 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,14 +20,12 @@ FROM python:3.13.5-slim@sha256:4c2cf9917bd1cbacc5e9b07320025bdb7cdf2df7b0ceaccb5 ARG UID=1000 ARG GID=1000 -ARG VERSION=unknown ARG APP_REPOSITORY=https://github.com/coderamp-labs/gitingest ARG APP_VERSION=unknown ARG APP_VERSION_URL=https://github.com/coderamp-labs/gitingest ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ - VERSION=${VERSION} \ APP_REPOSITORY=${APP_REPOSITORY} \ APP_VERSION=${APP_VERSION} \ APP_VERSION_URL=${APP_VERSION_URL} diff --git a/src/server/server_config.py b/src/server/server_config.py index 0fa41735..56b5eb19 100644 --- a/src/server/server_config.py +++ b/src/server/server_config.py @@ -23,7 +23,6 @@ # Version and repository configuration -VERSION = os.getenv("VERSION", "unknown") APP_REPOSITORY = os.getenv("APP_REPOSITORY", "https://github.com/coderamp-labs/gitingest") APP_VERSION = os.getenv("APP_VERSION", "unknown") APP_VERSION_URL = os.getenv("APP_VERSION_URL", "https://github.com/coderamp-labs/gitingest") From 912921fde9ca541d50df784430b41e5680c11e89 Mon Sep 17 00:00:00 2001 From: Nicolas IRAGNE Date: Sun, 3 Aug 2025 11:17:17 +0200 Subject: [PATCH 8/8] chore(web): move version back to footer and only add link if version is known --- src/server/templates/components/footer.jinja | 14 +++++++++++++- src/server/templates/components/navbar.jinja | 17 +++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/server/templates/components/footer.jinja b/src/server/templates/components/footer.jinja index 9784dfeb..03900e3e 100644 --- a/src/server/templates/components/footer.jinja +++ b/src/server/templates/components/footer.jinja @@ -1,7 +1,7 @@ {% from 'components/_macros.jinja' import footer_icon_link %}