name: Build LaTeX PDF

# on:
#   push:
#     paths:
#       - '**/*.tex'

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      GIT_SSL_NO_VERIFY: "true"
      NODE_EXTRA_CA_CERTS: /usr/local/share/ca-certificates/Egregge.crt
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 2   # need previous commit to diff against

      - name: Find changed .tex root files
        id: changed
        run: |
          apt-get update -qq && apt-get install -y -qq git > /dev/null
          git config --global --add safe.directory "$GITHUB_WORKSPACE"

          # root files = .tex files that contain \documentclass
          CHANGED=$(git diff --name-only "${{ github.event.before }}" "${{ github.sha }}" -- '*.tex' || true)
          ROOTS=""
          for f in $CHANGED; do
            if [ -f "$f" ] && grep -q '\\documentclass' "$f"; then
              ROOTS="$ROOTS $f"
            fi
          done
          echo "roots=$ROOTS" >> "$GITHUB_OUTPUT"
          echo "Root files to build: $ROOTS"

      - name: Compile changed root files
        if: steps.changed.outputs.roots != ''
        uses: docker://texlive/texlive:latest-full
        with:
          entrypoint: sh
          args: >-
            -c "mkdir -p pdf aux && for f in ${{ steps.changed.outputs.roots }}; do
            echo Building $f;
            latexmk -pdf -interaction=nonstopmode -halt-on-error -outdir=pdf -auxdir=aux \"$f\" || exit 1;
            done && find pdf -type f ! -name '*.pdf' -delete"

      - name: Upload built PDFs
        if: steps.changed.outputs.roots != ''
        uses: actions/upload-artifact@v3
        with:
          name: pdf-output
          path: pdf/*.pdf

      - name: Commit PDFs back to repo
        if: steps.changed.outputs.roots != ''
        run: |
          git config user.name "gitea-actions"
          git config user.email "actions@gitea.local"
          git remote set-url origin "https://Domipoke:${{ secrets.GITEA_PUSH_TOKEN }}@gitea.egregge.eg/Domipoke/SharedLaTeX.git"          
          git add pdf/*.pdf
          git diff --cached --quiet || git commit -m "CI: rebuild PDF(s) [skip ci]"
          git push origin HEAD:${{ github.ref_name }}
this see no update if i use in main file \input{./chapt/...} and edit only file in chapt folder that i push; then also do not update the right branch where i pushed commit

Mostra meno

Architected dependency graph solution for nested LaTeX files and branch detection
Architected dependency graph solution for nested LaTeX files and branch detection
You've hit two separate bugs. Let me break down each one.

Bug 1: chapter edits don't trigger a build
Your detection logic is:

bash
CHANGED=$(git diff --name-only ... -- '*.tex')
for f in $CHANGED; do
  if grep -q '\documentclass' "$f"; then
    ROOTS="$ROOTS $f"
  fi
done
This only adds a file to ROOTS if the changed file itself contains \documentclass. When you edit chapt/foo.tex and it gets pulled in via \input{./chapt/foo} from main.tex, chapt/foo.tex obviously has no \documentclass in it — so it's silently dropped, ROOTS stays empty, and the two if: steps.changed.outputs.roots != '' steps just skip.

You need to invert the logic: find all root files in the repo, resolve each one's \input/\include dependency tree, and rebuild any root whose tree intersects the changed-files set.

Bug 2: pushes go to the wrong branch
git push origin HEAD:${{ github.ref_name }} relies on github.ref_name being populated correctly. Gitea Actions' GitHub-compatibility shim doesn't always populate ref_name reliably (especially depending on runner/Gitea version), so this can silently resolve to the wrong value (e.g. the default branch) instead of the branch you actually pushed to. It's safer to derive the branch explicitly from GITHUB_REF, which is more consistently set:

bash
BRANCH="${GITHUB_REF#refs/heads/}"
git push origin HEAD:refs/heads/"$BRANCH"
Also worth guarding: fetch-depth: 2 + github.event.before breaks on the very first push to a branch (before-sha is all zeros), which would make the diff step fail/empty too — separate failure mode, same symptom (nothing gets built).

Fixed workflow
yaml
name: Build LaTeX PDF

on:
  push:
    paths:
      - '**/*.tex'

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      GIT_SSL_NO_VERIFY: "true"
      NODE_EXTRA_CA_CERTS: /usr/local/share/ca-certificates/Egregge.crt
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0   # full history, safer for diffing

      - name: Find root files affected by this push
        id: changed
        run: |
          apt-get update -qq && apt-get install -y -qq git > /dev/null
          git config --global --add safe.directory "$GITHUB_WORKSPACE"

          BEFORE="${{ github.event.before }}"
          AFTER="${{ github.sha }}"

          # Handle first push to a branch (before = all zeros)
          if [ "$BEFORE" = "0000000000000000000000000000000000000000" ] || [ -z "$BEFORE" ]; then
            CHANGED=$(git ls-tree -r --name-only "$AFTER" -- '*.tex')
          else
            CHANGED=$(git diff --name-only "$BEFORE" "$AFTER" -- '*.tex' || true)
          fi
          echo "Changed .tex files: $CHANGED"

          # All root files (anywhere in repo) containing \documentclass
          ALL_ROOTS=$(grep -rl '\\documentclass' --include='*.tex' . | sed 's|^\./||')

          # Recursively resolve \input/\include/\subfile deps of a root,
          # printing paths relative to repo root
          resolve_deps() {
            local file="$1"
            local dir
            dir=$(dirname "$file")
            [ -f "$file" ] || return
            echo "$file"
            grep -ohE '\\(input|include|subfile)\{[^}]*\}' "$file" 2>/dev/null \
              | sed -E 's/.*\{([^}]*)\}/\1/' \
              | while read -r inc; do
                  [[ "$inc" != *.tex ]] && inc="${inc}.tex"
                  full=$(realpath --relative-to=. "$dir/$inc" 2>/dev/null)
                  [ -n "$full" ] && resolve_deps "$full"
                done
          }

          ROOTS=""
          for root in $ALL_ROOTS; do
            DEPS=$(resolve_deps "$root" | sort -u)
            HIT=""
            for c in $CHANGED; do
              if grep -qxF "$c" <<< "$DEPS"; then
                HIT=1
                break
              fi
            done
            if [ -n "$HIT" ]; then
              ROOTS="$ROOTS $root"
            fi
          done

          echo "roots=$ROOTS" >> "$GITHUB_OUTPUT"
          echo "Root files to build: $ROOTS"

      - name: Compile changed root files
        if: steps.changed.outputs.roots != ''
        uses: docker://texlive/texlive:latest-full
        with:
          entrypoint: sh
          args: >-
            -c "mkdir -p pdf aux && for f in ${{ steps.changed.outputs.roots }}; do
            echo Building $f;
            latexmk -pdf -interaction=nonstopmode -halt-on-error -outdir=pdf -auxdir=aux \"$f\" || exit 1;
            done && find pdf -type f ! -name '*.pdf' -delete"

      - name: Upload built PDFs
        if: steps.changed.outputs.roots != ''
        uses: actions/upload-artifact@v3
        with:
          name: pdf-output
          path: pdf/*.pdf

      - name: Commit PDFs back to repo
        if: steps.changed.outputs.roots != ''
        run: |
          git config user.name "gitea-actions"
          git config user.email "actions@gitea.local"
          git remote set-url origin "https://Domipoke:${{ secrets.GITEA_PUSH_TOKEN }}@gitea.egregge.eg/Domipoke/SharedLaTeX.git"

          BRANCH="${GITHUB_REF#refs/heads/}"
          echo "Pushing to branch: $BRANCH"

          git add pdf/*.pdf
          git diff --cached --quiet || git commit -m "CI: rebuild PDF(s) [skip ci]"
          git push origin HEAD:refs/heads/"$BRANCH"