PYTHON-3071 [DevOps] Merge and improve resync_specs.sh (#839)

This commit is contained in:
Julius Park 2022-02-01 12:45:47 -08:00 committed by GitHub
parent 308b4f4e08
commit aa60c2a2c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 165 additions and 0 deletions

145
.evergreen/resync-specs.sh Executable file
View File

@ -0,0 +1,145 @@
#!/bin/bash
# exit when any command fails
set -e
PYMONGO=$(dirname "$(cd "$(dirname "$0")"; pwd)")
SPECS=${MDB_SPECS:-~/Work/specifications}
help (){
echo "Usage: resync_specs.sh [-bcsp] spec"
echo "Required arguments:"
echo " spec determines which folder the spec tests will be copied from."
echo "Optional flags:"
echo " -b is used to add a string to the blocklist for that next run. Can be used"
echo " any number of times on a single command to block multiple patterns."
echo " You can use any regex pattern (it is passed to 'grep -Ev')."
echo " -c is used to set a branch or commit that will be checked out in the"
echo " specifications repo before copying."
echo " -s is used to set a unique path to the specs repo for that specific"
echo " run."
echo "Notes:"
echo "You can export the environment variable MDB_SPECS to set the specs"
echo " repo similar to -s, but this will persist between runs until you "
echo "unset it."
}
# Parse flag args
BRANCH=''
BLOCKLIST='.*\.yml'
while getopts 'b:c:s:' flag; do
case "${flag}" in
b) BLOCKLIST+="|$OPTARG"
;;
c) BRANCH="${OPTARG}"
;;
s) SPECS="${OPTARG}"
;;
*) help; exit 0
;;
esac
done
shift $((OPTIND-1))
if [ -z $BRANCH ]
then
git -C $SPECS checkout $BRANCH
fi
# Ensure the JSON files are up to date.
cd $SPECS/source
make
cd -
# cpjson unified-test-format/tests/invalid unified-test-format/invalid
# * param1: Path to spec tests dir in specifications repo
# * param2: Path to where the corresponding tests live in Python.
cpjson () {
find "$PYMONGO"/test/$2 -type f -delete
cd "$SPECS"/source/$1
find . -name '*.json' | grep -Ev "${BLOCKLIST}" | cpio -pdm \
$PYMONGO/test/$2
printf "\nIgnored files for ${PWD}"
printf "\n%s\n" "$(diff <(find . -name '*.json' | sort) \
<(find . -name '*.json' | grep -Ev "${BLOCKLIST}" | sort))" | \
sed -e '/^[0-9]/d' | sed -e 's|< ./||g'
}
for spec in "$@"
do
case "$spec" in
bson*corpus)
cpjson bson-corpus/tests/ bson_corpus
;;
max*staleness)
cpjson max-staleness/tests/ max_staleness
;;
connection*string)
cpjson connection-string/tests/ connection_string/test
;;
change*streams)
cpjson change-streams/tests/ change_streams/
;;
cmap|CMAP)
cpjson connection-monitoring-and-pooling/tests cmap
;;
command*monitoring)
cpjson command-monitoring/tests command_monitoring
;;
crud|CRUD)
cpjson crud/tests/ crud
;;
load*balancer)
cpjson load-balancers/tests load_balancer
;;
initial-dns-seedlist-discovery|srv_seedlist)
cpjson initial-dns-seedlist-discovery/tests/ srv_seedlist
;;
old_srv_seedlist)
cpjson initial-dns-seedlist-discovery/tests srv_seedlist
;;
retryable*reads)
cpjson retryable-reads/tests/ retryable_reads
;;
retryable*writes)
cpjson retryable-writes/tests/ retryable_writes
;;
sdam|SDAM)
cpjson server-discovery-and-monitoring/tests/errors \
discovery_and_monitoring/errors
cpjson server-discovery-and-monitoring/tests/rs \
discovery_and_monitoring/rs
cpjson server-discovery-and-monitoring/tests/sharded \
discovery_and_monitoring/sharded
cpjson server-discovery-and-monitoring/tests/single \
discovery_and_monitoring/single
cpjson server-discovery-and-monitoring/tests/integration \
discovery_and_monitoring_integration
cpjson server-discovery-and-monitoring/tests/load-balanced \
discovery_and_monitoring/load-balanced
;;
sdam*monitoring)
cpjson server-discovery-and-monitoring/tests/monitoring sdam_monitoring
;;
server*selection)
cpjson server-selection/tests/ server_selection
;;
sessions)
cpjson sessions/tests/ sessions
;;
transactions|transactions-convenient-api)
cpjson transactions/tests/ transactions
cpjson transactions-convenient-api/tests/ transactions-convenient-api
;;
unified)
cpjson unified-test-format/tests/ unified-test-format/
;;
uri|uri*options)
cpjson uri-options/tests uri_options
;;
versioned-api)
cpjson versioned-api/tests versioned-api
;;
*)
echo "Do not know how to resync spec tests for '${spec}'"
help
;;
esac
done

View File

@ -48,3 +48,23 @@ just make your changes to the inline documentation of the appropriate
branch and submit a `pull request <https://help.github.com/articles/using-pull-requests>`_.
You might also use the GitHub `Edit <https://github.com/blog/844-forking-with-the-edit-button>`_
button.
Re-sync Spec Tests
-----------------
If you would like to re-sync the copy of the specification tests in the
PyMongo repository with that which is inside the `specifications repo
<https://github.com/mongodb/specifications>`_, please
use the script provided in ``.evergreen/resync-specs.sh``.::
git clone git@github.com:mongodb/specifications.git
export MDB_SPECS=~/specifications
cd ~/mongo-python-driver/.evergreen
./resync-specs.sh -b "connection-string*" crud bson-corpus
cd ..
The ``-b`` flag adds as a regex pattern to block files you do not wish to
update in PyMongo.
This is primarily helpful if you are implementing a new feature in PyMongo
that has spec tests already implemented, or if you are attempting to
validate new spec tests in PyMongo.