1#! /bin/bash
2
3set_env()
4{
5  cd /home/worker
6  HGDIR=/home/worker
7  OUTPUTDIR=$(pwd)$(echo "/output")
8  DATE=$(date "+TB [%Y-%m-%d %H:%M:%S]")
9
10  if [ ! -d "${OUTPUTDIR}" ]; then
11    echo "Creating output dir"
12    mkdir "${OUTPUTDIR}"
13  fi
14
15  if [ ! -d "nspr" ]; then
16    for i in 0 2 5; do
17      sleep $i
18      hg clone -r "default" "https://hg.mozilla.org/projects/nspr" "${HGDIR}/nspr" && break
19      rm -rf nspr
20    done
21  fi
22
23  cd nss
24  ./build.sh -v -c
25  cd ..
26}
27
28check_abi()
29{
30  set_env
31  set +e #reverses set -e from build.sh to allow possible hg clone failures
32  if [[ "$1" != --nobuild ]]; then # Start nobuild block
33
34    echo "######## NSS ABI CHECK ########"
35    echo "######## creating temporary HG clones ########"
36
37    rm -rf ${HGDIR}/baseline
38    mkdir ${HGDIR}/baseline
39    BASE_NSS=`cat ${HGDIR}/nss/automation/abi-check/previous-nss-release`  #Reads the version number of the last release from the respective file
40    NSS_CLONE_RESULT=0
41    for i in 0 2 5; do
42        sleep $i
43        hg clone -u "${BASE_NSS}" "https://hg.mozilla.org/projects/nss" "${HGDIR}/baseline/nss"
44        if [ $? -eq 0 ]; then
45          NSS_CLONE_RESULT=0
46          break
47        fi
48        rm -rf "${HGDIR}/baseline/nss"
49        NSS_CLONE_RESULT=1
50    done
51    if [ ${NSS_CLONE_RESULT} -ne 0 ]; then
52      echo "invalid tag in automation/abi-check/previous-nss-release"
53      return 1
54    fi
55
56    BASE_NSPR=NSPR_$(head -1 ${HGDIR}/baseline/nss/automation/release/nspr-version.txt | cut -d . -f 1-2 | tr . _)_BRANCH
57    hg clone -u "${BASE_NSPR}" "https://hg.mozilla.org/projects/nspr" "${HGDIR}/baseline/nspr"
58    NSPR_CLONE_RESULT=$?
59
60    if [ ${NSPR_CLONE_RESULT} -ne 0 ]; then
61      rm -rf "${HGDIR}/baseline/nspr"
62      for i in 0 2 5; do
63          sleep $i
64          hg clone -u "default" "https://hg.mozilla.org/projects/nspr" "${HGDIR}/baseline/nspr" && break
65          rm -rf "${HGDIR}/baseline/nspr"
66      done
67      echo "Nonexisting tag ${BASE_NSPR} derived from ${BASE_NSS} automation/release/nspr-version.txt"
68      echo "Using default branch instead."
69    fi
70
71    echo "######## building baseline NSPR/NSS ########"
72    echo "${HGDIR}/baseline/nss/build.sh"
73    cd ${HGDIR}/baseline/nss
74    ./build.sh -v -c
75    cd ${HGDIR}
76  else  # Else nobuild block
77    echo "######## using existing baseline NSPR/NSS build ########"
78  fi # End nobuild block
79
80  set +e #reverses set -e from build.sh to allow abidiff failures
81
82  echo "######## Starting abidiff procedure ########"
83  abi_diff
84}
85
86#Slightly modified from builbot-slave/build.sh
87abi_diff()
88{
89  ABI_PROBLEM_FOUND=0
90  ABI_REPORT=${OUTPUTDIR}/abi-diff.txt
91  rm -f ${ABI_REPORT}
92  PREVDIST=${HGDIR}/baseline/dist
93  NEWDIST=${HGDIR}/dist
94  ALL_SOs="libfreebl3.so libfreeblpriv3.so libnspr4.so libnss3.so libnssckbi.so libnssdbm3.so libnsssysinit.so libnssutil3.so libplc4.so libplds4.so libsmime3.so libsoftokn3.so libssl3.so"
95  for SO in ${ALL_SOs}; do
96      if [ ! -f ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt ]; then
97          touch ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt
98      fi
99      abidiff --hd1 $PREVDIST/public/ --hd2 $NEWDIST/public \
100          $PREVDIST/*/lib/$SO $NEWDIST/*/lib/$SO \
101          > ${HGDIR}/nss/automation/abi-check/new-report-temp$SO.txt
102      RET=$?
103      cat ${HGDIR}/nss/automation/abi-check/new-report-temp$SO.txt \
104          | grep -v "^Functions changes summary:" \
105          | grep -v "^Variables changes summary:" \
106          > ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt
107      rm -f ${HGDIR}/nss/automation/abi-check/new-report-temp$SO.txt
108
109      ABIDIFF_ERROR=$((($RET & 0x01) != 0))
110      ABIDIFF_USAGE_ERROR=$((($RET & 0x02) != 0))
111      ABIDIFF_ABI_CHANGE=$((($RET & 0x04) != 0))
112      ABIDIFF_ABI_INCOMPATIBLE_CHANGE=$((($RET & 0x08) != 0))
113      ABIDIFF_UNKNOWN_BIT_SET=$((($RET & 0xf0) != 0))
114
115      # If abidiff reports an error, or a usage error, or if it sets a result
116      # bit value this script doesn't know yet about, we'll report failure.
117      # For ABI changes, we don't yet report an error. We'll compare the
118      # result report with our whitelist. This allows us to silence changes
119      # that we're already aware of and have been declared acceptable.
120
121      REPORT_RET_AS_FAILURE=0
122      if [ $ABIDIFF_ERROR -ne 0 ]; then
123          echo "abidiff reported ABIDIFF_ERROR."
124          REPORT_RET_AS_FAILURE=1
125      fi
126      if [ $ABIDIFF_USAGE_ERROR -ne 0 ]; then
127          echo "abidiff reported ABIDIFF_USAGE_ERROR."
128          REPORT_RET_AS_FAILURE=1
129      fi
130      if [ $ABIDIFF_UNKNOWN_BIT_SET -ne 0 ]; then
131          echo "abidiff reported ABIDIFF_UNKNOWN_BIT_SET."
132          REPORT_RET_AS_FAILURE=1
133      fi
134
135      if [ $ABIDIFF_ABI_CHANGE -ne 0 ]; then
136          echo "Ignoring abidiff result ABI_CHANGE, instead we'll check for non-whitelisted differences."
137      fi
138      if [ $ABIDIFF_ABI_INCOMPATIBLE_CHANGE -ne 0 ]; then
139          echo "Ignoring abidiff result ABIDIFF_ABI_INCOMPATIBLE_CHANGE, instead we'll check for non-whitelisted differences."
140      fi
141
142      if [ $REPORT_RET_AS_FAILURE -ne 0 ]; then
143          ABI_PROBLEM_FOUND=1
144          echo "abidiff {$PREVDIST , $NEWDIST} for $SO FAILED with result $RET, or failed writing to ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt"
145      fi
146      if [ ! -f ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt ]; then
147          ABI_PROBLEM_FOUND=1
148          echo "FAILED to access report file: ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt"
149      fi
150
151      diff -wB -u ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt \
152              ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt >> ${ABI_REPORT}
153      if [ ! -f ${ABI_REPORT} ]; then
154          ABI_PROBLEM_FOUND=1
155          echo "FAILED to compare exepcted and new report: ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt"
156      fi
157  done
158
159  if [ -s ${ABI_REPORT} ]; then
160      echo "FAILED: there are new unexpected ABI changes"
161      cat ${ABI_REPORT}
162      return 1
163  elif [ $ABI_PROBLEM_FOUND -ne 0 ]; then
164      echo "FAILED: failure executing the ABI checks"
165      cat ${ABI_REPORT}
166      return 1
167  fi
168
169  return 0
170}
171
172check_abi $1
173