summaryrefslogtreecommitdiffstats
path: root/taskcluster/docker/python-dependency-update/scripts/update_pipfiles.sh
blob: c6f9b107011ee780d793e82c6fb4ad64f7979cd9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/bash

set -e

function usage {
  cat <<EOF

Usage: $(basename "$0") -h # Displays this usage/help text
Usage: $(basename "$0") -x # lists exit codes
Usage: $(basename "$0") -b branch -r REQUIREMENTS_FILE [-2] [-3]

EOF
}

BRANCH=""
PIP=""
COMMIT_AUTHOR='ffxbld <ffxbld@mozilla.com>'
REPODIR=''
HGHOST="hg.mozilla.org"
BASEDIR="${HOME}"
REQUIREMENTS_FILE=""

HG="$(command -v hg)"

# Clones an hg repo
function clone_repo {
  cd "${BASEDIR}"
  if [ ! -d "${REPODIR}" ]; then
    CLONE_CMD="${HG} clone ${HGREPO} ${REPODIR}"
    ${CLONE_CMD}
  fi

  ${HG} -R "${REPODIR}" pull
  ${HG} -R "${REPODIR}" update -C default
}

# Push all pending commits to Phabricator
function push_repo {
  cd "${REPODIR}"
  if [ ! -r "${HOME}/.arcrc" ]
  then
    return 1
  fi
  if ! ARC=$(command -v arc)
  then
    return 1
  fi
  if [ -z "${REVIEWERS}" ]
  then
    return 1
  fi
  # Clean up older review requests
  # Turn  Needs Review D624: No bug, Automated HSTS ...
  # into D624
  for diff in $($ARC list | grep "Needs Review" | grep "${REQUIREMENTS_FILE} pip-update" | awk 'match($0, /D[0-9]+[^: ]/) { print substr($0, RSTART, RLENGTH)  }')
  do
    echo "Removing old request $diff"
    # There is no 'arc abandon', see bug 1452082
    echo '{"transactions": [{"type":"abandon"}], "objectIdentifier": "'"${diff}"'"}' | arc call-conduit differential.revision.edit
  done

  $ARC diff --verbatim --reviewers "${REVIEWERS}"
}

function update_requirements {
  pushd "${REPODIR}/${1}"
  pip-compile --generate-hashes "${2}"
  popd
}

# Main

# Parse our command-line options.
while [ $# -gt 0 ]; do
  case "$1" in
    -h) usage; exit 0 ;;
    -b) BRANCH="$2"; shift ;;
    -r) REPODIR="$2"; shift ;;
    -2) PIP="pip" ;;
    -3) PIP="pip3" ;;
    -f) REQUIREMENTS_FILE="$2"; shift ;;
    -*) usage
      exit 11 ;;
    *)  break ;; # terminate while loop
  esac
  shift
done

# Must supply a code branch to work with.
if [ "${PIP}" == "" ]; then
  echo "Error: You must specify a python version with -2 or -3" >&2
  usage
  exit 12
fi

# Must supply a code branch to work with.
if [ "${BRANCH}" == "" ]; then
  echo "Error: You must specify a branch with -b branchname." >&2
  usage
  exit 13
fi

if [ "${REPODIR}" == "" ]; then
  REPODIR="${BASEDIR}/$(basename "${BRANCH}")"
fi

if [ "${BRANCH}" == "mozilla-central" ]; then
  HGREPO="https://${HGHOST}/${BRANCH}"
elif [[ "${BRANCH}" == mozilla-* ]]; then
  HGREPO="https://${HGHOST}/releases/${BRANCH}"
else
  HGREPO="https://${HGHOST}/projects/${BRANCH}"
fi

clone_repo

${PIP} install pip-tools

requirements_basefile="$(basename "${REQUIREMENTS_FILE}")"
requirements_dir="$(dirname "${REQUIREMENTS_FILE}")"
update_requirements "${requirements_dir}" "${requirements_basefile}"
requirements_newfile="${requirements_basefile%%.in}.txt"
DIFF_ARTIFACT="${ARTIFACTS_DIR}/${requirements_newfile}.diff"

echo "INFO: diffing old/new ${requirements_newfile} into ${DIFF_ARTIFACT}"
${HG} -R "${REPODIR}" diff "${BASEDIR}/${BRANCH}/${requirements_dir}/${requirements_newfile}" | tee "${DIFF_ARTIFACT}"

COMMIT_MESSAGE="No Bug, ${requirements_dir}/${requirements_newfile} pip-update."

if ${HG} -R "${REPODIR}" commit -u "${COMMIT_AUTHOR}" -m "${COMMIT_MESSAGE}"
then
  ${HG} -R "${REPODIR}" out
  push_repo
fi

echo "All done"