44# schieben. Das Repo ist dabei die Quelle der Wahrheit: ein Push mit
55# --translation ersetzt die dortigen Uebersetzungen durch unseren Stand.
66#
7+ # Warum ueber ein Staging-Verzeichnis?
8+ # Das tx-CLI liest die Sprache einer Datei ausschliesslich aus dem Pfad, am
9+ # Platzhalter <lang> im file_filter. Unsere .tx/config zeigt aber auf
10+ # "library/colorsys.po" -- ohne <lang>, weil in diesem Repo nur Deutsch
11+ # liegt und die Dateien im Wurzelverzeichnis stehen. Folge: tx findet
12+ # keine einzige lokale Sprache, laedt nichts hoch und endet trotzdem mit
13+ # Status 0 ("Getting info about resources ... Done", danach nichts).
14+ # Darum legt dieses Skript unter $TMPDIR einen Baum
15+ # <staging>/de/<pfad> aus Symlinks auf die echten Dateien an, schreibt
16+ # dort eine .tx/config mit "file_filter = <lang>/<pfad>" und pusht von
17+ # dort. Das Repo bleibt unberuehrt, das Staging wird am Ende geloescht.
18+ #
719# --force heisst NICHT "bearbeitete Strings ueberschreiben". Laut tx-Hilfe
820# umgeht es nur die Pruefung der Aenderungszeiten ("Push source files
921# without checking modification times"). Ohne den Schalter uebergeht tx
1022# Dateien, die aelter sind als die Ressource im Server -- und genau das
11- # trifft auf einen Teil unserer Dateien zu. Die Option
12- # replace_edited_strings in .tx/config betrifft Quell-Strings, nicht
13- # Uebersetzungen.
14- #
15- # Ein Aufruf pro Ressource statt eines grossen Pushes, damit ein einzelner
16- # Fehlschlag den Rest nicht aufhaelt. Was fehlschlaegt, steht am Ende noch
17- # einmal gesammelt da.
23+ # trifft auf einen Teil unserer Dateien zu.
1824#
1925# Voraussetzungen:
2026# * tx-CLI installiert und im PATH
2733# ./_tools/tx_push_all.sh --nur library-- # nur passende Ressourcen
2834# ./_tools/tx_push_all.sh --ohne-ausnahmen # wirklich alles, auch die
2935# # Dateien in AUSNAHMEN
36+ # ./_tools/tx_push_all.sh --behalten # Staging nicht loeschen
3037#
3138set -uo pipefail
3239
3340REPO_ROOT=" ${REPO_ROOT:- $(cd " $( dirname " ${BASH_SOURCE[0]} " ) /.." && pwd)} "
3441CONFIG=" $REPO_ROOT /.tx/config"
3542ORGA=" ${ORGA:- python-doc} "
3643PROJEKT=" ${PROJEKT:- python-newest} "
44+ SPRACHE=" ${SPRACHE:- de} "
3745
3846# Ressourcen, die NICHT gepusht werden. Hier stehen die vier grossen
3947# extending-Dateien: die sind in Transifex in Arbeit, unser Repo-Stand ist
@@ -48,13 +56,15 @@ AUSNAHMEN=(
4856NUR=" "
4957MIT_AUSNAHMEN=false
5058NUR_LISTE=false
59+ BEHALTEN=false
5160
5261while [[ $# -gt 0 ]]; do
5362 case " $1 " in
5463 --liste) NUR_LISTE=true ;;
5564 --ohne-ausnahmen) MIT_AUSNAHMEN=true ;;
65+ --behalten) BEHALTEN=true ;;
5666 --nur) NUR=" ${2:- } " ; shift ;;
57- -h|--help) sed -n ' 2,24p ' " ${BASH_SOURCE[0]} " ; exit 0 ;;
67+ -h|--help) sed -n ' 2,40p ' " ${BASH_SOURCE[0]} " ; exit 0 ;;
5868 * ) echo " Unbekannte Option: $1 " ; exit 2 ;;
5969 esac
6070 shift
@@ -79,6 +89,7 @@ BRANCH="$(git -C "$REPO_ROOT" branch --show-current 2>/dev/null)"
7989echo " Repo: $REPO_ROOT "
8090echo " Branch: ${BRANCH:- unbekannt} "
8191echo " Projekt: $ORGA / $PROJEKT "
92+ echo " Sprache: $SPRACHE "
8293
8394ausgenommen () {
8495 $MIT_AUSNAHMEN && return 1
@@ -89,39 +100,64 @@ ausgenommen() {
89100 return 1
90101}
91102
92- # Ressourcennamen aus den Abschnittskoepfen der .tx/config lesen.
93- # Bewusst eine Leseschleife statt "mapfile": das gibt es erst ab Bash 4,
94- # macOS liefert aber /bin/bash 3.2 aus.
103+ # Ressourcenname und zugehoerige Datei aus der .tx/config lesen. Bewusst
104+ # eine Leseschleife statt "mapfile": das gibt es erst ab Bash 4, macOS
105+ # liefert /bin/bash 3.2 aus. Bash 3.2 kennt auch keine assoziativen
106+ # Arrays, daher zwei parallele Listen.
95107ALLE=()
96- while IFS= read -r zeile; do
97- [ -n " $zeile " ] && ALLE+=(" $zeile " )
108+ PFADE=()
109+ while IFS=$' \t ' read -r name pfad; do
110+ [ -n " $name " ] && { ALLE+=(" $name " ); PFADE+=(" $pfad " ); }
98111done < <(
99- grep -o " ^\[o:$ORGA :p:$PROJEKT :r:[^]]*\]" " $CONFIG " \
100- | sed " s/.*:r://; s/\]//"
112+ awk -v o=" $ORGA " -v p=" $PROJEKT " '
113+ $0 ~ "^\\[o:" o ":p:" p ":r:" {
114+ r = $0; sub(/.*:r:/, "", r); sub(/\]$/, "", r); next
115+ }
116+ /^file_filter/ && r != "" {
117+ v = $0; sub(/^file_filter[ \t]*=[ \t]*/, "", v)
118+ print r "\t" v; r = ""
119+ }
120+ ' " $CONFIG "
101121)
102122if [[ ${# ALLE[@]} -eq 0 ]]; then
103123 echo " In $CONFIG keine Ressourcen fuer $ORGA /$PROJEKT gefunden."
104124 exit 1
105125fi
106126
107127ZU_PUSHEN=()
128+ ZU_PUSHEN_PFAD=()
108129UEBERSPRUNGEN=()
109- for r in " ${ALLE[@]} " ; do
130+ OHNE_DATEI=()
131+ I=0
132+ while [ $I -lt ${# ALLE[@]} ]; do
133+ r=" ${ALLE[$I]} "
134+ f=" ${PFADE[$I]} "
135+ I=$(( I + 1 ))
110136 [[ -n " $NUR " && " $r " != * " $NUR " * ]] && continue
111137 if ausgenommen " $r " ; then
112138 UEBERSPRUNGEN+=(" $r " )
113139 continue
114140 fi
141+ if [ ! -f " $REPO_ROOT /$f " ]; then
142+ OHNE_DATEI+=(" $r " )
143+ continue
144+ fi
115145 ZU_PUSHEN+=(" $r " )
146+ ZU_PUSHEN_PFAD+=(" $f " )
116147done
117148
118149echo " Ressourcen: ${# ALLE[@]} insgesamt, ${# ZU_PUSHEN[@]} werden gepusht,"
119- echo " ${# UEBERSPRUNGEN[@]} ausgenommen"
150+ echo " ${# UEBERSPRUNGEN[@]} ausgenommen, ${ # OHNE_DATEI[@]} ohne Datei "
120151if [ ${# UEBERSPRUNGEN[@]} -gt 0 ]; then
121152 for r in " ${UEBERSPRUNGEN[@]} " ; do
122153 echo " ausgenommen: $r "
123154 done
124155fi
156+ if [ ${# OHNE_DATEI[@]} -gt 0 ]; then
157+ for r in " ${OHNE_DATEI[@]} " ; do
158+ echo " ohne Datei: $r "
159+ done
160+ fi
125161
126162if $NUR_LISTE ; then
127163 if [ ${# ZU_PUSHEN[@]} -gt 0 ]; then
@@ -140,7 +176,42 @@ echo
140176read -r -p " Jetzt ${# ZU_PUSHEN[@]} Ressourcen mit --force pushen? [j/N] " ANTWORT
141177[[ " $ANTWORT " =~ ^[jJyY]$ ]] || { echo " Abgebrochen." ; exit 0; }
142178
143- cd " $REPO_ROOT " || exit 1
179+ # --- Staging aufbauen ----------------------------------------------------
180+ STAGING=" $( mktemp -d " ${TMPDIR:-/ tmp} /tx_push_all.XXXXXX" ) " || exit 1
181+ aufraeumen () {
182+ if $BEHALTEN ; then
183+ echo " Staging behalten: $STAGING "
184+ else
185+ rm -rf " $STAGING "
186+ fi
187+ }
188+ trap aufraeumen EXIT
189+
190+ mkdir -p " $STAGING /.tx"
191+ {
192+ echo " [main]"
193+ echo " host = https://www.transifex.com"
194+ } > " $STAGING /.tx/config"
195+
196+ I=0
197+ while [ $I -lt ${# ZU_PUSHEN[@]} ]; do
198+ r=" ${ZU_PUSHEN[$I]} "
199+ f=" ${ZU_PUSHEN_PFAD[$I]} "
200+ I=$(( I + 1 ))
201+ mkdir -p " $STAGING /$SPRACHE /$( dirname " $f " ) "
202+ ln -s " $REPO_ROOT /$f " " $STAGING /$SPRACHE /$f "
203+ {
204+ echo
205+ echo " [o:$ORGA :p:$PROJEKT :r:$r ]"
206+ echo " file_filter = <lang>/$f "
207+ echo " source_file = $SPRACHE /$f "
208+ echo " type = PO"
209+ echo " minimum_perc = 0"
210+ } >> " $STAGING /.tx/config"
211+ done
212+ echo " Staging: $STAGING "
213+
214+ cd " $STAGING " || exit 1
144215
145216OK=0
146217FEHLER=()
149220for r in " ${ZU_PUSHEN[@]} " ; do
150221 I=$(( I + 1 ))
151222 printf ' [%3d/%3d] %s ... ' " $I " " $N " " $r "
152- if tx push --translation --force " $PROJEKT .$r " > /dev/null 2>&1 ; then
223+ AUSGABE=" $( tx push --translation --force " $PROJEKT .$r " 2>&1 ) "
224+ if [ $? -eq 0 ] && printf ' %s' " $AUSGABE " | grep -q " Pushing translations" ; then
153225 echo " ok"
154226 OK=$(( OK + 1 ))
155227 else
@@ -166,7 +238,7 @@ if [[ ${#FEHLER[@]} -gt 0 ]]; then
166238 echo " $r "
167239 done
168240 echo
169- echo " Einzeln wiederholen mit:"
241+ echo " Einzeln wiederholen mit --nur <name> oder, im Staging-Verzeichnis :"
170242 echo " tx push --translation --force $PROJEKT .<name>"
171243 exit 1
172244fi
0 commit comments