scripts: Add fetch-lineage-translations script

Change-Id: I4a5f69a7c6895e0d20febf954efbebb9ccf7cbc5
diff --git a/lineage-merger/fetch-lineage-translations.sh b/lineage-merger/fetch-lineage-translations.sh
new file mode 100755
index 0000000..a54e1d3
--- /dev/null
+++ b/lineage-merger/fetch-lineage-translations.sh
@@ -0,0 +1,120 @@
+#!/bin/bash
+#
+# Copyright (C) 2022 The LeafOS Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+usage() {
+    echo "Usage ${0} <branch>"
+}
+
+# Verify argument count
+if [ "$#" -ne 1 ]; then
+    usage
+    exit 1
+fi
+
+BRANCH="${1}"
+
+# Check to make sure this is being run from the top level repo dir
+if [ ! -e "build/envsetup.sh" ]; then
+    echo "Must be run from the top level repo dir"
+    exit 1
+fi
+
+# Source build environment (needed for gettop)
+. build/envsetup.sh
+
+TOP="$(gettop)"
+MERGEDREPOS="${TOP}/merged_repos_lineage_translations.txt"
+MANIFEST="${TOP}/.repo/manifests/snippets/leaf.xml"
+LEAF_BRANCH=$(git -C ${TOP}/.repo/manifests.git config --get branch.default.merge | sed 's#refs/heads/##g')
+
+# Build list of LeafOS forked repos
+PROJECTPATHS=$(repo forall -g default,-lineage -c '[ ! -z "$(find -name cm_strings.xml)" ] && echo "$REPO_PATH "')
+
+echo "#### LineageOS branch = ${BRANCH} Branch = ${LEAF_BRANCH} ####"
+
+# Make sure manifest and forked repos are in a consistent state
+echo "#### Verifying there are no uncommitted changes on projects containing LineageOS strings ####"
+for PROJECTPATH in ${PROJECTPATHS} .repo/manifests; do
+    # Skip fully removed projects
+    [ ! -d "${TOP}/$PROJECTPATH" ] && continue;
+    cd "${TOP}/${PROJECTPATH}"
+    if [[ -n "$(git status --porcelain)" ]]; then
+        echo "Path ${PROJECTPATH} has uncommitted changes. Please fix."
+        exit 1
+    fi
+done
+echo "#### Verification complete - no uncommitted changes found ####"
+
+# Remove any existing list of merged repos file
+rm -f "${MERGEDREPOS}"
+
+# Iterate over each project
+for PROJECTPATH in ${PROJECTPATHS}; do
+    # Skip fully removed projects
+    [ ! -d "${TOP}/$PROJECTPATH" ] && continue;
+    cd "${TOP}/${PROJECTPATH}"
+    echo "### Fetching LineageOS strings from ${BRANCH} into ${PROJECTPATH} ###"
+
+    EXTRAREFS=""
+    # Upstream has some Settings strings in a dedicated repo
+    if [ "$PROJECTPATH" = "packages/apps/Settings" ]; then
+        git fetch https://github.com/LineageOS/android_packages_apps_LineageParts "${BRANCH}"
+        EXTRAREFS=$(git rev-parse FETCH_HEAD)
+    fi
+
+    git fetch https://github.com/LineageOS/android_$(echo $PROJECTPATH | sed 's|/|_|g') "${BRANCH}"
+
+    for CM_STRINGS in $(find -iregex '.*/values/cm_strings.xml'); do
+        STRINGS_TO_FIND=$(grep -Po '<(string|plurals) name="\K[^"]*' "$CM_STRINGS")
+        PATTERN="$(dirname $CM_STRINGS | sed 's|^\./||g')-[^/]*/$(basename $CM_STRINGS)"
+        for TRANSLATION in $(git ls-tree -r --name-only FETCH_HEAD | grep -P "$PATTERN"); do
+            EXTRATRANSLATION="$(dirname $TRANSLATION)/strings.xml"
+            mkdir -p $(dirname $TRANSLATION)
+            echo '<?xml version="1.0" encoding="utf-8"?>' > $TRANSLATION
+            GIT_PAGER="cat" git show FETCH_HEAD:$TRANSLATION | grep -Pzo '<!--(\n( )*Copyright|\n/\*\*\n( )*\* Copyright)[\s\S]*?-->' | sed 's/\x0$/\n/g' >> $TRANSLATION
+            echo '<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">' >> $TRANSLATION
+
+            for STRING in $STRINGS_TO_FIND; do
+                for REF in "FETCH_HEAD" $EXTRAREFS; do
+                    FILENAME=$TRANSLATION
+                    if [ "$REF" != "FETCH_HEAD" ]; then
+                        FILENAME=$EXTRATRANSLATION
+                        if [ -z $(git ls-tree -r --name-only $REF $FILENAME) ]; then
+                            continue;
+                        fi
+                    fi
+
+                    LINE=$(GIT_PAGER="cat" git show $REF:$FILENAME | grep -Pzo "    <(string|plurals) name=\"$STRING\">[\s\S]*?</(string|plurals)>" | sed 's/\x0$/\n/g')
+                    if [ ! -z "$LINE" ]; then
+                        echo "$LINE" >> $TRANSLATION
+                        break;
+                    fi
+                done
+            done
+
+            echo '</resources>' >> $TRANSLATION
+        done
+    done
+
+    if [[ -n "$(git status --porcelain)" ]]; then
+        git add .
+        git commit -m "Import cm_strings translations from lineage"
+        echo -e "import\t\t${PROJECTPATH}" | tee -a "${MERGEDREPOS}"
+    else
+        echo -e "nochange\t\t${PROJECTPATH}" | tee -a "${MERGEDREPOS}"
+    fi
+done