blob: 46fbdcfaaf4a348113d85a7f162f0021e126ba2b [file] [log] [blame]
#!/bin/bash
# 2011-02-17 - add product flag to make script usable for other apps (Callek)
# 2010-09-10 - compare downloaded single files before cloning (ccooper)
# 2008-06-27 - Copied from sync-blocklist (dtownsend)
# 2008-07-14 - Use a permanent local clone (dtownsend)
# 2008-07-24 - Fix hg username (dtownsend)
USAGE()
{
cat <<EOF
DEPRECATED: use tools/scripts/periodic_file_updates/periodic_file_updates.sh instead.
usage: `basename $0` [-n] [-c] [-d] [-a]
[-p product]
[--hgtool hgtool_location]
[--mirror hg_mirror --bundle bundle_location]
[-u hg_ssh_user]
[-k hg_ssh_key]
[-r existing_repo_dir]
-b branch
EOF
}
DRY_RUN=false
BRANCH=""
CLOSED_TREE=false
DONTBUILD=false
APPROVAL=false
HG_SSH_USER='ffxbld'
HG_SSH_KEY='~cltbld/.ssh/ffxbld_rsa'
PRODUCT='firefox'
REPODIR='blocklist'
HGTOOL=''
MIRROR=''
BUNDLE=''
while [ $# -gt 0 ]; do
case "$1" in
-p) PRODUCT="$2"; shift;;
-b) BRANCH="$2"; shift;;
-n) DRY_RUN=true;;
-c) CLOSED_TREE=true;;
-d) DONTBUILD=true;;
-a) APPROVAL=true;;
-u) HG_SSH_USER="$2"; shift;;
-k) HG_SSH_KEY="$2"; shift;;
-r) REPODIR="$2"; shift;;
--hgtool) HGTOOL="$2"; shift;;
--mirror) MIRROR="$2"; shift;;
--bundle) BUNDLE="$2"; shift;;
-*) USAGE
exit 1;;
*) break;; # terminate while loop
esac
shift
done
if [ "$BRANCH" == "" ]; then
USAGE
exit 1
fi
case "$PRODUCT" in
firefox)
APP_DIR="browser";
APP_ID="%7Bec8030f7-c20a-464f-9b0e-13a3a9e97384%7D";
APP_NAME="Firefox";;
seamonkey)
APP_DIR="suite";
APP_ID="%7B92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a%7D";
APP_NAME="SeaMonkey";;
thunderbird)
APP_DIR="mail";
APP_ID="%7B3550f703-e582-4d05-9a08-453d09bdfdc6%7D";
APP_NAME="Thunderbird";;
*)
echo >&2 "Invalid Product was passed to $0. Passed value was: $PRODUCT";
USAGE
exit 1;;
esac
HGHOST="hg.mozilla.org"
HGREPO="http://${HGHOST}/${BRANCH}"
HGPUSHREPO="ssh://${HGHOST}/${BRANCH}"
BLOCKLIST_URL_HG="${HGREPO}/raw-file/default/${APP_DIR}/app/blocklist.xml"
# Try to find hgtool if it hasn't been set.
if [ ! -f "${HGTOOL}" ]; then
HGTOOL=`which hgtool.py 2>/dev/null | head -n1`
fi
HG=hg
WGET=wget
DIFF=diff
HOST=`/bin/hostname -s`
compare_blocklists()
{
VERSION_URL_HG="${HGREPO}/raw-file/default/${APP_DIR}/config/version.txt"
rm -f version.txt
${WGET} --no-check-certificate -O version.txt ${VERSION_URL_HG}
WGET_STATUS=$?
if [ ${WGET_STATUS} != 0 ]; then
echo "ERROR wget exited with a non-zero exit code: $WGET_STATUS"
return ${WGET_STATUS}
fi
VERSION=`cat version.txt | sed 's/[^.0-9]*$//'`
if [ "${VERSION}" == "" ]; then
echo "ERROR Unable to parse version from version.txt"
fi
BLOCKLIST_URL_AMO="https://blocklist.addons.mozilla.org/blocklist/3/${APP_ID}/${VERSION}/${APP_NAME}/20090105024647/blocklist-sync/en-US/nightly/blocklist-sync/default/default/"
rm -f blocklist_amo.xml
${WGET} --no-check-certificate -O blocklist_amo.xml ${BLOCKLIST_URL_AMO}
WGET_STATUS=$?
if [ ${WGET_STATUS} != 0 ]; then
echo "ERROR wget exited with a non-zero exit code: ${WGET_STATUS}"
return ${WGET_STATUS}
fi
rm -f blocklist_hg.xml
${WGET} -O blocklist_hg.xml ${BLOCKLIST_URL_HG}
WGET_STATUS=$?
if [ ${WGET_STATUS} != 0 ]; then
echo "ERROR wget exited with a non-zero exit code: ${WGET_STATUS}"
return ${WGET_STATUS}
fi
# The downloaded files should be non-empty and have a valid xml header
# if they were retrieved properly, and some random HTML garbage if not.
XML_HEADER='<?xml version="1.0"?>'
AMO_HEADER=`head -n1 blocklist_amo.xml`
HG_HEADER=`head -n1 blocklist_hg.xml`
if [ ! -s "blocklist_amo.xml" -o "${XML_HEADER}" != "${AMO_HEADER}" ]; then
echo "AMO blocklist does not appear to be an XML file. wget error?"
exit 1
fi
if [ ! -s "blocklist_hg.xml" -o "${XML_HEADER}" != "${HG_HEADER}" ]; then
echo "HG blocklist does not appear to be an XML file. wget error?"
exit 1
fi
${DIFF} blocklist_hg.xml blocklist_amo.xml >/dev/null 2>&1
DIFF_STATUS=$?
case "${DIFF_STATUS}" in
0|1) ;;
*) echo "ERROR diff exited with exit code: ${DIFF_STATUS}"
exit ${DIFF_STATUS}
esac
return ${DIFF_STATUS}
}
update_blocklist_in_hg()
{
if [ ! -d ${REPODIR} ]; then
CLONE_CMD=""
if [ -f "${HGTOOL}" ]; then
# Need to pass the default branch here to avoid pollution from buildprops.json
# when hgtool.py is run in production.
CLONE_CMD="${HGTOOL} --branch default"
if [ "${MIRROR}" != "" ]; then
CLONE_CMD="${CLONE_CMD} --mirror ${MIRROR}"
fi
if [ "${BUNDLE}" != "" ]; then
CLONE_CMD="${CLONE_CMD} --bundle ${BUNDLE}"
fi
else
# Fallback on vanilla hg
echo "hgtool.py not found. Falling back to vanilla hg."
CLONE_CMD="${HG} clone"
fi
CLONE_CMD="${CLONE_CMD} ${HGREPO} ${REPODIR}"
echo ${CLONE_CMD}
${CLONE_CMD}
CLONE_STATUS=$?
if [ ${CLONE_STATUS} != 0 ]; then
echo "ERROR hg clone exited with a non-zero exit code: ${CLONE_STATUS}"
return ${CLONE_STATUS}
fi
fi
echo ${HG} -R ${REPODIR} pull
${HG} -R ${REPODIR} pull
PULL_STATUS=$?
if [ ${PULL_STATUS} != 0 ]; then
echo "ERROR hg pull exited with a non-zero exit code: ${PULL_STATUS}"
return ${PULL_STATUS}
fi
echo ${HG} -R ${REPODIR} update -C default
${HG} -R ${REPODIR} update -C default
UPDATE_STATUS=$?
if [ ${UPDATE_STATUS} != 0 ]; then
echo "ERROR hg update exited with a non-zero exit code: ${UPDATE_STATUS}"
return ${UPDATE_STATUS}
fi
cp -f blocklist_amo.xml ${REPODIR}/${APP_DIR}/app/blocklist.xml
COMMIT_MESSAGE="No bug, Automated blocklist update from host $HOST"
if [ ${DONTBUILD} == true ]; then
COMMIT_MESSAGE="${COMMIT_MESSAGE} - (DONTBUILD)"
fi
if [ ${CLOSED_TREE} == true ]; then
COMMIT_MESSAGE="${COMMIT_MESSAGE} - CLOSED TREE"
fi
if [ ${APPROVAL} == true ]; then
COMMIT_MESSAGE="${COMMIT_MESSAGE} - a=blocklist-update"
fi
echo ${HG} -R ${REPODIR} commit -u \"${HG_SSH_USER}\" -m \"${COMMIT_MESSAGE}\"
${HG} -R ${REPODIR} commit -u "${HG_SSH_USER}" -m "${COMMIT_MESSAGE}"
echo ${HG} -R ${REPODIR} push -e \"ssh -l ${HG_SSH_USER} -i ${HG_SSH_KEY}\" ${HGPUSHREPO}
${HG} -R ${REPODIR} push -e "ssh -l ${HG_SSH_USER} -i ${HG_SSH_KEY}" ${HGPUSHREPO}
PUSH_STATUS=$?
if [ ${PUSH_STATUS} != 0 ]; then
echo "ERROR hg push exited with exit code: ${PUSH_STATUS}, probably raced another changeset"
echo ${HG} -R ${REPODIR} rollback
${HG} -R ${REPODIR} rollback
ROLLBACK_STATUS=$?
if [ ${ROLLBACK_STATUS} != 0 ]; then
echo "ERROR hg rollback failed with exit code: ${ROLLBACK_STATUS}"
echo "This is unrecoverable, removing the local clone to start fresh next time."
rm -rf ${REPODIR}
return ${ROLLBACK_STATUS}
fi
fi
return ${PUSH_STATUS}
}
compare_blocklists
result=$?
if [ ${result} != 0 ]; then
if [ "${DRY_RUN}" == "true" ]; then
echo "Blocklist files differ, but not updating hg in dry-run mode."
else
echo "Blocklist files differ, updating hg."
update_blocklist_in_hg
result=$?
fi
else
echo "Blocklist files are identical. Nothing to update."
fi
exit ${result}