Files @ 37ec17c1344c
Branch filter:

Location: kallithea/scripts/dbmigrate-test - annotation

Thomas De Schampheleire
vcs: fix repo creation with a remote clone uri under Python 3

When trying to add a new repository based on a remote clone, it fails in
Python 3 as follows, for git:

ERROR kallithea.model.validators:validators.py:413 URL validation failed
Traceback (most recent call last):
File ".../kallithea/model/validators.py", line 411, in _validate_python
is_valid_repo_uri(repo_type, url, make_ui())
File ".../kallithea/lib/utils.py", line 250, in is_valid_repo_uri
GitRepository._check_url(url)
File ".../kallithea/lib/vcs/backends/git/repository.py", line 174, in _check_url
if not test_uri.endswith('info/refs'):
TypeError: endswith first arg must be bytes or a tuple of bytes, not str

and for hg, the other way around:

ERROR kallithea.model.validators:validators.py:413 URL validation failed
Traceback (most recent call last):
File ".../kallithea/model/validators.py", line 411, in _validate_python
is_valid_repo_uri(repo_type, url, make_ui())
File ".../kallithea/lib/utils.py", line 233, in is_valid_repo_uri
MercurialRepository._check_url(url, ui)
File ".../kallithea/lib/vcs/backends/hg/repository.py", line 297, in _check_url
if os.path.isdir(url) or url.startswith(b'file:'):
TypeError: startswith first arg must be str or a tuple of str, not bytes

In both cases, the code seems to actually expect a bytes url.
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
f973b866fffc
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
3158cf0dafb7
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
51b1af58589b
#!/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
)