prepare-release 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #!/bin/sh
  2. set -e
  3. cd "$(readlink -f $(dirname $0))"
  4. if [ -n "${GBP_BUILD_DIR}" ]; then
  5. cd "$GBP_BUILD_DIR"
  6. fi
  7. VERSION=$(dpkg-parsechangelog | sed -n -e '/^Version:/s/^Version: //p')
  8. DISTRIBUTION=$(dpkg-parsechangelog | sed -n -e '/^Distribution:/s/^Distribution: //p')
  9. LIBAPTPKGVERSION="$(awk -v ORS='.' '/^\#define APT_PKG_M/ {print $3}' apt-pkg/contrib/macros.h | sed 's/\.$//')"
  10. LIBAPTINSTVERSION="$(grep '^MAJOR=' apt-inst/makefile |cut -d '=' -f 2)"
  11. librarysymbolsfromfile() {
  12. local MISSING="$(grep '^+#MISSING' "$1")"
  13. local SYMVER="$2"
  14. echo '=== Missing optional symbols:'
  15. echo -n "$MISSING" | grep '|optional=' || true
  16. echo '=== Missing required symbols:'
  17. echo -n "$MISSING" | grep -v '|optional=' || true
  18. echo '=== New symbols:'
  19. grep '^+ ' "$1" | cut -d' ' -f 2 | cut -d'@' -f 1 | c++filt | while read line; do
  20. echo " (c++)\"${line}@${SYMVER}\" $VERSION"
  21. done | sort -u
  22. }
  23. if [ "$1" = 'pre-export' ]; then
  24. libraryversioncheck() {
  25. local LIBRARY="$1"
  26. local VERSION="$2"
  27. if [ ! -e "debian/${LIBRARY}${VERSION}.symbols" ]; then
  28. echo >&2 "Library ${LIBRARY} in version ${VERSION} has no symbols file! (maybe forgot to rename?)"
  29. exit 1
  30. fi
  31. if [ "$(head -n1 "debian/${LIBRARY}${VERSION}.symbols")" != "${LIBRARY}.so.${VERSION} ${LIBRARY}${VERSION} #MINVER#" ]; then
  32. echo >&2 "Library ${LIBRARY}${VERSION} has incorrect version in symbol header! (»$(head -n1 "debian/${LIBRARY}${VERSION}.symbols")«)"
  33. exit 2
  34. fi
  35. }
  36. libraryversioncheck 'libapt-pkg' "$LIBAPTPKGVERSION"
  37. libraryversioncheck 'libapt-inst' "$LIBAPTINSTVERSION"
  38. if [ "$DISTRIBUTION" = 'sid' ]; then
  39. echo >&2 '»sid« is not a valid distribution. Replace it with »unstable« for you'
  40. sed -i -e 's/) sid; urgency=/) unstable; urgency=/' debian/changelog
  41. DISTRIBUTION='unstable'
  42. elif [ "$DISTRIBUTION" = 'UNRELEASED' ]; then
  43. echo >&2 'WARNING: Remember to change to a valid distribution for release'
  44. VERSION="$VERSION~$(date +%Y%m%d)"
  45. fi
  46. sed -i -e "s/^PACKAGE_VERSION=\".*\"$/PACKAGE_VERSION=\"${VERSION}\"/" configure.ac
  47. sed -i -e "s/^<!ENTITY apt-product-version \".*\">$/<!ENTITY apt-product-version \"${VERSION}\">/" doc/apt-verbatim.ent
  48. if [ "$(date +%Y-%m-%d)" != "$(grep --max-count=1 '^"POT-Creation-Date: .*\n"$' po/apt-all.pot | cut -d' ' -f 2)" -o \
  49. "$(date +%Y-%m-%d)" != "$(grep --max-count=1 '^"POT-Creation-Date: .*\n"$' doc/po/apt-doc.pot | cut -d' ' -f 2)" ]; then
  50. echo >&2 'POT files are not up-to-date. Execute »make update-po« for you…'
  51. make update-po
  52. fi
  53. elif [ "$1" = 'post-build' ]; then
  54. if [ "$DISTRIBUTION" != "UNRELEASED" ]; then
  55. echo >&2 "REMEMBER: Tag this release with »git tag ${VERSION}« if you are satisfied"
  56. else
  57. echo >&2 'REMEMBER: Change to a valid distribution before release'
  58. fi
  59. dpkg-checkbuilddeps -d 'libxml2-utils'
  60. HEADERBLUEPRINT="$(mktemp)"
  61. sed -n '1,/^$/p' doc/apt.8.xml > "$HEADERBLUEPRINT"
  62. find doc -mindepth 1 -maxdepth 1 -type f -name '*.xml' | while read FILE; do
  63. if ! sed -n '1,/^$/p' "$FILE" | cmp "$HEADERBLUEPRINT" - >/dev/null 2>&1; then
  64. echo >&2 "WARNING: Manpage $FILE has not the usual header! (see diff below)"
  65. sed -n '1,/^$/p' "$FILE" | diff -u "$HEADERBLUEPRINT" - || true
  66. fi
  67. done
  68. sed -n '1,/^$/p' doc/guide.dbk > "$HEADERBLUEPRINT"
  69. find doc -mindepth 1 -maxdepth 1 -type f -name '*.dbk' | while read FILE; do
  70. if ! sed -n '1,/^$/p' "$FILE" | cmp "$HEADERBLUEPRINT" - >/dev/null 2>&1; then
  71. echo >&2 "WARNING: Documentation $FILE has not the usual header (see diff below)!"
  72. sed -n '1,/^$/p' "$FILE" | diff -u "$HEADERBLUEPRINT" - || true
  73. fi
  74. done
  75. rm "$HEADERBLUEPRINT"
  76. # check the manpages with each vendor for vendor-specific errors…
  77. find vendor -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f 2 | while read DISTRO; do
  78. ln -sf ../vendor/${DISTRO}/apt-vendor.ent doc
  79. if ! xmllint --nonet --valid --noout $(find doc/ -maxdepth 1 -name '*.xml'); then
  80. echo >&2 "WARNING: original docbook manpages have errors with vendor ${DISTRO}!"
  81. fi
  82. done
  83. # lets assume we will always have a german manpage translation
  84. if [ -e 'doc/de/' ]; then
  85. # … but check the translations only with one vendor for translation-specific errors
  86. if ! xmllint --nonet --valid --noout $(find doc/ -mindepth 2 -maxdepth 2 -name '*.xml'); then
  87. echo >&2 "WARNING: translated docbook manpages have errors!"
  88. fi
  89. else
  90. echo >&2 "ERROR: translated manpages need to be build before they can be checked!"
  91. fi
  92. rm -f doc/apt-vendor.ent
  93. elif [ "$1" = 'library' ]; then
  94. librarysymbols() {
  95. echo "Checking $1 in version $2"
  96. local tmpfile=$(mktemp)
  97. dpkg-gensymbols -p${1}${2} -ebuild/bin/${1}.so.${2} -Idebian/${1}${2}.symbols -O/dev/null 2> /dev/null > $tmpfile || true
  98. librarysymbolsfromfile "$tmpfile" "$(echo "${1}" | cut -c 4- | tr -d '-' | tr 'a-z' 'A-Z')_${2}"
  99. rm -f $tmpfile
  100. }
  101. librarysymbols 'libapt-pkg' "${LIBAPTPKGVERSION}"
  102. echo
  103. librarysymbols 'libapt-inst' "${LIBAPTINSTVERSION}"
  104. elif [ "$1" = 'buildlog' ]; then
  105. while [ -n "$2" ]; do
  106. librarysymbolsfromfile "$2" 'UNKNOWN'
  107. shift
  108. done
  109. elif [ "$1" = 'travis-ci' ]; then
  110. apt-get install -q --no-install-recommends $(sed -n -e '/^Build-Depends: /,/^Build-Depends-Indep: / {p}' debian/control | sed -e 's#([^)]*)##g' -e 's#^Build-Depends\(-Indep\)\?: ##' | tr -d ',')
  111. apt-get install -q --no-install-recommends $(sed -n 's#^Depends: .*@, \(.*\)$#\1#p' debian/tests/control | tr -d ',')
  112. elif [ "$1" = 'coverage' ]; then
  113. DIR="${2:-./coverage}"
  114. git clean -dfX # remove ignored build artefacts for a clean start
  115. make CFLAGS+='--coverage' CXXFLAGS+='--coverage'
  116. LCOVRC='--rc geninfo_checksum=1 --rc lcov_branch_coverage=1'
  117. mkdir "$DIR"
  118. lcov --no-external --directory . --capture --initial --output-file "${DIR}/apt.coverage.init" ${LCOVRC}
  119. make test || true
  120. ./test/integration/run-tests -q || true
  121. lcov --no-external --directory . --capture --output-file "${DIR}/apt.coverage.run" ${LCOVRC}
  122. lcov -a "${DIR}/apt.coverage.init" -a "${DIR}/apt.coverage.run" -o "${DIR}/apt.coverage.total" ${LCOVRC}
  123. cp "${DIR}/apt.coverage.total" "${DIR}/apt.coverage.fixed"
  124. rewritefile() {
  125. file="$1"
  126. shift
  127. name="$(basename "$file")"
  128. while [ -n "$1" ]; do
  129. if [ -r "$1/$name" ]; then
  130. sed -i "s#$file#$1/$name#" "${DIR}/apt.coverage.fixed"
  131. break
  132. fi
  133. shift
  134. done
  135. if [ -z "$1" ]; then
  136. echo >&2 "Coverage data captured for unknown file $file"
  137. fi
  138. }
  139. grep 'build/include/' "${DIR}/apt.coverage.fixed" | sed "s#^SF:$(pwd)/##" | while read file; do
  140. rewritefile "$file" 'apt-pkg' 'apt-pkg/deb' 'apt-pkg/edsp' 'apt-pkg/contrib' \
  141. 'apt-inst' 'apt-inst/deb' 'apt-inst/contrib' 'apt-private'
  142. done
  143. genhtml --output-directory "${DIR}" "${DIR}/apt.coverage.fixed" ${LCOVRC}
  144. else
  145. echo >&1 "Usage:\t$0 pre-export
  146. \t$0 post-build
  147. If you use »git buildpackage« you can leave these alone as they will
  148. be run at the right places auto-magically. Otherwise you should use
  149. »pre-export« to update po and pot files as well as version numbering.
  150. »post-build« can be used to run some more or less useful checks later on.
  151. \t$0 library
  152. \t$0 buildlog filename…
  153. »library« and »buildlog« aren't run automatically but can be useful for
  154. maintaining the (more or less experimental) symbols files we provide.
  155. »library« displays the diff between advertised symbols and the once provided
  156. by the libraries, while »buildlog« extracts this diff from the buildlogs.
  157. Both will format the diff properly.
  158. \t$0 travis-ci
  159. \t$0 coverage [output-dir]
  160. »travis-ci« is a shortcut to install all build- as well as test-dependencies
  161. used by .travis.yml.
  162. »coverage« does a clean build with the right flags for coverage reporting,
  163. runs all tests and generates a html report in the end.
  164. "
  165. fi