Skip to content

Commit 136874a

Browse files
committed
tx_push_all.sh -> small change
1 parent 6872687 commit 136874a

1 file changed

Lines changed: 92 additions & 20 deletions

File tree

‎_tools/tx_push_all.sh‎

Lines changed: 92 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,23 @@
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
@@ -27,13 +33,15 @@
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
#
3138
set -uo pipefail
3239

3340
REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
3441
CONFIG="$REPO_ROOT/.tx/config"
3542
ORGA="${ORGA:-python-doc}"
3643
PROJEKT="${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=(
4856
NUR=""
4957
MIT_AUSNAHMEN=false
5058
NUR_LISTE=false
59+
BEHALTEN=false
5160

5261
while [[ $# -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)"
7989
echo "Repo: $REPO_ROOT"
8090
echo "Branch: ${BRANCH:-unbekannt}"
8191
echo "Projekt: $ORGA / $PROJEKT"
92+
echo "Sprache: $SPRACHE"
8293

8394
ausgenommen() {
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.
95107
ALLE=()
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"); }
98111
done < <(
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
)
102122
if [[ ${#ALLE[@]} -eq 0 ]]; then
103123
echo "In $CONFIG keine Ressourcen fuer $ORGA/$PROJEKT gefunden."
104124
exit 1
105125
fi
106126

107127
ZU_PUSHEN=()
128+
ZU_PUSHEN_PFAD=()
108129
UEBERSPRUNGEN=()
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")
116147
done
117148

118149
echo "Ressourcen: ${#ALLE[@]} insgesamt, ${#ZU_PUSHEN[@]} werden gepusht,"
119-
echo " ${#UEBERSPRUNGEN[@]} ausgenommen"
150+
echo " ${#UEBERSPRUNGEN[@]} ausgenommen, ${#OHNE_DATEI[@]} ohne Datei"
120151
if [ ${#UEBERSPRUNGEN[@]} -gt 0 ]; then
121152
for r in "${UEBERSPRUNGEN[@]}"; do
122153
echo " ausgenommen: $r"
123154
done
124155
fi
156+
if [ ${#OHNE_DATEI[@]} -gt 0 ]; then
157+
for r in "${OHNE_DATEI[@]}"; do
158+
echo " ohne Datei: $r"
159+
done
160+
fi
125161

126162
if $NUR_LISTE; then
127163
if [ ${#ZU_PUSHEN[@]} -gt 0 ]; then
@@ -140,7 +176,42 @@ echo
140176
read -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

145216
OK=0
146217
FEHLER=()
@@ -149,7 +220,8 @@ I=0
149220
for 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
172244
fi

0 commit comments

Comments
 (0)