Mercurial > kallithea
view scripts/dbmigrate-test @ 8588:210e76d69b62
mysql: bump charset to to 'utf8mb4' to get full UTF-8 support
We used to use 'utf8', but in MySQL, this is just an alias for 'utf8mb3' which
isn't full unicode. 'utf8mb4' has less surprises (especially if used with the
'utf8mb4_unicode_ci' collation).
MySQL character sets for server, database, tables, and connection are set
independently. Until now, we have specified 'utf8' when creating tables to
overrule the database charset and in the default MySQL connection URL.
For existing databases, it is recommended to change encoding (and collation) by
altering the each of the tables inside it as described on
https://stackoverflow.com/questions/6115612/how-to-convert-an-entire-mysql-database-characterset-and-collation-to-utf-8 .
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Mon, 15 Jun 2020 16:57:20 +0200 |
parents | 3158cf0dafb7 |
children | 0a9ddb8cd8c1 |
line wrap: on
line source
#!/bin/sh -e if [ $# -lt 2 ] || [ $# -gt 3 ]; then cat >&2 <<EOD usage: $0 CONFIG_FILE FROM_REV [TO_REV] Runs a database migration from FROM_REV to TO_REV (default: current working directory parent), using the specified CONFIG_FILE (.ini file). Test is run using a clean Kallithea install, in a temporary virtual environment. FROM_REV and (optional) TO_REV should be Mercurial revision identifiers (e.g. changeset hash or a version number tag). The working directory is not touched, but the database referenced in the config file will be (re)created. Only SQLite is available out of the box; for MySQL or PostgreSQL, set the EXTRA environment variable to the required package(s), and it'll be installed in the virtual environment. (E.g. EXTRA=MySQL-python or EXTRA=psycopg2.) The temporary directory is not removed, allowing follow-up examination of the upgrade results. It is, however, created in /tmp by default, which many Linux distributions automatically clean at regular intervals. EOD exit 1 fi config_file=$(readlink -f "$1") from_rev=$2 to_rev=$3 source_repo=$(dirname "$(dirname "$(readlink -f "$0")")") announce() { echo echo "$1" echo } quiet_if_ok() ( local output local st set +e output=$("$@" < /dev/null 2>&1) st=$? if [ $st -ne 0 ]; then echo "$output" >&2 echo "Command $@ returned exit status $st." >&2 exit 1 fi ) HG() { "${HG:-hg}" --repository "$source_repo" "$@" } # If upgrading to "current revision", warn if working directory is dirty. if [ ! "$to_rev" ] && [ "$(HG status -mard)" ]; then announce "Warning: Uncommitted changes in working directory will be ignored!" fi from_rev_hash=$(HG id --id --rev "${from_rev:-.}") to_rev_hash=$(HG id --id --rev "${to_rev:-.}") temp=$(readlink -f "$(mktemp --tmpdir -d 'dbmigrate-test.XXXXXX')") cat <<EOD Config file: $config_file EOD sed -n -e 's/^sqlalchemy\.url *= */Database URL: /p' "$config_file" cat <<EOD Working dir: $temp Repository: $source_repo Upgrade from: $from_rev_hash (${from_rev:-current}) Upgrade to: $to_rev_hash (${to_rev:-current}) Extra packages: ${EXTRA:-(none)} EOD mkdir "$temp/repos" # empty # Enable caching for old pip versions (this will cache the pip upgrade) # Newer pip versions cache automatically, and don't use this variable. if [ ! "$PIP_DOWNLOAD_CACHE" ]; then export PIP_DOWNLOAD_CACHE=$HOME/.cache/pip/legacy fi install_kallithea() { local prefix=$1 local rev=$2 announce "Installing Kallithea $rev in $prefix..." "${VIRTUALENV:-virtualenv}" --quiet "$prefix-env" HG archive --rev "$rev" "$prefix" ( cd "$prefix" . "$prefix-env/bin/activate" pip install --quiet --upgrade pip setuptools mercurial $EXTRA pip install --quiet -e . ) } install_kallithea "$temp/from" "$from_rev_hash" ( cd "$temp/from" . "$temp/from-env/bin/activate" announce "Initializing database..." quiet_if_ok kallithea-cli db-create -c "$config_file" --repos="$temp/repos" --user=doe --email=doe@example.com --password=123456 --no-public-access --force-yes alembic -c "$config_file" current -v ) install_kallithea "$temp/to" "$to_rev_hash" ( cd "$temp/to" . "$temp/to-env/bin/activate" announce "Commencing database upgrade from shown Alembic revision to head..." alembic -c "$config_file" current -v alembic -c "$config_file" upgrade head announce "Upgrade complete, now at the shown Alembic revision:" alembic -c "$config_file" current -v )