| #!/bin/bash |
| # |
| # Script to compare a distribution archive for expected files based on git. |
| # |
| # Usage: |
| # check_missing_dist_files.sh path/to/dist_archive.tar.gz |
| |
| set -eux |
| set -o pipefail |
| |
| # By default, look for a git repo based on this script's path. |
| : ${SOURCE_DIR:=$(cd $(dirname $0)/../.. ; pwd)} |
| |
| # Use a temporary directory for intermediate files. |
| # Note that pipelines below use subshells to avoid multiple trap executions. |
| _workdir=$(mktemp -d) |
| function cleanup_workdir() { rm -r ${_workdir}; } |
| trap cleanup_workdir EXIT |
| |
| # List all the files in the archive. |
| ( |
| tar -atf $1 | \ |
| cut -d/ -f2- | \ |
| sort |
| ) > ${_workdir}/archive.lst |
| |
| # List all files in the git repo that should be in the archive. |
| ( |
| git -C ${SOURCE_DIR} ls-files | \ |
| grep "^\(java\|python\|objectivec\|csharp\|ruby\|php\|cmake\|examples\|src/google/protobuf/.*\.proto\)" |\ |
| grep -v ".gitignore" | \ |
| grep -v "java/lite/proguard.pgcfg" | \ |
| grep -v "python/compatibility_tests" | \ |
| grep -v "python/docs" | \ |
| grep -v "python/.repo-metadata.json" | \ |
| grep -v "python/protobuf_distutils" | \ |
| grep -v "csharp/compatibility_tests" | \ |
| sort |
| ) > ${_workdir}/expected.lst |
| |
| # Check for missing files. |
| MISSING_FILES=( $(cd ${_workdir} && comm -13 archive.lst expected.lst) ) |
| if (( ${#MISSING_FILES[@]} == 0 )); then |
| exit 0 |
| fi |
| |
| ( |
| set +x |
| echo -e "\n\nMissing files from archive:" |
| for (( i=0 ; i < ${#MISSING_FILES[@]} ; i++ )); do |
| echo " ${MISSING_FILES[i]}" |
| done |
| echo -e "\nAdd them to the 'pkg_files' rule in corresponding BUILD.bazel.\n" |
| ) >&2 |
| exit 1 |