Files @ 5dfaa9f1fdb2
Branch filter:

Location: kallithea/scripts/dbmigrate-test - annotation

Mads Kiilerich
templates: disable special mako error handler - ironically this gives better stack traces

Errors in templates could give truncated stack traces pointing at the mako
error handler:

...
File '.../kallithea/kallithea/controllers/files.py', line 202 in index
return render('files/files.html')
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/templating.py', line 244 in render_mako
cache_type=cache_type, cache_expire=cache_expire)
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/templating.py', line 219 in cached_template
return render_func()
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/templating.py', line 241 in render_template
return literal(template.render_unicode(**globs))
File '.../kallithea-venv/lib/python2.7/site-packages/mako/template.py', line 452 in render_unicode
as_unicode=True)
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 803 in _render
**_kwargs_for_callable(callable_, data))
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 835 in _render_context
_exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 855 in _exec_template
_render_error(template, context, compat.exception_as())
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 864 in _render_error
result = template.error_handler(context, error)
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/error.py', line 22 in handle_mako_error
raise (exc, None, sys.exc_info()[2])
AttributeError: 'tuple' object has no attribute 'node'

Without the mako error handler we get a full and useful stack trace - including
calls in generated but readable .html.py files.

File '.../kallithea/kallithea/controllers/files.py', line 202 in index
return render('files/files.html')
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/templating.py', line 244 in render_mako
cache_type=cache_type, cache_expire=cache_expire)
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/templating.py', line 219 in cached_template
return render_func()
File '.../kallithea-venv/lib/python2.7/site-packages/pylons/templating.py', line 241 in render_template
return literal(template.render_unicode(**globs))
File '.../kallithea-venv/lib/python2.7/site-packages/mako/template.py', line 452 in render_unicode
as_unicode=True)
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 803 in _render
**_kwargs_for_callable(callable_, data))
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 835 in _render_context
_exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 860 in _exec_template
callable_(context, *args, **kwargs)
File '.../data/templates/base/root.html.py', line 219 in render_body
__M_writer(escape(next.body()))
File '.../data/templates/base/base.html.py', line 57 in render_body
__M_writer(escape(next.main()))
File '.../data/templates/files/files.html.py', line 121 in render_main
runtime._include_file(context, u'files_ypjax.html', _template_uri)
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 730 in _include_file
callable_(ctx, **_kwargs_for_include(callable_, context._data, **kwargs))
File '.../data/templates/files/files_ypjax.html.py', line 57 in render_body
runtime._include_file(context, u'files_source.html', _template_uri)
File '.../kallithea-venv/lib/python2.7/site-packages/mako/runtime.py', line 730 in _include_file
callable_(ctx, **_kwargs_for_include(callable_, context._data, **kwargs))
File '.../data/templates/files/files_source.html.py', line 117 in render_body
__M_writer(escape(h.pygmentize_annotation(c.repo_name,c.file,linenos=True,anchorlinenos=True,lineanchors='L',cssclass="code-highlight")))
File '.../kallithea/kallithea/lib/helpers.py', line 360 in pygmentize_annotation
return literal(markup_whitespace(annotate_highlight(filenode, url_func(repo_name), **kwargs)))
File '.../kallithea/kallithea/lib/annotate.py', line 57 in annotate_highlight
highlighted = highlight(filenode.content, lexer, formatter)
File '.../kallithea-venv/lib/python2.7/site-packages/pygments/__init__.py', line 87 in highlight
return format(lex(code, lexer), formatter, outfile)
File '.../kallithea-venv/lib/python2.7/site-packages/pygments/__init__.py', line 66 in format
formatter.format(tokens, realoutfile)
File '.../kallithea-venv/lib/python2.7/site-packages/pygments/formatter.py', line 95 in format
return self.format_unencoded(tokensource, outfile)
File '.../kallithea-venv/lib/python2.7/site-packages/pygments/formatters/html.py', line 850 in format_unencoded
for t, piece in source:
File '.../kallithea/kallithea/lib/annotate.py', line 168 in _wrap_tablelinenos
for el in self.filenode.annotate))
File '.../kallithea/kallithea/lib/annotate.py', line 167 in <genexpr>
annotate = ''.join((self.annotate_from_changeset(el[2]())
File '.../kallithea/kallithea/lib/vcs/backends/hg/changeset.py', line 273 in get_file_annotate
sha = hex(annotate_data[0].node())
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
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
#!/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\.db1\.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 paster setup-db "$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
)