|
| 1 | +#!/usr/bin/env bash |
| 2 | +# |
| 3 | +# tx_push_all.sh -- Uebersetzungen Ressource fuer Ressource nach Transifex |
| 4 | +# schieben. Das Repo ist dabei die Quelle der Wahrheit: mit --force werden |
| 5 | +# auch Strings ueberschrieben, die in Transifex von Hand bearbeitet wurden |
| 6 | +# (ohne diesen Schalter laesst Transifex sie unangetastet, siehe |
| 7 | +# replace_edited_strings in .tx/config). |
| 8 | +# |
| 9 | +# Ein Aufruf pro Ressource statt eines grossen Pushes, damit ein einzelner |
| 10 | +# Fehlschlag den Rest nicht aufhaelt. Was fehlschlaegt, steht am Ende noch |
| 11 | +# einmal gesammelt da. |
| 12 | +# |
| 13 | +# Voraussetzungen: |
| 14 | +# * tx-CLI installiert und im PATH |
| 15 | +# * API-Token in ~/.transifexrc (NICHT im Repo, nicht in dieser Datei) |
| 16 | +# |
| 17 | +# Nutzung: |
| 18 | +# ./_tools/tx_push_all.sh # alles ausser AUSNAHMEN |
| 19 | +# ./_tools/tx_push_all.sh --liste # nur zeigen, was gepusht wuerde |
| 20 | +# ./_tools/tx_push_all.sh --nur library-- # nur passende Ressourcen |
| 21 | +# ./_tools/tx_push_all.sh --ohne-ausnahmen # wirklich alles, auch die |
| 22 | +# # Dateien in AUSNAHMEN |
| 23 | +# |
| 24 | +set -uo pipefail |
| 25 | + |
| 26 | +REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}" |
| 27 | +CONFIG="$REPO_ROOT/.tx/config" |
| 28 | +ORGA="${ORGA:-python-doc}" |
| 29 | +PROJEKT="${PROJEKT:-python-newest}" |
| 30 | + |
| 31 | +# Ressourcen, die NICHT gepusht werden. Hier stehen die vier grossen |
| 32 | +# extending-Dateien: die sind in Transifex in Arbeit, unser Repo-Stand ist |
| 33 | +# nur mechanisch bereinigt und soll die dortige Fassung nicht ueberschreiben. |
| 34 | +AUSNAHMEN=( |
| 35 | + "extending--extending" |
| 36 | + "extending--first-extension-module" |
| 37 | + "extending--newtypes" |
| 38 | + "extending--newtypes_tutorial" |
| 39 | +) |
| 40 | + |
| 41 | +NUR="" |
| 42 | +MIT_AUSNAHMEN=false |
| 43 | +NUR_LISTE=false |
| 44 | + |
| 45 | +while [[ $# -gt 0 ]]; do |
| 46 | + case "$1" in |
| 47 | + --liste) NUR_LISTE=true ;; |
| 48 | + --ohne-ausnahmen) MIT_AUSNAHMEN=true ;; |
| 49 | + --nur) NUR="${2:-}"; shift ;; |
| 50 | + -h|--help) sed -n '2,24p' "${BASH_SOURCE[0]}"; exit 0 ;; |
| 51 | + *) echo "Unbekannte Option: $1"; exit 2 ;; |
| 52 | + esac |
| 53 | + shift |
| 54 | +done |
| 55 | + |
| 56 | +if [[ ! -f "$CONFIG" ]]; then |
| 57 | + echo "Keine .tx/config unter $CONFIG gefunden." |
| 58 | + exit 1 |
| 59 | +fi |
| 60 | +if ! command -v tx >/dev/null 2>&1; then |
| 61 | + echo "Das tx-CLI liegt nicht im PATH. Installation:" |
| 62 | + echo " https://developers.transifex.com/docs/cli" |
| 63 | + exit 1 |
| 64 | +fi |
| 65 | +if [[ ! -f "$HOME/.transifexrc" ]]; then |
| 66 | + echo "~/.transifexrc fehlt -- ohne API-Token kann nicht gepusht werden." |
| 67 | + echo "Anlegen mit: tx init" |
| 68 | + exit 1 |
| 69 | +fi |
| 70 | + |
| 71 | +BRANCH="$(git -C "$REPO_ROOT" branch --show-current 2>/dev/null)" |
| 72 | +echo "Repo: $REPO_ROOT" |
| 73 | +echo "Branch: ${BRANCH:-unbekannt}" |
| 74 | +echo "Projekt: $ORGA / $PROJEKT" |
| 75 | + |
| 76 | +ausgenommen() { |
| 77 | + $MIT_AUSNAHMEN && return 1 |
| 78 | + local r="$1" a |
| 79 | + for a in "${AUSNAHMEN[@]}"; do |
| 80 | + [[ "$r" == "$a" ]] && return 0 |
| 81 | + done |
| 82 | + return 1 |
| 83 | +} |
| 84 | + |
| 85 | +# Ressourcennamen aus den Abschnittskoepfen der .tx/config lesen |
| 86 | +mapfile -t ALLE < <( |
| 87 | + grep -o "^\[o:$ORGA:p:$PROJEKT:r:[^]]*\]" "$CONFIG" \ |
| 88 | + | sed "s/.*:r://; s/\]//" |
| 89 | +) |
| 90 | +if [[ ${#ALLE[@]} -eq 0 ]]; then |
| 91 | + echo "In $CONFIG keine Ressourcen fuer $ORGA/$PROJEKT gefunden." |
| 92 | + exit 1 |
| 93 | +fi |
| 94 | + |
| 95 | +ZU_PUSHEN=() |
| 96 | +UEBERSPRUNGEN=() |
| 97 | +for r in "${ALLE[@]}"; do |
| 98 | + [[ -n "$NUR" && "$r" != *"$NUR"* ]] && continue |
| 99 | + if ausgenommen "$r"; then |
| 100 | + UEBERSPRUNGEN+=("$r") |
| 101 | + continue |
| 102 | + fi |
| 103 | + ZU_PUSHEN+=("$r") |
| 104 | +done |
| 105 | + |
| 106 | +echo "Ressourcen: ${#ALLE[@]} insgesamt, ${#ZU_PUSHEN[@]} werden gepusht," |
| 107 | +echo " ${#UEBERSPRUNGEN[@]} ausgenommen" |
| 108 | +for r in "${UEBERSPRUNGEN[@]}"; do |
| 109 | + echo " ausgenommen: $r" |
| 110 | +done |
| 111 | + |
| 112 | +if $NUR_LISTE; then |
| 113 | + printf '%s\n' "${ZU_PUSHEN[@]}" |
| 114 | + exit 0 |
| 115 | +fi |
| 116 | + |
| 117 | +echo |
| 118 | +read -r -p "Jetzt ${#ZU_PUSHEN[@]} Ressourcen mit --force pushen? [j/N] " ANTWORT |
| 119 | +[[ "$ANTWORT" =~ ^[jJyY]$ ]] || { echo "Abgebrochen."; exit 0; } |
| 120 | + |
| 121 | +cd "$REPO_ROOT" || exit 1 |
| 122 | + |
| 123 | +OK=0 |
| 124 | +FEHLER=() |
| 125 | +N=${#ZU_PUSHEN[@]} |
| 126 | +I=0 |
| 127 | +for r in "${ZU_PUSHEN[@]}"; do |
| 128 | + I=$((I + 1)) |
| 129 | + printf '[%3d/%3d] %s ... ' "$I" "$N" "$r" |
| 130 | + if tx push --translation --force --resource "$PROJEKT.$r" >/dev/null 2>&1; then |
| 131 | + echo "ok" |
| 132 | + OK=$((OK + 1)) |
| 133 | + else |
| 134 | + echo "FEHLGESCHLAGEN" |
| 135 | + FEHLER+=("$r") |
| 136 | + fi |
| 137 | +done |
| 138 | + |
| 139 | +echo |
| 140 | +echo "Fertig: $OK von $N Ressourcen gepusht." |
| 141 | +if [[ ${#FEHLER[@]} -gt 0 ]]; then |
| 142 | + echo "Fehlgeschlagen (${#FEHLER[@]}):" |
| 143 | + for r in "${FEHLER[@]}"; do |
| 144 | + echo " $r" |
| 145 | + done |
| 146 | + echo |
| 147 | + echo "Einzeln wiederholen mit:" |
| 148 | + echo " tx push --translation --force --resource $PROJEKT.<name>" |
| 149 | + exit 1 |
| 150 | +fi |
0 commit comments