set -xe
dev/prep-for-freebsd-build python3
dev/system-info
- gmake -j6 PYTHON=python3 check
+ gmake -j6 PYTHON=python3.7 check
task:
name: macos (py2)
*.swp
nbproject
/lib/cmd/bup-*
-/t/sampledata/var/
-/t/tmp/
+/test/sampledata/var/
+/test/tmp/
archive in intentionally destructive ways. Though if an attempt to
`join` or `restore` the data you still care about after a `gc`
succeeds, that's a fairly encouraging sign that the commands worked
-correctly. (The `t/compare-trees` command in the source tree can be
+correctly. (The `dev/compare-trees` command in the source tree can be
used to help test before/after results.)
# OPTIONS
archives in intentionally destructive ways. Though if an attempt to
join or restore the data you still care about succeeds after you've
run this command, then that's a fairly encouraging sign that it worked
-correctly. (The t/compare-trees command in the source tree can be
+correctly. (The dev/compare-trees command in the source tree can be
used to help test before/after results.)
# METHODS
archive in intentionally destructive ways. Though if an attempt to
`join` or `restore` the data you still care about after a
`prune-older` succeeds, that's a fairly encouraging sign that the
-commands worked correctly. (The `t/compare-trees` command in the
+commands worked correctly. (The `dev/compare-trees` command in the
source tree can be used to help test before/after results.)
# KEEP PERIODS
Testing
=======
-You can run the test suite much more quickly via "make -j test" (as
-compared to "make test"), at the expense of slightly more confusing
-output (interleaved parallel test output), and inaccurate intermediate
-success/failure counts, but the final counts displayed should be
-correct.
+Individual tests can be run via
-Individual non-Python tests can be run via "./wvtest run t/TEST" and
-if you'd like to see all of the test output, you can omit the wvtest
-run wrapper: "t/TEST"
+ ./pytest TEST
-Individual Python tests can be run via "./wvtest run ./wvtest.py
-lib/bup/t/TEST", and as above, you can see all the output by omitting
-the wvtest run wrapper like this: "./wvtest.py lib/bup/t/TEST"
+For example:
+ ./pytest test/int/test_git.py
+ ./pytest test/ext/test-ftp
+
+If you have the xdist module installed, then you can specify its `-n`
+option to run the tests in parallel (e.g. `./pytest -nauto ...`), or
+you can specify `-j` to make, which will be translated to xdist with
+`-j` becoming `-nauto` and `-jN` becoming `-nN`.
+
+Internal tests that test bup's code directly are located in test/int,
+and external tests that test bup from the outside, typically by
+running the executable, are located in test/ext.
+
+Currently, all pytests must be located in either test/ext or test/int.
+Internal test filenames must match test_*.py, and external tests must
+be located in text/ext and their filenames must match test-* (see
+test/ext/conftest.py for the handling of the latter). Any paths
+matching those criteria will be automatically collected by pytest.
+
+Some aspects of the environment are automatically restored after each
+test via fixtures in conftest.py, including the state of the
+environment variables and the working directory; the latter is reset
+to the top of the source tree.
Submitting patches
==================
$(if $(subst ok,,$(lastword $(1))),$(error $(2)),$(shell x="$(1)"; echo $${x%???}))
endef
-sampledata_rev := $(shell t/configure-sampledata --revision $(isok))
+sampledata_rev := $(shell dev/configure-sampledata --revision $(isok))
sampledata_rev := \
$(call shout,$(sampledata_rev),Could not parse sampledata revision)
-current_sampledata := t/sampledata/var/rev/v$(sampledata_rev)
+current_sampledata := test/sampledata/var/rev/v$(sampledata_rev)
os := $(shell ($(pf); uname | sed 's/[-_].*//') $(isok))
os := $(call shout,$(os),Unable to determine OS)
ifdef TMPDIR
test_tmp := $(TMPDIR)
else
- test_tmp := $(CURDIR)/t/tmp
+ test_tmp := $(CURDIR)/test/tmp
endif
initial_setup := $(shell dev/update-checkout-info lib/bup/checkout_info.py $(isok))
all: $(bup_deps) Documentation/all $(current_sampledata)
$(current_sampledata):
- t/configure-sampledata --setup
+ dev/configure-sampledata --setup
PANDOC ?= $(shell type -p pandoc)
"import glob; assert(len(glob.glob('lib/bup/build/*/_helpers*$(SOEXT)')) == 1)"
cp lib/bup/build/*/_helpers*$(SOEXT) "$@"
-t/tmp:
- mkdir t/tmp
-
-runtests: runtests-python runtests-cmdline
-
-python_tests := \
- lib/bup/t/tbloom.py \
- lib/bup/t/tclient.py \
- lib/bup/t/tcompat.py \
- lib/bup/t/tgit.py \
- lib/bup/t/thashsplit.py \
- lib/bup/t/thelpers.py \
- lib/bup/t/tindex.py \
- lib/bup/t/tmetadata.py \
- lib/bup/t/toptions.py \
- lib/bup/t/tresolve.py \
- lib/bup/t/tshquote.py \
- lib/bup/t/tvfs.py \
- lib/bup/t/tvint.py \
- lib/bup/t/txstat.py
-
-# The "pwd -P" here may not be appropriate in the long run, but we
-# need it until we settle the relevant drecurse/exclusion questions:
-# https://groups.google.com/forum/#!topic/bup-list/9ke-Mbp10Q0
-runtests-python: all t/tmp
- mkdir -p t/tmp/test-log
- $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
- ./wvtest.py $(python_tests) 2>&1 \
- | tee -a t/tmp/test-log/$$$$.log
-
-cmdline_tests := \
- t/test-help \
- t/test.sh \
- t/test-argv \
- t/test-cat-file.sh \
- t/test-command-without-init-fails.sh \
- t/test-compression.sh \
- t/test-drecurse.sh \
- t/test-fsck.sh \
- t/test-fuse.sh \
- t/test-ftp \
- t/test-web.sh \
- t/test-gc.sh \
- t/test-import-duplicity.sh \
- t/test-import-rdiff-backup.sh \
- t/test-index.sh \
- t/test-index-check-device.sh \
- t/test-index-clear.sh \
- t/test-list-idx.sh \
- t/test-ls \
- t/test-ls-remote \
- t/test-main.sh \
- t/test-meta.sh \
- t/test-on.sh \
- t/test-packsizelimit \
- t/test-prune-older \
- t/test-redundant-saves.sh \
- t/test-restore-map-owner.sh \
- t/test-restore-single-file.sh \
- t/test-rm.sh \
- t/test-rm-between-index-and-save.sh \
- t/test-save-creates-no-unrefs.sh \
- t/test-save-restore \
- t/test-save-errors \
- t/test-save-restore-excludes.sh \
- t/test-save-strip-graft.sh \
- t/test-save-with-valid-parent.sh \
- t/test-sparse-files.sh \
- t/test-split-join.sh \
- t/test-tz.sh \
- t/test-xdev.sh
-
-tmp-target-run-test-get-%: all t/tmp
- $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
- t/test-get $* 2>&1 | tee -a t/tmp/test-log/$$$$.log
-
-test_get_targets += \
- tmp-target-run-test-get-replace \
- tmp-target-run-test-get-universal \
- tmp-target-run-test-get-ff \
- tmp-target-run-test-get-append \
- tmp-target-run-test-get-pick \
- tmp-target-run-test-get-new-tag \
- tmp-target-run-test-get-unnamed
-
-# For parallel runs.
-# The "pwd -P" here may not be appropriate in the long run, but we
-# need it until we settle the relevant drecurse/exclusion questions:
-# https://groups.google.com/forum/#!topic/bup-list/9ke-Mbp10Q0
-tmp-target-run-test%: all t/tmp
- $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
- t/test$* 2>&1 | tee -a t/tmp/test-log/$$$$.log
-
-runtests-cmdline: $(test_get_targets) $(subst t/test,tmp-target-run-test,$(cmdline_tests))
+test/tmp:
+ mkdir test/tmp
+
+ifeq (yes,$(shell config/bin/python -c "import xdist; print('yes')" 2>/dev/null))
+ # MAKEFLAGS must not be in an immediate := assignment
+ parallel_opt = $(lastword $(filter -j%,$(MAKEFLAGS)))
+ get_parallel_n = $(patsubst -j%,%,$(parallel_opt))
+ maybe_specific_n = $(if $(filter -j%,$(parallel_opt)),-n$(get_parallel_n))
+ xdist_opt = $(if $(filter -j,$(parallel_opt)),-nauto,$(maybe_specific_n))
+else
+ xdist_opt =
+endif
+
+test: all test/tmp
+ ./pytest $(xdist_opt)
stupid:
PATH=/bin:/usr/bin $(MAKE) test
-test: all
- if test -e t/tmp/test-log; then rm -r t/tmp/test-log; fi
- mkdir -p t/tmp/test-log
- ./wvtest watch --no-counts \
- $(MAKE) runtests 2>t/tmp/test-log/$$$$.log
- ./wvtest report t/tmp/test-log/*.log
-
check: test
distcheck: all
- ./wvtest run t/test-release-archive.sh
+ ./pytest $(xdist_opt) -m release
long-test: export BUP_TEST_LEVEL=11
long-test: test
*.pyc */*.pyc lib/*/*.pyc lib/*/*/*.pyc \
lib/bup/checkout_info.py \
randomgen memtest \
- testfs.img lib/bup/t/testfs.img
+ testfs.img test/int/testfs.img
for x in $$(ls cmd/*-cmd.py cmd/*-cmd.sh | grep -vF python-cmd.sh | cut -b 5-); do \
echo "cmd/bup-$${x%-cmd.*}"; \
done | xargs -t rm -f
- if test -e t/mnt; then t/cleanup-mounts-under t/mnt; fi
- if test -e t/mnt; then rm -r t/mnt; fi
- if test -e t/tmp; then t/cleanup-mounts-under t/tmp; fi
- # FIXME: migrate these to t/mnt/
- if test -e lib/bup/t/testfs; \
- then umount lib/bup/t/testfs || true; fi
- rm -rf *.tmp *.tmp.meta t/*.tmp lib/*/*/*.tmp build lib/bup/build lib/bup/t/testfs
- if test -e t/tmp; then t/force-delete t/tmp; fi
- t/configure-sampledata --clean
+ if test -e test/mnt; then dev/cleanup-mounts-under test/mnt; fi
+ if test -e test/mnt; then rm -r test/mnt; fi
+ if test -e test/tmp; then dev/cleanup-mounts-under test/tmp; fi
+ # FIXME: migrate these to test/mnt/
+ if test -e test/int/testfs; \
+ then umount test/int/testfs || true; fi
+ rm -rf *.tmp *.tmp.meta test/*.tmp lib/*/*/*.tmp build lib/bup/build test/int/testfs
+ if test -e test/tmp; then dev/force-delete test/tmp; fi
+ dev/configure-sampledata --clean
# Remove last so that cleanup tools can depend on it
rm -rf config/bin
apt-get install python-pyxattr
apt-get install pkg-config linux-libc-dev libacl1-dev
apt-get install acl attr
+ apt-get isntall python-pytest-xdist # optional (parallel tests)
apt-get install libreadline-dev # optional (bup ftp)
apt-get install python-tornado # optional (bup web)
```
make check
```
+ If you have the Python xdist module installed, then you can
+ probably run the tests faster by adding the make -j option (see <a
+ href="HACKING">./HACKING</a> for additional information):
+
+ ```sh
+ make -j check
+ ```
+
The tests should pass. If they don't pass for you, stop here and
send an email to bup-list@googlegroups.com. Though if there are
symbolic links along the current working directory path, the tests
cycle and error out, so "ls -R" and "find" will not work.
- There is no support for ACLs. If/when some enterprising person
- fixes this, adjust t/compare-trees.
+ fixes this, adjust dev/compare-trees.
Notes on Cygwin
---------------
- There is no support for ACLs. If/when some enterprising person
- fixes this, adjust t/compare-trees.
+ fixes this, adjust dev/compare-trees.
- - In t/test.sh, two tests have been disabled. These tests check to
- see that repeated saves produce identical trees and that an
- intervening index doesn't change the SHA1. Apparently Cygwin has
- some unusual behaviors with respect to access times (that probably
- warrant further investigation). Possibly related:
+ - In test/ext/test-misc, two tests have been disabled. These tests
+ check to see that repeated saves produce identical trees and that
+ an intervening index doesn't change the SHA1. Apparently Cygwin
+ has some unusual behaviors with respect to access times (that
+ probably warrant further investigation). Possibly related:
http://cygwin.com/ml/cygwin/2007-06/msg00436.html
-------------
- There is no support for ACLs. If/when some enterprising person
- fixes this, adjust t/compare-trees.
+ fixes this, adjust dev/compare-trees.
How it works
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-from collections import namedtuple
-from contextlib import contextmanager
-from os.path import abspath, basename, dirname, realpath
-from pipes import quote
-from subprocess import PIPE, Popen
-from traceback import extract_stack
-import errno, os, subprocess, sys, tempfile
-
-from wvtest import WVPASSEQ, wvfailure_count
-
-from bup import helpers
-from bup.compat import fsencode, str_type
-from bup.io import byte_stream
-
-
-@contextmanager
-def no_lingering_errors():
- def fail_if_errors():
- if helpers.saved_errors:
- bt = extract_stack()
- src_file, src_line, src_func, src_txt = bt[-4]
- msg = 'saved_errors ' + repr(helpers.saved_errors)
- print('! %-70s %s' % ('%s:%-4d %s' % (basename(src_file),
- src_line,
- msg),
- 'FAILED'))
- sys.stdout.flush()
- fail_if_errors()
- helpers.clear_errors()
- yield
- fail_if_errors()
- helpers.clear_errors()
-
-
-# Assumes (of course) this file is at the top-level of the source tree
-_bup_tmp = realpath(dirname(fsencode(__file__))) + b'/t/tmp'
-try:
- os.makedirs(_bup_tmp)
-except OSError as e:
- if e.errno != errno.EEXIST:
- raise
-
-
-@contextmanager
-def test_tempdir(prefix):
- initial_failures = wvfailure_count()
- tmpdir = tempfile.mkdtemp(dir=_bup_tmp, prefix=prefix)
- yield tmpdir
- if wvfailure_count() == initial_failures:
- subprocess.call(['chmod', '-R', 'u+rwX', tmpdir])
- subprocess.call(['rm', '-rf', tmpdir])
-
-
-ex_res = namedtuple('SubprocResult', ['out', 'err', 'proc', 'rc'])
-
-def run(cmd, check=True, input=None, **kwargs):
- """Run a subprocess as per subprocess.Popen(cmd, **kwargs) followed by
- communicate(input=input). If check is true, then throw an
- exception if the subprocess exits with non-zero status. Return a
- SubprocResult tuple.
-
- """
- if input:
- assert 'stdin' not in kwargs
- kwargs['stdin'] = PIPE
- p = Popen(cmd, **kwargs)
- out, err = p.communicate(input=input)
- if check and p.returncode != 0:
- raise Exception('subprocess %r failed with status %d%s'
- % (cmd, p.returncode,
- (', stderr: %r' % err) if err else ''))
- return ex_res(out=out, err=err, proc=p, rc=p.returncode)
-
-def logcmd(cmd):
- s = helpers.shstr(cmd)
- if isinstance(cmd, str_type):
- print(s, file=sys.stderr)
- else:
- # bytes - for now just escape it
- print(s.decode(errors='backslashreplace'), file=sys.stderr)
-
-def ex(cmd, **kwargs):
- """Print cmd to stderr and then run it as per ex(...).
- Print the subprocess stderr to stderr if stderr=PIPE and there's
- any data.
- """
- logcmd(cmd)
- result = run(cmd, **kwargs)
- if result.err:
- sys.stderr.flush()
- byte_stream(sys.stderr).write(result.err)
- return result
-
-def exo(cmd, **kwargs):
- """Print cmd to stderr and then run it as per ex(..., stdout=PIPE).
- Print the subprocess stderr to stderr if stderr=PIPE and there's
- any data.
-
- """
- assert 'stdout' not in kwargs
- kwargs['stdout'] = PIPE
- return ex(cmd, **kwargs)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from os.path import basename, dirname, realpath, relpath
+from time import tzset
+from traceback import extract_stack
+import errno
+import os
+import pytest
+import re
+import subprocess
+import sys
+import tempfile
+
+sys.path[:0] = ['lib']
+
+from bup import helpers
+from bup.compat import environ, fsencode
+
+
+_bup_src_top = realpath(dirname(fsencode(__file__)))
+
+# The "pwd -P" here may not be appropriate in the long run, but we
+# need it until we settle the relevant drecurse/exclusion questions:
+# https://groups.google.com/forum/#!topic/bup-list/9ke-Mbp10Q0
+os.chdir(realpath(os.getcwd()))
+
+# Make the test results available to fixtures
+@pytest.hookimpl(tryfirst=True, hookwrapper=True)
+def pytest_runtest_makereport(item, call):
+ other_hooks = yield
+ report = other_hooks.get_result()
+ bup = item.__dict__.setdefault('bup', {})
+ bup[report.when + '-report'] = report # setup, call, teardown
+ item.bup = bup
+
+def bup_test_sort_order(item):
+ # Pull some slower tests forward to speed parallel runs
+ if item.fspath.basename in ('test_get.py', 'test-index.sh'):
+ return (0, str(item.fspath))
+ return (1, str(item.fspath))
+
+def pytest_collection_modifyitems(session, config, items):
+ items.sort(key=bup_test_sort_order)
+
+@pytest.fixture(autouse=True)
+def no_lingering_errors():
+ def fail_if_errors():
+ if helpers.saved_errors:
+ bt = extract_stack()
+ src_file, src_line, src_func, src_txt = bt[-4]
+ msg = 'saved_errors ' + repr(helpers.saved_errors)
+ assert False, '%s:%-4d %s' % (basename(src_file),
+ src_line, msg)
+
+ fail_if_errors()
+ helpers.clear_errors()
+ yield None
+ fail_if_errors()
+ helpers.clear_errors()
+
+@pytest.fixture(autouse=True)
+def ephemeral_env_changes():
+ orig_env = environ.copy()
+ yield None
+ for k, orig_v in orig_env.items():
+ v = environ.get(k)
+ if v is not orig_v:
+ environ[k] = orig_v
+ if k == b'TZ':
+ tzset()
+ for k in environ.keys():
+ if k not in orig_env:
+ del environ[k]
+ if k == b'TZ':
+ tzset()
+ os.chdir(_bup_src_top)
+
+# Assumes (of course) this file is at the top-level of the source tree
+_bup_test_dir = realpath(dirname(fsencode(__file__))) + b'/test'
+_bup_tmp = _bup_test_dir + b'/tmp'
+try:
+ os.makedirs(_bup_tmp)
+except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+
+_safe_path_rx = re.compile(br'[^a-zA-Z0-9_-]')
+
+@pytest.fixture()
+def tmpdir(request):
+ if sys.version_info[0] > 2:
+ rp = realpath(fsencode(request.fspath))
+ else:
+ rp = realpath(str(request.fspath))
+ rp = relpath(rp, _bup_test_dir)
+ if request.function:
+ rp += b'-' + fsencode(request.function.__name__)
+ safe = _safe_path_rx.sub(b'-', rp)
+ tmpdir = tempfile.mkdtemp(dir=_bup_tmp, prefix=safe)
+ yield tmpdir
+ if request.node.bup['call-report'].failed:
+ print('\nPreserving:', b'test/' + relpath(tmpdir, _bup_test_dir),
+ file=sys.stderr)
+ else:
+ subprocess.call(['chmod', '-R', 'u+rwX', tmpdir])
+ subprocess.call(['rm', '-rf', tmpdir])
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+
+from sys import stderr
+import os.path, re, subprocess, sys
+
+def mntent_unescape(x):
+ def replacement(m):
+ unescapes = {
+ "\\\\" : "\\",
+ "\\011" : "\t",
+ "\\012" : "\n",
+ "\\040" : " "
+ }
+ return unescapes.get(m.group(0))
+ return re.sub(r'(\\\\|\\011|\\012|\\040)', replacement, x)
+
+targets = sys.argv[1:]
+
+if not os.path.exists('/proc/mounts'):
+ print >> stderr, 'No /proc/mounts; skipping mount cleanup in', repr(targets)
+ sys.exit(0)
+
+exit_status = 0
+for target in targets:
+ if not os.path.isdir(target):
+ print >> stderr, repr(target), 'is not a directory'
+ exit_status = 1
+ continue
+ top = os.path.realpath(target)
+ proc_mounts = open('/proc/mounts', 'r')
+ for line in proc_mounts:
+ _, point, fstype, _ = line.split(' ', 3)
+ point = mntent_unescape(point)
+ if top == point or os.path.commonprefix((top + '/', point)) == top + '/':
+ if fstype.startswith('fuse'):
+ if subprocess.call(['fusermount', '-uz', point]) != 0:
+ exit_status = 1
+ else:
+ if subprocess.call(['umount', '-l', point]) != 0:
+ exit_status = 1
+
+sys.exit(exit_status)
--- /dev/null
+#!/usr/bin/env bash
+
+set -u
+
+# Test that src and dest trees are as identical as bup is capable of
+# making them. For now, use rsync -niaHAX ...
+
+usage() {
+cat <<EOF
+Usage: compare-trees [-h] [-c] [-x] SOURCE DEST
+OPTIONS:
+ -h
+ Display help
+ -c
+ Check file content (default)
+ -x
+ Don't check file content (rely on size/timestamps, etc.)
+EOF
+}
+
+verify_content=" --checksum"
+
+while getopts "hcx" OPTION
+do
+ case "$OPTION" in
+ h) usage; exit 0;;
+ c) verify_content=" --checksum";;
+ x) verify_content="";;
+ ?) usage 1>&2; exit 1;;
+ esac
+done
+
+shift $(($OPTIND - 1)) || exit $?
+
+if ! test $# -eq 2
+then
+ usage 1>&2
+ exit 1
+fi
+
+src="$1"
+dest="$2"
+
+tmpfile="$(mktemp /tmp/bup-test-XXXXXXX)" || exit $?
+trap "rm -rf '$tmpfile'" EXIT || exit $?
+
+rsync_opts="-niaH$verify_content --delete"
+
+rsync_version=$(rsync --version)
+if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
+ echo "Not comparing ACLs (not supported by available rsync)" 1>&2
+else
+ case $OSTYPE in
+ cygwin|darwin|netbsd)
+ echo "Not comparing ACLs (not yet supported on $OSTYPE)" 1>&2
+ ;;
+ *)
+ rsync_opts="$rsync_opts -A"
+ ;;
+ esac
+fi
+
+xattrs_available=''
+if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
+ echo "Not comparing xattrs (not supported by available rsync)" 1>&2
+else
+ xattrs_available=yes
+fi
+
+# Even in dry-run mode, rsync may fail if -X is specified and the
+# filesystems don't support xattrs.
+
+if test "$xattrs_available"; then
+ rsync $rsync_opts -X "$src" "$dest" > "$tmpfile"
+ if test $? -ne 0; then
+ # Try again without -X
+ rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
+ fi
+else
+ rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
+fi
+
+if test $(wc -l < "$tmpfile") != 0; then
+ echo "Differences between $src and $dest" 1>&2
+ cat "$tmpfile"
+ exit 1
+fi
+
+exit 0
--- /dev/null
+#!/usr/bin/env bash
+
+set -o pipefail
+
+# NOTE: any relevant changes to var/ must be accompanied by an
+# increment to the revision.
+
+revision=3
+
+top="$(pwd)" || exit $?
+
+usage()
+{
+ echo 'Usage: dev/configure-sampledata [--setup | --clean | --revision]'
+}
+
+if test "$#" -ne 1; then
+ usage 1>&2; exit 1
+fi
+
+rm_symlinks()
+{
+ for p in "$@"; do
+ # test -e is false for dangling symlinks.
+ if test -h "$p" -o -e "$p"; then rm "$p" || exit $?; fi
+ done
+}
+
+clean()
+(
+ cd test/sampledata || exit $?
+ if test -e var; then rm -r var || exit $?; fi
+ # Remove legacy content (before everything moved to var/).
+ rm_symlinks abs-symlink b c etc
+)
+
+case "$1" in
+ --setup)
+ (
+ clean
+ mkdir -p test/sampledata/var/rev || exit $?
+ cd test/sampledata/var || exit $?
+ ln -sf a b || exit $?
+ ln -sf b c || exit $?
+ ln -sf "$(pwd)/abs-symlink-target" abs-symlink || exit $?
+ mkfifo fifo
+ mkdir -p cmd doc lib/bup || exit $?
+ cp -pP "$top"/cmd/*.py cmd/ || exit $?
+ cp -pP "$top"/Documentation/*.md doc/ || exit $?
+ cp -pP "$top"/lib/bup/*.py lib/bup || exit $?
+ mkdir path-zoo || exit $?
+ if test "$BUP_TEST_RANDOMIZED_SAMPLEDATA_PATHS"; then
+ "$top"/dev/make-random-paths 3000 path-zoo || exit $?
+ fi
+ # The "v" ensures that if "configure-sampledata
+ # --revision" and/or the setup above fails somehow,
+ # callers like make will be looking for a file that won't
+ # exist.
+ touch rev/v$revision || exit $?
+ ) || exit $?
+ ;;
+ --clean)
+ clean
+ ;;
+ --revision)
+ echo "$revision" || exit $?
+ ;;
+ *)
+ usage 1>&2; exit 1
+ ;;
+esac
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import getsize, isdir
+from sys import argv, stderr
+import os
+
+def listdir_failure(ex):
+ raise ex
+
+def usage():
+ print('Usage: data-size PATH ...', file=sys.stderr)
+
+total = 0
+for path in argv[1:]:
+ if isdir(path):
+ for root, dirs, files in os.walk(path, onerror=listdir_failure):
+ total += sum(getsize(os.path.join(root, name)) for name in files)
+ else:
+ total += getsize(path)
+
+print(total)
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+ export "BUP_ARGV_${arg_i}"="$arg"
+ shift
+ arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import abspath, dirname
+from sys import stdout
+import os, sys
+
+script_home = abspath(dirname(__file__))
+sys.path[:0] = [abspath(script_home + '/../../lib'), abspath(script_home + '/../..')]
+
+from bup import compat
+
+for arg in compat.argvb:
+ os.write(stdout.fileno(), arg)
+ os.write(stdout.fileno(), b'\0\n')
+ stdout.flush()
--- /dev/null
+#!/usr/bin/env bash
+
+set -o pipefail
+
+# Try *hard* to delete $@. Among other things, some systems have
+# r-xr-xr-x for root and other system dirs.
+
+rc=0
+rm -rf "$@" # Maybe we'll get lucky.
+for f in "$@"; do
+ test -e "$f" || continue
+ if test "$(type -p setfacl)"; then
+ setfacl -Rb "$f"
+ fi
+ if test "$(type -p chattr)"; then
+ chattr -R -aisu "$f"
+ fi
+ chmod -R u+rwX "$f"
+ rm -r "$f"
+ if test -e "$f"; then
+ rc=1
+ find "$f" -ls
+ lsattr -aR "$f"
+ getfacl -R "$f"
+ fi
+done
+
+if test "$rc" -ne 0; then
+ echo "Failed to delete everything" 1>&2
+fi
+
+exit "$rc"
--- /dev/null
+#!/usr/bin/env bash
+
+# Recursively dump all blobs in the subtree identified by ID.
+
+set -o pipefail
+
+usage() {
+cat <<EOF
+Usage: cat-git-tree [--git-dir DIR] ID
+EOF
+}
+
+cat-item()
+{
+ local hash="$1"
+ local type="$2"
+ case "$type" in
+ blob)
+ git cat-file blob "$hash" || exit $?
+ ;;
+ tree)
+ local tree=$(git ls-tree "$hash") || exit $?
+ while read -r line; do
+ local sub_type=$(echo "$line" | cut -d' ' -f 2) || exit $?
+ local sub_hash=$(echo "$line" | cut -d' ' -f 3) || exit $?
+ sub_hash=$(echo "$sub_hash" | cut -d' ' -f 1) || exit $?
+ cat-item "$sub_hash" "$sub_type"
+ done <<< "$tree"
+ ;;
+ *)
+ echo "Unexpected item: $type $hash" 1>&2
+ exit 1
+ ;;
+ esac
+}
+
+case $# in
+ 1) ;;
+ 3)
+ if test "$1" != --git-dir; then
+ usage 1>&2
+ exit 1
+ fi
+ export GIT_DIR="$2"
+ shift 2
+ ;;
+ *)
+ usage 1>&2
+ exit 1
+ ;;
+esac
+
+top="$1"
+type=$(git cat-file -t "$top") || exit $?
+cat-item "$top" "$type"
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+ export "BUP_ARGV_${arg_i}"="$arg"
+ shift
+ arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import os, stat, sys
+
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
+
+from bup import compat
+from bup.io import byte_stream
+
+
+# Print the full paths of all the files in each hardlink set
+# underneath one of the paths. Separate sets with a blank line, sort
+# the paths within each set, and sort the sets by their first path.
+
+def usage():
+ print("Usage: hardlink-sets <paths ...>", file=sys.stderr)
+
+if len(compat.argv) < 2:
+ usage()
+ sys.exit(1)
+
+def on_walk_error(e):
+ raise e
+
+sys.stdout.flush()
+out = byte_stream(sys.stdout)
+
+hardlink_set = {}
+
+for p in compat.argvb[1:]:
+ for root, dirs, files in os.walk(p, onerror = on_walk_error):
+ for filename in files:
+ full_path = os.path.join(root, filename)
+ st = os.lstat(full_path)
+ if not stat.S_ISDIR(st.st_mode):
+ node = b'%d:%d' % (st.st_dev, st.st_ino)
+ link_paths = hardlink_set.get(node)
+ if link_paths:
+ link_paths.append(full_path)
+ else:
+ hardlink_set[node] = [full_path]
+
+# Sort the link sets.
+for node, link_paths in hardlink_set.items():
+ link_paths.sort()
+
+first_set = True
+for link_paths in sorted(hardlink_set.values(), key = lambda x : x[0]):
+ if len(link_paths) > 1:
+ if first_set:
+ first_set = False
+ else:
+ out.write(b'\n')
+ for p in sorted(link_paths):
+ out.write(p + b'\n')
+
+sys.exit(0)
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+# Note: this currently relies on bup-python to handle arbitrary binary
+# user/group names.
+
+from __future__ import absolute_import, print_function
+
+import grp
+import pwd
+import sys
+
+def usage():
+ print('Usage: id-other-than <--user|--group> ID [ID ...]',
+ file=sys.stderr)
+
+if len(sys.argv) < 2:
+ usage()
+ sys.exit(1)
+
+def is_integer(x):
+ try:
+ int(x)
+ return True
+ except ValueError as e:
+ return False
+
+excluded_ids = set(int(x) for x in sys.argv[2:] if is_integer(x))
+excluded_names = (x for x in sys.argv[2:] if not is_integer(x))
+
+if sys.argv[1] == '--user':
+ for x in excluded_names:
+ excluded_ids.add(pwd.getpwnam(x).pw_uid)
+ for x in pwd.getpwall():
+ if x.pw_uid not in excluded_ids:
+ print(x.pw_name + ':' + str(x.pw_uid))
+ sys.exit(0)
+elif sys.argv[1] == '--group':
+ for x in excluded_names:
+ excluded_ids.add(grp.getgrnam(x).gr_gid)
+ for x in grp.getgrall():
+ if x.gr_gid not in excluded_ids:
+ print(x.gr_name + ':' + str(x.gr_gid))
+ sys.exit(0)
+else:
+ usage()
+ sys.exit(1)
--- /dev/null
+# Assumes shell is Bash, and pipefail is set.
+
+# Assumes this is always loaded while pwd is still the source tree root
+bup_dev_lib_top=$(pwd) || exit $?
+
+bup-cfg-py() { "$bup_dev_lib_top/config/bin/python" "$@"; }
+bup-python() { "$bup_dev_lib_top/dev/bup-python" "$@"; }
+
+force-delete()
+{
+ "$bup_dev_lib_top/dev/force-delete" "$@"
+}
+
+resolve-parent()
+{
+ test "$#" -eq 1 || return $?
+ echo "$1" | \
+ bup-python \
+ -c "import sys, bup.helpers; print(bup.helpers.resolve_parent(sys.stdin.readline()))" \
+ || return $?
+}
+
+current-filesystem()
+{
+ local kernel="$(uname -s)" || return $?
+ case "$kernel" in
+ NetBSD)
+ df -G . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
+ ;;
+ SunOS)
+ df -g . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
+ ;;
+ *)
+ df -T . | awk 'END{print $2}'
+ esac
+}
+
+path-filesystems()
+(
+ # Return filesystem for each dir from $1 to /.
+ # Perhaps for /foo/bar, "ext4\next4\nbtrfs\n".
+ test "$#" -eq 1 || exit $?
+ cd "$1" || exit $?
+ current-filesystem || exit $?
+ dir="$(pwd)" || exit $?
+ while test "$dir" != /; do
+ cd .. || exit $?
+ dir="$(pwd)" || exit $?
+ current-filesystem || exit $?
+ done
+ exit 0
+)
+
+escape-erx()
+{
+ sed 's/[][\.|$(){?+*^]/\\&/g' <<< "$*"
+}
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")//bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import abspath, dirname
+from random import randint
+from sys import argv, exit, stderr, stdout
+import errno, re, sys
+
+from bup.compat import fsencode, range
+
+
+def usage(out=stdout):
+ print('Usage:', argv[0], 'NUM', 'DEST_DIR', file=out)
+
+def misuse():
+ usage(stderr)
+ exit(2)
+
+if sys.version_info[0] >= 3:
+ def bytes_from_ints(ints):
+ return bytes(ints)
+else:
+ def bytes_from_ints(ints):
+ return ''.join([chr(x) for x in ints])
+
+invalid_fragments = re.compile(br'(\x00|[./]|\.\.)')
+
+def random_filename():
+ n = randint(1, 32)
+ def random_candidate():
+ return invalid_fragments.sub(b'', bytes_from_ints([randint(1, 255)
+ for x in range(n)]))
+ candidate = random_candidate()
+ while not candidate:
+ candidate = random_candidate()
+ return candidate
+
+if len(argv) != 3:
+ misuse()
+
+count, dest = argv[1:]
+count = int(count)
+
+i = 0
+while i < count:
+ with open(fsencode(dest) + b'/' + random_filename(), 'w') as _:
+ i += 1
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import
+
+import socket, sys
+
+s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
+s.bind(sys.argv[1])
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+ export "BUP_ARGV_${arg_i}"="$arg"
+ shift
+ arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import absolute_import
+import os.path, sys
+
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../../lib']
+
+from bup.compat import argv_bytes
+from bup.helpers import handle_ctrl_c, saved_errors
+from bup.io import byte_stream
+from bup import compat, metadata, options
+import bup.xstat as xstat
+
+
+optspec = """
+ns-timestamp-resolutions TEST_FILE_NAME
+--
+"""
+
+handle_ctrl_c()
+
+o = options.Options(optspec)
+opt, flags, extra = o.parse(compat.argv[1:])
+
+sys.stdout.flush()
+out = byte_stream(sys.stdout)
+
+if len(extra) != 1:
+ o.fatal('must specify a test file name')
+
+target = argv_bytes(extra[0])
+
+open(target, 'w').close()
+xstat.utime(target, (123456789, 123456789))
+meta = metadata.from_path(target)
+
+def ns_resolution(x):
+ n = 1;
+ while n < 10**9 and x % 10 == 0:
+ x /= 10
+ n *= 10
+ return n
+
+out.write(b'%d %d\n' % (ns_resolution(meta.atime),
+ ns_resolution(meta.mtime)))
+
+if saved_errors:
+ log('warning: %d errors encountered\n' % len(saved_errors))
+ sys.exit(1)
--- /dev/null
+#!/usr/bin/env bash
+
+set -ueo pipefail
+
+if test $# -lt 1; then
+ echo "Usage: perf-glance SRC_DATA_PATH..." 1>&2
+ exit 1
+fi
+set -x
+src_data=("$@")
+
+top="$(pwd)"
+script_name="$(basename $0)"
+
+mkdir -p "$top/test/tmp"
+tmpdir="$(mktemp -d "$top/test/tmp/$script_name-XXXXXXX")"
+
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+ "$top/bup" "$@"
+}
+
+get-time()
+{
+ python -c 'import time; print(time.time())'
+}
+
+rm -rf "$BUP_DIR"
+
+all_start="$(get-time)"
+
+init_start="$(get-time)"
+bup init
+init_finish="$(get-time)"
+
+index_start="$(get-time)"
+bup index "${src_data[@]}"
+index_finish="$(get-time)"
+
+save_start="$(get-time)"
+bup save -t -n data "${src_data[@]}"
+save_finish="$(get-time)"
+
+mkdir "$tmpdir/restore"
+restore_start="$(get-time)"
+bup restore -C "$tmpdir/restore" "/data/latest/"
+restore_finish="$(get-time)"
+
+all_finish="$(get-time)"
+
+set +x
+cat <<EOS
+
+init: $(python -c "print($init_finish - $init_start)")
+index: $(python -c "print($index_finish - $index_start)")
+save: $(python -c "print($save_finish - $save_start)")
+restore: $(python -c "print($restore_finish - $restore_start)")
+all: $(python -c "print($all_finish - $all_start)")
+EOS
+
+cd "$top"
+rm -r "$tmpdir"
apt-get install -y \
$common_debs \
python2.7-dev python-fuse \
- python-"$xattr" python-tornado
+ python-"$xattr" python-tornado python-pytest \
+ python-pytest-xdist
;;
python3)
apt-get install -y \
$common_debs \
python3-dev python3-distutils python3-fuse \
- python3-"$xattr" python3-tornado
+ python3-"$xattr" python3-tornado python3-pytest \
+ python3-pytest-xdist
;;
*)
usage 1>&2
echo "Usage: prep-for-freebsd-build [python2|python3]"
}
-common_pkgs='gmake git bash rsync curl par2cmdline readline duplicity'
-common_pkgs="$common_pkgs rsnapshot"
-
pyver="${1:-python2}"
# Install build deps
# https://reviews.freebsd.org/D24816
pkg install rdiff-backup || true
+pkgs='gmake git bash rsync curl par2cmdline readline duplicity'
+pkgs="$pkgs rsnapshot"
+
case "$pyver" in
python2)
- pkg install $common_pkgs python2 py27-tornado
+ pkgs="$pkgs python2 py27-tornado py27-pip"
+ pkg install $pkgs
+ pip-2.7 install --user pytest pytest-xdist
;;
python3)
- pkg install $common_pkgs python3 py37-tornado
+ pkgs="$pkgs python37 py37-tornado py37-pytest py37-pytest-xdist"
+ pkg install $pkgs
;;
*)
usage 1>&2
# "brew unlink readline" will undo this hack
case "$pyver" in
- python2) ;;
- python3) brew install python ;;
+ python2)
+ easy_install-2.7 --user pip
+ /Users/anka/Library/Python/2.7/bin/pip install --user pytest pytest-xdist
+ ;;
+ python3)
+ brew install python
+ easy_install --user pip
+ pip3 install --user pytest pytest-xdist
+ ;;
*)
usage 1>&2
exit 2
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import os, sys
+
+if sys.platform.startswith('cygwin'):
+ groups = os.getgroups()
+ if 544 in groups or 0 in groups:
+ print('root')
+ else:
+ print('none')
+else:
+ if os.environ.get('FAKEROOTKEY'):
+ print('fake')
+ else:
+ if os.geteuid() == 0:
+ print('root')
+ else:
+ print('none')
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+
+from __future__ import absolute_import, print_function
+from random import randint
+from sys import stderr, stdout
+import os, sys
+
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
+
+from bup.io import byte_stream
+
+def smaller_region(max_offset):
+ start = randint(0, max_offset)
+ return (start, min(max_offset, randint(start + 1, start + 5)))
+
+
+def possibly_larger_region(max_offset, min_sparse_len):
+ start = randint(0, max_offset)
+ return (start, min(max_offset, randint(start + 1,
+ start + 3 * min_sparse_len)))
+
+
+def initial_region(max_offset, min_sparse_len):
+ start = 0
+ return (start, min(max_offset, randint(start + 1,
+ start + 3 * min_sparse_len)))
+
+
+def final_region(max_offset, min_sparse_len):
+ start = max(0, randint(max_offset - 3 * min_sparse_len,
+ max_offset - 1))
+ return (start, max_offset)
+
+
+def region_around_min_len(max_offset, min_sparse_len):
+ start = randint(0, max_offset)
+ return (start, min(max_offset, randint(start + min_sparse_len - 5,
+ start + min_sparse_len + 5)))
+
+
+generators = []
+
+def random_region():
+ global generators
+ return generators[randint(0, len(generators) - 1)]()
+
+if len(sys.argv) == 0:
+ stdout.flush()
+ out = byte_stream(stdout)
+if len(sys.argv) == 2:
+ out = open(sys.argv[1], 'wb')
+else:
+ print('Usage: sparse-test-data [FILE]', file=stderr)
+ sys.exit(2)
+
+bup_read_size = 2 ** 16
+bup_min_sparse_len = 512
+out_size = randint(0, bup_read_size * 10)
+
+generators = (lambda : smaller_region(out_size),
+ lambda : possibly_larger_region(out_size, bup_min_sparse_len),
+ lambda : initial_region(out_size, bup_min_sparse_len),
+ lambda : final_region(out_size, bup_min_sparse_len),
+ lambda : region_around_min_len(out_size, bup_min_sparse_len))
+
+sparse = []
+sparse.append(random_region())
+sparse.append(random_region())
+
+# Handle overlaps
+if sparse[1][0] < sparse[0][0]:
+ sparse[0], sparse[1] = sparse[1], sparse[0]
+
+sparse_offsets = []
+sparse_offsets.append(sparse[0][0])
+if sparse[1][0] <= sparse[0][1]:
+ sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
+else:
+ sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
+
+if sparse[1][1] != out_size:
+ sparse_offsets.append(out_size)
+
+# Now sparse_offsets indicates where to start/stop zero runs
+data = b'x'
+pos = 0
+print('offsets:', sparse_offsets, file=stderr)
+for offset in sparse_offsets:
+ count = offset - pos
+ print('write:', 'x' if data == 'x' else '0', count, file=stderr)
+ out.write(data * (offset - pos))
+ pos += count
+ data = b'\0' if data == b'x' else b'x'
+
+out.close()
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import os.path, sys
+
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
+
+from bup.compat import argv_bytes
+from bup.helpers import handle_ctrl_c, readpipe
+from bup.io import byte_stream
+from bup import options
+
+
+optspec = """
+subtree-hash ROOT_HASH [PATH_ITEM...]
+--
+"""
+
+handle_ctrl_c()
+
+o = options.Options(optspec)
+(opt, flags, extra) = o.parse(sys.argv[1:])
+
+if len(extra) < 1:
+ o.fatal('must specify a root hash')
+
+tree_hash = argv_bytes(extra[0])
+path = [argv_bytes(x) for x in extra[1:]]
+
+while path:
+ target_name = path[0]
+ subtree_items = readpipe([b'git', b'ls-tree', b'-z', tree_hash])
+ target_hash = None
+ for entry in subtree_items.split(b'\0'):
+ if not entry:
+ break
+ info, name = entry.split(b'\t', 1)
+ if name == target_name:
+ _, _, target_hash = info.split(b' ')
+ break
+ if not target_hash:
+ print("Can't find %r in %s" % (target_name, tree_hash.decode('ascii')),
+ file=sys.stderr)
+ break
+ tree_hash = target_hash
+ path = path[1:]
+
+if path:
+ sys.exit(1)
+
+sys.stdout.flush()
+out = byte_stream(sys.stdout)
+out.write(tree_hash + b'\n')
--- /dev/null
+#!/usr/bin/env bash
+
+set -u
+
+usage() {
+cat <<EOF
+Usage: sync-tree [-h] [-c] [-x] SOURCE/ DEST/
+ Make the DEST tree match SOURCE as closely as possible
+OPTIONS:
+ -h
+ Display help
+EOF
+}
+
+while getopts "h" OPTION
+do
+ case "$OPTION" in
+ h) usage; exit 0;;
+ ?) usage 1>&2; exit 1;;
+ esac
+done
+
+shift $(($OPTIND - 1)) || exit $?
+
+if ! test $# -eq 2
+then
+ usage 1>&2
+ exit 1
+fi
+
+src="$1"
+dest="$2"
+
+rsync_opts="-aH --delete"
+
+rsync_version=$(rsync --version)
+if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
+ echo "Not syncing ACLs (not supported by available rsync)" 1>&2
+else
+ case $OSTYPE in
+ cygwin|darwin|netbsd)
+ echo "Not syncing ACLs (not yet supported on $OSTYPE)" 1>&2
+ ;;
+ *)
+ rsync_opts="$rsync_opts -A"
+ ;;
+ esac
+fi
+
+xattrs_available=''
+if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
+ echo "Not syncing xattrs (not supported by available rsync)" 1>&2
+else
+ xattrs_available=yes
+fi
+
+
+# rsync may fail if -X is specified and the filesystems don't support
+# xattrs.
+
+if test "$xattrs_available"; then
+ rsync $rsync_opts -X "$src" "$dest"
+ if test $? -ne 0; then
+ # Try again without -X
+ exec rsync $rsync_opts "$src" "$dest"
+ fi
+else
+ exec rsync $rsync_opts "$src" "$dest"
+fi
--- /dev/null
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+import grp
+import pwd
+import sys
+
+def usage():
+ print("Usage: unknown-owner (--user | --group)", file=sys.stderr)
+
+if len(sys.argv) != 2:
+ usage()
+ sys.exit(1)
+
+if sys.argv[1] == '--user':
+ max_name_len = max([len(x.pw_name) for x in pwd.getpwall()])
+elif sys.argv[1] == '--group':
+ max_name_len = max([len(x.gr_name) for x in grp.getgrall()])
+else:
+ usage()
+ sys.exit(1)
+
+print('x' * (max_name_len + 1))
+++ /dev/null
-
-from __future__ import absolute_import
-import sys
-
-sys.path[:0] = ['../..']
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-import errno, platform, tempfile
-
-from wvtest import *
-
-from bup import bloom
-from bup.helpers import mkdirp
-from buptest import no_lingering_errors, test_tempdir
-
-
-@wvtest
-def test_bloom():
- with no_lingering_errors():
- with test_tempdir(b'bup-tbloom-') as tmpdir:
- hashes = [os.urandom(20) for i in range(100)]
- class Idx:
- pass
- ix = Idx()
- ix.name = b'dummy.idx'
- ix.shatable = b''.join(hashes)
- for k in (4, 5):
- b = bloom.create(tmpdir + b'/pybuptest.bloom', expected=100, k=k)
- b.add_idx(ix)
- WVPASSLT(b.pfalse_positive(), .1)
- b.close()
- b = bloom.ShaBloom(tmpdir + b'/pybuptest.bloom')
- all_present = True
- for h in hashes:
- all_present &= (b.exists(h) or False)
- WVPASS(all_present)
- false_positives = 0
- for h in [os.urandom(20) for i in range(1000)]:
- if b.exists(h):
- false_positives += 1
- WVPASSLT(false_positives, 5)
- os.unlink(tmpdir + b'/pybuptest.bloom')
-
- tf = tempfile.TemporaryFile(dir=tmpdir)
- b = bloom.create(b'bup.bloom', f=tf, expected=100)
- WVPASSEQ(b.rwfile, tf)
- WVPASSEQ(b.k, 5)
-
- # Test large (~1GiB) filter. This may fail on s390 (31-bit
- # architecture), and anywhere else where the address space is
- # sufficiently limited.
- tf = tempfile.TemporaryFile(dir=tmpdir)
- skip_test = False
- try:
- b = bloom.create(b'bup.bloom', f=tf, expected=2**28,
- delaywrite=False)
- except EnvironmentError as ex:
- (ptr_width, linkage) = platform.architecture()
- if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
- WVMSG('skipping large bloom filter test (mmap probably failed) '
- + str(ex))
- skip_test = True
- else:
- raise
- if not skip_test:
- WVPASSEQ(b.k, 4)
+++ /dev/null
-
-from __future__ import absolute_import
-import sys, os, stat, time, random, subprocess, glob
-
-from wvtest import *
-
-from bup import client, git, path
-from bup.compat import bytes_from_uint, environ, range
-from bup.helpers import mkdirp
-from buptest import no_lingering_errors, test_tempdir
-
-
-def randbytes(sz):
- s = b''
- for i in range(sz):
- s += bytes_from_uint(random.randrange(0,256))
- return s
-
-
-s1 = randbytes(10000)
-s2 = randbytes(10000)
-s3 = randbytes(10000)
-
-IDX_PAT = b'/*.idx'
-
-
-@wvtest
-def test_server_split_with_indexes():
- with no_lingering_errors():
- with test_tempdir(b'bup-tclient-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir
- git.init_repo(bupdir)
- lw = git.PackWriter()
- c = client.Client(bupdir, create=True)
- rw = c.new_packwriter()
-
- lw.new_blob(s1)
- lw.close()
-
- rw.new_blob(s2)
- rw.breakpoint()
- rw.new_blob(s1)
- rw.close()
-
-
-@wvtest
-def test_multiple_suggestions():
- with no_lingering_errors():
- with test_tempdir(b'bup-tclient-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir
- git.init_repo(bupdir)
-
- lw = git.PackWriter()
- lw.new_blob(s1)
- lw.close()
- lw = git.PackWriter()
- lw.new_blob(s2)
- lw.close()
- WVPASSEQ(len(glob.glob(git.repo(b'objects/pack'+IDX_PAT))), 2)
-
- c = client.Client(bupdir, create=True)
- WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 0)
- rw = c.new_packwriter()
- s1sha = rw.new_blob(s1)
- WVPASS(rw.exists(s1sha))
- s2sha = rw.new_blob(s2)
-
- # This is a little hacky, but ensures that we test the
- # code under test. First, flush to ensure that we've
- # actually sent all the command ('receive-objects-v2')
- # and their data to the server. This may be needed if
- # the output buffer size is bigger than the data (both
- # command and objects) we're writing. To see the need
- # for this, change the object sizes at the beginning
- # of this file to be very small (e.g. 10 instead of 10k)
- c.conn.outp.flush()
-
- # Then, check if we've already received the idx files.
- # This may happen if we're preempted just after writing
- # the data, then the server runs and suggests, and only
- # then we continue in PackWriter_Remote::_raw_write()
- # and check the has_input(), in that case we'll receive
- # the idx still in the rw.new_blob() calls above.
- #
- # In most cases though, that doesn't happen, and we'll
- # get past the has_input() check before the server has
- # a chance to respond - it has to actually hash the new
- # object here, so it takes some time. So also break out
- # of the loop if the server has sent something on the
- # connection.
- #
- # Finally, abort this after a little while (about one
- # second) just in case something's actually broken.
- n = 0
- while (len(glob.glob(c.cachedir+IDX_PAT)) < 2 and
- not c.conn.has_input() and n < 10):
- time.sleep(0.1)
- n += 1
- WVPASS(len(glob.glob(c.cachedir+IDX_PAT)) == 2 or c.conn.has_input())
- rw.new_blob(s2)
- WVPASS(rw.objcache.exists(s1sha))
- WVPASS(rw.objcache.exists(s2sha))
- rw.new_blob(s3)
- WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
- rw.close()
- WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 3)
-
-
-@wvtest
-def test_dumb_client_server():
- with no_lingering_errors():
- with test_tempdir(b'bup-tclient-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir
- git.init_repo(bupdir)
- open(git.repo(b'bup-dumb-server'), 'w').close()
-
- lw = git.PackWriter()
- lw.new_blob(s1)
- lw.close()
-
- c = client.Client(bupdir, create=True)
- rw = c.new_packwriter()
- WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
- rw.new_blob(s1)
- WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
- rw.new_blob(s2)
- rw.close()
- WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
-
-
-@wvtest
-def test_midx_refreshing():
- with no_lingering_errors():
- with test_tempdir(b'bup-tclient-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir
- git.init_repo(bupdir)
- c = client.Client(bupdir, create=True)
- rw = c.new_packwriter()
- rw.new_blob(s1)
- p1base = rw.breakpoint()
- p1name = os.path.join(c.cachedir, p1base)
- s1sha = rw.new_blob(s1) # should not be written; it's already in p1
- s2sha = rw.new_blob(s2)
- p2base = rw.close()
- p2name = os.path.join(c.cachedir, p2base)
- del rw
-
- pi = git.PackIdxList(bupdir + b'/objects/pack')
- WVPASSEQ(len(pi.packs), 2)
- pi.refresh()
- WVPASSEQ(len(pi.packs), 2)
- WVPASSEQ(sorted([os.path.basename(i.name) for i in pi.packs]),
- sorted([p1base, p2base]))
-
- p1 = git.open_idx(p1name)
- WVPASS(p1.exists(s1sha))
- p2 = git.open_idx(p2name)
- WVFAIL(p2.exists(s1sha))
- WVPASS(p2.exists(s2sha))
-
- subprocess.call([path.exe(), b'midx', b'-f'])
- pi.refresh()
- WVPASSEQ(len(pi.packs), 1)
- pi.refresh(skip_midx=True)
- WVPASSEQ(len(pi.packs), 2)
- pi.refresh(skip_midx=False)
- WVPASSEQ(len(pi.packs), 1)
-
-
-@wvtest
-def test_remote_parsing():
- with no_lingering_errors():
- tests = (
- (b':/bup', (b'file', None, None, b'/bup')),
- (b'file:///bup', (b'file', None, None, b'/bup')),
- (b'192.168.1.1:/bup', (b'ssh', b'192.168.1.1', None, b'/bup')),
- (b'ssh://192.168.1.1:2222/bup', (b'ssh', b'192.168.1.1', b'2222', b'/bup')),
- (b'ssh://[ff:fe::1]:2222/bup', (b'ssh', b'ff:fe::1', b'2222', b'/bup')),
- (b'bup://foo.com:1950', (b'bup', b'foo.com', b'1950', None)),
- (b'bup://foo.com:1950/bup', (b'bup', b'foo.com', b'1950', b'/bup')),
- (b'bup://[ff:fe::1]/bup', (b'bup', b'ff:fe::1', None, b'/bup')),)
- for remote, values in tests:
- WVPASSEQ(client.parse_remote(remote), values)
- try:
- client.parse_remote(b'http://asdf.com/bup')
- WVFAIL()
- except client.ClientError:
- WVPASS()
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-
-from wvtest import *
-
-from bup.compat import pending_raise
-
-@wvtest
-def test_pending_raise():
- outer = Exception('outer')
- inner = Exception('inner')
-
- try:
- try:
- raise outer
- except Exception as ex:
- with pending_raise(ex):
- pass
- except Exception as ex:
- WVPASSEQ(outer, ex)
- WVPASSEQ(None, getattr(outer, '__context__', None))
-
- try:
- try:
- raise outer
- except Exception as ex:
- with pending_raise(ex):
- raise inner
- except Exception as ex:
- WVPASSEQ(inner, ex)
- WVPASSEQ(None, getattr(outer, '__context__', None))
- WVPASSEQ(outer, getattr(inner, '__context__', None))
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-from binascii import hexlify, unhexlify
-from subprocess import check_call
-import struct, os, time
-
-from wvtest import *
-
-from bup import git, path
-from bup.compat import bytes_from_byte, environ, range
-from bup.helpers import localtime, log, mkdirp, readpipe
-from buptest import no_lingering_errors, test_tempdir
-
-
-bup_exe = path.exe()
-
-
-def exc(*cmd):
- print(repr(cmd), file=sys.stderr)
- check_call(cmd)
-
-
-def exo(*cmd):
- print(repr(cmd), file=sys.stderr)
- return readpipe(cmd)
-
-
-@wvtest
-def test_git_version_detection():
- with no_lingering_errors():
- # Test version types from git's tag history
- for expected, ver in \
- (('insufficient', b'git version 0.99'),
- ('insufficient', b'git version 0.99.1'),
- ('insufficient', b'git version 0.99.7a'),
- ('insufficient', b'git version 1.0rc1'),
- ('insufficient', b'git version 1.0.1'),
- ('insufficient', b'git version 1.4.2.1'),
- ('insufficient', b'git version 1.5.5'),
- ('insufficient', b'git version 1.5.6-rc0'),
- ('suitable', b'git version 1.5.6'),
- ('suitable', b'git version 1.5.6.1'),
- ('suitable', b'git version 2.14.0-rc0'),
- ('suitable', b'git version 2.14.0 (something ...)'),
- ('suitable', b'git version 111.222.333.444-rc555'),
- ('unrecognized', b'huh?')):
- WVMSG('Checking version validation: %r' % ver)
- WVPASSEQ(expected, git.is_suitable_git(ver_str=ver))
- try:
- if expected == 'insufficient':
- WVEXCEPT(SystemExit, git.require_suitable_git, ver)
- elif expected == 'suitable':
- git.require_suitable_git(ver_str=ver)
- elif expected == 'unrecognized':
- WVEXCEPT(git.GitError, git.require_suitable_git, ver)
- else:
- WVPASS(False)
- finally:
- git._git_great = None
- try:
- environ[b'BUP_GIT_VERSION_IS_FINE'] = b'true'
- git.require_suitable_git(ver_str=ver)
- finally:
- del environ[b'BUP_GIT_VERSION_IS_FINE']
- git._git_great = None
-
-
-@wvtest
-def testmangle():
- with no_lingering_errors():
- afile = 0o100644
- afile2 = 0o100770
- alink = 0o120000
- adir = 0o040000
- adir2 = 0o040777
- WVPASSEQ(git.mangle_name(b'a', adir2, adir), b'a')
- WVPASSEQ(git.mangle_name(b'.bup', adir2, adir), b'.bup.bupl')
- WVPASSEQ(git.mangle_name(b'a.bupa', adir2, adir), b'a.bupa.bupl')
- WVPASSEQ(git.mangle_name(b'b.bup', alink, alink), b'b.bup.bupl')
- WVPASSEQ(git.mangle_name(b'b.bu', alink, alink), b'b.bu')
- WVPASSEQ(git.mangle_name(b'f', afile, afile2), b'f')
- WVPASSEQ(git.mangle_name(b'f.bup', afile, afile2), b'f.bup.bupl')
- WVPASSEQ(git.mangle_name(b'f.bup', afile, adir), b'f.bup.bup')
- WVPASSEQ(git.mangle_name(b'f', afile, adir), b'f.bup')
-
- WVPASSEQ(git.demangle_name(b'f.bup', afile), (b'f', git.BUP_CHUNKED))
- WVPASSEQ(git.demangle_name(b'f.bupl', afile), (b'f', git.BUP_NORMAL))
- WVPASSEQ(git.demangle_name(b'f.bup.bupl', afile), (b'f.bup', git.BUP_NORMAL))
-
- WVPASSEQ(git.demangle_name(b'.bupm', afile), (b'', git.BUP_NORMAL))
- WVPASSEQ(git.demangle_name(b'.bupm', adir), (b'', git.BUP_CHUNKED))
-
- # for safety, we ignore .bup? suffixes we don't recognize. Future
- # versions might implement a .bup[a-z] extension as something other
- # than BUP_NORMAL.
- WVPASSEQ(git.demangle_name(b'f.bupa', afile), (b'f.bupa', git.BUP_NORMAL))
-
-
-@wvtest
-def testencode():
- with no_lingering_errors():
- s = b'hello world'
- looseb = b''.join(git._encode_looseobj(b'blob', s))
- looset = b''.join(git._encode_looseobj(b'tree', s))
- loosec = b''.join(git._encode_looseobj(b'commit', s))
- packb = b''.join(git._encode_packobj(b'blob', s))
- packt = b''.join(git._encode_packobj(b'tree', s))
- packc = b''.join(git._encode_packobj(b'commit', s))
- packlb = b''.join(git._encode_packobj(b'blob', s * 200))
- WVPASSEQ(git._decode_looseobj(looseb), (b'blob', s))
- WVPASSEQ(git._decode_looseobj(looset), (b'tree', s))
- WVPASSEQ(git._decode_looseobj(loosec), (b'commit', s))
- WVPASSEQ(git._decode_packobj(packb), (b'blob', s))
- WVPASSEQ(git._decode_packobj(packt), (b'tree', s))
- WVPASSEQ(git._decode_packobj(packc), (b'commit', s))
- WVPASSEQ(git._decode_packobj(packlb), (b'blob', s * 200))
- for i in range(10):
- WVPASS(git._encode_looseobj(b'blob', s, compression_level=i))
- def encode_pobj(n):
- return b''.join(git._encode_packobj(b'blob', s, compression_level=n))
- WVEXCEPT(ValueError, encode_pobj, -1)
- WVEXCEPT(ValueError, encode_pobj, 10)
- WVEXCEPT(ValueError, encode_pobj, b'x')
-
-
-@wvtest
-def testpacks():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- git.init_repo(bupdir)
- git.verbose = 1
-
- w = git.PackWriter()
- w.new_blob(os.urandom(100))
- w.new_blob(os.urandom(100))
- w.abort()
-
- w = git.PackWriter()
- hashes = []
- nobj = 1000
- for i in range(nobj):
- hashes.append(w.new_blob(b'%d' % i))
- log('\n')
- nameprefix = w.close()
- print(repr(nameprefix))
- WVPASS(os.path.exists(nameprefix + b'.pack'))
- WVPASS(os.path.exists(nameprefix + b'.idx'))
-
- r = git.open_idx(nameprefix + b'.idx')
- print(repr(r.fanout))
-
- for i in range(nobj):
- WVPASS(r.find_offset(hashes[i]) > 0)
- WVPASS(r.exists(hashes[99]))
- WVFAIL(r.exists(b'\0'*20))
-
- pi = iter(r)
- for h in sorted(hashes):
- WVPASSEQ(hexlify(next(pi)), hexlify(h))
-
- WVFAIL(r.find_offset(b'\0'*20))
-
- r = git.PackIdxList(bupdir + b'/objects/pack')
- WVPASS(r.exists(hashes[5]))
- WVPASS(r.exists(hashes[6]))
- WVFAIL(r.exists(b'\0'*20))
-
-
-@wvtest
-def test_pack_name_lookup():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- git.init_repo(bupdir)
- git.verbose = 1
- packdir = git.repo(b'objects/pack')
-
- idxnames = []
- hashes = []
-
- for start in range(0,28,2):
- w = git.PackWriter()
- for i in range(start, start+2):
- hashes.append(w.new_blob(b'%d' % i))
- log('\n')
- idxnames.append(os.path.basename(w.close() + b'.idx'))
-
- r = git.PackIdxList(packdir)
- WVPASSEQ(len(r.packs), 2)
- for e,idxname in enumerate(idxnames):
- for i in range(e*2, (e+1)*2):
- WVPASSEQ(idxname, r.exists(hashes[i], want_source=True))
-
-
-@wvtest
-def test_long_index():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- git.init_repo(bupdir)
- idx = git.PackIdxV2Writer()
- obj_bin = struct.pack('!IIIII',
- 0x00112233, 0x44556677, 0x88990011, 0x22334455, 0x66778899)
- obj2_bin = struct.pack('!IIIII',
- 0x11223344, 0x55667788, 0x99001122, 0x33445566, 0x77889900)
- obj3_bin = struct.pack('!IIIII',
- 0x22334455, 0x66778899, 0x00112233, 0x44556677, 0x88990011)
- pack_bin = struct.pack('!IIIII',
- 0x99887766, 0x55443322, 0x11009988, 0x77665544, 0x33221100)
- idx.add(obj_bin, 1, 0xfffffffff)
- idx.add(obj2_bin, 2, 0xffffffffff)
- idx.add(obj3_bin, 3, 0xff)
- name = tmpdir + b'/tmp.idx'
- r = idx.write(name, pack_bin)
- i = git.PackIdxV2(name, open(name, 'rb'))
- WVPASSEQ(i.find_offset(obj_bin), 0xfffffffff)
- WVPASSEQ(i.find_offset(obj2_bin), 0xffffffffff)
- WVPASSEQ(i.find_offset(obj3_bin), 0xff)
-
-
-@wvtest
-def test_check_repo_or_die():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- orig_cwd = os.getcwd()
- try:
- os.chdir(tmpdir)
- git.init_repo(bupdir)
- git.check_repo_or_die()
- # if we reach this point the call above passed
- WVPASS('check_repo_or_die')
-
- os.rename(bupdir + b'/objects/pack',
- bupdir + b'/objects/pack.tmp')
- open(bupdir + b'/objects/pack', 'w').close()
- try:
- git.check_repo_or_die()
- except SystemExit as e:
- WVPASSEQ(e.code, 14)
- else:
- WVFAIL()
- os.unlink(bupdir + b'/objects/pack')
- os.rename(bupdir + b'/objects/pack.tmp',
- bupdir + b'/objects/pack')
-
- try:
- git.check_repo_or_die(b'nonexistantbup.tmp')
- except SystemExit as e:
- WVPASSEQ(e.code, 15)
- else:
- WVFAIL()
- finally:
- os.chdir(orig_cwd)
-
-
-@wvtest
-def test_commit_parsing():
-
- def restore_env_var(name, val):
- if val is None:
- del environ[name]
- else:
- environ[name] = val
-
- def showval(commit, val):
- return readpipe([b'git', b'show', b'-s',
- b'--pretty=format:%s' % val, commit]).strip()
-
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- orig_cwd = os.getcwd()
- workdir = tmpdir + b'/work'
- repodir = workdir + b'/.git'
- orig_author_name = environ.get(b'GIT_AUTHOR_NAME')
- orig_author_email = environ.get(b'GIT_AUTHOR_EMAIL')
- orig_committer_name = environ.get(b'GIT_COMMITTER_NAME')
- orig_committer_email = environ.get(b'GIT_COMMITTER_EMAIL')
- environ[b'GIT_AUTHOR_NAME'] = b'bup test'
- environ[b'GIT_COMMITTER_NAME'] = environ[b'GIT_AUTHOR_NAME']
- environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
- environ[b'GIT_COMMITTER_EMAIL'] = environ[b'GIT_AUTHOR_EMAIL']
- try:
- readpipe([b'git', b'init', workdir])
- environ[b'GIT_DIR'] = environ[b'BUP_DIR'] = repodir
- git.check_repo_or_die(repodir)
- os.chdir(workdir)
- with open('foo', 'w') as f:
- print('bar', file=f)
- readpipe([b'git', b'add', b'.'])
- readpipe([b'git', b'commit', b'-am', b'Do something',
- b'--author', b'Someone <someone@somewhere>',
- b'--date', b'Sat Oct 3 19:48:49 2009 -0400'])
- commit = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
- parents = showval(commit, b'%P')
- tree = showval(commit, b'%T')
- cname = showval(commit, b'%cn')
- cmail = showval(commit, b'%ce')
- cdate = showval(commit, b'%ct')
- coffs = showval(commit, b'%ci')
- coffs = coffs[-5:]
- coff = (int(coffs[-4:-2]) * 60 * 60) + (int(coffs[-2:]) * 60)
- if bytes_from_byte(coffs[-5]) == b'-':
- coff = - coff
- commit_items = git.get_commit_items(commit, git.cp())
- WVPASSEQ(commit_items.parents, [])
- WVPASSEQ(commit_items.tree, tree)
- WVPASSEQ(commit_items.author_name, b'Someone')
- WVPASSEQ(commit_items.author_mail, b'someone@somewhere')
- WVPASSEQ(commit_items.author_sec, 1254613729)
- WVPASSEQ(commit_items.author_offset, -(4 * 60 * 60))
- WVPASSEQ(commit_items.committer_name, cname)
- WVPASSEQ(commit_items.committer_mail, cmail)
- WVPASSEQ(commit_items.committer_sec, int(cdate))
- WVPASSEQ(commit_items.committer_offset, coff)
- WVPASSEQ(commit_items.message, b'Do something\n')
- with open(b'bar', 'wb') as f:
- f.write(b'baz\n')
- readpipe([b'git', b'add', '.'])
- readpipe([b'git', b'commit', b'-am', b'Do something else'])
- child = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
- parents = showval(child, b'%P')
- commit_items = git.get_commit_items(child, git.cp())
- WVPASSEQ(commit_items.parents, [commit])
- finally:
- os.chdir(orig_cwd)
- restore_env_var(b'GIT_AUTHOR_NAME', orig_author_name)
- restore_env_var(b'GIT_AUTHOR_EMAIL', orig_author_email)
- restore_env_var(b'GIT_COMMITTER_NAME', orig_committer_name)
- restore_env_var(b'GIT_COMMITTER_EMAIL', orig_committer_email)
-
-
-@wvtest
-def test_new_commit():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- git.init_repo(bupdir)
- git.verbose = 1
-
- w = git.PackWriter()
- tree = os.urandom(20)
- parent = os.urandom(20)
- author_name = b'Author'
- author_mail = b'author@somewhere'
- adate_sec = 1439657836
- cdate_sec = adate_sec + 1
- committer_name = b'Committer'
- committer_mail = b'committer@somewhere'
- adate_tz_sec = cdate_tz_sec = None
- commit = w.new_commit(tree, parent,
- b'%s <%s>' % (author_name, author_mail),
- adate_sec, adate_tz_sec,
- b'%s <%s>' % (committer_name, committer_mail),
- cdate_sec, cdate_tz_sec,
- b'There is a small mailbox here')
- adate_tz_sec = -60 * 60
- cdate_tz_sec = 120 * 60
- commit_off = w.new_commit(tree, parent,
- b'%s <%s>' % (author_name, author_mail),
- adate_sec, adate_tz_sec,
- b'%s <%s>' % (committer_name, committer_mail),
- cdate_sec, cdate_tz_sec,
- b'There is a small mailbox here')
- w.close()
-
- commit_items = git.get_commit_items(hexlify(commit), git.cp())
- local_author_offset = localtime(adate_sec).tm_gmtoff
- local_committer_offset = localtime(cdate_sec).tm_gmtoff
- WVPASSEQ(tree, unhexlify(commit_items.tree))
- WVPASSEQ(1, len(commit_items.parents))
- WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
- WVPASSEQ(author_name, commit_items.author_name)
- WVPASSEQ(author_mail, commit_items.author_mail)
- WVPASSEQ(adate_sec, commit_items.author_sec)
- WVPASSEQ(local_author_offset, commit_items.author_offset)
- WVPASSEQ(committer_name, commit_items.committer_name)
- WVPASSEQ(committer_mail, commit_items.committer_mail)
- WVPASSEQ(cdate_sec, commit_items.committer_sec)
- WVPASSEQ(local_committer_offset, commit_items.committer_offset)
-
- commit_items = git.get_commit_items(hexlify(commit_off), git.cp())
- WVPASSEQ(tree, unhexlify(commit_items.tree))
- WVPASSEQ(1, len(commit_items.parents))
- WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
- WVPASSEQ(author_name, commit_items.author_name)
- WVPASSEQ(author_mail, commit_items.author_mail)
- WVPASSEQ(adate_sec, commit_items.author_sec)
- WVPASSEQ(adate_tz_sec, commit_items.author_offset)
- WVPASSEQ(committer_name, commit_items.committer_name)
- WVPASSEQ(committer_mail, commit_items.committer_mail)
- WVPASSEQ(cdate_sec, commit_items.committer_sec)
- WVPASSEQ(cdate_tz_sec, commit_items.committer_offset)
-
-
-@wvtest
-def test_list_refs():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- src = tmpdir + b'/src'
- mkdirp(src)
- with open(src + b'/1', 'wb+') as f:
- f.write(b'something\n')
- with open(src + b'/2', 'wb+') as f:
- f.write(b'something else\n')
- git.init_repo(bupdir)
- emptyset = frozenset()
- WVPASSEQ(frozenset(git.list_refs()), emptyset)
- WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
- WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), emptyset)
- exc(bup_exe, b'index', src)
- exc(bup_exe, b'save', b'-n', b'src', b'--strip', src)
- src_hash = exo(b'git', b'--git-dir', bupdir,
- b'rev-parse', b'src').strip().split(b'\n')
- assert(len(src_hash) == 1)
- src_hash = unhexlify(src_hash[0])
- tree_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
- b'rev-parse',
- b'src:').strip().split(b'\n')[0])
- blob_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
- b'rev-parse',
- b'src:1').strip().split(b'\n')[0])
- WVPASSEQ(frozenset(git.list_refs()),
- frozenset([(b'refs/heads/src', src_hash)]))
- WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
- WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
- frozenset([(b'refs/heads/src', src_hash)]))
- exc(b'git', b'--git-dir', bupdir, b'tag', b'commit-tag', b'src')
- WVPASSEQ(frozenset(git.list_refs()),
- frozenset([(b'refs/heads/src', src_hash),
- (b'refs/tags/commit-tag', src_hash)]))
- WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)),
- frozenset([(b'refs/tags/commit-tag', src_hash)]))
- WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
- frozenset([(b'refs/heads/src', src_hash)]))
- exc(b'git', b'--git-dir', bupdir, b'tag', b'tree-tag', b'src:')
- exc(b'git', b'--git-dir', bupdir, b'tag', b'blob-tag', b'src:1')
- os.unlink(bupdir + b'/refs/heads/src')
- expected_tags = frozenset([(b'refs/tags/commit-tag', src_hash),
- (b'refs/tags/tree-tag', tree_hash),
- (b'refs/tags/blob-tag', blob_hash)])
- WVPASSEQ(frozenset(git.list_refs()), expected_tags)
- WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), frozenset([]))
- WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), expected_tags)
-
-
-@wvtest
-def test__git_date_str():
- with no_lingering_errors():
- WVPASSEQ(b'0 +0000', git._git_date_str(0, 0))
- WVPASSEQ(b'0 -0130', git._git_date_str(0, -90 * 60))
- WVPASSEQ(b'0 +0130', git._git_date_str(0, 90 * 60))
-
-
-@wvtest
-def test_cat_pipe():
- with no_lingering_errors():
- with test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- src = tmpdir + b'/src'
- mkdirp(src)
- with open(src + b'/1', 'wb+') as f:
- f.write(b'something\n')
- with open(src + b'/2', 'wb+') as f:
- f.write(b'something else\n')
- git.init_repo(bupdir)
- exc(bup_exe, b'index', src)
- oidx = exo(bup_exe, b'save', b'-cn', b'src', b'--strip',
- src).strip()
- typ = exo(b'git', b'--git-dir', bupdir,
- b'cat-file', b'-t', b'src').strip()
- size = int(exo(b'git', b'--git-dir', bupdir,
- b'cat-file', b'-s', b'src'))
- it = git.cp().get(b'src')
- get_info = next(it)
- for buf in next(it):
- pass
- WVPASSEQ((oidx, typ, size), get_info)
-
-def _create_idx(d, i):
- idx = git.PackIdxV2Writer()
- # add 255 vaguely reasonable entries
- for s in range(255):
- idx.add(struct.pack('18xBB', i, s), s, 100 * s)
- packbin = struct.pack('B19x', i)
- packname = os.path.join(d, b'pack-%s.idx' % hexlify(packbin))
- idx.write(packname, packbin)
-
-@wvtest
-def test_midx_close():
- fddir = b'/proc/self/fd'
- try:
- os.listdir(fddir)
- except Exception:
- # not supported, not Linux, I guess
- return
-
- def openfiles():
- for fd in os.listdir(fddir):
- try:
- yield os.readlink(os.path.join(fddir, fd))
- except OSError:
- pass
-
- def force_midx(objdir):
- args = [path.exe(), b'midx', b'--auto', b'--dir', objdir]
- check_call(args)
-
- with no_lingering_errors(), \
- test_tempdir(b'bup-tgit-') as tmpdir:
- environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
- git.init_repo(bupdir)
- # create a few dummy idxes
- for i in range(10):
- _create_idx(tmpdir, i)
- git.auto_midx(tmpdir)
- l = git.PackIdxList(tmpdir)
- # this doesn't exist (yet)
- WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
- for i in range(10, 15):
- _create_idx(tmpdir, i)
- # delete the midx ...
- # TODO: why do we need to? git.auto_midx() below doesn't?!
- for fn in os.listdir(tmpdir):
- if fn.endswith(b'.midx'):
- os.unlink(os.path.join(tmpdir, fn))
- # and make a new one
- git.auto_midx(tmpdir)
- # check it still doesn't exist - we haven't refreshed
- WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
- # check that we still have the midx open, this really
- # just checks more for the kernel API ('deleted' string)
- for fn in openfiles():
- if not b'midx-' in fn:
- continue
- WVPASSEQ(True, b'deleted' in fn)
- # refresh the PackIdxList
- l.refresh()
- # and check that an object in pack 10 exists now
- WVPASSEQ(True, l.exists(struct.pack('18xBB', 10, 0)))
- for fn in openfiles():
- if not b'midx-' in fn:
- continue
- # check that we don't have it open anymore
- WVPASSEQ(False, b'deleted' in fn)
+++ /dev/null
-
-from __future__ import absolute_import
-from io import BytesIO
-
-from wvtest import *
-
-from bup import hashsplit, _helpers, helpers
-from bup.compat import byte_int, bytes_from_uint
-from buptest import no_lingering_errors
-
-
-def nr_regions(x, max_count=None):
- return list(hashsplit._nonresident_page_regions(bytearray(x), 1, max_count))
-
-
-@wvtest
-def test_nonresident_page_regions():
- with no_lingering_errors():
- WVPASSEQ(nr_regions([]), [])
- WVPASSEQ(nr_regions([1]), [])
- WVPASSEQ(nr_regions([0]), [(0, 1)])
- WVPASSEQ(nr_regions([1, 0]), [(1, 1)])
- WVPASSEQ(nr_regions([0, 0]), [(0, 2)])
- WVPASSEQ(nr_regions([1, 0, 1]), [(1, 1)])
- WVPASSEQ(nr_regions([1, 0, 0]), [(1, 2)])
- WVPASSEQ(nr_regions([0, 1, 0]), [(0, 1), (2, 1)])
- WVPASSEQ(nr_regions([0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]),
- [(0, 2), (5, 3), (9, 2)])
- WVPASSEQ(nr_regions([2, 42, 3, 101]), [(0, 2)])
- # Test limit
- WVPASSEQ(nr_regions([0, 0, 0], None), [(0, 3)])
- WVPASSEQ(nr_regions([0, 0, 0], 1), [(0, 1), (1, 1), (2, 1)])
- WVPASSEQ(nr_regions([0, 0, 0], 2), [(0, 2), (2, 1)])
- WVPASSEQ(nr_regions([0, 0, 0], 3), [(0, 3)])
- WVPASSEQ(nr_regions([0, 0, 0], 4), [(0, 3)])
- WVPASSEQ(nr_regions([0, 0, 1], None), [(0, 2)])
- WVPASSEQ(nr_regions([0, 0, 1], 1), [(0, 1), (1, 1)])
- WVPASSEQ(nr_regions([0, 0, 1], 2), [(0, 2)])
- WVPASSEQ(nr_regions([0, 0, 1], 3), [(0, 2)])
- WVPASSEQ(nr_regions([1, 0, 0], None), [(1, 2)])
- WVPASSEQ(nr_regions([1, 0, 0], 1), [(1, 1), (2, 1)])
- WVPASSEQ(nr_regions([1, 0, 0], 2), [(1, 2)])
- WVPASSEQ(nr_regions([1, 0, 0], 3), [(1, 2)])
- WVPASSEQ(nr_regions([1, 0, 0, 0, 1], None), [(1, 3)])
- WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 1), [(1, 1), (2, 1), (3, 1)])
- WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 2), [(1, 2), (3, 1)])
- WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 3), [(1, 3)])
- WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 4), [(1, 3)])
-
-
-@wvtest
-def test_uncache_ours_upto():
- history = []
- def mock_fadvise_pages_done(f, ofs, len):
- history.append((f, ofs, len))
-
- with no_lingering_errors():
- uncache_upto = hashsplit._uncache_ours_upto
- page_size = helpers.sc_page_size
- orig_pages_done = hashsplit._fadvise_pages_done
- try:
- hashsplit._fadvise_pages_done = mock_fadvise_pages_done
- history = []
- uncache_upto(42, 0, (0, 1), iter([]))
- WVPASSEQ([], history)
- uncache_upto(42, page_size, (0, 1), iter([]))
- WVPASSEQ([(42, 0, 1)], history)
- history = []
- uncache_upto(42, page_size, (0, 3), iter([(5, 2)]))
- WVPASSEQ([], history)
- uncache_upto(42, 2 * page_size, (0, 3), iter([(5, 2)]))
- WVPASSEQ([], history)
- uncache_upto(42, 3 * page_size, (0, 3), iter([(5, 2)]))
- WVPASSEQ([(42, 0, 3)], history)
- history = []
- uncache_upto(42, 5 * page_size, (0, 3), iter([(5, 2)]))
- WVPASSEQ([(42, 0, 3)], history)
- history = []
- uncache_upto(42, 6 * page_size, (0, 3), iter([(5, 2)]))
- WVPASSEQ([(42, 0, 3)], history)
- history = []
- uncache_upto(42, 7 * page_size, (0, 3), iter([(5, 2)]))
- WVPASSEQ([(42, 0, 3), (42, 5, 2)], history)
- finally:
- hashsplit._fadvise_pages_done = orig_pages_done
-
-
-@wvtest
-def test_rolling_sums():
- with no_lingering_errors():
- WVPASS(_helpers.selftest())
-
-@wvtest
-def test_fanout_behaviour():
-
- # Drop in replacement for bupsplit, but splitting if the int value of a
- # byte >= BUP_BLOBBITS
- basebits = _helpers.blobbits()
- def splitbuf(buf):
- ofs = 0
- for b in buf:
- b = byte_int(b)
- ofs += 1
- if b >= basebits:
- return ofs, b
- return 0, 0
-
- with no_lingering_errors():
- old_splitbuf = _helpers.splitbuf
- _helpers.splitbuf = splitbuf
- old_BLOB_MAX = hashsplit.BLOB_MAX
- hashsplit.BLOB_MAX = 4
- old_BLOB_READ_SIZE = hashsplit.BLOB_READ_SIZE
- hashsplit.BLOB_READ_SIZE = 10
- old_fanout = hashsplit.fanout
- hashsplit.fanout = 2
-
- levels = lambda f: [(len(b), l) for b, l in
- hashsplit.hashsplit_iter([f], True, None)]
- # Return a string of n null bytes
- z = lambda n: b'\x00' * n
- # Return a byte which will be split with a level of n
- sb = lambda n: bytes_from_uint(basebits + n)
-
- split_never = BytesIO(z(16))
- split_first = BytesIO(z(1) + sb(3) + z(14))
- split_end = BytesIO(z(13) + sb(1) + z(2))
- split_many = BytesIO(sb(1) + z(3) + sb(2) + z(4) +
- sb(0) + z(4) + sb(5) + z(1))
- WVPASSEQ(levels(split_never), [(4, 0), (4, 0), (4, 0), (4, 0)])
- WVPASSEQ(levels(split_first), [(2, 3), (4, 0), (4, 0), (4, 0), (2, 0)])
- WVPASSEQ(levels(split_end), [(4, 0), (4, 0), (4, 0), (2, 1), (2, 0)])
- WVPASSEQ(levels(split_many),
- [(1, 1), (4, 2), (4, 0), (1, 0), (4, 0), (1, 5), (1, 0)])
-
- _helpers.splitbuf = old_splitbuf
- hashsplit.BLOB_MAX = old_BLOB_MAX
- hashsplit.BLOB_READ_SIZE = old_BLOB_READ_SIZE
- hashsplit.fanout = old_fanout
+++ /dev/null
-
-from __future__ import absolute_import
-from time import tzset
-import helpers, math, os, re, subprocess
-
-from wvtest import *
-
-from bup.compat import bytes_from_byte, bytes_from_uint, environ
-from bup.helpers import (atomically_replaced_file, batchpipe, detect_fakeroot,
- grafted_path_components, mkdirp, parse_num,
- path_components, readpipe, stripped_path_components,
- shstr,
- utc_offset_str)
-from buptest import no_lingering_errors, test_tempdir
-import bup._helpers as _helpers
-
-
-bup_tmp = os.path.realpath(b'../../../t/tmp')
-mkdirp(bup_tmp)
-
-
-@wvtest
-def test_parse_num():
- with no_lingering_errors():
- pn = parse_num
- WVPASSEQ(pn(b'1'), 1)
- WVPASSEQ(pn('1'), 1)
- WVPASSEQ(pn('0'), 0)
- WVPASSEQ(pn('1.5k'), 1536)
- WVPASSEQ(pn('2 gb'), 2*1024*1024*1024)
- WVPASSEQ(pn('1e+9 k'), 1000000000 * 1024)
- WVPASSEQ(pn('-3e-3mb'), int(-0.003 * 1024 * 1024))
-
-@wvtest
-def test_detect_fakeroot():
- with no_lingering_errors():
- if b'FAKEROOTKEY' in environ:
- WVPASS(detect_fakeroot())
- else:
- WVPASS(not detect_fakeroot())
-
-@wvtest
-def test_path_components():
- with no_lingering_errors():
- WVPASSEQ(path_components(b'/'), [(b'', b'/')])
- WVPASSEQ(path_components(b'/foo'), [(b'', b'/'), (b'foo', b'/foo')])
- WVPASSEQ(path_components(b'/foo/'), [(b'', b'/'), (b'foo', b'/foo')])
- WVPASSEQ(path_components(b'/foo/bar'),
- [(b'', b'/'), (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
- WVEXCEPT(Exception, path_components, b'foo')
-
-
-@wvtest
-def test_stripped_path_components():
- with no_lingering_errors():
- WVPASSEQ(stripped_path_components(b'/', []), [(b'', b'/')])
- WVPASSEQ(stripped_path_components(b'/', [b'']), [(b'', b'/')])
- WVPASSEQ(stripped_path_components(b'/', [b'/']), [(b'', b'/')])
- WVPASSEQ(stripped_path_components(b'/foo', [b'/']),
- [(b'', b'/'), (b'foo', b'/foo')])
- WVPASSEQ(stripped_path_components(b'/', [b'/foo']), [(b'', b'/')])
- WVPASSEQ(stripped_path_components(b'/foo', [b'/bar']),
- [(b'', b'/'), (b'foo', b'/foo')])
- WVPASSEQ(stripped_path_components(b'/foo', [b'/foo']), [(b'', b'/foo')])
- WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/foo']),
- [(b'', b'/foo'), (b'bar', b'/foo/bar')])
- WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/bar', b'/foo', b'/baz']),
- [(b'', b'/foo'), (b'bar', b'/foo/bar')])
- WVPASSEQ(stripped_path_components(b'/foo/bar/baz', [b'/foo/bar/baz']),
- [(b'', b'/foo/bar/baz')])
- WVEXCEPT(Exception, stripped_path_components, b'foo', [])
-
-
-@wvtest
-def test_grafted_path_components():
- with no_lingering_errors():
- WVPASSEQ(grafted_path_components([(b'/chroot', b'/')], b'/foo'),
- [(b'', b'/'), (b'foo', b'/foo')])
- WVPASSEQ(grafted_path_components([(b'/foo/bar', b'/')],
- b'/foo/bar/baz/bax'),
- [(b'', b'/foo/bar'),
- (b'baz', b'/foo/bar/baz'),
- (b'bax', b'/foo/bar/baz/bax')])
- WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/bax')],
- b'/foo/bar/baz/1/2'),
- [(b'', None),
- (b'bax', b'/foo/bar/baz'),
- (b'1', b'/foo/bar/baz/1'),
- (b'2', b'/foo/bar/baz/1/2')])
- WVPASSEQ(grafted_path_components([(b'/foo', b'/bar/baz/bax')],
- b'/foo/bar'),
- [(b'', None),
- (b'bar', None),
- (b'baz', None),
- (b'bax', b'/foo'),
- (b'bar', b'/foo/bar')])
- WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/a/b/c')],
- b'/foo/bar/baz'),
- [(b'', None), (b'a', None), (b'b', None), (b'c', b'/foo/bar/baz')])
- WVPASSEQ(grafted_path_components([(b'/', b'/a/b/c/')], b'/foo/bar'),
- [(b'', None), (b'a', None), (b'b', None), (b'c', b'/'),
- (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
- WVEXCEPT(Exception, grafted_path_components, b'foo', [])
-
-
-@wvtest
-def test_shstr():
- with no_lingering_errors():
- # Do nothing for strings and bytes
- WVPASSEQ(shstr(b''), b'')
- WVPASSEQ(shstr(b'1'), b'1')
- WVPASSEQ(shstr(b'1 2'), b'1 2')
- WVPASSEQ(shstr(b"1'2"), b"1'2")
- WVPASSEQ(shstr(''), '')
- WVPASSEQ(shstr('1'), '1')
- WVPASSEQ(shstr('1 2'), '1 2')
- WVPASSEQ(shstr("1'2"), "1'2")
-
- # Escape parts of sequences
- WVPASSEQ(shstr((b'1 2', b'3')), b"'1 2' 3")
- WVPASSEQ(shstr((b"1'2", b'3')), b"'1'\"'\"'2' 3")
- WVPASSEQ(shstr((b"'1", b'3')), b"''\"'\"'1' 3")
- WVPASSEQ(shstr(('1 2', '3')), "'1 2' 3")
- WVPASSEQ(shstr(("1'2", '3')), "'1'\"'\"'2' 3")
- WVPASSEQ(shstr(("'1", '3')), "''\"'\"'1' 3")
-
-
-@wvtest
-def test_readpipe():
- with no_lingering_errors():
- x = readpipe([b'echo', b'42'])
- WVPASSEQ(x, b'42\n')
- try:
- readpipe([b'bash', b'-c', b'exit 42'])
- except Exception as ex:
- rx = '^subprocess b?"bash -c \'exit 42\'" failed with status 42$'
- if not re.match(rx, str(ex)):
- WVPASSEQ(str(ex), rx)
-
-
-@wvtest
-def test_batchpipe():
- with no_lingering_errors():
- for chunk in batchpipe([b'echo'], []):
- WVPASS(False)
- out = b''
- for chunk in batchpipe([b'echo'], [b'42']):
- out += chunk
- WVPASSEQ(out, b'42\n')
- try:
- batchpipe([b'bash', b'-c'], [b'exit 42'])
- except Exception as ex:
- WVPASSEQ(str(ex),
- "subprocess 'bash -c exit 42' failed with status 42")
- args = [str(x) for x in range(6)]
- # Force batchpipe to break the args into batches of 3. This
- # approach assumes all args are the same length.
- arg_max = \
- helpers._argmax_base([b'echo']) + helpers._argmax_args_size(args[:3])
- batches = batchpipe(['echo'], args, arg_max=arg_max)
- WVPASSEQ(next(batches), b'0 1 2\n')
- WVPASSEQ(next(batches), b'3 4 5\n')
- WVPASSEQ(next(batches, None), None)
- batches = batchpipe([b'echo'], [str(x) for x in range(5)], arg_max=arg_max)
- WVPASSEQ(next(batches), b'0 1 2\n')
- WVPASSEQ(next(batches), b'3 4\n')
- WVPASSEQ(next(batches, None), None)
-
-
-@wvtest
-def test_atomically_replaced_file():
- with no_lingering_errors():
- with test_tempdir(b'bup-thelper-') as tmpdir:
- target_file = os.path.join(tmpdir, b'test-atomic-write')
-
- with atomically_replaced_file(target_file, mode='w') as f:
- f.write('asdf')
- WVPASSEQ(f.mode, 'w')
- f = open(target_file, 'r')
- WVPASSEQ(f.read(), 'asdf')
-
- try:
- with atomically_replaced_file(target_file, mode='w') as f:
- f.write('wxyz')
- raise Exception()
- except:
- pass
- with open(target_file) as f:
- WVPASSEQ(f.read(), 'asdf')
-
- with atomically_replaced_file(target_file, mode='wb') as f:
- f.write(os.urandom(20))
- WVPASSEQ(f.mode, 'wb')
-
-
-def set_tz(tz):
- if not tz:
- del environ[b'TZ']
- else:
- environ[b'TZ'] = tz
- tzset()
-
-
-@wvtest
-def test_utc_offset_str():
- with no_lingering_errors():
- tz = environ.get(b'TZ')
- tzset()
- try:
- set_tz(b'FOO+0:00')
- WVPASSEQ(utc_offset_str(0), b'+0000')
- set_tz(b'FOO+1:00')
- WVPASSEQ(utc_offset_str(0), b'-0100')
- set_tz(b'FOO-1:00')
- WVPASSEQ(utc_offset_str(0), b'+0100')
- set_tz(b'FOO+3:3')
- WVPASSEQ(utc_offset_str(0), b'-0303')
- set_tz(b'FOO-3:3')
- WVPASSEQ(utc_offset_str(0), b'+0303')
- # Offset is not an integer number of minutes
- set_tz(b'FOO+3:3:3')
- WVPASSEQ(utc_offset_str(1), b'-0303')
- set_tz(b'FOO-3:3:3')
- WVPASSEQ(utc_offset_str(1), b'+0303')
- WVPASSEQ(utc_offset_str(314159), b'+0303')
- finally:
- if tz:
- set_tz(tz)
- else:
- try:
- set_tz(None)
- except KeyError:
- pass
-
-@wvtest
-def test_valid_save_name():
- with no_lingering_errors():
- valid = helpers.valid_save_name
- WVPASS(valid(b'x'))
- WVPASS(valid(b'x@'))
- WVFAIL(valid(b'@'))
- WVFAIL(valid(b'/'))
- WVFAIL(valid(b'/foo'))
- WVFAIL(valid(b'foo/'))
- WVFAIL(valid(b'/foo/'))
- WVFAIL(valid(b'foo//bar'))
- WVFAIL(valid(b'.'))
- WVFAIL(valid(b'bar.'))
- WVFAIL(valid(b'foo@{'))
- for x in b' ~^:?*[\\':
- WVFAIL(valid(b'foo' + bytes_from_byte(x)))
- for i in range(20):
- WVFAIL(valid(b'foo' + bytes_from_uint(i)))
- WVFAIL(valid(b'foo' + bytes_from_uint(0x7f)))
- WVFAIL(valid(b'foo..bar'))
- WVFAIL(valid(b'bar.lock/baz'))
- WVFAIL(valid(b'foo/bar.lock/baz'))
- WVFAIL(valid(b'.bar/baz'))
- WVFAIL(valid(b'foo/.bar/baz'))
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-import os, time
-
-from wvtest import *
-
-from bup import index, metadata
-from bup.compat import fsencode
-from bup.helpers import mkdirp, resolve_parent
-from buptest import no_lingering_errors, test_tempdir
-import bup.xstat as xstat
-
-
-lib_t_dir = os.path.dirname(fsencode(__file__))
-
-
-@wvtest
-def index_basic():
- with no_lingering_errors():
- cd = os.path.realpath(b'../../../t')
- WVPASS(cd)
- sd = os.path.realpath(cd + b'/sampledata')
- WVPASSEQ(resolve_parent(cd + b'/sampledata'), sd)
- WVPASSEQ(os.path.realpath(cd + b'/sampledata/x'), sd + b'/x')
- WVPASSEQ(os.path.realpath(cd + b'/sampledata/var/abs-symlink'),
- sd + b'/var/abs-symlink-target')
- WVPASSEQ(resolve_parent(cd + b'/sampledata/var/abs-symlink'),
- sd + b'/var/abs-symlink')
-
-
-@wvtest
-def index_writer():
- with no_lingering_errors():
- with test_tempdir(b'bup-tindex-') as tmpdir:
- orig_cwd = os.getcwd()
- try:
- os.chdir(tmpdir)
- ds = xstat.stat(b'.')
- fs = xstat.stat(lib_t_dir + b'/tindex.py')
- ms = index.MetaStoreWriter(b'index.meta.tmp');
- tmax = (time.time() - 1) * 10**9
- w = index.Writer(b'index.tmp', ms, tmax)
- w.add(b'/var/tmp/sporky', fs, 0)
- w.add(b'/etc/passwd', fs, 0)
- w.add(b'/etc/', ds, 0)
- w.add(b'/', ds, 0)
- ms.close()
- w.close()
- finally:
- os.chdir(orig_cwd)
-
-
-def dump(m):
- for e in list(m):
- print('%s%s %s' % (e.is_valid() and ' ' or 'M',
- e.is_fake() and 'F' or ' ',
- e.name))
-
-def fake_validate(*l):
- for i in l:
- for e in i:
- e.validate(0o100644, index.FAKE_SHA)
- e.repack()
-
-def eget(l, ename):
- for e in l:
- if e.name == ename:
- return e
-
-@wvtest
-def index_negative_timestamps():
- with no_lingering_errors():
- with test_tempdir(b'bup-tindex-') as tmpdir:
- # Makes 'foo' exist
- foopath = tmpdir + b'/foo'
- f = open(foopath, 'wb')
- f.close()
-
- # Dec 31, 1969
- os.utime(foopath, (-86400, -86400))
- ns_per_sec = 10**9
- tmax = (time.time() - 1) * ns_per_sec
- e = index.BlankNewEntry(foopath, 0, tmax)
- e.update_from_stat(xstat.stat(foopath), 0)
- WVPASS(e.packed())
-
- # Jun 10, 1893
- os.utime(foopath, (-0x80000000, -0x80000000))
- e = index.BlankNewEntry(foopath, 0, tmax)
- e.update_from_stat(xstat.stat(foopath), 0)
- WVPASS(e.packed())
-
-
-@wvtest
-def index_dirty():
- with no_lingering_errors():
- with test_tempdir(b'bup-tindex-') as tmpdir:
- orig_cwd = os.getcwd()
- try:
- os.chdir(tmpdir)
- default_meta = metadata.Metadata()
- ms1 = index.MetaStoreWriter(b'index.meta.tmp')
- ms2 = index.MetaStoreWriter(b'index2.meta.tmp')
- ms3 = index.MetaStoreWriter(b'index3.meta.tmp')
- meta_ofs1 = ms1.store(default_meta)
- meta_ofs2 = ms2.store(default_meta)
- meta_ofs3 = ms3.store(default_meta)
-
- ds = xstat.stat(lib_t_dir)
- fs = xstat.stat(lib_t_dir + b'/tindex.py')
- tmax = (time.time() - 1) * 10**9
-
- w1 = index.Writer(b'index.tmp', ms1, tmax)
- w1.add(b'/a/b/x', fs, meta_ofs1)
- w1.add(b'/a/b/c', fs, meta_ofs1)
- w1.add(b'/a/b/', ds, meta_ofs1)
- w1.add(b'/a/', ds, meta_ofs1)
- #w1.close()
- WVPASS()
-
- w2 = index.Writer(b'index2.tmp', ms2, tmax)
- w2.add(b'/a/b/n/2', fs, meta_ofs2)
- #w2.close()
- WVPASS()
-
- w3 = index.Writer(b'index3.tmp', ms3, tmax)
- w3.add(b'/a/c/n/3', fs, meta_ofs3)
- #w3.close()
- WVPASS()
-
- r1 = w1.new_reader()
- r2 = w2.new_reader()
- r3 = w3.new_reader()
- WVPASS()
-
- r1all = [e.name for e in r1]
- WVPASSEQ(r1all,
- [b'/a/b/x', b'/a/b/c', b'/a/b/', b'/a/', b'/'])
- r2all = [e.name for e in r2]
- WVPASSEQ(r2all,
- [b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
- r3all = [e.name for e in r3]
- WVPASSEQ(r3all,
- [b'/a/c/n/3', b'/a/c/n/', b'/a/c/', b'/a/', b'/'])
- all = [e.name for e in index.merge(r2, r1, r3)]
- WVPASSEQ(all,
- [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
- b'/a/b/x', b'/a/b/n/2', b'/a/b/n/', b'/a/b/c',
- b'/a/b/', b'/a/', b'/'])
- fake_validate(r1)
- dump(r1)
-
- print([hex(e.flags) for e in r1])
- WVPASSEQ([e.name for e in r1 if e.is_valid()], r1all)
- WVPASSEQ([e.name for e in r1 if not e.is_valid()], [])
- WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
- [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
- b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
-
- expect_invalid = [b'/'] + r2all + r3all
- expect_real = (set(r1all) - set(r2all) - set(r3all)) \
- | set([b'/a/b/n/2', b'/a/c/n/3'])
- dump(index.merge(r2, r1, r3))
- for e in index.merge(r2, r1, r3):
- print(e.name, hex(e.flags), e.ctime)
- eiv = e.name in expect_invalid
- er = e.name in expect_real
- WVPASSEQ(eiv, not e.is_valid())
- WVPASSEQ(er, e.is_real())
- fake_validate(r2, r3)
- dump(index.merge(r2, r1, r3))
- WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()], [])
-
- e = eget(index.merge(r2, r1, r3), b'/a/b/c')
- e.invalidate()
- e.repack()
- dump(index.merge(r2, r1, r3))
- WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
- [b'/a/b/c', b'/a/b/', b'/a/', b'/'])
- w1.close()
- w2.close()
- w3.close()
- finally:
- os.chdir(orig_cwd)
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-import errno, glob, grp, pwd, stat, tempfile, subprocess
-
-from wvtest import *
-
-from bup import git, metadata
-from bup import vfs
-from bup.compat import range
-from bup.helpers import clear_errors, detect_fakeroot, is_superuser, resolve_parent
-from bup.repo import LocalRepo
-from bup.xstat import utime, lutime
-from buptest import no_lingering_errors, test_tempdir
-import bup.helpers as helpers
-
-
-top_dir = b'../../..'
-bup_tmp = os.path.realpath(b'../../../t/tmp')
-bup_path = top_dir + b'/bup'
-start_dir = os.getcwd()
-
-
-def ex(*cmd):
- try:
- cmd_str = b' '.join(cmd)
- print(cmd_str, file=sys.stderr)
- rc = subprocess.call(cmd)
- if rc < 0:
- print('terminated by signal', - rc, file=sys.stderr)
- sys.exit(1)
- elif rc > 0:
- print('returned exit status', rc, file=sys.stderr)
- sys.exit(1)
- except OSError as e:
- print('subprocess call failed:', e, file=sys.stderr)
- sys.exit(1)
-
-
-def setup_testfs():
- assert(sys.platform.startswith('linux'))
- # Set up testfs with user_xattr, etc.
- if subprocess.call([b'modprobe', b'loop']) != 0:
- return False
- subprocess.call([b'umount', b'testfs'])
- ex(b'dd', b'if=/dev/zero', b'of=testfs.img', b'bs=1M', b'count=32')
- ex(b'mke2fs', b'-F', b'-j', b'-m', b'0', b'testfs.img')
- ex(b'rm', b'-rf', b'testfs')
- os.mkdir(b'testfs')
- ex(b'mount', b'-o', b'loop,acl,user_xattr', b'testfs.img', b'testfs')
- # Hide, so that tests can't create risks.
- os.chown(b'testfs', 0, 0)
- os.chmod(b'testfs', 0o700)
- return True
-
-
-def cleanup_testfs():
- subprocess.call([b'umount', b'testfs'])
- helpers.unlink(b'testfs.img')
-
-
-@wvtest
-def test_clean_up_archive_path():
- with no_lingering_errors():
- cleanup = metadata._clean_up_path_for_archive
- WVPASSEQ(cleanup(b'foo'), b'foo')
- WVPASSEQ(cleanup(b'/foo'), b'foo')
- WVPASSEQ(cleanup(b'///foo'), b'foo')
- WVPASSEQ(cleanup(b'/foo/bar'), b'foo/bar')
- WVPASSEQ(cleanup(b'foo/./bar'), b'foo/bar')
- WVPASSEQ(cleanup(b'/foo/./bar'), b'foo/bar')
- WVPASSEQ(cleanup(b'/foo/./bar/././baz'), b'foo/bar/baz')
- WVPASSEQ(cleanup(b'/foo/./bar///././baz'), b'foo/bar/baz')
- WVPASSEQ(cleanup(b'//./foo/./bar///././baz/.///'), b'foo/bar/baz/')
- WVPASSEQ(cleanup(b'./foo/./.bar'), b'foo/.bar')
- WVPASSEQ(cleanup(b'./foo/.'), b'foo')
- WVPASSEQ(cleanup(b'./foo/..'), b'.')
- WVPASSEQ(cleanup(b'//./..//.../..//.'), b'.')
- WVPASSEQ(cleanup(b'//./..//..././/.'), b'...')
- WVPASSEQ(cleanup(b'/////.'), b'.')
- WVPASSEQ(cleanup(b'/../'), b'.')
- WVPASSEQ(cleanup(b''), b'.')
-
-
-@wvtest
-def test_risky_path():
- with no_lingering_errors():
- risky = metadata._risky_path
- WVPASS(risky(b'/foo'))
- WVPASS(risky(b'///foo'))
- WVPASS(risky(b'/../foo'))
- WVPASS(risky(b'../foo'))
- WVPASS(risky(b'foo/..'))
- WVPASS(risky(b'foo/../'))
- WVPASS(risky(b'foo/../bar'))
- WVFAIL(risky(b'foo'))
- WVFAIL(risky(b'foo/'))
- WVFAIL(risky(b'foo///'))
- WVFAIL(risky(b'./foo'))
- WVFAIL(risky(b'foo/.'))
- WVFAIL(risky(b'./foo/.'))
- WVFAIL(risky(b'foo/bar'))
- WVFAIL(risky(b'foo/./bar'))
-
-
-@wvtest
-def test_clean_up_extract_path():
- with no_lingering_errors():
- cleanup = metadata._clean_up_extract_path
- WVPASSEQ(cleanup(b'/foo'), b'foo')
- WVPASSEQ(cleanup(b'///foo'), b'foo')
- WVFAIL(cleanup(b'/../foo'))
- WVFAIL(cleanup(b'../foo'))
- WVFAIL(cleanup(b'foo/..'))
- WVFAIL(cleanup(b'foo/../'))
- WVFAIL(cleanup(b'foo/../bar'))
- WVPASSEQ(cleanup(b'foo'), b'foo')
- WVPASSEQ(cleanup(b'foo/'), b'foo/')
- WVPASSEQ(cleanup(b'foo///'), b'foo///')
- WVPASSEQ(cleanup(b'./foo'), b'./foo')
- WVPASSEQ(cleanup(b'foo/.'), b'foo/.')
- WVPASSEQ(cleanup(b'./foo/.'), b'./foo/.')
- WVPASSEQ(cleanup(b'foo/bar'), b'foo/bar')
- WVPASSEQ(cleanup(b'foo/./bar'), b'foo/./bar')
- WVPASSEQ(cleanup(b'/'), b'.')
- WVPASSEQ(cleanup(b'./'), b'./')
- WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
- WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
-
-
-@wvtest
-def test_metadata_method():
- with no_lingering_errors():
- with test_tempdir(b'bup-tmetadata-') as tmpdir:
- bup_dir = tmpdir + b'/bup'
- data_path = tmpdir + b'/foo'
- os.mkdir(data_path)
- ex(b'touch', data_path + b'/file')
- ex(b'ln', b'-s', b'file', data_path + b'/symlink')
- test_time1 = 13 * 1000000000
- test_time2 = 42 * 1000000000
- utime(data_path + b'/file', (0, test_time1))
- lutime(data_path + b'/symlink', (0, 0))
- utime(data_path, (0, test_time2))
- ex(bup_path, b'-d', bup_dir, b'init')
- ex(bup_path, b'-d', bup_dir, b'index', b'-v', data_path)
- ex(bup_path, b'-d', bup_dir, b'save', b'-tvvn', b'test', data_path)
- git.check_repo_or_die(bup_dir)
- repo = LocalRepo()
- resolved = vfs.resolve(repo,
- b'/test/latest' + resolve_parent(data_path),
- follow=False)
- leaf_name, leaf_item = resolved[-1]
- m = leaf_item.meta
- WVPASS(m.mtime == test_time2)
- WVPASS(leaf_name == b'foo')
- contents = tuple(vfs.contents(repo, leaf_item))
- WVPASS(len(contents) == 3)
- WVPASSEQ(frozenset(name for name, item in contents),
- frozenset((b'.', b'file', b'symlink')))
- for name, item in contents:
- if name == b'file':
- m = item.meta
- WVPASS(m.mtime == test_time1)
- elif name == b'symlink':
- m = item.meta
- WVPASSEQ(m.symlink_target, b'file')
- WVPASSEQ(m.size, 4)
- WVPASSEQ(m.mtime, 0)
-
-
-def _first_err():
- if helpers.saved_errors:
- return str(helpers.saved_errors[0])
- return ''
-
-
-@wvtest
-def test_from_path_error():
- if is_superuser() or detect_fakeroot():
- return
- with no_lingering_errors():
- with test_tempdir(b'bup-tmetadata-') as tmpdir:
- path = tmpdir + b'/foo'
- os.mkdir(path)
- m = metadata.from_path(path, archive_path=path, save_symlinks=True)
- WVPASSEQ(m.path, path)
- os.chmod(path, 0o000)
- metadata.from_path(path, archive_path=path, save_symlinks=True)
- if metadata.get_linux_file_attr:
- print('saved_errors:', helpers.saved_errors, file=sys.stderr)
- WVPASS(len(helpers.saved_errors) == 1)
- errmsg = _first_err()
- WVPASS(errmsg.startswith('read Linux attr'))
- clear_errors()
-
-
-def _linux_attr_supported(path):
- # Expects path to denote a regular file or a directory.
- if not metadata.get_linux_file_attr:
- return False
- try:
- metadata.get_linux_file_attr(path)
- except OSError as e:
- if e.errno in (errno.ENOTTY, errno.ENOSYS, errno.EOPNOTSUPP):
- return False
- else:
- raise
- return True
-
-
-@wvtest
-def test_apply_to_path_restricted_access():
- if is_superuser() or detect_fakeroot():
- return
- if sys.platform.startswith('cygwin'):
- return # chmod 000 isn't effective.
- with no_lingering_errors():
- with test_tempdir(b'bup-tmetadata-') as tmpdir:
- parent = tmpdir + b'/foo'
- path = parent + b'/bar'
- os.mkdir(parent)
- os.mkdir(path)
- clear_errors()
- if metadata.xattr:
- try:
- metadata.xattr.set(path, b'user.buptest', b'bup')
- except:
- print("failed to set test xattr")
- # ignore any failures here - maybe FS cannot do it
- pass
- m = metadata.from_path(path, archive_path=path, save_symlinks=True)
- WVPASSEQ(m.path, path)
- os.chmod(parent, 0o000)
- m.apply_to_path(path)
- print('saved_errors:', helpers.saved_errors, file=sys.stderr)
- expected_errors = ['utime: ']
- if m.linux_attr and _linux_attr_supported(tmpdir):
- expected_errors.append('Linux chattr: ')
- if metadata.xattr and m.linux_xattr:
- expected_errors.append("xattr.set ")
- WVPASS(len(helpers.saved_errors) == len(expected_errors))
- for i in range(len(expected_errors)):
- WVPASS(str(helpers.saved_errors[i]).startswith(expected_errors[i]))
- clear_errors()
-
-
-@wvtest
-def test_restore_over_existing_target():
- with no_lingering_errors():
- with test_tempdir(b'bup-tmetadata-') as tmpdir:
- path = tmpdir + b'/foo'
- os.mkdir(path)
- dir_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
- os.rmdir(path)
- open(path, 'w').close()
- file_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
- # Restore dir over file.
- WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
- WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
- # Restore dir over dir.
- WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
- WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
- # Restore file over dir.
- WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
- WVPASS(stat.S_ISREG(os.stat(path).st_mode))
- # Restore file over file.
- WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
- WVPASS(stat.S_ISREG(os.stat(path).st_mode))
- # Restore file over non-empty dir.
- os.remove(path)
- os.mkdir(path)
- open(path + b'/bar', 'w').close()
- WVEXCEPT(Exception, file_m.create_path, path, create_symlinks=True)
- # Restore dir over non-empty dir.
- os.remove(path + b'/bar')
- os.mkdir(path + b'/bar')
- WVEXCEPT(Exception, dir_m.create_path, path, create_symlinks=True)
-
-
-from bup.metadata import read_acl
-if not read_acl:
- @wvtest
- def POSIX1E_ACL_SUPPORT_IS_MISSING():
- pass
-
-
-from bup.metadata import xattr
-if xattr:
- def remove_selinux(attrs):
- return list(filter(lambda i: not i in (b'security.selinux', ),
- attrs))
-
- @wvtest
- def test_handling_of_incorrect_existing_linux_xattrs():
- if not is_superuser() or detect_fakeroot():
- WVMSG('skipping test -- not superuser')
- return
- if not setup_testfs():
- WVMSG('unable to load loop module; skipping dependent tests')
- return
- for f in glob.glob(b'testfs/*'):
- ex(b'rm', b'-rf', f)
- path = b'testfs/foo'
- open(path, 'w').close()
- xattr.set(path, b'foo', b'bar', namespace=xattr.NS_USER)
- m = metadata.from_path(path, archive_path=path, save_symlinks=True)
- xattr.set(path, b'baz', b'bax', namespace=xattr.NS_USER)
- m.apply_to_path(path, restore_numeric_ids=False)
- WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
- WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
- xattr.set(path, b'foo', b'baz', namespace=xattr.NS_USER)
- m.apply_to_path(path, restore_numeric_ids=False)
- WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
- WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
- xattr.remove(path, b'foo', namespace=xattr.NS_USER)
- m.apply_to_path(path, restore_numeric_ids=False)
- WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
- WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
- os.chdir(start_dir)
- cleanup_testfs()
+++ /dev/null
-
-from __future__ import absolute_import
-
-from wvtest import *
-
-from bup import options
-from buptest import no_lingering_errors
-
-
-@wvtest
-def test_optdict():
- with no_lingering_errors():
- d = options.OptDict({
- 'x': ('x', False),
- 'y': ('y', False),
- 'z': ('z', False),
- 'other_thing': ('other_thing', False),
- 'no_other_thing': ('other_thing', True),
- 'no_z': ('z', True),
- 'no_smart': ('smart', True),
- 'smart': ('smart', False),
- 'stupid': ('smart', True),
- 'no_smart': ('smart', False),
- })
- WVPASS('foo')
- d['x'] = 5
- d['y'] = 4
- d['z'] = 99
- d['no_other_thing'] = 5
- WVPASSEQ(d.x, 5)
- WVPASSEQ(d.y, 4)
- WVPASSEQ(d.z, 99)
- WVPASSEQ(d.no_z, False)
- WVPASSEQ(d.no_other_thing, True)
- WVEXCEPT(KeyError, lambda: d.p)
-
-
-invalid_optspec0 = """
-"""
-
-
-invalid_optspec1 = """
-prog <whatever>
-"""
-
-
-invalid_optspec2 = """
---
-x,y
-"""
-
-
-@wvtest
-def test_invalid_optspec():
- with no_lingering_errors():
- WVPASS(options.Options(invalid_optspec0).parse([]))
- WVPASS(options.Options(invalid_optspec1).parse([]))
- WVPASS(options.Options(invalid_optspec2).parse([]))
-
-
-optspec = """
-prog <optionset> [stuff...]
-prog [-t] <boggle>
---
-t test
-q,quiet quiet
-l,longoption= long option with parameters and a really really long description that will require wrapping
-p= short option with parameters
-onlylong long option with no short
-neveropt never called options
-deftest1= a default option with default [1]
-deftest2= a default option with [1] default [2]
-deftest3= a default option with [3] no actual default
-deftest4= a default option with [[square]]
-deftest5= a default option with "correct" [[square]
-s,smart,no-stupid disable stupidity
-x,extended,no-simple extended mode [2]
-#,compress= set compression level [5]
-"""
-
-@wvtest
-def test_options():
- with no_lingering_errors():
- o = options.Options(optspec)
- (opt,flags,extra) = o.parse(['-tttqp', 7, '--longoption', '19',
- 'hanky', '--onlylong', '-7'])
- WVPASSEQ(flags[0], ('-t', ''))
- WVPASSEQ(flags[1], ('-t', ''))
- WVPASSEQ(flags[2], ('-t', ''))
- WVPASSEQ(flags[3], ('-q', ''))
- WVPASSEQ(flags[4], ('-p', 7))
- WVPASSEQ(flags[5], ('--longoption', '19'))
- WVPASSEQ(extra, ['hanky'])
- WVPASSEQ((opt.t, opt.q, opt.p, opt.l, opt.onlylong,
- opt.neveropt), (3,1,7,19,1,None))
- WVPASSEQ((opt.deftest1, opt.deftest2, opt.deftest3, opt.deftest4,
- opt.deftest5), (1,2,None,None,'[square'))
- WVPASSEQ((opt.stupid, opt.no_stupid), (True, None))
- WVPASSEQ((opt.smart, opt.no_smart), (None, True))
- WVPASSEQ((opt.x, opt.extended, opt.no_simple), (2,2,2))
- WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (False,False,False))
- WVPASSEQ(opt['#'], 7)
- WVPASSEQ(opt.compress, 7)
-
- (opt,flags,extra) = o.parse(['--onlylong', '-t', '--no-onlylong',
- '--smart', '--simple'])
- WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, 0))
- WVPASSEQ((opt.stupid, opt.no_stupid), (False, True))
- WVPASSEQ((opt.smart, opt.no_smart), (True, False))
- WVPASSEQ((opt.x, opt.extended, opt.no_simple), (0,0,0))
- WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (True,True,True))
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-from binascii import unhexlify
-from errno import ELOOP, ENOTDIR
-from os import symlink
-from stat import S_IFDIR
-from sys import stderr
-from time import localtime, strftime
-
-from wvtest import *
-
-from bup import git, path, vfs
-from bup.compat import environ
-from bup.io import path_msg
-from bup.metadata import Metadata
-from bup.repo import LocalRepo, RemoteRepo
-from bup.test.vfs import tree_dict
-from buptest import ex, exo, no_lingering_errors, test_tempdir
-
-bup_path = path.exe()
-
-## The clear_cache() calls below are to make sure that the test starts
-## from a known state since at the moment the cache entry for a given
-## item (like a commit) can change. For example, its meta value might
-## be promoted from a mode to a Metadata instance once the tree it
-## refers to is traversed.
-
-def prep_and_test_repo(name, create_repo, test_repo):
- with no_lingering_errors():
- with test_tempdir(b'bup-t' + name) as tmpdir:
- bup_dir = tmpdir + b'/bup'
- environ[b'GIT_DIR'] = bup_dir
- environ[b'BUP_DIR'] = bup_dir
- ex((bup_path, b'init'))
- git.repodir = bup_dir
- with create_repo(bup_dir) as repo:
- test_repo(repo, tmpdir)
-
-# Currently, we just test through the repos since LocalRepo resolve is
-# just a straight redirection to vfs.resolve.
-
-def test_resolve(repo, tmpdir):
- data_path = tmpdir + b'/src'
- resolve = repo.resolve
- save_time = 100000
- save_time_str = strftime('%Y-%m-%d-%H%M%S', localtime(save_time)).encode('ascii')
- os.mkdir(data_path)
- os.mkdir(data_path + b'/dir')
- with open(data_path + b'/file', 'wb+') as tmpfile:
- tmpfile.write(b'canary\n')
- symlink(b'file', data_path + b'/file-symlink')
- symlink(b'dir', data_path + b'/dir-symlink')
- symlink(b'not-there', data_path + b'/bad-symlink')
- ex((bup_path, b'index', b'-v', data_path))
- ex((bup_path, b'save', b'-d', b'%d' % save_time, b'-tvvn', b'test',
- b'--strip', data_path))
- ex((bup_path, b'tag', b'test-tag', b'test'))
-
- tip_hash = exo((b'git', b'show-ref', b'refs/heads/test'))[0]
- tip_oidx = tip_hash.strip().split()[0]
- tip_oid = unhexlify(tip_oidx)
- tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
- tip_oidx))[0].strip()
- tip_tree_oid = unhexlify(tip_tree_oidx)
- tip_tree = tree_dict(repo, tip_tree_oid)
- test_revlist_w_meta = vfs.RevList(meta=tip_tree[b'.'].meta,
- oid=tip_oid)
- expected_latest_item = vfs.Commit(meta=S_IFDIR | 0o755,
- oid=tip_tree_oid,
- coid=tip_oid)
- expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
- oid=tip_tree_oid,
- coid=tip_oid)
- expected_latest_link = vfs.FakeLink(meta=vfs.default_symlink_mode,
- target=save_time_str)
- expected_test_tag_item = expected_latest_item
-
- wvstart('resolve: /')
- vfs.clear_cache()
- res = resolve(b'/')
- wvpasseq(1, len(res))
- wvpasseq(((b'', vfs._root),), res)
- ignore, root_item = res[0]
- root_content = frozenset(vfs.contents(repo, root_item))
- wvpasseq(frozenset([(b'.', root_item),
- (b'.tag', vfs._tags),
- (b'test', test_revlist_w_meta)]),
- root_content)
- for path in (b'//', b'/.', b'/./', b'/..', b'/../',
- b'/test/latest/dir/../../..',
- b'/test/latest/dir/../../../',
- b'/test/latest/dir/../../../.',
- b'/test/latest/dir/../../..//',
- b'/test//latest/dir/../../..',
- b'/test/./latest/dir/../../..',
- b'/test/././latest/dir/../../..',
- b'/test/.//./latest/dir/../../..',
- b'/test//.//.//latest/dir/../../..'
- b'/test//./latest/dir/../../..'):
- wvstart('resolve: ' + path_msg(path))
- vfs.clear_cache()
- res = resolve(path)
- wvpasseq(((b'', vfs._root),), res)
-
- wvstart('resolve: /.tag')
- vfs.clear_cache()
- res = resolve(b'/.tag')
- wvpasseq(2, len(res))
- wvpasseq(((b'', vfs._root), (b'.tag', vfs._tags)),
- res)
- ignore, tag_item = res[1]
- tag_content = frozenset(vfs.contents(repo, tag_item))
- wvpasseq(frozenset([(b'.', tag_item),
- (b'test-tag', expected_test_tag_item)]),
- tag_content)
-
- wvstart('resolve: /test')
- vfs.clear_cache()
- res = resolve(b'/test')
- wvpasseq(2, len(res))
- wvpasseq(((b'', vfs._root), (b'test', test_revlist_w_meta)), res)
- ignore, test_item = res[1]
- test_content = frozenset(vfs.contents(repo, test_item))
- # latest has metadata here due to caching
- wvpasseq(frozenset([(b'.', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'latest', expected_latest_link)]),
- test_content)
-
- wvstart('resolve: /test/latest')
- vfs.clear_cache()
- res = resolve(b'/test/latest')
- wvpasseq(3, len(res))
- expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
- oid=tip_tree_oid,
- coid=tip_oid)
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta))
- wvpasseq(expected, res)
- ignore, latest_item = res[2]
- latest_content = frozenset(vfs.contents(repo, latest_item))
- expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
- for x in (tip_tree[name]
- for name in (b'.',
- b'bad-symlink',
- b'dir',
- b'dir-symlink',
- b'file',
- b'file-symlink')))
- wvpasseq(expected, latest_content)
-
- wvstart('resolve: /test/latest/file')
- vfs.clear_cache()
- res = resolve(b'/test/latest/file')
- wvpasseq(4, len(res))
- expected_file_item_w_meta = vfs.Item(meta=tip_tree[b'file'].meta,
- oid=tip_tree[b'file'].oid)
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'file', expected_file_item_w_meta))
- wvpasseq(expected, res)
-
- wvstart('resolve: /test/latest/bad-symlink')
- vfs.clear_cache()
- res = resolve(b'/test/latest/bad-symlink')
- wvpasseq(4, len(res))
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'not-there', None))
- wvpasseq(expected, res)
-
- wvstart('resolve nofollow: /test/latest/bad-symlink')
- vfs.clear_cache()
- res = resolve(b'/test/latest/bad-symlink', follow=False)
- wvpasseq(4, len(res))
- bad_symlink_value = tip_tree[b'bad-symlink']
- expected_bad_symlink_item_w_meta = vfs.Item(meta=bad_symlink_value.meta,
- oid=bad_symlink_value.oid)
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'bad-symlink', expected_bad_symlink_item_w_meta))
- wvpasseq(expected, res)
-
- wvstart('resolve: /test/latest/file-symlink')
- vfs.clear_cache()
- res = resolve(b'/test/latest/file-symlink')
- wvpasseq(4, len(res))
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'file', expected_file_item_w_meta))
- wvpasseq(expected, res)
-
- wvstart('resolve nofollow: /test/latest/file-symlink')
- vfs.clear_cache()
- res = resolve(b'/test/latest/file-symlink', follow=False)
- wvpasseq(4, len(res))
- file_symlink_value = tip_tree[b'file-symlink']
- expected_file_symlink_item_w_meta = vfs.Item(meta=file_symlink_value.meta,
- oid=file_symlink_value.oid)
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'file-symlink', expected_file_symlink_item_w_meta))
- wvpasseq(expected, res)
-
- wvstart('resolve: /test/latest/missing')
- vfs.clear_cache()
- res = resolve(b'/test/latest/missing')
- wvpasseq(4, len(res))
- name, item = res[-1]
- wvpasseq(b'missing', name)
- wvpass(item is None)
-
- for path in (b'/test/latest/file/',
- b'/test/latest/file/.',
- b'/test/latest/file/..',
- b'/test/latest/file/../',
- b'/test/latest/file/../.',
- b'/test/latest/file/../..',
- b'/test/latest/file/foo'):
- wvstart('resolve: ' + path_msg(path))
- vfs.clear_cache()
- try:
- resolve(path)
- except vfs.IOError as res_ex:
- wvpasseq(ENOTDIR, res_ex.errno)
- wvpasseq([b'', b'test', save_time_str, b'file'],
- [name for name, item in res_ex.terminus])
-
- for path in (b'/test/latest/file-symlink/',
- b'/test/latest/file-symlink/.',
- b'/test/latest/file-symlink/..',
- b'/test/latest/file-symlink/../',
- b'/test/latest/file-symlink/../.',
- b'/test/latest/file-symlink/../..'):
- wvstart('resolve nofollow: ' + path_msg(path))
- vfs.clear_cache()
- try:
- resolve(path, follow=False)
- except vfs.IOError as res_ex:
- wvpasseq(ENOTDIR, res_ex.errno)
- wvpasseq([b'', b'test', save_time_str, b'file'],
- [name for name, item in res_ex.terminus])
-
- wvstart('resolve: non-directory parent')
- vfs.clear_cache()
- file_res = resolve(b'/test/latest/file')
- try:
- resolve(b'foo', parent=file_res)
- except vfs.IOError as res_ex:
- wvpasseq(ENOTDIR, res_ex.errno)
- wvpasseq(None, res_ex.terminus)
-
- wvstart('resolve nofollow: /test/latest/dir-symlink')
- vfs.clear_cache()
- res = resolve(b'/test/latest/dir-symlink', follow=False)
- wvpasseq(4, len(res))
- dir_symlink_value = tip_tree[b'dir-symlink']
- expected_dir_symlink_item_w_meta = vfs.Item(meta=dir_symlink_value.meta,
- oid=dir_symlink_value.oid)
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'dir-symlink', expected_dir_symlink_item_w_meta))
- wvpasseq(expected, res)
-
- dir_value = tip_tree[b'dir']
- expected_dir_item = vfs.Item(oid=dir_value.oid,
- meta=tree_dict(repo, dir_value.oid)[b'.'].meta)
- expected = ((b'', vfs._root),
- (b'test', test_revlist_w_meta),
- (save_time_str, expected_latest_item_w_meta),
- (b'dir', expected_dir_item))
- def lresolve(*args, **keys):
- return resolve(*args, **dict(keys, follow=False))
- for resname, resolver in (('resolve', resolve),
- ('resolve nofollow', lresolve)):
- for path in (b'/test/latest/dir-symlink/',
- b'/test/latest/dir-symlink/.'):
- wvstart(resname + ': ' + path_msg(path))
- vfs.clear_cache()
- res = resolver(path)
- wvpasseq(4, len(res))
- wvpasseq(expected, res)
- wvstart('resolve: /test/latest/dir-symlink')
- vfs.clear_cache()
- res = resolve(path)
- wvpasseq(4, len(res))
- wvpasseq(expected, res)
-
-@wvtest
-def test_local_resolve():
- prep_and_test_repo(b'local-vfs-resolve',
- lambda x: LocalRepo(repo_dir=x), test_resolve)
-
-@wvtest
-def test_remote_resolve():
- prep_and_test_repo(b'remote-vfs-resolve',
- lambda x: RemoteRepo(x), test_resolve)
-
-def test_resolve_loop(repo, tmpdir):
- data_path = tmpdir + b'/src'
- os.mkdir(data_path)
- symlink(b'loop', data_path + b'/loop')
- ex((bup_path, b'init'))
- ex((bup_path, b'index', b'-v', data_path))
- save_utc = 100000
- ex((bup_path, b'save', b'-d', b'%d' % save_utc, b'-tvvn', b'test', b'--strip',
- data_path))
- save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
- try:
- wvpasseq('this call should never return',
- repo.resolve(b'/test/%s/loop' % save_name))
- except vfs.IOError as res_ex:
- wvpasseq(ELOOP, res_ex.errno)
- wvpasseq([b'', b'test', save_name, b'loop'],
- [name for name, item in res_ex.terminus])
-
-@wvtest
-def test_local_resolve_loop():
- prep_and_test_repo(b'local-vfs-resolve-loop',
- lambda x: LocalRepo(x), test_resolve_loop)
-
-@wvtest
-def test_remote_resolve_loop():
- prep_and_test_repo(b'remote-vfs-resolve-loop',
- lambda x: RemoteRepo(x), test_resolve_loop)
-
-# FIXME: add tests for the want_meta=False cases.
+++ /dev/null
-
-from __future__ import absolute_import
-
-from wvtest import *
-
-from bup import shquote
-from buptest import no_lingering_errors
-
-
-def qst(line):
- return [word for offset,word in shquote.quotesplit(line)]
-
-@wvtest
-def test_shquote():
- with no_lingering_errors():
- WVPASSEQ(qst(b""" this is basic \t\n\r text """),
- [b'this', b'is', b'basic', b'text'])
- WVPASSEQ(qst(br""" \"x\" "help" 'yelp' """), [b'"x"', b'help', b'yelp'])
- WVPASSEQ(qst(br""" "'\"\"'" '\"\'' """), [b"'\"\"'", b'\\"\''])
-
- WVPASSEQ(shquote.quotesplit(b' this is "unfinished'),
- [(2, b'this'), (7, b'is'), (10, b'unfinished')])
-
- WVPASSEQ(shquote.quotesplit(b'"silly"\'will'),
- [(0, b'silly'), (7, b'will')])
-
- WVPASSEQ(shquote.unfinished_word(b'this is a "billy" "goat'),
- (b'"', b'goat'))
- WVPASSEQ(shquote.unfinished_word(b"'x"),
- (b"'", b'x'))
- WVPASSEQ(shquote.unfinished_word(b"abra cadabra "),
- (None, b''))
- WVPASSEQ(shquote.unfinished_word(b"abra cadabra"),
- (None, b'cadabra'))
-
- qtype, word = shquote.unfinished_word(b"this is /usr/loc")
- WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
- b"al")
- qtype, word = shquote.unfinished_word(b"this is '/usr/loc")
- WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
- b"al'")
- qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
- WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
- b"al\"")
- qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
- WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", False),
- b"al")
- qtype, word = shquote.unfinished_word(b"this is \\ hammer\\ \"")
- WVPASSEQ(word, b' hammer "')
- WVPASSEQ(shquote.what_to_add(qtype, word, b" hammer \"time\"", True),
- b"time\\\"")
-
- WVPASSEQ(shquote.quotify_list([b'a', b'', b'"word"', b"'third'", b"'",
- b"x y"]),
- b"a '' '\"word\"' \"'third'\" \"'\" 'x y'")
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-from binascii import unhexlify
-from collections import namedtuple
-from errno import ELOOP, ENOTDIR
-from io import BytesIO
-from os import symlink
-from random import Random, randint
-from stat import S_IFDIR, S_IFLNK, S_IFREG, S_ISDIR, S_ISREG
-from sys import stderr
-from time import localtime, strftime, tzset
-
-from wvtest import *
-
-from bup._helpers import write_random
-from bup import git, metadata, vfs
-from bup.compat import environ, fsencode, items, range
-from bup.git import BUP_CHUNKED
-from bup.helpers import exc, shstr
-from bup.metadata import Metadata
-from bup.repo import LocalRepo
-from bup.test.vfs import tree_dict
-from buptest import ex, exo, no_lingering_errors, test_tempdir
-
-top_dir = b'../../..'
-bup_tmp = os.path.realpath(b'../../../t/tmp')
-bup_path = top_dir + b'/bup'
-start_dir = os.getcwd()
-
-def ex(cmd, **kwargs):
- print(shstr(cmd), file=stderr)
- return exc(cmd, **kwargs)
-
-@wvtest
-def test_default_modes():
- wvpasseq(S_IFREG | 0o644, vfs.default_file_mode)
- wvpasseq(S_IFDIR | 0o755, vfs.default_dir_mode)
- wvpasseq(S_IFLNK | 0o755, vfs.default_symlink_mode)
-
-@wvtest
-def test_cache_behavior():
- orig_max = vfs._cache_max_items
- try:
- vfs._cache_max_items = 2
- vfs.clear_cache()
- wvpasseq({}, vfs._cache)
- wvpasseq([], vfs._cache_keys)
- wvfail(vfs._cache_keys)
- wvexcept(Exception, vfs.cache_notice, b'x', 1)
- key_0 = b'itm:' + b'\0' * 20
- key_1 = b'itm:' + b'\1' * 20
- key_2 = b'itm:' + b'\2' * 20
- vfs.cache_notice(key_0, b'something')
- wvpasseq({key_0 : b'something'}, vfs._cache)
- wvpasseq([key_0], vfs._cache_keys)
- vfs.cache_notice(key_1, b'something else')
- wvpasseq({key_0 : b'something', key_1 : b'something else'}, vfs._cache)
- wvpasseq(frozenset([key_0, key_1]), frozenset(vfs._cache_keys))
- vfs.cache_notice(key_2, b'and also')
- wvpasseq(2, len(vfs._cache))
- wvpass(frozenset(items(vfs._cache))
- < frozenset(items({key_0 : b'something',
- key_1 : b'something else',
- key_2 : b'and also'})))
- wvpasseq(2, len(vfs._cache_keys))
- wvpass(frozenset(vfs._cache_keys) < frozenset([key_0, key_1, key_2]))
- vfs.clear_cache()
- wvpasseq({}, vfs._cache)
- wvpasseq([], vfs._cache_keys)
- finally:
- vfs._cache_max_items = orig_max
- vfs.clear_cache()
-
-## The clear_cache() calls below are to make sure that the test starts
-## from a known state since at the moment the cache entry for a given
-## item (like a commit) can change. For example, its meta value might
-## be promoted from a mode to a Metadata instance once the tree it
-## refers to is traversed.
-
-def run_augment_item_meta_tests(repo,
- file_path, file_size,
- link_path, link_target):
- _, file_item = vfs.resolve(repo, file_path)[-1]
- _, link_item = vfs.resolve(repo, link_path, follow=False)[-1]
- wvpass(isinstance(file_item.meta, Metadata))
- wvpass(isinstance(link_item.meta, Metadata))
- # Note: normally, modifying item.meta values is forbidden
- file_item.meta.size = file_item.meta.size or vfs.item_size(repo, file_item)
- link_item.meta.size = link_item.meta.size or vfs.item_size(repo, link_item)
-
- ## Ensure a fully populated item is left alone
- augmented = vfs.augment_item_meta(repo, file_item)
- wvpass(augmented is file_item)
- wvpass(augmented.meta is file_item.meta)
- augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
- wvpass(augmented is file_item)
- wvpass(augmented.meta is file_item.meta)
-
- ## Ensure a missing size is handled poperly
- file_item.meta.size = None
- augmented = vfs.augment_item_meta(repo, file_item)
- wvpass(augmented is file_item)
- wvpass(augmented.meta is file_item.meta)
- augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
- wvpass(augmented is not file_item)
- wvpasseq(file_size, augmented.meta.size)
-
- ## Ensure a meta mode is handled properly
- mode_item = file_item._replace(meta=vfs.default_file_mode)
- augmented = vfs.augment_item_meta(repo, mode_item)
- augmented_w_size = vfs.augment_item_meta(repo, mode_item, include_size=True)
- for item in (augmented, augmented_w_size):
- meta = item.meta
- wvpass(item is not file_item)
- wvpass(isinstance(meta, Metadata))
- wvpasseq(vfs.default_file_mode, meta.mode)
- wvpasseq((None, None, 0, 0, 0),
- (meta.uid, meta.gid, meta.atime, meta.mtime, meta.ctime))
- wvpass(augmented.meta.size is None)
- wvpasseq(file_size, augmented_w_size.meta.size)
-
- ## Ensure symlinks are handled properly
- mode_item = link_item._replace(meta=vfs.default_symlink_mode)
- augmented = vfs.augment_item_meta(repo, mode_item)
- wvpass(augmented is not mode_item)
- wvpass(isinstance(augmented.meta, Metadata))
- wvpasseq(link_target, augmented.meta.symlink_target)
- wvpasseq(len(link_target), augmented.meta.size)
- augmented = vfs.augment_item_meta(repo, mode_item, include_size=True)
- wvpass(augmented is not mode_item)
- wvpass(isinstance(augmented.meta, Metadata))
- wvpasseq(link_target, augmented.meta.symlink_target)
- wvpasseq(len(link_target), augmented.meta.size)
-
-
-@wvtest
-def test_item_mode():
- with no_lingering_errors():
- mode = S_IFDIR | 0o755
- meta = metadata.from_path(b'.')
- oid = b'\0' * 20
- wvpasseq(mode, vfs.item_mode(vfs.Item(oid=oid, meta=mode)))
- wvpasseq(meta.mode, vfs.item_mode(vfs.Item(oid=oid, meta=meta)))
-
-@wvtest
-def test_reverse_suffix_duplicates():
- suffix = lambda x: tuple(vfs._reverse_suffix_duplicates(x))
- wvpasseq((b'x',), suffix((b'x',)))
- wvpasseq((b'x', b'y'), suffix((b'x', b'y')))
- wvpasseq((b'x-1', b'x-0'), suffix((b'x',) * 2))
- wvpasseq([b'x-%02d' % n for n in reversed(range(11))],
- list(suffix((b'x',) * 11)))
- wvpasseq((b'x-1', b'x-0', b'y'), suffix((b'x', b'x', b'y')))
- wvpasseq((b'x', b'y-1', b'y-0'), suffix((b'x', b'y', b'y')))
- wvpasseq((b'x', b'y-1', b'y-0', b'z'), suffix((b'x', b'y', b'y', b'z')))
-
-@wvtest
-def test_misc():
- with no_lingering_errors():
- with test_tempdir(b'bup-tvfs-') as tmpdir:
- bup_dir = tmpdir + b'/bup'
- environ[b'GIT_DIR'] = bup_dir
- environ[b'BUP_DIR'] = bup_dir
- git.repodir = bup_dir
- data_path = tmpdir + b'/src'
- os.mkdir(data_path)
- with open(data_path + b'/file', 'wb+') as tmpfile:
- tmpfile.write(b'canary\n')
- symlink(b'file', data_path + b'/symlink')
- ex((bup_path, b'init'))
- ex((bup_path, b'index', b'-v', data_path))
- ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
- b'--strip', data_path))
- repo = LocalRepo()
-
- wvstart('readlink')
- ls_tree = exo((b'git', b'ls-tree', b'test', b'symlink')).out
- mode, typ, oidx, name = ls_tree.strip().split(None, 3)
- assert name == b'symlink'
- link_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
- wvpasseq(b'file', vfs.readlink(repo, link_item))
-
- ls_tree = exo((b'git', b'ls-tree', b'test', b'file')).out
- mode, typ, oidx, name = ls_tree.strip().split(None, 3)
- assert name == b'file'
- file_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
- wvexcept(Exception, vfs.readlink, repo, file_item)
-
- wvstart('item_size')
- wvpasseq(4, vfs.item_size(repo, link_item))
- wvpasseq(7, vfs.item_size(repo, file_item))
- meta = metadata.from_path(fsencode(__file__))
- meta.size = 42
- fake_item = file_item._replace(meta=meta)
- wvpasseq(42, vfs.item_size(repo, fake_item))
-
- _, fakelink_item = vfs.resolve(repo, b'/test/latest', follow=False)[-1]
- wvpasseq(17, vfs.item_size(repo, fakelink_item))
-
- wvstart('augment_item_meta')
- run_augment_item_meta_tests(repo,
- b'/test/latest/file', 7,
- b'/test/latest/symlink', b'file')
-
- wvstart('copy_item')
- # FIXME: this caused StopIteration
- #_, file_item = vfs.resolve(repo, '/file')[-1]
- _, file_item = vfs.resolve(repo, b'/test/latest/file')[-1]
- file_copy = vfs.copy_item(file_item)
- wvpass(file_copy is not file_item)
- wvpass(file_copy.meta is not file_item.meta)
- wvpass(isinstance(file_copy, tuple))
- wvpass(file_item.meta.user)
- wvpass(file_copy.meta.user)
- file_copy.meta.user = None
- wvpass(file_item.meta.user)
-
-def write_sized_random_content(parent_dir, size, seed):
- verbose = 0
- with open(b'%s/%d' % (parent_dir, size), 'wb') as f:
- write_random(f.fileno(), size, seed, verbose)
-
-def validate_vfs_streaming_read(repo, item, expected_path, read_sizes):
- for read_size in read_sizes:
- with open(expected_path, 'rb') as expected:
- with vfs.fopen(repo, item) as actual:
- ex_buf = expected.read(read_size)
- act_buf = actual.read(read_size)
- while ex_buf and act_buf:
- wvpassge(read_size, len(ex_buf))
- wvpassge(read_size, len(act_buf))
- wvpasseq(len(ex_buf), len(act_buf))
- wvpass(ex_buf == act_buf)
- ex_buf = expected.read(read_size)
- act_buf = actual.read(read_size)
- wvpasseq(b'', ex_buf)
- wvpasseq(b'', act_buf)
-
-def validate_vfs_seeking_read(repo, item, expected_path, read_sizes):
- def read_act(act_pos):
- with vfs.fopen(repo, item) as actual:
- actual.seek(act_pos)
- wvpasseq(act_pos, actual.tell())
- act_buf = actual.read(read_size)
- act_pos += len(act_buf)
- wvpasseq(act_pos, actual.tell())
- return act_pos, act_buf
-
- for read_size in read_sizes:
- with open(expected_path, 'rb') as expected:
- ex_buf = expected.read(read_size)
- act_buf = None
- act_pos = 0
- while ex_buf:
- act_pos, act_buf = read_act(act_pos)
- wvpassge(read_size, len(ex_buf))
- wvpassge(read_size, len(act_buf))
- wvpasseq(len(ex_buf), len(act_buf))
- wvpass(ex_buf == act_buf)
- if not act_buf:
- break
- ex_buf = expected.read(read_size)
- else: # hit expected eof first
- act_pos, act_buf = read_act(act_pos)
- wvpasseq(b'', ex_buf)
- wvpasseq(b'', act_buf)
-
-@wvtest
-def test_read_and_seek():
- # Write a set of randomly sized files containing random data whose
- # names are their sizes, and then verify that what we get back
- # from the vfs when seeking and reading with various block sizes
- # matches the original content.
- with no_lingering_errors():
- with test_tempdir(b'bup-tvfs-read-') as tmpdir:
- resolve = vfs.resolve
- bup_dir = tmpdir + b'/bup'
- environ[b'GIT_DIR'] = bup_dir
- environ[b'BUP_DIR'] = bup_dir
- git.repodir = bup_dir
- repo = LocalRepo()
- data_path = tmpdir + b'/src'
- os.mkdir(data_path)
- seed = randint(-(1 << 31), (1 << 31) - 1)
- rand = Random()
- rand.seed(seed)
- print('test_read seed:', seed, file=sys.stderr)
- max_size = 2 * 1024 * 1024
- sizes = set((rand.randint(1, max_size) for _ in range(5)))
- sizes.add(1)
- sizes.add(max_size)
- for size in sizes:
- write_sized_random_content(data_path, size, seed)
- ex((bup_path, b'init'))
- ex((bup_path, b'index', b'-v', data_path))
- ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
- b'--strip', data_path))
- read_sizes = set((rand.randint(1, max_size) for _ in range(10)))
- sizes.add(1)
- sizes.add(max_size)
- print('test_read src sizes:', sizes, file=sys.stderr)
- print('test_read read sizes:', read_sizes, file=sys.stderr)
- for size in sizes:
- res = resolve(repo, b'/test/latest/' + str(size).encode('ascii'))
- _, item = res[-1]
- wvpasseq(size, vfs.item_size(repo, res[-1][1]))
- validate_vfs_streaming_read(repo, item,
- b'%s/%d' % (data_path, size),
- read_sizes)
- validate_vfs_seeking_read(repo, item,
- b'%s/%d' % (data_path, size),
- read_sizes)
-
-@wvtest
-def test_contents_with_mismatched_bupm_git_ordering():
- with no_lingering_errors():
- with test_tempdir(b'bup-tvfs-') as tmpdir:
- bup_dir = tmpdir + b'/bup'
- environ[b'GIT_DIR'] = bup_dir
- environ[b'BUP_DIR'] = bup_dir
- git.repodir = bup_dir
- data_path = tmpdir + b'/src'
- os.mkdir(data_path)
- os.mkdir(data_path + b'/foo')
- with open(data_path + b'/foo.', 'wb+') as tmpfile:
- tmpfile.write(b'canary\n')
- ex((bup_path, b'init'))
- ex((bup_path, b'index', b'-v', data_path))
- save_utc = 100000
- save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
- ex((bup_path, b'save', b'-tvvn', b'test', b'-d', b'%d' % save_utc,
- b'--strip', data_path))
- repo = LocalRepo()
- tip_sref = exo((b'git', b'show-ref', b'refs/heads/test')).out
- tip_oidx = tip_sref.strip().split()[0]
- tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
- tip_oidx)).out.strip()
- tip_tree_oid = unhexlify(tip_tree_oidx)
- tip_tree = tree_dict(repo, tip_tree_oid)
-
- name, item = vfs.resolve(repo, b'/test/latest')[2]
- wvpasseq(save_name, name)
- expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
- for x in (tip_tree[name]
- for name in (b'.', b'foo', b'foo.')))
- contents = tuple(vfs.contents(repo, item))
- wvpasseq(expected, frozenset(contents))
- # Spot check, in case tree_dict shares too much code with the vfs
- name, item = next(((n, i) for n, i in contents if n == b'foo'))
- wvpass(S_ISDIR(item.meta))
- name, item = next(((n, i) for n, i in contents if n == b'foo.'))
- wvpass(S_ISREG(item.meta.mode))
-
-@wvtest
-def test_duplicate_save_dates():
- with no_lingering_errors():
- with test_tempdir(b'bup-tvfs-') as tmpdir:
- bup_dir = tmpdir + b'/bup'
- environ[b'GIT_DIR'] = bup_dir
- environ[b'BUP_DIR'] = bup_dir
- environ[b'TZ'] = b'UTC'
- tzset()
- git.repodir = bup_dir
- data_path = tmpdir + b'/src'
- os.mkdir(data_path)
- with open(data_path + b'/file', 'wb+') as tmpfile:
- tmpfile.write(b'canary\n')
- ex((b'env',))
- ex((bup_path, b'init'))
- ex((bup_path, b'index', b'-v', data_path))
- for i in range(11):
- ex((bup_path, b'save', b'-d', b'100000', b'-n', b'test',
- data_path))
- repo = LocalRepo()
- res = vfs.resolve(repo, b'/test')
- wvpasseq(2, len(res))
- name, revlist = res[-1]
- wvpasseq(b'test', name)
- wvpasseq((b'.',
- b'1970-01-02-034640-00',
- b'1970-01-02-034640-01',
- b'1970-01-02-034640-02',
- b'1970-01-02-034640-03',
- b'1970-01-02-034640-04',
- b'1970-01-02-034640-05',
- b'1970-01-02-034640-06',
- b'1970-01-02-034640-07',
- b'1970-01-02-034640-08',
- b'1970-01-02-034640-09',
- b'1970-01-02-034640-10',
- b'latest'),
- tuple(sorted(x[0] for x in vfs.contents(repo, revlist))))
-
-@wvtest
-def test_item_read_write():
- with no_lingering_errors():
- x = vfs.Root(meta=13)
- stream = BytesIO()
- vfs.write_item(stream, x)
- print('stream:', repr(stream.getvalue()), stream.tell(), file=sys.stderr)
- stream.seek(0)
- wvpasseq(x, vfs.read_item(stream))
+++ /dev/null
-
-from __future__ import absolute_import
-from io import BytesIO
-
-from wvtest import *
-
-from bup import vint
-from buptest import no_lingering_errors
-
-
-def encode_and_decode_vuint(x):
- f = BytesIO()
- vint.write_vuint(f, x)
- return vint.read_vuint(BytesIO(f.getvalue()))
-
-
-@wvtest
-def test_vuint():
- with no_lingering_errors():
- for x in (0, 1, 42, 128, 10**16):
- WVPASSEQ(encode_and_decode_vuint(x), x)
- WVEXCEPT(Exception, vint.write_vuint, BytesIO(), -1)
- WVEXCEPT(EOFError, vint.read_vuint, BytesIO())
-
-
-def encode_and_decode_vint(x):
- f = BytesIO()
- vint.write_vint(f, x)
- return vint.read_vint(BytesIO(f.getvalue()))
-
-
-@wvtest
-def test_vint():
- with no_lingering_errors():
- values = (0, 1, 42, 64, 10**16)
- for x in values:
- WVPASSEQ(encode_and_decode_vint(x), x)
- for x in [-x for x in values]:
- WVPASSEQ(encode_and_decode_vint(x), x)
- WVEXCEPT(EOFError, vint.read_vint, BytesIO())
- WVEXCEPT(EOFError, vint.read_vint, BytesIO(b"\x80\x80"))
-
-
-def encode_and_decode_bvec(x):
- f = BytesIO()
- vint.write_bvec(f, x)
- return vint.read_bvec(BytesIO(f.getvalue()))
-
-
-@wvtest
-def test_bvec():
- with no_lingering_errors():
- values = (b'', b'x', b'foo', b'\0', b'\0foo', b'foo\0bar\0')
- for x in values:
- WVPASSEQ(encode_and_decode_bvec(x), x)
- WVEXCEPT(EOFError, vint.read_bvec, BytesIO())
- outf = BytesIO()
- for x in (b'foo', b'bar', b'baz', b'bax'):
- vint.write_bvec(outf, x)
- inf = BytesIO(outf.getvalue())
- WVPASSEQ(vint.read_bvec(inf), b'foo')
- WVPASSEQ(vint.read_bvec(inf), b'bar')
- vint.skip_bvec(inf)
- WVPASSEQ(vint.read_bvec(inf), b'bax')
-
-
-def pack_and_unpack(types, *values):
- data = vint.pack(types, *values)
- return vint.unpack(types, data)
-
-
-@wvtest
-def test_pack_and_unpack():
- with no_lingering_errors():
- tests = [('', []),
- ('s', [b'foo']),
- ('ss', [b'foo', b'bar']),
- ('sV', [b'foo', 0]),
- ('sv', [b'foo', -1]),
- ('V', [0]),
- ('Vs', [0, b'foo']),
- ('VV', [0, 1]),
- ('Vv', [0, -1]),
- ('v', [0]),
- ('vs', [0, b'foo']),
- ('vV', [0, 1]),
- ('vv', [0, -1])]
- for test in tests:
- (types, values) = test
- WVPASSEQ(pack_and_unpack(types, *values), values)
- WVEXCEPT(Exception, vint.pack, 's')
- WVEXCEPT(Exception, vint.pack, 's', 'foo', 'bar')
- WVEXCEPT(Exception, vint.pack, 'x', 1)
- WVEXCEPT(Exception, vint.unpack, 's', '')
- WVEXCEPT(Exception, vint.unpack, 'x', '')
+++ /dev/null
-
-from __future__ import absolute_import
-import math, tempfile, subprocess
-
-from wvtest import *
-
-import bup._helpers as _helpers
-from bup import xstat
-from buptest import no_lingering_errors, test_tempdir
-
-
-@wvtest
-def test_fstime():
- with no_lingering_errors():
- WVPASSEQ(xstat.timespec_to_nsecs((0, 0)), 0)
- WVPASSEQ(xstat.timespec_to_nsecs((1, 0)), 10**9)
- WVPASSEQ(xstat.timespec_to_nsecs((0, 10**9 / 2)), 500000000)
- WVPASSEQ(xstat.timespec_to_nsecs((1, 10**9 / 2)), 1500000000)
- WVPASSEQ(xstat.timespec_to_nsecs((-1, 0)), -10**9)
- WVPASSEQ(xstat.timespec_to_nsecs((-1, 10**9 / 2)), -500000000)
- WVPASSEQ(xstat.timespec_to_nsecs((-2, 10**9 / 2)), -1500000000)
- WVPASSEQ(xstat.timespec_to_nsecs((0, -1)), -1)
- WVPASSEQ(type(xstat.timespec_to_nsecs((2, 22222222))), type(0))
- WVPASSEQ(type(xstat.timespec_to_nsecs((-2, 22222222))), type(0))
-
- WVPASSEQ(xstat.nsecs_to_timespec(0), (0, 0))
- WVPASSEQ(xstat.nsecs_to_timespec(10**9), (1, 0))
- WVPASSEQ(xstat.nsecs_to_timespec(500000000), (0, 10**9 / 2))
- WVPASSEQ(xstat.nsecs_to_timespec(1500000000), (1, 10**9 / 2))
- WVPASSEQ(xstat.nsecs_to_timespec(-10**9), (-1, 0))
- WVPASSEQ(xstat.nsecs_to_timespec(-500000000), (-1, 10**9 / 2))
- WVPASSEQ(xstat.nsecs_to_timespec(-1500000000), (-2, 10**9 / 2))
- x = xstat.nsecs_to_timespec(1977777778)
- WVPASSEQ(type(x[0]), type(0))
- WVPASSEQ(type(x[1]), type(0))
- x = xstat.nsecs_to_timespec(-1977777778)
- WVPASSEQ(type(x[0]), type(0))
- WVPASSEQ(type(x[1]), type(0))
-
- WVPASSEQ(xstat.nsecs_to_timeval(0), (0, 0))
- WVPASSEQ(xstat.nsecs_to_timeval(10**9), (1, 0))
- WVPASSEQ(xstat.nsecs_to_timeval(500000000), (0, (10**9 / 2) / 1000))
- WVPASSEQ(xstat.nsecs_to_timeval(1500000000), (1, (10**9 / 2) / 1000))
- WVPASSEQ(xstat.nsecs_to_timeval(-10**9), (-1, 0))
- WVPASSEQ(xstat.nsecs_to_timeval(-500000000), (-1, (10**9 / 2) / 1000))
- WVPASSEQ(xstat.nsecs_to_timeval(-1500000000), (-2, (10**9 / 2) / 1000))
- x = xstat.nsecs_to_timeval(1977777778)
- WVPASSEQ(type(x[0]), type(0))
- WVPASSEQ(type(x[1]), type(0))
- x = xstat.nsecs_to_timeval(-1977777778)
- WVPASSEQ(type(x[0]), type(0))
- WVPASSEQ(type(x[1]), type(0))
-
- WVPASSEQ(xstat.fstime_floor_secs(0), 0)
- WVPASSEQ(xstat.fstime_floor_secs(10**9 / 2), 0)
- WVPASSEQ(xstat.fstime_floor_secs(10**9), 1)
- WVPASSEQ(xstat.fstime_floor_secs(-10**9 / 2), -1)
- WVPASSEQ(xstat.fstime_floor_secs(-10**9), -1)
- WVPASSEQ(type(xstat.fstime_floor_secs(10**9 / 2)), type(0))
- WVPASSEQ(type(xstat.fstime_floor_secs(-10**9 / 2)), type(0))
-
-
-@wvtest
-def test_bup_utimensat():
- if not xstat._bup_utimensat:
- return
- with no_lingering_errors():
- with test_tempdir(b'bup-txstat-') as tmpdir:
- path = tmpdir + b'/foo'
- open(path, 'w').close()
- frac_ts = (0, 10**9 // 2)
- xstat._bup_utimensat(_helpers.AT_FDCWD, path, (frac_ts, frac_ts), 0)
- st = _helpers.stat(path)
- atime_ts = st[8]
- mtime_ts = st[9]
- WVPASSEQ(atime_ts[0], 0)
- WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1])
- WVPASSEQ(mtime_ts[0], 0)
- WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1])
-
-
-@wvtest
-def test_bup_utimes():
- if not xstat._bup_utimes:
- return
- with no_lingering_errors():
- with test_tempdir(b'bup-txstat-') as tmpdir:
- path = tmpdir + b'/foo'
- open(path, 'w').close()
- frac_ts = (0, 10**6 // 2)
- xstat._bup_utimes(path, (frac_ts, frac_ts))
- st = _helpers.stat(path)
- atime_ts = st[8]
- mtime_ts = st[9]
- WVPASSEQ(atime_ts[0], 0)
- WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
- WVPASSEQ(mtime_ts[0], 0)
- WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
-
-
-@wvtest
-def test_bup_lutimes():
- if not xstat._bup_lutimes:
- return
- with no_lingering_errors():
- with test_tempdir(b'bup-txstat-') as tmpdir:
- path = tmpdir + b'/foo'
- open(path, 'w').close()
- frac_ts = (0, 10**6 // 2)
- xstat._bup_lutimes(path, (frac_ts, frac_ts))
- st = _helpers.stat(path)
- atime_ts = st[8]
- mtime_ts = st[9]
- WVPASSEQ(atime_ts[0], 0)
- WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
- WVPASSEQ(mtime_ts[0], 0)
- WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
+++ /dev/null
-
-from __future__ import absolute_import, print_function
-from collections import namedtuple
-from stat import S_ISDIR
-
-from bup import vfs
-from bup.metadata import Metadata
-from bup.git import BUP_CHUNKED
-
-TreeDictValue = namedtuple('TreeDictValue', ('name', 'oid', 'meta'))
-
-def tree_items(repo, oid):
- """Yield (name, entry_oid, meta) for each entry in oid. meta will be
- a Metadata object for any non-directories and for '.', otherwise
- None.
-
- """
- # This is a simpler approach than the one in the vfs, used to
- # cross-check its behavior.
- tree_data, bupm_oid = vfs.tree_data_and_bupm(repo, oid)
- bupm = vfs._FileReader(repo, bupm_oid) if bupm_oid else None
- try:
- maybe_meta = lambda : Metadata.read(bupm) if bupm else None
- m = maybe_meta()
- if m and m.size is None:
- m.size = 0
- yield TreeDictValue(name=b'.', oid=oid, meta=m)
- tree_ents = vfs.ordered_tree_entries(tree_data, bupm=True)
- for name, mangled_name, kind, gitmode, sub_oid in tree_ents:
- if mangled_name == b'.bupm':
- continue
- assert name != b'.'
- if S_ISDIR(gitmode):
- if kind == BUP_CHUNKED:
- yield TreeDictValue(name=name, oid=sub_oid,
- meta=maybe_meta())
- else:
- yield TreeDictValue(name=name, oid=sub_oid,
- meta=vfs.default_dir_mode)
- else:
- yield TreeDictValue(name=name, oid=sub_oid, meta=maybe_meta())
- finally:
- if bupm:
- bupm.close()
-
-def tree_dict(repo, oid):
- return dict((x.name, x) for x in tree_items(repo, oid))
--- /dev/null
+#!/bin/sh
+
+set -eu
+
+script_home="$(cd "$(dirname "$0")" && pwd -P)"
+testlibdir="$script_home/test/lib"
+
+export PYTHONPATH="$testlibdir${PYTHONPATH:+:$PYTHONPATH}"
+exec dev/bup-python -m pytest -v -m 'not release' "$@"
--- /dev/null
+
+[pytest]
+
+testpaths = test/int test/ext
+
+markers =
+ release: tests to check that the tree is ready for a release
+++ /dev/null
-../../dev/sort-z
\ No newline at end of file
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-
-from sys import stderr
-import os.path, re, subprocess, sys
-
-def mntent_unescape(x):
- def replacement(m):
- unescapes = {
- "\\\\" : "\\",
- "\\011" : "\t",
- "\\012" : "\n",
- "\\040" : " "
- }
- return unescapes.get(m.group(0))
- return re.sub(r'(\\\\|\\011|\\012|\\040)', replacement, x)
-
-targets = sys.argv[1:]
-
-if not os.path.exists('/proc/mounts'):
- print >> stderr, 'No /proc/mounts; skipping mount cleanup in', repr(targets)
- sys.exit(0)
-
-exit_status = 0
-for target in targets:
- if not os.path.isdir(target):
- print >> stderr, repr(target), 'is not a directory'
- exit_status = 1
- continue
- top = os.path.realpath(target)
- proc_mounts = open('/proc/mounts', 'r')
- for line in proc_mounts:
- _, point, fstype, _ = line.split(' ', 3)
- point = mntent_unescape(point)
- if top == point or os.path.commonprefix((top + '/', point)) == top + '/':
- if fstype.startswith('fuse'):
- if subprocess.call(['fusermount', '-uz', point]) != 0:
- exit_status = 1
- else:
- if subprocess.call(['umount', '-l', point]) != 0:
- exit_status = 1
-
-sys.exit(exit_status)
+++ /dev/null
-#!/usr/bin/env bash
-
-set -u
-
-# Test that src and dest trees are as identical as bup is capable of
-# making them. For now, use rsync -niaHAX ...
-
-usage() {
-cat <<EOF
-Usage: compare-trees [-h] [-c] [-x] SOURCE DEST
-OPTIONS:
- -h
- Display help
- -c
- Check file content (default)
- -x
- Don't check file content (rely on size/timestamps, etc.)
-EOF
-}
-
-verify_content=" --checksum"
-
-while getopts "hcx" OPTION
-do
- case "$OPTION" in
- h) usage; exit 0;;
- c) verify_content=" --checksum";;
- x) verify_content="";;
- ?) usage 1>&2; exit 1;;
- esac
-done
-
-shift $(($OPTIND - 1)) || exit $?
-
-if ! test $# -eq 2
-then
- usage 1>&2
- exit 1
-fi
-
-src="$1"
-dest="$2"
-
-tmpfile="$(mktemp /tmp/bup-test-XXXXXXX)" || exit $?
-trap "rm -rf '$tmpfile'" EXIT || exit $?
-
-rsync_opts="-niaH$verify_content --delete"
-
-rsync_version=$(rsync --version)
-if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
- echo "Not comparing ACLs (not supported by available rsync)" 1>&2
-else
- case $OSTYPE in
- cygwin|darwin|netbsd)
- echo "Not comparing ACLs (not yet supported on $OSTYPE)" 1>&2
- ;;
- *)
- rsync_opts="$rsync_opts -A"
- ;;
- esac
-fi
-
-xattrs_available=''
-if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
- echo "Not comparing xattrs (not supported by available rsync)" 1>&2
-else
- xattrs_available=yes
-fi
-
-# Even in dry-run mode, rsync may fail if -X is specified and the
-# filesystems don't support xattrs.
-
-if test "$xattrs_available"; then
- rsync $rsync_opts -X "$src" "$dest" > "$tmpfile"
- if test $? -ne 0; then
- # Try again without -X
- rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
- fi
-else
- rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
-fi
-
-if test $(wc -l < "$tmpfile") != 0; then
- echo "Differences between $src and $dest" 1>&2
- cat "$tmpfile"
- exit 1
-fi
-
-exit 0
+++ /dev/null
-#!/usr/bin/env bash
-
-set -o pipefail
-
-# NOTE: any relevant changes to var/ must be accompanied by an
-# increment to the revision.
-
-revision=3
-
-top="$(pwd)" || exit $?
-
-usage()
-{
- echo 'Usage: t/configure-sampledata [--setup | --clean | --revision]'
-}
-
-if test "$#" -ne 1; then
- usage 1>&2; exit 1
-fi
-
-rm_symlinks()
-{
- for p in "$@"; do
- # test -e is false for dangling symlinks.
- if test -h "$p" -o -e "$p"; then rm "$p" || exit $?; fi
- done
-}
-
-clean()
-(
- cd t/sampledata || exit $?
- if test -e var; then rm -r var || exit $?; fi
- # Remove legacy content (before everything moved to var/).
- rm_symlinks abs-symlink b c etc
-)
-
-case "$1" in
- --setup)
- (
- clean
- mkdir -p t/sampledata/var/rev || exit $?
- cd t/sampledata/var || exit $?
- ln -sf a b || exit $?
- ln -sf b c || exit $?
- ln -sf "$(pwd)/abs-symlink-target" abs-symlink || exit $?
- mkfifo fifo
- mkdir -p cmd doc lib/bup || exit $?
- cp -pP "$top"/cmd/*.py cmd/ || exit $?
- cp -pP "$top"/Documentation/*.md doc/ || exit $?
- cp -pP "$top"/lib/bup/*.py lib/bup || exit $?
- mkdir path-zoo || exit $?
- if test "$BUP_TEST_RANDOMIZED_SAMPLEDATA_PATHS"; then
- "$top"/t/make-random-paths 3000 path-zoo || exit $?
- fi
- # The "v" ensures that if "configure-sampledata
- # --revision" and/or the setup above fails somehow,
- # callers like make will be looking for a file that won't
- # exist.
- touch rev/v$revision || exit $?
- ) || exit $?
- ;;
- --clean)
- clean
- ;;
- --revision)
- echo "$revision" || exit $?
- ;;
- *)
- usage 1>&2; exit 1
- ;;
-esac
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import getsize, isdir
-from sys import argv, stderr
-import os
-
-def listdir_failure(ex):
- raise ex
-
-def usage():
- print('Usage: data-size PATH ...', file=sys.stderr)
-
-total = 0
-for path in argv[1:]:
- if isdir(path):
- for root, dirs, files in os.walk(path, onerror=listdir_failure):
- total += sum(getsize(os.path.join(root, name)) for name in files)
- else:
- total += getsize(path)
-
-print(total)
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
- export "BUP_ARGV_${arg_i}"="$arg"
- shift
- arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import abspath, dirname
-from sys import stdout
-import os, sys
-
-script_home = abspath(dirname(__file__))
-sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
-
-from bup import compat
-
-for arg in compat.argvb:
- os.write(stdout.fileno(), arg)
- os.write(stdout.fileno(), b'\0\n')
- stdout.flush()
+++ /dev/null
-#!/usr/bin/env bash
-
-set -o pipefail
-
-# Try *hard* to delete $@. Among other things, some systems have
-# r-xr-xr-x for root and other system dirs.
-
-rc=0
-rm -rf "$@" # Maybe we'll get lucky.
-for f in "$@"; do
- test -e "$f" || continue
- if test "$(type -p setfacl)"; then
- setfacl -Rb "$f"
- fi
- if test "$(type -p chattr)"; then
- chattr -R -aisu "$f"
- fi
- chmod -R u+rwX "$f"
- rm -r "$f"
- if test -e "$f"; then
- rc=1
- find "$f" -ls
- lsattr -aR "$f"
- getfacl -R "$f"
- fi
-done
-
-if test "$rc" -ne 0; then
- echo "Failed to delete everything" 1>&2
-fi
-
-exit "$rc"
+++ /dev/null
-#!/usr/bin/env bash
-
-# Recursively dump all blobs in the subtree identified by ID.
-
-set -o pipefail
-
-usage() {
-cat <<EOF
-Usage: cat-git-tree [--git-dir DIR] ID
-EOF
-}
-
-cat-item()
-{
- local hash="$1"
- local type="$2"
- case "$type" in
- blob)
- git cat-file blob "$hash" || exit $?
- ;;
- tree)
- local tree=$(git ls-tree "$hash") || exit $?
- while read -r line; do
- local sub_type=$(echo "$line" | cut -d' ' -f 2) || exit $?
- local sub_hash=$(echo "$line" | cut -d' ' -f 3) || exit $?
- sub_hash=$(echo "$sub_hash" | cut -d' ' -f 1) || exit $?
- cat-item "$sub_hash" "$sub_type"
- done <<< "$tree"
- ;;
- *)
- echo "Unexpected item: $type $hash" 1>&2
- exit 1
- ;;
- esac
-}
-
-case $# in
- 1) ;;
- 3)
- if test "$1" != --git-dir; then
- usage 1>&2
- exit 1
- fi
- export GIT_DIR="$2"
- shift 2
- ;;
- *)
- usage 1>&2
- exit 1
- ;;
-esac
-
-top="$1"
-type=$(git cat-file -t "$top") || exit $?
-cat-item "$top" "$type"
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
- export "BUP_ARGV_${arg_i}"="$arg"
- shift
- arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-import os, stat, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup import compat
-from bup.io import byte_stream
-
-
-# Print the full paths of all the files in each hardlink set
-# underneath one of the paths. Separate sets with a blank line, sort
-# the paths within each set, and sort the sets by their first path.
-
-def usage():
- print("Usage: hardlink-sets <paths ...>", file=sys.stderr)
-
-if len(compat.argv) < 2:
- usage()
- sys.exit(1)
-
-def on_walk_error(e):
- raise e
-
-sys.stdout.flush()
-out = byte_stream(sys.stdout)
-
-hardlink_set = {}
-
-for p in compat.argvb[1:]:
- for root, dirs, files in os.walk(p, onerror = on_walk_error):
- for filename in files:
- full_path = os.path.join(root, filename)
- st = os.lstat(full_path)
- if not stat.S_ISDIR(st.st_mode):
- node = b'%d:%d' % (st.st_dev, st.st_ino)
- link_paths = hardlink_set.get(node)
- if link_paths:
- link_paths.append(full_path)
- else:
- hardlink_set[node] = [full_path]
-
-# Sort the link sets.
-for node, link_paths in hardlink_set.items():
- link_paths.sort()
-
-first_set = True
-for link_paths in sorted(hardlink_set.values(), key = lambda x : x[0]):
- if len(link_paths) > 1:
- if first_set:
- first_set = False
- else:
- out.write(b'\n')
- for p in sorted(link_paths):
- out.write(p + b'\n')
-
-sys.exit(0)
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-# Note: this currently relies on bup-python to handle arbitrary binary
-# user/group names.
-
-from __future__ import absolute_import, print_function
-
-import grp
-import pwd
-import sys
-
-def usage():
- print('Usage: id-other-than <--user|--group> ID [ID ...]',
- file=sys.stderr)
-
-if len(sys.argv) < 2:
- usage()
- sys.exit(1)
-
-def is_integer(x):
- try:
- int(x)
- return True
- except ValueError as e:
- return False
-
-excluded_ids = set(int(x) for x in sys.argv[2:] if is_integer(x))
-excluded_names = (x for x in sys.argv[2:] if not is_integer(x))
-
-if sys.argv[1] == '--user':
- for x in excluded_names:
- excluded_ids.add(pwd.getpwnam(x).pw_uid)
- for x in pwd.getpwall():
- if x.pw_uid not in excluded_ids:
- print(x.pw_name + ':' + str(x.pw_uid))
- sys.exit(0)
-elif sys.argv[1] == '--group':
- for x in excluded_names:
- excluded_ids.add(grp.getgrnam(x).gr_gid)
- for x in grp.getgrall():
- if x.gr_gid not in excluded_ids:
- print(x.gr_name + ':' + str(x.gr_gid))
- sys.exit(0)
-else:
- usage()
- sys.exit(1)
+++ /dev/null
-# Assumes shell is Bash, and pipefail is set.
-
-bup_t_lib_script_home=$(cd "$(dirname $0)" && pwd) || exit $?
-
-bup-cfg-py() { "$bup_t_lib_script_home/../config/bin/python" "$@"; }
-bup-python() { "$bup_t_lib_script_home/../dev/bup-python" "$@"; }
-
-force-delete()
-{
- "$bup_t_lib_script_home/force-delete" "$@"
-}
-
-resolve-parent()
-{
- test "$#" -eq 1 || return $?
- echo "$1" | \
- PYTHONPATH="$bup_t_lib_script_home/../lib" bup-python -c \
- "import sys, bup.helpers; print(bup.helpers.resolve_parent(sys.stdin.readline()))" \
- || return $?
-}
-
-current-filesystem()
-{
- local kernel="$(uname -s)" || return $?
- case "$kernel" in
- NetBSD)
- df -G . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
- ;;
- SunOS)
- df -g . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
- ;;
- *)
- df -T . | awk 'END{print $2}'
- esac
-}
-
-path-filesystems()
-(
- # Return filesystem for each dir from $1 to /.
- # Perhaps for /foo/bar, "ext4\next4\nbtrfs\n".
- test "$#" -eq 1 || exit $?
- cd "$1" || exit $?
- current-filesystem || exit $?
- dir="$(pwd)" || exit $?
- while test "$dir" != /; do
- cd .. || exit $?
- dir="$(pwd)" || exit $?
- current-filesystem || exit $?
- done
- exit 0
-)
-
-escape-erx()
-{
- sed 's/[][\.|$(){?+*^]/\\&/g' <<< "$*"
-}
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import abspath, dirname
-from random import randint
-from sys import argv, exit, stderr, stdout
-import errno, re, sys
-
-script_home = abspath(dirname(sys.argv[0] or '.'))
-sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
-
-from bup.compat import fsencode, range
-
-
-def usage(out=stdout):
- print('Usage:', argv[0], 'NUM', 'DEST_DIR', file=out)
-
-def misuse():
- usage(stderr)
- exit(2)
-
-if sys.version_info[0] >= 3:
- def bytes_from_ints(ints):
- return bytes(ints)
-else:
- def bytes_from_ints(ints):
- return ''.join([chr(x) for x in ints])
-
-invalid_fragments = re.compile(br'(\x00|[./]|\.\.)')
-
-def random_filename():
- n = randint(1, 32)
- def random_candidate():
- return invalid_fragments.sub(b'', bytes_from_ints([randint(1, 255)
- for x in range(n)]))
- candidate = random_candidate()
- while not candidate:
- candidate = random_candidate()
- return candidate
-
-if len(argv) != 3:
- misuse()
-
-count, dest = argv[1:]
-count = int(count)
-
-i = 0
-while i < count:
- with open(fsencode(dest) + b'/' + random_filename(), 'w') as _:
- i += 1
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import
-
-import socket, sys
-
-s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
-s.bind(sys.argv[1])
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
- export "BUP_ARGV_${arg_i}"="$arg"
- shift
- arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import absolute_import
-import os.path, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup.compat import argv_bytes
-from bup.helpers import handle_ctrl_c, saved_errors
-from bup.io import byte_stream
-from bup import compat, metadata, options
-import bup.xstat as xstat
-
-
-optspec = """
-ns-timestamp-resolutions TEST_FILE_NAME
---
-"""
-
-handle_ctrl_c()
-
-o = options.Options(optspec)
-opt, flags, extra = o.parse(compat.argv[1:])
-
-sys.stdout.flush()
-out = byte_stream(sys.stdout)
-
-if len(extra) != 1:
- o.fatal('must specify a test file name')
-
-target = argv_bytes(extra[0])
-
-open(target, 'w').close()
-xstat.utime(target, (123456789, 123456789))
-meta = metadata.from_path(target)
-
-def ns_resolution(x):
- n = 1;
- while n < 10**9 and x % 10 == 0:
- x /= 10
- n *= 10
- return n
-
-out.write(b'%d %d\n' % (ns_resolution(meta.atime),
- ns_resolution(meta.mtime)))
-
-if saved_errors:
- log('warning: %d errors encountered\n' % len(saved_errors))
- sys.exit(1)
+++ /dev/null
-#!/usr/bin/env bash
-
-set -ueo pipefail
-
-if test $# -lt 1; then
- echo "Usage: perf-glance SRC_DATA_PATH..." 1>&2
- exit 1
-fi
-set -x
-src_data=("$@")
-
-top="$(pwd)"
-script_name="$(basename $0)"
-
-mkdir -p "$top/t/tmp"
-tmpdir="$(mktemp -d "$top/t/tmp/$script_name-XXXXXXX")"
-
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
- "$top/bup" "$@"
-}
-
-get-time()
-{
- python -c 'import time; print(time.time())'
-}
-
-rm -rf "$BUP_DIR"
-
-all_start="$(get-time)"
-
-init_start="$(get-time)"
-bup init
-init_finish="$(get-time)"
-
-index_start="$(get-time)"
-bup index "${src_data[@]}"
-index_finish="$(get-time)"
-
-save_start="$(get-time)"
-bup save -t -n data "${src_data[@]}"
-save_finish="$(get-time)"
-
-mkdir "$tmpdir/restore"
-restore_start="$(get-time)"
-bup restore -C "$tmpdir/restore" "/data/latest/"
-restore_finish="$(get-time)"
-
-all_finish="$(get-time)"
-
-set +x
-cat <<EOS
-
-init: $(python -c "print($init_finish - $init_start)")
-index: $(python -c "print($index_finish - $index_start)")
-save: $(python -c "print($save_finish - $save_start)")
-restore: $(python -c "print($restore_finish - $restore_start)")
-all: $(python -c "print($all_finish - $all_start)")
-EOS
-
-cd "$top"
-rm -r "$tmpdir"
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-import os, sys
-
-if sys.platform.startswith('cygwin'):
- groups = os.getgroups()
- if 544 in groups or 0 in groups:
- print('root')
- else:
- print('none')
-else:
- if os.environ.get('FAKEROOTKEY'):
- print('fake')
- else:
- if os.geteuid() == 0:
- print('root')
- else:
- print('none')
+++ /dev/null
-Sun Jan 3 01:54:26 EST 2010
+++ /dev/null
-this file should come *before* y/ in the sort order, because of that
-trailing slash.
+++ /dev/null
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
+++ /dev/null
-this is a text file.
-
-See me be texty!
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-
-from __future__ import absolute_import, print_function
-from random import randint
-from sys import stderr, stdout
-import os, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup.io import byte_stream
-
-def smaller_region(max_offset):
- start = randint(0, max_offset)
- return (start, min(max_offset, randint(start + 1, start + 5)))
-
-
-def possibly_larger_region(max_offset, min_sparse_len):
- start = randint(0, max_offset)
- return (start, min(max_offset, randint(start + 1,
- start + 3 * min_sparse_len)))
-
-
-def initial_region(max_offset, min_sparse_len):
- start = 0
- return (start, min(max_offset, randint(start + 1,
- start + 3 * min_sparse_len)))
-
-
-def final_region(max_offset, min_sparse_len):
- start = max(0, randint(max_offset - 3 * min_sparse_len,
- max_offset - 1))
- return (start, max_offset)
-
-
-def region_around_min_len(max_offset, min_sparse_len):
- start = randint(0, max_offset)
- return (start, min(max_offset, randint(start + min_sparse_len - 5,
- start + min_sparse_len + 5)))
-
-
-generators = []
-
-def random_region():
- global generators
- return generators[randint(0, len(generators) - 1)]()
-
-if len(sys.argv) == 0:
- stdout.flush()
- out = byte_stream(stdout)
-if len(sys.argv) == 2:
- out = open(sys.argv[1], 'wb')
-else:
- print('Usage: sparse-test-data [FILE]', file=stderr)
- sys.exit(2)
-
-bup_read_size = 2 ** 16
-bup_min_sparse_len = 512
-out_size = randint(0, bup_read_size * 10)
-
-generators = (lambda : smaller_region(out_size),
- lambda : possibly_larger_region(out_size, bup_min_sparse_len),
- lambda : initial_region(out_size, bup_min_sparse_len),
- lambda : final_region(out_size, bup_min_sparse_len),
- lambda : region_around_min_len(out_size, bup_min_sparse_len))
-
-sparse = []
-sparse.append(random_region())
-sparse.append(random_region())
-
-# Handle overlaps
-if sparse[1][0] < sparse[0][0]:
- sparse[0], sparse[1] = sparse[1], sparse[0]
-
-sparse_offsets = []
-sparse_offsets.append(sparse[0][0])
-if sparse[1][0] <= sparse[0][1]:
- sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
-else:
- sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
-
-if sparse[1][1] != out_size:
- sparse_offsets.append(out_size)
-
-# Now sparse_offsets indicates where to start/stop zero runs
-data = b'x'
-pos = 0
-print('offsets:', sparse_offsets, file=stderr)
-for offset in sparse_offsets:
- count = offset - pos
- print('write:', 'x' if data == 'x' else '0', count, file=stderr)
- out.write(data * (offset - pos))
- pos += count
- data = b'\0' if data == b'x' else b'x'
-
-out.close()
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-import os.path, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup.compat import argv_bytes
-from bup.helpers import handle_ctrl_c, readpipe
-from bup.io import byte_stream
-from bup import options
-
-
-optspec = """
-subtree-hash ROOT_HASH [PATH_ITEM...]
---
-"""
-
-handle_ctrl_c()
-
-o = options.Options(optspec)
-(opt, flags, extra) = o.parse(sys.argv[1:])
-
-if len(extra) < 1:
- o.fatal('must specify a root hash')
-
-tree_hash = argv_bytes(extra[0])
-path = [argv_bytes(x) for x in extra[1:]]
-
-while path:
- target_name = path[0]
- subtree_items = readpipe([b'git', b'ls-tree', b'-z', tree_hash])
- target_hash = None
- for entry in subtree_items.split(b'\0'):
- if not entry:
- break
- info, name = entry.split(b'\t', 1)
- if name == target_name:
- _, _, target_hash = info.split(b' ')
- break
- if not target_hash:
- print("Can't find %r in %s" % (target_name, tree_hash.decode('ascii')),
- file=sys.stderr)
- break
- tree_hash = target_hash
- path = path[1:]
-
-if path:
- sys.exit(1)
-
-sys.stdout.flush()
-out = byte_stream(sys.stdout)
-out.write(tree_hash + b'\n')
+++ /dev/null
-#!/usr/bin/env bash
-
-set -u
-
-usage() {
-cat <<EOF
-Usage: sync-tree [-h] [-c] [-x] SOURCE/ DEST/
- Make the DEST tree match SOURCE as closely as possible
-OPTIONS:
- -h
- Display help
-EOF
-}
-
-while getopts "h" OPTION
-do
- case "$OPTION" in
- h) usage; exit 0;;
- ?) usage 1>&2; exit 1;;
- esac
-done
-
-shift $(($OPTIND - 1)) || exit $?
-
-if ! test $# -eq 2
-then
- usage 1>&2
- exit 1
-fi
-
-src="$1"
-dest="$2"
-
-rsync_opts="-aH --delete"
-
-rsync_version=$(rsync --version)
-if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
- echo "Not syncing ACLs (not supported by available rsync)" 1>&2
-else
- case $OSTYPE in
- cygwin|darwin|netbsd)
- echo "Not syncing ACLs (not yet supported on $OSTYPE)" 1>&2
- ;;
- *)
- rsync_opts="$rsync_opts -A"
- ;;
- esac
-fi
-
-xattrs_available=''
-if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
- echo "Not syncing xattrs (not supported by available rsync)" 1>&2
-else
- xattrs_available=yes
-fi
-
-
-# rsync may fail if -X is specified and the filesystems don't support
-# xattrs.
-
-if test "$xattrs_available"; then
- rsync $rsync_opts -X "$src" "$dest"
- if test $? -ne 0; then
- # Try again without -X
- exec rsync $rsync_opts "$src" "$dest"
- fi
-else
- exec rsync $rsync_opts "$src" "$dest"
-fi
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import abspath, dirname
-from random import randint
-from subprocess import check_output
-from sys import stderr, stdout
-import sys
-
-script_home = abspath(dirname(__file__))
-sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
-
-from wvtest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
-
-wvstart('command line arguments are not mangled')
-
-def rand_bytes(n):
- return bytes([randint(1, 255) for x in range(n)])
-
-for trial in range(100):
- cmd = [b't/echo-argv-bytes', rand_bytes(randint(1, 32))]
- out = check_output(cmd)
- wvpasseq(b'\0\n'.join(cmd) + b'\0\n', out)
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "cat-file"
-WVPASS mkdir src
-WVPASS date > src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup cat-file "src/latest/$(pwd)/src/foo" > cat-foo
-WVPASS diff -u src/foo cat-foo
-
-WVSTART "cat-file --meta"
-WVPASS bup meta --create --no-paths src/foo > src-foo.meta
-WVPASS bup cat-file --meta "src/latest/$(pwd)/src/foo" > cat-foo.meta
-
-WVPASS bup meta -tvvf src-foo.meta | WVPASS grep -vE '^atime: ' > src-foo.list
-WVPASS bup meta -tvvf cat-foo.meta | WVPASS grep -vE '^atime: ' > cat-foo.list
-WVPASS diff -u src-foo.list cat-foo.list
-
-WVSTART "cat-file --bupm"
-WVPASS bup cat-file --bupm "src/latest/$(pwd)/src/" > bup-cat-bupm
-src_hash=$(WVPASS bup ls -s "src/latest/$(pwd)" | cut -d' ' -f 1) || exit $?
-bupm_hash=$(WVPASS git ls-tree "$src_hash" | grep -F .bupm | cut -d' ' -f 3) \
- || exit $?
-bupm_hash=$(WVPASS echo "$bupm_hash" | cut -d' ' -f 1) || exit $?
-WVPASS "$top/t/git-cat-tree" "$bupm_hash" > git-cat-bupm
-if ! cmp git-cat-bupm bup-cat-bupm; then
- cmp -l git-cat-bupm bup-cat-bupm
- diff -uN <(bup meta -tvvf git-cat-bupm) <(bup meta -tvvf bup-cat-bupm)
- WVPASS cmp git-cat-bupm bup-cat-bupm
-fi
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-WVSTART 'all'
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir "$tmpdir/foo"
-
-bup index "$tmpdir/foo" &> /dev/null
-index_rc=$?
-WVPASSEQ "$index_rc" "15"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-fs-size() { tar cf - "$@" | wc -c; }
-
-WVSTART "compression"
-WVPASS cd "$tmpdir"
-
-D=compression0.tmp
-WVPASS force-delete "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir $D
-WVPASS bup index "$top/Documentation"
-WVPASS bup save -n compression -0 --strip "$top/Documentation"
-# Some platforms set -A by default when root, so just use it everywhere.
-expected="$(WVPASS ls -A "$top/Documentation" | WVPASS sort)" || exit $?
-actual="$(WVPASS bup ls -A compression/latest/ | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" "$expected"
-compression_0_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
-
-D=compression9.tmp
-WVPASS force-delete "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir $D
-WVPASS bup index "$top/Documentation"
-WVPASS bup save -n compression -9 --strip "$top/Documentation"
-expected="$(ls -A "$top/Documentation" | sort)" || exit $?
-actual="$(bup ls -A compression/latest/ | sort)" || exit $?
-WVPASSEQ "$actual" "$expected"
-compression_9_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$compression_9_size" -lt "$compression_0_size" ]
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# These tests aren't comprehensive, but test-save-restore-excludes.sh
-# exercises some of the same code more thoroughly via index, and
-# --xdev is handled in test-xdev.sh.
-
-WVSTART "drecurse"
-WVPASS bup init
-WVPASS mkdir src src/a src/b
-WVPASS touch src/a/1 src/a/2 src/b/1 src/b/2 src/c
-(cd src && WVPASS ln -s a a-link)
-WVPASSEQ "$(bup drecurse src)" "src/c
-src/b/2
-src/b/1
-src/b/
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude (file)"
-WVPASSEQ "$(bup drecurse --exclude src/b/2 src)" "src/c
-src/b/1
-src/b/
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude (dir)"
-WVPASSEQ "$(bup drecurse --exclude src/b/ src)" "src/c
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude (symlink)"
-WVPASSEQ "$(bup drecurse --exclude src/a-link src)" "src/c
-src/b/2
-src/b/1
-src/b/
-src/a/2
-src/a/1
-src/a/
-src/"
-
-WVSTART "drecurse --exclude (absolute path)"
-WVPASSEQ "$(bup drecurse --exclude src/b/2 "$(pwd)/src")" "$(pwd)/src/c
-$(pwd)/src/b/1
-$(pwd)/src/b/
-$(pwd)/src/a/2
-$(pwd)/src/a/1
-$(pwd)/src/a/
-$(pwd)/src/a-link
-$(pwd)/src/"
-
-WVSTART "drecurse --exclude-from"
-WVPASS echo "src/b" > exclude-list
-WVPASSEQ "$(bup drecurse --exclude-from exclude-list src)" "src/c
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude-rx (trivial)"
-WVPASSEQ "$(bup drecurse --exclude-rx '^src/b' src)" "src/c
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude-rx (trivial - absolute path)"
-WVPASSEQ "$(bup drecurse --exclude-rx "^$(pwd)/src/b" "$(pwd)/src")" \
-"$(pwd)/src/c
-$(pwd)/src/a/2
-$(pwd)/src/a/1
-$(pwd)/src/a/
-$(pwd)/src/a-link
-$(pwd)/src/"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS "$top/t/sync-tree" "$top/t/sampledata/" "$tmpdir/src/"
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "fsck"
-
-WVPASS bup index src
-WVPASS bup save -n fsck-test src/b2
-WVPASS bup save -n fsck-test src/var/cmd
-WVPASS bup save -n fsck-test src/var/doc
-WVPASS bup save -n fsck-test src/var/lib
-WVPASS bup save -n fsck-test src/y
-WVPASS bup fsck
-WVPASS bup fsck "$BUP_DIR"/objects/pack/pack-*.pack
-WVPASS bup fsck --quick
-if bup fsck --par2-ok; then
- WVSTART "fsck (par2)"
-else
- WVSTART "fsck (PAR2 IS MISSING)"
-fi
-WVPASS bup fsck -g
-WVPASS bup fsck -r
-WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1 -S0
-WVFAIL bup fsck --quick
-WVFAIL bup fsck --quick --disable-par2
-WVPASS chmod u+w "$BUP_DIR"/objects/pack/*.idx
-WVPASS bup damage "$BUP_DIR"/objects/pack/*.idx -n10 -s1 -S0
-WVFAIL bup fsck --quick -j4
-WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1024 --percent 0.4 -S0
-WVFAIL bup fsck --quick
-WVFAIL bup fsck --quick -rvv -j99 # fails because repairs were needed
-if bup fsck --par2-ok; then
- WVPASS bup fsck -r # ok because of repairs from last time
- WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n202 -s1 --equal -S0
- WVFAIL bup fsck
- WVFAIL bup fsck -rvv # too many errors to be repairable
- WVFAIL bup fsck -r # too many errors to be repairable
-else
- WVFAIL bup fsck --quick -r # still fails because par2 was missing
-fi
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-from os import chdir, mkdir, symlink, unlink
-from os.path import abspath, dirname
-from subprocess import PIPE
-from time import localtime, strftime
-import os, sys
-
-# For buptest, wvtest, ...
-sys.path[:0] = (abspath(os.path.dirname(__file__) + '/..'),)
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from buptest import ex, exo, logcmd, test_tempdir
-from wvtest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
-
-from bup.compat import environ
-from bup.helpers import unlink as unlink_if_exists
-import bup.path
-
-bup_cmd = bup.path.exe()
-
-def bup(*args, **kwargs):
- if 'stdout' not in kwargs:
- return exo((bup_cmd,) + args, **kwargs)
- return ex((bup_cmd,) + args, **kwargs)
-
-def jl(*lines):
- return b''.join(line + b'\n' for line in lines)
-
-environ[b'GIT_AUTHOR_NAME'] = b'bup test'
-environ[b'GIT_COMMITTER_NAME'] = b'bup test'
-environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-
-with test_tempdir(b'ftp-') as tmpdir:
- environ[b'BUP_DIR'] = tmpdir + b'/repo'
- environ[b'GIT_DIR'] = tmpdir + b'/repo'
-
- chdir(tmpdir)
- mkdir(b'src')
- chdir(b'src')
- mkdir(b'dir')
- with open(b'file-1', 'wb') as f:
- f.write(b'excitement!\n')
- with open(b'dir/file-2', 'wb') as f:
- f.write(b'more excitement!\n')
- symlink(b'file-1', b'file-symlink')
- symlink(b'dir', b'dir-symlink')
- symlink(b'not-there', b'bad-symlink')
-
- chdir(tmpdir)
- bup(b'init')
- bup(b'index', b'src')
- bup(b'save', b'-n', b'src', b'--strip', b'src')
- save_utc = int(exo((b'git', b'show',
- b'-s', b'--format=%at', b'src')).out.strip())
- save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
-
- wvstart('help')
- wvpasseq(b'Commands: ls cd pwd cat get mget help quit\n',
- exo((bup_cmd, b'ftp'), input=b'help\n', stderr=PIPE).out)
-
- wvstart('pwd/cd')
- wvpasseq(b'/\n', bup(b'ftp', input=b'pwd\n').out)
- wvpasseq(b'', bup(b'ftp', input=b'cd src\n').out)
- wvpasseq(b'/src\n', bup(b'ftp', input=jl(b'cd src', b'pwd')).out)
- wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
- b'cd ..', b'pwd')).out)
- wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
- b'cd ..', b'cd ..',
- b'pwd')).out)
- wvpasseq(b'/src/%s/dir\n' % save_name,
- bup(b'ftp', input=jl(b'cd src/latest/dir-symlink', b'pwd')).out)
- wvpasseq(b'/src/%s/dir\n' % save_name,
- bup(b'ftp', input=jl(b'cd src latest dir-symlink', b'pwd')).out)
- wvpassne(0, bup(b'ftp',
- input=jl(b'cd src/latest/bad-symlink', b'pwd'),
- check=False, stdout=None).rc)
- wvpassne(0, bup(b'ftp',
- input=jl(b'cd src/latest/not-there', b'pwd'),
- check=False, stdout=None).rc)
-
- wvstart('ls')
- # FIXME: elaborate
- wvpasseq(b'src\n', bup(b'ftp', input=b'ls\n').out)
- wvpasseq(save_name + b'\nlatest\n',
- bup(b'ftp', input=b'ls src\n').out)
-
- wvstart('cat')
- wvpasseq(b'excitement!\n',
- bup(b'ftp', input=b'cat src/latest/file-1\n').out)
- wvpasseq(b'excitement!\nmore excitement!\n',
- bup(b'ftp',
- input=b'cat src/latest/file-1 src/latest/dir/file-2\n').out)
-
- wvstart('get')
- bup(b'ftp', input=jl(b'get src/latest/file-1 dest'))
- with open(b'dest', 'rb') as f:
- wvpasseq(b'excitement!\n', f.read())
- unlink(b'dest')
- bup(b'ftp', input=jl(b'get src/latest/file-symlink dest'))
- with open(b'dest', 'rb') as f:
- wvpasseq(b'excitement!\n', f.read())
- unlink(b'dest')
- wvpassne(0, bup(b'ftp',
- input=jl(b'get src/latest/bad-symlink dest'),
- check=False, stdout=None).rc)
- wvpassne(0, bup(b'ftp',
- input=jl(b'get src/latest/not-there'),
- check=False, stdout=None).rc)
-
- wvstart('mget')
- unlink_if_exists(b'file-1')
- bup(b'ftp', input=jl(b'mget src/latest/file-1'))
- with open(b'file-1', 'rb') as f:
- wvpasseq(b'excitement!\n', f.read())
- unlink_if_exists(b'file-1')
- unlink_if_exists(b'file-2')
- bup(b'ftp', input=jl(b'mget src/latest/file-1 src/latest/dir/file-2'))
- with open(b'file-1', 'rb') as f:
- wvpasseq(b'excitement!\n', f.read())
- with open(b'file-2', 'rb') as f:
- wvpasseq(b'more excitement!\n', f.read())
- unlink_if_exists(b'file-symlink')
- bup(b'ftp', input=jl(b'mget src/latest/file-symlink'))
- with open(b'file-symlink', 'rb') as f:
- wvpasseq(b'excitement!\n', f.read())
- wvpassne(0, bup(b'ftp',
- input=jl(b'mget src/latest/bad-symlink dest'),
- check=False, stdout=None).rc)
- # bup mget currently always does pattern matching
- bup(b'ftp', input=b'mget src/latest/not-there\n')
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-unset BLOCKSIZE BLOCK_SIZE DF_BLOCK_SIZE
-
-root_status="$(t/root-status)" || exit $?
-
-if ! bup-python -c 'import fuse' 2> /dev/null; then
- WVSTART 'unable to import fuse; skipping test'
- exit 0
-fi
-
-if test -n "$(type -p modprobe)" && ! modprobe fuse; then
- echo 'Unable to load fuse module; skipping dependent tests.' 1>&2
- exit 0
-fi
-
-if ! fusermount -V; then
- echo 'skipping FUSE tests: fusermount does not appear to work'
- exit 0
-fi
-
-if ! groups | grep -q fuse && test "$root_status" != root; then
- echo 'skipping FUSE tests: you are not root and not in the fuse group'
- exit 0
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-# Some versions of bash's printf don't support the relevant date expansion.
-savename()
-{
- readonly secs="$1"
- WVPASS bup-cfg-py -c "from time import strftime, localtime; \
- print(strftime('%Y-%m-%d-%H%M%S', localtime($secs)))"
-}
-
-export TZ=UTC
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-savestamp1=$(WVPASS bup-cfg-py -c 'import time; print(int(time.time()))') || exit $?
-savestamp2=$(($savestamp1 + 1))
-
-savename1="$(savename "$savestamp1")" || exit $?
-savename2="$(savename "$savestamp2")" || exit $?
-
-WVPASS mkdir src
-WVPASS echo content > src/foo
-WVPASS chmod 644 src/foo
-WVPASS touch -t 201111111111 src/foo
-# FUSE, python-fuse, something, can't handle negative epoch times.
-# Use pre-epoch to make sure bup properly "bottoms out" at 0 for now.
-WVPASS echo content > src/pre-epoch
-WVPASS chmod 644 src/pre-epoch
-WVPASS touch -t 196907202018 src/pre-epoch
-WVPASS bup index src
-WVPASS bup save -n src -d "$savestamp1" --strip src
-
-WVSTART "basics"
-WVPASS mkdir mnt
-WVPASS bup fuse mnt
-
-result=$(WVPASS ls mnt) || exit $?
-WVPASSEQ src "$result"
-
-result=$(WVPASS ls mnt/src) || exit $?
-WVPASSEQ "$result" "$savename1
-latest"
-
-result=$(WVPASS ls mnt/src/latest) || exit $?
-WVPASSEQ "$result" "foo
-pre-epoch"
-
-result=$(WVPASS cat mnt/src/latest/foo) || exit $?
-WVPASSEQ "$result" "content"
-
-# Right now we don't detect new saves.
-WVPASS bup save -n src -d "$savestamp2" --strip src
-result=$(WVPASS ls mnt/src) || exit $?
-WVPASSEQ "$result" "$savename1
-latest"
-
-WVPASS fusermount -uz mnt
-
-WVSTART "extended metadata"
-WVPASS bup fuse --meta mnt
-readonly user=$(WVPASS id -un) || $?
-readonly group=$(WVPASS id -gn) || $?
-result="$(stat --format='%A %U %G %x' mnt/src/latest/foo)"
-WVPASSEQ "$result" "-rw-r--r-- $user $group 2011-11-11 11:11:00.000000000 +0000"
-result="$(stat --format='%A %U %G %x' mnt/src/latest/pre-epoch)"
-WVPASSEQ "$result" "-rw-r--r-- $user $group 1970-01-01 00:00:00.000000000 +0000"
-
-WVPASS fusermount -uz mnt
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-GC_OPTS=--unsafe
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-data-size() { "$top/t/data-size" "$@"; }
-
-WVPASS cd "$tmpdir"
-WVPASS bup init
-
-
-WVSTART "gc (unchanged repo)"
-
-WVPASS mkdir src-1
-WVPASS bup random 1k > src-1/1
-WVPASS bup index src-1
-WVPASS bup save --strip -n src-1 src-1
-
-WVPASS bup gc $GC_OPTS -v
-
-WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
-WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (unchanged, new branch)"
-
-WVPASS mkdir src-2
-WVPASS bup random 10M > src-2/1
-WVPASS bup index src-2
-WVPASS bup save --strip -n src-2 src-2
-
-WVPASS bup gc $GC_OPTS -v
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
-WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-2/latest
-WVPASS compare-trees src-2/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (removed branch)"
-
-size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS rm "$BUP_DIR/refs/heads/src-2"
-WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 50000 ]
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
-WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup restore -C "$tmpdir/restore" /src-2/latest
-
-
-WVPASS mkdir src-ab-clean src-ab-clean/a src-ab-clean/b
-WVPASS bup random 1k > src-ab-clean/a/1
-WVPASS bup random 10M > src-ab-clean/b/1
-
-
-WVSTART "gc (rewriting)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src-ab
-WVPASS cp -pPR src-ab-clean src-ab
-
-WVPASS bup index src-ab
-WVPASS bup save --strip -n src-ab src-ab
-WVPASS bup index --clear
-WVPASS bup index src-ab
-WVPASS bup save -vvv --strip -n a src-ab/a
-
-size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS rm "$BUP_DIR/refs/heads/src-ab"
-WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 100000 ]
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /a/latest
-WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
-
-
-WVSTART "gc (save -r after repo rewriting)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS bup -d bup-remote init
-WVPASS rm -rf src-ab
-WVPASS cp -pPR src-ab-clean src-ab
-
-WVPASS bup index src-ab
-WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
-WVPASS bup index --clear
-WVPASS bup index src-ab
-WVPASS bup save -r :bup-remote -vvv --strip -n a src-ab/a
-
-size_before=$(WVPASS data-size bup-remote) || exit $?
-WVPASS rm bup-remote/refs/heads/src-ab
-WVPASS bup -d bup-remote gc $GC_OPTS -v
-size_after=$(WVPASS data-size bup-remote) || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 100000 ]
-
-WVPASS rm -rf "$tmpdir/restore"
-WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /a/latest
-WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
-
-# Make sure a post-gc index/save that includes gc-ed data works
-WVPASS bup index src-ab
-WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
-WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (bup on after repo rewriting)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src-ab
-WVPASS cp -pPR src-ab-clean src-ab
-
-WVPASS bup on - index src-ab
-WVPASS bup on - save --strip -n src-ab src-ab
-WVPASS bup index --clear
-WVPASS bup on - index src-ab
-WVPASS bup on - save -vvv --strip -n a src-ab/a
-
-size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS rm "$BUP_DIR/refs/heads/src-ab"
-WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 100000 ]
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /a/latest
-WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
-
-# Make sure a post-gc index/save that includes gc-ed data works
-WVPASS bup on - index src-ab
-WVPASS bup on - save --strip -n src-ab src-ab
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-ab/latest
-WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (threshold)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src && mkdir src
-WVPASS echo 0 > src/0
-WVPASS echo 1 > src/1
-
-WVPASS bup index src
-WVPASS bup save -n src-1 src
-WVPASS rm src/0
-WVPASS bup index src
-WVPASS bup save -n src-2 src
-
-WVPASS bup rm --unsafe src-1
-packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASS bup gc -v $GC_OPTS --threshold 99 2>&1 | tee gc.log
-packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASSEQ 0 "$(grep -cE '^rewriting ' gc.log)"
-WVPASSEQ "$packs_before" "$packs_after"
-
-WVPASS bup gc -v $GC_OPTS --threshold 1 2>&1 | tee gc.log
-packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
-
-# Check that only one pack was rewritten
-
-# Accommodate some systems that apparently used to change the default
-# ls sort order which must match LC_COLLATE for comm to work.
-packs_before="$(sort <(echo "$packs_before"))" || die $?
-packs_after="$(sort <(echo "$packs_after"))" || die $?
-
-only_in_before="$(comm -2 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
- || die $?
-
-only_in_after="$(comm -1 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
- || die $?
-
-in_both="$(comm -1 -2 <(echo "$packs_before") <(echo "$packs_after"))" || die $?
-
-WVPASSEQ 1 $(echo "$only_in_before" | wc -l)
-WVPASSEQ 1 $(echo "$only_in_after" | wc -l)
-WVPASSEQ 1 $(echo "$in_both" | wc -l)
-
-WVSTART "gc (threshold 0)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src && mkdir src
-WVPASS echo 0 > src/0
-WVPASS echo 1 > src/1
-
-WVPASS bup index src
-WVPASS bup save -n src-1 src
-
-packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASS bup gc -v $GC_OPTS --threshold 0 2>&1 | tee gc.log
-packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-# Check that the pack was rewritten, but not removed (since the
-# result-pack is equal to the source pack)
-WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
-WVPASSEQ "$packs_before" "$packs_after"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
- export "BUP_ARGV_${arg_i}"="$arg"
- shift
- arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import print_function
-from errno import ENOENT
-from os import chdir, mkdir, rename
-from os.path import abspath, dirname
-from shutil import rmtree
-from subprocess import PIPE
-import os, re, sys
-
-# For buptest, wvtest, ...
-sys.path[:0] = (abspath(os.path.dirname(__file__) + '/..'),)
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-
-from bup import compat, path
-from bup.compat import environ, getcwd, items
-from bup.helpers import bquote, merge_dict, unlink
-from bup.io import byte_stream
-from buptest import ex, exo, test_tempdir
-from wvtest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
-import bup.path
-
-sys.stdout.flush()
-stdout = byte_stream(sys.stdout)
-
-# FIXME: per-test function
-environ[b'GIT_AUTHOR_NAME'] = b'bup test-get'
-environ[b'GIT_COMMITTER_NAME'] = b'bup test-get'
-environ[b'GIT_AUTHOR_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
-environ[b'GIT_COMMITTER_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
-
-# The clean-repo test can probably be applied more broadly. It was
-# initially just applied to test-pick to catch a bug.
-
-top = getcwd()
-bup_cmd = bup.path.exe()
-
-def rmrf(path):
- err = [] # because python's scoping mess...
- def onerror(function, path, excinfo):
- err.append((function, path, excinfo))
- rmtree(path, onerror=onerror)
- if err:
- function, path, excinfo = err[0]
- ex_type, ex, traceback = excinfo
- if (not isinstance(ex, OSError)) or ex.errno != ENOENT:
- raise ex
-
-def verify_trees_match(path1, path2):
- global top
- exr = exo((top + b'/t/compare-trees', b'-c', path1, path2), check=False)
- stdout.write(exr.out)
- sys.stdout.flush()
- wvcheck(exr.rc == 0, 'process exit %d == 0' % exr.rc)
-
-def verify_rcz(cmd, **kwargs):
- assert not kwargs.get('check')
- kwargs['check'] = False
- result = exo(cmd, **kwargs)
- stdout.write(result.out)
- rc = result.proc.returncode
- wvcheck(rc == 0, 'process exit %d == 0' % rc)
- return result
-
-# FIXME: multline, or allow opts generally?
-
-def verify_rx(rx, string):
- wvcheck(re.search(rx, string), 'rx %r matches %r' % (rx, string))
-
-def verify_nrx(rx, string):
- wvcheck(not re.search(rx, string), "rx %r doesn't match %r" % (rx, string))
-
-def validate_clean_repo():
- out = verify_rcz((b'git', b'--git-dir', b'get-dest', b'fsck')).out
- verify_nrx(br'dangling|mismatch|missing|unreachable', out)
-
-def validate_blob(src_id, dest_id):
- global top
- rmrf(b'restore-src')
- rmrf(b'restore-dest')
- cat_tree = top + b'/t/git-cat-tree'
- src_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
- dest_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
- wvpasseq(src_blob, dest_blob)
-
-def validate_tree(src_id, dest_id):
-
- rmrf(b'restore-src')
- rmrf(b'restore-dest')
- mkdir(b'restore-src')
- mkdir(b'restore-dest')
-
- commit_env = merge_dict(environ, {b'GIT_COMMITTER_DATE': b'2014-01-01 01:01'})
-
- # Create a commit so the archive contents will have matching timestamps.
- src_c = exo((b'git', b'--git-dir', b'get-src',
- b'commit-tree', b'-m', b'foo', src_id),
- env=commit_env).out.strip()
- dest_c = exo((b'git', b'--git-dir', b'get-dest',
- b'commit-tree', b'-m', b'foo', dest_id),
- env=commit_env).out.strip()
- exr = verify_rcz(b'git --git-dir get-src archive %s | tar xvf - -C restore-src'
- % bquote(src_c),
- shell=True)
- if exr.rc != 0: return False
- exr = verify_rcz(b'git --git-dir get-dest archive %s | tar xvf - -C restore-dest'
- % bquote(dest_c),
- shell=True)
- if exr.rc != 0: return False
-
- # git archive doesn't include an entry for ./.
- unlink(b'restore-src/pax_global_header')
- unlink(b'restore-dest/pax_global_header')
- ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
- verify_trees_match(b'restore-src/', b'restore-dest/')
- rmrf(b'restore-src')
- rmrf(b'restore-dest')
-
-def validate_commit(src_id, dest_id):
- exr = verify_rcz((b'git', b'--git-dir', b'get-src', b'cat-file', b'commit', src_id))
- if exr.rc != 0: return False
- src_cat = exr.out
- exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'cat-file', b'commit', dest_id))
- if exr.rc != 0: return False
- dest_cat = exr.out
- wvpasseq(src_cat, dest_cat)
- if src_cat != dest_cat: return False
-
- rmrf(b'restore-src')
- rmrf(b'restore-dest')
- mkdir(b'restore-src')
- mkdir(b'restore-dest')
- qsrc = bquote(src_id)
- qdest = bquote(dest_id)
- exr = verify_rcz((b'git --git-dir get-src archive ' + qsrc
- + b' | tar xf - -C restore-src'),
- shell=True)
- if exr.rc != 0: return False
- exr = verify_rcz((b'git --git-dir get-dest archive ' + qdest +
- b' | tar xf - -C restore-dest'),
- shell=True)
- if exr.rc != 0: return False
-
- # git archive doesn't include an entry for ./.
- ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
- verify_trees_match(b'restore-src/', b'restore-dest/')
- rmrf(b'restore-src')
- rmrf(b'restore-dest')
-
-def _validate_save(orig_dir, save_path, commit_id, tree_id):
- global bup_cmd
- rmrf(b'restore')
- exr = verify_rcz((bup_cmd, b'-d', b'get-dest',
- b'restore', b'-C', b'restore', save_path + b'/.'))
- if exr.rc: return False
- verify_trees_match(orig_dir + b'/', b'restore/')
- if tree_id:
- # FIXME: double check that get-dest is correct
- exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'ls-tree', tree_id))
- if exr.rc: return False
- cat = verify_rcz((b'git', b'--git-dir', b'get-dest',
- b'cat-file', b'commit', commit_id))
- if cat.rc: return False
- wvpasseq(b'tree ' + tree_id, cat.out.splitlines()[0])
-
-# FIXME: re-merge save and new_save?
-
-def validate_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
- get_out):
- out = get_out.splitlines()
- print('blarg: out', repr(out), file=sys.stderr)
- wvpasseq(2, len(out))
- get_tree_id = out[0]
- get_commit_id = out[1]
- wvpasseq(tree_id, get_tree_id)
- wvpasseq(commit_id, get_commit_id)
- _validate_save(orig_value, dest_name + restore_subpath, commit_id, tree_id)
-
-def validate_new_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
- get_out):
- out = get_out.splitlines()
- wvpasseq(2, len(out))
- get_tree_id = out[0]
- get_commit_id = out[1]
- wvpasseq(tree_id, get_tree_id)
- wvpassne(commit_id, get_commit_id)
- _validate_save(orig_value, dest_name + restore_subpath, get_commit_id, tree_id)
-
-def validate_tagged_save(tag_name, restore_subpath,
- commit_id, tree_id, orig_value, get_out):
- out = get_out.splitlines()
- wvpasseq(1, len(out))
- get_tag_id = out[0]
- wvpasseq(commit_id, get_tag_id)
- # Make sure tmp doesn't already exist.
- exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', b'tmp-branch-for-tag'),
- check=False)
- wvpasseq(1, exr.rc)
-
- ex((b'git', b'--git-dir', b'get-dest', b'branch', b'tmp-branch-for-tag',
- b'refs/tags/' + tag_name))
- _validate_save(orig_value, b'tmp-branch-for-tag/latest' + restore_subpath,
- commit_id, tree_id)
- ex((b'git', b'--git-dir', b'get-dest', b'branch', b'-D', b'tmp-branch-for-tag'))
-
-def validate_new_tagged_commit(tag_name, commit_id, tree_id, get_out):
- out = get_out.splitlines()
- wvpasseq(1, len(out))
- get_tag_id = out[0]
- wvpassne(commit_id, get_tag_id)
- validate_tree(tree_id, tag_name + b':')
-
-
-get_cases_tested = 0
-
-def _run_get(disposition, method, what):
- print('run_get:', repr((disposition, method, what)), file=sys.stderr)
- global bup_cmd
-
- if disposition == 'get':
- get_cmd = (bup_cmd, b'-d', b'get-dest',
- b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
- elif disposition == 'get-on':
- get_cmd = (bup_cmd, b'-d', b'get-dest',
- b'on', b'-', b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
- elif disposition == 'get-to':
- get_cmd = (bup_cmd, b'-d', b'get-dest',
- b'get', b'-vvct', b'--print-tags', b'-s', b'get-src',
- b'-r', b'-:' + getcwd() + b'/get-dest')
- else:
- raise Exception('error: unexpected get disposition ' + repr(disposition))
-
- global get_cases_tested
- if isinstance(what, bytes):
- cmd = get_cmd + (method, what)
- else:
- assert not isinstance(what, str) # python 3 sanity check
- if method in (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
- b'--replace'):
- method += b':'
- src, dest = what
- cmd = get_cmd + (method, src, dest)
- result = exo(cmd, check=False, stderr=PIPE)
- get_cases_tested += 1
- fsck = ex((bup_cmd, b'-d', b'get-dest', b'fsck'), check=False)
- wvpasseq(0, fsck.rc)
- return result
-
-def run_get(disposition, method, what=None, given=None):
- global bup_cmd
- rmrf(b'get-dest')
- ex((bup_cmd, b'-d', b'get-dest', b'init'))
-
- if given:
- # FIXME: replace bup-get with independent commands as is feasible
- exr = _run_get(disposition, b'--replace', given)
- assert not exr.rc
- return _run_get(disposition, method, what)
-
-def test_universal_behaviors(get_disposition):
- methods = (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
- b'--replace', b'--unnamed')
- for method in methods:
- mmsg = method.decode('ascii')
- wvstart(get_disposition + ' ' + mmsg + ', missing source, fails')
- exr = run_get(get_disposition, method, b'not-there')
- wvpassne(0, exr.rc)
- verify_rx(br'cannot find source', exr.err)
- for method in methods:
- mmsg = method.decode('ascii')
- wvstart(get_disposition + ' ' + mmsg + ' / fails')
- exr = run_get(get_disposition, method, b'/')
- wvpassne(0, exr.rc)
- verify_rx(b'cannot fetch entire repository', exr.err)
-
-def verify_only_refs(**kwargs):
- for kind, refs in items(kwargs):
- if kind == 'heads':
- abs_refs = [b'refs/heads/' + ref for ref in refs]
- karg = b'--heads'
- elif kind == 'tags':
- abs_refs = [b'refs/tags/' + ref for ref in refs]
- karg = b'--tags'
- else:
- raise TypeError('unexpected keyword argument %r' % kind)
- if abs_refs:
- verify_rcz([b'git', b'--git-dir', b'get-dest',
- b'show-ref', b'--verify', karg] + abs_refs)
- exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
- check=False)
- wvpasseq(0, exr.rc)
- expected_refs = sorted(abs_refs)
- repo_refs = sorted([x.split()[1] for x in exr.out.splitlines()])
- wvpasseq(expected_refs, repo_refs)
- else:
- # FIXME: can we just check "git show-ref --heads == ''"?
- exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
- check=False)
- wvpasseq(1, exr.rc)
- wvpasseq(b'', exr.out.strip())
-
-def test_replace(get_disposition, src_info):
- print('blarg:', repr(src_info), file=sys.stderr)
-
- wvstart(get_disposition + ' --replace to root fails')
- for item in (b'.tag/tinyfile',
- b'src/latest' + src_info['tinyfile-path'],
- b'.tag/subtree',
- b'src/latest' + src_info['subtree-vfs-path'],
- b'.tag/commit-1',
- b'src/latest',
- b'src'):
- exr = run_get(get_disposition, b'--replace', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'impossible; can only overwrite branch or tag', exr.err)
-
- tinyfile_id = src_info['tinyfile-id']
- tinyfile_path = src_info['tinyfile-path']
- subtree_vfs_path = src_info['subtree-vfs-path']
- subtree_id = src_info['subtree-id']
- commit_2_id = src_info['commit-2-id']
- tree_2_id = src_info['tree-2-id']
-
- # Anything to tag
- existing_items = {'nothing' : None,
- 'blob' : (b'.tag/tinyfile', b'.tag/obj'),
- 'tree' : (b'.tag/tree-1', b'.tag/obj'),
- 'commit': (b'.tag/commit-1', b'.tag/obj')}
- for ex_type, ex_ref in items(existing_items):
- wvstart(get_disposition + ' --replace ' + ex_type + ' with blob tag')
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- exr = run_get(get_disposition, b'--replace', (item ,b'.tag/obj'),
- given=ex_ref)
- wvpasseq(0, exr.rc)
- validate_blob(tinyfile_id, tinyfile_id)
- verify_only_refs(heads=[], tags=(b'obj',))
- wvstart(get_disposition + ' --replace ' + ex_type + ' with tree tag')
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
- given=ex_ref)
- validate_tree(subtree_id, subtree_id)
- verify_only_refs(heads=[], tags=(b'obj',))
- wvstart(get_disposition + ' --replace ' + ex_type + ' with commitish tag')
- for item in (b'.tag/commit-2', b'src/latest', b'src'):
- exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
- given=ex_ref)
- validate_tagged_save(b'obj', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- # Committish to branch.
- existing_items = (('nothing', None),
- ('branch', (b'.tag/commit-1', b'obj')))
- for ex_type, ex_ref in existing_items:
- for item_type, item in (('commit', b'.tag/commit-2'),
- ('save', b'src/latest'),
- ('branch', b'src')):
- wvstart(get_disposition + ' --replace '
- + ex_type + ' with ' + item_type)
- exr = run_get(get_disposition, b'--replace', (item, b'obj'),
- given=ex_ref)
- validate_save(b'obj/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
- # Not committish to branch
- existing_items = (('nothing', None),
- ('branch', (b'.tag/commit-1', b'obj')))
- for ex_type, ex_ref in existing_items:
- for item_type, item in (('blob', b'.tag/tinyfile'),
- ('blob', b'src/latest' + tinyfile_path),
- ('tree', b'.tag/subtree'),
- ('tree', b'src/latest' + subtree_vfs_path)):
- wvstart(get_disposition + ' --replace branch with '
- + item_type + ' given ' + ex_type + ' fails')
-
- exr = run_get(get_disposition, b'--replace', (item, b'obj'),
- given=ex_ref)
- wvpassne(0, exr.rc)
- verify_rx(br'cannot overwrite branch with .+ for', exr.err)
-
- wvstart(get_disposition + ' --replace, implicit destinations')
-
- exr = run_get(get_disposition, b'--replace', b'src')
- validate_save(b'src/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'src',), tags=[])
-
- exr = run_get(get_disposition, b'--replace', b'.tag/commit-2')
- validate_tagged_save(b'commit-2', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=[], tags=(b'commit-2',))
-
-def test_ff(get_disposition, src_info):
-
- wvstart(get_disposition + ' --ff to root fails')
- tinyfile_path = src_info['tinyfile-path']
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- exr = run_get(get_disposition, b'--ff', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'source for .+ must be a branch, save, or commit', exr.err)
- subtree_vfs_path = src_info['subtree-vfs-path']
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- exr = run_get(get_disposition, b'--ff', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'is impossible; can only --append a tree to a branch',
- exr.err)
- for item in (b'.tag/commit-1', b'src/latest', b'src'):
- exr = run_get(get_disposition, b'--ff', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'destination for .+ is a root, not a branch', exr.err)
-
- wvstart(get_disposition + ' --ff of not-committish fails')
- for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- # FIXME: use get_item elsewhere?
- for given, get_item in ((None, (src, b'obj')),
- (None, (src, b'.tag/obj')),
- ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
- exr = run_get(get_disposition, b'--ff', get_item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'must be a branch, save, or commit', exr.err)
- for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- for given, get_item in ((None, (src, b'obj')),
- (None, (src, b'.tag/obj')),
- ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
- exr = run_get(get_disposition, b'--ff', get_item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'can only --append a tree to a branch', exr.err)
-
- wvstart(get_disposition + ' --ff committish, ff possible')
- save_2 = src_info['save-2']
- for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
- for given, get_item, complaint in \
- ((None, (src, b'.tag/obj'),
- br'destination .+ must be a valid branch name'),
- ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a blob, not a branch'),
- ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a tree, not a branch'),
- ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a tagged commit, not a branch'),
- ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a tagged commit, not a branch')):
- exr = run_get(get_disposition, b'--ff', get_item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(complaint, exr.err)
- # FIXME: use src or item and given or existing consistently in loops...
- commit_2_id = src_info['commit-2-id']
- tree_2_id = src_info['tree-2-id']
- for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
- for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
- exr = run_get(get_disposition, b'--ff', (src, b'obj'), given=given)
- wvpasseq(0, exr.rc)
- validate_save(b'obj/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
- wvstart(get_disposition + ' --ff, implicit destinations')
- for item in (b'src', b'src/latest'):
- exr = run_get(get_disposition, b'--ff', item)
- wvpasseq(0, exr.rc)
-
- ex((b'find', b'get-dest/refs'))
- ex((bup_cmd, b'-d', b'get-dest', b'ls'))
-
- validate_save(b'src/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- #verify_only_refs(heads=('src',), tags=[])
-
- wvstart(get_disposition + ' --ff, ff impossible')
- for given, get_item in (((b'unrelated-branch', b'src'), b'src'),
- ((b'.tag/commit-2', b'src'), (b'.tag/commit-1', b'src'))):
- exr = run_get(get_disposition, b'--ff', get_item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'destination is not an ancestor of source', exr.err)
-
-def test_append(get_disposition, src_info):
- tinyfile_path = src_info['tinyfile-path']
- subtree_vfs_path = src_info['subtree-vfs-path']
-
- wvstart(get_disposition + ' --append to root fails')
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- exr = run_get(get_disposition, b'--append', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'source for .+ must be a branch, save, commit, or tree',
- exr.err)
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
- b'.tag/commit-1', b'src/latest', b'src'):
- exr = run_get(get_disposition, b'--append', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'destination for .+ is a root, not a branch', exr.err)
-
- wvstart(get_disposition + ' --append of not-treeish fails')
- for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- for given, item in ((None, (src, b'obj')),
- (None, (src, b'.tag/obj')),
- ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
- ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
- exr = run_get(get_disposition, b'--append', item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'must be a branch, save, commit, or tree', exr.err)
-
- wvstart(get_disposition + ' --append committish failure cases')
- save_2 = src_info['save-2']
- for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
- b'.tag/commit-2', b'src/' + save_2, b'src'):
- for given, item, complaint in \
- ((None, (src, b'.tag/obj'),
- br'destination .+ must be a valid branch name'),
- ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a blob, not a branch'),
- ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a tree, not a branch'),
- ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a tagged commit, not a branch'),
- ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
- br'destination .+ is a tagged commit, not a branch')):
- exr = run_get(get_disposition, b'--append', item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(complaint, exr.err)
-
- wvstart(get_disposition + ' --append committish')
- commit_2_id = src_info['commit-2-id']
- tree_2_id = src_info['tree-2-id']
- for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
- for existing in (None, (b'.tag/commit-1', b'obj'),
- (b'.tag/commit-2', b'obj'),
- (b'unrelated-branch', b'obj')):
- exr = run_get(get_disposition, b'--append', (item, b'obj'),
- given=existing)
- wvpasseq(0, exr.rc)
- validate_new_save(b'obj/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
- # Append ancestor
- save_1 = src_info['save-1']
- commit_1_id = src_info['commit-1-id']
- tree_1_id = src_info['tree-1-id']
- for item in (b'.tag/commit-1', b'src/' + save_1, b'src-1'):
- exr = run_get(get_disposition, b'--append', (item, b'obj'),
- given=(b'.tag/commit-2', b'obj'))
- wvpasseq(0, exr.rc)
- validate_new_save(b'obj/latest', getcwd() + b'/src',
- commit_1_id, tree_1_id, b'src-1', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
- wvstart(get_disposition + ' --append tree')
- subtree_path = src_info['subtree-path']
- subtree_id = src_info['subtree-id']
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- for existing in (None,
- (b'.tag/commit-1', b'obj'),
- (b'.tag/commit-2', b'obj')):
- exr = run_get(get_disposition, b'--append', (item, b'obj'),
- given=existing)
- wvpasseq(0, exr.rc)
- validate_new_save(b'obj/latest', b'/', None, subtree_id, subtree_path,
- exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
- wvstart(get_disposition + ' --append, implicit destinations')
-
- for item in (b'src', b'src/latest'):
- exr = run_get(get_disposition, b'--append', item)
- wvpasseq(0, exr.rc)
- validate_new_save(b'src/latest', getcwd() + b'/src', commit_2_id, tree_2_id,
- b'src-2', exr.out)
- verify_only_refs(heads=(b'src',), tags=[])
-
-def test_pick(get_disposition, src_info, force=False):
- flavor = b'--force-pick' if force else b'--pick'
- flavormsg = flavor.decode('ascii')
- tinyfile_path = src_info['tinyfile-path']
- subtree_vfs_path = src_info['subtree-vfs-path']
-
- wvstart(get_disposition + ' ' + flavormsg + ' to root fails')
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
- exr = run_get(get_disposition, flavor, (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'can only pick a commit or save', exr.err)
- for item in (b'.tag/commit-1', b'src/latest'):
- exr = run_get(get_disposition, flavor, (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'destination is not a tag or branch', exr.err)
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- exr = run_get(get_disposition, flavor, (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'is impossible; can only --append a tree', exr.err)
-
- wvstart(get_disposition + ' ' + flavormsg + ' of blob or branch fails')
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
- for given, get_item in ((None, (item, b'obj')),
- (None, (item, b'.tag/obj')),
- ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
- ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
- ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
- ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
- exr = run_get(get_disposition, flavor, get_item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'impossible; can only pick a commit or save', exr.err)
-
- wvstart(get_disposition + ' ' + flavormsg + ' of tree fails')
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- for given, get_item in ((None, (item, b'obj')),
- (None, (item, b'.tag/obj')),
- ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
- ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
- ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
- ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
- exr = run_get(get_disposition, flavor, get_item, given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'impossible; can only --append a tree', exr.err)
-
- save_2 = src_info['save-2']
- commit_2_id = src_info['commit-2-id']
- tree_2_id = src_info['tree-2-id']
- # FIXME: these two wvstart texts?
- if force:
- wvstart(get_disposition + ' ' + flavormsg + ' commit/save to existing tag')
- for item in (b'.tag/commit-2', b'src/' + save_2):
- for given in ((b'.tag/tinyfile', b'.tag/obj'),
- (b'.tag/tree-1', b'.tag/obj'),
- (b'.tag/commit-1', b'.tag/obj')):
- exr = run_get(get_disposition, flavor, (item, b'.tag/obj'),
- given=given)
- wvpasseq(0, exr.rc)
- validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id,
- exr.out)
- verify_only_refs(heads=[], tags=(b'obj',))
- else: # --pick
- wvstart(get_disposition + ' ' + flavormsg
- + ' commit/save to existing tag fails')
- for item in (b'.tag/commit-2', b'src/' + save_2):
- for given in ((b'.tag/tinyfile', b'.tag/obj'),
- (b'.tag/tree-1', b'.tag/obj'),
- (b'.tag/commit-1', b'.tag/obj')):
- exr = run_get(get_disposition, flavor, (item, b'.tag/obj'), given=given)
- wvpassne(0, exr.rc)
- verify_rx(br'cannot overwrite existing tag', exr.err)
-
- wvstart(get_disposition + ' ' + flavormsg + ' commit/save to tag')
- for item in (b'.tag/commit-2', b'src/' + save_2):
- exr = run_get(get_disposition, flavor, (item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_clean_repo()
- validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id, exr.out)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- wvstart(get_disposition + ' ' + flavormsg + ' commit/save to branch')
- for item in (b'.tag/commit-2', b'src/' + save_2):
- for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
- exr = run_get(get_disposition, flavor, (item, b'obj'), given=given)
- wvpasseq(0, exr.rc)
- validate_clean_repo()
- validate_new_save(b'obj/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
- wvstart(get_disposition + ' ' + flavormsg
- + ' commit/save unrelated commit to branch')
- for item in(b'.tag/commit-2', b'src/' + save_2):
- exr = run_get(get_disposition, flavor, (item, b'obj'),
- given=(b'unrelated-branch', b'obj'))
- wvpasseq(0, exr.rc)
- validate_clean_repo()
- validate_new_save(b'obj/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
- wvstart(get_disposition + ' ' + flavormsg + ' commit/save ancestor to branch')
- save_1 = src_info['save-1']
- commit_1_id = src_info['commit-1-id']
- tree_1_id = src_info['tree-1-id']
- for item in (b'.tag/commit-1', b'src/' + save_1):
- exr = run_get(get_disposition, flavor, (item, b'obj'),
- given=(b'.tag/commit-2', b'obj'))
- wvpasseq(0, exr.rc)
- validate_clean_repo()
- validate_new_save(b'obj/latest', getcwd() + b'/src',
- commit_1_id, tree_1_id, b'src-1', exr.out)
- verify_only_refs(heads=(b'obj',), tags=[])
-
-
- wvstart(get_disposition + ' ' + flavormsg + ', implicit destinations')
- exr = run_get(get_disposition, flavor, b'.tag/commit-2')
- wvpasseq(0, exr.rc)
- validate_clean_repo()
- validate_new_tagged_commit(b'commit-2', commit_2_id, tree_2_id, exr.out)
- verify_only_refs(heads=[], tags=(b'commit-2',))
-
- exr = run_get(get_disposition, flavor, b'src/latest')
- wvpasseq(0, exr.rc)
- validate_clean_repo()
- validate_new_save(b'src/latest', getcwd() + b'/src',
- commit_2_id, tree_2_id, b'src-2', exr.out)
- verify_only_refs(heads=(b'src',), tags=[])
-
-def test_new_tag(get_disposition, src_info):
- tinyfile_id = src_info['tinyfile-id']
- tinyfile_path = src_info['tinyfile-path']
- commit_2_id = src_info['commit-2-id']
- tree_2_id = src_info['tree-2-id']
- subtree_id = src_info['subtree-id']
- subtree_vfs_path = src_info['subtree-vfs-path']
-
- wvstart(get_disposition + ' --new-tag to root fails')
- for item in (b'.tag/tinyfile',
- b'src/latest' + tinyfile_path,
- b'.tag/subtree',
- b'src/latest' + subtree_vfs_path,
- b'.tag/commit-1',
- b'src/latest',
- b'src'):
- exr = run_get(get_disposition, b'--new-tag', (item, b'/'))
- wvpassne(0, exr.rc)
- verify_rx(br'destination for .+ must be a VFS tag', exr.err)
-
- # Anything to new tag.
- wvstart(get_disposition + ' --new-tag, blob tag')
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_blob(tinyfile_id, tinyfile_id)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- wvstart(get_disposition + ' --new-tag, tree tag')
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_tree(subtree_id, subtree_id)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- wvstart(get_disposition + ' --new-tag, committish tag')
- for item in (b'.tag/commit-2', b'src/latest', b'src'):
- exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_tagged_save(b'obj', getcwd() + b'/src/', commit_2_id, tree_2_id,
- b'src-2', exr.out)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- # Anything to existing tag (fails).
- for ex_type, ex_tag in (('blob', (b'.tag/tinyfile', b'.tag/obj')),
- ('tree', (b'.tag/tree-1', b'.tag/obj')),
- ('commit', (b'.tag/commit-1', b'.tag/obj'))):
- for item_type, item in (('blob tag', b'.tag/tinyfile'),
- ('blob path', b'src/latest' + tinyfile_path),
- ('tree tag', b'.tag/subtree'),
- ('tree path', b'src/latest' + subtree_vfs_path),
- ('commit tag', b'.tag/commit-2'),
- ('save', b'src/latest'),
- ('branch', b'src')):
- wvstart(get_disposition + ' --new-tag of ' + item_type
- + ', given existing ' + ex_type + ' tag, fails')
- exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'),
- given=ex_tag)
- wvpassne(0, exr.rc)
- verify_rx(br'cannot overwrite existing tag .* \(requires --replace\)',
- exr.err)
-
- # Anything to branch (fails).
- for ex_type, ex_tag in (('nothing', None),
- ('blob', (b'.tag/tinyfile', b'.tag/obj')),
- ('tree', (b'.tag/tree-1', b'.tag/obj')),
- ('commit', (b'.tag/commit-1', b'.tag/obj'))):
- for item_type, item in (('blob tag', b'.tag/tinyfile'),
- ('blob path', b'src/latest' + tinyfile_path),
- ('tree tag', b'.tag/subtree'),
- ('tree path', b'src/latest' + subtree_vfs_path),
- ('commit tag', b'.tag/commit-2'),
- ('save', b'src/latest'),
- ('branch', b'src')):
- wvstart(get_disposition + ' --new-tag to branch of ' + item_type
- + ', given existing ' + ex_type + ' tag, fails')
- exr = run_get(get_disposition, b'--new-tag', (item, b'obj'),
- given=ex_tag)
- wvpassne(0, exr.rc)
- verify_rx(br'destination for .+ must be a VFS tag', exr.err)
-
- wvstart(get_disposition + ' --new-tag, implicit destinations')
- exr = run_get(get_disposition, b'--new-tag', b'.tag/commit-2')
- wvpasseq(0, exr.rc)
- validate_tagged_save(b'commit-2', getcwd() + b'/src/', commit_2_id, tree_2_id,
- b'src-2', exr.out)
- verify_only_refs(heads=[], tags=(b'commit-2',))
-
-def test_unnamed(get_disposition, src_info):
- tinyfile_id = src_info['tinyfile-id']
- tinyfile_path = src_info['tinyfile-path']
- subtree_vfs_path = src_info['subtree-vfs-path']
- wvstart(get_disposition + ' --unnamed to root fails')
- for item in (b'.tag/tinyfile',
- b'src/latest' + tinyfile_path,
- b'.tag/subtree',
- b'src/latest' + subtree_vfs_path,
- b'.tag/commit-1',
- b'src/latest',
- b'src'):
- for ex_ref in (None, (item, b'.tag/obj')):
- exr = run_get(get_disposition, b'--unnamed', (item, b'/'),
- given=ex_ref)
- wvpassne(0, exr.rc)
- verify_rx(br'usage: bup get ', exr.err)
-
- wvstart(get_disposition + ' --unnamed file')
- for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
- exr = run_get(get_disposition, b'--unnamed', item)
- wvpasseq(0, exr.rc)
- validate_blob(tinyfile_id, tinyfile_id)
- verify_only_refs(heads=[], tags=[])
-
- exr = run_get(get_disposition, b'--unnamed', item,
- given=(item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_blob(tinyfile_id, tinyfile_id)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- wvstart(get_disposition + ' --unnamed tree')
- subtree_id = src_info['subtree-id']
- for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
- exr = run_get(get_disposition, b'--unnamed', item)
- wvpasseq(0, exr.rc)
- validate_tree(subtree_id, subtree_id)
- verify_only_refs(heads=[], tags=[])
-
- exr = run_get(get_disposition, b'--unnamed', item,
- given=(item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_tree(subtree_id, subtree_id)
- verify_only_refs(heads=[], tags=(b'obj',))
-
- wvstart(get_disposition + ' --unnamed committish')
- save_2 = src_info['save-2']
- commit_2_id = src_info['commit-2-id']
- for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
- exr = run_get(get_disposition, b'--unnamed', item)
- wvpasseq(0, exr.rc)
- validate_commit(commit_2_id, commit_2_id)
- verify_only_refs(heads=[], tags=[])
-
- exr = run_get(get_disposition, b'--unnamed', item,
- given=(item, b'.tag/obj'))
- wvpasseq(0, exr.rc)
- validate_commit(commit_2_id, commit_2_id)
- verify_only_refs(heads=[], tags=(b'obj',))
-
-def create_get_src():
- global bup_cmd, src_info
- wvstart('preparing')
- ex((bup_cmd, b'-d', b'get-src', b'init'))
-
- mkdir(b'src')
- open(b'src/unrelated', 'a').close()
- ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
- ex((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'unrelated-branch', b'src'))
-
- ex((bup_cmd, b'-d', b'get-src', b'index', b'--clear'))
- rmrf(b'src')
- mkdir(b'src')
- open(b'src/zero', 'a').close()
- ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
- exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
- out = exr.out.splitlines()
- tree_0_id = out[0]
- commit_0_id = out[-1]
- exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
- save_0 = exr.out.splitlines()[0]
- ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-0', b'src'))
- ex((b'cp', b'-RPp', b'src', b'src-0'))
-
- rmrf(b'src')
- mkdir(b'src')
- mkdir(b'src/x')
- mkdir(b'src/x/y')
- ex((bup_cmd + b' -d get-src random 1k > src/1'), shell=True)
- ex((bup_cmd + b' -d get-src random 1k > src/x/2'), shell=True)
- ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
- exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
- out = exr.out.splitlines()
- tree_1_id = out[0]
- commit_1_id = out[-1]
- exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
- save_1 = exr.out.splitlines()[1]
- ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-1', b'src'))
- ex((b'cp', b'-RPp', b'src', b'src-1'))
-
- # Make a copy the current state of src so we'll have an ancestor.
- ex((b'cp', b'-RPp',
- b'get-src/refs/heads/src', b'get-src/refs/heads/src-ancestor'))
-
- with open(b'src/tiny-file', 'ab') as f: f.write(b'xyzzy')
- ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
- ex((bup_cmd, b'-d', b'get-src', b'tick')) # Ensure the save names differ
- exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
- out = exr.out.splitlines()
- tree_2_id = out[0]
- commit_2_id = out[-1]
- exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
- save_2 = exr.out.splitlines()[2]
- rename(b'src', b'src-2')
-
- src_root = getcwd() + b'/src'
-
- subtree_path = b'src-2/x'
- subtree_vfs_path = src_root + b'/x'
-
- # No support for "ls -d", so grep...
- exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + src_root))
- out = exr.out.splitlines()
- subtree_id = None
- for line in out:
- if b'x' in line:
- subtree_id = line.split()[0]
- assert(subtree_id)
-
- # With a tiny file, we'll get a single blob, not a chunked tree
- tinyfile_path = src_root + b'/tiny-file'
- exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + tinyfile_path))
- tinyfile_id = exr.out.splitlines()[0].split()[0]
-
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'tinyfile', tinyfile_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'subtree', subtree_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-0', tree_0_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-1', tree_1_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-2', tree_2_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-0', commit_0_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-1', commit_1_id))
- ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-2', commit_2_id))
- ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-1', commit_1_id))
- ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-2', commit_2_id))
-
- return {'tinyfile-path' : tinyfile_path,
- 'tinyfile-id' : tinyfile_id,
- 'subtree-id' : subtree_id,
- 'tree-0-id' : tree_0_id,
- 'tree-1-id' : tree_1_id,
- 'tree-2-id' : tree_2_id,
- 'commit-0-id' : commit_0_id,
- 'commit-1-id' : commit_1_id,
- 'commit-2-id' : commit_2_id,
- 'save-1' : save_1,
- 'save-2' : save_2,
- 'subtree-path' : subtree_path,
- 'subtree-vfs-path' : subtree_vfs_path}
-
-# FIXME: this fails in a strange way:
-# WVPASS given nothing get --ff not-there
-
-dispositions_to_test = ('get',)
-
-if int(environ.get(b'BUP_TEST_LEVEL', b'0')) >= 11:
- dispositions_to_test += ('get-on', 'get-to')
-
-if len(compat.argv) == 1:
- categories = ('replace', 'universal', 'ff', 'append', 'pick', 'new-tag',
- 'unnamed')
-else:
- categories = compat.argv[1:]
-
-with test_tempdir(b'get-') as tmpdir:
- chdir(tmpdir)
- try:
- src_info = create_get_src()
- for category in categories:
- for disposition in dispositions_to_test:
- # given=FOO depends on --replace, so test it early
- if category == 'replace':
- test_replace(disposition, src_info)
- elif category == 'universal':
- test_universal_behaviors(disposition)
- elif category == 'ff':
- test_ff(disposition, src_info)
- elif category == 'append':
- test_append(disposition, src_info)
- elif category == 'pick':
- test_pick(disposition, src_info, force=False)
- test_pick(disposition, src_info, force=True)
- elif category == 'new-tag':
- test_new_tag(disposition, src_info)
- elif category == 'unnamed':
- test_unnamed(disposition, src_info)
- else:
- raise Exception('unrecognized get test category')
- except Exception as ex:
- chdir(top)
- raise
- chdir(top)
-
-wvmsg('checked %d cases' % get_cases_tested)
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-# FIXME: send help to stdout if requested (exit 0), stderr on error
-# (exit nonzero)
-
-bup -?
-rc=$?
-WVPASSEQ 99 "$rc"
-
-bup --help
-rc=$?
-WVPASSEQ 99 "$rc"
-
-if ! test -e Documentation/bup-save.1; then
- WVPASS rm -rf "$tmpdir"
- exit 0
-fi
-
-mkdir -p "$tmpdir/man"
-(cd "$tmpdir/man" && ln -s "$top/Documentation" man1)
-export MANPATH="$tmpdir/man"
-
-WVPASS bup help save
-WVPASS bup save --help
-WVPASSEQ 1 $(bup help save | head -1 | grep -cF 'bup-save(1)')
-WVPASSEQ 1 $(bup save --help | head -1 | grep -cF 'bup-save(1)')
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-if ! [ "$(type -p duplicity)" != "" ]; then
- # FIXME: add WVSKIP.
- echo "Cannot find duplicity; skipping test)" 1>&2
- exit 0
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-bup() { "$top/bup" "$@"; }
-dup() { duplicity --archive-dir "$tmpdir/dup-cache" "$@"; }
-
-WVSTART "import-duplicity"
-WVPASS "$top/t/sync-tree" "$top/t/sampledata/" "$tmpdir/src/"
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-export PASSPHRASE=bup_duplicity_passphrase
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-WVPASS mkdir duplicity
-WVPASS dup src file://duplicity
-WVPASS bup tick
-WVPASS touch src/new-file
-WVPASS dup src file://duplicity
-WVPASS bup import-duplicity "file://duplicity" import-duplicity
-WVPASSEQ $(bup ls import-duplicity/ | wc -l) 3
-WVPASSEQ "$(bup ls import-duplicity/latest/ | sort)" "$(ls src | sort)"
-WVPASS bup restore -C restore/ import-duplicity/latest/
-WVFAIL "$top/t/compare-trees" src/ restore/ > tmp-compare-trees
-WVPASSEQ $(cat tmp-compare-trees | wc -l) 4
-# Note: OS X rsync itemize output is currently only 9 chars, not 11.
-# FreeBSD may output 12 chars instead - accept 9-12
-# Expect something like this (without the leading spaces):
-# .d..t...... ./
-# .L..t...... abs-symlink -> /home/foo/bup/t/sampledata/var/abs-symlink-target
-# .L..t...... b -> a
-# .L..t...... c -> b
-expected_diff_rx='^\.d\.\.t\.{4,7} \./$|^\.L\.\.t\.{4,7} '
-if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
- echo -n 'tmp-compare-trees: ' 1>&2
- cat tmp-compare-trees 1>&2
-fi
-WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-if ! [ "$(type -p rdiff-backup)" != "" ]; then
- # FIXME: add WVSKIP.
- echo "Cannot find rdiff-backup; skipping test)" 1>&2
- exit 0
-fi
-
-D=rdiff-backup.tmp
-WVSTART "import-rdiff-backup"
-WVPASS bup init
-WVPASS cd "$tmpdir"
-WVPASS mkdir rdiff-backup
-WVPASS rdiff-backup "$top/lib/cmd" rdiff-backup
-WVPASS bup tick
-WVPASS rdiff-backup "$top/Documentation" rdiff-backup
-WVPASS bup import-rdiff-backup rdiff-backup import-rdiff-backup
-WVPASSEQ $(bup ls import-rdiff-backup/ | wc -l) 3
-WVPASSEQ "$(bup ls -A import-rdiff-backup/latest/ | sort)" \
- "$(ls -A "$top/Documentation" | sort)"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. ./t/lib.sh || exit $?
-
-set -o pipefail
-
-root_status="$(t/root-status)" || exit $?
-
-if [ "$root_status" != root ]; then
- echo 'Not root: skipping --check-device tests.'
- exit 0 # FIXME: add WVSKIP.
-fi
-
-if test -n "$(type -p modprobe)" && ! modprobe loop; then
- echo 'Unable to load loopback module; skipping --check-device test.' 1>&2
- exit 0
-fi
-
-if test -z "$(type -p losetup)"; then
- echo 'Unable to find losetup: skipping --check-device tests.' 1>&2
- exit 0 # FIXME: add WVSKIP.
-fi
-
-if test -z "$(type -p mke2fs)"; then
- echo 'Unable to find mke2fs: skipping --check-device tests.' 1>&2
- exit 0 # FIXME: add WVSKIP.
-fi
-
-WVSTART '--check-device'
-
-top="$(pwd)"
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-srcmnt="$(WVPASS wvmkmountpt)" || exit $?
-tmpmnt1="$(WVPASS wvmkmountpt)" || exit $?
-tmpmnt2="$(WVPASS wvmkmountpt)" || exit $?
-
-WVPASS cd "$tmpdir"
-
-WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
-WVPASS mke2fs -F -j -m 0 testfs.img
-WVPASS mount -o loop testfs.img "$tmpmnt1"
-# Hide, so that tests can't create risks.
-WVPASS chown root:root "$tmpmnt1"
-WVPASS chmod 0700 "$tmpmnt1"
-
-# Create trivial content.
-WVPASS date > "$tmpmnt1/foo"
-WVPASS umount "$tmpmnt1"
-
-# Mount twice, so we'll have the same content with different devices.
-WVPASS cp -pP testfs.img testfs2.img
-WVPASS mount -oro,loop testfs.img "$tmpmnt1"
-WVPASS mount -oro,loop testfs2.img "$tmpmnt2"
-
-# Test default behavior: --check-device.
-WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
-WVPASS bup init
-WVPASS bup index --fake-valid "$srcmnt"
-WVPASS umount "$srcmnt"
-WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
-WVPASS bup index "$srcmnt"
-WVPASSEQ "$(bup index --status "$srcmnt")" \
-"M $srcmnt/lost+found/
-M $srcmnt/foo
-M $srcmnt/"
-WVPASS umount "$srcmnt"
-
-WVSTART '--no-check-device'
-WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
-WVPASS bup index --clear
-WVPASS bup index --fake-valid "$srcmnt"
-WVPASS umount "$srcmnt"
-WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
-WVPASS bup index --no-check-device "$srcmnt"
-WVPASS bup index --status "$srcmnt"
-WVPASSEQ "$(bup index --status "$srcmnt")" \
-" $srcmnt/lost+found/
- $srcmnt/foo
- $srcmnt/"
-
-WVPASS umount "$srcmnt"
-WVPASS umount "$tmpmnt1"
-WVPASS umount "$tmpmnt2"
-WVPASS rm -r "$tmpmnt1" "$tmpmnt2" "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-
-WVSTART "index --clear"
-WVPASS mkdir src
-WVPASS touch src/foo src/bar
-WVPASS bup index -u src
-WVPASSEQ "$(bup index -p)" "src/foo
-src/bar
-src/
-./"
-WVPASS rm src/foo
-WVPASS bup index --clear
-WVPASS bup index -u src
-expected="$(WVPASS bup index -p)" || exit $?
-WVPASSEQ "$expected" "src/bar
-src/
-./"
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVPASS bup init
-
-WVSTART "index"
-D=bupdata.tmp
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVFAIL bup index --exclude-from $D/cannot-exist $D
-WVPASSEQ "$(bup index --check -p)" ""
-WVPASSEQ "$(bup index --check -p $D)" ""
-WVFAIL [ -e $D.fake ]
-WVFAIL bup index --check -u $D.fake
-WVPASS bup index --check -u $D
-WVPASSEQ "$(bup index --check -p $D)" "$D/"
-WVPASS touch $D/a
-WVPASS bup random 128k >$D/b
-WVPASS mkdir $D/d $D/d/e
-WVPASS bup random 512 >$D/f
-WVPASS ln -s non-existent-file $D/g
-WVPASSEQ "$(bup index -s $D/)" "A $D/"
-WVPASSEQ "$(bup index -s $D/b)" ""
-WVPASSEQ "$(bup index --check -us $D/b)" "A $D/b"
-WVPASSEQ "$(bup index --check -us $D/b $D/d)" \
-"A $D/d/e/
-A $D/d/
-A $D/b"
-WVPASS touch $D/d/z
-WVPASS bup tick
-WVPASSEQ "$(bup index --check -usx $D)" \
-"A $D/g
-A $D/f
-A $D/d/z
-A $D/d/e/
-A $D/d/
-A $D/b
-A $D/a
-A $D/"
-WVPASSEQ "$(bup index --check -us $D/a $D/b --fake-valid)" \
-" $D/b
- $D/a"
-WVPASSEQ "$(bup index --check -us $D/a)" " $D/a" # stays unmodified
-WVPASSEQ "$(bup index --check -us $D/d --fake-valid)" \
-" $D/d/z
- $D/d/e/
- $D/d/"
-WVPASS touch $D/d/z
-WVPASS bup index -u $D/d/z # becomes modified
-WVPASSEQ "$(bup index -s $D/a $D $D/b)" \
-"A $D/g
-A $D/f
-M $D/d/z
- $D/d/e/
-M $D/d/
- $D/b
- $D/a
-A $D/"
-
-WVPASS bup index -u $D/d/e $D/a --fake-invalid
-WVPASSEQ "$(cd $D && bup index -m .)" \
-"./g
-./f
-./d/z
-./d/e/
-./d/
-./a
-./"
-WVPASSEQ "$(cd $D && bup index -m)" \
-"g
-f
-d/z
-d/e/
-d/
-a
-./"
-WVPASSEQ "$(cd $D && bup index -s .)" "$(cd $D && bup index -s .)"
-
-WVFAIL bup save -t $D/doesnt-exist-filename
-
-WVPASS mv "$BUP_DIR/bupindex" "$BUP_DIR/bi.old"
-WVFAIL bup save -t $D/d/e/fifotest
-WVPASS mkfifo $D/d/e/fifotest
-WVPASS bup index -u $D/d/e/fifotest
-WVPASS bup save -t $D/d/e/fifotest
-WVPASS bup save -t $D/d/e
-WVPASS rm -f $D/d/e/fifotest
-WVPASS bup index -u $D/d/e
-WVFAIL bup save -t $D/d/e/fifotest
-WVPASS mv "$BUP_DIR/bi.old" "$BUP_DIR/bupindex"
-
-WVPASS bup index -u $D/d/e
-WVPASS bup save -t $D/d/e
-WVPASSEQ "$(cd $D && bup index -m)" \
-"g
-f
-d/z
-d/
-a
-./"
-WVPASS bup save -t $D/d
-WVPASS bup index --fake-invalid $D/d/z
-WVPASS bup save -t $D/d/z
-WVPASS bup save -t $D/d/z # test regenerating trees when no files are changed
-WVPASS bup save -t $D/d
-WVPASSEQ "$(cd $D && bup index -m)" \
-"g
-f
-a
-./"
-WVPASS bup save -r ":$BUP_DIR" -n r-test $D
-WVFAIL bup save -r ":$BUP_DIR/fake/path" -n r-test $D
-WVFAIL bup save -r ":$BUP_DIR" -n r-test $D/fake/path
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-TOP="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
- "$TOP/bup" "$@"
-}
-
-WVSTART 'bup list-idx'
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-WVPASS mkdir src
-WVPASS bup random 1k > src/data
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx
-hash1="$(WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx)" || exit $?
-hash1="${hash1##* }"
-WVPASS bup list-idx --find "${hash1}" "$BUP_DIR"/objects/pack/*.idx \
- > list-idx.log || exit $?
-found="$(cat list-idx.log)" || exit $?
-found="${found##* }"
-WVPASSEQ "$found" "$hash1"
-WVPASSEQ "$(wc -l < list-idx.log | tr -d ' ')" 1
-
-WVPASS rm -r "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-if test "$BUP_TEST_REMOTE_REPO"; then
- ls_cmd_desc='ls -r'
-else
- ls_cmd_desc='ls'
-fi
-
-bup() { "$top/bup" "$@"; }
-
-bup-ls() {
- if test "$BUP_TEST_REMOTE_REPO"; then
- "$top/bup" ls -r "$BUP_DIR" "$@"
- else
- "$top/bup" ls "$@"
- fi
-}
-
-
-export TZ=UTC
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVPASS mkdir src
-WVPASS touch src/.dotfile src/executable
-WVPASS mkfifo src/fifo
-WVPASS "$top"/t/mksock src/socket
-WVPASS bup random 1k > src/file
-WVPASS chmod u+x src/executable
-WVPASS chmod -R u=rwX,g-rwx,o-rwx .
-WVPASS touch -t 200910032348 src/.dotfile src/*
-(WVPASS cd src; WVPASS ln -s file symlink) || exit $?
-(WVPASS cd src; WVPASS ln -s not-there bad-symlink) || exit $?
-WVPASS touch -t 200910032348 src
-WVPASS touch -t 200910032348 .
-WVPASS bup index src
-# Include two saves to test multiple results per ref from rev_list.
-WVPASS bup save -n src -d 242312159 --strip src
-WVPASS bup save -n src -d 242312160 --strip src
-WVPASS bup tag some-tag src
-
-uid="$(WVPASS id -u)" || exit $?
-gid="$(WVPASS bup-cfg-py -c 'import os; print(os.stat("src").st_gid)')" || exit $?
-user="$(WVPASS id -un)" || exit $?
-group="$(WVPASS bup-cfg-py -c 'import grp, os;
-print(grp.getgrgid(os.stat("src").st_gid)[0])')" || exit $?
-src_commit_hash=$(git log --format=%H -n1 src)
-src_tree_hash=$(git log --format=%T -n1 src)
-
-
-WVSTART "$ls_cmd_desc (short)"
-
-(export BUP_FORCE_TTY=1; WVPASSEQ "$(WVPASS bup-ls | tr -d ' ')" src)
-
-WVPASSEQ "$(WVPASS bup-ls /)" "src"
-
-WVPASSEQ "$(WVPASS bup-ls -A /)" ".tag
-src"
-
-WVPASSEQ "$(WVPASS bup-ls -AF /)" ".tag/
-src/"
-
-WVPASSEQ "$(WVPASS bup-ls -a /)" ".
-..
-.tag
-src"
-
-WVPASSEQ "$(WVPASS bup-ls -aF /)" "./
-../
-.tag/
-src/"
-
-WVPASSEQ "$(WVPASS bup-ls /.tag)" "some-tag"
-
-WVPASSEQ "$(WVPASS bup-ls /src)" \
-"1977-09-05-125559
-1977-09-05-125600
-latest"
-
-WVPASSEQ "$(WVPASS bup-ls src/latest)" "bad-symlink
-executable
-fifo
-file
-socket
-symlink"
-
-WVPASSEQ "$(WVPASS bup-ls -A src/latest)" ".dotfile
-bad-symlink
-executable
-fifo
-file
-socket
-symlink"
-
-WVPASSEQ "$(WVPASS bup-ls -a src/latest)" ".
-..
-.dotfile
-bad-symlink
-executable
-fifo
-file
-socket
-symlink"
-
-WVPASSEQ "$(WVPASS bup-ls -F src/latest)" "bad-symlink@
-executable*
-fifo|
-file
-socket=
-symlink@"
-
-WVPASSEQ "$(WVPASS bup-ls --file-type src/latest)" "bad-symlink@
-executable
-fifo|
-file
-socket=
-symlink@"
-
-WVPASSEQ "$(WVPASS bup-ls -d src/latest)" "src/latest"
-
-
-WVSTART "$ls_cmd_desc (long)"
-
-WVPASSEQ "$(WVPASS bup-ls -l / | tr -s ' ' ' ')" \
-"drwx------ $user/$group 0 2009-10-03 23:48 src"
-
-WVPASSEQ "$(WVPASS bup-ls -lA / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
-drwx------ $user/$group 0 2009-10-03 23:48 src"
-
-WVPASSEQ "$(WVPASS bup-ls -lAF / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
-drwx------ $user/$group 0 2009-10-03 23:48 src/"
-
-WVPASSEQ "$(WVPASS bup-ls -la / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 .
-drwxr-xr-x ?/? 0 1970-01-01 00:00 ..
-drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
-drwx------ $user/$group 0 2009-10-03 23:48 src"
-
-WVPASSEQ "$(WVPASS bup-ls -laF / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 ./
-drwxr-xr-x ?/? 0 1970-01-01 00:00 ../
-drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
-drwx------ $user/$group 0 2009-10-03 23:48 src/"
-
-socket_mode="$(WVPASS ls -l src/socket | cut -b -10)" || exit $?
-
-
-bad_symlink_mode="$(WVPASS ls -l src/bad-symlink | cut -b -10)" || exit $?
-
-bad_symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep bad-symlink)" \
- || exit $?
-bad_symlink_date="$(WVPASS echo "$bad_symlink_bup_info" \
- | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
- || exit $?
-
-test "$bad_symlink_date" || exit 1
-
-if test "$(uname -s)" != NetBSD; then
- bad_symlink_size="$(WVPASS bup-cfg-py -c "import os
-print(os.lstat('src/bad-symlink').st_size)")" || exit $?
-else
- # NetBSD appears to return varying sizes, so for now, just ignore it.
- bad_symlink_size="$(WVPASS echo "$bad_symlink_bup_info" \
- | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
- || exit $?
-fi
-
-
-symlink_mode="$(WVPASS ls -l src/symlink | cut -b -10)" || exit $?
-
-symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep -E '[^-]symlink')" \
- || exit $?
-symlink_date="$(WVPASS echo "$symlink_bup_info" \
- | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
- || exit $?
-
-test "$symlink_date" || exit 1
-
-if test "$(uname -s)" != NetBSD; then
- symlink_size="$(WVPASS bup-cfg-py -c "import os
-print(os.lstat('src/symlink').st_size)")" || exit $?
-else
- # NetBSD appears to return varying sizes, so for now, just ignore it.
- symlink_size="$(WVPASS echo "$symlink_bup_info" \
- | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
- || exit $?
-fi
-
-WVPASSEQ "$(bup-ls -l src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket
-$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -la src/latest | tr -s ' ' ' ')" \
-"drwx------ $user/$group 0 2009-10-03 23:48 .
-drwx------ $user/$group 0 2009-10-03 23:48 ..
--rw------- $user/$group 0 2009-10-03 23:48 .dotfile
-$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket
-$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -lA src/latest | tr -s ' ' ' ')" \
-"-rw------- $user/$group 0 2009-10-03 23:48 .dotfile
-$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket
-$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -lF src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable*
-prw------- $user/$group 0 2009-10-03 23:48 fifo|
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket=
-$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
-
-WVPASSEQ "$(bup-ls -l --file-type src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo|
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket=
-$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
-
-WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $uid/$gid 0 2009-10-03 23:48 executable
-prw------- $uid/$gid 0 2009-10-03 23:48 fifo
--rw------- $uid/$gid 1024 2009-10-03 23:48 file
-$socket_mode $uid/$gid 0 2009-10-03 23:48 socket
-$symlink_mode $uid/$gid $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -ld "src/latest" | tr -s ' ' ' ')" \
-"lrwxr-xr-x ?/? 17 1970-01-01 00:00 src/latest -> 1977-09-05-125600"
-
-
-WVSTART "$ls_cmd_desc (backup set - long)"
-WVPASSEQ "$(bup-ls -l --numeric-ids src | cut -d' ' -f 1-2)" \
-"drwx------ $uid/$gid
-drwx------ $uid/$gid
-lrwxr-xr-x ?/?"
-
-WVPASSEQ "$(bup-ls -ds "src/1977-09-05-125600" | tr -s ' ' ' ')" \
-"$src_tree_hash src/1977-09-05-125600"
-
-WVPASSEQ "$(bup-ls -ds --commit-hash "src/1977-09-05-125600" | tr -s ' ' ' ')" \
-"$src_commit_hash src/1977-09-05-125600"
-
-
-WVSTART "$ls_cmd_desc (dates TZ != UTC)"
-export TZ=America/Chicago
-bad_symlink_date_central="$(bup-ls -l src/latest | grep bad-symlink)"
-bad_symlink_date_central="$(echo "$bad_symlink_date_central" \
- | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
-symlink_date_central="$(bup-ls -l src/latest | grep -E '[^-]symlink')"
-symlink_date_central="$(echo "$symlink_date_central" \
- | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
-WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date_central bad-symlink -> not-there
--rwx------ $uid/$gid 0 2009-10-03 18:48 executable
-prw------- $uid/$gid 0 2009-10-03 18:48 fifo
--rw------- $uid/$gid 1024 2009-10-03 18:48 file
-$socket_mode $uid/$gid 0 2009-10-03 18:48 socket
-$symlink_mode $uid/$gid $symlink_size $symlink_date_central symlink -> file"
-export TZ=UTC
-
-
-WVSTART "$ls_cmd_desc bad-symlink"
-WVPASSEQ "$(bup-ls "src/latest/bad-symlink")" "src/latest/bad-symlink"
-
-WVSTART "$ls_cmd_desc -l bad-symlink"
-WVPASSEQ "$(bup-ls -l src/latest/bad-symlink | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date src/latest/bad-symlink -> not-there"
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-
-BUP_TEST_REMOTE_REPO=t t/test-ls
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-TOP="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
- "$TOP/bup" "$@"
-}
-
-WVSTART 'main'
-
-bup
-rc=$?
-WVPASSEQ "$rc" 99
-
-WVPASS rm -r "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-root_status="$(t/root-status)" || exit $?
-
-TOP="$(WVPASS pwd)" || exit $?
-export PATH="$TOP/t/bin:$PATH"
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-# Assume that mvmktempdir will always use the same dir.
-timestamp_resolutions="$(t/ns-timestamp-resolutions "$tmpdir/canary")" \
- || exit $?
-atime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 1)" \
- || exit $?
-mtime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 2)" \
- || exit $?
-WVPASS rm "$tmpdir/canary"
-
-bup()
-{
- "$TOP/bup" "$@"
-}
-
-hardlink-sets()
-{
- "$TOP/t/hardlink-sets" "$@"
-}
-
-id-other-than()
-{
- "$TOP/t/id-other-than" "$@"
-}
-
-# Very simple metadata tests -- create a test tree then check that bup
-# meta can reproduce the metadata correctly (according to bup xstat)
-# via create, extract, start-extract, and finish-extract. The current
-# tests are crude, and this does not fully test devices, varying
-# users/groups, acls, attrs, etc.
-
-genstat()
-{
- (
- export PATH="$TOP/bin:$PATH" # pick up bup
- bup version
- # Skip atime (test elsewhere) to avoid the observer effect.
- WVPASS find . -print0 | WVPASS sort-z \
- | WVPASS xargs -0 bup xstat \
- --mtime-resolution "$mtime_resolution"ns \
- --exclude-fields ctime,atime,size
- )
-}
-
-test-src-create-extract()
-{
- # Test bup meta create/extract for ./src -> ./src-restore.
- # Also writes to ./src-stat and ./src-restore-stat.
- (
- (WVPASS cd src; WVPASS genstat) > src-stat || exit $?
- WVPASS bup meta --create --recurse --file src.meta src
- # Test extract.
- WVPASS force-delete src-restore
- WVPASS mkdir src-restore
- WVPASS cd src-restore
- WVPASS bup meta --extract --file ../src.meta
- WVPASS test -d src
- (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
- WVPASS diff -U5 ../src-stat ../src-restore-stat
- # Test start/finish extract.
- WVPASS force-delete src
- WVPASS bup meta --start-extract --file ../src.meta
- WVPASS test -d src
- WVPASS bup meta --finish-extract --file ../src.meta
- (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
- WVPASS diff -U5 ../src-stat ../src-restore-stat
- )
-}
-
-test-src-save-restore()
-{
- # Test bup save/restore metadata for ./src -> ./src-restore. Also
- # writes to BUP_DIR. Note that for now this just tests the
- # restore below src/, in order to avoid having to worry about
- # operations that require root (like chown /home).
- (
- WVPASS rm -rf "$BUP_DIR"
- WVPASS bup init
- WVPASS bup index src
- WVPASS bup save -t -n src src
- # Test extract.
- WVPASS force-delete src-restore
- WVPASS mkdir src-restore
- WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
- WVPASS test -d src-restore/src
- WVPASS "$TOP/t/compare-trees" -c src/ src-restore/src/
- WVPASS rm -rf src.bup
- )
-}
-
-setup-test-tree()
-{
- WVPASS "$TOP/t/sync-tree" "$TOP/t/sampledata/" "$tmpdir/src/"
-
- # Add some hard links for the general tests.
- (
- WVPASS cd "$tmpdir"/src
- WVPASS touch hardlink-target
- WVPASS ln hardlink-target hardlink-1
- WVPASS ln hardlink-target hardlink-2
- WVPASS ln hardlink-target hardlink-3
- ) || exit $?
-
- # Add some trivial files for the index, modify, save tests.
- (
- WVPASS cd "$tmpdir"/src
- WVPASS mkdir volatile
- WVPASS touch volatile/{1,2,3}
- ) || exit $?
-
- # Regression test for metadata sort order. Previously, these two
- # entries would sort in the wrong order because the metadata
- # entries were being sorted by mangled name, but the index isn't.
- WVPASS dd if=/dev/zero of="$tmpdir"/src/foo bs=1k count=33
- WVPASS touch -t 201111111111 "$tmpdir"/src/foo
- WVPASS touch -t 201112121111 "$tmpdir"/src/foo-bar
-
- t/mksock "$tmpdir"/src/test-socket || true
-}
-
-# Use the test tree to check bup meta.
-WVSTART 'meta --create/--extract'
-(
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- export BUP_DIR="$tmpdir/bup"
- WVPASS setup-test-tree
- WVPASS cd "$tmpdir"
- WVPASS test-src-create-extract
-
- # Test a top-level file (not dir).
- WVPASS touch src-file
- WVPASS bup meta -cf src-file.meta src-file
- WVPASS mkdir dest
- WVPASS cd dest
- WVPASS bup meta -xf ../src-file.meta
- WVPASS rm -r "$tmpdir"
-) || exit $?
-
-# Use the test tree to check bup save/restore metadata.
-WVSTART 'metadata save/restore (general)'
-(
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- export BUP_DIR="$tmpdir/bup"
- WVPASS setup-test-tree
- WVPASS cd "$tmpdir"
- WVPASS test-src-save-restore
-
- # Test a deeper subdir/ to make sure top-level non-dir metadata is
- # restored correctly. We need at least one dir and one non-dir at
- # the "top-level".
- WVPASS test -d src/var/cmd
- WVPASS test -f src/var/cmd/save-cmd.py
- WVPASS rm -rf "$BUP_DIR"
- WVPASS bup init
- WVPASS touch -t 201111111111 src-restore # Make sure the top won't match.
- WVPASS bup index src
- WVPASS bup save -t -n src src
- WVPASS force-delete src-restore
- WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/var/."
- WVPASS touch -t 201211111111 src-restore # Make sure the top won't match.
- # Check that the only difference is the top dir.
- WVFAIL $TOP/t/compare-trees -c src/var/ src-restore/ > tmp-compare-trees
- WVPASSEQ $(cat tmp-compare-trees | wc -l) 1
- # The number of rsync status characters varies, so accept any
- # number of trailing dots. For example OS X native rsync produces
- # 9, but Homebrew's produces 12, while on other platforms, 11 is
- # common.
- expected_diff_rx='^\.d\.\.t\.\.\.(\.)+ \./$'
- if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
- echo -n 'tmp-compare-trees: ' 1>&2
- cat tmp-compare-trees 1>&2
- fi
- WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
- WVPASS rm -r "$tmpdir"
-) || exit $?
-
-# Test that we pull the index (not filesystem) metadata for any
-# unchanged files whenever we're saving other files in a given
-# directory.
-WVSTART 'metadata save/restore (using index metadata)'
-(
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- export BUP_DIR="$tmpdir/bup"
- WVPASS setup-test-tree
- WVPASS cd "$tmpdir"
-
- # ...for now -- might be a problem with hardlink restores that was
- # causing noise wrt this test.
- WVPASS rm -rf src/hardlink*
-
- # Pause here to keep the filesystem changes far enough away from
- # the first index run that bup won't cap their index timestamps
- # (see "bup help index" for more information). Without this
- # sleep, the compare-trees test below "Bup should *not* pick up
- # these metadata..." may fail.
- WVPASS sleep 1
-
- WVPASS rm -rf "$BUP_DIR"
- WVPASS bup init
- WVPASS bup index src
- WVPASS bup save -t -n src src
-
- WVPASS force-delete src-restore-1
- WVPASS mkdir src-restore-1
- WVPASS bup restore -C src-restore-1 "/src/latest$(pwd)/"
- WVPASS test -d src-restore-1/src
- WVPASS "$TOP/t/compare-trees" -c src/ src-restore-1/src/
-
- WVPASS echo "blarg" > src/volatile/1
- WVPASS cp -pP src/volatile/1 src-restore-1/src/volatile/
- WVPASS bup index src
-
- # Bup should *not* pick up these metadata changes.
- WVPASS touch src/volatile/2
-
- WVPASS bup save -t -n src src
-
- WVPASS force-delete src-restore-2
- WVPASS mkdir src-restore-2
- WVPASS bup restore -C src-restore-2 "/src/latest$(pwd)/"
- WVPASS test -d src-restore-2/src
- WVPASS "$TOP/t/compare-trees" -c src-restore-1/src/ src-restore-2/src/
-
- WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-
-setup-hardlink-test()
-{
- WVPASS rm -rf "$tmpdir/src" "$BUP_DIR"
- WVPASS bup init
- WVPASS mkdir "$tmpdir/src"
-}
-
-hardlink-test-run-restore()
-{
- WVPASS force-delete src-restore
- WVPASS mkdir src-restore
- WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
- WVPASS test -d src-restore/src
-}
-
-# Test hardlinks more carefully.
-WVSTART 'metadata save/restore (hardlinks)'
-(
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- export BUP_DIR="$tmpdir/bup"
-
- WVPASS setup-hardlink-test
- WVPASS cd "$tmpdir"
-
- # Test trivial case - single hardlink.
- (
- WVPASS cd src
- WVPASS touch hardlink-target
- WVPASS ln hardlink-target hardlink-1
- ) || exit $?
- WVPASS bup index src
- WVPASS bup save -t -n src src
- WVPASS hardlink-test-run-restore
- WVPASS "$TOP/t/compare-trees" -c src/ src-restore/src/
-
- # Test the case where the hardlink hasn't changed, but the tree
- # needs to be saved again. i.e. the save-cmd.py "if hashvalid:"
- # case.
- (
- WVPASS cd src
- WVPASS echo whatever > something-new
- ) || exit $?
- WVPASS bup index src
- WVPASS bup save -t -n src src
- WVPASS hardlink-test-run-restore
- WVPASS "$TOP/t/compare-trees" -c src/ src-restore/src/
-
- # Test hardlink changes between index runs.
- #
- WVPASS setup-hardlink-test
- WVPASS cd src
- WVPASS touch hardlink-target-a
- WVPASS touch hardlink-target-b
- WVPASS ln hardlink-target-a hardlink-b-1
- WVPASS ln hardlink-target-a hardlink-a-1
- WVPASS cd ..
- WVPASS bup index -vv src
- WVPASS rm src/hardlink-b-1
- WVPASS ln src/hardlink-target-b src/hardlink-b-1
- WVPASS bup index -vv src
- WVPASS bup save -t -n src src
- WVPASS hardlink-test-run-restore
- WVPASS echo ./src/hardlink-a-1 > hardlink-sets.expected
- WVPASS echo ./src/hardlink-target-a >> hardlink-sets.expected
- WVPASS echo >> hardlink-sets.expected
- WVPASS echo ./src/hardlink-b-1 >> hardlink-sets.expected
- WVPASS echo ./src/hardlink-target-b >> hardlink-sets.expected
- (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
- || exit $?
- WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
- # Test hardlink changes between index and save -- hardlink set [a
- # b c d] changes to [a b] [c d]. At least right now bup should
- # notice and recreate the latter.
- WVPASS setup-hardlink-test
- WVPASS cd "$tmpdir"/src
- WVPASS touch a
- WVPASS ln a b
- WVPASS ln a c
- WVPASS ln a d
- WVPASS cd ..
- WVPASS bup index -vv src
- WVPASS rm src/c src/d
- WVPASS touch src/c
- WVPASS ln src/c src/d
- WVPASS bup save -t -n src src
- WVPASS hardlink-test-run-restore
- WVPASS echo ./src/a > hardlink-sets.expected
- WVPASS echo ./src/b >> hardlink-sets.expected
- WVPASS echo >> hardlink-sets.expected
- WVPASS echo ./src/c >> hardlink-sets.expected
- WVPASS echo ./src/d >> hardlink-sets.expected
- (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
- || exit $?
- WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
- # Test that we don't link outside restore tree.
- WVPASS setup-hardlink-test
- WVPASS cd "$tmpdir"
- WVPASS mkdir src/a src/b
- WVPASS touch src/a/1
- WVPASS ln src/a/1 src/b/1
- WVPASS bup index -vv src
- WVPASS bup save -t -n src src
- WVPASS force-delete src-restore
- WVPASS mkdir src-restore
- WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/a/"
- WVPASS test -e src-restore/1
- WVPASS echo -n > hardlink-sets.expected
- (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
- || exit $?
- WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
- # Test that we do link within separate sub-trees.
- WVPASS setup-hardlink-test
- WVPASS cd "$tmpdir"
- WVPASS mkdir src/a src/b
- WVPASS touch src/a/1
- WVPASS ln src/a/1 src/b/1
- WVPASS bup index -vv src/a src/b
- WVPASS bup save -t -n src src/a src/b
- WVPASS hardlink-test-run-restore
- WVPASS echo ./src/a/1 > hardlink-sets.expected
- WVPASS echo ./src/b/1 >> hardlink-sets.expected
- (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
- || exit $?
- WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
- WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-WVSTART 'meta --edit'
-(
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- WVPASS cd "$tmpdir"
- WVPASS mkdir src
-
- WVPASS bup meta -cf src.meta src
-
- WVPASS bup meta --edit --set-uid 0 src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^uid: 0'
- WVPASS bup meta --edit --set-uid 1000 src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^uid: 1000'
-
- WVPASS bup meta --edit --set-gid 0 src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^gid: 0'
- WVPASS bup meta --edit --set-gid 1000 src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^gid: 1000'
-
- WVPASS bup meta --edit --set-user foo src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^user: foo'
- WVPASS bup meta --edit --set-user bar src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^user: bar'
- WVPASS bup meta --edit --unset-user src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^user:'
- WVPASS bup meta --edit --set-user bar --unset-user src.meta \
- | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user:'
- WVPASS bup meta --edit --unset-user --set-user bar src.meta \
- | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user: bar'
-
- WVPASS bup meta --edit --set-group foo src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^group: foo'
- WVPASS bup meta --edit --set-group bar src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^group: bar'
- WVPASS bup meta --edit --unset-group src.meta | WVPASS bup meta -tvvf - \
- | WVPASS grep -qE '^group:'
- WVPASS bup meta --edit --set-group bar --unset-group src.meta \
- | WVPASS bup meta -tvvf - | WVPASS grep -qE '^group:'
- WVPASS bup meta --edit --unset-group --set-group bar src.meta \
- | WVPASS bup meta -tvvf - | grep -qE '^group: bar'
-
- WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-WVSTART 'meta --no-recurse'
-(
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- WVPASS cd "$tmpdir"
- WVPASS mkdir src
- WVPASS mkdir src/foo
- WVPASS touch src/foo/{1,2,3}
- WVPASS bup meta -cf src.meta src
- WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/
-src/foo/
-src/foo/1
-src/foo/2
-src/foo/3"
- WVPASS bup meta --no-recurse -cf src.meta src
- WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/"
- WVPASS rm -r "$tmpdir"
-) || exit $?
-
-# Test ownership restoration (when not root or fakeroot).
-(
- if [ "$root_status" != none ]; then
- exit 0
- fi
-
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
- # FIXME: binary groups
- first_group="$(WVPASS bup-cfg-py -c 'import os,grp; \
- print(grp.getgrgid(os.getgroups()[0])[0])')" || exit $?
- last_group="$(bup-cfg-py -c 'import os,grp; \
- print(grp.getgrgid(os.getgroups()[-1])[0])')" || exit $?
- last_group_erx="$(escape-erx "$last_group")"
-
- WVSTART 'metadata (restoration of ownership)'
- WVPASS cd "$tmpdir"
- WVPASS touch src
- # Some systems always assign the parent dir group to new paths
- # (sgid). Make sure the group is one we're in.
- WVPASS chgrp -R "$first_group" src
-
- WVPASS bup meta -cf src.meta src
-
- WVPASS mkdir dest
- WVPASS cd dest
- # Make sure we don't change (or try to change) the user when not root.
- WVPASS bup meta --edit --set-user root ../src.meta | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
- WVPASS rm -rf src
- WVPASS bup meta --edit --unset-user --set-uid 0 ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
-
- # Make sure we can restore one of the user's groups.
- WVPASS rm -rf src
- WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qE "^group: $last_group_erx"
-
- # Make sure we can restore one of the user's gids.
- user_gids="$(id -G)" || exit $?
- last_gid="$(echo ${user_gids/* /})" || exit $?
- WVPASS rm -rf src
- WVPASS bup meta --edit --unset-group --set-gid "$last_gid" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qE "^gid: $last_gid"
-
- # Test --numeric-ids (gid).
- WVPASS rm -rf src
- current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
- WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
- | WVPASS bup meta -x --numeric-ids
- new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
- WVPASSEQ "$current_gidx" "$new_gidx"
-
- # Test that restoring an unknown user works.
- unknown_user=$("$TOP"/t/unknown-owner --user) || exit $?
- WVPASS rm -rf src
- current_uidx=$(bup meta -tvvf ../src.meta | grep -ae '^uid:') || exit $?
- WVPASS bup meta --edit --set-user "$unknown_user" ../src.meta \
- | WVPASS bup meta -x
- new_uidx=$(bup xstat src | grep -ae '^uid:') || exit $?
- WVPASSEQ "$current_uidx" "$new_uidx"
-
- # Test that restoring an unknown group works.
- unknown_group=$("$TOP"/t/unknown-owner --group) || exit $?
- WVPASS rm -rf src
- current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
- WVPASS bup meta --edit --set-group "$unknown_group" ../src.meta \
- | WVPASS bup meta -x
- new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
- WVPASSEQ "$current_gidx" "$new_gidx"
-
- WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-# Test ownership restoration (when root or fakeroot).
-(
- if [ "$root_status" = none ]; then
- exit 0
- fi
-
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
- uid=$(WVPASS id -un) || exit $?
- gid=$(WVPASS id -gn) || exit $?
-
- WVSTART 'metadata (restoration of ownership as root)'
- WVPASS cd "$tmpdir"
- WVPASS touch src
- WVPASS chown "$uid:$gid" src # In case the parent dir is sgid, etc.
- WVPASS bup meta -cf src.meta src
-
- WVPASS mkdir dest
- WVPASS chmod 700 dest # so we can't accidentally do something insecure
- WVPASS cd dest
-
- other_uinfo="$(id-other-than --user "$uid")" || exit $?
- other_user="${other_uinfo%%:*}"
- other_uid="${other_uinfo##*:}"
-
- other_ginfo="$(id-other-than --group "$gid")" || exit $?
- other_group="${other_ginfo%%:*}"
- other_gid="${other_ginfo##*:}"
-
- # Make sure we can restore a uid (must be in /etc/passwd b/c cygwin).
- WVPASS bup meta --edit --unset-user --set-uid "$other_uid" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qE "^uid: $other_uid"
-
- # Make sure we can restore a gid (must be in /etc/group b/c cygwin).
- WVPASS bup meta --edit --unset-group --set-gid "$other_gid" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qE "^gid: $other_gid"
-
- other_uinfo2="$(id-other-than --user "$(id -un)" "$other_user")" || exit $?
- other_user2="${other_uinfo2%%:*}"
- other_user2_erx="$(escape-erx "$other_user2")" || exit $?
- other_uid2="${other_uinfo2##*:}"
-
- other_ginfo2="$(id-other-than --group "$(id -gn)" "$other_group")" || exit $?
- other_group2="${other_ginfo2%%:*}"
- other_group2_erx="$(escape-erx "$other_group2")" || exit $?
- other_gid2="${other_ginfo2##*:}"
-
- # Try to restore a user (and see that user trumps uid when uid is not 0).
- WVPASS bup meta --edit \
- --set-uid "$other_uid" --set-user "$other_user2" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qE "^user: $other_user2_erx"
-
- # Try to restore a group (and see that group trumps gid when gid is not 0).
- WVPASS bup meta --edit \
- --set-gid "$other_gid" --set-group "$other_group2" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qE "^group: $other_group2_erx"
-
- # Test --numeric-ids (uid). Note the name 'root' is not handled
- # specially, so we use that here as the test user name. We assume
- # that the root user's uid is never 42.
- WVPASS rm -rf src
- WVPASS bup meta --edit --set-user root --set-uid "$other_uid" ../src.meta \
- | WVPASS bup meta -x --numeric-ids
- new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
- WVPASSEQ "$new_uidx" "uid: $other_uid"
-
- # Test --numeric-ids (gid). Note the name 'root' is not handled
- # specially, so we use that here as the test group name. We
- # assume that the root group's gid is never 42.
- WVPASS rm -rf src
- WVPASS bup meta --edit --set-group root --set-gid "$other_gid" ../src.meta \
- | WVPASS bup meta -x --numeric-ids
- new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
- WVPASSEQ "$new_gidx" "gid: $other_gid"
-
- # Test that restoring an unknown user works.
- unknown_user=$("$TOP"/t/unknown-owner --user) || exit $?
- WVPASS rm -rf src
- WVPASS bup meta --edit \
- --set-uid "$other_uid" --set-user "$unknown_user" ../src.meta \
- | WVPASS bup meta -x
- new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
- WVPASSEQ "$new_uidx" "uid: $other_uid"
-
- # Test that restoring an unknown group works.
- unknown_group=$("$TOP"/t/unknown-owner --group) || exit $?
- WVPASS rm -rf src
- WVPASS bup meta --edit \
- --set-gid "$other_gid" --set-group "$unknown_group" ../src.meta \
- | WVPASS bup meta -x
- new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
- WVPASSEQ "$new_gidx" "gid: $other_gid"
-
- if ! [[ $(uname) =~ CYGWIN ]]; then
- # For now, skip these on Cygwin because it doesn't allow
- # restoring an unknown uid/gid.
-
- # Make sure a uid of 0 trumps a non-root user.
- WVPASS bup meta --edit --set-user "$other_user2" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qvE "^user: $other_user2_erx"
- WVPASS bup xstat src | WVPASS grep -qE "^uid: 0"
-
- # Make sure a gid of 0 trumps a non-root group.
- WVPASS bup meta --edit --set-group "$other_group2" ../src.meta \
- | WVPASS bup meta -x
- WVPASS bup xstat src | WVPASS grep -qvE "^group: $other_group2_erx"
- WVPASS bup xstat src | WVPASS grep -qE "^gid: 0"
- fi
-
- WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-
-# Root-only tests that require an FS with all the trimmings: ACLs,
-# Linux attr, Linux xattr, etc.
-if [ "$root_status" = root ]; then
- (
- # Some cleanup handled in universal-cleanup() above.
- # These tests are only likely to work under Linux for now
- # (patches welcome).
- [[ $(uname) =~ Linux ]] || exit 0
-
- if ! modprobe loop; then
- echo 'Unable to load loopback module; skipping dependent tests.' 1>&2
- exit 0
- fi
-
- testfs="$(WVPASS wvmkmountpt)" || exit $?
- testfs_limited="$(WVPASS wvmkmountpt)" || exit $?
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- export BUP_DIR="$tmpdir/bup"
-
- WVSTART 'meta - general (as root)'
- WVPASS setup-test-tree
- WVPASS cd "$tmpdir"
-
- umount "$testfs"
- WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
- # Make sure we have all the options the chattr test needs
- # (i.e. create a "normal" ext4 filesystem).
- WVPASS mke2fs -F -m 0 \
- -I 256 \
- -O has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize \
- testfs.img
- WVPASS mount -o loop,acl,user_xattr testfs.img "$testfs"
- # Hide, so that tests can't create risks.
- WVPASS chown root:root "$testfs"
- WVPASS chmod 0700 "$testfs"
-
- umount "$testfs_limited"
- WVPASS dd if=/dev/zero of=testfs-limited.img bs=1M count=32
- WVPASS mkfs -t vfat testfs-limited.img
- WVPASS mount -o loop,uid=root,gid=root,umask=0077 \
- testfs-limited.img "$testfs_limited"
-
- WVPASS cp -pPR src "$testfs"/src
- (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-
- WVSTART 'meta - atime (as root)'
- WVPASS force-delete "$testfs"/src
- WVPASS mkdir "$testfs"/src
- (
- WVPASS mkdir "$testfs"/src/foo
- WVPASS touch "$testfs"/src/bar
- WVPASS bup-python -c "from bup import xstat; \
- x = xstat.timespec_to_nsecs((42, 0));\
- xstat.utime(b'$testfs/src/foo', (x, x));\
- xstat.utime(b'$testfs/src/bar', (x, x));"
- WVPASS cd "$testfs"
- WVPASS bup meta -v --create --recurse --file src.meta src
- WVPASS bup meta -tvf src.meta
- # Test extract.
- WVPASS force-delete src-restore
- WVPASS mkdir src-restore
- WVPASS cd src-restore
- WVPASS bup meta --extract --file ../src.meta
- WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
- WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
- # Test start/finish extract.
- WVPASS force-delete src
- WVPASS bup meta --start-extract --file ../src.meta
- WVPASS test -d src
- WVPASS bup meta --finish-extract --file ../src.meta
- WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
- WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
- ) || exit $?
-
- WVSTART 'meta - Linux attr (as root)'
- WVPASS force-delete "$testfs"/src
- WVPASS mkdir "$testfs"/src
- (
- WVPASS touch "$testfs"/src/foo
- WVPASS mkdir "$testfs"/src/bar
- WVPASS chattr +acdeijstuADS "$testfs"/src/foo
- WVPASS chattr +acdeijstuADST "$testfs"/src/bar
- (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
- # Test restoration to a limited filesystem (vfat).
- (
- WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
- "$testfs"/src
- WVPASS force-delete "$testfs_limited"/src-restore
- WVPASS mkdir "$testfs_limited"/src-restore
- WVPASS cd "$testfs_limited"/src-restore
- WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
- | WVPASS grep -e '^Linux chattr:' \
- | WVPASS bup-cfg-py -c \
- 'import sys; exit(not len(sys.stdin.readlines()) == 3)'
- ) || exit $?
- ) || exit $?
-
- WVSTART 'meta - Linux xattr (as root)'
- WVPASS force-delete "$testfs"/src
- WVPASS mkdir "$testfs"/src
- WVPASS touch "$testfs"/src/foo
- WVPASS mkdir "$testfs"/src/bar
- WVPASS attr -s foo -V bar "$testfs"/src/foo
- WVPASS attr -s foo -V bar "$testfs"/src/bar
- (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-
- # Test restoration to a limited filesystem (vfat).
- (
- WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
- "$testfs"/src
- WVPASS force-delete "$testfs_limited"/src-restore
- WVPASS mkdir "$testfs_limited"/src-restore
- WVPASS cd "$testfs_limited"/src-restore
- WVFAIL bup meta --extract --file "$testfs"/src.meta
- WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
- | WVPASS grep -e "^xattr\.set u\?'" \
- | WVPASS bup-cfg-py -c \
- 'import sys; exit(not len(sys.stdin.readlines()) == 2)'
- ) || exit $?
-
- WVSTART 'meta - POSIX.1e ACLs (as root)'
- WVPASS force-delete "$testfs"/src
- WVPASS mkdir "$testfs"/src
- WVPASS touch "$testfs"/src/foo
- WVPASS mkdir "$testfs"/src/bar
- WVPASS setfacl -m u:root:r "$testfs"/src/foo
- WVPASS setfacl -m u:root:r "$testfs"/src/bar
- (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-
- # Test restoration to a limited filesystem (vfat).
- (
- WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
- "$testfs"/src
- WVPASS force-delete "$testfs_limited"/src-restore
- WVPASS mkdir "$testfs_limited"/src-restore
- WVPASS cd "$testfs_limited"/src-restore
- WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
- | WVPASS grep -e '^POSIX1e ACL applyto:' \
- | WVPASS bup-cfg-py -c \
- 'import sys; exit(not len(sys.stdin.readlines()) == 2)'
- ) || exit $?
-
- WVPASS umount "$testfs"
- WVPASS umount "$testfs_limited"
- WVPASS rm -r "$testfs" "$testfs_limited"
-
- WVPASS rm -r "$tmpdir"
-
- ) || exit $?
-fi
-
-WVPASS rm -r "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. ./t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "index/save"
-WVPASS mkdir src src/foo
-WVPASS date > src/bar
-WVPASS bup random 1k > src/baz
-WVPASS bup on - index src
-WVPASS bup on - save -ctn src src > get.log
-WVPASSEQ $(WVPASS cat get.log | WVPASS wc -l) 2
-tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
-commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
-WVPASS git ls-tree "$tree_id"
-WVPASS git cat-file commit "$commit_id" | head -n 1 \
- | WVPASS grep "^tree $tree_id\$"
-
-WVPASS bup restore -C restore "src/latest/$(pwd)/src/."
-WVPASS compare-trees src/ restore/
-WVPASS rm -r restore
-
-WVSTART "split"
-WVPASS bup on - split -ctn baz src/baz > get.log
-tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
-commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
-WVPASS git ls-tree "$tree_id"
-WVPASS git cat-file commit "$commit_id" | head -n 1 \
- | WVPASS grep "^tree $tree_id\$"
-WVPASS bup join baz > restore-baz
-WVPASS cmp src/baz restore-baz
-
-WVSTART "index-cache"
-# the 'a-zA-Z0-9_' is '\w' from python,
-# the trailing _ is because there's no dir specified
-# and that should thus be empty
-hostname=$(uname -n)
-idxcache=$(echo "$hostname" | sed 's/[^@a-zA-Z0-9_]/_/g')_
-# there should be an index-cache now
-for idx in "$tmpdir"/bup/objects/pack/*.idx ; do
- cachedidx="$tmpdir/bup/index-cache/$idxcache/$(basename "$idx")"
- WVPASS cmp "$idx" "$cachedidx"
-done
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVSTART 'pack size limit'
-
-WVPASS bup init
-WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
-WVPASS bup random 50k | WVPASS bup split -n foo
-WVPASSEQ 1 $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l)
-
-rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS git config pack.packSizeLimit 10k
-WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
-WVPASS bup random 50k | WVPASS bup split -n foo
-WVPASS test $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l) -gt 2
-
-WVPASS rm -r "$tmpdir"
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-from collections import defaultdict
-from difflib import unified_diff
-from itertools import chain, dropwhile, groupby, takewhile
-from os import chdir
-from os.path import abspath, dirname
-from random import choice, randint
-from shutil import copytree, rmtree
-from subprocess import PIPE
-from sys import stderr
-from time import localtime, strftime, time
-import os, random, sys
-
-# For buptest, wvtest, ...
-sys.path[:0] = (abspath(os.path.dirname(__file__) + '/..'),)
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from buptest import ex, exo, test_tempdir
-from wvtest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
-
-from bup import compat
-from bup.compat import environ
-from bup.helpers import partition, period_as_secs, readpipe
-import bup.path
-
-
-def create_older_random_saves(n, start_utc, end_utc):
- with open(b'foo', 'wb') as f:
- pass
- ex([b'git', b'add', b'foo'])
- utcs = set()
- while len(utcs) != n:
- utcs.add(randint(start_utc, end_utc))
- utcs = sorted(utcs)
- for utc in utcs:
- with open(b'foo', 'wb') as f:
- f.write(b'%d\n' % utc)
- ex([b'git', b'commit', b'--date', b'%d' % utc, b'-qam', b'%d' % utc])
- ex([b'git', b'gc', b'--aggressive'])
- return utcs
-
-# There is corresponding code in bup for some of this, but the
-# computation method is different here, in part so that the test can
-# provide a more effective cross-check.
-
-period_kinds = [b'all', b'dailies', b'monthlies', b'yearlies']
-period_scale = {b's': 1,
- b'min': 60,
- b'h': 60 * 60,
- b'd': 60 * 60 * 24,
- b'w': 60 * 60 * 24 * 7,
- b'm': 60 * 60 * 24 * 31,
- b'y': 60 * 60 * 24 * 366}
-period_scale_kinds = list(period_scale.keys())
-
-def expected_retentions(utcs, utc_start, spec):
- if not spec:
- return utcs
- utcs = sorted(utcs, reverse=True)
- period_start = dict(spec)
- for kind, duration in compat.items(period_start):
- period_start[kind] = utc_start - period_as_secs(duration)
- period_start = defaultdict(lambda: float('inf'), period_start)
-
- all = list(takewhile(lambda x: x >= period_start[b'all'], utcs))
- utcs = list(dropwhile(lambda x: x >= period_start[b'all'], utcs))
-
- matches = takewhile(lambda x: x >= period_start[b'dailies'], utcs)
- dailies = [max(day_utcs) for yday, day_utcs
- in groupby(matches, lambda x: localtime(x).tm_yday)]
- utcs = list(dropwhile(lambda x: x >= period_start[b'dailies'], utcs))
-
- matches = takewhile(lambda x: x >= period_start[b'monthlies'], utcs)
- monthlies = [max(month_utcs) for month, month_utcs
- in groupby(matches, lambda x: localtime(x).tm_mon)]
- utcs = dropwhile(lambda x: x >= period_start[b'monthlies'], utcs)
-
- matches = takewhile(lambda x: x >= period_start[b'yearlies'], utcs)
- yearlies = [max(year_utcs) for year, year_utcs
- in groupby(matches, lambda x: localtime(x).tm_year)]
-
- return chain(all, dailies, monthlies, yearlies)
-
-def period_spec(start_utc, end_utc):
- global period_kinds, period_scale, period_scale_kinds
- result = []
- desired_specs = randint(1, 2 * len(period_kinds))
- assert(desired_specs >= 1) # At least one --keep argument is required
- while len(result) < desired_specs:
- period = None
- if randint(1, 100) <= 5:
- period = b'forever'
- else:
- assert(end_utc > start_utc)
- period_secs = randint(1, end_utc - start_utc)
- scale = choice(period_scale_kinds)
- mag = int(float(period_secs) / period_scale[scale])
- if mag != 0:
- period = (b'%d' % mag) + scale
- if period:
- result += [(choice(period_kinds), period)]
- return tuple(result)
-
-def unique_period_specs(n, start_utc, end_utc):
- invocations = set()
- while len(invocations) < n:
- invocations.add(period_spec(start_utc, end_utc))
- return tuple(invocations)
-
-def period_spec_to_period_args(spec):
- return tuple(chain(*((b'--keep-' + kind + b'-for', period)
- for kind, period in spec)))
-
-def result_diffline(x):
- return (b'%d %s\n'
- % (x, strftime(' %Y-%m-%d-%H%M%S', localtime(x)).encode('ascii')))
-
-def check_prune_result(expected):
- actual = sorted([int(x)
- for x in exo([b'git', b'log',
- b'--pretty=format:%at']).out.splitlines()])
- if expected != actual:
- for x in expected:
- print('ex:', x, strftime('%Y-%m-%d-%H%M%S', localtime(x)),
- file=stderr)
- for line in unified_diff([result_diffline(x) for x in expected],
- [result_diffline(x) for x in actual],
- fromfile='expected', tofile='actual'):
- sys.stderr.write(line)
- wvpass(expected == actual)
-
-
-environ[b'GIT_AUTHOR_NAME'] = b'bup test'
-environ[b'GIT_COMMITTER_NAME'] = b'bup test'
-environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-
-seed = int(environ.get(b'BUP_TEST_SEED', time()))
-random.seed(seed)
-print('random seed:', seed, file=stderr)
-
-save_population = int(environ.get(b'BUP_TEST_PRUNE_OLDER_SAVES', 2000))
-prune_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_CYCLES', 20))
-prune_gc_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_GC_CYCLES', 10))
-
-bup_cmd = bup.path.exe()
-
-with test_tempdir(b'prune-older-') as tmpdir:
- environ[b'BUP_DIR'] = tmpdir + b'/work/.git'
- environ[b'GIT_DIR'] = tmpdir + b'/work/.git'
- now = int(time())
- three_years_ago = now - (60 * 60 * 24 * 366 * 3)
- chdir(tmpdir)
- ex([b'git', b'init', b'work'])
- ex([b'git', b'config', b'gc.autoDetach', b'false'])
-
- wvstart('generating ' + str(save_population) + ' random saves')
- chdir(tmpdir + b'/work')
- save_utcs = create_older_random_saves(save_population, three_years_ago, now)
- chdir(tmpdir)
- test_set_hash = exo([b'git', b'show-ref', b'-s', b'master']).out.rstrip()
- ls_saves = exo((bup_cmd, b'ls', b'master')).out.splitlines()
- wvpasseq(save_population + 1, len(ls_saves))
-
- wvstart('ensure everything kept, if no keep arguments')
- ex([b'git', b'reset', b'--hard', test_set_hash])
- proc = ex((bup_cmd,
- b'prune-older', b'-v', b'--unsafe', b'--no-gc',
- b'--wrt', b'%d' % now) \
- + (b'master',),
- stdout=None, stderr=PIPE, check=False)
- wvpassne(proc.rc, 0)
- wvpass(b'at least one keep argument is required' in proc.err)
- check_prune_result(save_utcs)
-
-
- wvstart('running %d generative no-gc tests on %d saves' % (prune_cycles,
- save_population))
- for spec in unique_period_specs(prune_cycles,
- # Make it more likely we'll have
- # some outside the save range.
- three_years_ago - period_scale[b'm'],
- now):
- ex([b'git', b'reset', b'--hard', test_set_hash])
- expected = sorted(expected_retentions(save_utcs, now, spec))
- ex((bup_cmd,
- b'prune-older', b'-v', b'--unsafe', b'--no-gc', b'--wrt',
- b'%d' % now) \
- + period_spec_to_period_args(spec) \
- + (b'master',))
- check_prune_result(expected)
-
-
- # More expensive because we have to recreate the repo each time
- wvstart('running %d generative gc tests on %d saves' % (prune_gc_cycles,
- save_population))
- ex([b'git', b'reset', b'--hard', test_set_hash])
- copytree(b'work/.git', b'clean-test-repo', symlinks=True)
- for spec in unique_period_specs(prune_gc_cycles,
- # Make it more likely we'll have
- # some outside the save range.
- three_years_ago - period_scale[b'm'],
- now):
- rmtree(b'work/.git')
- copytree(b'clean-test-repo', b'work/.git')
- expected = sorted(expected_retentions(save_utcs, now, spec))
- ex((bup_cmd,
- b'prune-older', b'-v', b'--unsafe', b'--wrt', b'%d' % now) \
- + period_spec_to_period_args(spec) \
- + (b'master',))
- check_prune_result(expected)
+++ /dev/null
-#!/usr/bin/env bash
-
-# Test that running save more than once with no other changes produces
-# the exact same tree.
-
-# Note: we can't compare the top-level hash (i.e. the output of "save
-# -t" because that currently pulls the metadata for unindexed parent
-# directories directly from the filesystem, and the relevant atimes
-# may change between runs. So instead we extract the roots of the
-# indexed trees for comparison via t/subtree-hash.
-
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-WVSTART 'all'
-
-top="$(pwd)"
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$BUP_DIR"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir -p "$tmpdir/src"
-WVPASS mkdir -p "$tmpdir/src/d"
-WVPASS mkdir -p "$tmpdir/src/d/e"
-WVPASS touch "$tmpdir/src/"{f,b,a,d}
-WVPASS touch "$tmpdir/src/d/z"
-
-WVPASS bup init
-WVPASS bup index -u "$tmpdir/src"
-
-declare -a indexed_top
-IFS=/
-indexed_top="${tmpdir##/}"
-indexed_top=(${indexed_top%%/})
-unset IFS
-
-tree1=$(WVPASS bup save -t "$tmpdir/src") || exit $?
-indexed_tree1="$(WVPASS t/subtree-hash "$tree1" "${indexed_top[@]}" src)" \
- || exit $?
-
-result="$(WVPASS cd "$tmpdir/src"; WVPASS bup index -m)" || exit $?
-WVPASSEQ "$result" ""
-
-tree2=$(WVPASS bup save -t "$tmpdir/src") || exit $?
-indexed_tree2="$(WVPASS t/subtree-hash "$tree2" "${indexed_top[@]}" src)" \
- || exit $?
-
-WVPASSEQ "$indexed_tree1" "$indexed_tree2"
-
-result="$(WVPASS bup index -s / | WVFAIL grep ^D)" || exit $?
-WVPASSEQ "$result" ""
-
-tree3=$(WVPASS bup save -t /) || exit $?
-indexed_tree3="$(WVPASS t/subtree-hash "$tree3" "${indexed_top[@]}" src)" || exit $?
-WVPASSEQ "$indexed_tree1" "$indexed_tree3"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-bup_make=$(< config/config.var/bup-make)
-
-WVPASS git status > /dev/null
-
-if ! git diff-index --quiet HEAD; then
- WVDIE "uncommitted changes; cannot continue"
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVPASS git clone "$top" clone
-
-for ver in 11.11 11.11.11; do
- WVSTART "version $ver"
- WVPASS cd clone
- WVPASS git tag "$ver"
- WVPASS git archive --prefix=bup-"$ver"/ -o "$tmpdir"/bup-"$ver".tgz "$ver"
- WVPASS cd "$tmpdir"
- WVPASS tar xzf bup-"$ver".tgz
- WVPASS cd bup-"$ver"
- WVPASS "$bup_make"
- WVPASSEQ "$ver" "$(./bup version)"
- WVPASS cd "$tmpdir"
-done
-
-WVSTART 'make check in unpacked archive'
-WVPASS cd bup-11.11.11
-if ! "$bup_make" -j5 check > archive-tests.log 2>&1; then
- cat archive-tests.log 1>&2
- WVPASS false
-fi
-
-WVPASS cd "$top"
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-root_status="$(t/root-status)" || exit $?
-
-if [ "$root_status" != root ]; then
- echo 'Not root: skipping restore --map-* tests.'
- exit 0 # FIXME: add WVSKIP.
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-uid=$(WVPASS id -u) || exit $?
-user=$(WVPASS id -un) || exit $?
-gid=$(WVPASS id -g) || exit $?
-group=$(WVPASS id -gn) || exit $?
-
-other_uinfo=$(WVPASS t/id-other-than --user "$user") || exit $?
-other_user="${other_uinfo%%:*}"
-other_uid="${other_uinfo##*:}"
-
-other_ginfo=$(WVPASS t/id-other-than --group "$group" 0) || exit $?
-other_group="${other_ginfo%%:*}"
-other_gid="${other_ginfo##*:}"
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "restore --map-user/group/uid/gid (control)"
-WVPASS mkdir src
-WVPASS touch src/foo
-# Some systems assign the parent dir group to new paths.
-WVPASS chgrp -R "$group" src
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup restore -C dest "src/latest/$(pwd)/src/"
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $user\$" foo-xstat
-WVPASS grep -qE "^uid: $uid\$" foo-xstat
-WVPASS grep -qE "^group: $group\$" foo-xstat
-WVPASS grep -qE "^gid: $gid\$" foo-xstat
-
-WVSTART "restore --map-user/group/uid/gid (user/group)"
-WVPASS rm -rf dest
-# Have to remap uid/gid too because we're root and 0 would win).
-WVPASS bup restore -C dest \
- --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
- --map-user "$user=$other_user" --map-group "$group=$other_group" \
- "src/latest/$(pwd)/src/"
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $other_user\$" foo-xstat
-WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
-WVPASS grep -qE "^group: $other_group\$" foo-xstat
-WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
-
-WVSTART "restore --map-user/group/uid/gid (user/group trumps uid/gid)"
-WVPASS rm -rf dest
-WVPASS bup restore -C dest \
- --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
- "src/latest/$(pwd)/src/"
-# Should be no changes.
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $user\$" foo-xstat
-WVPASS grep -qE "^uid: $uid\$" foo-xstat
-WVPASS grep -qE "^group: $group\$" foo-xstat
-WVPASS grep -qE "^gid: $gid\$" foo-xstat
-
-WVSTART "restore --map-user/group/uid/gid (uid/gid)"
-WVPASS rm -rf dest
-WVPASS bup restore -C dest \
- --map-user "$user=" --map-group "$group=" \
- --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
- "src/latest/$(pwd)/src/"
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $other_user\$" foo-xstat
-WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
-WVPASS grep -qE "^group: $other_group\$" foo-xstat
-WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
-
-has_uid_gid_0=$(WVPASS bup-cfg-py -c "
-import grp, pwd
-try:
- pwd.getpwuid(0)
- grp.getgrgid(0)
- print('yes')
-except KeyError as ex:
- pass
-") || exit $?
-if [ "$has_uid_gid_0" == yes ]
-then
- WVSTART "restore --map-user/group/uid/gid (zero uid/gid trumps all)"
- WVPASS rm -rf dest
- WVPASS bup restore -C dest \
- --map-user "$user=$other_user" --map-group "$group=$other_group" \
- --map-uid "$uid=0" --map-gid "$gid=0" \
- "src/latest/$(pwd)/src/"
- WVPASS bup xstat dest/foo > foo-xstat
- WVPASS grep -qE "^uid: 0\$" foo-xstat
- WVPASS grep -qE "^gid: 0\$" foo-xstat
-
- WVPASS rm -rf "$tmpdir"
-fi
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-WVSTART 'all'
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir "$tmpdir/foo"
-WVPASS mkdir "$tmpdir/foo/bar" # Make sure a dir sorts before baz (regression test).
-WVPASS touch "$tmpdir/foo/baz"
-WVPASS WVPASS bup init
-WVPASS WVPASS bup index "$tmpdir/foo"
-WVPASS bup save -n foo "$tmpdir/foo"
-# Make sure the timestamps will differ if metadata isn't being restored.
-WVPASS bup tick
-WVPASS bup restore -C "$tmpdir/restore" "foo/latest/$tmpdir/foo/baz"
-WVPASS "$top/t/compare-trees" "$tmpdir/foo/baz" "$tmpdir/restore/baz"
-
-WVPASS rm -rf "$tmpdir"
-
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-D="$tmpdir/data"
-
-bup() { "$top/bup" "$@"; }
-
-WVSTART "remove file"
-# Fixed in commit 8585613c1f45f3e20feec00b24fc7e3a948fa23e ("Store
-# metadata in the index....")
-WVPASS mkdir "$D"
-WVPASS bup init
-WVPASS echo "content" > "$D"/foo
-WVPASS echo "content" > "$D"/bar
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS bup save -n save-fail-missing "$D"
-WVPASS echo "content" > "$D"/baz
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS rm "$D"/foo
-# When "bup tick" is removed above, this may fail (complete with warning),
-# since the ctime/mtime of "foo" might be pushed back:
-WVPASS bup save -n save-fail-missing "$D"
-# when the save-call failed, foo is missing from output, since only
-# then bup notices, that it was removed:
-WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
-baz
-foo"
-# index/save again
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS bup save -n save-fail-missing "$D"
-# now foo is gone:
-WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
-baz"
-
-
-# TODO: Test for racecondition between reading a file and reading its metadata?
-
-WVSTART "remove dir"
-WVPASS rm -r "$D"
-WVPASS mkdir "$D"
-WVPASS rm -r "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir "$D"/foo
-WVPASS mkdir "$D"/bar
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS bup save -n save-fail-missing "$D"
-WVPASS touch "$D"/bar
-WVPASS mkdir "$D"/baz
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS rmdir "$D"/foo
-# with directories, bup notices that foo is missing, so it fails
-# (complete with delayed error)
-WVFAIL bup save -n save-fail-missing "$D"
-# ...but foo is still saved since it was just fine in the index
-WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
-baz/
-foo/"
-# Index again:
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-# no non-zero-exitcode anymore:
-WVPASS bup save -n save-fail-missing "$D"
-# foo is now gone
-WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
-baz/"
-
-WVPASS rm -rf "$tmpdir"
-
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. ./t/lib.sh || exit $?
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-wv_matches_rx()
-{
- local caller_file=${BASH_SOURCE[0]}
- local caller_line=${BASH_LINENO[0]}
- local src="$caller_file:$caller_line"
- if test $# -ne 2; then
- echo "! $src wv_matches_rx requires 2 arguments FAILED" 1>&2
- return
- fi
- local str="$1"
- local rx="$2"
- echo "Matching:" 1>&2 || exit $?
- echo "$str" | sed 's/^\(.*\)/ \1/' 1>&2 || exit $?
- echo "Against:" 1>&2 || exit $?
- echo "$rx" | sed 's/^\(.*\)/ \1/' 1>&2 || exit $?
- if [[ "$str" =~ ^${rx}$ ]]; then
- echo "! $src regex matches ok" 1>&2 || exit $?
- else
- echo "! $src regex doesn't match FAILED" 1>&2 || exit $?
- fi
-}
-
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-
-WVSTART "rm /foo (lone branch)"
-WVPASS mkdir src src/foo
-WVPASS echo twisty-maze > src/1
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-# FIXME: test -n
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-'\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+refs/heads/src(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?'
-
-
-WVSTART "rm /foo (one of many)"
-WVPASS rm -rf bup
-WVPASS mv bup-baseline bup
-WVPASS echo twisty-maze > src/2
-WVPASS bup index src
-WVPASS bup save -n src-2 src
-WVPASS echo twisty-maze > src/3
-WVPASS bup index src
-WVPASS bup save -n src-3 src
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+refs/heads/src(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-WVSTART "rm /foo /bar (multiple of many)"
-WVPASS rm -rf bup
-WVPASS mv bup-baseline bup
-WVPASS echo twisty-maze > src/4
-WVPASS bup index src
-WVPASS bup save -n src-4 src
-WVPASS echo twisty-maze > src/5
-WVPASS bup index src
-WVPASS bup save -n src-5 src
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src-2 /src-4
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src-2
-\*deleting[ ]+logs/refs/heads/src-4
-\*deleting[ ]+refs/heads/src-2
-\*deleting[ ]+refs/heads/src-4(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-WVSTART "rm /foo /bar (all)"
-WVPASS rm -rf bup
-WVPASS mv bup-baseline bup
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src /src-2 /src-3 /src-4 /src-5
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+logs/refs/heads/src-2
-\*deleting[ ]+logs/refs/heads/src-3
-\*deleting[ ]+logs/refs/heads/src-4
-\*deleting[ ]+logs/refs/heads/src-5
-\*deleting[ ]+refs/heads/src
-\*deleting[ ]+refs/heads/src-2
-\*deleting[ ]+refs/heads/src-3
-\*deleting[ ]+refs/heads/src-4
-\*deleting[ ]+refs/heads/src-5(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-WVSTART "rm /foo/bar (lone save - equivalent to rm /foo)"
-WVPASS rm -rf bup bup-baseline src
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo twisty-maze > src/1
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup ls src > tmp-ls
-save1="$(WVPASS head -n 1 tmp-ls)" || exit $?
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVFAIL bup rm --unsafe /src/latest
-WVPASS bup rm --unsafe /src/"$save1"
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+refs/heads/src(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-verify-changes-caused-by-rewriting-save()
-{
- local before="$1" after="$2" tmpdir
- tmpdir="$(WVPASS wvmktempdir)" || exit $?
- (WVPASS cd "$before" && WVPASS find . | WVPASS sort) \
- > "$tmpdir/before" || exit $?
- (WVPASS cd "$after" && WVPASS find . | WVPASS sort) \
- > "$tmpdir/after" || exit $?
- local new_paths new_idx new_pack observed
- new_paths="$(WVPASS comm -13 "$tmpdir/before" "$tmpdir/after")" || exit $?
- new_idx="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.idx$' | cut -b 3-)" || exit $?
- new_pack="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.pack$' | cut -b 3-)" || exit $?
- wv_matches_rx "$(compare-trees "$after/" "$before/")" \
-">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
-\.d\.\.t\.\.\.[.]*[ ]+objects/
-\.d\.\.t\.\.\.[.]*[ ]+objects/pack/
->fcst\.\.\.[.]*[ ]+objects/pack/bup\.bloom
->f\+\+\+\+\+\+\+[+]*[ ]+$new_idx
->f\+\+\+\+\+\+\+[+]*[ ]+$new_pack
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
->fc\.t\.\.\.[.]*[ ]+refs/heads/src"
- WVPASS rm -rf "$tmpdir"
-}
-
-commit-hash-n()
-{
- local n="$1" repo="$2" branch="$3"
- GIT_DIR="$repo" WVPASS git rev-list --reverse "$branch" \
- | WVPASS awk "FNR == $n"
-}
-
-rm-safe-cinfo()
-{
- local n="$1" repo="$2" branch="$3" hash
- hash="$(commit-hash-n "$n" "$repo" "$branch")" || exit $?
- local fmt='Tree: %T%n'
- fmt="${fmt}Author: %an <%ae> %ai%n"
- fmt="${fmt}Committer: %cn <%ce> %ci%n"
- fmt="${fmt}%n%s%n%b"
- GIT_DIR="$repo" WVPASS git log -n1 --pretty=format:"$fmt" "$hash"
-}
-
-
-WVSTART 'rm /foo/BAR (setup)'
-WVPASS rm -rf bup bup-baseline src
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo twisty-maze > src/1
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS echo twisty-maze > src/2
-WVPASS bup index src
-WVPASS bup tick
-WVPASS bup save -n src src
-WVPASS echo twisty-maze > src/3
-WVPASS bup index src
-WVPASS bup tick
-WVPASS bup save -n src src
-WVPASS mv bup bup-baseline
-WVPASS bup tick # Make sure we always get the timestamp changes below
-
-
-WVSTART "rm /foo/BAR (first of many)"
-WVPASS "$top"/t/sync-tree bup-baseline/ bup/
-WVPASS bup ls src > tmp-ls
-victim="$(WVPASS head -n 1 tmp-ls)" || exit $?
-WVPASS bup rm --unsafe /src/"$victim"
-verify-changes-caused-by-rewriting-save bup-baseline bup
-observed=$(WVPASS git rev-list src | WVPASS wc -l) || exit $?
-WVPASSEQ 2 $observed
-WVPASSEQ "$(rm-safe-cinfo 1 bup src)" "$(rm-safe-cinfo 2 bup-baseline src)"
-WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
-
-
-WVSTART "rm /foo/BAR (one of many)"
-WVPASS "$top"/t/sync-tree bup-baseline/ bup/
-victim="$(WVPASS bup ls src | tail -n +2 | head -n 1)" || exit $?
-WVPASS bup rm --unsafe /src/"$victim"
-verify-changes-caused-by-rewriting-save bup-baseline bup
-observed=$(git rev-list src | wc -l) || exit $?
-WVPASSEQ 2 $observed
-WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
-WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
-
-
-WVSTART "rm /foo/BAR (last of many)"
-WVPASS "$top"/t/sync-tree bup-baseline/ bup/
-victim="$(WVPASS bup ls src | tail -n 2 | head -n 1)" || exit $?
-WVPASS bup rm --unsafe -vv /src/"$victim"
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
->fc\.t\.\.\.[.]*[ ]+refs/heads/src
->fcst\.\.\.[.]*[ ]+logs/refs/heads/src"
-observed=$(git rev-list src | wc -l) || exit $?
-WVPASSEQ 2 $observed
-WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
-WVPASSEQ "$(commit-hash-n 2 bup src)" "$(commit-hash-n 2 bup-baseline src)"
-
-
-# FIXME: test that committer changes when rewriting, when appropriate
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-WVSTART 'all'
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$BUP_DIR"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir -p "$tmpdir/src"
-WVPASS touch "$tmpdir/src/foo"
-WVPASS bup init
-WVPASS bup index "$tmpdir/src"
-WVPASS bup save -n src "$tmpdir/src"
-WVPASSEQ "$(git fsck --unreachable)" ""
-WVPASS bup save -n src "$tmpdir/src"
-WVPASSEQ "$(git fsck --unreachable)" ""
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# necessary for 0 == 1970-01-01 00:00
-export TZ=UTC
-
-WVSTART "init"
-WVPASS bup init
-
-mkdir "$tmpdir/save"
-for f in $(seq 9) ; do
- touch -t 200${f}01010000 "$tmpdir/save/$f"
-done
-mkdir "$tmpdir/save/a"
-touch -t 199901010000 "$tmpdir/save/a/1"
-
-WVSTART "metadata read error for a file"
-WVPASS bup index "$tmpdir/save"
-
-# now do a hack to inject save errors while reading metadata
-# essentially, we create a bup-save command for ourselves
-# that gets an error for the .../5 file in metadata.from_path()
-cat > "$tmpdir/bup-save" << EOF
-#!/usr/bin/env $top/dev/bup-python
-from bup import metadata
-
-orig_from_path = metadata.from_path
-def from_path(path, *args, **kw):
- if path.endswith(b'/5'):
- raise IOError('intentionally failing metadata read for .../5')
- return orig_from_path(path, *args, **kw)
-metadata.from_path = from_path
-
-exec(open("$top/lib/cmd/bup-save", "rb").read())
-EOF
-chmod +x "$tmpdir/bup-save"
-
-# use it to save the data
-"$tmpdir/bup-save" -n test "$tmpdir/save"
-
-# this should work anyway
-WVPASS bup ls -l "test/latest/$tmpdir/save"
-# also check the *right* data was returned
-lsout="$(bup ls -l "test/latest/$tmpdir/save")"
-for f in 1 2 3 4 6 7 8 9 ; do
- if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
- WVFAIL echo incorrect date for $f
- fi
-done
-# and ensure we actually failed, and the above script/hack didn't break
-if ! echo "$lsout" | grep "1970-01-01 00:00 5" ; then
- WVFAIL echo unexpected date for file 5
-fi
-
-
-WVSTART "metadata read error for a folder"
-WVPASS bup index --clear
-WVPASS bup index "$tmpdir/save"
-
-cat > "$tmpdir/bup-save" << EOF
-#!/usr/bin/env $top/dev/bup-python
-from bup import metadata
-
-orig_from_path = metadata.from_path
-def from_path(path, *args, **kw):
- if path.endswith(b'/a'):
- raise IOError('intentionally failing metadata read for .../a')
- return orig_from_path(path, *args, **kw)
-metadata.from_path = from_path
-
-exec(open("$top/lib/cmd/bup-save", "rb").read())
-EOF
-chmod +x "$tmpdir/bup-save"
-
-# use it to save the data
-"$tmpdir/bup-save" -n test "$tmpdir/save"
-
-# this should work anyway
-WVPASS bup ls -l "test/latest/$tmpdir/save"
-if ! bup ls -l "test/latest/$tmpdir/save/a" | grep '1999-01-01 00:00 1' ; then
- WVFAIL unexpected date for file a/1
-fi
-# and ensure we actually failed, and the above script/hack didn't break
-if ! bup ls -l "test/latest/$tmpdir/save" | grep "1970-01-01 00:00 a" ; then
- WVFAIL unexpected date for directory a
-fi
-
-
-WVSTART "duplicate entries"
-WVPASS bup index --clear
-WVPASS bup index "$tmpdir/save"
-
-cat > "$tmpdir/bup-save" << EOF
-#!/usr/bin/env $top/dev/bup-python
-from bup import index
-
-Reader = index.Reader
-class DupReader(index.Reader):
- def filter(self, *args, **kw):
- for transname, ent in Reader.filter(self, *args, **kw):
- # duplicate a file and a folder
- if ent.name.endswith(b'/5') or ent.name.endswith(b'/a/'):
- yield transname, ent
- yield transname, ent
-index.Reader = DupReader
-
-exec(open("$top/lib/cmd/bup-save", "rb").read())
-EOF
-chmod +x "$tmpdir/bup-save"
-
-# use it to save the data
-"$tmpdir/bup-save" -n test "$tmpdir/save"
-
-# this should work
-WVPASS bup ls -l "test/latest/$tmpdir/save"
-
-# check that there are no duplicates
-lsout=$(bup ls -l "test/latest/$tmpdir/save")
-WVPASSEQ "$(echo "$lsout" | sort | uniq -d)" ""
-
-# and we should get the *right* data for each entry
-for f in $(seq 9) ; do
- if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
- WVFAIL echo incorrect metadata for $f
- fi
-done
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-validate-local-and-remote-restore()
-{
- local src="$1" dest="$2" cmp_src="$3" cmp_dest="$4"
- force-delete "$dest"
- WVPASS bup restore -C "$dest" "$src"
- WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest"
- force-delete "$dest"
- WVPASS bup restore -r ":$BUP_DIR" -C "$dest" "$src"
- WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest"
-}
-
-
-WVPASS cd "$tmpdir"
-
-WVSTART "init"
-WVPASS bup init
-D=bupdata.tmp
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVPASS touch $D/a
-WVPASS bup random 128k >$D/b
-WVPASS mkdir $D/d $D/d/e
-WVPASS bup random 512 >$D/f
-WVPASS touch $D/d/z
-WVPASS touch $D/d/z
-WVPASS bup index $D
-WVPASS bup save -t $D
-
-
-WVSTART "restore"
-WVPASS force-delete buprestore.tmp
-WVFAIL bup restore boink
-WVPASS touch "$tmpdir/$D/$D"
-WVPASS bup index -u "$tmpdir/$D"
-WVPASS bup save -n master /
-WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D"
-WVPASSEQ "$(ls buprestore.tmp)" "bupdata.tmp"
-WVPASS force-delete buprestore.tmp
-WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D/"
-WVPASS touch $D/non-existent-file buprestore.tmp/non-existent-file # else diff fails
-WVPASS diff -ur $D/ buprestore.tmp/
-WVPASS force-delete buprestore.tmp
-WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
-WVPASS bup restore -C buprestore.tmp split_empty_string.tmp/latest/
-WVPASSEQ "$(cat buprestore.tmp/data)" ""
-
-
-(
- tmp=testrestore.tmp
- WVPASS force-delete $tmp
- WVPASS mkdir $tmp
- export BUP_DIR="$(pwd)/$tmp/bup"
- WVPASS WVPASS bup init
- WVPASS mkdir -p $tmp/src/x/y/z
- WVPASS bup random 8k > $tmp/src/x/y/random-1
- WVPASS bup random 8k > $tmp/src/x/y/z/random-2
- WVPASS bup index -u $tmp/src
- WVPASS bup save --strip -n foo $tmp/src
-
- WVSTART "restore /foo/latest"
- validate-local-and-remote-restore \
- /foo/latest "$tmp/restore" \
- "$tmp/src/" "$tmp/restore/latest/"
-
- WVSTART "restore /foo/latest/."
- WVPASS force-delete "$tmp/restore"
- validate-local-and-remote-restore \
- /foo/latest/. "$tmp"/restore \
- "$tmp"/src/ "$tmp"/restore
-
- WVSTART "restore /foo/latest/x"
- WVPASS force-delete "$tmp/restore"
- validate-local-and-remote-restore \
- /foo/latest/x "$tmp"/restore \
- "$tmp"/src/x/ "$tmp"/restore/x/
-
- WVSTART "restore /foo/latest/x/"
- WVPASS force-delete "$tmp/restore"
- WVPASS bup restore -C "$tmp"/restore /foo/latest/x/
- for x in "$tmp"/src/x/*; do
- WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
- done
- WVPASS force-delete "$tmp/restore"
- WVPASS bup restore -r ":$BUP_DIR" -C "$tmp"/restore /foo/latest/x/
- for x in "$tmp"/src/x/*; do
- WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
- done
-
- WVSTART "restore /foo/latest/x/."
- WVPASS force-delete "$tmp/restore"
- validate-local-and-remote-restore \
- /foo/latest/x/. "$tmp"/restore \
- "$tmp"/src/x/ "$tmp"/restore/
-) || exit $?
-
-
-WVSTART "save (no index)"
-(
- tmp=save-no-index.tmp
- WVPASS force-delete $tmp
- WVPASS mkdir $tmp
- export BUP_DIR="$(WVPASS pwd)/$tmp/bup" || exit $?
- WVPASS bup init
- WVFAIL bup save -n nothing /
- WVPASS rm -r "$tmp"
-) || exit $?
-
-
-WVSTART "save disjoint top-level directories"
-(
- # Resolve any symlinks involving the top top-level dirs.
- real_pwd="$(WVPASS resolve-parent .)" || exit $?
- real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $?
- pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $?
- tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $?
-
- if [ "$pwd_top" = "$tmp_top" ]; then
- echo "(running from within /$tmp_top; skipping test)" 1>&2
- exit 0
- fi
- D=bupdata.tmp
- WVPASS force-delete $D
- WVPASS mkdir -p $D/x
- WVPASS date > $D/x/1
- tmpdir2="$(WVPASS mktemp -d $real_tmp/bup-test-XXXXXXX)" || exit $?
- cleanup() { WVPASS rm -r "$tmpdir2"; }
- WVPASS trap cleanup EXIT
- WVPASS date > "$tmpdir2/2"
-
- export BUP_DIR="$tmpdir/bup"
- WVPASS test -d "$BUP_DIR" && WVPASS rm -r "$BUP_DIR"
-
- WVPASS bup init
- WVPASS bup index -vu $(pwd)/$D/x "$tmpdir2"
- WVPASS bup save -t -n src $(pwd)/$D/x "$tmpdir2"
-
- # For now, assume that "ls -a" and "sort" use the same order.
- actual="$(WVPASS bup ls -AF src/latest)" || exit $?
- expected="$(echo -e "$pwd_top/\n$tmp_top/" | WVPASS sort)" || exit $?
- WVPASSEQ "$actual" "$expected"
-) || exit $?
-
-
-WVPASS cd "$top"
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-
-WVSTART "index excludes bupdir"
-WVPASS force-delete src "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS bup random 128k >src/b
-WVPASS mkdir src/d src/d/e
-WVPASS bup random 512 >src/f
-WVPASS bup index -ux src
-WVPASS bup save -n exclude-bupdir src
-WVPASSEQ "$(bup ls -AF "exclude-bupdir/latest/$tmpdir/src/")" "a
-b
-d/
-f"
-
-
-WVSTART "index --exclude"
-WVPASS force-delete src "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS bup random 128k >src/b
-WVPASS mkdir src/d src/d/e
-WVPASS bup random 512 >src/f
-WVPASS bup random 512 >src/j
-WVPASS bup index -ux --exclude src/d --exclude src/j src
-WVPASS bup save -n exclude src
-WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
-b
-f"
-WVPASS mkdir src/g src/h
-WVPASS bup index -ux --exclude src/d --exclude $tmpdir/src/g --exclude src/h \
- --exclude "$tmpdir/src/j" src
-WVPASS bup save -n exclude src
-WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
-b
-f"
-
-
-WVSTART "index --exclude-from"
-WVPASS force-delete src "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo "src/d
- $tmpdir/src/g
-src/h
-src/i" > exclude-list
-WVPASS touch src/a
-WVPASS bup random 128k >src/b
-WVPASS mkdir src/d src/d/e
-WVPASS bup random 512 >src/f
-WVPASS mkdir src/g src/h
-WVPASS bup random 128k > src/i
-WVPASS bup index -ux --exclude-from exclude-list src
-WVPASS bup save -n exclude-from src
-WVPASSEQ "$(bup ls "exclude-from/latest/$tmpdir/src/")" "a
-b
-f"
-WVPASS rm exclude-list
-
-
-# bup index --exclude-rx ...
-# ==========================
-
-WVSTART "index --exclude-rx '^/foo' (root anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-WVPASS bup index -u src --exclude-rx "^$(pwd)/src/sub1/"
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-WVSTART "index --exclude-rx '/foo$' (non-dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src --exclude-rx '/foo$'
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub
-./sub/foo
-./sub/foo/a"
-
-WVSTART "index --exclude-rx '/foo/$' (dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src --exclude-rx '/foo/$'
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub"
-
-WVSTART "index --exclude-rx '/foo/.' (dir content)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src --exclude-rx '/foo/.'
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub
-./sub/foo"
-
-
-# bup index --exclude-rx-from ...
-# ===============================
-WVSTART "index --exclude-rx-from"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-# exclude-rx-file includes blank lines to check that we ignore them.
-WVPASS echo "^$(pwd)/src/sub1/
-
-" > exclude-rx-file
-WVPASS bup index -u src --exclude-rx-from exclude-rx-file
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-
-# bup restore --exclude-rx ...
-# ============================
-
-WVSTART "restore --exclude-rx '^/foo' (root anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx "^/sub1/" /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-WVSTART "restore --exclude-rx '/foo$' (non-dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo$' /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub
-./sub/foo
-./sub/foo/a"
-
-WVSTART "restore --exclude-rx '/foo/$' (dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/$' /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub"
-
-WVSTART "restore --exclude-rx '/foo/.' (dir content)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/.' /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub
-./sub/foo"
-
-
-# bup restore --exclude-rx-from ...
-# =================================
-
-WVSTART "restore --exclude-rx-from"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS echo "^/sub1/" > exclude-rx-file
-WVPASS bup restore -C buprestore.tmp \
- --exclude-rx-from exclude-rx-file /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVSTART "init"
-WVPASS bup init
-
-WVPASS mkdir "$tmpdir/save"
-WVPASS echo small0 > "$tmpdir/save/small"
-WVPASS echo bigbigbigbigbig01 > "$tmpdir/save/big1"
-big1sha="$(sha1sum < "$tmpdir/save/big1")"
-WVPASS bup index "$tmpdir/save"
-WVPASS bup save -vv -n test "$tmpdir/save"
-WVPASS mkdir "$tmpdir/restore1"
-WVPASS bup restore -v --outdir="$tmpdir/restore1/" "/test/latest$tmpdir/save/"
-WVPASS cmp "$tmpdir/restore1/small" "$tmpdir/save/small"
-WVPASS cmp "$tmpdir/restore1/big1" "$tmpdir/save/big1"
-
-WVSTART "save --smaller"
-WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
-WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
-WVPASS bup index "$tmpdir/save"
-WVPASS bup save -vv -n test --smaller=10 "$tmpdir/save"
-WVPASS mkdir "$tmpdir/restore2"
-WVPASS bup restore -v --outdir="$tmpdir/restore2/" "/test/latest$tmpdir/save/"
-WVPASS cmp "$tmpdir/restore2/small" "$tmpdir/save/small"
-# (per the original DESIGN document, we should've had the old version
-# of the modified large file, but really that isn't implemented)
-# must _not_ have this file at all
-WVFAIL test -f "$tmpdir/restore2/big1"
-# and not the new one either
-WVFAIL test -f "$tmpdir/restore2/big2"
-
-WVSTART "index --fake-valid / save"
-WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
-WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
-WVPASS bup index "$tmpdir/save"
-WVPASS bup index --fake-valid "$tmpdir/save/big1" "$tmpdir/save/big2"
-WVPASS bup save -vv -n test "$tmpdir/save"
-WVPASS mkdir "$tmpdir/restore3"
-WVPASS bup restore -v --outdir="$tmpdir/restore3/" "/test/latest$tmpdir/save/"
-WVPASS cmp "$tmpdir/restore3/small" "$tmpdir/save/small"
-WVPASSEQ "$(sha1sum < "$tmpdir/restore3/big1")" "$big1sha"
-WVPASS cmp "$tmpdir/restore3/big2" "$tmpdir/save/big2"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-
-WVSTART "save --strip"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --strip -n foo src/x/y
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/y/ restore/latest/
-
-
-WVSTART "save --strip-path (relative)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --strip-path src -n foo src/x
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ restore/latest/
-
-
-WVSTART "save --strip-path (absolute)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --strip-path "$tmpdir" -n foo src
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ "restore/latest/src/"
-
-
-WVSTART "save --strip-path (no match)"
-if test $(WVPASS path-filesystems . | WVPASS sort -u | WVPASS wc -l) -ne 1
-then
- # Skip the test because the attempt to restore parent dirs to the
- # current filesystem may fail -- i.e. running from
- # /foo/ext4/bar/btrfs will fail when bup tries to restore linux
- # attrs above btrfs to the restore tree *inside* btrfs.
- # FIXME: add WVSKIP
- echo "(running from tree with mixed filesystems; skipping test)" 1>&2
- exit 0
-else
- WVPASS force-delete "$BUP_DIR" src restore
- WVPASS bup init
- WVPASS mkdir -p src/x/y/z
- WVPASS bup random 8k > src/x/y/random-1
- WVPASS bup random 8k > src/x/y/z/random-2
- WVPASS bup index -u src
- WVPASS bup save --strip-path foo -n foo src/x
- WVPASS bup restore -C restore /foo/latest
- WVPASS compare-trees src/ "restore/latest/$tmpdir/src/"
-fi
-
-
-WVSTART "save --graft (empty graft points disallowed)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir src
-WVFAIL bup save --graft =/grafted -n graft-point-absolute src 2>&1 \
- | WVPASS grep 'error: a graft point cannot be empty'
-WVFAIL bup save --graft $top/$tmp= -n graft-point-absolute src 2>&1 \
- | WVPASS grep 'error: a graft point cannot be empty'
-
-
-WVSTART "save --graft /x/y=/a/b (relative paths)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --graft src=x -n foo src
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ "restore/latest/$tmpdir/x/"
-
-
-WVSTART "save --graft /x/y=/a/b (matching structure)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src/x/y=$tmpdir/src/a/b" -n foo src/x/y
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/y/ "restore/latest/$tmpdir/src/a/b/"
-
-
-WVSTART "save --graft /x/y=/a (shorter target)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src/x/y=/a" -n foo src/x/y
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/y/ "restore/latest/a/"
-
-
-WVSTART "save --graft /x=/a/b (longer target)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src=$tmpdir/src/a/b/c" -n foo src
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ "restore/latest/$tmpdir/src/a/b/c/"
-
-
-WVSTART "save --graft /x=/ (root target)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src/x=/" -n foo src/x
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/ "restore/latest/"
-
-
-#WVSTART "save --graft /=/x/ (root source)"
-# FIXME: Not tested for now -- will require cleverness, or caution as root.
-
-
-WVSTART "save collision"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/1 src/y/1
-WVPASS bup index -u src
-WVFAIL bup save --strip -n foo src/x src/y 2> tmp-err.log
-WVPASS grep -F "error: ignoring duplicate path 1 in /" tmp-err.log
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# Make sure that we can explicitly save a path whose parent is up to
-# date.
-
-WVSTART "save path with up to date parent"
-WVPASS bup init
-
-WVPASS mkdir -p src/a src/b
-WVPASS touch src/a/1 src/b/2
-WVPASS bup index -u src
-WVPASS bup save -n src src
-
-WVPASS bup save -n src src/b
-WVPASS bup restore -C restore "src/latest/$(pwd)/"
-WVPASS test ! -e restore/src/a
-WVPASS "$top/t/compare-trees" -c src/b/ restore/src/b/
-
-WVPASS bup save -n src src/a/1
-WVPASS rm -r restore
-WVPASS bup restore -C restore "src/latest/$(pwd)/"
-WVPASS test ! -e restore/src/b
-WVPASS "$top/t/compare-trees" -c src/a/ restore/src/a/
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-mb=1048576
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-readonly mb top tmpdir
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# The 3MB guess is semi-arbitrary, but we've been informed that
-# Lustre, for example, uses 1MB, so guess higher than that, at least.
-block_size=$(bup-cfg-py -c \
- "import os; print(getattr(os.stat('.'), 'st_blksize', 0)) or $mb * 3") \
- || exit $?
-data_size=$((block_size * 10))
-readonly block_size data_size
-
-WVPASS dd if=/dev/zero of=test-sparse-probe seek="$data_size" bs=1 count=1
-probe_size=$(WVPASS du -k -s test-sparse-probe | WVPASS cut -f1) || exit $?
-if [ "$probe_size" -ge "$((data_size / 1024))" ]; then
- WVSTART "no sparse support detected -- skipping tests"
- exit 0
-fi
-
-WVSTART "sparse restore on $(current-filesystem), assuming ${block_size}B blocks"
-
-WVPASS bup init
-WVPASS mkdir src
-
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
-WVPASS bup index src
-WVPASS bup save -n src src
-
-WVSTART "sparse file restore (all sparse)"
-WVPASS bup restore -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --no-sparse (all sparse)"
-WVPASS rm -r restore
-WVPASS bup restore --no-sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (all sparse)"
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse end)"
-WVPASS echo "start" > src/foo
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1 conv=notrunc
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse middle)"
-WVPASS echo "end" >> src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (bracketed zero run in buf)"
-WVPASS echo 'x' > src/foo
-WVPASS dd if=/dev/zero bs=1 count=512 >> src/foo
-WVPASS echo 'y' >> src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse start)"
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
-WVPASS echo "end" >> src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse start and end)"
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
-WVPASS echo "middle" >> src/foo
-WVPASS dd if=/dev/zero of=src/foo seek=$((2 * data_size)) bs=1 count=1 conv=notrunc
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-if test "$block_size" -gt $mb; then
- random_size="$block_size"
-else
- random_size=1M
-fi
-WVSTART "sparse file restore --sparse (random $random_size)"
-WVPASS bup random --seed "$RANDOM" 1M > src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (random sparse regions)"
-WVPASS rm -rf "$BUP_DIR" src
-WVPASS bup init
-WVPASS mkdir src
-for sparse_dataset in 0 1 2 3 4 5 6 7 8 9
-do
- WVPASS "$top/t/sparse-test-data" "src/foo-$sparse_dataset"
-done
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (short zero runs around boundary)"
-WVPASS bup-cfg-py > src/foo <<EOF
-from sys import stdout
-stdout.write("x" * 65535 + "\0")
-stdout.write("\0" + "x" * 65535)
-stdout.write("\0" + "x" * 65534 + "\0")
-stdout.write("x" * 65536)
-stdout.write("\0")
-EOF
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVPASS bup init
-
-WVSTART "split --noop"
-WVPASS bup split --noop <"$top/t/testfile1" >noop.tmp
-WVPASSEQ '' "$(<noop.tmp)"
-WVPASS bup split --noop -b <"$top/t/testfile1" >tags1n.tmp
-WVPASS bup split --noop -t <"$top/t/testfile2" >tags2tn.tmp
-WVPASSEQ $(find "$BUP_DIR/objects/pack" -name '*.pack' | wc -l) 0
-
-WVSTART "split"
-WVPASS echo a >a.tmp
-WVPASS echo b >b.tmp
-WVPASS bup split -b a.tmp >taga.tmp
-WVPASS bup split -b b.tmp >tagb.tmp
-WVPASS cat a.tmp b.tmp | WVPASS bup split -b >tagab.tmp
-WVPASSEQ $(cat taga.tmp | wc -l) 1
-WVPASSEQ $(cat tagb.tmp | wc -l) 1
-WVPASSEQ $(cat tagab.tmp | wc -l) 1
-WVPASSEQ $(cat tag[ab].tmp | wc -l) 2
-WVPASSEQ "$(bup split -b a.tmp b.tmp)" "$(cat tagab.tmp)"
-WVPASSEQ "$(bup split -b --keep-boundaries a.tmp b.tmp)" "$(cat tag[ab].tmp)"
-WVPASSEQ "$(cat tag[ab].tmp | bup split -b --keep-boundaries --git-ids)" \
- "$(cat tag[ab].tmp)"
-WVPASSEQ "$(cat tag[ab].tmp | bup split -b --git-ids)" \
- "$(cat tagab.tmp)"
-WVPASS bup split --bench -b <"$top/t/testfile1" >tags1.tmp
-WVPASS bup split -vvvv -b "$top/t/testfile2" >tags2.tmp
-WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
-WVPASS bup margin
-WVPASS bup midx -f
-WVPASS bup midx --check -a
-WVPASS bup midx -o "$BUP_DIR/objects/pack/test1.midx" \
- "$BUP_DIR"/objects/pack/*.idx
-WVPASS bup midx --check -a
-WVPASS bup midx -o "$BUP_DIR"/objects/pack/test1.midx \
- "$BUP_DIR"/objects/pack/*.idx \
- "$BUP_DIR"/objects/pack/*.idx
-WVPASS bup midx --check -a
-all=$(echo "$BUP_DIR"/objects/pack/*.idx "$BUP_DIR"/objects/pack/*.midx)
-WVPASS bup midx -o "$BUP_DIR"/objects/pack/zzz.midx $all
-WVPASS bup tick
-WVPASS bup midx -o "$BUP_DIR"/objects/pack/yyy.midx $all
-WVPASS bup midx -a
-WVPASSEQ "$(echo "$BUP_DIR"/objects/pack/*.midx)" \
- ""$BUP_DIR"/objects/pack/yyy.midx"
-WVPASS bup margin
-WVPASS bup split -t "$top/t/testfile2" >tags2t.tmp
-WVPASS bup split -t "$top/t/testfile2" --fanout 3 >tags2tf.tmp
-WVPASS bup split -r "$BUP_DIR" -c "$top/t/testfile2" >tags2c.tmp
-WVPASS bup split -r ":$BUP_DIR" -c "$top/t/testfile2" >tags2c.tmp
-WVPASS ls -lR \
- | WVPASS bup split -r ":$BUP_DIR" -c --fanout 3 --max-pack-objects 3 -n lslr \
- || exit $?
-WVPASS bup ls
-WVFAIL bup ls /does-not-exist
-WVPASS bup ls /lslr
-WVPASS bup ls /lslr/latest
-WVPASS bup ls /lslr/latest/
-#WVPASS bup ls /lslr/1971-01-01 # all dates always exist
-WVFAIL diff -u tags1.tmp tags2.tmp
-WVPASS diff -u tags1.tmp tags1n.tmp
-WVPASS diff -u tags2t.tmp tags2tn.tmp
-
-# fanout must be different from non-fanout
-WVFAIL diff tags2t.tmp tags2tf.tmp
-WVPASS wc -c "$top/t/testfile1" "$top/t/testfile2"
-WVPASS wc -l tags1.tmp tags2.tmp
-
-WVSTART "join"
-WVPASS bup join $(cat tags1.tmp) >out1.tmp
-WVPASS bup join <tags2.tmp >out2.tmp
-WVPASS bup join <tags2t.tmp -o out2t.tmp
-WVPASS bup join -r "$BUP_DIR" <tags2c.tmp >out2c.tmp
-WVPASS bup join -r ":$BUP_DIR" <tags2c.tmp >out2c.tmp
-WVPASS diff -u "$top/t/testfile1" out1.tmp
-WVPASS diff -u "$top/t/testfile2" out2.tmp
-WVPASS diff -u "$top/t/testfile2" out2t.tmp
-WVPASS diff -u "$top/t/testfile2" out2c.tmp
-WVPASSEQ "$(bup join split_empty_string.tmp)" ""
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVSTART "half hour TZ"
-
-export TZ=ACDT-10:30
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVPASS mkdir src
-WVPASS bup index src
-WVPASS bup save -n src -d 1420164180 src
-
-WVPASSEQ "$(WVPASS git cat-file commit src | sed -ne 's/^author .*> //p')" \
-"1420164180 +1030"
-
-WVPASSEQ "$(WVPASS bup ls /src)" \
-"2015-01-02-123300
-latest"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-TOP="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
- "$TOP/bup" "$@"
-}
-
-wait-for-server-start()
-{
- curl --unix-socket ./socket http://localhost/
- curl_status=$?
- while test $curl_status -eq 7; do
- sleep 0.2
- curl --unix-socket ./socket http://localhost/
- curl_status=$?
- done
- WVPASSEQ $curl_status 0
-}
-
-WVPASS cd "$tmpdir"
-
-# FIXME: add WVSKIP
-if test -z "$(type -p curl)"; then
- WVSTART 'curl does not appear to be installed; skipping test'
- exit 0
-fi
-
-WVPASS bup-cfg-py -c "import socket as s; s.socket(s.AF_UNIX).bind('socket')"
-curl -s --unix-socket ./socket http://localhost/foo
-if test $? -ne 7; then
- WVSTART 'curl does not appear to support --unix-socket; skipping test'
- exit 0
-fi
-
-if ! bup-python -c 'import tornado' 2> /dev/null; then
- WVSTART 'unable to import tornado; skipping test'
- exit 0
-fi
-
-WVSTART 'web'
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo '¡excitement!' > src/data
-WVPASS echo -e 'whee \x80\x90\xff' > "$(echo -ne 'src/whee \x80\x90\xff')"
-WVPASS bup index src
-WVPASS bup save -n '¡excitement!' --strip src
-
-"$TOP/bup" web unix://socket &
-web_pid=$!
-wait-for-server-start
-
-WVPASS curl --unix-socket ./socket \
- 'http://localhost/%C2%A1excitement%21/latest/data' > result
-WVPASS curl --unix-socket ./socket \
- 'http://localhost/%C2%A1excitement%21/latest/whee%20%80%90%ff' > result2
-WVPASSEQ "$(curl --unix-socket ./socket http://localhost/static/styles.css)" \
- "$(cat "$TOP/lib/web/static/styles.css")"
-
-WVPASSEQ '¡excitement!' "$(cat result)"
-WVPASS cmp "$(echo -ne 'src/whee \x80\x90\xff')" result2
-WVPASS kill -s TERM "$web_pid"
-WVPASS wait "$web_pid"
-
-WVPASS rm -r "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-root_status="$(t/root-status)" || exit $?
-
-if [ "$root_status" != root ]; then
- WVSTART 'not root: skipping tests'
- exit 0 # FIXME: add WVSKIP.
-fi
-
-if ! modprobe loop; then
- WVSTART 'unable to load loopback module; skipping tests' 1>&2
- exit 0
-fi
-
-# These tests are only likely to work under Linux for now
-# (patches welcome).
-if ! [[ $(uname) =~ Linux ]]; then
- WVSTART 'not Linux: skipping tests'
- exit 0 # FIXME: add WVSKIP.
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS bup init
-WVPASS pushd "$tmpdir"
-
-WVSTART 'drecurse'
-
-WVPASS dd if=/dev/zero of=testfs-1.img bs=1M count=32
-WVPASS dd if=/dev/zero of=testfs-2.img bs=1M count=32
-WVPASS mkfs -F testfs-1.img # Don't care what type (though must have symlinks)
-WVPASS mkfs -F testfs-2.img # Don't care what type (though must have symlinks)
-WVPASS mkdir -p src/mnt-1/hidden-1 src/mnt-2/hidden-2
-WVPASS mount -o loop testfs-1.img src/mnt-1
-WVPASS mount -o loop testfs-2.img src/mnt-2
-
-WVPASS touch src/1
-
-WVPASS mkdir -p src/mnt-1/x
-WVPASS touch src/mnt-1/2 src/mnt-1/x/3
-
-WVPASS touch src/mnt-2/4
-
-(WVPASS cd src && WVPASS ln -s mnt-2 mnt-link)
-(WVPASS cd src && WVPASS ln -s . top)
-
-WVPASSEQ "$(bup drecurse src | grep -vF lost+found)" "src/top
-src/mnt-link
-src/mnt-2/4
-src/mnt-2/
-src/mnt-1/x/3
-src/mnt-1/x/
-src/mnt-1/2
-src/mnt-1/
-src/1
-src/"
-
-WVPASSEQ "$(bup drecurse -x src)" "src/top
-src/mnt-link
-src/mnt-2/
-src/mnt-1/
-src/1
-src/"
-
-WVSTART 'index/save/restore'
-
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASS "$top/t/compare-trees" -c src/ src-restore/src/
-
-# Test -x when none of the mount points are explicitly indexed
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-link
-./top"
-
-# Test -x when a mount point is explicitly indexed. This should
-# include the mount.
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src src/mnt-2
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-2/4
-./mnt-link
-./top"
-
-# Test -x when a direct link to a mount point is explicitly indexed.
-# This should *not* include the mount.
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src src/mnt-link
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-link
-./top"
-
-# Test -x when a path that resolves to a mount point is explicitly
-# indexed (i.e. dir symlnks that redirect the leaf to a mount point).
-# This should include the mount.
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src src/top/top/mnt-2
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-2/4
-./mnt-link
-./top"
-
-WVPASS cd "$top"
-WVPASS umount "$tmpdir/src/mnt-1"
-WVPASS umount "$tmpdir/src/mnt-2"
-WVPASS rm -r "$tmpdir"
+++ /dev/null
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVSTART "init"
-WVPASS bup init
-D=bupdata.tmp
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVPASS touch $D/a
-WVPASS bup random 128k >$D/b
-WVPASS mkdir $D/d $D/d/e
-WVPASS bup random 512 >$D/f
-WVPASS touch $D/d/z
-WVPASS touch $D/d/z
-WVPASS bup index $D
-WVPASS bup save -t $D
-
-
-WVSTART "bloom"
-WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-WVPASS rm "$BUP_DIR"/objects/pack/bup.bloom
-WVPASS bup bloom -k 4
-WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-WVPASS bup bloom -d "$BUP_DIR"/objects/pack --ruin --force
-WVFAIL bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-WVPASS bup bloom --force -k 5
-WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-
-
-WVSTART "memtest"
-WVPASS bup memtest -c1 -n100
-WVPASS bup memtest -c1 -n100 --existing
-
-
-WVSTART "save/git-fsck"
-(
- WVPASS cd "$BUP_DIR"
- #git repack -Ad
- #git prune
- WVPASS bup random 4k | WVPASS bup split -b
- (WVPASS cd "$top/t/sampledata" && WVPASS bup save -vvn master /) || exit $?
- result="$(LC_ALL=C git fsck --full --strict 2>&1)" || exit $?
- n=$(echo "$result" |
- WVFAIL egrep -v 'dangling (commit|tree|blob)' |
- WVPASS tee -a /dev/stderr |
- WVPASS wc -l) || exit $?
- WVPASS [ "$n" -eq 0 ]
-) || exit $?
-
-
-WVSTART "ftp"
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/b" >$D/b.new
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f" >$D/f.new
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f"{,} >$D/f2.new
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/a" >$D/a.new
-WVPASSEQ "$(sha1sum <$D/b)" "$(sha1sum <$D/b.new)"
-WVPASSEQ "$(sha1sum <$D/f)" "$(sha1sum <$D/f.new)"
-WVPASSEQ "$(cat $D/f.new{,} | sha1sum)" "$(sha1sum <$D/f2.new)"
-WVPASSEQ "$(sha1sum <$D/a)" "$(sha1sum <$D/a.new)"
-
-
-WVSTART "tag"
-WVFAIL bup tag -d v0.n 2>/dev/null
-WVFAIL bup tag v0.n non-existant 2>/dev/null
-WVPASSEQ "$(bup tag)" ""
-WVPASS bup tag v0.1 master
-WVPASSEQ "$(bup tag)" "v0.1"
-WVFAIL bup tag v0.1 master
-WVPASS bup tag -f v0.1 master
-WVPASS bup tag -d v0.1
-WVPASS bup tag -f -d v0.1
-WVFAIL bup tag -d v0.1
-
-
-WVSTART "indexfile"
-D=indexfile.tmp
-INDEXFILE=tmpindexfile.tmp
-WVPASS rm -f $INDEXFILE
-WVPASS force-delete $D
-WVPASS mkdir $D
-export BUP_DIR="$D/.bup"
-WVPASS bup init
-WVPASS touch $D/a
-WVPASS touch $D/b
-WVPASS mkdir $D/c
-WVPASS bup index -ux $D
-WVPASS bup save --strip -n bupdir $D
-WVPASSEQ "$(bup ls -F bupdir/latest/)" "a
-b
-c/"
-WVPASS bup index -f $INDEXFILE --exclude=$D/c -ux $D
-WVPASS bup save --strip -n indexfile -f $INDEXFILE $D
-WVPASSEQ "$(bup ls indexfile/latest/)" "a
-b"
-
-
-WVSTART "import-rsnapshot"
-D=rsnapshot.tmp
-export BUP_DIR="$tmpdir/$D/.bup"
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVPASS bup init
-WVPASS mkdir -p $D/hourly.0/buptest/a
-WVPASS touch $D/hourly.0/buptest/a/b
-WVPASS mkdir -p $D/hourly.0/buptest/c/d
-WVPASS touch $D/hourly.0/buptest/c/d/e
-WVPASS true
-WVPASS bup import-rsnapshot $D/
-WVPASSEQ "$(bup ls -F buptest/latest/)" "a/
-c/"
-
-
-WVSTART features
-expect_py_ver=$(LC_CTYPE=C "$top/config/bin/python" \
- -c 'import platform; print(platform.python_version())') \
- || exit $?
-actual_py_ver=$(bup features | grep Python: | sed -Ee 's/ +Python: //') || exit $?
-WVPASSEQ "$expect_py_ver" "$actual_py_ver"
-
-WVPASS rm -rf "$tmpdir"
+++ /dev/null
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
+++ /dev/null
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pwba vf punatvat fbzr enaqbz olgrf urer naq gurers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-va nccebkvzngryl gur fnzr cynprEQBAYL)
-naq qvfgevo-0)
-hgvba nf(sq)
-
-va gur bevtvany grfg svyrfREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- tvir be gnxr n ovgerfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg qba'g npghnyyl cevag svyranzrf
-cebsvyr eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
- vzcbeg pCebsvyr
- qrs qb_vg():
- sbe v va vg:
- cnff
- pCebsvyr.eha('qb_vg()')
-ryfr:
- vs bcg.dhvrg:
- sbe v va vg:
- cnff
- ryfr:
- sbe (anzr,fg) va vg:
- cevag anzr
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-o,oybof bhgchg n frevrf bs oybo vqf
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg qba'g cevag cebterff zrffntrf
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
- bcg.abbc be bcg.pbcl):
- b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
- bcg.pbzzvg be bcg.anzr):
- b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
- tvg.ireobfr = bcg.ireobfr - 1
- bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
- unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
- unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
- unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
- unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
- pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
- funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
- gerr = j.arj_gerr(funyvfg)
-ryfr:
- ynfg = 0
- sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
- unfufcyvg.gbgny_fcyvg += yra(oybo)
- vs bcg.pbcl:
- flf.fgqbhg.jevgr(fge(oybo))
- zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
- vs abg bcg.dhvrg naq ynfg != zrtf:
- cebterff('%q Zolgrf ernq\e' % zrtf)
- ynfg = zrtf
- cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
- ybt('\a')
-vs bcg.oybof:
- sbe (zbqr,anzr,ova) va funyvfg:
- cevag ova.rapbqr('urk')
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-vs j:
- j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
- ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
- % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
- pyvfg = [pue(o) sbe o va olgrf]
- erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
- svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
- q = {}
- sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
- y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
- q[y[0]] = y[1]
- vs pbhag >= 0:
- r1 = pbhag
- svryqf = [q[x] sbe x va svryqf]
- ryfr:
- r1 = ''
- cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
- flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore= ahzore bs bowrpgf cre plpyr
-p,plpyrf= ahzore bs plpyrf gb eha
-vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
- sbe a va kenatr(ahzore):
- o = s.ernq(3)
- vs 0:
- olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
- olgrf[2] &= 0ks0
- ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
- ryfr:
- n[0:2] = o[0:2]
- n[2] = pue(beq(o[2]) & 0ks0)
- ova = fge(n[0:20])
- #cevag ova.rapbqr('urk')
- z.rkvfgf(ova)
- ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
- cersvk = ''
- vs bcg.unfu:
- cersvk += "%f " % a.unfu.rapbqr('urk')
- vs fgng.F_VFQVE(a.zbqr):
- cevag '%f%f/' % (cersvk, grkg)
- ryvs fgng.F_VFYAX(a.zbqr):
- cevag '%f%f@' % (cersvk, grkg)
- ryfr:
- cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
- rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
- gel:
- a = gbc.yerfbyir(q)
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- cevag_abqr(fho.anzr, fho)
- ryfr:
- cevag_abqr(q, a)
- rkprcg isf.AbqrReebe, r:
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
- vs fgng.F_VFQVE(a.zbqr):
- erghea '%f/' % grkg
- ryvs fgng.F_VFYAX(a.zbqr):
- erghea '%f@' % grkg
- ryfr:
- erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
- y = []
- vs fgng.F_VFQVE(a.zbqr):
- sbe fho va a:
- y.nccraq(abqr_anzr(fho.anzr, fho))
- ryfr:
- y.nccraq(abqr_anzr(cngu, a))
- cevag pbyhzangr(y, '')
-
-
-qrs jevgr_gb_svyr(vas, bhgs):
- sbe oybo va puhaxlernqre(vas):
- bhgs.jevgr(oybo)
-
-
-qrs vachgvgre():
- vs bf.vfnggl(flf.fgqva.svyrab()):
- juvyr 1:
- gel:
- lvryq enj_vachg('ohc> ')
- rkprcg RBSReebe:
- oernx
- ryfr:
- sbe yvar va flf.fgqva:
- lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
- (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
- (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
- #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
- a = cjq.erfbyir(qve)
- fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
- a.fhof()))
- erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
- tybony _ynfg_yvar
- tybony _ynfg_erf
- gel:
- yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
- vs _ynfg_yvar != yvar:
- _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
- _ynfg_yvar = yvar
- (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
- vs fgngr < yra(fhof):
- fa = fhof[fgngr]
- fa1 = fa.erfbyir('') # qrers flzyvaxf
- shyyanzr = bf.cngu.wbva(qve, fa.anzr)
- vs fgng.F_VFQVE(fa1.zbqr):
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
- grezvangr=Snyfr)
- ryfr:
- erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
- grezvangr=Gehr) + ' '
- erghea grkg + erg
- rkprcg Rkprcgvba, r:
- ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
- yvarf = rkgen
-ryfr:
- ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
- ernqyvar.frg_pbzcyrgre(pbzcyrgre)
- ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
- yvarf = vachgvgre()
-
-sbe yvar va yvarf:
- vs abg yvar.fgevc():
- pbagvahr
- jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
- pzq = jbeqf[0].ybjre()
- #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
- gel:
- vs pzq == 'yf':
- sbe cnez va (jbeqf[1:] be ['.']):
- qb_yf(cnez, cjq.erfbyir(cnez))
- ryvs pzq == 'pq':
- sbe cnez va jbeqf[1:]:
- cjq = cjq.erfbyir(cnez)
- ryvs pzq == 'cjq':
- cevag cjq.shyyanzr()
- ryvs pzq == 'png':
- sbe cnez va jbeqf[1:]:
- jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
- ryvs pzq == 'trg':
- vs yra(jbeqf) abg va [2,3]:
- envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
- eanzr = jbeqf[1]
- (qve,onfr) = bf.cngu.fcyvg(eanzr)
- yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
- vas = cjq.erfbyir(eanzr).bcra()
- ybt('Fnivat %e\a' % yanzr)
- jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
- ryvs pzq == 'ztrg':
- sbe cnez va jbeqf[1:]:
- (qve,onfr) = bf.cngu.fcyvg(cnez)
- sbe a va cjq.erfbyir(qve).fhof():
- vs sazngpu.sazngpu(a.anzr, onfr):
- gel:
- ybt('Fnivat %e\a' % a.anzr)
- vas = a.bcra()
- bhgs = bcra(a.anzr, 'jo')
- jevgr_gb_svyr(vas, bhgs)
- bhgs.pybfr()
- rkprcg Rkprcgvba, r:
- ybt(' reebe: %f\a' % r)
- ryvs pzq == 'uryc' be pzq == '?':
- ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
- ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
- oernx
- ryfr:
- envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
- rkprcg Rkprcgvba, r:
- ybt('reebe: %f\a' % r)
- #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
- abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
- _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
- ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
- # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
- bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
- qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
- rkr = flf.neti[0]
- (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
- znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
- t = tybo.tybo(znacngu)
- vs t:
- bf.rkrpic('zna', ['zna', '-y', t[0]])
- ryfr:
- bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
- b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
- qrs __vavg__(frys):
- frys.fg_zbqr = 0
- frys.fg_vab = 0
- frys.fg_qri = 0
- frys.fg_ayvax = 0
- frys.fg_hvq = 0
- frys.fg_tvq = 0
- frys.fg_fvmr = 0
- frys.fg_ngvzr = 0
- frys.fg_zgvzr = 0
- frys.fg_pgvzr = 0
- frys.fg_oybpxf = 0
- frys.fg_oyxfvmr = 0
- frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
- cnegf = cngu.fcyvg('/')
- pnpur[('',)] = gbc
- p = Abar
- znk = yra(cnegf)
- #ybt('pnpur: %e\a' % pnpur.xrlf())
- sbe v va enatr(znk):
- cer = cnegf[:znk-v]
- #ybt('pnpur gelvat: %e\a' % cer)
- p = pnpur.trg(ghcyr(cer))
- vs p:
- erfg = cnegf[znk-v:]
- sbe e va erfg:
- #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
- p = p.yerfbyir(e)
- xrl = ghcyr(cer + [e])
- #ybt('fnivat: %e\a' % (xrl,))
- pnpur[xrl] = p
- oernx
- nffreg(p)
- erghea p
-
-
-
-pynff OhcSf(shfr.Shfr):
- qrs __vavg__(frys, gbc):
- shfr.Shfr.__vavg__(frys)
- frys.gbc = gbc
-
- qrs trgngge(frys, cngu):
- ybt('--trgngge(%e)\a' % cngu)
- gel:
- abqr = pnpur_trg(frys.gbc, cngu)
- fg = Fgng()
- fg.fg_zbqr = abqr.zbqr
- fg.fg_ayvax = abqr.ayvaxf()
- fg.fg_fvmr = abqr.fvmr()
- fg.fg_zgvzr = abqr.zgvzr
- fg.fg_pgvzr = abqr.pgvzr
- fg.fg_ngvzr = abqr.ngvzr
- erghea fg
- rkprcg isf.AbFhpuSvyr:
- erghea -reeab.RABRAG
-
- qrs ernqqve(frys, cngu, bssfrg):
- ybt('--ernqqve(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- lvryq shfr.Qveragel('.')
- lvryq shfr.Qveragel('..')
- sbe fho va abqr.fhof():
- lvryq shfr.Qveragel(fho.anzr)
-
- qrs ernqyvax(frys, cngu):
- ybt('--ernqyvax(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- erghea abqr.ernqyvax()
-
- qrs bcra(frys, cngu, syntf):
- ybt('--bcra(%e)\a' % cngu)
- abqr = pnpur_trg(frys.gbc, cngu)
- nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
- vs (syntf & nppzbqr) != bf.B_EQBAYL:
- erghea -reeab.RNPPRF
- abqr.bcra()
-
- qrs eryrnfr(frys, cngu, syntf):
- ybt('--eryrnfr(%e)\a' % cngu)
-
- qrs ernq(frys, cngu, fvmr, bssfrg):
- ybt('--ernq(%e)\a' % cngu)
- a = pnpur_trg(frys.gbc, cngu)
- b = a.bcra()
- b.frrx(bssfrg)
- erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
- envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht vapernfr qroht yriry
-s,sbertebhaq eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
- b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
- s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
- s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
- tvg.vavg_ercb() # ybpny ercb
- tvg.purpx_ercb_be_qvr()
- pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
- pyv.pybfr()
-ryfr:
- tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
- pbhag = 0
- sbe r va tvg.vqkzretr(vqkyvfg):
- pbhag += 1
- cersvk = tvg.rkgenpg_ovgf(r, ovgf)
- gnoyr[cersvk] = pbhag
- lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
- vs abg bhgsvyranzr:
- nffreg(bhgqve)
- fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
- bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-
- vac = []
- gbgny = 0
- sbe anzr va vasvyranzrf:
- vk = tvg.CnpxVqk(anzr)
- vac.nccraq(vk)
- gbgny += yra(vk)
-
- ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
- vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
- be (bcg.sbepr naq abg gbgny):
- ybt('zvqk: abguvat gb qb.\a')
- erghea
-
- cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
- ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
- ragevrf = 2**ovgf
- ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-
- gnoyr = [0]*ragevrf
-
- gel:
- bf.hayvax(bhgsvyranzr)
- rkprcg BFReebe:
- cnff
- s = bcra(bhgsvyranzr + '.gzc', 'j+')
- s.jevgr('ZVQK\0\0\0\2')
- s.jevgr(fgehpg.cnpx('!V', ovgf))
- nffreg(s.gryy() == 12)
- s.jevgr('\0'*4*ragevrf)
-
- sbe r va zretr(vac, ovgf, gnoyr):
- s.jevgr(r)
-
- s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
- s.frrx(12)
- s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
- s.pybfr()
- bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
- # guvf vf whfg sbe grfgvat
- vs 0:
- c = tvg.CnpxZvqk(bhgsvyranzr)
- nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
- cevag c.vqkanzrf
- nffreg(yra(c) == gbgny)
- cv = vgre(c)
- sbe v va zretr(vac, gbgny, ovgf, gnoyr):
- nffreg(v == cv.arkg())
- nffreg(c.rkvfgf(v))
-
- cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
- b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
- qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
- cnguf = [tvg.ercb('bowrpgf/cnpx')]
- cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
- sbe cngu va cnguf:
- ybt('zvqk: fpnaavat %f\a' % cngu)
- vs bcg.sbepr:
- qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
- ryvs bcg.nhgb:
- z = tvg.CnpxVqkYvfg(cngu)
- arrqrq = {}
- sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
- vs cnpx.anzr.raqfjvgu('.vqk'):
- arrqrq[cnpx.anzr] = 1
- qry z
- qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
- ybt('\a')
-ryfr:
- b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
- y = []
- sbe v va kenatr(a):
- y.nccraq(pue(enaqbz.enaqenatr(0,256)))
- erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
- JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz= ahzore bs oybpxf gb qnzntr
-f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
- b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
- enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
- ybt('Qnzntvat "%f"...\a' % anzr)
- s = bcra(anzr, 'e+o')
- fg = bf.sfgng(s.svyrab())
- fvmr = fg.fg_fvmr
- vs bcg.creprag be bcg.fvmr:
- zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
- zf2 = bcg.fvmr be fvmr
- znkfvmr = zva(zf1, zf2)
- ryfr:
- znkfvmr = 1
- puhaxf = bcg.ahz be 10
- puhaxfvmr = fvmr/puhaxf
- sbe e va enatr(puhaxf):
- fm = enaqbz.enaqenatr(1, znkfvmr+1)
- vs fm > fvmr:
- fm = fvmr
- vs bcg.rdhny:
- bsf = e*puhaxfvmr
- ryfr:
- bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
- ybt(' %6q olgrf ng %q\a' % (fm, bsf))
- s.frrx(bsf)
- s.jevgr(enaqoybpx(fm))
- s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
- tvg.vavg_ercb(net)
- ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
- tvg.purpx_ercb_be_qvr(net)
- ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
- pbaa.bx()
-
-
-qrs yvfg_vaqrkrf(pbaa, whax):
- tvg.purpx_ercb_be_qvr()
- sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
- vs s.raqfjvgu('.vqk'):
- pbaa.jevgr('%f\a' % s)
- pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
- tvg.purpx_ercb_be_qvr()
- nffreg(anzr.svaq('/') < 0)
- nffreg(anzr.raqfjvgu('.vqk'))
- vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
- pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
- pbaa.jevgr(vqk.znc)
- pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
- tybony fhfcraqrq_j
- tvg.purpx_ercb_be_qvr()
- fhttrfgrq = {}
- vs fhfcraqrq_j:
- j = fhfcraqrq_j
- fhfcraqrq_j = Abar
- ryfr:
- j = tvg.CnpxJevgre()
- juvyr 1:
- af = pbaa.ernq(4)
- vs abg af:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
- a = fgehpg.hacnpx('!V', af)[0]
- #ybt('rkcrpgvat %q olgrf\a' % a)
- vs abg a:
- ybt('ohc freire: erprvirq %q bowrpg%f.\a'
- % (j.pbhag, j.pbhag!=1 naq "f" be ''))
- shyycngu = j.pybfr()
- vs shyycngu:
- (qve, anzr) = bf.cngu.fcyvg(shyycngu)
- pbaa.jevgr('%f.vqk\a' % anzr)
- pbaa.bx()
- erghea
- ryvs a == 0kssssssss:
- ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
- fhfcraqrq_j = j
- pbaa.bx()
- erghea
-
- ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
- #ybt('ernq %q olgrf\a' % a)
- vs yra(ohs) < a:
- j.nobeg()
- envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
- % (a, yra(ohs)))
- (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
- fun = tvg.pnyp_unfu(glcr, pbagrag)
- byqcnpx = j.rkvfgf(fun)
- # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
- # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
- # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
- # ba gur freire fvqr.
- vs abg fhttrfgrq naq \
- byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
- # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
- # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
- # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
- # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
- # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
- # rssvpvrag.
- j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
- byqcnpx = j.bowpnpur.rkvfgf(fun)
- ybt('arj fhttrfgvba: %e\a' % byqcnpx)
- nffreg(byqcnpx)
- nffreg(byqcnpx != Gehr)
- nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
- j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
- vs abg fhttrfgrq naq byqcnpx:
- nffreg(byqcnpx.raqfjvgu('.vqk'))
- (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
- vs abg (anzr va fhttrfgrq):
- ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
- pbaa.jevgr('vaqrk %f\a' % anzr)
- fhttrfgrq[anzr] = 1
- ryfr:
- j._enj_jevgr([ohs])
- # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- e = tvg.ernq_ers(ersanzr)
- pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
- pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
- tvg.purpx_ercb_be_qvr()
- arjiny = pbaa.ernqyvar().fgevc()
- byqiny = pbaa.ernqyvar().fgevc()
- tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
- pbaa.bx()
-
-
-qrs png(pbaa, vq):
- tvg.purpx_ercb_be_qvr()
- gel:
- sbe oybo va tvg.png(vq):
- pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
- pbaa.jevgr(oybo)
- rkprcg XrlReebe, r:
- ybt('freire: reebe: %f\a' % r)
- pbaa.jevgr('\0\0\0\0')
- pbaa.reebe(r)
- ryfr:
- pbaa.jevgr('\0\0\0\0')
- pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
- 'vavg-qve': vavg_qve,
- 'frg-qve': frg_qve,
- 'yvfg-vaqrkrf': yvfg_vaqrkrf,
- 'fraq-vaqrk': fraq_vaqrk,
- 'erprvir-bowrpgf': erprvir_bowrpgf,
- 'ernq-ers': ernq_ers,
- 'hcqngr-ers': hcqngr_ers,
- 'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
- yvar = _yvar.fgevc()
- vs abg yvar:
- pbagvahr
- ybt('ohc freire: pbzznaq: %e\a' % yvar)
- jbeqf = yvar.fcyvg(' ', 1)
- pzq = jbeqf[0]
- erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
- vs pzq == 'dhvg':
- oernx
- ryfr:
- pzq = pbzznaqf.trg(pzq)
- vs pzq:
- pzq(pbaa, erfg)
- ryfr:
- envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- png = pyv.png
-ryfr:
- pc = tvg.PngCvcr()
- png = pc.wbva
-
-sbe vq va rkgen:
- gel:
- sbe oybo va png(vq):
- flf.fgqbhg.jevgr(oybo)
- rkprcg XrlReebe, r:
- flf.fgqbhg.syhfu()
- ybt('reebe: %f\a' % r)
- erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr= erzbgr ercbfvgbel cngu
-g,gerr bhgchg n gerr vq
-p,pbzzvg bhgchg n pbzzvg vq
-a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg qba'g fubj cebterff zrgre
-fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
- b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
- b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
- b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
- pyv = pyvrag.Pyvrag(bcg.erzbgr)
- byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
- j = pyv.arj_cnpxjevgre()
-ryfr:
- pyv = Abar
- byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
- j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
- vs qve.raqfjvgu('/'):
- erghea qve[:-1]
- ryfr:
- erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
- nffreg(cneg)
- cnegf.nccraq(cneg)
- funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
- nffreg(yra(cnegf) >= 1)
- cneg = cnegf.cbc()
- funyvfg = funyvfgf.cbc()
- gerr = sbepr_gerr be j.arj_gerr(funyvfg)
- vs funyvfgf:
- funyvfgf[-1].nccraq(('40000', cneg, gerr))
- ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
- funyvfgf.nccraq(funyvfg)
- erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
- tybony pbhag, fhopbhag, ynfgerznva
- fhopbhag += a
- pp = pbhag + fhopbhag
- cpg = gbgny naq (pp*100.0/gbgny) be 0
- abj = gvzr.gvzr()
- ryncfrq = abj - gfgneg
- xcf = ryncfrq naq vag(pp/1024./ryncfrq)
- xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
- xcf = vag(xcf/xcf_senp)*xcf_senp
- vs pp:
- erznva = ryncfrq*1.0/pp * (gbgny-pp)
- ryfr:
- erznva = 0.0
- vs (ynfgerznva naq (erznva > ynfgerznva)
- naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
- erznva = ynfgerznva
- ryfr:
- ynfgerznva = erznva
- ubhef = vag(erznva/60/60)
- zvaf = vag(erznva/60 - ubhef*60)
- frpf = vag(erznva - ubhef*60*60 - zvaf*60)
- vs ryncfrq < 30:
- erznvafge = ''
- xcffge = ''
- ryfr:
- xcffge = '%qx/f' % xcf
- vs ubhef:
- erznvafge = '%qu%qz' % (ubhef, zvaf)
- ryvs zvaf:
- erznvafge = '%qz%q' % (zvaf, frpf)
- ryfr:
- erznvafge = '%qf' % frpf
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
- % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
- erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
- erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
- erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
- erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
- sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
- vs abg (sgbgny % 10024):
- cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
- rkvfgf = rag.rkvfgf()
- unfuinyvq = nyernql_fnirq(rag)
- rag.frg_fun_zvffvat(abg unfuinyvq)
- vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- gbgny += rag.fvmr
- sgbgny += 1
- cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
- unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
- (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
- rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
- unfuinyvq = nyernql_fnirq(rag)
- jnfzvffvat = rag.fun_zvffvat()
- byqfvmr = rag.fvmr
- vs bcg.ireobfr:
- vs abg rkvfgf:
- fgnghf = 'Q'
- ryvs abg unfuinyvq:
- vs rag.fun == vaqrk.RZCGL_FUN:
- fgnghf = 'N'
- ryfr:
- fgnghf = 'Z'
- ryfr:
- fgnghf = ' '
- vs bcg.ireobfr >= 2:
- ybt('%f %-70f\a' % (fgnghf, rag.anzr))
- ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
- vs abg ynfgqve.fgnegfjvgu(qve):
- ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
- ynfgqve = qve
-
- vs bcg.cebterff:
- cebterff_ercbeg(0)
- spbhag += 1
-
- vs abg rkvfgf:
- pbagvahr
- vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
- vs rkvfgf naq abg unfuinyvq:
- nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
- ynfgfxvc_anzr = rag.anzr
- pbagvahr
-
- nffreg(qve.fgnegfjvgu('/'))
- qvec = qve.fcyvg('/')
- juvyr cnegf > qvec:
- _cbc(sbepr_gerr = Abar)
- vs qve != '/':
- sbe cneg va qvec[yra(cnegf):]:
- _chfu(cneg)
-
- vs abg svyr:
- # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
- # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
- byqgerr = nyernql_fnirq(rag) # znl or Abar
- arjgerr = _cbc(sbepr_gerr = byqgerr)
- vs abg byqgerr:
- vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
- rag.vainyvqngr()
- ryfr:
- rag.inyvqngr(040000, arjgerr)
- rag.ercnpx()
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- pbagvahr
-
- # vg'f abg n qverpgbel
- vq = Abar
- vs unfuinyvq:
- zbqr = '%b' % rag.tvgzbqr
- vq = rag.fun
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- ryfr:
- vs fgng.F_VFERT(rag.zbqr):
- gel:
- s = unfufcyvg.bcra_abngvzr(rag.anzr)
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
- ryfr:
- vs fgng.F_VFQVE(rag.zbqr):
- nffreg(0) # unaqyrq nobir
- ryvs fgng.F_VFYAX(rag.zbqr):
- gel:
- ey = bf.ernqyvax(rag.anzr)
- rkprcg BFReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- rkprcg VBReebe, r:
- nqq_reebe(r)
- ynfgfxvc_anzr = rag.anzr
- ryfr:
- (zbqr, vq) = ('120000', j.arj_oybo(ey))
- ryfr:
- nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
- ynfgfxvc_anzr = rag.anzr
- vs vq:
- rag.inyvqngr(vag(zbqr, 8), vq)
- rag.ercnpx()
- funyvfgf[-1].nccraq((zbqr,
- tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
- vq))
- vs rkvfgf naq jnfzvffvat:
- pbhag += byqfvmr
- fhopbhag = 0
-
-
-vs bcg.cebterff:
- cpg = gbgny naq pbhag*100.0/gbgny be 100
- cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
- % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
- _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
- cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
- zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
- ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
- pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
- vs bcg.pbzzvg:
- cevag pbzzvg.rapbqr('urk')
-
-j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
-
-vs bcg.anzr:
- vs pyv:
- pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
- ryfr:
- tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
- pyv.pybfr()
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
- sbe r va vaqrk.ZretrVgre([e1, e2]):
- # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
- bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
- qrs __vavg__(frys, y):
- frys.v = vgre(y)
- frys.phe = Abar
- frys.arkg()
-
- qrs arkg(frys):
- gel:
- frys.phe = frys.v.arkg()
- rkprcg FgbcVgrengvba:
- frys.phe = Abar
- erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
- gel:
- ybt('purpx: purpxvat sbejneq vgrengvba...\a')
- r = Abar
- q = {}
- sbe r va ernqre.sbejneq_vgre():
- vs r.puvyqera_a:
- vs bcg.ireobfr:
- ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
- r.anzr))
- nffreg(r.puvyqera_bsf)
- nffreg(r.anzr.raqfjvgu('/'))
- nffreg(abg q.trg(r.puvyqera_bsf))
- q[r.puvyqera_bsf] = 1
- vs r.syntf & vaqrk.VK_UNFUINYVQ:
- nffreg(r.fun != vaqrk.RZCGL_FUN)
- nffreg(r.tvgzbqr)
- nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
- ybt('purpx: purpxvat abezny vgrengvba...\a')
- ynfg = Abar
- sbe r va ernqre:
- vs ynfg:
- nffreg(ynfg > r.anzr)
- ynfg = r.anzr
- rkprcg:
- ybt('vaqrk reebe! ng %e\a' % r)
- envfr
- ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
- ev = vaqrk.Ernqre(vaqrksvyr)
- jv = vaqrk.Jevgre(vaqrksvyr)
- evt = VgreUrycre(ev.vgre(anzr=gbc))
- gfgneg = vag(gvzr.gvzr())
-
- unfutra = Abar
- vs bcg.snxr_inyvq:
- qrs unfutra(anzr):
- erghea (0100644, vaqrk.SNXR_FUN)
-
- gbgny = 0
- sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
- vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
- flf.fgqbhg.jevgr('%f\a' % cngu)
- flf.fgqbhg.syhfu()
- cebterff('Vaqrkvat: %q\e' % gbgny)
- ryvs abg (gbgny % 128):
- cebterff('Vaqrkvat: %q\e' % gbgny)
- gbgny += 1
- juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
- vs evt.phe.rkvfgf():
- evt.phe.frg_qryrgrq()
- evt.phe.ercnpx()
- evt.arkg()
- vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
- vs cfg:
- evt.phe.sebz_fgng(cfg, gfgneg)
- vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
- vs unfutra:
- (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
- evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
- vs bcg.snxr_vainyvq:
- evt.phe.vainyvqngr()
- evt.phe.ercnpx()
- evt.arkg()
- ryfr: # arj cnguf
- jv.nqq(cngu, cfg, unfutra = unfutra)
- cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-
- vs ev.rkvfgf():
- ev.fnir()
- jv.syhfu()
- vs jv.pbhag:
- je = jv.arj_ernqre()
- vs bcg.purpx:
- ybt('purpx: orsber zretvat: byqsvyr\a')
- purpx_vaqrk(ev)
- ybt('purpx: orsber zretvat: arjsvyr\a')
- purpx_vaqrk(je)
- zv = vaqrk.Jevgre(vaqrksvyr)
- zretr_vaqrkrf(zv, ev, je)
- ev.pybfr()
- zv.pybfr()
- je.pybfr()
- jv.nobeg()
- ryfr:
- jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
- b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
- b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
- b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
- ybt('purpx: fgnegvat vavgvny purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
- vs abg cnguf:
- b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
- sbe (ec,cngu) va cnguf:
- hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
- sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
- vs (bcg.zbqvsvrq
- naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
- pbagvahr
- yvar = ''
- vs bcg.fgnghf:
- vs rag.vf_qryrgrq():
- yvar += 'Q '
- ryvs abg rag.vf_inyvq():
- vs rag.fun == vaqrk.RZCGL_FUN:
- yvar += 'N '
- ryfr:
- yvar += 'Z '
- ryfr:
- yvar += ' '
- vs bcg.unfu:
- yvar += rag.fun.rapbqr('urk') + ' '
- vs bcg.ybat:
- yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
- cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
- ybt('purpx: fgnegvat svany purpx.\a')
- purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
- ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
- flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
- Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
- b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
- vs bcg.ireobfr:
- ybt(f)
-
-qrs eha(neti):
- # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
- # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
- # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
- # svefg.
- sq = bf.qhc(2) # pbcl fgqree
- gel:
- c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
- erghea c.jnvg()
- svanyyl:
- bf.pybfr(sq)
-
-qrs cne2_frghc():
- tybony cne2_bx
- ei = 1
- gel:
- c = fhocebprff.Cbcra(['cne2', '--uryc'],
- fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
- ei = c.jnvg()
- rkprcg BFReebe:
- ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
- ryfr:
- cne2_bx = 1
-
-qrs cnei(yiy):
- vs bcg.ireobfr >= yiy:
- vs vfggl:
- erghea []
- ryfr:
- erghea ['-d']
- ryfr:
- erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
- erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
- + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
- erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
- erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
- s = bcra(onfr + '.cnpx', 'eo')
- s.frrx(-20, 2)
- jnagfhz = s.ernq(20)
- nffreg(yra(jnagfhz) == 20)
- s.frrx(0)
- fhz = Fun1()
- sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
- fhz.hcqngr(o)
- vs fhz.qvtrfg() != jnagfhz:
- envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
- fhz.urkqvtrfg()))
-
-
-qrs tvg_irevsl(onfr):
- vs bcg.dhvpx:
- gel:
- dhvpx_irevsl(onfr)
- rkprcg Rkprcgvba, r:
- qroht('reebe: %f\a' % r)
- erghea 1
- erghea 0
- ryfr:
- erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-
-
-qrs qb_cnpx(onfr, ynfg):
- pbqr = 0
- vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
- ierfhyg = cne2_irevsl(onfr)
- vs ierfhyg != 0:
- vs bcg.ercnve:
- eerfhyg = cne2_ercnve(onfr)
- vs eerfhyg != 0:
- cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
- pbqr = eerfhyg
- ryfr:
- cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
- pbqr = 100
- ryfr:
- cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
- pbqr = ierfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
- terfhyg = tvg_irevsl(onfr)
- vs terfhyg != 0:
- cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
- pbqr = terfhyg
- ryfr:
- vs cne2_bx naq bcg.trarengr:
- cerfhyg = cne2_trarengr(onfr)
- vs cerfhyg != 0:
- cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
- pbqr = cerfhyg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- cevag '%f bx' % ynfg
- ryfr:
- nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
- qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
- erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof= eha 'a' wbof va cnenyyry
-cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
- vs cne2_bx:
- flf.rkvg(0) # 'gehr' va fu
- ryfr:
- flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
- cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
- qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
- rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
- vs anzr.raqfjvgu('.cnpx'):
- onfr = anzr[:-5]
- ryvs anzr.raqfjvgu('.vqk'):
- onfr = anzr[:-4]
- ryvs anzr.raqfjvgu('.cne2'):
- onfr = anzr[:-5]
- ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
- onfr = anzr
- ryfr:
- envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
- (qve,ynfg) = bf.cngu.fcyvg(onfr)
- cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
- vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
- cne2_rkvfgf = 0
- flf.fgqbhg.syhfu()
- qroht('sfpx: purpxvat %f (%f)\a'
- % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
- vs abg bcg.wbof:
- ap = qb_cnpx(onfr, ynfg)
- pbqr = pbqr be ap
- pbhag += 1
- ryfr:
- juvyr yra(bhgfgnaqvat) >= bcg.wbof:
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- cvq = bf.sbex()
- vs cvq: # cnerag
- bhgfgnaqvat[cvq] = 1
- ryfr: # puvyq
- gel:
- flf.rkvg(qb_cnpx(onfr, ynfg))
- rkprcg Rkprcgvba, r:
- ybt('rkprcgvba: %e\a' % r)
- flf.rkvg(99)
-
-juvyr yra(bhgfgnaqvat):
- (cvq,ap) = bf.jnvg()
- ap >>= 8
- vs cvq va bhgfgnaqvat:
- qry bhgfgnaqvat[cvq]
- pbqr = pbqr be ap
- pbhag += 1
- vs abg bcg.ireobfr:
- cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
- ybt('sfpx qbar. \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
- b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
- qrs __vavg__(frys, fvtahz):
- frys.fvtahz = fvtahz
- Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
- envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
- ubfganzr = rkgen[0]
- neti = rkgen[1:]
- c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
- netif = '\0'.wbva(['ohc'] + neti)
- c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
- c.fgqva.syhfu()
-
- znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
- fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
- c.fgqva.pybfr()
- c.fgqbhg.pybfr()
-
-svanyyl:
- juvyr 1:
- # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
- # va pnfr bhe puvyq qbrfa'g qvr.
- gel:
- erg = c.jnvg()
- fc.jnvg()
- oernx
- rkprcg FvtRkprcgvba, r:
- ybt('\aohc eonpxhc: %f\a' % r)
- bf.xvyy(c.cvq, r.fvtahz)
- erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
- y = e.fcyvg(nyy, 1)
- vs yra(y) <= 1:
- gel:
- o = bf.ernq(flf.fgqva.svyrab(), 4096)
- rkprcg XrlobneqVagreehcg:
- oernx
- vs abg o:
- oernx
- nyy += o
- ryfr:
- nffreg(yra(y) == 3)
- (yvar, fcyvgpune, nyy) = y
- #fcyvgpune = '\a'
- flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
- vs fcyvgpune == '\e':
- ynfgyra = yra(yvar)
- ryfr:
- ynfgyra = 0
- flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
- flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
- b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
- vs v == ynfg:
- pbagvahr
- #nffreg(fge(v) >= ynfg)
- cz = _unfufcyvg.ovgzngpu(ynfg, v)
- ybatzngpu = znk(ybatzngpu, cz)
- ynfg = v
-cevag ybatzngpu
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-import grp
-import pwd
-import sys
-
-def usage():
- print("Usage: unknown-owner (--user | --group)", file=sys.stderr)
-
-if len(sys.argv) != 2:
- usage()
- sys.exit(1)
-
-if sys.argv[1] == '--user':
- max_name_len = max([len(x.pw_name) for x in pwd.getpwall()])
-elif sys.argv[1] == '--group':
- max_name_len = max([len(x.gr_name) for x in grp.getgrall()])
-else:
- usage()
- sys.exit(1)
-
-print('x' * (max_name_len + 1))
--- /dev/null
+../../dev/sort-z
\ No newline at end of file
--- /dev/null
+
+from subprocess import CalledProcessError
+import pytest, subprocess, sys
+
+from bup.compat import fsdecode
+from bup.io import byte_stream
+
+# Handle all test-* files as wvtest protocol subprocesses
+# cf. https://docs.pytest.org/en/latest/example/nonpython.html
+
+class BupSubprocFailure(Exception):
+ def __init__(self, msg, cmd, status, failures):
+ super(BupSubprocFailure, self).__init__(msg)
+ self.cmd = cmd
+ self.status = status
+ self.failures = failures
+
+class BupSubprocTestRunner(pytest.Item):
+
+ def __init__(self, name, parent):
+ super(BupSubprocTestRunner, self).__init__(name, parent)
+
+ def runtest(self):
+ cmd = str(self.fspath)
+ p = subprocess.Popen(cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ out = p.communicate()[0]
+ sys.stdout.flush()
+ byte_stream(sys.stdout).write(out)
+ failures = [line for line in out.splitlines()
+ if (line.startswith(b'!')
+ and line.lower().endswith(b' failed'))]
+ if failures or p.returncode != 0:
+ raise BupSubprocFailure('%s failed (exit %d, %d failures)'
+ % (cmd, p.returncode, len(failures)),
+ cmd, p.returncode, failures)
+
+ def repr_failure(self, excinfo):
+ ex = excinfo.value
+ if isinstance(ex, BupSubprocFailure):
+ msg = ['Exit status: %d' % ex.status,
+ 'Failures:']
+ msg.extend(fsdecode(s) for s in ex.failures)
+ return '\n'.join(msg)
+
+ def reportinfo(self):
+ # This does not appear to be documented, but is in the
+ # example, and sets the final report header line (at least)
+ # for failures.
+ test_name = str(self.fspath)
+ linenum = None
+ return self.fspath, linenum, test_name
+
+class BupSubprocTestFile(pytest.File):
+ def collect(self):
+ name = self.fspath.basename
+ # name='' because there's only one test: running the command.
+ # i.e there are no sub-tests. Otherwise the status messages
+ # duplicate the test name like this:
+ # test/ext/test-cat-file.sh::test-cat-file.sh PASSED ...
+ try:
+ yield BupSubprocTestRunner.from_parent(self, name='')
+ except AttributeError:
+ yield BupSubprocTestRunner('', self)
+
+def pytest_collect_file(parent, path):
+ base = path.basename
+ if base.startswith('test-') and not base.endswith('~'):
+ try:
+ item = BupSubprocTestFile.from_parent(parent, fspath=path)
+ except AttributeError:
+ item = BupSubprocTestFile(path, parent)
+ if base == 'test-release-archive':
+ item.add_marker(pytest.mark.release)
+ return item
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "cat-file"
+WVPASS mkdir src
+WVPASS date > src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup cat-file "src/latest/$(pwd)/src/foo" > cat-foo
+WVPASS diff -u src/foo cat-foo
+
+WVSTART "cat-file --meta"
+WVPASS bup meta --create --no-paths src/foo > src-foo.meta
+WVPASS bup cat-file --meta "src/latest/$(pwd)/src/foo" > cat-foo.meta
+
+WVPASS bup meta -tvvf src-foo.meta | WVPASS grep -vE '^atime: ' > src-foo.list
+WVPASS bup meta -tvvf cat-foo.meta | WVPASS grep -vE '^atime: ' > cat-foo.list
+WVPASS diff -u src-foo.list cat-foo.list
+
+WVSTART "cat-file --bupm"
+WVPASS bup cat-file --bupm "src/latest/$(pwd)/src/" > bup-cat-bupm
+src_hash=$(WVPASS bup ls -s "src/latest/$(pwd)" | cut -d' ' -f 1) || exit $?
+bupm_hash=$(WVPASS git ls-tree "$src_hash" | grep -F .bupm | cut -d' ' -f 3) \
+ || exit $?
+bupm_hash=$(WVPASS echo "$bupm_hash" | cut -d' ' -f 1) || exit $?
+WVPASS "$top/dev/git-cat-tree" "$bupm_hash" > git-cat-bupm
+if ! cmp git-cat-bupm bup-cat-bupm; then
+ cmp -l git-cat-bupm bup-cat-bupm
+ diff -uN <(bup meta -tvvf git-cat-bupm) <(bup meta -tvvf bup-cat-bupm)
+ WVPASS cmp git-cat-bupm bup-cat-bupm
+fi
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+WVSTART 'all'
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir "$tmpdir/foo"
+
+bup index "$tmpdir/foo" &> /dev/null
+index_rc=$?
+WVPASSEQ "$index_rc" "15"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+fs-size() { tar cf - "$@" | wc -c; }
+
+WVSTART "compression"
+WVPASS cd "$tmpdir"
+
+D=compression0.tmp
+WVPASS force-delete "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir $D
+WVPASS bup index "$top/Documentation"
+WVPASS bup save -n compression -0 --strip "$top/Documentation"
+# Some platforms set -A by default when root, so just use it everywhere.
+expected="$(WVPASS ls -A "$top/Documentation" | WVPASS sort)" || exit $?
+actual="$(WVPASS bup ls -A compression/latest/ | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" "$expected"
+compression_0_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
+
+D=compression9.tmp
+WVPASS force-delete "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir $D
+WVPASS bup index "$top/Documentation"
+WVPASS bup save -n compression -9 --strip "$top/Documentation"
+expected="$(ls -A "$top/Documentation" | sort)" || exit $?
+actual="$(bup ls -A compression/latest/ | sort)" || exit $?
+WVPASSEQ "$actual" "$expected"
+compression_9_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$compression_9_size" -lt "$compression_0_size" ]
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# These tests aren't comprehensive, but test-save-restore-excludes.sh
+# exercises some of the same code more thoroughly via index, and
+# --xdev is handled in test-xdev.sh.
+
+WVSTART "drecurse"
+WVPASS bup init
+WVPASS mkdir src src/a src/b
+WVPASS touch src/a/1 src/a/2 src/b/1 src/b/2 src/c
+(cd src && WVPASS ln -s a a-link)
+WVPASSEQ "$(bup drecurse src)" "src/c
+src/b/2
+src/b/1
+src/b/
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude (file)"
+WVPASSEQ "$(bup drecurse --exclude src/b/2 src)" "src/c
+src/b/1
+src/b/
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude (dir)"
+WVPASSEQ "$(bup drecurse --exclude src/b/ src)" "src/c
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude (symlink)"
+WVPASSEQ "$(bup drecurse --exclude src/a-link src)" "src/c
+src/b/2
+src/b/1
+src/b/
+src/a/2
+src/a/1
+src/a/
+src/"
+
+WVSTART "drecurse --exclude (absolute path)"
+WVPASSEQ "$(bup drecurse --exclude src/b/2 "$(pwd)/src")" "$(pwd)/src/c
+$(pwd)/src/b/1
+$(pwd)/src/b/
+$(pwd)/src/a/2
+$(pwd)/src/a/1
+$(pwd)/src/a/
+$(pwd)/src/a-link
+$(pwd)/src/"
+
+WVSTART "drecurse --exclude-from"
+WVPASS echo "src/b" > exclude-list
+WVPASSEQ "$(bup drecurse --exclude-from exclude-list src)" "src/c
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude-rx (trivial)"
+WVPASSEQ "$(bup drecurse --exclude-rx '^src/b' src)" "src/c
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude-rx (trivial - absolute path)"
+WVPASSEQ "$(bup drecurse --exclude-rx "^$(pwd)/src/b" "$(pwd)/src")" \
+"$(pwd)/src/c
+$(pwd)/src/a/2
+$(pwd)/src/a/1
+$(pwd)/src/a/
+$(pwd)/src/a-link
+$(pwd)/src/"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS "$top/dev/sync-tree" "$top/test/sampledata/" "$tmpdir/src/"
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "fsck"
+
+WVPASS bup index src
+WVPASS bup save -n fsck-test src/b2
+WVPASS bup save -n fsck-test src/var/cmd
+WVPASS bup save -n fsck-test src/var/doc
+WVPASS bup save -n fsck-test src/var/lib
+WVPASS bup save -n fsck-test src/y
+WVPASS bup fsck
+WVPASS bup fsck "$BUP_DIR"/objects/pack/pack-*.pack
+WVPASS bup fsck --quick
+if bup fsck --par2-ok; then
+ WVSTART "fsck (par2)"
+else
+ WVSTART "fsck (PAR2 IS MISSING)"
+fi
+WVPASS bup fsck -g
+WVPASS bup fsck -r
+WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1 -S0
+WVFAIL bup fsck --quick
+WVFAIL bup fsck --quick --disable-par2
+WVPASS chmod u+w "$BUP_DIR"/objects/pack/*.idx
+WVPASS bup damage "$BUP_DIR"/objects/pack/*.idx -n10 -s1 -S0
+WVFAIL bup fsck --quick -j4
+WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1024 --percent 0.4 -S0
+WVFAIL bup fsck --quick
+WVFAIL bup fsck --quick -rvv -j99 # fails because repairs were needed
+if bup fsck --par2-ok; then
+ WVPASS bup fsck -r # ok because of repairs from last time
+ WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n202 -s1 --equal -S0
+ WVFAIL bup fsck
+ WVFAIL bup fsck -rvv # too many errors to be repairable
+ WVFAIL bup fsck -r # too many errors to be repairable
+else
+ WVFAIL bup fsck --quick -r # still fails because par2 was missing
+fi
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+unset BLOCKSIZE BLOCK_SIZE DF_BLOCK_SIZE
+
+root_status="$(dev/root-status)" || exit $?
+
+if ! bup-python -c 'import fuse' 2> /dev/null; then
+ WVSTART 'unable to import fuse; skipping test'
+ exit 0
+fi
+
+if test -n "$(type -p modprobe)" && ! modprobe fuse; then
+ echo 'Unable to load fuse module; skipping dependent tests.' 1>&2
+ exit 0
+fi
+
+if ! fusermount -V; then
+ echo 'skipping FUSE tests: fusermount does not appear to work'
+ exit 0
+fi
+
+if ! groups | grep -q fuse && test "$root_status" != root; then
+ echo 'skipping FUSE tests: you are not root and not in the fuse group'
+ exit 0
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+# Some versions of bash's printf don't support the relevant date expansion.
+savename()
+{
+ readonly secs="$1"
+ WVPASS bup-cfg-py -c "from time import strftime, localtime; \
+ print(strftime('%Y-%m-%d-%H%M%S', localtime($secs)))"
+}
+
+export TZ=UTC
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+savestamp1=$(WVPASS bup-cfg-py -c 'import time; print(int(time.time()))') || exit $?
+savestamp2=$(($savestamp1 + 1))
+
+savename1="$(savename "$savestamp1")" || exit $?
+savename2="$(savename "$savestamp2")" || exit $?
+
+WVPASS mkdir src
+WVPASS echo content > src/foo
+WVPASS chmod 644 src/foo
+WVPASS touch -t 201111111111 src/foo
+# FUSE, python-fuse, something, can't handle negative epoch times.
+# Use pre-epoch to make sure bup properly "bottoms out" at 0 for now.
+WVPASS echo content > src/pre-epoch
+WVPASS chmod 644 src/pre-epoch
+WVPASS touch -t 196907202018 src/pre-epoch
+WVPASS bup index src
+WVPASS bup save -n src -d "$savestamp1" --strip src
+
+WVSTART "basics"
+WVPASS mkdir mnt
+WVPASS bup fuse mnt
+
+result=$(WVPASS ls mnt) || exit $?
+WVPASSEQ src "$result"
+
+result=$(WVPASS ls mnt/src) || exit $?
+WVPASSEQ "$result" "$savename1
+latest"
+
+result=$(WVPASS ls mnt/src/latest) || exit $?
+WVPASSEQ "$result" "foo
+pre-epoch"
+
+result=$(WVPASS cat mnt/src/latest/foo) || exit $?
+WVPASSEQ "$result" "content"
+
+# Right now we don't detect new saves.
+WVPASS bup save -n src -d "$savestamp2" --strip src
+result=$(WVPASS ls mnt/src) || exit $?
+WVPASSEQ "$result" "$savename1
+latest"
+
+WVPASS fusermount -uz mnt
+
+WVSTART "extended metadata"
+WVPASS bup fuse --meta mnt
+readonly user=$(WVPASS id -un) || $?
+readonly group=$(WVPASS id -gn) || $?
+result="$(stat --format='%A %U %G %x' mnt/src/latest/foo)"
+WVPASSEQ "$result" "-rw-r--r-- $user $group 2011-11-11 11:11:00.000000000 +0000"
+result="$(stat --format='%A %U %G %x' mnt/src/latest/pre-epoch)"
+WVPASSEQ "$result" "-rw-r--r-- $user $group 1970-01-01 00:00:00.000000000 +0000"
+
+WVPASS fusermount -uz mnt
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+GC_OPTS=--unsafe
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+data-size() { "$top/dev/data-size" "$@"; }
+
+WVPASS cd "$tmpdir"
+WVPASS bup init
+
+
+WVSTART "gc (unchanged repo)"
+
+WVPASS mkdir src-1
+WVPASS bup random 1k > src-1/1
+WVPASS bup index src-1
+WVPASS bup save --strip -n src-1 src-1
+
+WVPASS bup gc $GC_OPTS -v
+
+WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
+WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (unchanged, new branch)"
+
+WVPASS mkdir src-2
+WVPASS bup random 10M > src-2/1
+WVPASS bup index src-2
+WVPASS bup save --strip -n src-2 src-2
+
+WVPASS bup gc $GC_OPTS -v
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
+WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-2/latest
+WVPASS compare-trees src-2/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (removed branch)"
+
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
+WVPASS rm "$BUP_DIR/refs/heads/src-2"
+WVPASS bup gc $GC_OPTS -v
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 50000 ]
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
+WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup restore -C "$tmpdir/restore" /src-2/latest
+
+
+WVPASS mkdir src-ab-clean src-ab-clean/a src-ab-clean/b
+WVPASS bup random 1k > src-ab-clean/a/1
+WVPASS bup random 10M > src-ab-clean/b/1
+
+
+WVSTART "gc (rewriting)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src-ab
+WVPASS cp -pPR src-ab-clean src-ab
+
+WVPASS bup index src-ab
+WVPASS bup save --strip -n src-ab src-ab
+WVPASS bup index --clear
+WVPASS bup index src-ab
+WVPASS bup save -vvv --strip -n a src-ab/a
+
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
+WVPASS rm "$BUP_DIR/refs/heads/src-ab"
+WVPASS bup gc $GC_OPTS -v
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /a/latest
+WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
+
+
+WVSTART "gc (save -r after repo rewriting)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS bup -d bup-remote init
+WVPASS rm -rf src-ab
+WVPASS cp -pPR src-ab-clean src-ab
+
+WVPASS bup index src-ab
+WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
+WVPASS bup index --clear
+WVPASS bup index src-ab
+WVPASS bup save -r :bup-remote -vvv --strip -n a src-ab/a
+
+size_before=$(WVPASS data-size bup-remote) || exit $?
+WVPASS rm bup-remote/refs/heads/src-ab
+WVPASS bup -d bup-remote gc $GC_OPTS -v
+size_after=$(WVPASS data-size bup-remote) || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
+
+WVPASS rm -rf "$tmpdir/restore"
+WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /a/latest
+WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
+
+# Make sure a post-gc index/save that includes gc-ed data works
+WVPASS bup index src-ab
+WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
+WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (bup on after repo rewriting)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src-ab
+WVPASS cp -pPR src-ab-clean src-ab
+
+WVPASS bup on - index src-ab
+WVPASS bup on - save --strip -n src-ab src-ab
+WVPASS bup index --clear
+WVPASS bup on - index src-ab
+WVPASS bup on - save -vvv --strip -n a src-ab/a
+
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
+WVPASS rm "$BUP_DIR/refs/heads/src-ab"
+WVPASS bup gc $GC_OPTS -v
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /a/latest
+WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
+
+# Make sure a post-gc index/save that includes gc-ed data works
+WVPASS bup on - index src-ab
+WVPASS bup on - save --strip -n src-ab src-ab
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-ab/latest
+WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (threshold)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src && mkdir src
+WVPASS echo 0 > src/0
+WVPASS echo 1 > src/1
+
+WVPASS bup index src
+WVPASS bup save -n src-1 src
+WVPASS rm src/0
+WVPASS bup index src
+WVPASS bup save -n src-2 src
+
+WVPASS bup rm --unsafe src-1
+packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASS bup gc -v $GC_OPTS --threshold 99 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASSEQ 0 "$(grep -cE '^rewriting ' gc.log)"
+WVPASSEQ "$packs_before" "$packs_after"
+
+WVPASS bup gc -v $GC_OPTS --threshold 1 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
+
+# Check that only one pack was rewritten
+
+# Accommodate some systems that apparently used to change the default
+# ls sort order which must match LC_COLLATE for comm to work.
+packs_before="$(sort <(echo "$packs_before"))" || die $?
+packs_after="$(sort <(echo "$packs_after"))" || die $?
+
+only_in_before="$(comm -2 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
+ || die $?
+
+only_in_after="$(comm -1 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
+ || die $?
+
+in_both="$(comm -1 -2 <(echo "$packs_before") <(echo "$packs_after"))" || die $?
+
+WVPASSEQ 1 $(echo "$only_in_before" | wc -l)
+WVPASSEQ 1 $(echo "$only_in_after" | wc -l)
+WVPASSEQ 1 $(echo "$in_both" | wc -l)
+
+WVSTART "gc (threshold 0)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src && mkdir src
+WVPASS echo 0 > src/0
+WVPASS echo 1 > src/1
+
+WVPASS bup index src
+WVPASS bup save -n src-1 src
+
+packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASS bup gc -v $GC_OPTS --threshold 0 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+# Check that the pack was rewritten, but not removed (since the
+# result-pack is equal to the source pack)
+WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
+WVPASSEQ "$packs_before" "$packs_after"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+# FIXME: send help to stdout if requested (exit 0), stderr on error
+# (exit nonzero)
+
+bup -?
+rc=$?
+WVPASSEQ 99 "$rc"
+
+bup --help
+rc=$?
+WVPASSEQ 99 "$rc"
+
+if ! test -e Documentation/bup-save.1; then
+ WVPASS rm -rf "$tmpdir"
+ exit 0
+fi
+
+mkdir -p "$tmpdir/man"
+(cd "$tmpdir/man" && ln -s "$top/Documentation" man1)
+export MANPATH="$tmpdir/man"
+
+WVPASS bup help save
+WVPASS bup save --help
+WVPASSEQ 1 $(bup help save | head -1 | grep -cF 'bup-save(1)')
+WVPASSEQ 1 $(bup save --help | head -1 | grep -cF 'bup-save(1)')
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+if ! [ "$(type -p duplicity)" != "" ]; then
+ # FIXME: add WVSKIP.
+ echo "Cannot find duplicity; skipping test)" 1>&2
+ exit 0
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+bup() { "$top/bup" "$@"; }
+dup() { duplicity --archive-dir "$tmpdir/dup-cache" "$@"; }
+
+WVSTART "import-duplicity"
+WVPASS "$top/dev/sync-tree" "$top/test/sampledata/" "$tmpdir/src/"
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+export PASSPHRASE=bup_duplicity_passphrase
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+WVPASS mkdir duplicity
+WVPASS dup src file://duplicity
+WVPASS bup tick
+WVPASS touch src/new-file
+WVPASS dup src file://duplicity
+WVPASS bup import-duplicity "file://duplicity" import-duplicity
+WVPASSEQ $(bup ls import-duplicity/ | wc -l) 3
+WVPASSEQ "$(bup ls import-duplicity/latest/ | sort)" "$(ls src | sort)"
+WVPASS bup restore -C restore/ import-duplicity/latest/
+WVFAIL "$top/dev/compare-trees" src/ restore/ > tmp-compare-trees
+WVPASSEQ $(cat tmp-compare-trees | wc -l) 4
+# Note: OS X rsync itemize output is currently only 9 chars, not 11.
+# FreeBSD may output 12 chars instead - accept 9-12
+# Expect something like this (without the leading spaces):
+# .d..t...... ./
+# .L..t...... abs-symlink -> /home/foo/bup/test/sampledata/var/abs-symlink-target
+# .L..t...... b -> a
+# .L..t...... c -> b
+expected_diff_rx='^\.d\.\.t\.{4,7} \./$|^\.L\.\.t\.{4,7} '
+if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
+ echo -n 'tmp-compare-trees: ' 1>&2
+ cat tmp-compare-trees 1>&2
+fi
+WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+if ! [ "$(type -p rdiff-backup)" != "" ]; then
+ # FIXME: add WVSKIP.
+ echo "Cannot find rdiff-backup; skipping test)" 1>&2
+ exit 0
+fi
+
+D=rdiff-backup.tmp
+WVSTART "import-rdiff-backup"
+WVPASS bup init
+WVPASS cd "$tmpdir"
+WVPASS mkdir rdiff-backup
+WVPASS rdiff-backup "$top/lib/cmd" rdiff-backup
+WVPASS bup tick
+WVPASS rdiff-backup "$top/Documentation" rdiff-backup
+WVPASS bup import-rdiff-backup rdiff-backup import-rdiff-backup
+WVPASSEQ $(bup ls import-rdiff-backup/ | wc -l) 3
+WVPASSEQ "$(bup ls -A import-rdiff-backup/latest/ | sort)" \
+ "$(ls -A "$top/Documentation" | sort)"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVPASS bup init
+
+WVSTART "index"
+D=bupdata.tmp
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVFAIL bup index --exclude-from $D/cannot-exist $D
+WVPASSEQ "$(bup index --check -p)" ""
+WVPASSEQ "$(bup index --check -p $D)" ""
+WVFAIL [ -e $D.fake ]
+WVFAIL bup index --check -u $D.fake
+WVPASS bup index --check -u $D
+WVPASSEQ "$(bup index --check -p $D)" "$D/"
+WVPASS touch $D/a
+WVPASS bup random 128k >$D/b
+WVPASS mkdir $D/d $D/d/e
+WVPASS bup random 512 >$D/f
+WVPASS ln -s non-existent-file $D/g
+WVPASSEQ "$(bup index -s $D/)" "A $D/"
+WVPASSEQ "$(bup index -s $D/b)" ""
+WVPASSEQ "$(bup index --check -us $D/b)" "A $D/b"
+WVPASSEQ "$(bup index --check -us $D/b $D/d)" \
+"A $D/d/e/
+A $D/d/
+A $D/b"
+WVPASS touch $D/d/z
+WVPASS bup tick
+WVPASSEQ "$(bup index --check -usx $D)" \
+"A $D/g
+A $D/f
+A $D/d/z
+A $D/d/e/
+A $D/d/
+A $D/b
+A $D/a
+A $D/"
+WVPASSEQ "$(bup index --check -us $D/a $D/b --fake-valid)" \
+" $D/b
+ $D/a"
+WVPASSEQ "$(bup index --check -us $D/a)" " $D/a" # stays unmodified
+WVPASSEQ "$(bup index --check -us $D/d --fake-valid)" \
+" $D/d/z
+ $D/d/e/
+ $D/d/"
+WVPASS touch $D/d/z
+WVPASS bup index -u $D/d/z # becomes modified
+WVPASSEQ "$(bup index -s $D/a $D $D/b)" \
+"A $D/g
+A $D/f
+M $D/d/z
+ $D/d/e/
+M $D/d/
+ $D/b
+ $D/a
+A $D/"
+
+WVPASS bup index -u $D/d/e $D/a --fake-invalid
+WVPASSEQ "$(cd $D && bup index -m .)" \
+"./g
+./f
+./d/z
+./d/e/
+./d/
+./a
+./"
+WVPASSEQ "$(cd $D && bup index -m)" \
+"g
+f
+d/z
+d/e/
+d/
+a
+./"
+WVPASSEQ "$(cd $D && bup index -s .)" "$(cd $D && bup index -s .)"
+
+WVFAIL bup save -t $D/doesnt-exist-filename
+
+WVPASS mv "$BUP_DIR/bupindex" "$BUP_DIR/bi.old"
+WVFAIL bup save -t $D/d/e/fifotest
+WVPASS mkfifo $D/d/e/fifotest
+WVPASS bup index -u $D/d/e/fifotest
+WVPASS bup save -t $D/d/e/fifotest
+WVPASS bup save -t $D/d/e
+WVPASS rm -f $D/d/e/fifotest
+WVPASS bup index -u $D/d/e
+WVFAIL bup save -t $D/d/e/fifotest
+WVPASS mv "$BUP_DIR/bi.old" "$BUP_DIR/bupindex"
+
+WVPASS bup index -u $D/d/e
+WVPASS bup save -t $D/d/e
+WVPASSEQ "$(cd $D && bup index -m)" \
+"g
+f
+d/z
+d/
+a
+./"
+WVPASS bup save -t $D/d
+WVPASS bup index --fake-invalid $D/d/z
+WVPASS bup save -t $D/d/z
+WVPASS bup save -t $D/d/z # test regenerating trees when no files are changed
+WVPASS bup save -t $D/d
+WVPASSEQ "$(cd $D && bup index -m)" \
+"g
+f
+a
+./"
+WVPASS bup save -r ":$BUP_DIR" -n r-test $D
+WVFAIL bup save -r ":$BUP_DIR/fake/path" -n r-test $D
+WVFAIL bup save -r ":$BUP_DIR" -n r-test $D/fake/path
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. ./dev/lib.sh || exit $?
+
+set -o pipefail
+
+root_status="$(dev/root-status)" || exit $?
+
+if [ "$root_status" != root ]; then
+ echo 'Not root: skipping --check-device tests.'
+ exit 0 # FIXME: add WVSKIP.
+fi
+
+if test -n "$(type -p modprobe)" && ! modprobe loop; then
+ echo 'Unable to load loopback module; skipping --check-device test.' 1>&2
+ exit 0
+fi
+
+if test -z "$(type -p losetup)"; then
+ echo 'Unable to find losetup: skipping --check-device tests.' 1>&2
+ exit 0 # FIXME: add WVSKIP.
+fi
+
+if test -z "$(type -p mke2fs)"; then
+ echo 'Unable to find mke2fs: skipping --check-device tests.' 1>&2
+ exit 0 # FIXME: add WVSKIP.
+fi
+
+WVSTART '--check-device'
+
+top="$(pwd)"
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+srcmnt="$(WVPASS wvmkmountpt)" || exit $?
+tmpmnt1="$(WVPASS wvmkmountpt)" || exit $?
+tmpmnt2="$(WVPASS wvmkmountpt)" || exit $?
+
+WVPASS cd "$tmpdir"
+
+WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
+WVPASS mke2fs -F -j -m 0 testfs.img
+WVPASS mount -o loop testfs.img "$tmpmnt1"
+# Hide, so that tests can't create risks.
+WVPASS chown root:root "$tmpmnt1"
+WVPASS chmod 0700 "$tmpmnt1"
+
+# Create trivial content.
+WVPASS date > "$tmpmnt1/foo"
+WVPASS umount "$tmpmnt1"
+
+# Mount twice, so we'll have the same content with different devices.
+WVPASS cp -pP testfs.img testfs2.img
+WVPASS mount -oro,loop testfs.img "$tmpmnt1"
+WVPASS mount -oro,loop testfs2.img "$tmpmnt2"
+
+# Test default behavior: --check-device.
+WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
+WVPASS bup init
+WVPASS bup index --fake-valid "$srcmnt"
+WVPASS umount "$srcmnt"
+WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
+WVPASS bup index "$srcmnt"
+WVPASSEQ "$(bup index --status "$srcmnt")" \
+"M $srcmnt/lost+found/
+M $srcmnt/foo
+M $srcmnt/"
+WVPASS umount "$srcmnt"
+
+WVSTART '--no-check-device'
+WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
+WVPASS bup index --clear
+WVPASS bup index --fake-valid "$srcmnt"
+WVPASS umount "$srcmnt"
+WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
+WVPASS bup index --no-check-device "$srcmnt"
+WVPASS bup index --status "$srcmnt"
+WVPASSEQ "$(bup index --status "$srcmnt")" \
+" $srcmnt/lost+found/
+ $srcmnt/foo
+ $srcmnt/"
+
+WVPASS umount "$srcmnt"
+WVPASS umount "$tmpmnt1"
+WVPASS umount "$tmpmnt2"
+WVPASS rm -r "$tmpmnt1" "$tmpmnt2" "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+
+WVSTART "index --clear"
+WVPASS mkdir src
+WVPASS touch src/foo src/bar
+WVPASS bup index -u src
+WVPASSEQ "$(bup index -p)" "src/foo
+src/bar
+src/
+./"
+WVPASS rm src/foo
+WVPASS bup index --clear
+WVPASS bup index -u src
+expected="$(WVPASS bup index -p)" || exit $?
+WVPASSEQ "$expected" "src/bar
+src/
+./"
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+TOP="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+ "$TOP/bup" "$@"
+}
+
+WVSTART 'bup list-idx'
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+WVPASS mkdir src
+WVPASS bup random 1k > src/data
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx
+hash1="$(WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx)" || exit $?
+hash1="${hash1##* }"
+WVPASS bup list-idx --find "${hash1}" "$BUP_DIR"/objects/pack/*.idx \
+ > list-idx.log || exit $?
+found="$(cat list-idx.log)" || exit $?
+found="${found##* }"
+WVPASSEQ "$found" "$hash1"
+WVPASSEQ "$(wc -l < list-idx.log | tr -d ' ')" 1
+
+WVPASS rm -r "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+if test "$BUP_TEST_REMOTE_REPO"; then
+ ls_cmd_desc='ls -r'
+else
+ ls_cmd_desc='ls'
+fi
+
+bup() { "$top/bup" "$@"; }
+
+bup-ls() {
+ if test "$BUP_TEST_REMOTE_REPO"; then
+ "$top/bup" ls -r "$BUP_DIR" "$@"
+ else
+ "$top/bup" ls "$@"
+ fi
+}
+
+
+export TZ=UTC
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVPASS mkdir src
+WVPASS touch src/.dotfile src/executable
+WVPASS mkfifo src/fifo
+WVPASS "$top"/dev/mksock src/socket
+WVPASS bup random 1k > src/file
+WVPASS chmod u+x src/executable
+WVPASS chmod -R u=rwX,g-rwx,o-rwx .
+WVPASS touch -t 200910032348 src/.dotfile src/*
+(WVPASS cd src; WVPASS ln -s file symlink) || exit $?
+(WVPASS cd src; WVPASS ln -s not-there bad-symlink) || exit $?
+WVPASS touch -t 200910032348 src
+WVPASS touch -t 200910032348 .
+WVPASS bup index src
+# Include two saves to test multiple results per ref from rev_list.
+WVPASS bup save -n src -d 242312159 --strip src
+WVPASS bup save -n src -d 242312160 --strip src
+WVPASS bup tag some-tag src
+
+uid="$(WVPASS id -u)" || exit $?
+gid="$(WVPASS bup-cfg-py -c 'import os; print(os.stat("src").st_gid)')" || exit $?
+user="$(WVPASS id -un)" || exit $?
+group="$(WVPASS bup-cfg-py -c 'import grp, os;
+print(grp.getgrgid(os.stat("src").st_gid)[0])')" || exit $?
+src_commit_hash=$(git log --format=%H -n1 src)
+src_tree_hash=$(git log --format=%T -n1 src)
+
+
+WVSTART "$ls_cmd_desc (short)"
+
+(export BUP_FORCE_TTY=1; WVPASSEQ "$(WVPASS bup-ls | tr -d ' ')" src)
+
+WVPASSEQ "$(WVPASS bup-ls /)" "src"
+
+WVPASSEQ "$(WVPASS bup-ls -A /)" ".tag
+src"
+
+WVPASSEQ "$(WVPASS bup-ls -AF /)" ".tag/
+src/"
+
+WVPASSEQ "$(WVPASS bup-ls -a /)" ".
+..
+.tag
+src"
+
+WVPASSEQ "$(WVPASS bup-ls -aF /)" "./
+../
+.tag/
+src/"
+
+WVPASSEQ "$(WVPASS bup-ls /.tag)" "some-tag"
+
+WVPASSEQ "$(WVPASS bup-ls /src)" \
+"1977-09-05-125559
+1977-09-05-125600
+latest"
+
+WVPASSEQ "$(WVPASS bup-ls src/latest)" "bad-symlink
+executable
+fifo
+file
+socket
+symlink"
+
+WVPASSEQ "$(WVPASS bup-ls -A src/latest)" ".dotfile
+bad-symlink
+executable
+fifo
+file
+socket
+symlink"
+
+WVPASSEQ "$(WVPASS bup-ls -a src/latest)" ".
+..
+.dotfile
+bad-symlink
+executable
+fifo
+file
+socket
+symlink"
+
+WVPASSEQ "$(WVPASS bup-ls -F src/latest)" "bad-symlink@
+executable*
+fifo|
+file
+socket=
+symlink@"
+
+WVPASSEQ "$(WVPASS bup-ls --file-type src/latest)" "bad-symlink@
+executable
+fifo|
+file
+socket=
+symlink@"
+
+WVPASSEQ "$(WVPASS bup-ls -d src/latest)" "src/latest"
+
+
+WVSTART "$ls_cmd_desc (long)"
+
+WVPASSEQ "$(WVPASS bup-ls -l / | tr -s ' ' ' ')" \
+"drwx------ $user/$group 0 2009-10-03 23:48 src"
+
+WVPASSEQ "$(WVPASS bup-ls -lA / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
+drwx------ $user/$group 0 2009-10-03 23:48 src"
+
+WVPASSEQ "$(WVPASS bup-ls -lAF / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
+drwx------ $user/$group 0 2009-10-03 23:48 src/"
+
+WVPASSEQ "$(WVPASS bup-ls -la / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 .
+drwxr-xr-x ?/? 0 1970-01-01 00:00 ..
+drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
+drwx------ $user/$group 0 2009-10-03 23:48 src"
+
+WVPASSEQ "$(WVPASS bup-ls -laF / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 ./
+drwxr-xr-x ?/? 0 1970-01-01 00:00 ../
+drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
+drwx------ $user/$group 0 2009-10-03 23:48 src/"
+
+socket_mode="$(WVPASS ls -l src/socket | cut -b -10)" || exit $?
+
+
+bad_symlink_mode="$(WVPASS ls -l src/bad-symlink | cut -b -10)" || exit $?
+
+bad_symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep bad-symlink)" \
+ || exit $?
+bad_symlink_date="$(WVPASS echo "$bad_symlink_bup_info" \
+ | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
+ || exit $?
+
+test "$bad_symlink_date" || exit 1
+
+if test "$(uname -s)" != NetBSD; then
+ bad_symlink_size="$(WVPASS bup-cfg-py -c "import os
+print(os.lstat('src/bad-symlink').st_size)")" || exit $?
+else
+ # NetBSD appears to return varying sizes, so for now, just ignore it.
+ bad_symlink_size="$(WVPASS echo "$bad_symlink_bup_info" \
+ | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
+ || exit $?
+fi
+
+
+symlink_mode="$(WVPASS ls -l src/symlink | cut -b -10)" || exit $?
+
+symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep -E '[^-]symlink')" \
+ || exit $?
+symlink_date="$(WVPASS echo "$symlink_bup_info" \
+ | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
+ || exit $?
+
+test "$symlink_date" || exit 1
+
+if test "$(uname -s)" != NetBSD; then
+ symlink_size="$(WVPASS bup-cfg-py -c "import os
+print(os.lstat('src/symlink').st_size)")" || exit $?
+else
+ # NetBSD appears to return varying sizes, so for now, just ignore it.
+ symlink_size="$(WVPASS echo "$symlink_bup_info" \
+ | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
+ || exit $?
+fi
+
+WVPASSEQ "$(bup-ls -l src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket
+$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -la src/latest | tr -s ' ' ' ')" \
+"drwx------ $user/$group 0 2009-10-03 23:48 .
+drwx------ $user/$group 0 2009-10-03 23:48 ..
+-rw------- $user/$group 0 2009-10-03 23:48 .dotfile
+$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket
+$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -lA src/latest | tr -s ' ' ' ')" \
+"-rw------- $user/$group 0 2009-10-03 23:48 .dotfile
+$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket
+$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -lF src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable*
+prw------- $user/$group 0 2009-10-03 23:48 fifo|
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket=
+$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
+
+WVPASSEQ "$(bup-ls -l --file-type src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo|
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket=
+$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
+
+WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $uid/$gid 0 2009-10-03 23:48 executable
+prw------- $uid/$gid 0 2009-10-03 23:48 fifo
+-rw------- $uid/$gid 1024 2009-10-03 23:48 file
+$socket_mode $uid/$gid 0 2009-10-03 23:48 socket
+$symlink_mode $uid/$gid $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -ld "src/latest" | tr -s ' ' ' ')" \
+"lrwxr-xr-x ?/? 17 1970-01-01 00:00 src/latest -> 1977-09-05-125600"
+
+
+WVSTART "$ls_cmd_desc (backup set - long)"
+WVPASSEQ "$(bup-ls -l --numeric-ids src | cut -d' ' -f 1-2)" \
+"drwx------ $uid/$gid
+drwx------ $uid/$gid
+lrwxr-xr-x ?/?"
+
+WVPASSEQ "$(bup-ls -ds "src/1977-09-05-125600" | tr -s ' ' ' ')" \
+"$src_tree_hash src/1977-09-05-125600"
+
+WVPASSEQ "$(bup-ls -ds --commit-hash "src/1977-09-05-125600" | tr -s ' ' ' ')" \
+"$src_commit_hash src/1977-09-05-125600"
+
+
+WVSTART "$ls_cmd_desc (dates TZ != UTC)"
+export TZ=America/Chicago
+bad_symlink_date_central="$(bup-ls -l src/latest | grep bad-symlink)"
+bad_symlink_date_central="$(echo "$bad_symlink_date_central" \
+ | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
+symlink_date_central="$(bup-ls -l src/latest | grep -E '[^-]symlink')"
+symlink_date_central="$(echo "$symlink_date_central" \
+ | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
+WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date_central bad-symlink -> not-there
+-rwx------ $uid/$gid 0 2009-10-03 18:48 executable
+prw------- $uid/$gid 0 2009-10-03 18:48 fifo
+-rw------- $uid/$gid 1024 2009-10-03 18:48 file
+$socket_mode $uid/$gid 0 2009-10-03 18:48 socket
+$symlink_mode $uid/$gid $symlink_size $symlink_date_central symlink -> file"
+export TZ=UTC
+
+
+WVSTART "$ls_cmd_desc bad-symlink"
+WVPASSEQ "$(bup-ls "src/latest/bad-symlink")" "src/latest/bad-symlink"
+
+WVSTART "$ls_cmd_desc -l bad-symlink"
+WVPASSEQ "$(bup-ls -l src/latest/bad-symlink | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date src/latest/bad-symlink -> not-there"
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+
+BUP_TEST_REMOTE_REPO=t test/ext/test-ls
--- /dev/null
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+TOP="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+ "$TOP/bup" "$@"
+}
+
+WVSTART 'main'
+
+bup
+rc=$?
+WVPASSEQ "$rc" 99
+
+WVPASS rm -r "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+root_status="$(dev/root-status)" || exit $?
+
+TOP="$(WVPASS pwd)" || exit $?
+export PATH="$TOP/test/bin:$PATH"
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+# Assume that mvmktempdir will always use the same dir.
+timestamp_resolutions="$(dev/ns-timestamp-resolutions "$tmpdir/canary")" \
+ || exit $?
+atime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 1)" \
+ || exit $?
+mtime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 2)" \
+ || exit $?
+WVPASS rm "$tmpdir/canary"
+
+bup()
+{
+ "$TOP/bup" "$@"
+}
+
+hardlink-sets()
+{
+ "$TOP/dev/hardlink-sets" "$@"
+}
+
+id-other-than()
+{
+ "$TOP/dev/id-other-than" "$@"
+}
+
+# Very simple metadata tests -- create a test tree then check that bup
+# meta can reproduce the metadata correctly (according to bup xstat)
+# via create, extract, start-extract, and finish-extract. The current
+# tests are crude, and this does not fully test devices, varying
+# users/groups, acls, attrs, etc.
+
+genstat()
+{
+ (
+ export PATH="$TOP/bin:$PATH" # pick up bup
+ bup version
+ # Skip atime (test elsewhere) to avoid the observer effect.
+ WVPASS find . -print0 | WVPASS sort-z \
+ | WVPASS xargs -0 bup xstat \
+ --mtime-resolution "$mtime_resolution"ns \
+ --exclude-fields ctime,atime,size
+ )
+}
+
+test-src-create-extract()
+{
+ # Test bup meta create/extract for ./src -> ./src-restore.
+ # Also writes to ./src-stat and ./src-restore-stat.
+ (
+ (WVPASS cd src; WVPASS genstat) > src-stat || exit $?
+ WVPASS bup meta --create --recurse --file src.meta src
+ # Test extract.
+ WVPASS force-delete src-restore
+ WVPASS mkdir src-restore
+ WVPASS cd src-restore
+ WVPASS bup meta --extract --file ../src.meta
+ WVPASS test -d src
+ (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
+ WVPASS diff -U5 ../src-stat ../src-restore-stat
+ # Test start/finish extract.
+ WVPASS force-delete src
+ WVPASS bup meta --start-extract --file ../src.meta
+ WVPASS test -d src
+ WVPASS bup meta --finish-extract --file ../src.meta
+ (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
+ WVPASS diff -U5 ../src-stat ../src-restore-stat
+ )
+}
+
+test-src-save-restore()
+{
+ # Test bup save/restore metadata for ./src -> ./src-restore. Also
+ # writes to BUP_DIR. Note that for now this just tests the
+ # restore below src/, in order to avoid having to worry about
+ # operations that require root (like chown /home).
+ (
+ WVPASS rm -rf "$BUP_DIR"
+ WVPASS bup init
+ WVPASS bup index src
+ WVPASS bup save -t -n src src
+ # Test extract.
+ WVPASS force-delete src-restore
+ WVPASS mkdir src-restore
+ WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+ WVPASS test -d src-restore/src
+ WVPASS "$TOP/dev/compare-trees" -c src/ src-restore/src/
+ WVPASS rm -rf src.bup
+ )
+}
+
+setup-test-tree()
+{
+ WVPASS "$TOP/dev/sync-tree" "$TOP/test/sampledata/" "$tmpdir/src/"
+
+ # Add some hard links for the general tests.
+ (
+ WVPASS cd "$tmpdir"/src
+ WVPASS touch hardlink-target
+ WVPASS ln hardlink-target hardlink-1
+ WVPASS ln hardlink-target hardlink-2
+ WVPASS ln hardlink-target hardlink-3
+ ) || exit $?
+
+ # Add some trivial files for the index, modify, save tests.
+ (
+ WVPASS cd "$tmpdir"/src
+ WVPASS mkdir volatile
+ WVPASS touch volatile/{1,2,3}
+ ) || exit $?
+
+ # Regression test for metadata sort order. Previously, these two
+ # entries would sort in the wrong order because the metadata
+ # entries were being sorted by mangled name, but the index isn't.
+ WVPASS dd if=/dev/zero of="$tmpdir"/src/foo bs=1k count=33
+ WVPASS touch -t 201111111111 "$tmpdir"/src/foo
+ WVPASS touch -t 201112121111 "$tmpdir"/src/foo-bar
+
+ dev/mksock "$tmpdir"/src/test-socket || true
+}
+
+# Use the test tree to check bup meta.
+WVSTART 'meta --create/--extract'
+(
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ export BUP_DIR="$tmpdir/bup"
+ WVPASS setup-test-tree
+ WVPASS cd "$tmpdir"
+ WVPASS test-src-create-extract
+
+ # Test a top-level file (not dir).
+ WVPASS touch src-file
+ WVPASS bup meta -cf src-file.meta src-file
+ WVPASS mkdir dest
+ WVPASS cd dest
+ WVPASS bup meta -xf ../src-file.meta
+ WVPASS rm -r "$tmpdir"
+) || exit $?
+
+# Use the test tree to check bup save/restore metadata.
+WVSTART 'metadata save/restore (general)'
+(
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ export BUP_DIR="$tmpdir/bup"
+ WVPASS setup-test-tree
+ WVPASS cd "$tmpdir"
+ WVPASS test-src-save-restore
+
+ # Test a deeper subdir/ to make sure top-level non-dir metadata is
+ # restored correctly. We need at least one dir and one non-dir at
+ # the "top-level".
+ WVPASS test -d src/var/cmd
+ WVPASS test -f src/var/cmd/save-cmd.py
+ WVPASS rm -rf "$BUP_DIR"
+ WVPASS bup init
+ WVPASS touch -t 201111111111 src-restore # Make sure the top won't match.
+ WVPASS bup index src
+ WVPASS bup save -t -n src src
+ WVPASS force-delete src-restore
+ WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/var/."
+ WVPASS touch -t 201211111111 src-restore # Make sure the top won't match.
+ # Check that the only difference is the top dir.
+ WVFAIL $TOP/dev/compare-trees -c src/var/ src-restore/ > tmp-compare-trees
+ WVPASSEQ $(cat tmp-compare-trees | wc -l) 1
+ # The number of rsync status characters varies, so accept any
+ # number of trailing dots. For example OS X native rsync produces
+ # 9, but Homebrew's produces 12, while on other platforms, 11 is
+ # common.
+ expected_diff_rx='^\.d\.\.t\.\.\.(\.)+ \./$'
+ if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
+ echo -n 'tmp-compare-trees: ' 1>&2
+ cat tmp-compare-trees 1>&2
+ fi
+ WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
+ WVPASS rm -r "$tmpdir"
+) || exit $?
+
+# Test that we pull the index (not filesystem) metadata for any
+# unchanged files whenever we're saving other files in a given
+# directory.
+WVSTART 'metadata save/restore (using index metadata)'
+(
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ export BUP_DIR="$tmpdir/bup"
+ WVPASS setup-test-tree
+ WVPASS cd "$tmpdir"
+
+ # ...for now -- might be a problem with hardlink restores that was
+ # causing noise wrt this test.
+ WVPASS rm -rf src/hardlink*
+
+ # Pause here to keep the filesystem changes far enough away from
+ # the first index run that bup won't cap their index timestamps
+ # (see "bup help index" for more information). Without this
+ # sleep, the compare-trees test below "Bup should *not* pick up
+ # these metadata..." may fail.
+ WVPASS sleep 1
+
+ WVPASS rm -rf "$BUP_DIR"
+ WVPASS bup init
+ WVPASS bup index src
+ WVPASS bup save -t -n src src
+
+ WVPASS force-delete src-restore-1
+ WVPASS mkdir src-restore-1
+ WVPASS bup restore -C src-restore-1 "/src/latest$(pwd)/"
+ WVPASS test -d src-restore-1/src
+ WVPASS "$TOP/dev/compare-trees" -c src/ src-restore-1/src/
+
+ WVPASS echo "blarg" > src/volatile/1
+ WVPASS cp -pP src/volatile/1 src-restore-1/src/volatile/
+ WVPASS bup index src
+
+ # Bup should *not* pick up these metadata changes.
+ WVPASS touch src/volatile/2
+
+ WVPASS bup save -t -n src src
+
+ WVPASS force-delete src-restore-2
+ WVPASS mkdir src-restore-2
+ WVPASS bup restore -C src-restore-2 "/src/latest$(pwd)/"
+ WVPASS test -d src-restore-2/src
+ WVPASS "$TOP/dev/compare-trees" -c src-restore-1/src/ src-restore-2/src/
+
+ WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+
+setup-hardlink-test()
+{
+ WVPASS rm -rf "$tmpdir/src" "$BUP_DIR"
+ WVPASS bup init
+ WVPASS mkdir "$tmpdir/src"
+}
+
+hardlink-test-run-restore()
+{
+ WVPASS force-delete src-restore
+ WVPASS mkdir src-restore
+ WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+ WVPASS test -d src-restore/src
+}
+
+# Test hardlinks more carefully.
+WVSTART 'metadata save/restore (hardlinks)'
+(
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ export BUP_DIR="$tmpdir/bup"
+
+ WVPASS setup-hardlink-test
+ WVPASS cd "$tmpdir"
+
+ # Test trivial case - single hardlink.
+ (
+ WVPASS cd src
+ WVPASS touch hardlink-target
+ WVPASS ln hardlink-target hardlink-1
+ ) || exit $?
+ WVPASS bup index src
+ WVPASS bup save -t -n src src
+ WVPASS hardlink-test-run-restore
+ WVPASS "$TOP/dev/compare-trees" -c src/ src-restore/src/
+
+ # Test the case where the hardlink hasn't changed, but the tree
+ # needs to be saved again. i.e. the save-cmd.py "if hashvalid:"
+ # case.
+ (
+ WVPASS cd src
+ WVPASS echo whatever > something-new
+ ) || exit $?
+ WVPASS bup index src
+ WVPASS bup save -t -n src src
+ WVPASS hardlink-test-run-restore
+ WVPASS "$TOP/dev/compare-trees" -c src/ src-restore/src/
+
+ # Test hardlink changes between index runs.
+ #
+ WVPASS setup-hardlink-test
+ WVPASS cd src
+ WVPASS touch hardlink-target-a
+ WVPASS touch hardlink-target-b
+ WVPASS ln hardlink-target-a hardlink-b-1
+ WVPASS ln hardlink-target-a hardlink-a-1
+ WVPASS cd ..
+ WVPASS bup index -vv src
+ WVPASS rm src/hardlink-b-1
+ WVPASS ln src/hardlink-target-b src/hardlink-b-1
+ WVPASS bup index -vv src
+ WVPASS bup save -t -n src src
+ WVPASS hardlink-test-run-restore
+ WVPASS echo ./src/hardlink-a-1 > hardlink-sets.expected
+ WVPASS echo ./src/hardlink-target-a >> hardlink-sets.expected
+ WVPASS echo >> hardlink-sets.expected
+ WVPASS echo ./src/hardlink-b-1 >> hardlink-sets.expected
+ WVPASS echo ./src/hardlink-target-b >> hardlink-sets.expected
+ (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+ || exit $?
+ WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+ # Test hardlink changes between index and save -- hardlink set [a
+ # b c d] changes to [a b] [c d]. At least right now bup should
+ # notice and recreate the latter.
+ WVPASS setup-hardlink-test
+ WVPASS cd "$tmpdir"/src
+ WVPASS touch a
+ WVPASS ln a b
+ WVPASS ln a c
+ WVPASS ln a d
+ WVPASS cd ..
+ WVPASS bup index -vv src
+ WVPASS rm src/c src/d
+ WVPASS touch src/c
+ WVPASS ln src/c src/d
+ WVPASS bup save -t -n src src
+ WVPASS hardlink-test-run-restore
+ WVPASS echo ./src/a > hardlink-sets.expected
+ WVPASS echo ./src/b >> hardlink-sets.expected
+ WVPASS echo >> hardlink-sets.expected
+ WVPASS echo ./src/c >> hardlink-sets.expected
+ WVPASS echo ./src/d >> hardlink-sets.expected
+ (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+ || exit $?
+ WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+ # Test that we don't link outside restore tree.
+ WVPASS setup-hardlink-test
+ WVPASS cd "$tmpdir"
+ WVPASS mkdir src/a src/b
+ WVPASS touch src/a/1
+ WVPASS ln src/a/1 src/b/1
+ WVPASS bup index -vv src
+ WVPASS bup save -t -n src src
+ WVPASS force-delete src-restore
+ WVPASS mkdir src-restore
+ WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/a/"
+ WVPASS test -e src-restore/1
+ WVPASS echo -n > hardlink-sets.expected
+ (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+ || exit $?
+ WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+ # Test that we do link within separate sub-trees.
+ WVPASS setup-hardlink-test
+ WVPASS cd "$tmpdir"
+ WVPASS mkdir src/a src/b
+ WVPASS touch src/a/1
+ WVPASS ln src/a/1 src/b/1
+ WVPASS bup index -vv src/a src/b
+ WVPASS bup save -t -n src src/a src/b
+ WVPASS hardlink-test-run-restore
+ WVPASS echo ./src/a/1 > hardlink-sets.expected
+ WVPASS echo ./src/b/1 >> hardlink-sets.expected
+ (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+ || exit $?
+ WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+ WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+WVSTART 'meta --edit'
+(
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ WVPASS cd "$tmpdir"
+ WVPASS mkdir src
+
+ WVPASS bup meta -cf src.meta src
+
+ WVPASS bup meta --edit --set-uid 0 src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^uid: 0'
+ WVPASS bup meta --edit --set-uid 1000 src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^uid: 1000'
+
+ WVPASS bup meta --edit --set-gid 0 src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^gid: 0'
+ WVPASS bup meta --edit --set-gid 1000 src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^gid: 1000'
+
+ WVPASS bup meta --edit --set-user foo src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^user: foo'
+ WVPASS bup meta --edit --set-user bar src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^user: bar'
+ WVPASS bup meta --edit --unset-user src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^user:'
+ WVPASS bup meta --edit --set-user bar --unset-user src.meta \
+ | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user:'
+ WVPASS bup meta --edit --unset-user --set-user bar src.meta \
+ | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user: bar'
+
+ WVPASS bup meta --edit --set-group foo src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^group: foo'
+ WVPASS bup meta --edit --set-group bar src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^group: bar'
+ WVPASS bup meta --edit --unset-group src.meta | WVPASS bup meta -tvvf - \
+ | WVPASS grep -qE '^group:'
+ WVPASS bup meta --edit --set-group bar --unset-group src.meta \
+ | WVPASS bup meta -tvvf - | WVPASS grep -qE '^group:'
+ WVPASS bup meta --edit --unset-group --set-group bar src.meta \
+ | WVPASS bup meta -tvvf - | grep -qE '^group: bar'
+
+ WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+WVSTART 'meta --no-recurse'
+(
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ WVPASS cd "$tmpdir"
+ WVPASS mkdir src
+ WVPASS mkdir src/foo
+ WVPASS touch src/foo/{1,2,3}
+ WVPASS bup meta -cf src.meta src
+ WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/
+src/foo/
+src/foo/1
+src/foo/2
+src/foo/3"
+ WVPASS bup meta --no-recurse -cf src.meta src
+ WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/"
+ WVPASS rm -r "$tmpdir"
+) || exit $?
+
+# Test ownership restoration (when not root or fakeroot).
+(
+ if [ "$root_status" != none ]; then
+ exit 0
+ fi
+
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+ # FIXME: binary groups
+ first_group="$(WVPASS bup-cfg-py -c 'import os,grp; \
+ print(grp.getgrgid(os.getgroups()[0])[0])')" || exit $?
+ last_group="$(bup-cfg-py -c 'import os,grp; \
+ print(grp.getgrgid(os.getgroups()[-1])[0])')" || exit $?
+ last_group_erx="$(escape-erx "$last_group")"
+
+ WVSTART 'metadata (restoration of ownership)'
+ WVPASS cd "$tmpdir"
+ WVPASS touch src
+ # Some systems always assign the parent dir group to new paths
+ # (sgid). Make sure the group is one we're in.
+ WVPASS chgrp -R "$first_group" src
+
+ WVPASS bup meta -cf src.meta src
+
+ WVPASS mkdir dest
+ WVPASS cd dest
+ # Make sure we don't change (or try to change) the user when not root.
+ WVPASS bup meta --edit --set-user root ../src.meta | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
+ WVPASS rm -rf src
+ WVPASS bup meta --edit --unset-user --set-uid 0 ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
+
+ # Make sure we can restore one of the user's groups.
+ WVPASS rm -rf src
+ WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qE "^group: $last_group_erx"
+
+ # Make sure we can restore one of the user's gids.
+ user_gids="$(id -G)" || exit $?
+ last_gid="$(echo ${user_gids/* /})" || exit $?
+ WVPASS rm -rf src
+ WVPASS bup meta --edit --unset-group --set-gid "$last_gid" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qE "^gid: $last_gid"
+
+ # Test --numeric-ids (gid).
+ WVPASS rm -rf src
+ current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
+ WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
+ | WVPASS bup meta -x --numeric-ids
+ new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
+ WVPASSEQ "$current_gidx" "$new_gidx"
+
+ # Test that restoring an unknown user works.
+ unknown_user=$("$TOP"/dev/unknown-owner --user) || exit $?
+ WVPASS rm -rf src
+ current_uidx=$(bup meta -tvvf ../src.meta | grep -ae '^uid:') || exit $?
+ WVPASS bup meta --edit --set-user "$unknown_user" ../src.meta \
+ | WVPASS bup meta -x
+ new_uidx=$(bup xstat src | grep -ae '^uid:') || exit $?
+ WVPASSEQ "$current_uidx" "$new_uidx"
+
+ # Test that restoring an unknown group works.
+ unknown_group=$("$TOP"/dev/unknown-owner --group) || exit $?
+ WVPASS rm -rf src
+ current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
+ WVPASS bup meta --edit --set-group "$unknown_group" ../src.meta \
+ | WVPASS bup meta -x
+ new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
+ WVPASSEQ "$current_gidx" "$new_gidx"
+
+ WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+# Test ownership restoration (when root or fakeroot).
+(
+ if [ "$root_status" = none ]; then
+ exit 0
+ fi
+
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+ uid=$(WVPASS id -un) || exit $?
+ gid=$(WVPASS id -gn) || exit $?
+
+ WVSTART 'metadata (restoration of ownership as root)'
+ WVPASS cd "$tmpdir"
+ WVPASS touch src
+ WVPASS chown "$uid:$gid" src # In case the parent dir is sgid, etc.
+ WVPASS bup meta -cf src.meta src
+
+ WVPASS mkdir dest
+ WVPASS chmod 700 dest # so we can't accidentally do something insecure
+ WVPASS cd dest
+
+ other_uinfo="$(id-other-than --user "$uid")" || exit $?
+ other_user="${other_uinfo%%:*}"
+ other_uid="${other_uinfo##*:}"
+
+ other_ginfo="$(id-other-than --group "$gid")" || exit $?
+ other_group="${other_ginfo%%:*}"
+ other_gid="${other_ginfo##*:}"
+
+ # Make sure we can restore a uid (must be in /etc/passwd b/c cygwin).
+ WVPASS bup meta --edit --unset-user --set-uid "$other_uid" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qE "^uid: $other_uid"
+
+ # Make sure we can restore a gid (must be in /etc/group b/c cygwin).
+ WVPASS bup meta --edit --unset-group --set-gid "$other_gid" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qE "^gid: $other_gid"
+
+ other_uinfo2="$(id-other-than --user "$(id -un)" "$other_user")" || exit $?
+ other_user2="${other_uinfo2%%:*}"
+ other_user2_erx="$(escape-erx "$other_user2")" || exit $?
+ other_uid2="${other_uinfo2##*:}"
+
+ other_ginfo2="$(id-other-than --group "$(id -gn)" "$other_group")" || exit $?
+ other_group2="${other_ginfo2%%:*}"
+ other_group2_erx="$(escape-erx "$other_group2")" || exit $?
+ other_gid2="${other_ginfo2##*:}"
+
+ # Try to restore a user (and see that user trumps uid when uid is not 0).
+ WVPASS bup meta --edit \
+ --set-uid "$other_uid" --set-user "$other_user2" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qE "^user: $other_user2_erx"
+
+ # Try to restore a group (and see that group trumps gid when gid is not 0).
+ WVPASS bup meta --edit \
+ --set-gid "$other_gid" --set-group "$other_group2" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qE "^group: $other_group2_erx"
+
+ # Test --numeric-ids (uid). Note the name 'root' is not handled
+ # specially, so we use that here as the test user name. We assume
+ # that the root user's uid is never 42.
+ WVPASS rm -rf src
+ WVPASS bup meta --edit --set-user root --set-uid "$other_uid" ../src.meta \
+ | WVPASS bup meta -x --numeric-ids
+ new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
+ WVPASSEQ "$new_uidx" "uid: $other_uid"
+
+ # Test --numeric-ids (gid). Note the name 'root' is not handled
+ # specially, so we use that here as the test group name. We
+ # assume that the root group's gid is never 42.
+ WVPASS rm -rf src
+ WVPASS bup meta --edit --set-group root --set-gid "$other_gid" ../src.meta \
+ | WVPASS bup meta -x --numeric-ids
+ new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
+ WVPASSEQ "$new_gidx" "gid: $other_gid"
+
+ # Test that restoring an unknown user works.
+ unknown_user=$("$TOP"/dev/unknown-owner --user) || exit $?
+ WVPASS rm -rf src
+ WVPASS bup meta --edit \
+ --set-uid "$other_uid" --set-user "$unknown_user" ../src.meta \
+ | WVPASS bup meta -x
+ new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
+ WVPASSEQ "$new_uidx" "uid: $other_uid"
+
+ # Test that restoring an unknown group works.
+ unknown_group=$("$TOP"/dev/unknown-owner --group) || exit $?
+ WVPASS rm -rf src
+ WVPASS bup meta --edit \
+ --set-gid "$other_gid" --set-group "$unknown_group" ../src.meta \
+ | WVPASS bup meta -x
+ new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
+ WVPASSEQ "$new_gidx" "gid: $other_gid"
+
+ if ! [[ $(uname) =~ CYGWIN ]]; then
+ # For now, skip these on Cygwin because it doesn't allow
+ # restoring an unknown uid/gid.
+
+ # Make sure a uid of 0 trumps a non-root user.
+ WVPASS bup meta --edit --set-user "$other_user2" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qvE "^user: $other_user2_erx"
+ WVPASS bup xstat src | WVPASS grep -qE "^uid: 0"
+
+ # Make sure a gid of 0 trumps a non-root group.
+ WVPASS bup meta --edit --set-group "$other_group2" ../src.meta \
+ | WVPASS bup meta -x
+ WVPASS bup xstat src | WVPASS grep -qvE "^group: $other_group2_erx"
+ WVPASS bup xstat src | WVPASS grep -qE "^gid: 0"
+ fi
+
+ WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+
+# Root-only tests that require an FS with all the trimmings: ACLs,
+# Linux attr, Linux xattr, etc.
+if [ "$root_status" = root ]; then
+ (
+ # Some cleanup handled in universal-cleanup() above.
+ # These tests are only likely to work under Linux for now
+ # (patches welcome).
+ [[ $(uname) =~ Linux ]] || exit 0
+
+ if ! modprobe loop; then
+ echo 'Unable to load loopback module; skipping dependent tests.' 1>&2
+ exit 0
+ fi
+
+ testfs="$(WVPASS wvmkmountpt)" || exit $?
+ testfs_limited="$(WVPASS wvmkmountpt)" || exit $?
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ export BUP_DIR="$tmpdir/bup"
+
+ WVSTART 'meta - general (as root)'
+ WVPASS setup-test-tree
+ WVPASS cd "$tmpdir"
+
+ umount "$testfs"
+ WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
+ # Make sure we have all the options the chattr test needs
+ # (i.e. create a "normal" ext4 filesystem).
+ WVPASS mke2fs -F -m 0 \
+ -I 256 \
+ -O has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize \
+ testfs.img
+ WVPASS mount -o loop,acl,user_xattr testfs.img "$testfs"
+ # Hide, so that tests can't create risks.
+ WVPASS chown root:root "$testfs"
+ WVPASS chmod 0700 "$testfs"
+
+ umount "$testfs_limited"
+ WVPASS dd if=/dev/zero of=testfs-limited.img bs=1M count=32
+ WVPASS mkfs -t vfat testfs-limited.img
+ WVPASS mount -o loop,uid=root,gid=root,umask=0077 \
+ testfs-limited.img "$testfs_limited"
+
+ WVPASS cp -pPR src "$testfs"/src
+ (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+
+ WVSTART 'meta - atime (as root)'
+ WVPASS force-delete "$testfs"/src
+ WVPASS mkdir "$testfs"/src
+ (
+ WVPASS mkdir "$testfs"/src/foo
+ WVPASS touch "$testfs"/src/bar
+ WVPASS bup-python -c "from bup import xstat; \
+ x = xstat.timespec_to_nsecs((42, 0));\
+ xstat.utime(b'$testfs/src/foo', (x, x));\
+ xstat.utime(b'$testfs/src/bar', (x, x));"
+ WVPASS cd "$testfs"
+ WVPASS bup meta -v --create --recurse --file src.meta src
+ WVPASS bup meta -tvf src.meta
+ # Test extract.
+ WVPASS force-delete src-restore
+ WVPASS mkdir src-restore
+ WVPASS cd src-restore
+ WVPASS bup meta --extract --file ../src.meta
+ WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
+ WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
+ # Test start/finish extract.
+ WVPASS force-delete src
+ WVPASS bup meta --start-extract --file ../src.meta
+ WVPASS test -d src
+ WVPASS bup meta --finish-extract --file ../src.meta
+ WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
+ WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
+ ) || exit $?
+
+ WVSTART 'meta - Linux attr (as root)'
+ WVPASS force-delete "$testfs"/src
+ WVPASS mkdir "$testfs"/src
+ (
+ WVPASS touch "$testfs"/src/foo
+ WVPASS mkdir "$testfs"/src/bar
+ WVPASS chattr +acdeijstuADS "$testfs"/src/foo
+ WVPASS chattr +acdeijstuADST "$testfs"/src/bar
+ (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+ # Test restoration to a limited filesystem (vfat).
+ (
+ WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
+ "$testfs"/src
+ WVPASS force-delete "$testfs_limited"/src-restore
+ WVPASS mkdir "$testfs_limited"/src-restore
+ WVPASS cd "$testfs_limited"/src-restore
+ WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
+ | WVPASS grep -e '^Linux chattr:' \
+ | WVPASS bup-cfg-py -c \
+ 'import sys; exit(not len(sys.stdin.readlines()) == 3)'
+ ) || exit $?
+ ) || exit $?
+
+ WVSTART 'meta - Linux xattr (as root)'
+ WVPASS force-delete "$testfs"/src
+ WVPASS mkdir "$testfs"/src
+ WVPASS touch "$testfs"/src/foo
+ WVPASS mkdir "$testfs"/src/bar
+ WVPASS attr -s foo -V bar "$testfs"/src/foo
+ WVPASS attr -s foo -V bar "$testfs"/src/bar
+ (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+
+ # Test restoration to a limited filesystem (vfat).
+ (
+ WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
+ "$testfs"/src
+ WVPASS force-delete "$testfs_limited"/src-restore
+ WVPASS mkdir "$testfs_limited"/src-restore
+ WVPASS cd "$testfs_limited"/src-restore
+ WVFAIL bup meta --extract --file "$testfs"/src.meta
+ WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
+ | WVPASS grep -e "^xattr\.set u\?'" \
+ | WVPASS bup-cfg-py -c \
+ 'import sys; exit(not len(sys.stdin.readlines()) == 2)'
+ ) || exit $?
+
+ WVSTART 'meta - POSIX.1e ACLs (as root)'
+ WVPASS force-delete "$testfs"/src
+ WVPASS mkdir "$testfs"/src
+ WVPASS touch "$testfs"/src/foo
+ WVPASS mkdir "$testfs"/src/bar
+ WVPASS setfacl -m u:root:r "$testfs"/src/foo
+ WVPASS setfacl -m u:root:r "$testfs"/src/bar
+ (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+
+ # Test restoration to a limited filesystem (vfat).
+ (
+ WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
+ "$testfs"/src
+ WVPASS force-delete "$testfs_limited"/src-restore
+ WVPASS mkdir "$testfs_limited"/src-restore
+ WVPASS cd "$testfs_limited"/src-restore
+ WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
+ | WVPASS grep -e '^POSIX1e ACL applyto:' \
+ | WVPASS bup-cfg-py -c \
+ 'import sys; exit(not len(sys.stdin.readlines()) == 2)'
+ ) || exit $?
+
+ WVPASS umount "$testfs"
+ WVPASS umount "$testfs_limited"
+ WVPASS rm -r "$testfs" "$testfs_limited"
+
+ WVPASS rm -r "$tmpdir"
+
+ ) || exit $?
+fi
+
+WVPASS rm -r "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVSTART "init"
+WVPASS bup init
+D=bupdata.tmp
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVPASS touch $D/a
+WVPASS bup random 128k >$D/b
+WVPASS mkdir $D/d $D/d/e
+WVPASS bup random 512 >$D/f
+WVPASS touch $D/d/z
+WVPASS touch $D/d/z
+WVPASS bup index $D
+WVPASS bup save -t $D
+
+
+WVSTART "bloom"
+WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+WVPASS rm "$BUP_DIR"/objects/pack/bup.bloom
+WVPASS bup bloom -k 4
+WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+WVPASS bup bloom -d "$BUP_DIR"/objects/pack --ruin --force
+WVFAIL bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+WVPASS bup bloom --force -k 5
+WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+
+
+WVSTART "memtest"
+WVPASS bup memtest -c1 -n100
+WVPASS bup memtest -c1 -n100 --existing
+
+
+WVSTART "save/git-fsck"
+(
+ WVPASS cd "$BUP_DIR"
+ #git repack -Ad
+ #git prune
+ WVPASS bup random 4k | WVPASS bup split -b
+ (WVPASS cd "$top/test/sampledata" && WVPASS bup save -vvn master /) || exit $?
+ result="$(LC_ALL=C git fsck --full --strict 2>&1)" || exit $?
+ n=$(echo "$result" |
+ WVFAIL egrep -v 'dangling (commit|tree|blob)' |
+ WVPASS tee -a /dev/stderr |
+ WVPASS wc -l) || exit $?
+ WVPASS [ "$n" -eq 0 ]
+) || exit $?
+
+
+WVSTART "ftp"
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/b" >$D/b.new
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f" >$D/f.new
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f"{,} >$D/f2.new
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/a" >$D/a.new
+WVPASSEQ "$(sha1sum <$D/b)" "$(sha1sum <$D/b.new)"
+WVPASSEQ "$(sha1sum <$D/f)" "$(sha1sum <$D/f.new)"
+WVPASSEQ "$(cat $D/f.new{,} | sha1sum)" "$(sha1sum <$D/f2.new)"
+WVPASSEQ "$(sha1sum <$D/a)" "$(sha1sum <$D/a.new)"
+
+
+WVSTART "tag"
+WVFAIL bup tag -d v0.n 2>/dev/null
+WVFAIL bup tag v0.n non-existant 2>/dev/null
+WVPASSEQ "$(bup tag)" ""
+WVPASS bup tag v0.1 master
+WVPASSEQ "$(bup tag)" "v0.1"
+WVFAIL bup tag v0.1 master
+WVPASS bup tag -f v0.1 master
+WVPASS bup tag -d v0.1
+WVPASS bup tag -f -d v0.1
+WVFAIL bup tag -d v0.1
+
+
+WVSTART "indexfile"
+D=indexfile.tmp
+INDEXFILE=tmpindexfile.tmp
+WVPASS rm -f $INDEXFILE
+WVPASS force-delete $D
+WVPASS mkdir $D
+export BUP_DIR="$D/.bup"
+WVPASS bup init
+WVPASS touch $D/a
+WVPASS touch $D/b
+WVPASS mkdir $D/c
+WVPASS bup index -ux $D
+WVPASS bup save --strip -n bupdir $D
+WVPASSEQ "$(bup ls -F bupdir/latest/)" "a
+b
+c/"
+WVPASS bup index -f $INDEXFILE --exclude=$D/c -ux $D
+WVPASS bup save --strip -n indexfile -f $INDEXFILE $D
+WVPASSEQ "$(bup ls indexfile/latest/)" "a
+b"
+
+
+WVSTART "import-rsnapshot"
+D=rsnapshot.tmp
+export BUP_DIR="$tmpdir/$D/.bup"
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVPASS bup init
+WVPASS mkdir -p $D/hourly.0/buptest/a
+WVPASS touch $D/hourly.0/buptest/a/b
+WVPASS mkdir -p $D/hourly.0/buptest/c/d
+WVPASS touch $D/hourly.0/buptest/c/d/e
+WVPASS true
+WVPASS bup import-rsnapshot $D/
+WVPASSEQ "$(bup ls -F buptest/latest/)" "a/
+c/"
+
+
+WVSTART features
+expect_py_ver=$(LC_CTYPE=C "$top/config/bin/python" \
+ -c 'import platform; print(platform.python_version())') \
+ || exit $?
+actual_py_ver=$(bup features | grep Python: | sed -Ee 's/ +Python: //') || exit $?
+WVPASSEQ "$expect_py_ver" "$actual_py_ver"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. ./dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "index/save"
+WVPASS mkdir src src/foo
+WVPASS date > src/bar
+WVPASS bup random 1k > src/baz
+WVPASS bup on - index src
+WVPASS bup on - save -ctn src src > get.log
+WVPASSEQ $(WVPASS cat get.log | WVPASS wc -l) 2
+tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
+commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
+WVPASS git ls-tree "$tree_id"
+WVPASS git cat-file commit "$commit_id" | head -n 1 \
+ | WVPASS grep "^tree $tree_id\$"
+
+WVPASS bup restore -C restore "src/latest/$(pwd)/src/."
+WVPASS compare-trees src/ restore/
+WVPASS rm -r restore
+
+WVSTART "split"
+WVPASS bup on - split -ctn baz src/baz > get.log
+tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
+commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
+WVPASS git ls-tree "$tree_id"
+WVPASS git cat-file commit "$commit_id" | head -n 1 \
+ | WVPASS grep "^tree $tree_id\$"
+WVPASS bup join baz > restore-baz
+WVPASS cmp src/baz restore-baz
+
+WVSTART "index-cache"
+# the 'a-zA-Z0-9_' is '\w' from python,
+# the trailing _ is because there's no dir specified
+# and that should thus be empty
+hostname=$(uname -n)
+idxcache=$(echo "$hostname" | sed 's/[^@a-zA-Z0-9_]/_/g')_
+# there should be an index-cache now
+for idx in "$tmpdir"/bup/objects/pack/*.idx ; do
+ cachedidx="$tmpdir/bup/index-cache/$idxcache/$(basename "$idx")"
+ WVPASS cmp "$idx" "$cachedidx"
+done
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVSTART 'pack size limit'
+
+WVPASS bup init
+WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
+WVPASS bup random 50k | WVPASS bup split -n foo
+WVPASSEQ 1 $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l)
+
+rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS git config pack.packSizeLimit 10k
+WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
+WVPASS bup random 50k | WVPASS bup split -n foo
+WVPASS test $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l) -gt 2
+
+WVPASS rm -r "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+
+# Test that running save more than once with no other changes produces
+# the exact same tree.
+
+# Note: we can't compare the top-level hash (i.e. the output of "save
+# -t" because that currently pulls the metadata for unindexed parent
+# directories directly from the filesystem, and the relevant atimes
+# may change between runs. So instead we extract the roots of the
+# indexed trees for comparison via dev/subtree-hash.
+
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+WVSTART 'all'
+
+top="$(pwd)"
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$BUP_DIR"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir -p "$tmpdir/src"
+WVPASS mkdir -p "$tmpdir/src/d"
+WVPASS mkdir -p "$tmpdir/src/d/e"
+WVPASS touch "$tmpdir/src/"{f,b,a,d}
+WVPASS touch "$tmpdir/src/d/z"
+
+WVPASS bup init
+WVPASS bup index -u "$tmpdir/src"
+
+declare -a indexed_top
+IFS=/
+indexed_top="${tmpdir##/}"
+indexed_top=(${indexed_top%%/})
+unset IFS
+
+tree1=$(WVPASS bup save -t "$tmpdir/src") || exit $?
+indexed_tree1="$(WVPASS dev/subtree-hash "$tree1" "${indexed_top[@]}" src)" \
+ || exit $?
+
+result="$(WVPASS cd "$tmpdir/src"; WVPASS bup index -m)" || exit $?
+WVPASSEQ "$result" ""
+
+tree2=$(WVPASS bup save -t "$tmpdir/src") || exit $?
+indexed_tree2="$(WVPASS dev/subtree-hash "$tree2" "${indexed_top[@]}" src)" \
+ || exit $?
+
+WVPASSEQ "$indexed_tree1" "$indexed_tree2"
+
+result="$(WVPASS bup index -s / | WVFAIL grep ^D)" || exit $?
+WVPASSEQ "$result" ""
+
+tree3=$(WVPASS bup save -t /) || exit $?
+indexed_tree3="$(WVPASS dev/subtree-hash "$tree3" "${indexed_top[@]}" src)" || exit $?
+WVPASSEQ "$indexed_tree1" "$indexed_tree3"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+bup_make=$(< config/config.var/bup-make)
+
+WVPASS git status > /dev/null
+
+if ! git diff-index --quiet HEAD; then
+ WVDIE "uncommitted changes; cannot continue"
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVPASS git clone "$top" clone
+
+for ver in 11.11 11.11.11; do
+ WVSTART "version $ver"
+ WVPASS cd clone
+ WVPASS git tag "$ver"
+ WVPASS git archive --prefix=bup-"$ver"/ -o "$tmpdir"/bup-"$ver".tgz "$ver"
+ WVPASS cd "$tmpdir"
+ WVPASS tar xzf bup-"$ver".tgz
+ WVPASS cd bup-"$ver"
+ WVPASS "$bup_make"
+ WVPASSEQ "$ver" "$(./bup version)"
+ WVPASS cd "$tmpdir"
+done
+
+WVSTART 'make check in unpacked archive'
+WVPASS cd bup-11.11.11
+if ! "$bup_make" -j5 check > archive-tests.log 2>&1; then
+ cat archive-tests.log 1>&2
+ WVPASS false
+fi
+
+WVPASS cd "$top"
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+root_status="$(dev/root-status)" || exit $?
+
+if [ "$root_status" != root ]; then
+ echo 'Not root: skipping restore --map-* tests.'
+ exit 0 # FIXME: add WVSKIP.
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+uid=$(WVPASS id -u) || exit $?
+user=$(WVPASS id -un) || exit $?
+gid=$(WVPASS id -g) || exit $?
+group=$(WVPASS id -gn) || exit $?
+
+other_uinfo=$(WVPASS dev/id-other-than --user "$user") || exit $?
+other_user="${other_uinfo%%:*}"
+other_uid="${other_uinfo##*:}"
+
+other_ginfo=$(WVPASS dev/id-other-than --group "$group" 0) || exit $?
+other_group="${other_ginfo%%:*}"
+other_gid="${other_ginfo##*:}"
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "restore --map-user/group/uid/gid (control)"
+WVPASS mkdir src
+WVPASS touch src/foo
+# Some systems assign the parent dir group to new paths.
+WVPASS chgrp -R "$group" src
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup restore -C dest "src/latest/$(pwd)/src/"
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $user\$" foo-xstat
+WVPASS grep -qE "^uid: $uid\$" foo-xstat
+WVPASS grep -qE "^group: $group\$" foo-xstat
+WVPASS grep -qE "^gid: $gid\$" foo-xstat
+
+WVSTART "restore --map-user/group/uid/gid (user/group)"
+WVPASS rm -rf dest
+# Have to remap uid/gid too because we're root and 0 would win).
+WVPASS bup restore -C dest \
+ --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
+ --map-user "$user=$other_user" --map-group "$group=$other_group" \
+ "src/latest/$(pwd)/src/"
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $other_user\$" foo-xstat
+WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
+WVPASS grep -qE "^group: $other_group\$" foo-xstat
+WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
+
+WVSTART "restore --map-user/group/uid/gid (user/group trumps uid/gid)"
+WVPASS rm -rf dest
+WVPASS bup restore -C dest \
+ --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
+ "src/latest/$(pwd)/src/"
+# Should be no changes.
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $user\$" foo-xstat
+WVPASS grep -qE "^uid: $uid\$" foo-xstat
+WVPASS grep -qE "^group: $group\$" foo-xstat
+WVPASS grep -qE "^gid: $gid\$" foo-xstat
+
+WVSTART "restore --map-user/group/uid/gid (uid/gid)"
+WVPASS rm -rf dest
+WVPASS bup restore -C dest \
+ --map-user "$user=" --map-group "$group=" \
+ --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
+ "src/latest/$(pwd)/src/"
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $other_user\$" foo-xstat
+WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
+WVPASS grep -qE "^group: $other_group\$" foo-xstat
+WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
+
+has_uid_gid_0=$(WVPASS bup-cfg-py -c "
+import grp, pwd
+try:
+ pwd.getpwuid(0)
+ grp.getgrgid(0)
+ print('yes')
+except KeyError as ex:
+ pass
+") || exit $?
+if [ "$has_uid_gid_0" == yes ]
+then
+ WVSTART "restore --map-user/group/uid/gid (zero uid/gid trumps all)"
+ WVPASS rm -rf dest
+ WVPASS bup restore -C dest \
+ --map-user "$user=$other_user" --map-group "$group=$other_group" \
+ --map-uid "$uid=0" --map-gid "$gid=0" \
+ "src/latest/$(pwd)/src/"
+ WVPASS bup xstat dest/foo > foo-xstat
+ WVPASS grep -qE "^uid: 0\$" foo-xstat
+ WVPASS grep -qE "^gid: 0\$" foo-xstat
+
+ WVPASS rm -rf "$tmpdir"
+fi
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+WVSTART 'all'
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir "$tmpdir/foo"
+WVPASS mkdir "$tmpdir/foo/bar" # Make sure a dir sorts before baz (regression test).
+WVPASS touch "$tmpdir/foo/baz"
+WVPASS WVPASS bup init
+WVPASS WVPASS bup index "$tmpdir/foo"
+WVPASS bup save -n foo "$tmpdir/foo"
+# Make sure the timestamps will differ if metadata isn't being restored.
+WVPASS bup tick
+WVPASS bup restore -C "$tmpdir/restore" "foo/latest/$tmpdir/foo/baz"
+WVPASS "$top/dev/compare-trees" "$tmpdir/foo/baz" "$tmpdir/restore/baz"
+
+WVPASS rm -rf "$tmpdir"
+
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. ./dev/lib.sh || exit $?
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+wv_matches_rx()
+{
+ local caller_file=${BASH_SOURCE[0]}
+ local caller_line=${BASH_LINENO[0]}
+ local src="$caller_file:$caller_line"
+ if test $# -ne 2; then
+ echo "! $src wv_matches_rx requires 2 arguments FAILED" 1>&2
+ return
+ fi
+ local str="$1"
+ local rx="$2"
+ echo "Matching:" 1>&2 || exit $?
+ echo "$str" | sed 's/^\(.*\)/ \1/' 1>&2 || exit $?
+ echo "Against:" 1>&2 || exit $?
+ echo "$rx" | sed 's/^\(.*\)/ \1/' 1>&2 || exit $?
+ if [[ "$str" =~ ^${rx}$ ]]; then
+ echo "! $src regex matches ok" 1>&2 || exit $?
+ else
+ echo "! $src regex doesn't match FAILED" 1>&2 || exit $?
+ fi
+}
+
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+
+WVSTART "rm /foo (lone branch)"
+WVPASS mkdir src src/foo
+WVPASS echo twisty-maze > src/1
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+# FIXME: test -n
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+'\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+refs/heads/src(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?'
+
+
+WVSTART "rm /foo (one of many)"
+WVPASS rm -rf bup
+WVPASS mv bup-baseline bup
+WVPASS echo twisty-maze > src/2
+WVPASS bup index src
+WVPASS bup save -n src-2 src
+WVPASS echo twisty-maze > src/3
+WVPASS bup index src
+WVPASS bup save -n src-3 src
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+refs/heads/src(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+WVSTART "rm /foo /bar (multiple of many)"
+WVPASS rm -rf bup
+WVPASS mv bup-baseline bup
+WVPASS echo twisty-maze > src/4
+WVPASS bup index src
+WVPASS bup save -n src-4 src
+WVPASS echo twisty-maze > src/5
+WVPASS bup index src
+WVPASS bup save -n src-5 src
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src-2 /src-4
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src-2
+\*deleting[ ]+logs/refs/heads/src-4
+\*deleting[ ]+refs/heads/src-2
+\*deleting[ ]+refs/heads/src-4(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+WVSTART "rm /foo /bar (all)"
+WVPASS rm -rf bup
+WVPASS mv bup-baseline bup
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src /src-2 /src-3 /src-4 /src-5
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+logs/refs/heads/src-2
+\*deleting[ ]+logs/refs/heads/src-3
+\*deleting[ ]+logs/refs/heads/src-4
+\*deleting[ ]+logs/refs/heads/src-5
+\*deleting[ ]+refs/heads/src
+\*deleting[ ]+refs/heads/src-2
+\*deleting[ ]+refs/heads/src-3
+\*deleting[ ]+refs/heads/src-4
+\*deleting[ ]+refs/heads/src-5(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+WVSTART "rm /foo/bar (lone save - equivalent to rm /foo)"
+WVPASS rm -rf bup bup-baseline src
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo twisty-maze > src/1
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup ls src > tmp-ls
+save1="$(WVPASS head -n 1 tmp-ls)" || exit $?
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVFAIL bup rm --unsafe /src/latest
+WVPASS bup rm --unsafe /src/"$save1"
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+refs/heads/src(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+verify-changes-caused-by-rewriting-save()
+{
+ local before="$1" after="$2" tmpdir
+ tmpdir="$(WVPASS wvmktempdir)" || exit $?
+ (WVPASS cd "$before" && WVPASS find . | WVPASS sort) \
+ > "$tmpdir/before" || exit $?
+ (WVPASS cd "$after" && WVPASS find . | WVPASS sort) \
+ > "$tmpdir/after" || exit $?
+ local new_paths new_idx new_pack observed
+ new_paths="$(WVPASS comm -13 "$tmpdir/before" "$tmpdir/after")" || exit $?
+ new_idx="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.idx$' | cut -b 3-)" || exit $?
+ new_pack="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.pack$' | cut -b 3-)" || exit $?
+ wv_matches_rx "$(compare-trees "$after/" "$before/")" \
+">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
+\.d\.\.t\.\.\.[.]*[ ]+objects/
+\.d\.\.t\.\.\.[.]*[ ]+objects/pack/
+>fcst\.\.\.[.]*[ ]+objects/pack/bup\.bloom
+>f\+\+\+\+\+\+\+[+]*[ ]+$new_idx
+>f\+\+\+\+\+\+\+[+]*[ ]+$new_pack
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
+>fc\.t\.\.\.[.]*[ ]+refs/heads/src"
+ WVPASS rm -rf "$tmpdir"
+}
+
+commit-hash-n()
+{
+ local n="$1" repo="$2" branch="$3"
+ GIT_DIR="$repo" WVPASS git rev-list --reverse "$branch" \
+ | WVPASS awk "FNR == $n"
+}
+
+rm-safe-cinfo()
+{
+ local n="$1" repo="$2" branch="$3" hash
+ hash="$(commit-hash-n "$n" "$repo" "$branch")" || exit $?
+ local fmt='Tree: %T%n'
+ fmt="${fmt}Author: %an <%ae> %ai%n"
+ fmt="${fmt}Committer: %cn <%ce> %ci%n"
+ fmt="${fmt}%n%s%n%b"
+ GIT_DIR="$repo" WVPASS git log -n1 --pretty=format:"$fmt" "$hash"
+}
+
+
+WVSTART 'rm /foo/BAR (setup)'
+WVPASS rm -rf bup bup-baseline src
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo twisty-maze > src/1
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS echo twisty-maze > src/2
+WVPASS bup index src
+WVPASS bup tick
+WVPASS bup save -n src src
+WVPASS echo twisty-maze > src/3
+WVPASS bup index src
+WVPASS bup tick
+WVPASS bup save -n src src
+WVPASS mv bup bup-baseline
+WVPASS bup tick # Make sure we always get the timestamp changes below
+
+
+WVSTART "rm /foo/BAR (first of many)"
+WVPASS "$top"/dev/sync-tree bup-baseline/ bup/
+WVPASS bup ls src > tmp-ls
+victim="$(WVPASS head -n 1 tmp-ls)" || exit $?
+WVPASS bup rm --unsafe /src/"$victim"
+verify-changes-caused-by-rewriting-save bup-baseline bup
+observed=$(WVPASS git rev-list src | WVPASS wc -l) || exit $?
+WVPASSEQ 2 $observed
+WVPASSEQ "$(rm-safe-cinfo 1 bup src)" "$(rm-safe-cinfo 2 bup-baseline src)"
+WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
+
+
+WVSTART "rm /foo/BAR (one of many)"
+WVPASS "$top"/dev/sync-tree bup-baseline/ bup/
+victim="$(WVPASS bup ls src | tail -n +2 | head -n 1)" || exit $?
+WVPASS bup rm --unsafe /src/"$victim"
+verify-changes-caused-by-rewriting-save bup-baseline bup
+observed=$(git rev-list src | wc -l) || exit $?
+WVPASSEQ 2 $observed
+WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
+WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
+
+
+WVSTART "rm /foo/BAR (last of many)"
+WVPASS "$top"/dev/sync-tree bup-baseline/ bup/
+victim="$(WVPASS bup ls src | tail -n 2 | head -n 1)" || exit $?
+WVPASS bup rm --unsafe -vv /src/"$victim"
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
+>fc\.t\.\.\.[.]*[ ]+refs/heads/src
+>fcst\.\.\.[.]*[ ]+logs/refs/heads/src"
+observed=$(git rev-list src | wc -l) || exit $?
+WVPASSEQ 2 $observed
+WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
+WVPASSEQ "$(commit-hash-n 2 bup src)" "$(commit-hash-n 2 bup-baseline src)"
+
+
+# FIXME: test that committer changes when rewriting, when appropriate
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+D="$tmpdir/data"
+
+bup() { "$top/bup" "$@"; }
+
+WVSTART "remove file"
+# Fixed in commit 8585613c1f45f3e20feec00b24fc7e3a948fa23e ("Store
+# metadata in the index....")
+WVPASS mkdir "$D"
+WVPASS bup init
+WVPASS echo "content" > "$D"/foo
+WVPASS echo "content" > "$D"/bar
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS bup save -n save-fail-missing "$D"
+WVPASS echo "content" > "$D"/baz
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS rm "$D"/foo
+# When "bup tick" is removed above, this may fail (complete with warning),
+# since the ctime/mtime of "foo" might be pushed back:
+WVPASS bup save -n save-fail-missing "$D"
+# when the save-call failed, foo is missing from output, since only
+# then bup notices, that it was removed:
+WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
+baz
+foo"
+# index/save again
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS bup save -n save-fail-missing "$D"
+# now foo is gone:
+WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
+baz"
+
+
+# TODO: Test for racecondition between reading a file and reading its metadata?
+
+WVSTART "remove dir"
+WVPASS rm -r "$D"
+WVPASS mkdir "$D"
+WVPASS rm -r "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir "$D"/foo
+WVPASS mkdir "$D"/bar
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS bup save -n save-fail-missing "$D"
+WVPASS touch "$D"/bar
+WVPASS mkdir "$D"/baz
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS rmdir "$D"/foo
+# with directories, bup notices that foo is missing, so it fails
+# (complete with delayed error)
+WVFAIL bup save -n save-fail-missing "$D"
+# ...but foo is still saved since it was just fine in the index
+WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
+baz/
+foo/"
+# Index again:
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+# no non-zero-exitcode anymore:
+WVPASS bup save -n save-fail-missing "$D"
+# foo is now gone
+WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
+baz/"
+
+WVPASS rm -rf "$tmpdir"
+
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+WVSTART 'all'
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$BUP_DIR"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir -p "$tmpdir/src"
+WVPASS touch "$tmpdir/src/foo"
+WVPASS bup init
+WVPASS bup index "$tmpdir/src"
+WVPASS bup save -n src "$tmpdir/src"
+WVPASSEQ "$(git fsck --unreachable)" ""
+WVPASS bup save -n src "$tmpdir/src"
+WVPASSEQ "$(git fsck --unreachable)" ""
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# necessary for 0 == 1970-01-01 00:00
+export TZ=UTC
+
+WVSTART "init"
+WVPASS bup init
+
+mkdir "$tmpdir/save"
+for f in $(seq 9) ; do
+ touch -t 200${f}01010000 "$tmpdir/save/$f"
+done
+mkdir "$tmpdir/save/a"
+touch -t 199901010000 "$tmpdir/save/a/1"
+
+WVSTART "metadata read error for a file"
+WVPASS bup index "$tmpdir/save"
+
+# now do a hack to inject save errors while reading metadata
+# essentially, we create a bup-save command for ourselves
+# that gets an error for the .../5 file in metadata.from_path()
+cat > "$tmpdir/bup-save" << EOF
+#!/usr/bin/env $top/dev/bup-python
+from bup import metadata
+
+orig_from_path = metadata.from_path
+def from_path(path, *args, **kw):
+ if path.endswith(b'/5'):
+ raise IOError('intentionally failing metadata read for .../5')
+ return orig_from_path(path, *args, **kw)
+metadata.from_path = from_path
+
+exec(open("$top/lib/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work anyway
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+# also check the *right* data was returned
+lsout="$(bup ls -l "test/latest/$tmpdir/save")"
+for f in 1 2 3 4 6 7 8 9 ; do
+ if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
+ WVFAIL echo incorrect date for $f
+ fi
+done
+# and ensure we actually failed, and the above script/hack didn't break
+if ! echo "$lsout" | grep "1970-01-01 00:00 5" ; then
+ WVFAIL echo unexpected date for file 5
+fi
+
+
+WVSTART "metadata read error for a folder"
+WVPASS bup index --clear
+WVPASS bup index "$tmpdir/save"
+
+cat > "$tmpdir/bup-save" << EOF
+#!/usr/bin/env $top/dev/bup-python
+from bup import metadata
+
+orig_from_path = metadata.from_path
+def from_path(path, *args, **kw):
+ if path.endswith(b'/a'):
+ raise IOError('intentionally failing metadata read for .../a')
+ return orig_from_path(path, *args, **kw)
+metadata.from_path = from_path
+
+exec(open("$top/lib/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work anyway
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+if ! bup ls -l "test/latest/$tmpdir/save/a" | grep '1999-01-01 00:00 1' ; then
+ WVFAIL unexpected date for file a/1
+fi
+# and ensure we actually failed, and the above script/hack didn't break
+if ! bup ls -l "test/latest/$tmpdir/save" | grep "1970-01-01 00:00 a" ; then
+ WVFAIL unexpected date for directory a
+fi
+
+
+WVSTART "duplicate entries"
+WVPASS bup index --clear
+WVPASS bup index "$tmpdir/save"
+
+cat > "$tmpdir/bup-save" << EOF
+#!/usr/bin/env $top/dev/bup-python
+from bup import index
+
+Reader = index.Reader
+class DupReader(index.Reader):
+ def filter(self, *args, **kw):
+ for transname, ent in Reader.filter(self, *args, **kw):
+ # duplicate a file and a folder
+ if ent.name.endswith(b'/5') or ent.name.endswith(b'/a/'):
+ yield transname, ent
+ yield transname, ent
+index.Reader = DupReader
+
+exec(open("$top/lib/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+
+# check that there are no duplicates
+lsout=$(bup ls -l "test/latest/$tmpdir/save")
+WVPASSEQ "$(echo "$lsout" | sort | uniq -d)" ""
+
+# and we should get the *right* data for each entry
+for f in $(seq 9) ; do
+ if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
+ WVFAIL echo incorrect metadata for $f
+ fi
+done
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+validate-local-and-remote-restore()
+{
+ local src="$1" dest="$2" cmp_src="$3" cmp_dest="$4"
+ force-delete "$dest"
+ WVPASS bup restore -C "$dest" "$src"
+ WVPASS "$top/dev/compare-trees" "$cmp_src" "$cmp_dest"
+ force-delete "$dest"
+ WVPASS bup restore -r ":$BUP_DIR" -C "$dest" "$src"
+ WVPASS "$top/dev/compare-trees" "$cmp_src" "$cmp_dest"
+}
+
+
+WVPASS cd "$tmpdir"
+
+WVSTART "init"
+WVPASS bup init
+D=bupdata.tmp
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVPASS touch $D/a
+WVPASS bup random 128k >$D/b
+WVPASS mkdir $D/d $D/d/e
+WVPASS bup random 512 >$D/f
+WVPASS touch $D/d/z
+WVPASS touch $D/d/z
+WVPASS bup index $D
+WVPASS bup save -t $D
+
+
+WVSTART "restore"
+WVPASS force-delete buprestore.tmp
+WVFAIL bup restore boink
+WVPASS touch "$tmpdir/$D/$D"
+WVPASS bup index -u "$tmpdir/$D"
+WVPASS bup save -n master /
+WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D"
+WVPASSEQ "$(ls buprestore.tmp)" "bupdata.tmp"
+WVPASS force-delete buprestore.tmp
+WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D/"
+WVPASS touch $D/non-existent-file buprestore.tmp/non-existent-file # else diff fails
+WVPASS diff -ur $D/ buprestore.tmp/
+WVPASS force-delete buprestore.tmp
+WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
+WVPASS bup restore -C buprestore.tmp split_empty_string.tmp/latest/
+WVPASSEQ "$(cat buprestore.tmp/data)" ""
+
+
+(
+ tmp=testrestore.tmp
+ WVPASS force-delete $tmp
+ WVPASS mkdir $tmp
+ export BUP_DIR="$(pwd)/$tmp/bup"
+ WVPASS WVPASS bup init
+ WVPASS mkdir -p $tmp/src/x/y/z
+ WVPASS bup random 8k > $tmp/src/x/y/random-1
+ WVPASS bup random 8k > $tmp/src/x/y/z/random-2
+ WVPASS bup index -u $tmp/src
+ WVPASS bup save --strip -n foo $tmp/src
+
+ WVSTART "restore /foo/latest"
+ validate-local-and-remote-restore \
+ /foo/latest "$tmp/restore" \
+ "$tmp/src/" "$tmp/restore/latest/"
+
+ WVSTART "restore /foo/latest/."
+ WVPASS force-delete "$tmp/restore"
+ validate-local-and-remote-restore \
+ /foo/latest/. "$tmp"/restore \
+ "$tmp"/src/ "$tmp"/restore
+
+ WVSTART "restore /foo/latest/x"
+ WVPASS force-delete "$tmp/restore"
+ validate-local-and-remote-restore \
+ /foo/latest/x "$tmp"/restore \
+ "$tmp"/src/x/ "$tmp"/restore/x/
+
+ WVSTART "restore /foo/latest/x/"
+ WVPASS force-delete "$tmp/restore"
+ WVPASS bup restore -C "$tmp"/restore /foo/latest/x/
+ for x in "$tmp"/src/x/*; do
+ WVPASS "$top/dev/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
+ done
+ WVPASS force-delete "$tmp/restore"
+ WVPASS bup restore -r ":$BUP_DIR" -C "$tmp"/restore /foo/latest/x/
+ for x in "$tmp"/src/x/*; do
+ WVPASS "$top/dev/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
+ done
+
+ WVSTART "restore /foo/latest/x/."
+ WVPASS force-delete "$tmp/restore"
+ validate-local-and-remote-restore \
+ /foo/latest/x/. "$tmp"/restore \
+ "$tmp"/src/x/ "$tmp"/restore/
+) || exit $?
+
+
+WVSTART "save (no index)"
+(
+ tmp=save-no-index.tmp
+ WVPASS force-delete $tmp
+ WVPASS mkdir $tmp
+ export BUP_DIR="$(WVPASS pwd)/$tmp/bup" || exit $?
+ WVPASS bup init
+ WVFAIL bup save -n nothing /
+ WVPASS rm -r "$tmp"
+) || exit $?
+
+
+WVSTART "save disjoint top-level directories"
+(
+ # Resolve any symlinks involving the top top-level dirs.
+ real_pwd="$(WVPASS resolve-parent .)" || exit $?
+ real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $?
+ pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $?
+ tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $?
+
+ if [ "$pwd_top" = "$tmp_top" ]; then
+ echo "(running from within /$tmp_top; skipping test)" 1>&2
+ exit 0
+ fi
+ D=bupdata.tmp
+ WVPASS force-delete $D
+ WVPASS mkdir -p $D/x
+ WVPASS date > $D/x/1
+ tmpdir2="$(WVPASS mktemp -d $real_tmp/bup-test-XXXXXXX)" || exit $?
+ cleanup() { WVPASS rm -r "$tmpdir2"; }
+ WVPASS trap cleanup EXIT
+ WVPASS date > "$tmpdir2/2"
+
+ export BUP_DIR="$tmpdir/bup"
+ WVPASS test -d "$BUP_DIR" && WVPASS rm -r "$BUP_DIR"
+
+ WVPASS bup init
+ WVPASS bup index -vu $(pwd)/$D/x "$tmpdir2"
+ WVPASS bup save -t -n src $(pwd)/$D/x "$tmpdir2"
+
+ # For now, assume that "ls -a" and "sort" use the same order.
+ actual="$(WVPASS bup ls -AF src/latest)" || exit $?
+ expected="$(echo -e "$pwd_top/\n$tmp_top/" | WVPASS sort)" || exit $?
+ WVPASSEQ "$actual" "$expected"
+) || exit $?
+
+
+WVPASS cd "$top"
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+
+WVSTART "index excludes bupdir"
+WVPASS force-delete src "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS bup random 128k >src/b
+WVPASS mkdir src/d src/d/e
+WVPASS bup random 512 >src/f
+WVPASS bup index -ux src
+WVPASS bup save -n exclude-bupdir src
+WVPASSEQ "$(bup ls -AF "exclude-bupdir/latest/$tmpdir/src/")" "a
+b
+d/
+f"
+
+
+WVSTART "index --exclude"
+WVPASS force-delete src "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS bup random 128k >src/b
+WVPASS mkdir src/d src/d/e
+WVPASS bup random 512 >src/f
+WVPASS bup random 512 >src/j
+WVPASS bup index -ux --exclude src/d --exclude src/j src
+WVPASS bup save -n exclude src
+WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
+b
+f"
+WVPASS mkdir src/g src/h
+WVPASS bup index -ux --exclude src/d --exclude $tmpdir/src/g --exclude src/h \
+ --exclude "$tmpdir/src/j" src
+WVPASS bup save -n exclude src
+WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
+b
+f"
+
+
+WVSTART "index --exclude-from"
+WVPASS force-delete src "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo "src/d
+ $tmpdir/src/g
+src/h
+src/i" > exclude-list
+WVPASS touch src/a
+WVPASS bup random 128k >src/b
+WVPASS mkdir src/d src/d/e
+WVPASS bup random 512 >src/f
+WVPASS mkdir src/g src/h
+WVPASS bup random 128k > src/i
+WVPASS bup index -ux --exclude-from exclude-list src
+WVPASS bup save -n exclude-from src
+WVPASSEQ "$(bup ls "exclude-from/latest/$tmpdir/src/")" "a
+b
+f"
+WVPASS rm exclude-list
+
+
+# bup index --exclude-rx ...
+# ==========================
+
+WVSTART "index --exclude-rx '^/foo' (root anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+WVPASS bup index -u src --exclude-rx "^$(pwd)/src/sub1/"
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+WVSTART "index --exclude-rx '/foo$' (non-dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src --exclude-rx '/foo$'
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub
+./sub/foo
+./sub/foo/a"
+
+WVSTART "index --exclude-rx '/foo/$' (dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src --exclude-rx '/foo/$'
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub"
+
+WVSTART "index --exclude-rx '/foo/.' (dir content)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src --exclude-rx '/foo/.'
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub
+./sub/foo"
+
+
+# bup index --exclude-rx-from ...
+# ===============================
+WVSTART "index --exclude-rx-from"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+# exclude-rx-file includes blank lines to check that we ignore them.
+WVPASS echo "^$(pwd)/src/sub1/
+
+" > exclude-rx-file
+WVPASS bup index -u src --exclude-rx-from exclude-rx-file
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+
+# bup restore --exclude-rx ...
+# ============================
+
+WVSTART "restore --exclude-rx '^/foo' (root anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx "^/sub1/" /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+WVSTART "restore --exclude-rx '/foo$' (non-dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo$' /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub
+./sub/foo
+./sub/foo/a"
+
+WVSTART "restore --exclude-rx '/foo/$' (dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/$' /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub"
+
+WVSTART "restore --exclude-rx '/foo/.' (dir content)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/.' /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub
+./sub/foo"
+
+
+# bup restore --exclude-rx-from ...
+# =================================
+
+WVSTART "restore --exclude-rx-from"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS echo "^/sub1/" > exclude-rx-file
+WVPASS bup restore -C buprestore.tmp \
+ --exclude-rx-from exclude-rx-file /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVSTART "init"
+WVPASS bup init
+
+WVPASS mkdir "$tmpdir/save"
+WVPASS echo small0 > "$tmpdir/save/small"
+WVPASS echo bigbigbigbigbig01 > "$tmpdir/save/big1"
+big1sha="$(sha1sum < "$tmpdir/save/big1")"
+WVPASS bup index "$tmpdir/save"
+WVPASS bup save -vv -n test "$tmpdir/save"
+WVPASS mkdir "$tmpdir/restore1"
+WVPASS bup restore -v --outdir="$tmpdir/restore1/" "/test/latest$tmpdir/save/"
+WVPASS cmp "$tmpdir/restore1/small" "$tmpdir/save/small"
+WVPASS cmp "$tmpdir/restore1/big1" "$tmpdir/save/big1"
+
+WVSTART "save --smaller"
+WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
+WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
+WVPASS bup index "$tmpdir/save"
+WVPASS bup save -vv -n test --smaller=10 "$tmpdir/save"
+WVPASS mkdir "$tmpdir/restore2"
+WVPASS bup restore -v --outdir="$tmpdir/restore2/" "/test/latest$tmpdir/save/"
+WVPASS cmp "$tmpdir/restore2/small" "$tmpdir/save/small"
+# (per the original DESIGN document, we should've had the old version
+# of the modified large file, but really that isn't implemented)
+# must _not_ have this file at all
+WVFAIL test -f "$tmpdir/restore2/big1"
+# and not the new one either
+WVFAIL test -f "$tmpdir/restore2/big2"
+
+WVSTART "index --fake-valid / save"
+WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
+WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
+WVPASS bup index "$tmpdir/save"
+WVPASS bup index --fake-valid "$tmpdir/save/big1" "$tmpdir/save/big2"
+WVPASS bup save -vv -n test "$tmpdir/save"
+WVPASS mkdir "$tmpdir/restore3"
+WVPASS bup restore -v --outdir="$tmpdir/restore3/" "/test/latest$tmpdir/save/"
+WVPASS cmp "$tmpdir/restore3/small" "$tmpdir/save/small"
+WVPASSEQ "$(sha1sum < "$tmpdir/restore3/big1")" "$big1sha"
+WVPASS cmp "$tmpdir/restore3/big2" "$tmpdir/save/big2"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+
+WVSTART "save --strip"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --strip -n foo src/x/y
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/y/ restore/latest/
+
+
+WVSTART "save --strip-path (relative)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --strip-path src -n foo src/x
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ restore/latest/
+
+
+WVSTART "save --strip-path (absolute)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --strip-path "$tmpdir" -n foo src
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ "restore/latest/src/"
+
+
+WVSTART "save --strip-path (no match)"
+if test $(WVPASS path-filesystems . | WVPASS sort -u | WVPASS wc -l) -ne 1
+then
+ # Skip the test because the attempt to restore parent dirs to the
+ # current filesystem may fail -- i.e. running from
+ # /foo/ext4/bar/btrfs will fail when bup tries to restore linux
+ # attrs above btrfs to the restore tree *inside* btrfs.
+ # FIXME: add WVSKIP
+ echo "(running from tree with mixed filesystems; skipping test)" 1>&2
+ exit 0
+else
+ WVPASS force-delete "$BUP_DIR" src restore
+ WVPASS bup init
+ WVPASS mkdir -p src/x/y/z
+ WVPASS bup random 8k > src/x/y/random-1
+ WVPASS bup random 8k > src/x/y/z/random-2
+ WVPASS bup index -u src
+ WVPASS bup save --strip-path foo -n foo src/x
+ WVPASS bup restore -C restore /foo/latest
+ WVPASS compare-trees src/ "restore/latest/$tmpdir/src/"
+fi
+
+
+WVSTART "save --graft (empty graft points disallowed)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir src
+WVFAIL bup save --graft =/grafted -n graft-point-absolute src 2>&1 \
+ | WVPASS grep 'error: a graft point cannot be empty'
+WVFAIL bup save --graft $top/$tmp= -n graft-point-absolute src 2>&1 \
+ | WVPASS grep 'error: a graft point cannot be empty'
+
+
+WVSTART "save --graft /x/y=/a/b (relative paths)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --graft src=x -n foo src
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ "restore/latest/$tmpdir/x/"
+
+
+WVSTART "save --graft /x/y=/a/b (matching structure)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src/x/y=$tmpdir/src/a/b" -n foo src/x/y
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/y/ "restore/latest/$tmpdir/src/a/b/"
+
+
+WVSTART "save --graft /x/y=/a (shorter target)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src/x/y=/a" -n foo src/x/y
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/y/ "restore/latest/a/"
+
+
+WVSTART "save --graft /x=/a/b (longer target)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src=$tmpdir/src/a/b/c" -n foo src
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ "restore/latest/$tmpdir/src/a/b/c/"
+
+
+WVSTART "save --graft /x=/ (root target)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src/x=/" -n foo src/x
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/ "restore/latest/"
+
+
+#WVSTART "save --graft /=/x/ (root source)"
+# FIXME: Not tested for now -- will require cleverness, or caution as root.
+
+
+WVSTART "save collision"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/1 src/y/1
+WVPASS bup index -u src
+WVFAIL bup save --strip -n foo src/x src/y 2> tmp-err.log
+WVPASS grep -F "error: ignoring duplicate path 1 in /" tmp-err.log
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# Make sure that we can explicitly save a path whose parent is up to
+# date.
+
+WVSTART "save path with up to date parent"
+WVPASS bup init
+
+WVPASS mkdir -p src/a src/b
+WVPASS touch src/a/1 src/b/2
+WVPASS bup index -u src
+WVPASS bup save -n src src
+
+WVPASS bup save -n src src/b
+WVPASS bup restore -C restore "src/latest/$(pwd)/"
+WVPASS test ! -e restore/src/a
+WVPASS "$top/dev/compare-trees" -c src/b/ restore/src/b/
+
+WVPASS bup save -n src src/a/1
+WVPASS rm -r restore
+WVPASS bup restore -C restore "src/latest/$(pwd)/"
+WVPASS test ! -e restore/src/b
+WVPASS "$top/dev/compare-trees" -c src/a/ restore/src/a/
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+mb=1048576
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+readonly mb top tmpdir
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# The 3MB guess is semi-arbitrary, but we've been informed that
+# Lustre, for example, uses 1MB, so guess higher than that, at least.
+block_size=$(bup-cfg-py -c \
+ "import os; print(getattr(os.stat('.'), 'st_blksize', 0)) or $mb * 3") \
+ || exit $?
+data_size=$((block_size * 10))
+readonly block_size data_size
+
+WVPASS dd if=/dev/zero of=test-sparse-probe seek="$data_size" bs=1 count=1
+probe_size=$(WVPASS du -k -s test-sparse-probe | WVPASS cut -f1) || exit $?
+if [ "$probe_size" -ge "$((data_size / 1024))" ]; then
+ WVSTART "no sparse support detected -- skipping tests"
+ exit 0
+fi
+
+WVSTART "sparse restore on $(current-filesystem), assuming ${block_size}B blocks"
+
+WVPASS bup init
+WVPASS mkdir src
+
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
+WVPASS bup index src
+WVPASS bup save -n src src
+
+WVSTART "sparse file restore (all sparse)"
+WVPASS bup restore -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --no-sparse (all sparse)"
+WVPASS rm -r restore
+WVPASS bup restore --no-sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (all sparse)"
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse end)"
+WVPASS echo "start" > src/foo
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1 conv=notrunc
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse middle)"
+WVPASS echo "end" >> src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (bracketed zero run in buf)"
+WVPASS echo 'x' > src/foo
+WVPASS dd if=/dev/zero bs=1 count=512 >> src/foo
+WVPASS echo 'y' >> src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse start)"
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
+WVPASS echo "end" >> src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse start and end)"
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
+WVPASS echo "middle" >> src/foo
+WVPASS dd if=/dev/zero of=src/foo seek=$((2 * data_size)) bs=1 count=1 conv=notrunc
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+if test "$block_size" -gt $mb; then
+ random_size="$block_size"
+else
+ random_size=1M
+fi
+WVSTART "sparse file restore --sparse (random $random_size)"
+WVPASS bup random --seed "$RANDOM" 1M > src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (random sparse regions)"
+WVPASS rm -rf "$BUP_DIR" src
+WVPASS bup init
+WVPASS mkdir src
+for sparse_dataset in 0 1 2 3 4 5 6 7 8 9
+do
+ WVPASS "$top/dev/sparse-test-data" "src/foo-$sparse_dataset"
+done
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (short zero runs around boundary)"
+WVPASS bup-cfg-py > src/foo <<EOF
+from sys import stdout
+stdout.write("x" * 65535 + "\0")
+stdout.write("\0" + "x" * 65535)
+stdout.write("\0" + "x" * 65534 + "\0")
+stdout.write("x" * 65536)
+stdout.write("\0")
+EOF
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVPASS bup init
+
+WVSTART "split --noop"
+WVPASS bup split --noop <"$top/test/testfile1" >noop.tmp
+WVPASSEQ '' "$(<noop.tmp)"
+WVPASS bup split --noop -b <"$top/test/testfile1" >tags1n.tmp
+WVPASS bup split --noop -t <"$top/test/testfile2" >tags2tn.tmp
+WVPASSEQ $(find "$BUP_DIR/objects/pack" -name '*.pack' | wc -l) 0
+
+WVSTART "split"
+WVPASS echo a >a.tmp
+WVPASS echo b >b.tmp
+WVPASS bup split -b a.tmp >taga.tmp
+WVPASS bup split -b b.tmp >tagb.tmp
+WVPASS cat a.tmp b.tmp | WVPASS bup split -b >tagab.tmp
+WVPASSEQ $(cat taga.tmp | wc -l) 1
+WVPASSEQ $(cat tagb.tmp | wc -l) 1
+WVPASSEQ $(cat tagab.tmp | wc -l) 1
+WVPASSEQ $(cat tag[ab].tmp | wc -l) 2
+WVPASSEQ "$(bup split -b a.tmp b.tmp)" "$(cat tagab.tmp)"
+WVPASSEQ "$(bup split -b --keep-boundaries a.tmp b.tmp)" "$(cat tag[ab].tmp)"
+WVPASSEQ "$(cat tag[ab].tmp | bup split -b --keep-boundaries --git-ids)" \
+ "$(cat tag[ab].tmp)"
+WVPASSEQ "$(cat tag[ab].tmp | bup split -b --git-ids)" \
+ "$(cat tagab.tmp)"
+WVPASS bup split --bench -b <"$top/test/testfile1" >tags1.tmp
+WVPASS bup split -vvvv -b "$top/test/testfile2" >tags2.tmp
+WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
+WVPASS bup margin
+WVPASS bup midx -f
+WVPASS bup midx --check -a
+WVPASS bup midx -o "$BUP_DIR/objects/pack/test1.midx" \
+ "$BUP_DIR"/objects/pack/*.idx
+WVPASS bup midx --check -a
+WVPASS bup midx -o "$BUP_DIR"/objects/pack/test1.midx \
+ "$BUP_DIR"/objects/pack/*.idx \
+ "$BUP_DIR"/objects/pack/*.idx
+WVPASS bup midx --check -a
+all=$(echo "$BUP_DIR"/objects/pack/*.idx "$BUP_DIR"/objects/pack/*.midx)
+WVPASS bup midx -o "$BUP_DIR"/objects/pack/zzz.midx $all
+WVPASS bup tick
+WVPASS bup midx -o "$BUP_DIR"/objects/pack/yyy.midx $all
+WVPASS bup midx -a
+WVPASSEQ "$(echo "$BUP_DIR"/objects/pack/*.midx)" \
+ ""$BUP_DIR"/objects/pack/yyy.midx"
+WVPASS bup margin
+WVPASS bup split -t "$top/test/testfile2" >tags2t.tmp
+WVPASS bup split -t "$top/test/testfile2" --fanout 3 >tags2tf.tmp
+WVPASS bup split -r "$BUP_DIR" -c "$top/test/testfile2" >tags2c.tmp
+WVPASS bup split -r ":$BUP_DIR" -c "$top/test/testfile2" >tags2c.tmp
+WVPASS ls -lR \
+ | WVPASS bup split -r ":$BUP_DIR" -c --fanout 3 --max-pack-objects 3 -n lslr \
+ || exit $?
+WVPASS bup ls
+WVFAIL bup ls /does-not-exist
+WVPASS bup ls /lslr
+WVPASS bup ls /lslr/latest
+WVPASS bup ls /lslr/latest/
+#WVPASS bup ls /lslr/1971-01-01 # all dates always exist
+WVFAIL diff -u tags1.tmp tags2.tmp
+WVPASS diff -u tags1.tmp tags1n.tmp
+WVPASS diff -u tags2t.tmp tags2tn.tmp
+
+# fanout must be different from non-fanout
+WVFAIL diff tags2t.tmp tags2tf.tmp
+WVPASS wc -c "$top/test/testfile1" "$top/test/testfile2"
+WVPASS wc -l tags1.tmp tags2.tmp
+
+WVSTART "join"
+WVPASS bup join $(cat tags1.tmp) >out1.tmp
+WVPASS bup join <tags2.tmp >out2.tmp
+WVPASS bup join <tags2t.tmp -o out2t.tmp
+WVPASS bup join -r "$BUP_DIR" <tags2c.tmp >out2c.tmp
+WVPASS bup join -r ":$BUP_DIR" <tags2c.tmp >out2c.tmp
+WVPASS diff -u "$top/test/testfile1" out1.tmp
+WVPASS diff -u "$top/test/testfile2" out2.tmp
+WVPASS diff -u "$top/test/testfile2" out2t.tmp
+WVPASS diff -u "$top/test/testfile2" out2c.tmp
+WVPASSEQ "$(bup join split_empty_string.tmp)" ""
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVSTART "half hour TZ"
+
+export TZ=ACDT-10:30
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVPASS mkdir src
+WVPASS bup index src
+WVPASS bup save -n src -d 1420164180 src
+
+WVPASSEQ "$(WVPASS git cat-file commit src | sed -ne 's/^author .*> //p')" \
+"1420164180 +1030"
+
+WVPASSEQ "$(WVPASS bup ls /src)" \
+"2015-01-02-123300
+latest"
+
+WVPASS rm -rf "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+TOP="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+ "$TOP/bup" "$@"
+}
+
+wait-for-server-start()
+{
+ curl --unix-socket ./socket http://localhost/
+ curl_status=$?
+ while test $curl_status -eq 7; do
+ sleep 0.2
+ curl --unix-socket ./socket http://localhost/
+ curl_status=$?
+ done
+ WVPASSEQ $curl_status 0
+}
+
+WVPASS cd "$tmpdir"
+
+# FIXME: add WVSKIP
+if test -z "$(type -p curl)"; then
+ WVSTART 'curl does not appear to be installed; skipping test'
+ exit 0
+fi
+
+WVPASS bup-cfg-py -c "import socket as s; s.socket(s.AF_UNIX).bind('socket')"
+curl -s --unix-socket ./socket http://localhost/foo
+if test $? -ne 7; then
+ WVSTART 'curl does not appear to support --unix-socket; skipping test'
+ exit 0
+fi
+
+if ! bup-python -c 'import tornado' 2> /dev/null; then
+ WVSTART 'unable to import tornado; skipping test'
+ exit 0
+fi
+
+WVSTART 'web'
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo '¡excitement!' > src/data
+WVPASS echo -e 'whee \x80\x90\xff' > "$(echo -ne 'src/whee \x80\x90\xff')"
+WVPASS bup index src
+WVPASS bup save -n '¡excitement!' --strip src
+
+"$TOP/bup" web unix://socket &
+web_pid=$!
+wait-for-server-start
+
+WVPASS curl --unix-socket ./socket \
+ 'http://localhost/%C2%A1excitement%21/latest/data' > result
+WVPASS curl --unix-socket ./socket \
+ 'http://localhost/%C2%A1excitement%21/latest/whee%20%80%90%ff' > result2
+WVPASSEQ "$(curl --unix-socket ./socket http://localhost/static/styles.css)" \
+ "$(cat "$TOP/lib/web/static/styles.css")"
+
+WVPASSEQ '¡excitement!' "$(cat result)"
+WVPASS cmp "$(echo -ne 'src/whee \x80\x90\xff')" result2
+WVPASS kill -s TERM "$web_pid"
+WVPASS wait "$web_pid"
+
+WVPASS rm -r "$tmpdir"
--- /dev/null
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+root_status="$(dev/root-status)" || exit $?
+
+if [ "$root_status" != root ]; then
+ WVSTART 'not root: skipping tests'
+ exit 0 # FIXME: add WVSKIP.
+fi
+
+if ! modprobe loop; then
+ WVSTART 'unable to load loopback module; skipping tests' 1>&2
+ exit 0
+fi
+
+# These tests are only likely to work under Linux for now
+# (patches welcome).
+if ! [[ $(uname) =~ Linux ]]; then
+ WVSTART 'not Linux: skipping tests'
+ exit 0 # FIXME: add WVSKIP.
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS bup init
+WVPASS pushd "$tmpdir"
+
+WVSTART 'drecurse'
+
+WVPASS dd if=/dev/zero of=testfs-1.img bs=1M count=32
+WVPASS dd if=/dev/zero of=testfs-2.img bs=1M count=32
+WVPASS mkfs -F testfs-1.img # Don't care what type (though must have symlinks)
+WVPASS mkfs -F testfs-2.img # Don't care what type (though must have symlinks)
+WVPASS mkdir -p src/mnt-1/hidden-1 src/mnt-2/hidden-2
+WVPASS mount -o loop testfs-1.img src/mnt-1
+WVPASS mount -o loop testfs-2.img src/mnt-2
+
+WVPASS touch src/1
+
+WVPASS mkdir -p src/mnt-1/x
+WVPASS touch src/mnt-1/2 src/mnt-1/x/3
+
+WVPASS touch src/mnt-2/4
+
+(WVPASS cd src && WVPASS ln -s mnt-2 mnt-link)
+(WVPASS cd src && WVPASS ln -s . top)
+
+WVPASSEQ "$(bup drecurse src | grep -vF lost+found)" "src/top
+src/mnt-link
+src/mnt-2/4
+src/mnt-2/
+src/mnt-1/x/3
+src/mnt-1/x/
+src/mnt-1/2
+src/mnt-1/
+src/1
+src/"
+
+WVPASSEQ "$(bup drecurse -x src)" "src/top
+src/mnt-link
+src/mnt-2/
+src/mnt-1/
+src/1
+src/"
+
+WVSTART 'index/save/restore'
+
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASS "$top/dev/compare-trees" -c src/ src-restore/src/
+
+# Test -x when none of the mount points are explicitly indexed
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-link
+./top"
+
+# Test -x when a mount point is explicitly indexed. This should
+# include the mount.
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src src/mnt-2
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-2/4
+./mnt-link
+./top"
+
+# Test -x when a direct link to a mount point is explicitly indexed.
+# This should *not* include the mount.
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src src/mnt-link
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-link
+./top"
+
+# Test -x when a path that resolves to a mount point is explicitly
+# indexed (i.e. dir symlnks that redirect the leaf to a mount point).
+# This should include the mount.
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src src/top/top/mnt-2
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-2/4
+./mnt-link
+./top"
+
+WVPASS cd "$top"
+WVPASS umount "$tmpdir/src/mnt-1"
+WVPASS umount "$tmpdir/src/mnt-2"
+WVPASS rm -r "$tmpdir"
--- /dev/null
+
+from __future__ import absolute_import, print_function
+
+from random import randint
+from subprocess import CalledProcessError, check_output
+from sys import stderr, stdout
+
+
+from test.lib.wvpytest import wvpasseq
+
+def rand_bytes(n):
+ return bytes([randint(1, 255) for x in range(n)])
+
+def test_argv():
+ for trial in range(100):
+ cmd = [b'dev/echo-argv-bytes', rand_bytes(randint(1, 32))]
+ out = check_output(cmd)
+ wvpasseq(b'\0\n'.join(cmd) + b'\0\n', out)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from os import chdir, mkdir, symlink, unlink
+from subprocess import PIPE
+from time import localtime, strftime, tzset
+
+from bup.compat import environ
+from bup.helpers import unlink as unlink_if_exists
+from buptest import ex, exo
+from wvpytest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
+import bup.path
+
+bup_cmd = bup.path.exe()
+
+def bup(*args, **kwargs):
+ if 'stdout' not in kwargs:
+ return exo((bup_cmd,) + args, **kwargs)
+ return ex((bup_cmd,) + args, **kwargs)
+
+def jl(*lines):
+ return b''.join(line + b'\n' for line in lines)
+
+environ[b'GIT_AUTHOR_NAME'] = b'bup test'
+environ[b'GIT_COMMITTER_NAME'] = b'bup test'
+environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+
+import subprocess
+
+def test_ftp(tmpdir):
+ environ[b'BUP_DIR'] = tmpdir + b'/repo'
+ environ[b'GIT_DIR'] = tmpdir + b'/repo'
+ environ[b'TZ'] = b'UTC'
+ tzset()
+
+ chdir(tmpdir)
+ mkdir(b'src')
+ chdir(b'src')
+ mkdir(b'dir')
+ with open(b'file-1', 'wb') as f:
+ f.write(b'excitement!\n')
+ with open(b'dir/file-2', 'wb') as f:
+ f.write(b'more excitement!\n')
+ symlink(b'file-1', b'file-symlink')
+ symlink(b'dir', b'dir-symlink')
+ symlink(b'not-there', b'bad-symlink')
+
+ chdir(tmpdir)
+ bup(b'init')
+ bup(b'index', b'src')
+ bup(b'save', b'-n', b'src', b'--strip', b'src')
+ save_utc = int(exo((b'git', b'show',
+ b'-s', b'--format=%at', b'src')).out.strip())
+ save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
+
+ wvstart('help')
+ wvpasseq(b'Commands: ls cd pwd cat get mget help quit\n',
+ exo((bup_cmd, b'ftp'), input=b'help\n', stderr=PIPE).out)
+
+ wvstart('pwd/cd')
+ wvpasseq(b'/\n', bup(b'ftp', input=b'pwd\n').out)
+ wvpasseq(b'', bup(b'ftp', input=b'cd src\n').out)
+ wvpasseq(b'/src\n', bup(b'ftp', input=jl(b'cd src', b'pwd')).out)
+ wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
+ b'cd ..', b'pwd')).out)
+ wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
+ b'cd ..', b'cd ..',
+ b'pwd')).out)
+ wvpasseq(b'/src/%s/dir\n' % save_name,
+ bup(b'ftp', input=jl(b'cd src/latest/dir-symlink', b'pwd')).out)
+ wvpasseq(b'/src/%s/dir\n' % save_name,
+ bup(b'ftp', input=jl(b'cd src latest dir-symlink', b'pwd')).out)
+ wvpassne(0, bup(b'ftp',
+ input=jl(b'cd src/latest/bad-symlink', b'pwd'),
+ check=False, stdout=None).rc)
+ wvpassne(0, bup(b'ftp',
+ input=jl(b'cd src/latest/not-there', b'pwd'),
+ check=False, stdout=None).rc)
+
+ wvstart('ls')
+ # FIXME: elaborate
+ wvpasseq(b'src\n', bup(b'ftp', input=b'ls\n').out)
+ wvpasseq(save_name + b'\nlatest\n',
+ bup(b'ftp', input=b'ls src\n').out)
+
+ wvstart('cat')
+ wvpasseq(b'excitement!\n',
+ bup(b'ftp', input=b'cat src/latest/file-1\n').out)
+ wvpasseq(b'excitement!\nmore excitement!\n',
+ bup(b'ftp',
+ input=b'cat src/latest/file-1 src/latest/dir/file-2\n').out)
+
+ wvstart('get')
+ bup(b'ftp', input=jl(b'get src/latest/file-1 dest'))
+ with open(b'dest', 'rb') as f:
+ wvpasseq(b'excitement!\n', f.read())
+ unlink(b'dest')
+ bup(b'ftp', input=jl(b'get src/latest/file-symlink dest'))
+ with open(b'dest', 'rb') as f:
+ wvpasseq(b'excitement!\n', f.read())
+ unlink(b'dest')
+ wvpassne(0, bup(b'ftp',
+ input=jl(b'get src/latest/bad-symlink dest'),
+ check=False, stdout=None).rc)
+ wvpassne(0, bup(b'ftp',
+ input=jl(b'get src/latest/not-there'),
+ check=False, stdout=None).rc)
+
+ wvstart('mget')
+ unlink_if_exists(b'file-1')
+ bup(b'ftp', input=jl(b'mget src/latest/file-1'))
+ with open(b'file-1', 'rb') as f:
+ wvpasseq(b'excitement!\n', f.read())
+ unlink_if_exists(b'file-1')
+ unlink_if_exists(b'file-2')
+ bup(b'ftp', input=jl(b'mget src/latest/file-1 src/latest/dir/file-2'))
+ with open(b'file-1', 'rb') as f:
+ wvpasseq(b'excitement!\n', f.read())
+ with open(b'file-2', 'rb') as f:
+ wvpasseq(b'more excitement!\n', f.read())
+ unlink_if_exists(b'file-symlink')
+ bup(b'ftp', input=jl(b'mget src/latest/file-symlink'))
+ with open(b'file-symlink', 'rb') as f:
+ wvpasseq(b'excitement!\n', f.read())
+ wvpassne(0, bup(b'ftp',
+ input=jl(b'mget src/latest/bad-symlink dest'),
+ check=False, stdout=None).rc)
+ # bup mget currently always does pattern matching
+ bup(b'ftp', input=b'mget src/latest/not-there\n')
--- /dev/null
+
+from __future__ import print_function
+from errno import ENOENT
+from itertools import product
+from os import chdir, mkdir, rename
+from shutil import rmtree
+from subprocess import PIPE
+import pytest, re, sys
+
+from bup import compat, path
+from bup.compat import environ, getcwd, items
+from bup.helpers import bquote, merge_dict, unlink
+from bup.io import byte_stream
+from buptest import ex, exo
+from wvpytest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
+import bup.path
+
+
+sys.stdout.flush()
+stdout = byte_stream(sys.stdout)
+
+# FIXME: per-test function
+environ[b'GIT_AUTHOR_NAME'] = b'bup test-get'
+environ[b'GIT_COMMITTER_NAME'] = b'bup test-get'
+environ[b'GIT_AUTHOR_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
+environ[b'GIT_COMMITTER_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
+
+# The clean-repo test can probably be applied more broadly. It was
+# initially just applied to test-pick to catch a bug.
+
+top = getcwd()
+bup_cmd = bup.path.exe()
+
+def rmrf(path):
+ err = [] # because python's scoping mess...
+ def onerror(function, path, excinfo):
+ err.append((function, path, excinfo))
+ rmtree(path, onerror=onerror)
+ if err:
+ function, path, excinfo = err[0]
+ ex_type, ex, traceback = excinfo
+ if (not isinstance(ex, OSError)) or ex.errno != ENOENT:
+ raise ex
+
+def verify_trees_match(path1, path2):
+ global top
+ exr = exo((top + b'/dev/compare-trees', b'-c', path1, path2), check=False)
+ stdout.write(exr.out)
+ sys.stdout.flush()
+ wvcheck(exr.rc == 0, 'process exit %d == 0' % exr.rc)
+
+def verify_rcz(cmd, **kwargs):
+ assert not kwargs.get('check')
+ kwargs['check'] = False
+ result = exo(cmd, **kwargs)
+ stdout.write(result.out)
+ rc = result.proc.returncode
+ wvcheck(rc == 0, 'process exit %d == 0' % rc)
+ return result
+
+# FIXME: multline, or allow opts generally?
+
+def verify_rx(rx, string):
+ wvcheck(re.search(rx, string), 'rx %r matches %r' % (rx, string))
+
+def verify_nrx(rx, string):
+ wvcheck(not re.search(rx, string), "rx %r doesn't match %r" % (rx, string))
+
+def validate_clean_repo():
+ out = verify_rcz((b'git', b'--git-dir', b'get-dest', b'fsck')).out
+ verify_nrx(br'dangling|mismatch|missing|unreachable', out)
+
+def validate_blob(src_id, dest_id):
+ global top
+ rmrf(b'restore-src')
+ rmrf(b'restore-dest')
+ cat_tree = top + b'/dev/git-cat-tree'
+ src_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
+ dest_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
+ wvpasseq(src_blob, dest_blob)
+
+def validate_tree(src_id, dest_id):
+
+ rmrf(b'restore-src')
+ rmrf(b'restore-dest')
+ mkdir(b'restore-src')
+ mkdir(b'restore-dest')
+
+ commit_env = merge_dict(environ, {b'GIT_COMMITTER_DATE': b'2014-01-01 01:01'})
+
+ # Create a commit so the archive contents will have matching timestamps.
+ src_c = exo((b'git', b'--git-dir', b'get-src',
+ b'commit-tree', b'-m', b'foo', src_id),
+ env=commit_env).out.strip()
+ dest_c = exo((b'git', b'--git-dir', b'get-dest',
+ b'commit-tree', b'-m', b'foo', dest_id),
+ env=commit_env).out.strip()
+ exr = verify_rcz(b'git --git-dir get-src archive %s | tar xvf - -C restore-src'
+ % bquote(src_c),
+ shell=True)
+ if exr.rc != 0: return False
+ exr = verify_rcz(b'git --git-dir get-dest archive %s | tar xvf - -C restore-dest'
+ % bquote(dest_c),
+ shell=True)
+ if exr.rc != 0: return False
+
+ # git archive doesn't include an entry for ./.
+ unlink(b'restore-src/pax_global_header')
+ unlink(b'restore-dest/pax_global_header')
+ ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
+ verify_trees_match(b'restore-src/', b'restore-dest/')
+ rmrf(b'restore-src')
+ rmrf(b'restore-dest')
+
+def validate_commit(src_id, dest_id):
+ exr = verify_rcz((b'git', b'--git-dir', b'get-src', b'cat-file', b'commit', src_id))
+ if exr.rc != 0: return False
+ src_cat = exr.out
+ exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'cat-file', b'commit', dest_id))
+ if exr.rc != 0: return False
+ dest_cat = exr.out
+ wvpasseq(src_cat, dest_cat)
+ if src_cat != dest_cat: return False
+
+ rmrf(b'restore-src')
+ rmrf(b'restore-dest')
+ mkdir(b'restore-src')
+ mkdir(b'restore-dest')
+ qsrc = bquote(src_id)
+ qdest = bquote(dest_id)
+ exr = verify_rcz((b'git --git-dir get-src archive ' + qsrc
+ + b' | tar xf - -C restore-src'),
+ shell=True)
+ if exr.rc != 0: return False
+ exr = verify_rcz((b'git --git-dir get-dest archive ' + qdest +
+ b' | tar xf - -C restore-dest'),
+ shell=True)
+ if exr.rc != 0: return False
+
+ # git archive doesn't include an entry for ./.
+ ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
+ verify_trees_match(b'restore-src/', b'restore-dest/')
+ rmrf(b'restore-src')
+ rmrf(b'restore-dest')
+
+def _validate_save(orig_dir, save_path, commit_id, tree_id):
+ global bup_cmd
+ rmrf(b'restore')
+ exr = verify_rcz((bup_cmd, b'-d', b'get-dest',
+ b'restore', b'-C', b'restore', save_path + b'/.'))
+ if exr.rc: return False
+ verify_trees_match(orig_dir + b'/', b'restore/')
+ if tree_id:
+ # FIXME: double check that get-dest is correct
+ exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'ls-tree', tree_id))
+ if exr.rc: return False
+ cat = verify_rcz((b'git', b'--git-dir', b'get-dest',
+ b'cat-file', b'commit', commit_id))
+ if cat.rc: return False
+ wvpasseq(b'tree ' + tree_id, cat.out.splitlines()[0])
+
+# FIXME: re-merge save and new_save?
+
+def validate_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
+ get_out):
+ out = get_out.splitlines()
+ print('blarg: out', repr(out), file=sys.stderr)
+ wvpasseq(2, len(out))
+ get_tree_id = out[0]
+ get_commit_id = out[1]
+ wvpasseq(tree_id, get_tree_id)
+ wvpasseq(commit_id, get_commit_id)
+ _validate_save(orig_value, dest_name + restore_subpath, commit_id, tree_id)
+
+def validate_new_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
+ get_out):
+ out = get_out.splitlines()
+ wvpasseq(2, len(out))
+ get_tree_id = out[0]
+ get_commit_id = out[1]
+ wvpasseq(tree_id, get_tree_id)
+ wvpassne(commit_id, get_commit_id)
+ _validate_save(orig_value, dest_name + restore_subpath, get_commit_id, tree_id)
+
+def validate_tagged_save(tag_name, restore_subpath,
+ commit_id, tree_id, orig_value, get_out):
+ out = get_out.splitlines()
+ wvpasseq(1, len(out))
+ get_tag_id = out[0]
+ wvpasseq(commit_id, get_tag_id)
+ # Make sure tmp doesn't already exist.
+ exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', b'tmp-branch-for-tag'),
+ check=False)
+ wvpasseq(1, exr.rc)
+
+ ex((b'git', b'--git-dir', b'get-dest', b'branch', b'tmp-branch-for-tag',
+ b'refs/tags/' + tag_name))
+ _validate_save(orig_value, b'tmp-branch-for-tag/latest' + restore_subpath,
+ commit_id, tree_id)
+ ex((b'git', b'--git-dir', b'get-dest', b'branch', b'-D', b'tmp-branch-for-tag'))
+
+def validate_new_tagged_commit(tag_name, commit_id, tree_id, get_out):
+ out = get_out.splitlines()
+ wvpasseq(1, len(out))
+ get_tag_id = out[0]
+ wvpassne(commit_id, get_tag_id)
+ validate_tree(tree_id, tag_name + b':')
+
+
+def _run_get(disposition, method, what):
+ print('run_get:', repr((disposition, method, what)), file=sys.stderr)
+ global bup_cmd
+
+ if disposition == 'get':
+ get_cmd = (bup_cmd, b'-d', b'get-dest',
+ b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
+ elif disposition == 'get-on':
+ get_cmd = (bup_cmd, b'-d', b'get-dest',
+ b'on', b'-', b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
+ elif disposition == 'get-to':
+ get_cmd = (bup_cmd, b'-d', b'get-dest',
+ b'get', b'-vvct', b'--print-tags', b'-s', b'get-src',
+ b'-r', b'-:' + getcwd() + b'/get-dest')
+ else:
+ raise Exception('error: unexpected get disposition ' + repr(disposition))
+
+ if isinstance(what, bytes):
+ cmd = get_cmd + (method, what)
+ else:
+ assert not isinstance(what, str) # python 3 sanity check
+ if method in (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
+ b'--replace'):
+ method += b':'
+ src, dest = what
+ cmd = get_cmd + (method, src, dest)
+ result = exo(cmd, check=False, stderr=PIPE)
+ fsck = ex((bup_cmd, b'-d', b'get-dest', b'fsck'), check=False)
+ wvpasseq(0, fsck.rc)
+ return result
+
+def run_get(disposition, method, what=None, given=None):
+ global bup_cmd
+ rmrf(b'get-dest')
+ ex((bup_cmd, b'-d', b'get-dest', b'init'))
+
+ if given:
+ # FIXME: replace bup-get with independent commands as is feasible
+ exr = _run_get(disposition, b'--replace', given)
+ assert not exr.rc
+ return _run_get(disposition, method, what)
+
+def _test_universal(get_disposition, src_info):
+ methods = (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
+ b'--replace', b'--unnamed')
+ for method in methods:
+ mmsg = method.decode('ascii')
+ wvstart(get_disposition + ' ' + mmsg + ', missing source, fails')
+ exr = run_get(get_disposition, method, b'not-there')
+ wvpassne(0, exr.rc)
+ verify_rx(br'cannot find source', exr.err)
+ for method in methods:
+ mmsg = method.decode('ascii')
+ wvstart(get_disposition + ' ' + mmsg + ' / fails')
+ exr = run_get(get_disposition, method, b'/')
+ wvpassne(0, exr.rc)
+ verify_rx(b'cannot fetch entire repository', exr.err)
+
+def verify_only_refs(**kwargs):
+ for kind, refs in items(kwargs):
+ if kind == 'heads':
+ abs_refs = [b'refs/heads/' + ref for ref in refs]
+ karg = b'--heads'
+ elif kind == 'tags':
+ abs_refs = [b'refs/tags/' + ref for ref in refs]
+ karg = b'--tags'
+ else:
+ raise TypeError('unexpected keyword argument %r' % kind)
+ if abs_refs:
+ verify_rcz([b'git', b'--git-dir', b'get-dest',
+ b'show-ref', b'--verify', karg] + abs_refs)
+ exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
+ check=False)
+ wvpasseq(0, exr.rc)
+ expected_refs = sorted(abs_refs)
+ repo_refs = sorted([x.split()[1] for x in exr.out.splitlines()])
+ wvpasseq(expected_refs, repo_refs)
+ else:
+ # FIXME: can we just check "git show-ref --heads == ''"?
+ exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
+ check=False)
+ wvpasseq(1, exr.rc)
+ wvpasseq(b'', exr.out.strip())
+
+def _test_replace(get_disposition, src_info):
+ print('blarg:', repr(src_info), file=sys.stderr)
+
+ wvstart(get_disposition + ' --replace to root fails')
+ for item in (b'.tag/tinyfile',
+ b'src/latest' + src_info['tinyfile-path'],
+ b'.tag/subtree',
+ b'src/latest' + src_info['subtree-vfs-path'],
+ b'.tag/commit-1',
+ b'src/latest',
+ b'src'):
+ exr = run_get(get_disposition, b'--replace', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'impossible; can only overwrite branch or tag', exr.err)
+
+ tinyfile_id = src_info['tinyfile-id']
+ tinyfile_path = src_info['tinyfile-path']
+ subtree_vfs_path = src_info['subtree-vfs-path']
+ subtree_id = src_info['subtree-id']
+ commit_2_id = src_info['commit-2-id']
+ tree_2_id = src_info['tree-2-id']
+
+ # Anything to tag
+ existing_items = {'nothing' : None,
+ 'blob' : (b'.tag/tinyfile', b'.tag/obj'),
+ 'tree' : (b'.tag/tree-1', b'.tag/obj'),
+ 'commit': (b'.tag/commit-1', b'.tag/obj')}
+ for ex_type, ex_ref in items(existing_items):
+ wvstart(get_disposition + ' --replace ' + ex_type + ' with blob tag')
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ exr = run_get(get_disposition, b'--replace', (item ,b'.tag/obj'),
+ given=ex_ref)
+ wvpasseq(0, exr.rc)
+ validate_blob(tinyfile_id, tinyfile_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+ wvstart(get_disposition + ' --replace ' + ex_type + ' with tree tag')
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
+ given=ex_ref)
+ validate_tree(subtree_id, subtree_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+ wvstart(get_disposition + ' --replace ' + ex_type + ' with commitish tag')
+ for item in (b'.tag/commit-2', b'src/latest', b'src'):
+ exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
+ given=ex_ref)
+ validate_tagged_save(b'obj', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ # Committish to branch.
+ existing_items = (('nothing', None),
+ ('branch', (b'.tag/commit-1', b'obj')))
+ for ex_type, ex_ref in existing_items:
+ for item_type, item in (('commit', b'.tag/commit-2'),
+ ('save', b'src/latest'),
+ ('branch', b'src')):
+ wvstart(get_disposition + ' --replace '
+ + ex_type + ' with ' + item_type)
+ exr = run_get(get_disposition, b'--replace', (item, b'obj'),
+ given=ex_ref)
+ validate_save(b'obj/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+ # Not committish to branch
+ existing_items = (('nothing', None),
+ ('branch', (b'.tag/commit-1', b'obj')))
+ for ex_type, ex_ref in existing_items:
+ for item_type, item in (('blob', b'.tag/tinyfile'),
+ ('blob', b'src/latest' + tinyfile_path),
+ ('tree', b'.tag/subtree'),
+ ('tree', b'src/latest' + subtree_vfs_path)):
+ wvstart(get_disposition + ' --replace branch with '
+ + item_type + ' given ' + ex_type + ' fails')
+
+ exr = run_get(get_disposition, b'--replace', (item, b'obj'),
+ given=ex_ref)
+ wvpassne(0, exr.rc)
+ verify_rx(br'cannot overwrite branch with .+ for', exr.err)
+
+ wvstart(get_disposition + ' --replace, implicit destinations')
+
+ exr = run_get(get_disposition, b'--replace', b'src')
+ validate_save(b'src/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'src',), tags=[])
+
+ exr = run_get(get_disposition, b'--replace', b'.tag/commit-2')
+ validate_tagged_save(b'commit-2', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=[], tags=(b'commit-2',))
+
+def _test_ff(get_disposition, src_info):
+
+ wvstart(get_disposition + ' --ff to root fails')
+ tinyfile_path = src_info['tinyfile-path']
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ exr = run_get(get_disposition, b'--ff', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'source for .+ must be a branch, save, or commit', exr.err)
+ subtree_vfs_path = src_info['subtree-vfs-path']
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ exr = run_get(get_disposition, b'--ff', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'is impossible; can only --append a tree to a branch',
+ exr.err)
+ for item in (b'.tag/commit-1', b'src/latest', b'src'):
+ exr = run_get(get_disposition, b'--ff', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'destination for .+ is a root, not a branch', exr.err)
+
+ wvstart(get_disposition + ' --ff of not-committish fails')
+ for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ # FIXME: use get_item elsewhere?
+ for given, get_item in ((None, (src, b'obj')),
+ (None, (src, b'.tag/obj')),
+ ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
+ exr = run_get(get_disposition, b'--ff', get_item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'must be a branch, save, or commit', exr.err)
+ for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ for given, get_item in ((None, (src, b'obj')),
+ (None, (src, b'.tag/obj')),
+ ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
+ exr = run_get(get_disposition, b'--ff', get_item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'can only --append a tree to a branch', exr.err)
+
+ wvstart(get_disposition + ' --ff committish, ff possible')
+ save_2 = src_info['save-2']
+ for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+ for given, get_item, complaint in \
+ ((None, (src, b'.tag/obj'),
+ br'destination .+ must be a valid branch name'),
+ ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a blob, not a branch'),
+ ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a tree, not a branch'),
+ ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a tagged commit, not a branch'),
+ ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a tagged commit, not a branch')):
+ exr = run_get(get_disposition, b'--ff', get_item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(complaint, exr.err)
+ # FIXME: use src or item and given or existing consistently in loops...
+ commit_2_id = src_info['commit-2-id']
+ tree_2_id = src_info['tree-2-id']
+ for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+ for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
+ exr = run_get(get_disposition, b'--ff', (src, b'obj'), given=given)
+ wvpasseq(0, exr.rc)
+ validate_save(b'obj/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+ wvstart(get_disposition + ' --ff, implicit destinations')
+ for item in (b'src', b'src/latest'):
+ exr = run_get(get_disposition, b'--ff', item)
+ wvpasseq(0, exr.rc)
+
+ ex((b'find', b'get-dest/refs'))
+ ex((bup_cmd, b'-d', b'get-dest', b'ls'))
+
+ validate_save(b'src/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ #verify_only_refs(heads=('src',), tags=[])
+
+ wvstart(get_disposition + ' --ff, ff impossible')
+ for given, get_item in (((b'unrelated-branch', b'src'), b'src'),
+ ((b'.tag/commit-2', b'src'), (b'.tag/commit-1', b'src'))):
+ exr = run_get(get_disposition, b'--ff', get_item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'destination is not an ancestor of source', exr.err)
+
+def _test_append(get_disposition, src_info):
+ tinyfile_path = src_info['tinyfile-path']
+ subtree_vfs_path = src_info['subtree-vfs-path']
+
+ wvstart(get_disposition + ' --append to root fails')
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ exr = run_get(get_disposition, b'--append', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'source for .+ must be a branch, save, commit, or tree',
+ exr.err)
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
+ b'.tag/commit-1', b'src/latest', b'src'):
+ exr = run_get(get_disposition, b'--append', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'destination for .+ is a root, not a branch', exr.err)
+
+ wvstart(get_disposition + ' --append of not-treeish fails')
+ for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ for given, item in ((None, (src, b'obj')),
+ (None, (src, b'.tag/obj')),
+ ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
+ ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
+ exr = run_get(get_disposition, b'--append', item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'must be a branch, save, commit, or tree', exr.err)
+
+ wvstart(get_disposition + ' --append committish failure cases')
+ save_2 = src_info['save-2']
+ for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
+ b'.tag/commit-2', b'src/' + save_2, b'src'):
+ for given, item, complaint in \
+ ((None, (src, b'.tag/obj'),
+ br'destination .+ must be a valid branch name'),
+ ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a blob, not a branch'),
+ ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a tree, not a branch'),
+ ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a tagged commit, not a branch'),
+ ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
+ br'destination .+ is a tagged commit, not a branch')):
+ exr = run_get(get_disposition, b'--append', item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(complaint, exr.err)
+
+ wvstart(get_disposition + ' --append committish')
+ commit_2_id = src_info['commit-2-id']
+ tree_2_id = src_info['tree-2-id']
+ for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+ for existing in (None, (b'.tag/commit-1', b'obj'),
+ (b'.tag/commit-2', b'obj'),
+ (b'unrelated-branch', b'obj')):
+ exr = run_get(get_disposition, b'--append', (item, b'obj'),
+ given=existing)
+ wvpasseq(0, exr.rc)
+ validate_new_save(b'obj/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+ # Append ancestor
+ save_1 = src_info['save-1']
+ commit_1_id = src_info['commit-1-id']
+ tree_1_id = src_info['tree-1-id']
+ for item in (b'.tag/commit-1', b'src/' + save_1, b'src-1'):
+ exr = run_get(get_disposition, b'--append', (item, b'obj'),
+ given=(b'.tag/commit-2', b'obj'))
+ wvpasseq(0, exr.rc)
+ validate_new_save(b'obj/latest', getcwd() + b'/src',
+ commit_1_id, tree_1_id, b'src-1', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+ wvstart(get_disposition + ' --append tree')
+ subtree_path = src_info['subtree-path']
+ subtree_id = src_info['subtree-id']
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ for existing in (None,
+ (b'.tag/commit-1', b'obj'),
+ (b'.tag/commit-2', b'obj')):
+ exr = run_get(get_disposition, b'--append', (item, b'obj'),
+ given=existing)
+ wvpasseq(0, exr.rc)
+ validate_new_save(b'obj/latest', b'/', None, subtree_id, subtree_path,
+ exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+ wvstart(get_disposition + ' --append, implicit destinations')
+
+ for item in (b'src', b'src/latest'):
+ exr = run_get(get_disposition, b'--append', item)
+ wvpasseq(0, exr.rc)
+ validate_new_save(b'src/latest', getcwd() + b'/src', commit_2_id, tree_2_id,
+ b'src-2', exr.out)
+ verify_only_refs(heads=(b'src',), tags=[])
+
+def _test_pick_common(get_disposition, src_info, force=False):
+ flavor = b'--force-pick' if force else b'--pick'
+ flavormsg = flavor.decode('ascii')
+ tinyfile_path = src_info['tinyfile-path']
+ subtree_vfs_path = src_info['subtree-vfs-path']
+
+ wvstart(get_disposition + ' ' + flavormsg + ' to root fails')
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
+ exr = run_get(get_disposition, flavor, (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'can only pick a commit or save', exr.err)
+ for item in (b'.tag/commit-1', b'src/latest'):
+ exr = run_get(get_disposition, flavor, (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'destination is not a tag or branch', exr.err)
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ exr = run_get(get_disposition, flavor, (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'is impossible; can only --append a tree', exr.err)
+
+ wvstart(get_disposition + ' ' + flavormsg + ' of blob or branch fails')
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
+ for given, get_item in ((None, (item, b'obj')),
+ (None, (item, b'.tag/obj')),
+ ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
+ ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
+ ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
+ ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
+ exr = run_get(get_disposition, flavor, get_item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'impossible; can only pick a commit or save', exr.err)
+
+ wvstart(get_disposition + ' ' + flavormsg + ' of tree fails')
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ for given, get_item in ((None, (item, b'obj')),
+ (None, (item, b'.tag/obj')),
+ ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
+ ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
+ ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
+ ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
+ exr = run_get(get_disposition, flavor, get_item, given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'impossible; can only --append a tree', exr.err)
+
+ save_2 = src_info['save-2']
+ commit_2_id = src_info['commit-2-id']
+ tree_2_id = src_info['tree-2-id']
+ # FIXME: these two wvstart texts?
+ if force:
+ wvstart(get_disposition + ' ' + flavormsg + ' commit/save to existing tag')
+ for item in (b'.tag/commit-2', b'src/' + save_2):
+ for given in ((b'.tag/tinyfile', b'.tag/obj'),
+ (b'.tag/tree-1', b'.tag/obj'),
+ (b'.tag/commit-1', b'.tag/obj')):
+ exr = run_get(get_disposition, flavor, (item, b'.tag/obj'),
+ given=given)
+ wvpasseq(0, exr.rc)
+ validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id,
+ exr.out)
+ verify_only_refs(heads=[], tags=(b'obj',))
+ else: # --pick
+ wvstart(get_disposition + ' ' + flavormsg
+ + ' commit/save to existing tag fails')
+ for item in (b'.tag/commit-2', b'src/' + save_2):
+ for given in ((b'.tag/tinyfile', b'.tag/obj'),
+ (b'.tag/tree-1', b'.tag/obj'),
+ (b'.tag/commit-1', b'.tag/obj')):
+ exr = run_get(get_disposition, flavor, (item, b'.tag/obj'), given=given)
+ wvpassne(0, exr.rc)
+ verify_rx(br'cannot overwrite existing tag', exr.err)
+
+ wvstart(get_disposition + ' ' + flavormsg + ' commit/save to tag')
+ for item in (b'.tag/commit-2', b'src/' + save_2):
+ exr = run_get(get_disposition, flavor, (item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_clean_repo()
+ validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id, exr.out)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ wvstart(get_disposition + ' ' + flavormsg + ' commit/save to branch')
+ for item in (b'.tag/commit-2', b'src/' + save_2):
+ for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
+ exr = run_get(get_disposition, flavor, (item, b'obj'), given=given)
+ wvpasseq(0, exr.rc)
+ validate_clean_repo()
+ validate_new_save(b'obj/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+ wvstart(get_disposition + ' ' + flavormsg
+ + ' commit/save unrelated commit to branch')
+ for item in(b'.tag/commit-2', b'src/' + save_2):
+ exr = run_get(get_disposition, flavor, (item, b'obj'),
+ given=(b'unrelated-branch', b'obj'))
+ wvpasseq(0, exr.rc)
+ validate_clean_repo()
+ validate_new_save(b'obj/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+ wvstart(get_disposition + ' ' + flavormsg + ' commit/save ancestor to branch')
+ save_1 = src_info['save-1']
+ commit_1_id = src_info['commit-1-id']
+ tree_1_id = src_info['tree-1-id']
+ for item in (b'.tag/commit-1', b'src/' + save_1):
+ exr = run_get(get_disposition, flavor, (item, b'obj'),
+ given=(b'.tag/commit-2', b'obj'))
+ wvpasseq(0, exr.rc)
+ validate_clean_repo()
+ validate_new_save(b'obj/latest', getcwd() + b'/src',
+ commit_1_id, tree_1_id, b'src-1', exr.out)
+ verify_only_refs(heads=(b'obj',), tags=[])
+
+
+ wvstart(get_disposition + ' ' + flavormsg + ', implicit destinations')
+ exr = run_get(get_disposition, flavor, b'.tag/commit-2')
+ wvpasseq(0, exr.rc)
+ validate_clean_repo()
+ validate_new_tagged_commit(b'commit-2', commit_2_id, tree_2_id, exr.out)
+ verify_only_refs(heads=[], tags=(b'commit-2',))
+
+ exr = run_get(get_disposition, flavor, b'src/latest')
+ wvpasseq(0, exr.rc)
+ validate_clean_repo()
+ validate_new_save(b'src/latest', getcwd() + b'/src',
+ commit_2_id, tree_2_id, b'src-2', exr.out)
+ verify_only_refs(heads=(b'src',), tags=[])
+
+def _test_pick_force(get_disposition, src_info):
+ _test_pick_common(get_disposition, src_info, force=True)
+
+def _test_pick_noforce(get_disposition, src_info):
+ _test_pick_common(get_disposition, src_info, force=False)
+
+def _test_new_tag(get_disposition, src_info):
+ tinyfile_id = src_info['tinyfile-id']
+ tinyfile_path = src_info['tinyfile-path']
+ commit_2_id = src_info['commit-2-id']
+ tree_2_id = src_info['tree-2-id']
+ subtree_id = src_info['subtree-id']
+ subtree_vfs_path = src_info['subtree-vfs-path']
+
+ wvstart(get_disposition + ' --new-tag to root fails')
+ for item in (b'.tag/tinyfile',
+ b'src/latest' + tinyfile_path,
+ b'.tag/subtree',
+ b'src/latest' + subtree_vfs_path,
+ b'.tag/commit-1',
+ b'src/latest',
+ b'src'):
+ exr = run_get(get_disposition, b'--new-tag', (item, b'/'))
+ wvpassne(0, exr.rc)
+ verify_rx(br'destination for .+ must be a VFS tag', exr.err)
+
+ # Anything to new tag.
+ wvstart(get_disposition + ' --new-tag, blob tag')
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_blob(tinyfile_id, tinyfile_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ wvstart(get_disposition + ' --new-tag, tree tag')
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_tree(subtree_id, subtree_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ wvstart(get_disposition + ' --new-tag, committish tag')
+ for item in (b'.tag/commit-2', b'src/latest', b'src'):
+ exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_tagged_save(b'obj', getcwd() + b'/src/', commit_2_id, tree_2_id,
+ b'src-2', exr.out)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ # Anything to existing tag (fails).
+ for ex_type, ex_tag in (('blob', (b'.tag/tinyfile', b'.tag/obj')),
+ ('tree', (b'.tag/tree-1', b'.tag/obj')),
+ ('commit', (b'.tag/commit-1', b'.tag/obj'))):
+ for item_type, item in (('blob tag', b'.tag/tinyfile'),
+ ('blob path', b'src/latest' + tinyfile_path),
+ ('tree tag', b'.tag/subtree'),
+ ('tree path', b'src/latest' + subtree_vfs_path),
+ ('commit tag', b'.tag/commit-2'),
+ ('save', b'src/latest'),
+ ('branch', b'src')):
+ wvstart(get_disposition + ' --new-tag of ' + item_type
+ + ', given existing ' + ex_type + ' tag, fails')
+ exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'),
+ given=ex_tag)
+ wvpassne(0, exr.rc)
+ verify_rx(br'cannot overwrite existing tag .* \(requires --replace\)',
+ exr.err)
+
+ # Anything to branch (fails).
+ for ex_type, ex_tag in (('nothing', None),
+ ('blob', (b'.tag/tinyfile', b'.tag/obj')),
+ ('tree', (b'.tag/tree-1', b'.tag/obj')),
+ ('commit', (b'.tag/commit-1', b'.tag/obj'))):
+ for item_type, item in (('blob tag', b'.tag/tinyfile'),
+ ('blob path', b'src/latest' + tinyfile_path),
+ ('tree tag', b'.tag/subtree'),
+ ('tree path', b'src/latest' + subtree_vfs_path),
+ ('commit tag', b'.tag/commit-2'),
+ ('save', b'src/latest'),
+ ('branch', b'src')):
+ wvstart(get_disposition + ' --new-tag to branch of ' + item_type
+ + ', given existing ' + ex_type + ' tag, fails')
+ exr = run_get(get_disposition, b'--new-tag', (item, b'obj'),
+ given=ex_tag)
+ wvpassne(0, exr.rc)
+ verify_rx(br'destination for .+ must be a VFS tag', exr.err)
+
+ wvstart(get_disposition + ' --new-tag, implicit destinations')
+ exr = run_get(get_disposition, b'--new-tag', b'.tag/commit-2')
+ wvpasseq(0, exr.rc)
+ validate_tagged_save(b'commit-2', getcwd() + b'/src/', commit_2_id, tree_2_id,
+ b'src-2', exr.out)
+ verify_only_refs(heads=[], tags=(b'commit-2',))
+
+def _test_unnamed(get_disposition, src_info):
+ tinyfile_id = src_info['tinyfile-id']
+ tinyfile_path = src_info['tinyfile-path']
+ subtree_vfs_path = src_info['subtree-vfs-path']
+ wvstart(get_disposition + ' --unnamed to root fails')
+ for item in (b'.tag/tinyfile',
+ b'src/latest' + tinyfile_path,
+ b'.tag/subtree',
+ b'src/latest' + subtree_vfs_path,
+ b'.tag/commit-1',
+ b'src/latest',
+ b'src'):
+ for ex_ref in (None, (item, b'.tag/obj')):
+ exr = run_get(get_disposition, b'--unnamed', (item, b'/'),
+ given=ex_ref)
+ wvpassne(0, exr.rc)
+ verify_rx(br'usage: bup get ', exr.err)
+
+ wvstart(get_disposition + ' --unnamed file')
+ for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+ exr = run_get(get_disposition, b'--unnamed', item)
+ wvpasseq(0, exr.rc)
+ validate_blob(tinyfile_id, tinyfile_id)
+ verify_only_refs(heads=[], tags=[])
+
+ exr = run_get(get_disposition, b'--unnamed', item,
+ given=(item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_blob(tinyfile_id, tinyfile_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ wvstart(get_disposition + ' --unnamed tree')
+ subtree_id = src_info['subtree-id']
+ for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+ exr = run_get(get_disposition, b'--unnamed', item)
+ wvpasseq(0, exr.rc)
+ validate_tree(subtree_id, subtree_id)
+ verify_only_refs(heads=[], tags=[])
+
+ exr = run_get(get_disposition, b'--unnamed', item,
+ given=(item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_tree(subtree_id, subtree_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+ wvstart(get_disposition + ' --unnamed committish')
+ save_2 = src_info['save-2']
+ commit_2_id = src_info['commit-2-id']
+ for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+ exr = run_get(get_disposition, b'--unnamed', item)
+ wvpasseq(0, exr.rc)
+ validate_commit(commit_2_id, commit_2_id)
+ verify_only_refs(heads=[], tags=[])
+
+ exr = run_get(get_disposition, b'--unnamed', item,
+ given=(item, b'.tag/obj'))
+ wvpasseq(0, exr.rc)
+ validate_commit(commit_2_id, commit_2_id)
+ verify_only_refs(heads=[], tags=(b'obj',))
+
+def create_get_src():
+ global bup_cmd, src_info
+ wvstart('preparing')
+ ex((bup_cmd, b'-d', b'get-src', b'init'))
+
+ mkdir(b'src')
+ open(b'src/unrelated', 'a').close()
+ ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+ ex((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'unrelated-branch', b'src'))
+
+ ex((bup_cmd, b'-d', b'get-src', b'index', b'--clear'))
+ rmrf(b'src')
+ mkdir(b'src')
+ open(b'src/zero', 'a').close()
+ ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+ exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
+ out = exr.out.splitlines()
+ tree_0_id = out[0]
+ commit_0_id = out[-1]
+ exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
+ save_0 = exr.out.splitlines()[0]
+ ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-0', b'src'))
+ ex((b'cp', b'-RPp', b'src', b'src-0'))
+
+ rmrf(b'src')
+ mkdir(b'src')
+ mkdir(b'src/x')
+ mkdir(b'src/x/y')
+ ex((bup_cmd + b' -d get-src random 1k > src/1'), shell=True)
+ ex((bup_cmd + b' -d get-src random 1k > src/x/2'), shell=True)
+ ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+ exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
+ out = exr.out.splitlines()
+ tree_1_id = out[0]
+ commit_1_id = out[-1]
+ exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
+ save_1 = exr.out.splitlines()[1]
+ ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-1', b'src'))
+ ex((b'cp', b'-RPp', b'src', b'src-1'))
+
+ # Make a copy the current state of src so we'll have an ancestor.
+ ex((b'cp', b'-RPp',
+ b'get-src/refs/heads/src', b'get-src/refs/heads/src-ancestor'))
+
+ with open(b'src/tiny-file', 'ab') as f: f.write(b'xyzzy')
+ ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+ ex((bup_cmd, b'-d', b'get-src', b'tick')) # Ensure the save names differ
+ exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
+ out = exr.out.splitlines()
+ tree_2_id = out[0]
+ commit_2_id = out[-1]
+ exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
+ save_2 = exr.out.splitlines()[2]
+ rename(b'src', b'src-2')
+
+ src_root = getcwd() + b'/src'
+
+ subtree_path = b'src-2/x'
+ subtree_vfs_path = src_root + b'/x'
+
+ # No support for "ls -d", so grep...
+ exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + src_root))
+ out = exr.out.splitlines()
+ subtree_id = None
+ for line in out:
+ if b'x' in line:
+ subtree_id = line.split()[0]
+ assert(subtree_id)
+
+ # With a tiny file, we'll get a single blob, not a chunked tree
+ tinyfile_path = src_root + b'/tiny-file'
+ exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + tinyfile_path))
+ tinyfile_id = exr.out.splitlines()[0].split()[0]
+
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'tinyfile', tinyfile_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'subtree', subtree_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-0', tree_0_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-1', tree_1_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-2', tree_2_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-0', commit_0_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-1', commit_1_id))
+ ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-2', commit_2_id))
+ ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-1', commit_1_id))
+ ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-2', commit_2_id))
+
+ return {'tinyfile-path' : tinyfile_path,
+ 'tinyfile-id' : tinyfile_id,
+ 'subtree-id' : subtree_id,
+ 'tree-0-id' : tree_0_id,
+ 'tree-1-id' : tree_1_id,
+ 'tree-2-id' : tree_2_id,
+ 'commit-0-id' : commit_0_id,
+ 'commit-1-id' : commit_1_id,
+ 'commit-2-id' : commit_2_id,
+ 'save-1' : save_1,
+ 'save-2' : save_2,
+ 'subtree-path' : subtree_path,
+ 'subtree-vfs-path' : subtree_vfs_path}
+
+# FIXME: this fails in a strange way:
+# WVPASS given nothing get --ff not-there
+
+dispositions_to_test = ('get',)
+
+if int(environ.get(b'BUP_TEST_LEVEL', b'0')) >= 11:
+ dispositions_to_test += ('get-on', 'get-to')
+
+categories = ('replace', 'universal', 'ff', 'append', 'pick_force', 'pick_noforce', 'new_tag', 'unnamed')
+
+@pytest.mark.parametrize("disposition,category", product(dispositions_to_test, categories))
+def test_get(tmpdir, disposition, category):
+ chdir(tmpdir)
+ try:
+ src_info = create_get_src()
+ globals().get('_test_' + category)(disposition, src_info)
+ finally:
+ chdir(top)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from collections import defaultdict
+from itertools import chain, dropwhile, groupby, takewhile
+from os import chdir
+from random import choice, randint
+from shutil import copytree, rmtree
+from subprocess import PIPE
+from sys import stderr
+from time import localtime, strftime, time, tzset
+import random, sys
+
+if sys.version_info[:2] >= (3, 5):
+ from difflib import diff_bytes, unified_diff
+else:
+ from difflib import unified_diff
+
+from bup import compat
+from bup.compat import environ
+from bup.helpers import partition, period_as_secs, readpipe
+from bup.io import byte_stream
+from buptest import ex, exo
+from wvpytest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
+import bup.path
+
+if sys.version_info[:2] < (3, 5):
+ def diff_bytes(_, *args):
+ return unified_diff(*args)
+
+def create_older_random_saves(n, start_utc, end_utc):
+ with open(b'foo', 'wb') as f:
+ pass
+ ex([b'git', b'add', b'foo'])
+ utcs = set()
+ while len(utcs) != n:
+ utcs.add(randint(start_utc, end_utc))
+ utcs = sorted(utcs)
+ for utc in utcs:
+ with open(b'foo', 'wb') as f:
+ f.write(b'%d\n' % utc)
+ ex([b'git', b'commit', b'--date', b'%d' % utc, b'-qam', b'%d' % utc])
+ ex([b'git', b'gc', b'--aggressive'])
+ return utcs
+
+# There is corresponding code in bup for some of this, but the
+# computation method is different here, in part so that the test can
+# provide a more effective cross-check.
+
+period_kinds = [b'all', b'dailies', b'monthlies', b'yearlies']
+period_scale = {b's': 1,
+ b'min': 60,
+ b'h': 60 * 60,
+ b'd': 60 * 60 * 24,
+ b'w': 60 * 60 * 24 * 7,
+ b'm': 60 * 60 * 24 * 31,
+ b'y': 60 * 60 * 24 * 366}
+period_scale_kinds = list(period_scale.keys())
+
+def expected_retentions(utcs, utc_start, spec):
+ if not spec:
+ return utcs
+ utcs = sorted(utcs, reverse=True)
+ period_start = dict(spec)
+ for kind, duration in compat.items(period_start):
+ period_start[kind] = utc_start - period_as_secs(duration)
+ period_start = defaultdict(lambda: float('inf'), period_start)
+
+ all = list(takewhile(lambda x: x >= period_start[b'all'], utcs))
+ utcs = list(dropwhile(lambda x: x >= period_start[b'all'], utcs))
+
+ matches = takewhile(lambda x: x >= period_start[b'dailies'], utcs)
+ dailies = [max(day_utcs) for yday, day_utcs
+ in groupby(matches, lambda x: localtime(x).tm_yday)]
+ utcs = list(dropwhile(lambda x: x >= period_start[b'dailies'], utcs))
+
+ matches = takewhile(lambda x: x >= period_start[b'monthlies'], utcs)
+ monthlies = [max(month_utcs) for month, month_utcs
+ in groupby(matches, lambda x: localtime(x).tm_mon)]
+ utcs = dropwhile(lambda x: x >= period_start[b'monthlies'], utcs)
+
+ matches = takewhile(lambda x: x >= period_start[b'yearlies'], utcs)
+ yearlies = [max(year_utcs) for year, year_utcs
+ in groupby(matches, lambda x: localtime(x).tm_year)]
+
+ return chain(all, dailies, monthlies, yearlies)
+
+def period_spec(start_utc, end_utc):
+ global period_kinds, period_scale, period_scale_kinds
+ result = []
+ desired_specs = randint(1, 2 * len(period_kinds))
+ assert(desired_specs >= 1) # At least one --keep argument is required
+ while len(result) < desired_specs:
+ period = None
+ if randint(1, 100) <= 5:
+ period = b'forever'
+ else:
+ assert(end_utc > start_utc)
+ period_secs = randint(1, end_utc - start_utc)
+ scale = choice(period_scale_kinds)
+ mag = int(float(period_secs) / period_scale[scale])
+ if mag != 0:
+ period = (b'%d' % mag) + scale
+ if period:
+ result += [(choice(period_kinds), period)]
+ return tuple(result)
+
+def unique_period_specs(n, start_utc, end_utc):
+ invocations = set()
+ while len(invocations) < n:
+ invocations.add(period_spec(start_utc, end_utc))
+ return tuple(invocations)
+
+def period_spec_to_period_args(spec):
+ return tuple(chain(*((b'--keep-' + kind + b'-for', period)
+ for kind, period in spec)))
+
+def result_diffline(x):
+ return (b'%d %s\n'
+ % (x, strftime(' %Y-%m-%d-%H%M%S', localtime(x)).encode('ascii')))
+
+def check_prune_result(expected):
+ actual = sorted([int(x)
+ for x in exo([b'git', b'log',
+ b'--pretty=format:%at']).out.splitlines()])
+
+ if expected != actual:
+ for x in expected:
+ print('ex:', x, strftime('%Y-%m-%d-%H%M%S', localtime(x)),
+ file=stderr)
+ for line in diff_bytes(unified_diff,
+ [result_diffline(x) for x in expected],
+ [result_diffline(x) for x in actual],
+ fromfile=b'expected', tofile=b'actual'):
+ sys.stderr.flush()
+ byte_stream(sys.stderr).write(line)
+ wvpass(expected == actual)
+
+
+def test_prune_older(tmpdir):
+ environ[b'GIT_AUTHOR_NAME'] = b'bup test'
+ environ[b'GIT_COMMITTER_NAME'] = b'bup test'
+ environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+ environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+
+ seed = int(environ.get(b'BUP_TEST_SEED', time()))
+ random.seed(seed)
+ print('random seed:', seed, file=stderr)
+
+ save_population = int(environ.get(b'BUP_TEST_PRUNE_OLDER_SAVES', 2000))
+ prune_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_CYCLES', 20))
+ prune_gc_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_GC_CYCLES', 10))
+
+ bup_cmd = bup.path.exe()
+
+ environ[b'BUP_DIR'] = tmpdir + b'/work/.git'
+ environ[b'GIT_DIR'] = tmpdir + b'/work/.git'
+ now = int(time())
+ three_years_ago = now - (60 * 60 * 24 * 366 * 3)
+ chdir(tmpdir)
+ ex([b'git', b'init', b'work'])
+ ex([b'git', b'config', b'gc.autoDetach', b'false'])
+
+ wvstart('generating ' + str(save_population) + ' random saves')
+ chdir(tmpdir + b'/work')
+ save_utcs = create_older_random_saves(save_population, three_years_ago, now)
+ chdir(tmpdir)
+ test_set_hash = exo([b'git', b'show-ref', b'-s', b'master']).out.rstrip()
+ ls_saves = exo((bup_cmd, b'ls', b'master')).out.splitlines()
+ wvpasseq(save_population + 1, len(ls_saves))
+
+ wvstart('ensure everything kept, if no keep arguments')
+ ex([b'git', b'reset', b'--hard', test_set_hash])
+ proc = ex((bup_cmd,
+ b'prune-older', b'-v', b'--unsafe', b'--no-gc',
+ b'--wrt', b'%d' % now) \
+ + (b'master',),
+ stdout=None, stderr=PIPE, check=False)
+ wvpassne(proc.rc, 0)
+ wvpass(b'at least one keep argument is required' in proc.err)
+ check_prune_result(save_utcs)
+
+
+ wvstart('running %d generative no-gc tests on %d saves' % (prune_cycles,
+ save_population))
+ for spec in unique_period_specs(prune_cycles,
+ # Make it more likely we'll have
+ # some outside the save range.
+ three_years_ago - period_scale[b'm'],
+ now):
+ ex([b'git', b'reset', b'--hard', test_set_hash])
+ expected = sorted(expected_retentions(save_utcs, now, spec))
+ ex((bup_cmd,
+ b'prune-older', b'-v', b'--unsafe', b'--no-gc', b'--wrt',
+ b'%d' % now) \
+ + period_spec_to_period_args(spec) \
+ + (b'master',))
+ check_prune_result(expected)
+
+
+ # More expensive because we have to recreate the repo each time
+ wvstart('running %d generative gc tests on %d saves' % (prune_gc_cycles,
+ save_population))
+ ex([b'git', b'reset', b'--hard', test_set_hash])
+ copytree(b'work/.git', b'clean-test-repo', symlinks=True)
+ for spec in unique_period_specs(prune_gc_cycles,
+ # Make it more likely we'll have
+ # some outside the save range.
+ three_years_ago - period_scale[b'm'],
+ now):
+ rmtree(b'work/.git')
+ copytree(b'clean-test-repo', b'work/.git')
+ expected = sorted(expected_retentions(save_utcs, now, spec))
+ ex((bup_cmd,
+ b'prune-older', b'-v', b'--unsafe', b'--wrt', b'%d' % now) \
+ + period_spec_to_period_args(spec) \
+ + (b'master',))
+ check_prune_result(expected)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+import os
+import errno, platform, tempfile
+import logging
+
+from bup import bloom
+from bup.helpers import mkdirp
+
+def test_bloom(tmpdir):
+ hashes = [os.urandom(20) for i in range(100)]
+ class Idx:
+ pass
+ ix = Idx()
+ ix.name = b'dummy.idx'
+ ix.shatable = b''.join(hashes)
+ for k in (4, 5):
+ b = bloom.create(tmpdir + b'/pybuptest.bloom', expected=100, k=k)
+ b.add_idx(ix)
+ assert b.pfalse_positive() < .1
+ b.close()
+ b = bloom.ShaBloom(tmpdir + b'/pybuptest.bloom')
+ all_present = True
+ for h in hashes:
+ all_present &= (b.exists(h) or False)
+ assert all_present
+ false_positives = 0
+ for h in [os.urandom(20) for i in range(1000)]:
+ if b.exists(h):
+ false_positives += 1
+ assert false_positives < 5
+ os.unlink(tmpdir + b'/pybuptest.bloom')
+
+ tf = tempfile.TemporaryFile(dir=tmpdir)
+ b = bloom.create(b'bup.bloom', f=tf, expected=100)
+ assert b.rwfile == tf
+ assert b.k == 5
+
+ # Test large (~1GiB) filter. This may fail on s390 (31-bit
+ # architecture), and anywhere else where the address space is
+ # sufficiently limited.
+ tf = tempfile.TemporaryFile(dir=tmpdir)
+ skip_test = False
+ try:
+ b = bloom.create(b'bup.bloom', f=tf, expected=2**28,
+ delaywrite=False)
+ assert b.k == 4
+ except EnvironmentError as ex:
+ (ptr_width, linkage) = platform.architecture()
+ if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
+ logging.getLogger().info('skipping large bloom filter test (mmap probably failed) '
+ + str(ex))
+ else:
+ raise
--- /dev/null
+
+from __future__ import absolute_import
+import sys, os, stat, time, random, subprocess, glob
+import pytest
+
+from bup import client, git, path
+from bup.compat import bytes_from_uint, environ, range
+from bup.helpers import mkdirp
+
+def randbytes(sz):
+ s = b''
+ for i in range(sz):
+ s += bytes_from_uint(random.randrange(0,256))
+ return s
+
+
+s1 = randbytes(10000)
+s2 = randbytes(10000)
+s3 = randbytes(10000)
+
+IDX_PAT = b'/*.idx'
+
+
+def test_server_split_with_indexes(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir
+ git.init_repo(bupdir)
+ lw = git.PackWriter()
+ c = client.Client(bupdir, create=True)
+ rw = c.new_packwriter()
+
+ lw.new_blob(s1)
+ lw.close()
+
+ rw.new_blob(s2)
+ rw.breakpoint()
+ rw.new_blob(s1)
+ rw.close()
+
+
+def test_multiple_suggestions(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir
+ git.init_repo(bupdir)
+
+ lw = git.PackWriter()
+ lw.new_blob(s1)
+ lw.close()
+ lw = git.PackWriter()
+ lw.new_blob(s2)
+ lw.close()
+ assert len(glob.glob(git.repo(b'objects/pack'+IDX_PAT))) == 2
+
+ c = client.Client(bupdir, create=True)
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 0
+ rw = c.new_packwriter()
+ s1sha = rw.new_blob(s1)
+ assert rw.exists(s1sha)
+ s2sha = rw.new_blob(s2)
+
+ # This is a little hacky, but ensures that we test the
+ # code under test. First, flush to ensure that we've
+ # actually sent all the command ('receive-objects-v2')
+ # and their data to the server. This may be needed if
+ # the output buffer size is bigger than the data (both
+ # command and objects) we're writing. To see the need
+ # for this, change the object sizes at the beginning
+ # of this file to be very small (e.g. 10 instead of 10k)
+ c.conn.outp.flush()
+
+ # Then, check if we've already received the idx files.
+ # This may happen if we're preempted just after writing
+ # the data, then the server runs and suggests, and only
+ # then we continue in PackWriter_Remote::_raw_write()
+ # and check the has_input(), in that case we'll receive
+ # the idx still in the rw.new_blob() calls above.
+ #
+ # In most cases though, that doesn't happen, and we'll
+ # get past the has_input() check before the server has
+ # a chance to respond - it has to actually hash the new
+ # object here, so it takes some time. So also break out
+ # of the loop if the server has sent something on the
+ # connection.
+ #
+ # Finally, abort this after a little while (about one
+ # second) just in case something's actually broken.
+ n = 0
+ while (len(glob.glob(c.cachedir+IDX_PAT)) < 2 and
+ not c.conn.has_input() and n < 10):
+ time.sleep(0.1)
+ n += 1
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 2 or c.conn.has_input()
+ rw.new_blob(s2)
+ assert rw.objcache.exists(s1sha)
+ assert rw.objcache.exists(s2sha)
+ rw.new_blob(s3)
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 2
+ rw.close()
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 3
+
+
+def test_dumb_client_server(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir
+ git.init_repo(bupdir)
+ open(git.repo(b'bup-dumb-server'), 'w').close()
+
+ lw = git.PackWriter()
+ lw.new_blob(s1)
+ lw.close()
+
+ c = client.Client(bupdir, create=True)
+ rw = c.new_packwriter()
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 1
+ rw.new_blob(s1)
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 1
+ rw.new_blob(s2)
+ rw.close()
+ assert len(glob.glob(c.cachedir+IDX_PAT)) == 2
+
+
+def test_midx_refreshing(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir
+ git.init_repo(bupdir)
+ c = client.Client(bupdir, create=True)
+ rw = c.new_packwriter()
+ rw.new_blob(s1)
+ p1base = rw.breakpoint()
+ p1name = os.path.join(c.cachedir, p1base)
+ s1sha = rw.new_blob(s1) # should not be written; it's already in p1
+ s2sha = rw.new_blob(s2)
+ p2base = rw.close()
+ p2name = os.path.join(c.cachedir, p2base)
+ del rw
+
+ pi = git.PackIdxList(bupdir + b'/objects/pack')
+ assert len(pi.packs) == 2
+ pi.refresh()
+ assert len(pi.packs) == 2
+ assert sorted([os.path.basename(i.name) for i in pi.packs]) == sorted([p1base, p2base])
+
+ p1 = git.open_idx(p1name)
+ assert p1.exists(s1sha)
+ p2 = git.open_idx(p2name)
+ assert not p2.exists(s1sha)
+ assert p2.exists(s2sha)
+
+ subprocess.call([path.exe(), b'midx', b'-f'])
+ pi.refresh()
+ assert len(pi.packs) == 1
+ pi.refresh(skip_midx=True)
+ assert len(pi.packs) == 2
+ pi.refresh(skip_midx=False)
+ assert len(pi.packs) == 1
+
+
+def test_remote_parsing():
+ tests = (
+ (b':/bup', (b'file', None, None, b'/bup')),
+ (b'file:///bup', (b'file', None, None, b'/bup')),
+ (b'192.168.1.1:/bup', (b'ssh', b'192.168.1.1', None, b'/bup')),
+ (b'ssh://192.168.1.1:2222/bup', (b'ssh', b'192.168.1.1', b'2222', b'/bup')),
+ (b'ssh://[ff:fe::1]:2222/bup', (b'ssh', b'ff:fe::1', b'2222', b'/bup')),
+ (b'bup://foo.com:1950', (b'bup', b'foo.com', b'1950', None)),
+ (b'bup://foo.com:1950/bup', (b'bup', b'foo.com', b'1950', b'/bup')),
+ (b'bup://[ff:fe::1]/bup', (b'bup', b'ff:fe::1', None, b'/bup')),)
+ for remote, values in tests:
+ assert client.parse_remote(remote) == values
+
+ with pytest.raises(client.ClientError):
+ client.parse_remote(b'http://asdf.com/bup')
--- /dev/null
+
+from __future__ import absolute_import, print_function
+
+from bup.compat import pending_raise
+from wvpytest import wvpasseq
+
+def test_pending_raise():
+ outer = Exception('outer')
+ inner = Exception('inner')
+
+ try:
+ try:
+ raise outer
+ except Exception as ex:
+ with pending_raise(ex):
+ pass
+ except Exception as ex:
+ wvpasseq(outer, ex)
+ wvpasseq(None, getattr(outer, '__context__', None))
+
+ try:
+ try:
+ raise outer
+ except Exception as ex:
+ with pending_raise(ex):
+ raise inner
+ except Exception as ex:
+ wvpasseq(inner, ex)
+ wvpasseq(None, getattr(outer, '__context__', None))
+ wvpasseq(outer, getattr(inner, '__context__', None))
--- /dev/null
+
+from __future__ import absolute_import, print_function
+import sys
+from binascii import hexlify, unhexlify
+from subprocess import check_call
+import struct, os, time
+import pytest
+
+from wvpytest import *
+
+from bup import git, path
+from bup.compat import bytes_from_byte, environ, range
+from bup.helpers import localtime, log, mkdirp, readpipe
+
+
+bup_exe = path.exe()
+
+
+def exc(*cmd):
+ print(repr(cmd), file=sys.stderr)
+ check_call(cmd)
+
+
+def exo(*cmd):
+ print(repr(cmd), file=sys.stderr)
+ return readpipe(cmd)
+
+
+def test_git_version_detection():
+ # Test version types from git's tag history
+ for expected, ver in \
+ (('insufficient', b'git version 0.99'),
+ ('insufficient', b'git version 0.99.1'),
+ ('insufficient', b'git version 0.99.7a'),
+ ('insufficient', b'git version 1.0rc1'),
+ ('insufficient', b'git version 1.0.1'),
+ ('insufficient', b'git version 1.4.2.1'),
+ ('insufficient', b'git version 1.5.5'),
+ ('insufficient', b'git version 1.5.6-rc0'),
+ ('suitable', b'git version 1.5.6'),
+ ('suitable', b'git version 1.5.6.1'),
+ ('suitable', b'git version 2.14.0-rc0'),
+ ('suitable', b'git version 2.14.0 (something ...)'),
+ ('suitable', b'git version 111.222.333.444-rc555'),
+ ('unrecognized', b'huh?')):
+ assert expected == git.is_suitable_git(ver_str=ver)
+ try:
+ if expected == 'insufficient':
+ with pytest.raises(SystemExit):
+ git.require_suitable_git(ver)
+ elif expected == 'suitable':
+ git.require_suitable_git(ver_str=ver)
+ elif expected == 'unrecognized':
+ with pytest.raises(git.GitError):
+ git.require_suitable_git(ver)
+ else:
+ assert False
+ finally:
+ git._git_great = None
+ try:
+ environ[b'BUP_GIT_VERSION_IS_FINE'] = b'true'
+ git.require_suitable_git(ver_str=ver)
+ finally:
+ del environ[b'BUP_GIT_VERSION_IS_FINE']
+ git._git_great = None
+
+
+def test_mangle():
+ afile = 0o100644
+ afile2 = 0o100770
+ alink = 0o120000
+ adir = 0o040000
+ adir2 = 0o040777
+ assert git.mangle_name(b'a', adir2, adir) == b'a'
+ assert git.mangle_name(b'.bup', adir2, adir) == b'.bup.bupl'
+ assert git.mangle_name(b'a.bupa', adir2, adir) == b'a.bupa.bupl'
+ WVPASSEQ(git.mangle_name(b'b.bup', alink, alink), b'b.bup.bupl')
+ WVPASSEQ(git.mangle_name(b'b.bu', alink, alink), b'b.bu')
+ WVPASSEQ(git.mangle_name(b'f', afile, afile2), b'f')
+ WVPASSEQ(git.mangle_name(b'f.bup', afile, afile2), b'f.bup.bupl')
+ WVPASSEQ(git.mangle_name(b'f.bup', afile, adir), b'f.bup.bup')
+ WVPASSEQ(git.mangle_name(b'f', afile, adir), b'f.bup')
+
+ WVPASSEQ(git.demangle_name(b'f.bup', afile), (b'f', git.BUP_CHUNKED))
+ WVPASSEQ(git.demangle_name(b'f.bupl', afile), (b'f', git.BUP_NORMAL))
+ WVPASSEQ(git.demangle_name(b'f.bup.bupl', afile), (b'f.bup', git.BUP_NORMAL))
+
+ WVPASSEQ(git.demangle_name(b'.bupm', afile), (b'', git.BUP_NORMAL))
+ WVPASSEQ(git.demangle_name(b'.bupm', adir), (b'', git.BUP_CHUNKED))
+
+ # for safety, we ignore .bup? suffixes we don't recognize. Future
+ # versions might implement a .bup[a-z] extension as something other
+ # than BUP_NORMAL.
+ WVPASSEQ(git.demangle_name(b'f.bupa', afile), (b'f.bupa', git.BUP_NORMAL))
+
+
+def test_encode():
+ s = b'hello world'
+ looseb = b''.join(git._encode_looseobj(b'blob', s))
+ looset = b''.join(git._encode_looseobj(b'tree', s))
+ loosec = b''.join(git._encode_looseobj(b'commit', s))
+ packb = b''.join(git._encode_packobj(b'blob', s))
+ packt = b''.join(git._encode_packobj(b'tree', s))
+ packc = b''.join(git._encode_packobj(b'commit', s))
+ packlb = b''.join(git._encode_packobj(b'blob', s * 200))
+ WVPASSEQ(git._decode_looseobj(looseb), (b'blob', s))
+ WVPASSEQ(git._decode_looseobj(looset), (b'tree', s))
+ WVPASSEQ(git._decode_looseobj(loosec), (b'commit', s))
+ WVPASSEQ(git._decode_packobj(packb), (b'blob', s))
+ WVPASSEQ(git._decode_packobj(packt), (b'tree', s))
+ WVPASSEQ(git._decode_packobj(packc), (b'commit', s))
+ WVPASSEQ(git._decode_packobj(packlb), (b'blob', s * 200))
+ for i in range(10):
+ WVPASS(git._encode_looseobj(b'blob', s, compression_level=i))
+ def encode_pobj(n):
+ return b''.join(git._encode_packobj(b'blob', s, compression_level=n))
+ WVEXCEPT(ValueError, encode_pobj, -1)
+ WVEXCEPT(ValueError, encode_pobj, 10)
+ WVEXCEPT(ValueError, encode_pobj, b'x')
+
+
+def test_packs(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ git.init_repo(bupdir)
+ git.verbose = 1
+
+ w = git.PackWriter()
+ w.new_blob(os.urandom(100))
+ w.new_blob(os.urandom(100))
+ w.abort()
+
+ w = git.PackWriter()
+ hashes = []
+ nobj = 1000
+ for i in range(nobj):
+ hashes.append(w.new_blob(b'%d' % i))
+ log('\n')
+ nameprefix = w.close()
+ print(repr(nameprefix))
+ WVPASS(os.path.exists(nameprefix + b'.pack'))
+ WVPASS(os.path.exists(nameprefix + b'.idx'))
+
+ r = git.open_idx(nameprefix + b'.idx')
+ print(repr(r.fanout))
+
+ for i in range(nobj):
+ WVPASS(r.find_offset(hashes[i]) > 0)
+ WVPASS(r.exists(hashes[99]))
+ WVFAIL(r.exists(b'\0'*20))
+
+ pi = iter(r)
+ for h in sorted(hashes):
+ WVPASSEQ(hexlify(next(pi)), hexlify(h))
+
+ WVFAIL(r.find_offset(b'\0'*20))
+
+ r = git.PackIdxList(bupdir + b'/objects/pack')
+ WVPASS(r.exists(hashes[5]))
+ WVPASS(r.exists(hashes[6]))
+ WVFAIL(r.exists(b'\0'*20))
+
+
+def test_pack_name_lookup(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ git.init_repo(bupdir)
+ git.verbose = 1
+ packdir = git.repo(b'objects/pack')
+
+ idxnames = []
+ hashes = []
+
+ for start in range(0,28,2):
+ w = git.PackWriter()
+ for i in range(start, start+2):
+ hashes.append(w.new_blob(b'%d' % i))
+ log('\n')
+ idxnames.append(os.path.basename(w.close() + b'.idx'))
+
+ r = git.PackIdxList(packdir)
+ WVPASSEQ(len(r.packs), 2)
+ for e,idxname in enumerate(idxnames):
+ for i in range(e*2, (e+1)*2):
+ WVPASSEQ(idxname, r.exists(hashes[i], want_source=True))
+
+
+def test_long_index(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ git.init_repo(bupdir)
+ idx = git.PackIdxV2Writer()
+ obj_bin = struct.pack('!IIIII',
+ 0x00112233, 0x44556677, 0x88990011, 0x22334455, 0x66778899)
+ obj2_bin = struct.pack('!IIIII',
+ 0x11223344, 0x55667788, 0x99001122, 0x33445566, 0x77889900)
+ obj3_bin = struct.pack('!IIIII',
+ 0x22334455, 0x66778899, 0x00112233, 0x44556677, 0x88990011)
+ pack_bin = struct.pack('!IIIII',
+ 0x99887766, 0x55443322, 0x11009988, 0x77665544, 0x33221100)
+ idx.add(obj_bin, 1, 0xfffffffff)
+ idx.add(obj2_bin, 2, 0xffffffffff)
+ idx.add(obj3_bin, 3, 0xff)
+ name = tmpdir + b'/tmp.idx'
+ r = idx.write(name, pack_bin)
+ i = git.PackIdxV2(name, open(name, 'rb'))
+ WVPASSEQ(i.find_offset(obj_bin), 0xfffffffff)
+ WVPASSEQ(i.find_offset(obj2_bin), 0xffffffffff)
+ WVPASSEQ(i.find_offset(obj3_bin), 0xff)
+
+
+def test_check_repo_or_die(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ orig_cwd = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ git.init_repo(bupdir)
+ git.check_repo_or_die()
+ # if we reach this point the call above passed
+ WVPASS('check_repo_or_die')
+
+ os.rename(bupdir + b'/objects/pack',
+ bupdir + b'/objects/pack.tmp')
+ open(bupdir + b'/objects/pack', 'w').close()
+ try:
+ git.check_repo_or_die()
+ except SystemExit as e:
+ WVPASSEQ(e.code, 14)
+ else:
+ WVFAIL()
+ os.unlink(bupdir + b'/objects/pack')
+ os.rename(bupdir + b'/objects/pack.tmp',
+ bupdir + b'/objects/pack')
+
+ try:
+ git.check_repo_or_die(b'nonexistantbup.tmp')
+ except SystemExit as e:
+ WVPASSEQ(e.code, 15)
+ else:
+ WVFAIL()
+ finally:
+ os.chdir(orig_cwd)
+
+
+def test_commit_parsing(tmpdir):
+ def restore_env_var(name, val):
+ if val is None:
+ del environ[name]
+ else:
+ environ[name] = val
+
+ def showval(commit, val):
+ return readpipe([b'git', b'show', b'-s',
+ b'--pretty=format:%s' % val, commit]).strip()
+
+ orig_cwd = os.getcwd()
+ workdir = tmpdir + b'/work'
+ repodir = workdir + b'/.git'
+ orig_author_name = environ.get(b'GIT_AUTHOR_NAME')
+ orig_author_email = environ.get(b'GIT_AUTHOR_EMAIL')
+ orig_committer_name = environ.get(b'GIT_COMMITTER_NAME')
+ orig_committer_email = environ.get(b'GIT_COMMITTER_EMAIL')
+ environ[b'GIT_AUTHOR_NAME'] = b'bup test'
+ environ[b'GIT_COMMITTER_NAME'] = environ[b'GIT_AUTHOR_NAME']
+ environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+ environ[b'GIT_COMMITTER_EMAIL'] = environ[b'GIT_AUTHOR_EMAIL']
+ try:
+ readpipe([b'git', b'init', workdir])
+ environ[b'GIT_DIR'] = environ[b'BUP_DIR'] = repodir
+ git.check_repo_or_die(repodir)
+ os.chdir(workdir)
+ with open('foo', 'w') as f:
+ print('bar', file=f)
+ readpipe([b'git', b'add', b'.'])
+ readpipe([b'git', b'commit', b'-am', b'Do something',
+ b'--author', b'Someone <someone@somewhere>',
+ b'--date', b'Sat Oct 3 19:48:49 2009 -0400'])
+ commit = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
+ parents = showval(commit, b'%P')
+ tree = showval(commit, b'%T')
+ cname = showval(commit, b'%cn')
+ cmail = showval(commit, b'%ce')
+ cdate = showval(commit, b'%ct')
+ coffs = showval(commit, b'%ci')
+ coffs = coffs[-5:]
+ coff = (int(coffs[-4:-2]) * 60 * 60) + (int(coffs[-2:]) * 60)
+ if bytes_from_byte(coffs[-5]) == b'-':
+ coff = - coff
+ commit_items = git.get_commit_items(commit, git.cp())
+ WVPASSEQ(commit_items.parents, [])
+ WVPASSEQ(commit_items.tree, tree)
+ WVPASSEQ(commit_items.author_name, b'Someone')
+ WVPASSEQ(commit_items.author_mail, b'someone@somewhere')
+ WVPASSEQ(commit_items.author_sec, 1254613729)
+ WVPASSEQ(commit_items.author_offset, -(4 * 60 * 60))
+ WVPASSEQ(commit_items.committer_name, cname)
+ WVPASSEQ(commit_items.committer_mail, cmail)
+ WVPASSEQ(commit_items.committer_sec, int(cdate))
+ WVPASSEQ(commit_items.committer_offset, coff)
+ WVPASSEQ(commit_items.message, b'Do something\n')
+ with open(b'bar', 'wb') as f:
+ f.write(b'baz\n')
+ readpipe([b'git', b'add', '.'])
+ readpipe([b'git', b'commit', b'-am', b'Do something else'])
+ child = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
+ parents = showval(child, b'%P')
+ commit_items = git.get_commit_items(child, git.cp())
+ WVPASSEQ(commit_items.parents, [commit])
+ finally:
+ os.chdir(orig_cwd)
+ restore_env_var(b'GIT_AUTHOR_NAME', orig_author_name)
+ restore_env_var(b'GIT_AUTHOR_EMAIL', orig_author_email)
+ restore_env_var(b'GIT_COMMITTER_NAME', orig_committer_name)
+ restore_env_var(b'GIT_COMMITTER_EMAIL', orig_committer_email)
+
+
+def test_new_commit(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ git.init_repo(bupdir)
+ git.verbose = 1
+
+ w = git.PackWriter()
+ tree = os.urandom(20)
+ parent = os.urandom(20)
+ author_name = b'Author'
+ author_mail = b'author@somewhere'
+ adate_sec = 1439657836
+ cdate_sec = adate_sec + 1
+ committer_name = b'Committer'
+ committer_mail = b'committer@somewhere'
+ adate_tz_sec = cdate_tz_sec = None
+ commit = w.new_commit(tree, parent,
+ b'%s <%s>' % (author_name, author_mail),
+ adate_sec, adate_tz_sec,
+ b'%s <%s>' % (committer_name, committer_mail),
+ cdate_sec, cdate_tz_sec,
+ b'There is a small mailbox here')
+ adate_tz_sec = -60 * 60
+ cdate_tz_sec = 120 * 60
+ commit_off = w.new_commit(tree, parent,
+ b'%s <%s>' % (author_name, author_mail),
+ adate_sec, adate_tz_sec,
+ b'%s <%s>' % (committer_name, committer_mail),
+ cdate_sec, cdate_tz_sec,
+ b'There is a small mailbox here')
+ w.close()
+
+ commit_items = git.get_commit_items(hexlify(commit), git.cp())
+ local_author_offset = localtime(adate_sec).tm_gmtoff
+ local_committer_offset = localtime(cdate_sec).tm_gmtoff
+ WVPASSEQ(tree, unhexlify(commit_items.tree))
+ WVPASSEQ(1, len(commit_items.parents))
+ WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
+ WVPASSEQ(author_name, commit_items.author_name)
+ WVPASSEQ(author_mail, commit_items.author_mail)
+ WVPASSEQ(adate_sec, commit_items.author_sec)
+ WVPASSEQ(local_author_offset, commit_items.author_offset)
+ WVPASSEQ(committer_name, commit_items.committer_name)
+ WVPASSEQ(committer_mail, commit_items.committer_mail)
+ WVPASSEQ(cdate_sec, commit_items.committer_sec)
+ WVPASSEQ(local_committer_offset, commit_items.committer_offset)
+
+ commit_items = git.get_commit_items(hexlify(commit_off), git.cp())
+ WVPASSEQ(tree, unhexlify(commit_items.tree))
+ WVPASSEQ(1, len(commit_items.parents))
+ WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
+ WVPASSEQ(author_name, commit_items.author_name)
+ WVPASSEQ(author_mail, commit_items.author_mail)
+ WVPASSEQ(adate_sec, commit_items.author_sec)
+ WVPASSEQ(adate_tz_sec, commit_items.author_offset)
+ WVPASSEQ(committer_name, commit_items.committer_name)
+ WVPASSEQ(committer_mail, commit_items.committer_mail)
+ WVPASSEQ(cdate_sec, commit_items.committer_sec)
+ WVPASSEQ(cdate_tz_sec, commit_items.committer_offset)
+
+
+def test_list_refs(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ src = tmpdir + b'/src'
+ mkdirp(src)
+ with open(src + b'/1', 'wb+') as f:
+ f.write(b'something\n')
+ with open(src + b'/2', 'wb+') as f:
+ f.write(b'something else\n')
+ git.init_repo(bupdir)
+ emptyset = frozenset()
+ WVPASSEQ(frozenset(git.list_refs()), emptyset)
+ WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
+ WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), emptyset)
+ exc(bup_exe, b'index', src)
+ exc(bup_exe, b'save', b'-n', b'src', b'--strip', src)
+ src_hash = exo(b'git', b'--git-dir', bupdir,
+ b'rev-parse', b'src').strip().split(b'\n')
+ assert(len(src_hash) == 1)
+ src_hash = unhexlify(src_hash[0])
+ tree_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
+ b'rev-parse',
+ b'src:').strip().split(b'\n')[0])
+ blob_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
+ b'rev-parse',
+ b'src:1').strip().split(b'\n')[0])
+ WVPASSEQ(frozenset(git.list_refs()),
+ frozenset([(b'refs/heads/src', src_hash)]))
+ WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
+ WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
+ frozenset([(b'refs/heads/src', src_hash)]))
+ exc(b'git', b'--git-dir', bupdir, b'tag', b'commit-tag', b'src')
+ WVPASSEQ(frozenset(git.list_refs()),
+ frozenset([(b'refs/heads/src', src_hash),
+ (b'refs/tags/commit-tag', src_hash)]))
+ WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)),
+ frozenset([(b'refs/tags/commit-tag', src_hash)]))
+ WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
+ frozenset([(b'refs/heads/src', src_hash)]))
+ exc(b'git', b'--git-dir', bupdir, b'tag', b'tree-tag', b'src:')
+ exc(b'git', b'--git-dir', bupdir, b'tag', b'blob-tag', b'src:1')
+ os.unlink(bupdir + b'/refs/heads/src')
+ expected_tags = frozenset([(b'refs/tags/commit-tag', src_hash),
+ (b'refs/tags/tree-tag', tree_hash),
+ (b'refs/tags/blob-tag', blob_hash)])
+ WVPASSEQ(frozenset(git.list_refs()), expected_tags)
+ WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), frozenset([]))
+ WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), expected_tags)
+
+
+def test_git_date_str():
+ WVPASSEQ(b'0 +0000', git._git_date_str(0, 0))
+ WVPASSEQ(b'0 -0130', git._git_date_str(0, -90 * 60))
+ WVPASSEQ(b'0 +0130', git._git_date_str(0, 90 * 60))
+
+
+def test_cat_pipe(tmpdir):
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ src = tmpdir + b'/src'
+ mkdirp(src)
+ with open(src + b'/1', 'wb+') as f:
+ f.write(b'something\n')
+ with open(src + b'/2', 'wb+') as f:
+ f.write(b'something else\n')
+ git.init_repo(bupdir)
+ exc(bup_exe, b'index', src)
+ oidx = exo(bup_exe, b'save', b'-cn', b'src', b'--strip',
+ src).strip()
+ typ = exo(b'git', b'--git-dir', bupdir,
+ b'cat-file', b'-t', b'src').strip()
+ size = int(exo(b'git', b'--git-dir', bupdir,
+ b'cat-file', b'-s', b'src'))
+ it = git.cp().get(b'src')
+ get_info = next(it)
+ for buf in next(it):
+ pass
+ WVPASSEQ((oidx, typ, size), get_info)
+
+def _create_idx(d, i):
+ idx = git.PackIdxV2Writer()
+ # add 255 vaguely reasonable entries
+ for s in range(255):
+ idx.add(struct.pack('18xBB', i, s), s, 100 * s)
+ packbin = struct.pack('B19x', i)
+ packname = os.path.join(d, b'pack-%s.idx' % hexlify(packbin))
+ idx.write(packname, packbin)
+
+def test_midx_close(tmpdir):
+ fddir = b'/proc/self/fd'
+ try:
+ os.listdir(fddir)
+ except Exception:
+ # not supported, not Linux, I guess
+ return
+
+ def openfiles():
+ for fd in os.listdir(fddir):
+ try:
+ yield os.readlink(os.path.join(fddir, fd))
+ except OSError:
+ pass
+
+ def force_midx(objdir):
+ args = [path.exe(), b'midx', b'--auto', b'--dir', objdir]
+ check_call(args)
+
+ environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+ git.init_repo(bupdir)
+ # create a few dummy idxes
+ for i in range(10):
+ _create_idx(tmpdir, i)
+ git.auto_midx(tmpdir)
+ l = git.PackIdxList(tmpdir)
+ # this doesn't exist (yet)
+ WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
+ for i in range(10, 15):
+ _create_idx(tmpdir, i)
+ # delete the midx ...
+ # TODO: why do we need to? git.auto_midx() below doesn't?!
+ for fn in os.listdir(tmpdir):
+ if fn.endswith(b'.midx'):
+ os.unlink(os.path.join(tmpdir, fn))
+ # and make a new one
+ git.auto_midx(tmpdir)
+ # check it still doesn't exist - we haven't refreshed
+ WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
+ # check that we still have the midx open, this really
+ # just checks more for the kernel API ('deleted' string)
+ for fn in openfiles():
+ if not b'midx-' in fn:
+ continue
+ WVPASSEQ(True, b'deleted' in fn)
+ # refresh the PackIdxList
+ l.refresh()
+ # and check that an object in pack 10 exists now
+ WVPASSEQ(True, l.exists(struct.pack('18xBB', 10, 0)))
+ for fn in openfiles():
+ if not b'midx-' in fn:
+ continue
+ # check that we don't have it open anymore
+ WVPASSEQ(False, b'deleted' in fn)
--- /dev/null
+
+from __future__ import absolute_import
+from io import BytesIO
+
+from wvpytest import *
+
+from bup import hashsplit, _helpers, helpers
+from bup.compat import byte_int, bytes_from_uint
+
+
+def nr_regions(x, max_count=None):
+ return list(hashsplit._nonresident_page_regions(bytearray(x), 1, max_count))
+
+
+def test_nonresident_page_regions():
+ WVPASSEQ(nr_regions([]), [])
+ WVPASSEQ(nr_regions([1]), [])
+ WVPASSEQ(nr_regions([0]), [(0, 1)])
+ WVPASSEQ(nr_regions([1, 0]), [(1, 1)])
+ WVPASSEQ(nr_regions([0, 0]), [(0, 2)])
+ WVPASSEQ(nr_regions([1, 0, 1]), [(1, 1)])
+ WVPASSEQ(nr_regions([1, 0, 0]), [(1, 2)])
+ WVPASSEQ(nr_regions([0, 1, 0]), [(0, 1), (2, 1)])
+ WVPASSEQ(nr_regions([0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]),
+ [(0, 2), (5, 3), (9, 2)])
+ WVPASSEQ(nr_regions([2, 42, 3, 101]), [(0, 2)])
+ # Test limit
+ WVPASSEQ(nr_regions([0, 0, 0], None), [(0, 3)])
+ WVPASSEQ(nr_regions([0, 0, 0], 1), [(0, 1), (1, 1), (2, 1)])
+ WVPASSEQ(nr_regions([0, 0, 0], 2), [(0, 2), (2, 1)])
+ WVPASSEQ(nr_regions([0, 0, 0], 3), [(0, 3)])
+ WVPASSEQ(nr_regions([0, 0, 0], 4), [(0, 3)])
+ WVPASSEQ(nr_regions([0, 0, 1], None), [(0, 2)])
+ WVPASSEQ(nr_regions([0, 0, 1], 1), [(0, 1), (1, 1)])
+ WVPASSEQ(nr_regions([0, 0, 1], 2), [(0, 2)])
+ WVPASSEQ(nr_regions([0, 0, 1], 3), [(0, 2)])
+ WVPASSEQ(nr_regions([1, 0, 0], None), [(1, 2)])
+ WVPASSEQ(nr_regions([1, 0, 0], 1), [(1, 1), (2, 1)])
+ WVPASSEQ(nr_regions([1, 0, 0], 2), [(1, 2)])
+ WVPASSEQ(nr_regions([1, 0, 0], 3), [(1, 2)])
+ WVPASSEQ(nr_regions([1, 0, 0, 0, 1], None), [(1, 3)])
+ WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 1), [(1, 1), (2, 1), (3, 1)])
+ WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 2), [(1, 2), (3, 1)])
+ WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 3), [(1, 3)])
+ WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 4), [(1, 3)])
+
+
+def test_uncache_ours_upto():
+ history = []
+ def mock_fadvise_pages_done(f, ofs, len):
+ history.append((f, ofs, len))
+
+ uncache_upto = hashsplit._uncache_ours_upto
+ page_size = helpers.sc_page_size
+ orig_pages_done = hashsplit._fadvise_pages_done
+ try:
+ hashsplit._fadvise_pages_done = mock_fadvise_pages_done
+ history = []
+ uncache_upto(42, 0, (0, 1), iter([]))
+ WVPASSEQ([], history)
+ uncache_upto(42, page_size, (0, 1), iter([]))
+ WVPASSEQ([(42, 0, 1)], history)
+ history = []
+ uncache_upto(42, page_size, (0, 3), iter([(5, 2)]))
+ WVPASSEQ([], history)
+ uncache_upto(42, 2 * page_size, (0, 3), iter([(5, 2)]))
+ WVPASSEQ([], history)
+ uncache_upto(42, 3 * page_size, (0, 3), iter([(5, 2)]))
+ WVPASSEQ([(42, 0, 3)], history)
+ history = []
+ uncache_upto(42, 5 * page_size, (0, 3), iter([(5, 2)]))
+ WVPASSEQ([(42, 0, 3)], history)
+ history = []
+ uncache_upto(42, 6 * page_size, (0, 3), iter([(5, 2)]))
+ WVPASSEQ([(42, 0, 3)], history)
+ history = []
+ uncache_upto(42, 7 * page_size, (0, 3), iter([(5, 2)]))
+ WVPASSEQ([(42, 0, 3), (42, 5, 2)], history)
+ finally:
+ hashsplit._fadvise_pages_done = orig_pages_done
+
+
+def test_rolling_sums():
+ WVPASS(_helpers.selftest())
+
+def test_fanout_behaviour():
+ # Drop in replacement for bupsplit, but splitting if the int value of a
+ # byte >= BUP_BLOBBITS
+ basebits = _helpers.blobbits()
+ def splitbuf(buf):
+ ofs = 0
+ for b in buf:
+ b = byte_int(b)
+ ofs += 1
+ if b >= basebits:
+ return ofs, b
+ return 0, 0
+
+ old_splitbuf = _helpers.splitbuf
+ _helpers.splitbuf = splitbuf
+ old_BLOB_MAX = hashsplit.BLOB_MAX
+ hashsplit.BLOB_MAX = 4
+ old_BLOB_READ_SIZE = hashsplit.BLOB_READ_SIZE
+ hashsplit.BLOB_READ_SIZE = 10
+ old_fanout = hashsplit.fanout
+ hashsplit.fanout = 2
+
+ levels = lambda f: [(len(b), l) for b, l in
+ hashsplit.hashsplit_iter([f], True, None)]
+ # Return a string of n null bytes
+ z = lambda n: b'\x00' * n
+ # Return a byte which will be split with a level of n
+ sb = lambda n: bytes_from_uint(basebits + n)
+
+ split_never = BytesIO(z(16))
+ split_first = BytesIO(z(1) + sb(3) + z(14))
+ split_end = BytesIO(z(13) + sb(1) + z(2))
+ split_many = BytesIO(sb(1) + z(3) + sb(2) + z(4) +
+ sb(0) + z(4) + sb(5) + z(1))
+ WVPASSEQ(levels(split_never), [(4, 0), (4, 0), (4, 0), (4, 0)])
+ WVPASSEQ(levels(split_first), [(2, 3), (4, 0), (4, 0), (4, 0), (2, 0)])
+ WVPASSEQ(levels(split_end), [(4, 0), (4, 0), (4, 0), (2, 1), (2, 0)])
+ WVPASSEQ(levels(split_many),
+ [(1, 1), (4, 2), (4, 0), (1, 0), (4, 0), (1, 5), (1, 0)])
+
+ _helpers.splitbuf = old_splitbuf
+ hashsplit.BLOB_MAX = old_BLOB_MAX
+ hashsplit.BLOB_READ_SIZE = old_BLOB_READ_SIZE
+ hashsplit.fanout = old_fanout
--- /dev/null
+
+from __future__ import absolute_import
+from time import tzset
+import math, os, os.path, re, subprocess
+from bup import helpers
+
+from wvpytest import *
+
+from bup.compat import bytes_from_byte, bytes_from_uint, environ
+from bup.helpers import (atomically_replaced_file, batchpipe, detect_fakeroot,
+ grafted_path_components, mkdirp, parse_num,
+ path_components, readpipe, stripped_path_components,
+ shstr,
+ utc_offset_str)
+import bup._helpers as _helpers
+
+
+def test_parse_num():
+ pn = parse_num
+ WVPASSEQ(pn(b'1'), 1)
+ WVPASSEQ(pn('1'), 1)
+ WVPASSEQ(pn('0'), 0)
+ WVPASSEQ(pn('1.5k'), 1536)
+ WVPASSEQ(pn('2 gb'), 2*1024*1024*1024)
+ WVPASSEQ(pn('1e+9 k'), 1000000000 * 1024)
+ WVPASSEQ(pn('-3e-3mb'), int(-0.003 * 1024 * 1024))
+
+def test_detect_fakeroot():
+ if b'FAKEROOTKEY' in environ:
+ WVPASS(detect_fakeroot())
+ else:
+ WVPASS(not detect_fakeroot())
+
+def test_path_components():
+ WVPASSEQ(path_components(b'/'), [(b'', b'/')])
+ WVPASSEQ(path_components(b'/foo'), [(b'', b'/'), (b'foo', b'/foo')])
+ WVPASSEQ(path_components(b'/foo/'), [(b'', b'/'), (b'foo', b'/foo')])
+ WVPASSEQ(path_components(b'/foo/bar'),
+ [(b'', b'/'), (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
+ WVEXCEPT(Exception, path_components, b'foo')
+
+
+def test_stripped_path_components():
+ WVPASSEQ(stripped_path_components(b'/', []), [(b'', b'/')])
+ WVPASSEQ(stripped_path_components(b'/', [b'']), [(b'', b'/')])
+ WVPASSEQ(stripped_path_components(b'/', [b'/']), [(b'', b'/')])
+ WVPASSEQ(stripped_path_components(b'/foo', [b'/']),
+ [(b'', b'/'), (b'foo', b'/foo')])
+ WVPASSEQ(stripped_path_components(b'/', [b'/foo']), [(b'', b'/')])
+ WVPASSEQ(stripped_path_components(b'/foo', [b'/bar']),
+ [(b'', b'/'), (b'foo', b'/foo')])
+ WVPASSEQ(stripped_path_components(b'/foo', [b'/foo']), [(b'', b'/foo')])
+ WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/foo']),
+ [(b'', b'/foo'), (b'bar', b'/foo/bar')])
+ WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/bar', b'/foo', b'/baz']),
+ [(b'', b'/foo'), (b'bar', b'/foo/bar')])
+ WVPASSEQ(stripped_path_components(b'/foo/bar/baz', [b'/foo/bar/baz']),
+ [(b'', b'/foo/bar/baz')])
+ WVEXCEPT(Exception, stripped_path_components, b'foo', [])
+
+
+def test_grafted_path_components():
+ WVPASSEQ(grafted_path_components([(b'/chroot', b'/')], b'/foo'),
+ [(b'', b'/'), (b'foo', b'/foo')])
+ WVPASSEQ(grafted_path_components([(b'/foo/bar', b'/')],
+ b'/foo/bar/baz/bax'),
+ [(b'', b'/foo/bar'),
+ (b'baz', b'/foo/bar/baz'),
+ (b'bax', b'/foo/bar/baz/bax')])
+ WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/bax')],
+ b'/foo/bar/baz/1/2'),
+ [(b'', None),
+ (b'bax', b'/foo/bar/baz'),
+ (b'1', b'/foo/bar/baz/1'),
+ (b'2', b'/foo/bar/baz/1/2')])
+ WVPASSEQ(grafted_path_components([(b'/foo', b'/bar/baz/bax')],
+ b'/foo/bar'),
+ [(b'', None),
+ (b'bar', None),
+ (b'baz', None),
+ (b'bax', b'/foo'),
+ (b'bar', b'/foo/bar')])
+ WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/a/b/c')],
+ b'/foo/bar/baz'),
+ [(b'', None), (b'a', None), (b'b', None), (b'c', b'/foo/bar/baz')])
+ WVPASSEQ(grafted_path_components([(b'/', b'/a/b/c/')], b'/foo/bar'),
+ [(b'', None), (b'a', None), (b'b', None), (b'c', b'/'),
+ (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
+ WVEXCEPT(Exception, grafted_path_components, b'foo', [])
+
+
+def test_shstr():
+ # Do nothing for strings and bytes
+ WVPASSEQ(shstr(b''), b'')
+ WVPASSEQ(shstr(b'1'), b'1')
+ WVPASSEQ(shstr(b'1 2'), b'1 2')
+ WVPASSEQ(shstr(b"1'2"), b"1'2")
+ WVPASSEQ(shstr(''), '')
+ WVPASSEQ(shstr('1'), '1')
+ WVPASSEQ(shstr('1 2'), '1 2')
+ WVPASSEQ(shstr("1'2"), "1'2")
+
+ # Escape parts of sequences
+ WVPASSEQ(shstr((b'1 2', b'3')), b"'1 2' 3")
+ WVPASSEQ(shstr((b"1'2", b'3')), b"'1'\"'\"'2' 3")
+ WVPASSEQ(shstr((b"'1", b'3')), b"''\"'\"'1' 3")
+ WVPASSEQ(shstr(('1 2', '3')), "'1 2' 3")
+ WVPASSEQ(shstr(("1'2", '3')), "'1'\"'\"'2' 3")
+ WVPASSEQ(shstr(("'1", '3')), "''\"'\"'1' 3")
+
+
+def test_readpipe():
+ x = readpipe([b'echo', b'42'])
+ WVPASSEQ(x, b'42\n')
+ try:
+ readpipe([b'bash', b'-c', b'exit 42'])
+ except Exception as ex:
+ rx = '^subprocess b?"bash -c \'exit 42\'" failed with status 42$'
+ if not re.match(rx, str(ex)):
+ WVPASSEQ(str(ex), rx)
+
+
+def test_batchpipe():
+ for chunk in batchpipe([b'echo'], []):
+ WVPASS(False)
+ out = b''
+ for chunk in batchpipe([b'echo'], [b'42']):
+ out += chunk
+ WVPASSEQ(out, b'42\n')
+ try:
+ batchpipe([b'bash', b'-c'], [b'exit 42'])
+ except Exception as ex:
+ WVPASSEQ(str(ex),
+ "subprocess 'bash -c exit 42' failed with status 42")
+ args = [str(x) for x in range(6)]
+ # Force batchpipe to break the args into batches of 3. This
+ # approach assumes all args are the same length.
+ arg_max = \
+ helpers._argmax_base([b'echo']) + helpers._argmax_args_size(args[:3])
+ batches = batchpipe(['echo'], args, arg_max=arg_max)
+ WVPASSEQ(next(batches), b'0 1 2\n')
+ WVPASSEQ(next(batches), b'3 4 5\n')
+ WVPASSEQ(next(batches, None), None)
+ batches = batchpipe([b'echo'], [str(x) for x in range(5)], arg_max=arg_max)
+ WVPASSEQ(next(batches), b'0 1 2\n')
+ WVPASSEQ(next(batches), b'3 4\n')
+ WVPASSEQ(next(batches, None), None)
+
+
+def test_atomically_replaced_file(tmpdir):
+ target_file = os.path.join(tmpdir, b'test-atomic-write')
+
+ with atomically_replaced_file(target_file, mode='w') as f:
+ f.write('asdf')
+ WVPASSEQ(f.mode, 'w')
+ f = open(target_file, 'r')
+ WVPASSEQ(f.read(), 'asdf')
+
+ try:
+ with atomically_replaced_file(target_file, mode='w') as f:
+ f.write('wxyz')
+ raise Exception()
+ except:
+ pass
+ with open(target_file) as f:
+ WVPASSEQ(f.read(), 'asdf')
+
+ with atomically_replaced_file(target_file, mode='wb') as f:
+ f.write(os.urandom(20))
+ WVPASSEQ(f.mode, 'wb')
+
+
+def set_tz(tz):
+ if not tz:
+ del environ[b'TZ']
+ else:
+ environ[b'TZ'] = tz
+ tzset()
+
+
+def test_utc_offset_str():
+ tz = environ.get(b'TZ')
+ tzset()
+ try:
+ set_tz(b'FOO+0:00')
+ WVPASSEQ(utc_offset_str(0), b'+0000')
+ set_tz(b'FOO+1:00')
+ WVPASSEQ(utc_offset_str(0), b'-0100')
+ set_tz(b'FOO-1:00')
+ WVPASSEQ(utc_offset_str(0), b'+0100')
+ set_tz(b'FOO+3:3')
+ WVPASSEQ(utc_offset_str(0), b'-0303')
+ set_tz(b'FOO-3:3')
+ WVPASSEQ(utc_offset_str(0), b'+0303')
+ # Offset is not an integer number of minutes
+ set_tz(b'FOO+3:3:3')
+ WVPASSEQ(utc_offset_str(1), b'-0303')
+ set_tz(b'FOO-3:3:3')
+ WVPASSEQ(utc_offset_str(1), b'+0303')
+ WVPASSEQ(utc_offset_str(314159), b'+0303')
+ finally:
+ if tz:
+ set_tz(tz)
+ else:
+ try:
+ set_tz(None)
+ except KeyError:
+ pass
+
+def test_valid_save_name():
+ valid = helpers.valid_save_name
+ WVPASS(valid(b'x'))
+ WVPASS(valid(b'x@'))
+ WVFAIL(valid(b'@'))
+ WVFAIL(valid(b'/'))
+ WVFAIL(valid(b'/foo'))
+ WVFAIL(valid(b'foo/'))
+ WVFAIL(valid(b'/foo/'))
+ WVFAIL(valid(b'foo//bar'))
+ WVFAIL(valid(b'.'))
+ WVFAIL(valid(b'bar.'))
+ WVFAIL(valid(b'foo@{'))
+ for x in b' ~^:?*[\\':
+ WVFAIL(valid(b'foo' + bytes_from_byte(x)))
+ for i in range(20):
+ WVFAIL(valid(b'foo' + bytes_from_uint(i)))
+ WVFAIL(valid(b'foo' + bytes_from_uint(0x7f)))
+ WVFAIL(valid(b'foo..bar'))
+ WVFAIL(valid(b'bar.lock/baz'))
+ WVFAIL(valid(b'foo/bar.lock/baz'))
+ WVFAIL(valid(b'.bar/baz'))
+ WVFAIL(valid(b'foo/.bar/baz'))
--- /dev/null
+
+from __future__ import absolute_import, print_function
+import os, time
+
+from wvpytest import *
+
+from bup import index, metadata
+from bup.compat import fsencode
+from bup.helpers import mkdirp, resolve_parent
+import bup.xstat as xstat
+
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+
+
+def test_index_basic():
+ cd = os.path.realpath(os.path.join(lib_t_dir, b'../'))
+ WVPASS(cd)
+ sd = os.path.realpath(cd + b'/sampledata')
+ WVPASSEQ(resolve_parent(cd + b'/sampledata'), sd)
+ WVPASSEQ(os.path.realpath(cd + b'/sampledata/x'), sd + b'/x')
+ WVPASSEQ(os.path.realpath(cd + b'/sampledata/var/abs-symlink'),
+ sd + b'/var/abs-symlink-target')
+ WVPASSEQ(resolve_parent(cd + b'/sampledata/var/abs-symlink'),
+ sd + b'/var/abs-symlink')
+
+
+def test_index_writer(tmpdir):
+ orig_cwd = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ ds = xstat.stat(b'.')
+ fs = xstat.stat(lib_t_dir + b'/test_index.py')
+ ms = index.MetaStoreWriter(b'index.meta.tmp');
+ tmax = (time.time() - 1) * 10**9
+ w = index.Writer(b'index.tmp', ms, tmax)
+ w.add(b'/var/tmp/sporky', fs, 0)
+ w.add(b'/etc/passwd', fs, 0)
+ w.add(b'/etc/', ds, 0)
+ w.add(b'/', ds, 0)
+ ms.close()
+ w.close()
+ finally:
+ os.chdir(orig_cwd)
+
+
+def dump(m):
+ for e in list(m):
+ print('%s%s %s' % (e.is_valid() and ' ' or 'M',
+ e.is_fake() and 'F' or ' ',
+ e.name))
+
+def fake_validate(*l):
+ for i in l:
+ for e in i:
+ e.validate(0o100644, index.FAKE_SHA)
+ e.repack()
+
+def eget(l, ename):
+ for e in l:
+ if e.name == ename:
+ return e
+
+def test_index_negative_timestamps(tmpdir):
+ # Makes 'foo' exist
+ foopath = tmpdir + b'/foo'
+ f = open(foopath, 'wb')
+ f.close()
+
+ # Dec 31, 1969
+ os.utime(foopath, (-86400, -86400))
+ ns_per_sec = 10**9
+ tmax = (time.time() - 1) * ns_per_sec
+ e = index.BlankNewEntry(foopath, 0, tmax)
+ e.update_from_stat(xstat.stat(foopath), 0)
+ WVPASS(e.packed())
+
+ # Jun 10, 1893
+ os.utime(foopath, (-0x80000000, -0x80000000))
+ e = index.BlankNewEntry(foopath, 0, tmax)
+ e.update_from_stat(xstat.stat(foopath), 0)
+ WVPASS(e.packed())
+
+
+def test_index_dirty(tmpdir):
+ orig_cwd = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ default_meta = metadata.Metadata()
+ ms1 = index.MetaStoreWriter(b'index.meta.tmp')
+ ms2 = index.MetaStoreWriter(b'index2.meta.tmp')
+ ms3 = index.MetaStoreWriter(b'index3.meta.tmp')
+ meta_ofs1 = ms1.store(default_meta)
+ meta_ofs2 = ms2.store(default_meta)
+ meta_ofs3 = ms3.store(default_meta)
+
+ ds = xstat.stat(lib_t_dir)
+ fs = xstat.stat(lib_t_dir + b'/test_index.py')
+ tmax = (time.time() - 1) * 10**9
+
+ w1 = index.Writer(b'index.tmp', ms1, tmax)
+ w1.add(b'/a/b/x', fs, meta_ofs1)
+ w1.add(b'/a/b/c', fs, meta_ofs1)
+ w1.add(b'/a/b/', ds, meta_ofs1)
+ w1.add(b'/a/', ds, meta_ofs1)
+ #w1.close()
+ WVPASS()
+
+ w2 = index.Writer(b'index2.tmp', ms2, tmax)
+ w2.add(b'/a/b/n/2', fs, meta_ofs2)
+ #w2.close()
+ WVPASS()
+
+ w3 = index.Writer(b'index3.tmp', ms3, tmax)
+ w3.add(b'/a/c/n/3', fs, meta_ofs3)
+ #w3.close()
+ WVPASS()
+
+ r1 = w1.new_reader()
+ r2 = w2.new_reader()
+ r3 = w3.new_reader()
+ WVPASS()
+
+ r1all = [e.name for e in r1]
+ WVPASSEQ(r1all,
+ [b'/a/b/x', b'/a/b/c', b'/a/b/', b'/a/', b'/'])
+ r2all = [e.name for e in r2]
+ WVPASSEQ(r2all,
+ [b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
+ r3all = [e.name for e in r3]
+ WVPASSEQ(r3all,
+ [b'/a/c/n/3', b'/a/c/n/', b'/a/c/', b'/a/', b'/'])
+ all = [e.name for e in index.merge(r2, r1, r3)]
+ WVPASSEQ(all,
+ [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
+ b'/a/b/x', b'/a/b/n/2', b'/a/b/n/', b'/a/b/c',
+ b'/a/b/', b'/a/', b'/'])
+ fake_validate(r1)
+ dump(r1)
+
+ print([hex(e.flags) for e in r1])
+ WVPASSEQ([e.name for e in r1 if e.is_valid()], r1all)
+ WVPASSEQ([e.name for e in r1 if not e.is_valid()], [])
+ WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
+ [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
+ b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
+
+ expect_invalid = [b'/'] + r2all + r3all
+ expect_real = (set(r1all) - set(r2all) - set(r3all)) \
+ | set([b'/a/b/n/2', b'/a/c/n/3'])
+ dump(index.merge(r2, r1, r3))
+ for e in index.merge(r2, r1, r3):
+ print(e.name, hex(e.flags), e.ctime)
+ eiv = e.name in expect_invalid
+ er = e.name in expect_real
+ WVPASSEQ(eiv, not e.is_valid())
+ WVPASSEQ(er, e.is_real())
+ fake_validate(r2, r3)
+ dump(index.merge(r2, r1, r3))
+ WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()], [])
+
+ e = eget(index.merge(r2, r1, r3), b'/a/b/c')
+ e.invalidate()
+ e.repack()
+ dump(index.merge(r2, r1, r3))
+ WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
+ [b'/a/b/c', b'/a/b/', b'/a/', b'/'])
+ w1.close()
+ w2.close()
+ w3.close()
+ finally:
+ os.chdir(orig_cwd)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+import errno, glob, grp, pwd, stat, tempfile, subprocess
+import os, sys
+import pytest
+
+from wvpytest import *
+
+from bup import git, metadata
+from bup import vfs
+from bup.compat import range
+from bup.helpers import clear_errors, detect_fakeroot, is_superuser, resolve_parent
+from bup.repo import LocalRepo
+from bup.xstat import utime, lutime
+import bup.helpers as helpers
+from bup.compat import fsencode
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+
+top_dir = os.path.realpath(os.path.join(lib_t_dir, b'..', b'..'))
+
+bup_path = top_dir + b'/bup'
+
+
+def ex(*cmd):
+ try:
+ cmd_str = b' '.join(cmd)
+ print(cmd_str, file=sys.stderr)
+ rc = subprocess.call(cmd)
+ if rc < 0:
+ print('terminated by signal', - rc, file=sys.stderr)
+ sys.exit(1)
+ elif rc > 0:
+ print('returned exit status', rc, file=sys.stderr)
+ sys.exit(1)
+ except OSError as e:
+ print('subprocess call failed:', e, file=sys.stderr)
+ sys.exit(1)
+
+
+def setup_testfs():
+ assert(sys.platform.startswith('linux'))
+ # Set up testfs with user_xattr, etc.
+ if subprocess.call([b'modprobe', b'loop']) != 0:
+ return False
+ subprocess.call([b'umount', b'testfs'])
+ ex(b'dd', b'if=/dev/zero', b'of=testfs.img', b'bs=1M', b'count=32')
+ ex(b'mke2fs', b'-F', b'-j', b'-m', b'0', b'testfs.img')
+ ex(b'rm', b'-rf', b'testfs')
+ os.mkdir(b'testfs')
+ ex(b'mount', b'-o', b'loop,acl,user_xattr', b'testfs.img', b'testfs')
+ # Hide, so that tests can't create risks.
+ os.chown(b'testfs', 0, 0)
+ os.chmod(b'testfs', 0o700)
+ return True
+
+
+def cleanup_testfs():
+ subprocess.call([b'umount', b'testfs'])
+ helpers.unlink(b'testfs.img')
+
+
+def test_clean_up_archive_path():
+ cleanup = metadata._clean_up_path_for_archive
+ WVPASSEQ(cleanup(b'foo'), b'foo')
+ WVPASSEQ(cleanup(b'/foo'), b'foo')
+ WVPASSEQ(cleanup(b'///foo'), b'foo')
+ WVPASSEQ(cleanup(b'/foo/bar'), b'foo/bar')
+ WVPASSEQ(cleanup(b'foo/./bar'), b'foo/bar')
+ WVPASSEQ(cleanup(b'/foo/./bar'), b'foo/bar')
+ WVPASSEQ(cleanup(b'/foo/./bar/././baz'), b'foo/bar/baz')
+ WVPASSEQ(cleanup(b'/foo/./bar///././baz'), b'foo/bar/baz')
+ WVPASSEQ(cleanup(b'//./foo/./bar///././baz/.///'), b'foo/bar/baz/')
+ WVPASSEQ(cleanup(b'./foo/./.bar'), b'foo/.bar')
+ WVPASSEQ(cleanup(b'./foo/.'), b'foo')
+ WVPASSEQ(cleanup(b'./foo/..'), b'.')
+ WVPASSEQ(cleanup(b'//./..//.../..//.'), b'.')
+ WVPASSEQ(cleanup(b'//./..//..././/.'), b'...')
+ WVPASSEQ(cleanup(b'/////.'), b'.')
+ WVPASSEQ(cleanup(b'/../'), b'.')
+ WVPASSEQ(cleanup(b''), b'.')
+
+
+def test_risky_path():
+ risky = metadata._risky_path
+ WVPASS(risky(b'/foo'))
+ WVPASS(risky(b'///foo'))
+ WVPASS(risky(b'/../foo'))
+ WVPASS(risky(b'../foo'))
+ WVPASS(risky(b'foo/..'))
+ WVPASS(risky(b'foo/../'))
+ WVPASS(risky(b'foo/../bar'))
+ WVFAIL(risky(b'foo'))
+ WVFAIL(risky(b'foo/'))
+ WVFAIL(risky(b'foo///'))
+ WVFAIL(risky(b'./foo'))
+ WVFAIL(risky(b'foo/.'))
+ WVFAIL(risky(b'./foo/.'))
+ WVFAIL(risky(b'foo/bar'))
+ WVFAIL(risky(b'foo/./bar'))
+
+
+def test_clean_up_extract_path():
+ cleanup = metadata._clean_up_extract_path
+ WVPASSEQ(cleanup(b'/foo'), b'foo')
+ WVPASSEQ(cleanup(b'///foo'), b'foo')
+ WVFAIL(cleanup(b'/../foo'))
+ WVFAIL(cleanup(b'../foo'))
+ WVFAIL(cleanup(b'foo/..'))
+ WVFAIL(cleanup(b'foo/../'))
+ WVFAIL(cleanup(b'foo/../bar'))
+ WVPASSEQ(cleanup(b'foo'), b'foo')
+ WVPASSEQ(cleanup(b'foo/'), b'foo/')
+ WVPASSEQ(cleanup(b'foo///'), b'foo///')
+ WVPASSEQ(cleanup(b'./foo'), b'./foo')
+ WVPASSEQ(cleanup(b'foo/.'), b'foo/.')
+ WVPASSEQ(cleanup(b'./foo/.'), b'./foo/.')
+ WVPASSEQ(cleanup(b'foo/bar'), b'foo/bar')
+ WVPASSEQ(cleanup(b'foo/./bar'), b'foo/./bar')
+ WVPASSEQ(cleanup(b'/'), b'.')
+ WVPASSEQ(cleanup(b'./'), b'./')
+ WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
+ WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
+
+
+def test_metadata_method(tmpdir):
+ bup_dir = tmpdir + b'/bup'
+ data_path = tmpdir + b'/foo'
+ os.mkdir(data_path)
+ ex(b'touch', data_path + b'/file')
+ ex(b'ln', b'-s', b'file', data_path + b'/symlink')
+ test_time1 = 13 * 1000000000
+ test_time2 = 42 * 1000000000
+ utime(data_path + b'/file', (0, test_time1))
+ lutime(data_path + b'/symlink', (0, 0))
+ utime(data_path, (0, test_time2))
+ ex(bup_path, b'-d', bup_dir, b'init')
+ ex(bup_path, b'-d', bup_dir, b'index', b'-v', data_path)
+ ex(bup_path, b'-d', bup_dir, b'save', b'-tvvn', b'test', data_path)
+ git.check_repo_or_die(bup_dir)
+ repo = LocalRepo()
+ resolved = vfs.resolve(repo,
+ b'/test/latest' + resolve_parent(data_path),
+ follow=False)
+ leaf_name, leaf_item = resolved[-1]
+ m = leaf_item.meta
+ WVPASS(m.mtime == test_time2)
+ WVPASS(leaf_name == b'foo')
+ contents = tuple(vfs.contents(repo, leaf_item))
+ WVPASS(len(contents) == 3)
+ WVPASSEQ(frozenset(name for name, item in contents),
+ frozenset((b'.', b'file', b'symlink')))
+ for name, item in contents:
+ if name == b'file':
+ m = item.meta
+ WVPASS(m.mtime == test_time1)
+ elif name == b'symlink':
+ m = item.meta
+ WVPASSEQ(m.symlink_target, b'file')
+ WVPASSEQ(m.size, 4)
+ WVPASSEQ(m.mtime, 0)
+
+
+def _first_err():
+ if helpers.saved_errors:
+ return str(helpers.saved_errors[0])
+ return ''
+
+
+def test_from_path_error(tmpdir):
+ if is_superuser() or detect_fakeroot():
+ return
+ path = tmpdir + b'/foo'
+ os.mkdir(path)
+ m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+ WVPASSEQ(m.path, path)
+ os.chmod(path, 0o000)
+ metadata.from_path(path, archive_path=path, save_symlinks=True)
+ if metadata.get_linux_file_attr:
+ print('saved_errors:', helpers.saved_errors, file=sys.stderr)
+ WVPASS(len(helpers.saved_errors) == 1)
+ errmsg = _first_err()
+ WVPASS(errmsg.startswith('read Linux attr'))
+ clear_errors()
+
+
+def _linux_attr_supported(path):
+ # Expects path to denote a regular file or a directory.
+ if not metadata.get_linux_file_attr:
+ return False
+ try:
+ metadata.get_linux_file_attr(path)
+ except OSError as e:
+ if e.errno in (errno.ENOTTY, errno.ENOSYS, errno.EOPNOTSUPP):
+ return False
+ else:
+ raise
+ return True
+
+
+def test_apply_to_path_restricted_access(tmpdir):
+ if is_superuser() or detect_fakeroot():
+ return
+ if sys.platform.startswith('cygwin'):
+ return # chmod 000 isn't effective.
+ try:
+ parent = tmpdir + b'/foo'
+ path = parent + b'/bar'
+ os.mkdir(parent)
+ os.mkdir(path)
+ clear_errors()
+ if metadata.xattr:
+ try:
+ metadata.xattr.set(path, b'user.buptest', b'bup')
+ except:
+ print("failed to set test xattr")
+ # ignore any failures here - maybe FS cannot do it
+ pass
+ m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+ WVPASSEQ(m.path, path)
+ os.chmod(parent, 0o000)
+ m.apply_to_path(path)
+ print(b'saved_errors:', helpers.saved_errors, file=sys.stderr)
+ expected_errors = ['utime: ']
+ if m.linux_attr and _linux_attr_supported(tmpdir):
+ expected_errors.append('Linux chattr: ')
+ if metadata.xattr and m.linux_xattr:
+ expected_errors.append("xattr.set ")
+ WVPASS(len(helpers.saved_errors) == len(expected_errors))
+ for i in range(len(expected_errors)):
+ assert str(helpers.saved_errors[i]).startswith(expected_errors[i])
+ finally:
+ clear_errors()
+
+
+def test_restore_over_existing_target(tmpdir):
+ path = tmpdir + b'/foo'
+ os.mkdir(path)
+ dir_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+ os.rmdir(path)
+ open(path, 'w').close()
+ file_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+ # Restore dir over file.
+ WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
+ WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
+ # Restore dir over dir.
+ WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
+ WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
+ # Restore file over dir.
+ WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
+ WVPASS(stat.S_ISREG(os.stat(path).st_mode))
+ # Restore file over file.
+ WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
+ WVPASS(stat.S_ISREG(os.stat(path).st_mode))
+ # Restore file over non-empty dir.
+ os.remove(path)
+ os.mkdir(path)
+ open(path + b'/bar', 'w').close()
+ WVEXCEPT(Exception, file_m.create_path, path, create_symlinks=True)
+ # Restore dir over non-empty dir.
+ os.remove(path + b'/bar')
+ os.mkdir(path + b'/bar')
+ WVEXCEPT(Exception, dir_m.create_path, path, create_symlinks=True)
+
+
+from bup.metadata import read_acl
+
+from bup.metadata import xattr
+if xattr:
+ def remove_selinux(attrs):
+ return list(filter(lambda i: not i in (b'security.selinux', ),
+ attrs))
+
+ def test_handling_of_incorrect_existing_linux_xattrs():
+ if not is_superuser() or detect_fakeroot():
+ pytest.skip('skipping test -- not superuser')
+ return
+ if not setup_testfs():
+ pytest.skip('unable to load loop module; skipping dependent tests')
+ return
+ for f in glob.glob(b'testfs/*'):
+ ex(b'rm', b'-rf', f)
+ path = b'testfs/foo'
+ open(path, 'w').close()
+ xattr.set(path, b'foo', b'bar', namespace=xattr.NS_USER)
+ m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+ xattr.set(path, b'baz', b'bax', namespace=xattr.NS_USER)
+ m.apply_to_path(path, restore_numeric_ids=False)
+ WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
+ WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
+ xattr.set(path, b'foo', b'baz', namespace=xattr.NS_USER)
+ m.apply_to_path(path, restore_numeric_ids=False)
+ WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
+ WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
+ xattr.remove(path, b'foo', namespace=xattr.NS_USER)
+ m.apply_to_path(path, restore_numeric_ids=False)
+ WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
+ WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
+ cleanup_testfs()
--- /dev/null
+
+from __future__ import absolute_import
+
+from wvpytest import *
+
+from bup import options
+
+
+def test_optdict():
+ d = options.OptDict({
+ 'x': ('x', False),
+ 'y': ('y', False),
+ 'z': ('z', False),
+ 'other_thing': ('other_thing', False),
+ 'no_other_thing': ('other_thing', True),
+ 'no_z': ('z', True),
+ 'no_smart': ('smart', True),
+ 'smart': ('smart', False),
+ 'stupid': ('smart', True),
+ 'no_smart': ('smart', False),
+ })
+ WVPASS('foo')
+ d['x'] = 5
+ d['y'] = 4
+ d['z'] = 99
+ d['no_other_thing'] = 5
+ WVPASSEQ(d.x, 5)
+ WVPASSEQ(d.y, 4)
+ WVPASSEQ(d.z, 99)
+ WVPASSEQ(d.no_z, False)
+ WVPASSEQ(d.no_other_thing, True)
+ WVEXCEPT(KeyError, lambda: d.p)
+
+
+invalid_optspec0 = """
+"""
+
+
+invalid_optspec1 = """
+prog <whatever>
+"""
+
+
+invalid_optspec2 = """
+--
+x,y
+"""
+
+
+def test_invalid_optspec():
+ WVPASS(options.Options(invalid_optspec0).parse([]))
+ WVPASS(options.Options(invalid_optspec1).parse([]))
+ WVPASS(options.Options(invalid_optspec2).parse([]))
+
+
+optspec = """
+prog <optionset> [stuff...]
+prog [-t] <boggle>
+--
+t test
+q,quiet quiet
+l,longoption= long option with parameters and a really really long description that will require wrapping
+p= short option with parameters
+onlylong long option with no short
+neveropt never called options
+deftest1= a default option with default [1]
+deftest2= a default option with [1] default [2]
+deftest3= a default option with [3] no actual default
+deftest4= a default option with [[square]]
+deftest5= a default option with "correct" [[square]
+s,smart,no-stupid disable stupidity
+x,extended,no-simple extended mode [2]
+#,compress= set compression level [5]
+"""
+
+def test_options():
+ o = options.Options(optspec)
+ (opt,flags,extra) = o.parse(['-tttqp', 7, '--longoption', '19',
+ 'hanky', '--onlylong', '-7'])
+ WVPASSEQ(flags[0], ('-t', ''))
+ WVPASSEQ(flags[1], ('-t', ''))
+ WVPASSEQ(flags[2], ('-t', ''))
+ WVPASSEQ(flags[3], ('-q', ''))
+ WVPASSEQ(flags[4], ('-p', 7))
+ WVPASSEQ(flags[5], ('--longoption', '19'))
+ WVPASSEQ(extra, ['hanky'])
+ WVPASSEQ((opt.t, opt.q, opt.p, opt.l, opt.onlylong,
+ opt.neveropt), (3,1,7,19,1,None))
+ WVPASSEQ((opt.deftest1, opt.deftest2, opt.deftest3, opt.deftest4,
+ opt.deftest5), (1,2,None,None,'[square'))
+ WVPASSEQ((opt.stupid, opt.no_stupid), (True, None))
+ WVPASSEQ((opt.smart, opt.no_smart), (None, True))
+ WVPASSEQ((opt.x, opt.extended, opt.no_simple), (2,2,2))
+ WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (False,False,False))
+ WVPASSEQ(opt['#'], 7)
+ WVPASSEQ(opt.compress, 7)
+
+ (opt,flags,extra) = o.parse(['--onlylong', '-t', '--no-onlylong',
+ '--smart', '--simple'])
+ WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, 0))
+ WVPASSEQ((opt.stupid, opt.no_stupid), (False, True))
+ WVPASSEQ((opt.smart, opt.no_smart), (True, False))
+ WVPASSEQ((opt.x, opt.extended, opt.no_simple), (0,0,0))
+ WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (True,True,True))
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from binascii import unhexlify
+from errno import ELOOP, ENOTDIR
+from os import symlink
+from stat import S_IFDIR
+from sys import stderr
+import os
+from time import localtime, strftime
+
+from wvpytest import *
+
+from bup import git, path, vfs
+from bup.compat import environ
+from bup.io import path_msg
+from bup.metadata import Metadata
+from bup.repo import LocalRepo, RemoteRepo
+from buptest import ex, exo
+from buptest.vfs import tree_dict
+
+bup_path = path.exe()
+
+## The clear_cache() calls below are to make sure that the test starts
+## from a known state since at the moment the cache entry for a given
+## item (like a commit) can change. For example, its meta value might
+## be promoted from a mode to a Metadata instance once the tree it
+## refers to is traversed.
+
+def prep_and_test_repo(tmpdir, create_repo, test_repo):
+ bup_dir = tmpdir + b'/bup'
+ environ[b'GIT_DIR'] = bup_dir
+ environ[b'BUP_DIR'] = bup_dir
+ ex((bup_path, b'init'))
+ git.repodir = bup_dir
+ with create_repo(bup_dir) as repo:
+ test_repo(repo, tmpdir)
+
+# Currently, we just test through the repos since LocalRepo resolve is
+# just a straight redirection to vfs.resolve.
+
+def _test_resolve(repo, tmpdir):
+ data_path = tmpdir + b'/src'
+ resolve = repo.resolve
+ save_time = 100000
+ save_time_str = strftime('%Y-%m-%d-%H%M%S', localtime(save_time)).encode('ascii')
+ os.mkdir(data_path)
+ os.mkdir(data_path + b'/dir')
+ with open(data_path + b'/file', 'wb+') as tmpfile:
+ tmpfile.write(b'canary\n')
+ symlink(b'file', data_path + b'/file-symlink')
+ symlink(b'dir', data_path + b'/dir-symlink')
+ symlink(b'not-there', data_path + b'/bad-symlink')
+ ex((bup_path, b'index', b'-v', data_path))
+ ex((bup_path, b'save', b'-d', b'%d' % save_time, b'-tvvn', b'test',
+ b'--strip', data_path))
+ ex((bup_path, b'tag', b'test-tag', b'test'))
+
+ tip_hash = exo((b'git', b'show-ref', b'refs/heads/test'))[0]
+ tip_oidx = tip_hash.strip().split()[0]
+ tip_oid = unhexlify(tip_oidx)
+ tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
+ tip_oidx))[0].strip()
+ tip_tree_oid = unhexlify(tip_tree_oidx)
+ tip_tree = tree_dict(repo, tip_tree_oid)
+ test_revlist_w_meta = vfs.RevList(meta=tip_tree[b'.'].meta,
+ oid=tip_oid)
+ expected_latest_item = vfs.Commit(meta=S_IFDIR | 0o755,
+ oid=tip_tree_oid,
+ coid=tip_oid)
+ expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
+ oid=tip_tree_oid,
+ coid=tip_oid)
+ expected_latest_link = vfs.FakeLink(meta=vfs.default_symlink_mode,
+ target=save_time_str)
+ expected_test_tag_item = expected_latest_item
+
+ vfs.clear_cache()
+ res = resolve(b'/')
+ wvpasseq(1, len(res))
+ wvpasseq(((b'', vfs._root),), res)
+ ignore, root_item = res[0]
+ root_content = frozenset(vfs.contents(repo, root_item))
+ wvpasseq(frozenset([(b'.', root_item),
+ (b'.tag', vfs._tags),
+ (b'test', test_revlist_w_meta)]),
+ root_content)
+ for path in (b'//', b'/.', b'/./', b'/..', b'/../',
+ b'/test/latest/dir/../../..',
+ b'/test/latest/dir/../../../',
+ b'/test/latest/dir/../../../.',
+ b'/test/latest/dir/../../..//',
+ b'/test//latest/dir/../../..',
+ b'/test/./latest/dir/../../..',
+ b'/test/././latest/dir/../../..',
+ b'/test/.//./latest/dir/../../..',
+ b'/test//.//.//latest/dir/../../..'
+ b'/test//./latest/dir/../../..'):
+ vfs.clear_cache()
+ res = resolve(path)
+ wvpasseq(((b'', vfs._root),), res)
+
+ vfs.clear_cache()
+ res = resolve(b'/.tag')
+ wvpasseq(2, len(res))
+ wvpasseq(((b'', vfs._root), (b'.tag', vfs._tags)),
+ res)
+ ignore, tag_item = res[1]
+ tag_content = frozenset(vfs.contents(repo, tag_item))
+ wvpasseq(frozenset([(b'.', tag_item),
+ (b'test-tag', expected_test_tag_item)]),
+ tag_content)
+
+ vfs.clear_cache()
+ res = resolve(b'/test')
+ wvpasseq(2, len(res))
+ wvpasseq(((b'', vfs._root), (b'test', test_revlist_w_meta)), res)
+ ignore, test_item = res[1]
+ test_content = frozenset(vfs.contents(repo, test_item))
+ # latest has metadata here due to caching
+ wvpasseq(frozenset([(b'.', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'latest', expected_latest_link)]),
+ test_content)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest')
+ wvpasseq(3, len(res))
+ expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
+ oid=tip_tree_oid,
+ coid=tip_oid)
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta))
+ wvpasseq(expected, res)
+ ignore, latest_item = res[2]
+ latest_content = frozenset(vfs.contents(repo, latest_item))
+ expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
+ for x in (tip_tree[name]
+ for name in (b'.',
+ b'bad-symlink',
+ b'dir',
+ b'dir-symlink',
+ b'file',
+ b'file-symlink')))
+ wvpasseq(expected, latest_content)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/file')
+ wvpasseq(4, len(res))
+ expected_file_item_w_meta = vfs.Item(meta=tip_tree[b'file'].meta,
+ oid=tip_tree[b'file'].oid)
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'file', expected_file_item_w_meta))
+ wvpasseq(expected, res)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/bad-symlink')
+ wvpasseq(4, len(res))
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'not-there', None))
+ wvpasseq(expected, res)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/bad-symlink', follow=False)
+ wvpasseq(4, len(res))
+ bad_symlink_value = tip_tree[b'bad-symlink']
+ expected_bad_symlink_item_w_meta = vfs.Item(meta=bad_symlink_value.meta,
+ oid=bad_symlink_value.oid)
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'bad-symlink', expected_bad_symlink_item_w_meta))
+ wvpasseq(expected, res)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/file-symlink')
+ wvpasseq(4, len(res))
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'file', expected_file_item_w_meta))
+ wvpasseq(expected, res)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/file-symlink', follow=False)
+ wvpasseq(4, len(res))
+ file_symlink_value = tip_tree[b'file-symlink']
+ expected_file_symlink_item_w_meta = vfs.Item(meta=file_symlink_value.meta,
+ oid=file_symlink_value.oid)
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'file-symlink', expected_file_symlink_item_w_meta))
+ wvpasseq(expected, res)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/missing')
+ wvpasseq(4, len(res))
+ name, item = res[-1]
+ wvpasseq(b'missing', name)
+ wvpass(item is None)
+
+ for path in (b'/test/latest/file/',
+ b'/test/latest/file/.',
+ b'/test/latest/file/..',
+ b'/test/latest/file/../',
+ b'/test/latest/file/../.',
+ b'/test/latest/file/../..',
+ b'/test/latest/file/foo'):
+ vfs.clear_cache()
+ try:
+ resolve(path)
+ except vfs.IOError as res_ex:
+ wvpasseq(ENOTDIR, res_ex.errno)
+ wvpasseq([b'', b'test', save_time_str, b'file'],
+ [name for name, item in res_ex.terminus])
+
+ for path in (b'/test/latest/file-symlink/',
+ b'/test/latest/file-symlink/.',
+ b'/test/latest/file-symlink/..',
+ b'/test/latest/file-symlink/../',
+ b'/test/latest/file-symlink/../.',
+ b'/test/latest/file-symlink/../..'):
+ vfs.clear_cache()
+ try:
+ resolve(path, follow=False)
+ except vfs.IOError as res_ex:
+ wvpasseq(ENOTDIR, res_ex.errno)
+ wvpasseq([b'', b'test', save_time_str, b'file'],
+ [name for name, item in res_ex.terminus])
+
+ vfs.clear_cache()
+ file_res = resolve(b'/test/latest/file')
+ try:
+ resolve(b'foo', parent=file_res)
+ except vfs.IOError as res_ex:
+ wvpasseq(ENOTDIR, res_ex.errno)
+ wvpasseq(None, res_ex.terminus)
+
+ vfs.clear_cache()
+ res = resolve(b'/test/latest/dir-symlink', follow=False)
+ wvpasseq(4, len(res))
+ dir_symlink_value = tip_tree[b'dir-symlink']
+ expected_dir_symlink_item_w_meta = vfs.Item(meta=dir_symlink_value.meta,
+ oid=dir_symlink_value.oid)
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'dir-symlink', expected_dir_symlink_item_w_meta))
+ wvpasseq(expected, res)
+
+ dir_value = tip_tree[b'dir']
+ expected_dir_item = vfs.Item(oid=dir_value.oid,
+ meta=tree_dict(repo, dir_value.oid)[b'.'].meta)
+ expected = ((b'', vfs._root),
+ (b'test', test_revlist_w_meta),
+ (save_time_str, expected_latest_item_w_meta),
+ (b'dir', expected_dir_item))
+ def lresolve(*args, **keys):
+ return resolve(*args, **dict(keys, follow=False))
+ for resname, resolver in (('resolve', resolve),
+ ('resolve nofollow', lresolve)):
+ for path in (b'/test/latest/dir-symlink/',
+ b'/test/latest/dir-symlink/.'):
+ vfs.clear_cache()
+ res = resolver(path)
+ wvpasseq(4, len(res))
+ wvpasseq(expected, res)
+ vfs.clear_cache()
+ res = resolve(path)
+ wvpasseq(4, len(res))
+ wvpasseq(expected, res)
+
+def test_local_resolve(tmpdir):
+ prep_and_test_repo(tmpdir,
+ lambda x: LocalRepo(repo_dir=x), _test_resolve)
+
+def test_remote_resolve(tmpdir):
+ prep_and_test_repo(tmpdir,
+ lambda x: RemoteRepo(x), _test_resolve)
+
+def _test_resolve_loop(repo, tmpdir):
+ data_path = tmpdir + b'/src'
+ os.mkdir(data_path)
+ symlink(b'loop', data_path + b'/loop')
+ ex((bup_path, b'init'))
+ ex((bup_path, b'index', b'-v', data_path))
+ save_utc = 100000
+ ex((bup_path, b'save', b'-d', b'%d' % save_utc, b'-tvvn', b'test', b'--strip',
+ data_path))
+ save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
+ try:
+ wvpasseq('this call should never return',
+ repo.resolve(b'/test/%s/loop' % save_name))
+ except vfs.IOError as res_ex:
+ wvpasseq(ELOOP, res_ex.errno)
+ wvpasseq([b'', b'test', save_name, b'loop'],
+ [name for name, item in res_ex.terminus])
+
+def test_local_resolve_loop(tmpdir):
+ prep_and_test_repo(tmpdir,
+ lambda x: LocalRepo(x), _test_resolve_loop)
+
+def test_remote_resolve_loop(tmpdir):
+ prep_and_test_repo(tmpdir,
+ lambda x: RemoteRepo(x), _test_resolve_loop)
+
+# FIXME: add tests for the want_meta=False cases.
--- /dev/null
+
+from __future__ import absolute_import
+
+from wvpytest import *
+
+from bup import shquote
+
+
+def qst(line):
+ return [word for offset,word in shquote.quotesplit(line)]
+
+def test_shquote():
+ WVPASSEQ(qst(b""" this is basic \t\n\r text """),
+ [b'this', b'is', b'basic', b'text'])
+ WVPASSEQ(qst(br""" \"x\" "help" 'yelp' """), [b'"x"', b'help', b'yelp'])
+ WVPASSEQ(qst(br""" "'\"\"'" '\"\'' """), [b"'\"\"'", b'\\"\''])
+
+ WVPASSEQ(shquote.quotesplit(b' this is "unfinished'),
+ [(2, b'this'), (7, b'is'), (10, b'unfinished')])
+
+ WVPASSEQ(shquote.quotesplit(b'"silly"\'will'),
+ [(0, b'silly'), (7, b'will')])
+
+ WVPASSEQ(shquote.unfinished_word(b'this is a "billy" "goat'),
+ (b'"', b'goat'))
+ WVPASSEQ(shquote.unfinished_word(b"'x"),
+ (b"'", b'x'))
+ WVPASSEQ(shquote.unfinished_word(b"abra cadabra "),
+ (None, b''))
+ WVPASSEQ(shquote.unfinished_word(b"abra cadabra"),
+ (None, b'cadabra'))
+
+ qtype, word = shquote.unfinished_word(b"this is /usr/loc")
+ WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
+ b"al")
+ qtype, word = shquote.unfinished_word(b"this is '/usr/loc")
+ WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
+ b"al'")
+ qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
+ WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
+ b"al\"")
+ qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
+ WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", False),
+ b"al")
+ qtype, word = shquote.unfinished_word(b"this is \\ hammer\\ \"")
+ WVPASSEQ(word, b' hammer "')
+ WVPASSEQ(shquote.what_to_add(qtype, word, b" hammer \"time\"", True),
+ b"time\\\"")
+
+ WVPASSEQ(shquote.quotify_list([b'a', b'', b'"word"', b"'third'", b"'",
+ b"x y"]),
+ b"a '' '\"word\"' \"'third'\" \"'\" 'x y'")
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from binascii import unhexlify
+from collections import namedtuple
+from errno import ELOOP, ENOTDIR
+from io import BytesIO
+from os import symlink
+from random import Random, randint
+from stat import S_IFDIR, S_IFLNK, S_IFREG, S_ISDIR, S_ISREG
+from sys import stderr
+import os
+import sys
+from time import localtime, strftime, tzset
+
+from wvpytest import *
+
+from bup._helpers import write_random
+from bup import git, metadata, vfs
+from bup.compat import environ, fsencode, items, range
+from bup.git import BUP_CHUNKED
+from bup.helpers import exc, shstr
+from bup.metadata import Metadata
+from bup.repo import LocalRepo
+from buptest import ex, exo
+from buptest.vfs import tree_dict
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+top_dir = os.path.join(lib_t_dir, b'../..')
+bup_path = top_dir + b'/bup'
+
+def ex(cmd, **kwargs):
+ print(shstr(cmd), file=stderr)
+ return exc(cmd, **kwargs)
+
+def test_default_modes():
+ wvpasseq(S_IFREG | 0o644, vfs.default_file_mode)
+ wvpasseq(S_IFDIR | 0o755, vfs.default_dir_mode)
+ wvpasseq(S_IFLNK | 0o755, vfs.default_symlink_mode)
+
+def test_cache_behavior():
+ orig_max = vfs._cache_max_items
+ try:
+ vfs._cache_max_items = 2
+ vfs.clear_cache()
+ wvpasseq({}, vfs._cache)
+ wvpasseq([], vfs._cache_keys)
+ wvfail(vfs._cache_keys)
+ wvexcept(Exception, vfs.cache_notice, b'x', 1)
+ key_0 = b'itm:' + b'\0' * 20
+ key_1 = b'itm:' + b'\1' * 20
+ key_2 = b'itm:' + b'\2' * 20
+ vfs.cache_notice(key_0, b'something')
+ wvpasseq({key_0 : b'something'}, vfs._cache)
+ wvpasseq([key_0], vfs._cache_keys)
+ vfs.cache_notice(key_1, b'something else')
+ wvpasseq({key_0 : b'something', key_1 : b'something else'}, vfs._cache)
+ wvpasseq(frozenset([key_0, key_1]), frozenset(vfs._cache_keys))
+ vfs.cache_notice(key_2, b'and also')
+ wvpasseq(2, len(vfs._cache))
+ wvpass(frozenset(items(vfs._cache))
+ < frozenset(items({key_0 : b'something',
+ key_1 : b'something else',
+ key_2 : b'and also'})))
+ wvpasseq(2, len(vfs._cache_keys))
+ wvpass(frozenset(vfs._cache_keys) < frozenset([key_0, key_1, key_2]))
+ vfs.clear_cache()
+ wvpasseq({}, vfs._cache)
+ wvpasseq([], vfs._cache_keys)
+ finally:
+ vfs._cache_max_items = orig_max
+ vfs.clear_cache()
+
+## The clear_cache() calls below are to make sure that the test starts
+## from a known state since at the moment the cache entry for a given
+## item (like a commit) can change. For example, its meta value might
+## be promoted from a mode to a Metadata instance once the tree it
+## refers to is traversed.
+
+def run_augment_item_meta_tests(repo,
+ file_path, file_size,
+ link_path, link_target):
+ _, file_item = vfs.resolve(repo, file_path)[-1]
+ _, link_item = vfs.resolve(repo, link_path, follow=False)[-1]
+ wvpass(isinstance(file_item.meta, Metadata))
+ wvpass(isinstance(link_item.meta, Metadata))
+ # Note: normally, modifying item.meta values is forbidden
+ file_item.meta.size = file_item.meta.size or vfs.item_size(repo, file_item)
+ link_item.meta.size = link_item.meta.size or vfs.item_size(repo, link_item)
+
+ ## Ensure a fully populated item is left alone
+ augmented = vfs.augment_item_meta(repo, file_item)
+ wvpass(augmented is file_item)
+ wvpass(augmented.meta is file_item.meta)
+ augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
+ wvpass(augmented is file_item)
+ wvpass(augmented.meta is file_item.meta)
+
+ ## Ensure a missing size is handled poperly
+ file_item.meta.size = None
+ augmented = vfs.augment_item_meta(repo, file_item)
+ wvpass(augmented is file_item)
+ wvpass(augmented.meta is file_item.meta)
+ augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
+ wvpass(augmented is not file_item)
+ wvpasseq(file_size, augmented.meta.size)
+
+ ## Ensure a meta mode is handled properly
+ mode_item = file_item._replace(meta=vfs.default_file_mode)
+ augmented = vfs.augment_item_meta(repo, mode_item)
+ augmented_w_size = vfs.augment_item_meta(repo, mode_item, include_size=True)
+ for item in (augmented, augmented_w_size):
+ meta = item.meta
+ wvpass(item is not file_item)
+ wvpass(isinstance(meta, Metadata))
+ wvpasseq(vfs.default_file_mode, meta.mode)
+ wvpasseq((None, None, 0, 0, 0),
+ (meta.uid, meta.gid, meta.atime, meta.mtime, meta.ctime))
+ wvpass(augmented.meta.size is None)
+ wvpasseq(file_size, augmented_w_size.meta.size)
+
+ ## Ensure symlinks are handled properly
+ mode_item = link_item._replace(meta=vfs.default_symlink_mode)
+ augmented = vfs.augment_item_meta(repo, mode_item)
+ wvpass(augmented is not mode_item)
+ wvpass(isinstance(augmented.meta, Metadata))
+ wvpasseq(link_target, augmented.meta.symlink_target)
+ wvpasseq(len(link_target), augmented.meta.size)
+ augmented = vfs.augment_item_meta(repo, mode_item, include_size=True)
+ wvpass(augmented is not mode_item)
+ wvpass(isinstance(augmented.meta, Metadata))
+ wvpasseq(link_target, augmented.meta.symlink_target)
+ wvpasseq(len(link_target), augmented.meta.size)
+
+
+def test_item_mode():
+ mode = S_IFDIR | 0o755
+ meta = metadata.from_path(b'.')
+ oid = b'\0' * 20
+ wvpasseq(mode, vfs.item_mode(vfs.Item(oid=oid, meta=mode)))
+ wvpasseq(meta.mode, vfs.item_mode(vfs.Item(oid=oid, meta=meta)))
+
+def test_reverse_suffix_duplicates():
+ suffix = lambda x: tuple(vfs._reverse_suffix_duplicates(x))
+ wvpasseq((b'x',), suffix((b'x',)))
+ wvpasseq((b'x', b'y'), suffix((b'x', b'y')))
+ wvpasseq((b'x-1', b'x-0'), suffix((b'x',) * 2))
+ wvpasseq([b'x-%02d' % n for n in reversed(range(11))],
+ list(suffix((b'x',) * 11)))
+ wvpasseq((b'x-1', b'x-0', b'y'), suffix((b'x', b'x', b'y')))
+ wvpasseq((b'x', b'y-1', b'y-0'), suffix((b'x', b'y', b'y')))
+ wvpasseq((b'x', b'y-1', b'y-0', b'z'), suffix((b'x', b'y', b'y', b'z')))
+
+def test_misc(tmpdir):
+ bup_dir = tmpdir + b'/bup'
+ environ[b'GIT_DIR'] = bup_dir
+ environ[b'BUP_DIR'] = bup_dir
+ git.repodir = bup_dir
+ data_path = tmpdir + b'/src'
+ os.mkdir(data_path)
+ with open(data_path + b'/file', 'wb+') as tmpfile:
+ tmpfile.write(b'canary\n')
+ symlink(b'file', data_path + b'/symlink')
+ ex((bup_path, b'init'))
+ ex((bup_path, b'index', b'-v', data_path))
+ ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
+ b'--strip', data_path))
+ repo = LocalRepo()
+
+ ls_tree = exo((b'git', b'ls-tree', b'test', b'symlink')).out
+ mode, typ, oidx, name = ls_tree.strip().split(None, 3)
+ assert name == b'symlink'
+ link_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
+ wvpasseq(b'file', vfs.readlink(repo, link_item))
+
+ ls_tree = exo((b'git', b'ls-tree', b'test', b'file')).out
+ mode, typ, oidx, name = ls_tree.strip().split(None, 3)
+ assert name == b'file'
+ file_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
+ wvexcept(Exception, vfs.readlink, repo, file_item)
+
+ wvpasseq(4, vfs.item_size(repo, link_item))
+ wvpasseq(7, vfs.item_size(repo, file_item))
+ meta = metadata.from_path(fsencode(__file__))
+ meta.size = 42
+ fake_item = file_item._replace(meta=meta)
+ wvpasseq(42, vfs.item_size(repo, fake_item))
+
+ _, fakelink_item = vfs.resolve(repo, b'/test/latest', follow=False)[-1]
+ wvpasseq(17, vfs.item_size(repo, fakelink_item))
+
+ run_augment_item_meta_tests(repo,
+ b'/test/latest/file', 7,
+ b'/test/latest/symlink', b'file')
+
+ # FIXME: this caused StopIteration
+ #_, file_item = vfs.resolve(repo, '/file')[-1]
+ _, file_item = vfs.resolve(repo, b'/test/latest/file')[-1]
+ file_copy = vfs.copy_item(file_item)
+ wvpass(file_copy is not file_item)
+ wvpass(file_copy.meta is not file_item.meta)
+ wvpass(isinstance(file_copy, tuple))
+ wvpass(file_item.meta.user)
+ wvpass(file_copy.meta.user)
+ file_copy.meta.user = None
+ wvpass(file_item.meta.user)
+
+def write_sized_random_content(parent_dir, size, seed):
+ verbose = 0
+ with open(b'%s/%d' % (parent_dir, size), 'wb') as f:
+ write_random(f.fileno(), size, seed, verbose)
+
+def validate_vfs_streaming_read(repo, item, expected_path, read_sizes):
+ for read_size in read_sizes:
+ with open(expected_path, 'rb') as expected:
+ with vfs.fopen(repo, item) as actual:
+ ex_buf = expected.read(read_size)
+ act_buf = actual.read(read_size)
+ while ex_buf and act_buf:
+ wvpassge(read_size, len(ex_buf))
+ wvpassge(read_size, len(act_buf))
+ wvpasseq(len(ex_buf), len(act_buf))
+ wvpass(ex_buf == act_buf)
+ ex_buf = expected.read(read_size)
+ act_buf = actual.read(read_size)
+ wvpasseq(b'', ex_buf)
+ wvpasseq(b'', act_buf)
+
+def validate_vfs_seeking_read(repo, item, expected_path, read_sizes):
+ def read_act(act_pos):
+ with vfs.fopen(repo, item) as actual:
+ actual.seek(act_pos)
+ wvpasseq(act_pos, actual.tell())
+ act_buf = actual.read(read_size)
+ act_pos += len(act_buf)
+ wvpasseq(act_pos, actual.tell())
+ return act_pos, act_buf
+
+ for read_size in read_sizes:
+ with open(expected_path, 'rb') as expected:
+ ex_buf = expected.read(read_size)
+ act_buf = None
+ act_pos = 0
+ while ex_buf:
+ act_pos, act_buf = read_act(act_pos)
+ wvpassge(read_size, len(ex_buf))
+ wvpassge(read_size, len(act_buf))
+ wvpasseq(len(ex_buf), len(act_buf))
+ wvpass(ex_buf == act_buf)
+ if not act_buf:
+ break
+ ex_buf = expected.read(read_size)
+ else: # hit expected eof first
+ act_pos, act_buf = read_act(act_pos)
+ wvpasseq(b'', ex_buf)
+ wvpasseq(b'', act_buf)
+
+def test_read_and_seek(tmpdir):
+ # Write a set of randomly sized files containing random data whose
+ # names are their sizes, and then verify that what we get back
+ # from the vfs when seeking and reading with various block sizes
+ # matches the original content.
+ resolve = vfs.resolve
+ bup_dir = tmpdir + b'/bup'
+ environ[b'GIT_DIR'] = bup_dir
+ environ[b'BUP_DIR'] = bup_dir
+ git.repodir = bup_dir
+ repo = LocalRepo()
+ data_path = tmpdir + b'/src'
+ os.mkdir(data_path)
+ seed = randint(-(1 << 31), (1 << 31) - 1)
+ rand = Random()
+ rand.seed(seed)
+ print('test_read seed:', seed, file=sys.stderr)
+ max_size = 2 * 1024 * 1024
+ sizes = set((rand.randint(1, max_size) for _ in range(5)))
+ sizes.add(1)
+ sizes.add(max_size)
+ for size in sizes:
+ write_sized_random_content(data_path, size, seed)
+ ex((bup_path, b'init'))
+ ex((bup_path, b'index', b'-v', data_path))
+ ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
+ b'--strip', data_path))
+ read_sizes = set((rand.randint(1, max_size) for _ in range(10)))
+ sizes.add(1)
+ sizes.add(max_size)
+ print('test_read src sizes:', sizes, file=sys.stderr)
+ print('test_read read sizes:', read_sizes, file=sys.stderr)
+ for size in sizes:
+ res = resolve(repo, b'/test/latest/' + str(size).encode('ascii'))
+ _, item = res[-1]
+ wvpasseq(size, vfs.item_size(repo, res[-1][1]))
+ validate_vfs_streaming_read(repo, item,
+ b'%s/%d' % (data_path, size),
+ read_sizes)
+ validate_vfs_seeking_read(repo, item,
+ b'%s/%d' % (data_path, size),
+ read_sizes)
+
+def test_contents_with_mismatched_bupm_git_ordering(tmpdir):
+ bup_dir = tmpdir + b'/bup'
+ environ[b'GIT_DIR'] = bup_dir
+ environ[b'BUP_DIR'] = bup_dir
+ git.repodir = bup_dir
+ data_path = tmpdir + b'/src'
+ os.mkdir(data_path)
+ os.mkdir(data_path + b'/foo')
+ with open(data_path + b'/foo.', 'wb+') as tmpfile:
+ tmpfile.write(b'canary\n')
+ ex((bup_path, b'init'))
+ ex((bup_path, b'index', b'-v', data_path))
+ save_utc = 100000
+ save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
+ ex((bup_path, b'save', b'-tvvn', b'test', b'-d', b'%d' % save_utc,
+ b'--strip', data_path))
+ repo = LocalRepo()
+ tip_sref = exo((b'git', b'show-ref', b'refs/heads/test')).out
+ tip_oidx = tip_sref.strip().split()[0]
+ tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
+ tip_oidx)).out.strip()
+ tip_tree_oid = unhexlify(tip_tree_oidx)
+ tip_tree = tree_dict(repo, tip_tree_oid)
+
+ name, item = vfs.resolve(repo, b'/test/latest')[2]
+ wvpasseq(save_name, name)
+ expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
+ for x in (tip_tree[name]
+ for name in (b'.', b'foo', b'foo.')))
+ contents = tuple(vfs.contents(repo, item))
+ wvpasseq(expected, frozenset(contents))
+ # Spot check, in case tree_dict shares too much code with the vfs
+ name, item = next(((n, i) for n, i in contents if n == b'foo'))
+ wvpass(S_ISDIR(item.meta))
+ name, item = next(((n, i) for n, i in contents if n == b'foo.'))
+ wvpass(S_ISREG(item.meta.mode))
+
+def test_duplicate_save_dates(tmpdir):
+ bup_dir = tmpdir + b'/bup'
+ environ[b'GIT_DIR'] = bup_dir
+ environ[b'BUP_DIR'] = bup_dir
+ environ[b'TZ'] = b'UTC'
+ tzset()
+ git.repodir = bup_dir
+ data_path = tmpdir + b'/src'
+ os.mkdir(data_path)
+ with open(data_path + b'/file', 'wb+') as tmpfile:
+ tmpfile.write(b'canary\n')
+ ex((b'env',))
+ ex((bup_path, b'init'))
+ ex((bup_path, b'index', b'-v', data_path))
+ for i in range(11):
+ ex((bup_path, b'save', b'-d', b'100000', b'-n', b'test',
+ data_path))
+ repo = LocalRepo()
+ res = vfs.resolve(repo, b'/test')
+ wvpasseq(2, len(res))
+ name, revlist = res[-1]
+ wvpasseq(b'test', name)
+ wvpasseq((b'.',
+ b'1970-01-02-034640-00',
+ b'1970-01-02-034640-01',
+ b'1970-01-02-034640-02',
+ b'1970-01-02-034640-03',
+ b'1970-01-02-034640-04',
+ b'1970-01-02-034640-05',
+ b'1970-01-02-034640-06',
+ b'1970-01-02-034640-07',
+ b'1970-01-02-034640-08',
+ b'1970-01-02-034640-09',
+ b'1970-01-02-034640-10',
+ b'latest'),
+ tuple(sorted(x[0] for x in vfs.contents(repo, revlist))))
+
+def test_item_read_write():
+ x = vfs.Root(meta=13)
+ stream = BytesIO()
+ vfs.write_item(stream, x)
+ print('stream:', repr(stream.getvalue()), stream.tell(), file=sys.stderr)
+ stream.seek(0)
+ wvpasseq(x, vfs.read_item(stream))
--- /dev/null
+
+from __future__ import absolute_import
+from io import BytesIO
+
+from wvpytest import *
+
+from bup import vint
+
+
+def encode_and_decode_vuint(x):
+ f = BytesIO()
+ vint.write_vuint(f, x)
+ return vint.read_vuint(BytesIO(f.getvalue()))
+
+
+def test_vuint():
+ for x in (0, 1, 42, 128, 10**16):
+ WVPASSEQ(encode_and_decode_vuint(x), x)
+ WVEXCEPT(Exception, vint.write_vuint, BytesIO(), -1)
+ WVEXCEPT(EOFError, vint.read_vuint, BytesIO())
+
+
+def encode_and_decode_vint(x):
+ f = BytesIO()
+ vint.write_vint(f, x)
+ return vint.read_vint(BytesIO(f.getvalue()))
+
+
+def test_vint():
+ values = (0, 1, 42, 64, 10**16)
+ for x in values:
+ WVPASSEQ(encode_and_decode_vint(x), x)
+ for x in [-x for x in values]:
+ WVPASSEQ(encode_and_decode_vint(x), x)
+ WVEXCEPT(EOFError, vint.read_vint, BytesIO())
+ WVEXCEPT(EOFError, vint.read_vint, BytesIO(b"\x80\x80"))
+
+
+def encode_and_decode_bvec(x):
+ f = BytesIO()
+ vint.write_bvec(f, x)
+ return vint.read_bvec(BytesIO(f.getvalue()))
+
+
+def test_bvec():
+ values = (b'', b'x', b'foo', b'\0', b'\0foo', b'foo\0bar\0')
+ for x in values:
+ WVPASSEQ(encode_and_decode_bvec(x), x)
+ WVEXCEPT(EOFError, vint.read_bvec, BytesIO())
+ outf = BytesIO()
+ for x in (b'foo', b'bar', b'baz', b'bax'):
+ vint.write_bvec(outf, x)
+ inf = BytesIO(outf.getvalue())
+ WVPASSEQ(vint.read_bvec(inf), b'foo')
+ WVPASSEQ(vint.read_bvec(inf), b'bar')
+ vint.skip_bvec(inf)
+ WVPASSEQ(vint.read_bvec(inf), b'bax')
+
+
+def pack_and_unpack(types, *values):
+ data = vint.pack(types, *values)
+ return vint.unpack(types, data)
+
+
+def test_pack_and_unpack():
+ tests = [('', []),
+ ('s', [b'foo']),
+ ('ss', [b'foo', b'bar']),
+ ('sV', [b'foo', 0]),
+ ('sv', [b'foo', -1]),
+ ('V', [0]),
+ ('Vs', [0, b'foo']),
+ ('VV', [0, 1]),
+ ('Vv', [0, -1]),
+ ('v', [0]),
+ ('vs', [0, b'foo']),
+ ('vV', [0, 1]),
+ ('vv', [0, -1])]
+ for test in tests:
+ (types, values) = test
+ WVPASSEQ(pack_and_unpack(types, *values), values)
+ WVEXCEPT(Exception, vint.pack, 's')
+ WVEXCEPT(Exception, vint.pack, 's', 'foo', 'bar')
+ WVEXCEPT(Exception, vint.pack, 'x', 1)
+ WVEXCEPT(Exception, vint.unpack, 's', '')
+ WVEXCEPT(Exception, vint.unpack, 'x', '')
--- /dev/null
+
+from __future__ import absolute_import
+import math, tempfile, subprocess
+
+from wvpytest import *
+
+import bup._helpers as _helpers
+from bup import xstat
+
+
+def test_fstime():
+ WVPASSEQ(xstat.timespec_to_nsecs((0, 0)), 0)
+ WVPASSEQ(xstat.timespec_to_nsecs((1, 0)), 10**9)
+ WVPASSEQ(xstat.timespec_to_nsecs((0, 10**9 / 2)), 500000000)
+ WVPASSEQ(xstat.timespec_to_nsecs((1, 10**9 / 2)), 1500000000)
+ WVPASSEQ(xstat.timespec_to_nsecs((-1, 0)), -10**9)
+ WVPASSEQ(xstat.timespec_to_nsecs((-1, 10**9 / 2)), -500000000)
+ WVPASSEQ(xstat.timespec_to_nsecs((-2, 10**9 / 2)), -1500000000)
+ WVPASSEQ(xstat.timespec_to_nsecs((0, -1)), -1)
+ WVPASSEQ(type(xstat.timespec_to_nsecs((2, 22222222))), type(0))
+ WVPASSEQ(type(xstat.timespec_to_nsecs((-2, 22222222))), type(0))
+
+ WVPASSEQ(xstat.nsecs_to_timespec(0), (0, 0))
+ WVPASSEQ(xstat.nsecs_to_timespec(10**9), (1, 0))
+ WVPASSEQ(xstat.nsecs_to_timespec(500000000), (0, 10**9 / 2))
+ WVPASSEQ(xstat.nsecs_to_timespec(1500000000), (1, 10**9 / 2))
+ WVPASSEQ(xstat.nsecs_to_timespec(-10**9), (-1, 0))
+ WVPASSEQ(xstat.nsecs_to_timespec(-500000000), (-1, 10**9 / 2))
+ WVPASSEQ(xstat.nsecs_to_timespec(-1500000000), (-2, 10**9 / 2))
+ x = xstat.nsecs_to_timespec(1977777778)
+ WVPASSEQ(type(x[0]), type(0))
+ WVPASSEQ(type(x[1]), type(0))
+ x = xstat.nsecs_to_timespec(-1977777778)
+ WVPASSEQ(type(x[0]), type(0))
+ WVPASSEQ(type(x[1]), type(0))
+
+ WVPASSEQ(xstat.nsecs_to_timeval(0), (0, 0))
+ WVPASSEQ(xstat.nsecs_to_timeval(10**9), (1, 0))
+ WVPASSEQ(xstat.nsecs_to_timeval(500000000), (0, (10**9 / 2) / 1000))
+ WVPASSEQ(xstat.nsecs_to_timeval(1500000000), (1, (10**9 / 2) / 1000))
+ WVPASSEQ(xstat.nsecs_to_timeval(-10**9), (-1, 0))
+ WVPASSEQ(xstat.nsecs_to_timeval(-500000000), (-1, (10**9 / 2) / 1000))
+ WVPASSEQ(xstat.nsecs_to_timeval(-1500000000), (-2, (10**9 / 2) / 1000))
+ x = xstat.nsecs_to_timeval(1977777778)
+ WVPASSEQ(type(x[0]), type(0))
+ WVPASSEQ(type(x[1]), type(0))
+ x = xstat.nsecs_to_timeval(-1977777778)
+ WVPASSEQ(type(x[0]), type(0))
+ WVPASSEQ(type(x[1]), type(0))
+
+ WVPASSEQ(xstat.fstime_floor_secs(0), 0)
+ WVPASSEQ(xstat.fstime_floor_secs(10**9 / 2), 0)
+ WVPASSEQ(xstat.fstime_floor_secs(10**9), 1)
+ WVPASSEQ(xstat.fstime_floor_secs(-10**9 / 2), -1)
+ WVPASSEQ(xstat.fstime_floor_secs(-10**9), -1)
+ WVPASSEQ(type(xstat.fstime_floor_secs(10**9 / 2)), type(0))
+ WVPASSEQ(type(xstat.fstime_floor_secs(-10**9 / 2)), type(0))
+
+
+def test_bup_utimensat(tmpdir):
+ if not xstat._bup_utimensat:
+ return
+ path = tmpdir + b'/foo'
+ open(path, 'w').close()
+ frac_ts = (0, 10**9 // 2)
+ xstat._bup_utimensat(_helpers.AT_FDCWD, path, (frac_ts, frac_ts), 0)
+ st = _helpers.stat(path)
+ atime_ts = st[8]
+ mtime_ts = st[9]
+ WVPASSEQ(atime_ts[0], 0)
+ WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1])
+ WVPASSEQ(mtime_ts[0], 0)
+ WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1])
+
+
+def test_bup_utimes(tmpdir):
+ if not xstat._bup_utimes:
+ return
+ path = tmpdir + b'/foo'
+ open(path, 'w').close()
+ frac_ts = (0, 10**6 // 2)
+ xstat._bup_utimes(path, (frac_ts, frac_ts))
+ st = _helpers.stat(path)
+ atime_ts = st[8]
+ mtime_ts = st[9]
+ WVPASSEQ(atime_ts[0], 0)
+ WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
+ WVPASSEQ(mtime_ts[0], 0)
+ WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
+
+
+def test_bup_lutimes(tmpdir):
+ if not xstat._bup_lutimes:
+ return
+ path = tmpdir + b'/foo'
+ open(path, 'w').close()
+ frac_ts = (0, 10**6 // 2)
+ xstat._bup_lutimes(path, (frac_ts, frac_ts))
+ st = _helpers.stat(path)
+ atime_ts = st[8]
+ mtime_ts = st[9]
+ WVPASSEQ(atime_ts[0], 0)
+ WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
+ WVPASSEQ(mtime_ts[0], 0)
+ WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from collections import namedtuple
+from contextlib import contextmanager
+from os.path import abspath, basename, dirname, realpath
+from pipes import quote
+from subprocess import PIPE, Popen
+from traceback import extract_stack
+import errno, os, subprocess, sys, tempfile
+
+from bup import helpers
+from bup.compat import fsencode, str_type
+from bup.io import byte_stream
+
+
+ex_res = namedtuple('SubprocResult', ['out', 'err', 'proc', 'rc'])
+
+def run(cmd, check=True, input=None, **kwargs):
+ """Run a subprocess as per subprocess.Popen(cmd, **kwargs) followed by
+ communicate(input=input). If check is true, then throw an
+ exception if the subprocess exits with non-zero status. Return a
+ SubprocResult tuple.
+
+ """
+ if input:
+ assert 'stdin' not in kwargs
+ kwargs['stdin'] = PIPE
+ p = Popen(cmd, **kwargs)
+ out, err = p.communicate(input=input)
+ if check and p.returncode != 0:
+ raise Exception('subprocess %r failed with status %d%s'
+ % (cmd, p.returncode,
+ (', stderr: %r' % err) if err else ''))
+ return ex_res(out=out, err=err, proc=p, rc=p.returncode)
+
+def logcmd(cmd):
+ s = helpers.shstr(cmd)
+ if isinstance(cmd, str_type):
+ print(s, file=sys.stderr)
+ else:
+ # bytes - for now just escape it
+ print(s.decode(errors='backslashreplace'), file=sys.stderr)
+
+def ex(cmd, **kwargs):
+ """Print cmd to stderr and then run it as per ex(...).
+ Print the subprocess stderr to stderr if stderr=PIPE and there's
+ any data.
+ """
+ logcmd(cmd)
+ result = run(cmd, **kwargs)
+ if result.err:
+ sys.stderr.flush()
+ byte_stream(sys.stderr).write(result.err)
+ return result
+
+def exo(cmd, **kwargs):
+ """Print cmd to stderr and then run it as per ex(..., stdout=PIPE).
+ Print the subprocess stderr to stderr if stderr=PIPE and there's
+ any data.
+
+ """
+ assert 'stdout' not in kwargs
+ kwargs['stdout'] = PIPE
+ return ex(cmd, **kwargs)
--- /dev/null
+
+from __future__ import absolute_import, print_function
+from collections import namedtuple
+from stat import S_ISDIR
+
+from bup import vfs
+from bup.metadata import Metadata
+from bup.git import BUP_CHUNKED
+
+TreeDictValue = namedtuple('TreeDictValue', ('name', 'oid', 'meta'))
+
+def tree_items(repo, oid):
+ """Yield (name, entry_oid, meta) for each entry in oid. meta will be
+ a Metadata object for any non-directories and for '.', otherwise
+ None.
+
+ """
+ # This is a simpler approach than the one in the vfs, used to
+ # cross-check its behavior.
+ tree_data, bupm_oid = vfs.tree_data_and_bupm(repo, oid)
+ bupm = vfs._FileReader(repo, bupm_oid) if bupm_oid else None
+ try:
+ maybe_meta = lambda : Metadata.read(bupm) if bupm else None
+ m = maybe_meta()
+ if m and m.size is None:
+ m.size = 0
+ yield TreeDictValue(name=b'.', oid=oid, meta=m)
+ tree_ents = vfs.ordered_tree_entries(tree_data, bupm=True)
+ for name, mangled_name, kind, gitmode, sub_oid in tree_ents:
+ if mangled_name == b'.bupm':
+ continue
+ assert name != b'.'
+ if S_ISDIR(gitmode):
+ if kind == BUP_CHUNKED:
+ yield TreeDictValue(name=name, oid=sub_oid,
+ meta=maybe_meta())
+ else:
+ yield TreeDictValue(name=name, oid=sub_oid,
+ meta=vfs.default_dir_mode)
+ else:
+ yield TreeDictValue(name=name, oid=sub_oid, meta=maybe_meta())
+ finally:
+ if bupm:
+ bupm.close()
+
+def tree_dict(repo, oid):
+ return dict((x.name, x) for x in tree_items(repo, oid))
--- /dev/null
+import pytest
+
+def WVPASS(cond = True):
+ assert cond
+
+def WVFAIL(cond = True):
+ assert not cond
+
+def WVPASSEQ(a, b):
+ assert a == b
+
+def WVPASSNE(a, b):
+ assert a != b
+
+def WVPASSLT(a, b):
+ assert a < b
+
+def WVPASSLE(a, b):
+ assert a <= b
+
+def WVPASSGT(a, b):
+ assert a > b
+
+def WVPASSGE(a, b):
+ assert a >= b
+
+def WVEXCEPT(etype, func, *args, **kwargs):
+ with pytest.raises(etype):
+ func(*args, **kwargs)
+
+def WVCHECK(cond, msg):
+ assert cond, msg
+
+def WVMSG(msg):
+ print(msg)
+
+wvpass = WVPASS
+wvfail = WVFAIL
+wvpasseq = WVPASSEQ
+wvpassne = WVPASSNE
+wvpaslt = WVPASSLT
+wvpassle = WVPASSLE
+wvpassgt = WVPASSGT
+wvpassge = WVPASSGE
+wvexcept = WVEXCEPT
+wvcheck = WVCHECK
+wvmsg = WVMSG
+wvstart = WVMSG
--- /dev/null
+Sun Jan 3 01:54:26 EST 2010
--- /dev/null
+this file should come *before* y/ in the sort order, because of that
+trailing slash.
--- /dev/null
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
--- /dev/null
+this is a text file.
+
+See me be texty!
--- /dev/null
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
--- /dev/null
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pwba vf punatvat fbzr enaqbz olgrf urer naq gurers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+va nccebkvzngryl gur fnzr cynprEQBAYL)
+naq qvfgevo-0)
+hgvba nf(sq)
+
+va gur bevtvany grfg svyrfREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ tvir be gnxr n ovgerfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg qba'g npghnyyl cevag svyranzrf
+cebsvyr eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+ vzcbeg pCebsvyr
+ qrs qb_vg():
+ sbe v va vg:
+ cnff
+ pCebsvyr.eha('qb_vg()')
+ryfr:
+ vs bcg.dhvrg:
+ sbe v va vg:
+ cnff
+ ryfr:
+ sbe (anzr,fg) va vg:
+ cevag anzr
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+o,oybof bhgchg n frevrf bs oybo vqf
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg qba'g cevag cebterff zrffntrf
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr= znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf= znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg= znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+ bcg.abbc be bcg.pbcl):
+ b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be
+ bcg.pbzzvg be bcg.anzr):
+ b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+ tvg.ireobfr = bcg.ireobfr - 1
+ bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+ unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+ unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+ unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+ unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+ pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+ funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+ gerr = j.arj_gerr(funyvfg)
+ryfr:
+ ynfg = 0
+ sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+ unfufcyvg.gbgny_fcyvg += yra(oybo)
+ vs bcg.pbcl:
+ flf.fgqbhg.jevgr(fge(oybo))
+ zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+ vs abg bcg.dhvrg naq ynfg != zrtf:
+ cebterff('%q Zolgrf ernq\e' % zrtf)
+ ynfg = zrtf
+ cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+ ybt('\a')
+vs bcg.oybof:
+ sbe (zbqr,anzr,ova) va funyvfg:
+ cevag ova.rapbqr('urk')
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+vs j:
+ j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+ ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+ % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+ pyvfg = [pue(o) sbe o va olgrf]
+ erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+ svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+ q = {}
+ sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+ y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+ q[y[0]] = y[1]
+ vs pbhag >= 0:
+ r1 = pbhag
+ svryqf = [q[x] sbe x va svryqf]
+ ryfr:
+ r1 = ''
+ cevag ('%9f ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+ flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore= ahzore bs bowrpgf cre plpyr
+p,plpyrf= ahzore bs plpyrf gb eha
+vtaber-zvqk vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+ sbe a va kenatr(ahzore):
+ o = s.ernq(3)
+ vs 0:
+ olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+ olgrf[2] &= 0ks0
+ ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+ ryfr:
+ n[0:2] = o[0:2]
+ n[2] = pue(beq(o[2]) & 0ks0)
+ ova = fge(n[0:20])
+ #cevag ova.rapbqr('urk')
+ z.rkvfgf(ova)
+ ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+ cersvk = ''
+ vs bcg.unfu:
+ cersvk += "%f " % a.unfu.rapbqr('urk')
+ vs fgng.F_VFQVE(a.zbqr):
+ cevag '%f%f/' % (cersvk, grkg)
+ ryvs fgng.F_VFYAX(a.zbqr):
+ cevag '%f%f@' % (cersvk, grkg)
+ ryfr:
+ cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+ rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+ gel:
+ a = gbc.yerfbyir(q)
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ cevag_abqr(fho.anzr, fho)
+ ryfr:
+ cevag_abqr(q, a)
+ rkprcg isf.AbqrReebe, r:
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+ vs fgng.F_VFQVE(a.zbqr):
+ erghea '%f/' % grkg
+ ryvs fgng.F_VFYAX(a.zbqr):
+ erghea '%f@' % grkg
+ ryfr:
+ erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+ y = []
+ vs fgng.F_VFQVE(a.zbqr):
+ sbe fho va a:
+ y.nccraq(abqr_anzr(fho.anzr, fho))
+ ryfr:
+ y.nccraq(abqr_anzr(cngu, a))
+ cevag pbyhzangr(y, '')
+
+
+qrs jevgr_gb_svyr(vas, bhgs):
+ sbe oybo va puhaxlernqre(vas):
+ bhgs.jevgr(oybo)
+
+
+qrs vachgvgre():
+ vs bf.vfnggl(flf.fgqva.svyrab()):
+ juvyr 1:
+ gel:
+ lvryq enj_vachg('ohc> ')
+ rkprcg RBSReebe:
+ oernx
+ ryfr:
+ sbe yvar va flf.fgqva:
+ lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+ (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+ (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+ #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+ a = cjq.erfbyir(qve)
+ fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+ a.fhof()))
+ erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+ tybony _ynfg_yvar
+ tybony _ynfg_erf
+ gel:
+ yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+ vs _ynfg_yvar != yvar:
+ _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+ _ynfg_yvar = yvar
+ (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+ vs fgngr < yra(fhof):
+ fa = fhof[fgngr]
+ fa1 = fa.erfbyir('') # qrers flzyvaxf
+ shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+ vs fgng.F_VFQVE(fa1.zbqr):
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+ grezvangr=Snyfr)
+ ryfr:
+ erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+ grezvangr=Gehr) + ' '
+ erghea grkg + erg
+ rkprcg Rkprcgvba, r:
+ ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+ yvarf = rkgen
+ryfr:
+ ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+ ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+ ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+ yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+ vs abg yvar.fgevc():
+ pbagvahr
+ jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+ pzq = jbeqf[0].ybjre()
+ #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+ gel:
+ vs pzq == 'yf':
+ sbe cnez va (jbeqf[1:] be ['.']):
+ qb_yf(cnez, cjq.erfbyir(cnez))
+ ryvs pzq == 'pq':
+ sbe cnez va jbeqf[1:]:
+ cjq = cjq.erfbyir(cnez)
+ ryvs pzq == 'cjq':
+ cevag cjq.shyyanzr()
+ ryvs pzq == 'png':
+ sbe cnez va jbeqf[1:]:
+ jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+ ryvs pzq == 'trg':
+ vs yra(jbeqf) abg va [2,3]:
+ envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+ eanzr = jbeqf[1]
+ (qve,onfr) = bf.cngu.fcyvg(eanzr)
+ yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+ vas = cjq.erfbyir(eanzr).bcra()
+ ybt('Fnivat %e\a' % yanzr)
+ jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+ ryvs pzq == 'ztrg':
+ sbe cnez va jbeqf[1:]:
+ (qve,onfr) = bf.cngu.fcyvg(cnez)
+ sbe a va cjq.erfbyir(qve).fhof():
+ vs sazngpu.sazngpu(a.anzr, onfr):
+ gel:
+ ybt('Fnivat %e\a' % a.anzr)
+ vas = a.bcra()
+ bhgs = bcra(a.anzr, 'jo')
+ jevgr_gb_svyr(vas, bhgs)
+ bhgs.pybfr()
+ rkprcg Rkprcgvba, r:
+ ybt(' reebe: %f\a' % r)
+ ryvs pzq == 'uryc' be pzq == '?':
+ ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+ ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+ oernx
+ ryfr:
+ envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+ rkprcg Rkprcgvba, r:
+ ybt('reebe: %f\a' % r)
+ #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq= bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+ abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+ _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+ ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+ # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+ bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+ qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+ rkr = flf.neti[0]
+ (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+ znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+ t = tybo.tybo(znacngu)
+ vs t:
+ bf.rkrpic('zna', ['zna', '-y', t[0]])
+ ryfr:
+ bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+ b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+ qrs __vavg__(frys):
+ frys.fg_zbqr = 0
+ frys.fg_vab = 0
+ frys.fg_qri = 0
+ frys.fg_ayvax = 0
+ frys.fg_hvq = 0
+ frys.fg_tvq = 0
+ frys.fg_fvmr = 0
+ frys.fg_ngvzr = 0
+ frys.fg_zgvzr = 0
+ frys.fg_pgvzr = 0
+ frys.fg_oybpxf = 0
+ frys.fg_oyxfvmr = 0
+ frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+ cnegf = cngu.fcyvg('/')
+ pnpur[('',)] = gbc
+ p = Abar
+ znk = yra(cnegf)
+ #ybt('pnpur: %e\a' % pnpur.xrlf())
+ sbe v va enatr(znk):
+ cer = cnegf[:znk-v]
+ #ybt('pnpur gelvat: %e\a' % cer)
+ p = pnpur.trg(ghcyr(cer))
+ vs p:
+ erfg = cnegf[znk-v:]
+ sbe e va erfg:
+ #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+ p = p.yerfbyir(e)
+ xrl = ghcyr(cer + [e])
+ #ybt('fnivat: %e\a' % (xrl,))
+ pnpur[xrl] = p
+ oernx
+ nffreg(p)
+ erghea p
+
+
+
+pynff OhcSf(shfr.Shfr):
+ qrs __vavg__(frys, gbc):
+ shfr.Shfr.__vavg__(frys)
+ frys.gbc = gbc
+
+ qrs trgngge(frys, cngu):
+ ybt('--trgngge(%e)\a' % cngu)
+ gel:
+ abqr = pnpur_trg(frys.gbc, cngu)
+ fg = Fgng()
+ fg.fg_zbqr = abqr.zbqr
+ fg.fg_ayvax = abqr.ayvaxf()
+ fg.fg_fvmr = abqr.fvmr()
+ fg.fg_zgvzr = abqr.zgvzr
+ fg.fg_pgvzr = abqr.pgvzr
+ fg.fg_ngvzr = abqr.ngvzr
+ erghea fg
+ rkprcg isf.AbFhpuSvyr:
+ erghea -reeab.RABRAG
+
+ qrs ernqqve(frys, cngu, bssfrg):
+ ybt('--ernqqve(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ lvryq shfr.Qveragel('.')
+ lvryq shfr.Qveragel('..')
+ sbe fho va abqr.fhof():
+ lvryq shfr.Qveragel(fho.anzr)
+
+ qrs ernqyvax(frys, cngu):
+ ybt('--ernqyvax(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ erghea abqr.ernqyvax()
+
+ qrs bcra(frys, cngu, syntf):
+ ybt('--bcra(%e)\a' % cngu)
+ abqr = pnpur_trg(frys.gbc, cngu)
+ nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+ vs (syntf & nppzbqr) != bf.B_EQBAYL:
+ erghea -reeab.RNPPRF
+ abqr.bcra()
+
+ qrs eryrnfr(frys, cngu, syntf):
+ ybt('--eryrnfr(%e)\a' % cngu)
+
+ qrs ernq(frys, cngu, fvmr, bssfrg):
+ ybt('--ernq(%e)\a' % cngu)
+ a = pnpur_trg(frys.gbc, cngu)
+ b = a.bcra()
+ b.frrx(bssfrg)
+ erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+ envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht vapernfr qroht yriry
+s,sbertebhaq eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+ b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+ s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+ s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+ tvg.vavg_ercb() # ybpny ercb
+ tvg.purpx_ercb_be_qvr()
+ pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+ pyv.pybfr()
+ryfr:
+ tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+ pbhag = 0
+ sbe r va tvg.vqkzretr(vqkyvfg):
+ pbhag += 1
+ cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+ gnoyr[cersvk] = pbhag
+ lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+ vs abg bhgsvyranzr:
+ nffreg(bhgqve)
+ fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+ bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+
+ vac = []
+ gbgny = 0
+ sbe anzr va vasvyranzrf:
+ vk = tvg.CnpxVqk(anzr)
+ vac.nccraq(vk)
+ gbgny += yra(vk)
+
+ ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+ vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+ be (bcg.sbepr naq abg gbgny):
+ ybt('zvqk: abguvat gb qb.\a')
+ erghea
+
+ cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+ ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+ ragevrf = 2**ovgf
+ ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+
+ gnoyr = [0]*ragevrf
+
+ gel:
+ bf.hayvax(bhgsvyranzr)
+ rkprcg BFReebe:
+ cnff
+ s = bcra(bhgsvyranzr + '.gzc', 'j+')
+ s.jevgr('ZVQK\0\0\0\2')
+ s.jevgr(fgehpg.cnpx('!V', ovgf))
+ nffreg(s.gryy() == 12)
+ s.jevgr('\0'*4*ragevrf)
+
+ sbe r va zretr(vac, ovgf, gnoyr):
+ s.jevgr(r)
+
+ s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+ s.frrx(12)
+ s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+ s.pybfr()
+ bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+ # guvf vf whfg sbe grfgvat
+ vs 0:
+ c = tvg.CnpxZvqk(bhgsvyranzr)
+ nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+ cevag c.vqkanzrf
+ nffreg(yra(c) == gbgny)
+ cv = vgre(c)
+ sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+ nffreg(v == cv.arkg())
+ nffreg(c.rkvfgf(v))
+
+ cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg= bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+ b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+ qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+ cnguf = [tvg.ercb('bowrpgf/cnpx')]
+ cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+ sbe cngu va cnguf:
+ ybt('zvqk: fpnaavat %f\a' % cngu)
+ vs bcg.sbepr:
+ qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+ ryvs bcg.nhgb:
+ z = tvg.CnpxVqkYvfg(cngu)
+ arrqrq = {}
+ sbe cnpx va z.cnpxf: # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+ vs cnpx.anzr.raqfjvgu('.vqk'):
+ arrqrq[cnpx.anzr] = 1
+ qry z
+ qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+ ybt('\a')
+ryfr:
+ b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+ y = []
+ sbe v va kenatr(a):
+ y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+ erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+ JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz= ahzore bs oybpxf gb qnzntr
+f,fvmr= znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq= enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+ b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+ enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+ ybt('Qnzntvat "%f"...\a' % anzr)
+ s = bcra(anzr, 'e+o')
+ fg = bf.sfgng(s.svyrab())
+ fvmr = fg.fg_fvmr
+ vs bcg.creprag be bcg.fvmr:
+ zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+ zf2 = bcg.fvmr be fvmr
+ znkfvmr = zva(zf1, zf2)
+ ryfr:
+ znkfvmr = 1
+ puhaxf = bcg.ahz be 10
+ puhaxfvmr = fvmr/puhaxf
+ sbe e va enatr(puhaxf):
+ fm = enaqbz.enaqenatr(1, znkfvmr+1)
+ vs fm > fvmr:
+ fm = fvmr
+ vs bcg.rdhny:
+ bsf = e*puhaxfvmr
+ ryfr:
+ bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+ ybt(' %6q olgrf ng %q\a' % (fm, bsf))
+ s.frrx(bsf)
+ s.jevgr(enaqoybpx(fm))
+ s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+ tvg.vavg_ercb(net)
+ ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+ tvg.purpx_ercb_be_qvr(net)
+ ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+ pbaa.bx()
+
+
+qrs yvfg_vaqrkrf(pbaa, whax):
+ tvg.purpx_ercb_be_qvr()
+ sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+ vs s.raqfjvgu('.vqk'):
+ pbaa.jevgr('%f\a' % s)
+ pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+ tvg.purpx_ercb_be_qvr()
+ nffreg(anzr.svaq('/') < 0)
+ nffreg(anzr.raqfjvgu('.vqk'))
+ vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+ pbaa.jevgr(vqk.znc)
+ pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+ tybony fhfcraqrq_j
+ tvg.purpx_ercb_be_qvr()
+ fhttrfgrq = {}
+ vs fhfcraqrq_j:
+ j = fhfcraqrq_j
+ fhfcraqrq_j = Abar
+ ryfr:
+ j = tvg.CnpxJevgre()
+ juvyr 1:
+ af = pbaa.ernq(4)
+ vs abg af:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+ a = fgehpg.hacnpx('!V', af)[0]
+ #ybt('rkcrpgvat %q olgrf\a' % a)
+ vs abg a:
+ ybt('ohc freire: erprvirq %q bowrpg%f.\a'
+ % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+ shyycngu = j.pybfr()
+ vs shyycngu:
+ (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+ pbaa.jevgr('%f.vqk\a' % anzr)
+ pbaa.bx()
+ erghea
+ ryvs a == 0kssssssss:
+ ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+ fhfcraqrq_j = j
+ pbaa.bx()
+ erghea
+
+ ohs = pbaa.ernq(a) # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+ #ybt('ernq %q olgrf\a' % a)
+ vs yra(ohs) < a:
+ j.nobeg()
+ envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+ % (a, yra(ohs)))
+ (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+ fun = tvg.pnyp_unfu(glcr, pbagrag)
+ byqcnpx = j.rkvfgf(fun)
+ # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+ # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+ # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+ # ba gur freire fvqr.
+ vs abg fhttrfgrq naq \
+ byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+ # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+ # ng guvf ynlre. Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+ # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+ # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+ # znxr gur svyrf ovttre. Guvf zrgubq vf pregnvayl abg irel
+ # rssvpvrag.
+ j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+ byqcnpx = j.bowpnpur.rkvfgf(fun)
+ ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+ nffreg(byqcnpx)
+ nffreg(byqcnpx != Gehr)
+ nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+ j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+ vs abg fhttrfgrq naq byqcnpx:
+ nffreg(byqcnpx.raqfjvgu('.vqk'))
+ (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+ vs abg (anzr va fhttrfgrq):
+ ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+ pbaa.jevgr('vaqrk %f\a' % anzr)
+ fhttrfgrq[anzr] = 1
+ ryfr:
+ j._enj_jevgr([ohs])
+ # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ e = tvg.ernq_ers(ersanzr)
+ pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+ pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+ tvg.purpx_ercb_be_qvr()
+ arjiny = pbaa.ernqyvar().fgevc()
+ byqiny = pbaa.ernqyvar().fgevc()
+ tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+ pbaa.bx()
+
+
+qrs png(pbaa, vq):
+ tvg.purpx_ercb_be_qvr()
+ gel:
+ sbe oybo va tvg.png(vq):
+ pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+ pbaa.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ ybt('freire: reebe: %f\a' % r)
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.reebe(r)
+ ryfr:
+ pbaa.jevgr('\0\0\0\0')
+ pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+ 'vavg-qve': vavg_qve,
+ 'frg-qve': frg_qve,
+ 'yvfg-vaqrkrf': yvfg_vaqrkrf,
+ 'fraq-vaqrk': fraq_vaqrk,
+ 'erprvir-bowrpgf': erprvir_bowrpgf,
+ 'ernq-ers': ernq_ers,
+ 'hcqngr-ers': hcqngr_ers,
+ 'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+ yvar = _yvar.fgevc()
+ vs abg yvar:
+ pbagvahr
+ ybt('ohc freire: pbzznaq: %e\a' % yvar)
+ jbeqf = yvar.fcyvg(' ', 1)
+ pzq = jbeqf[0]
+ erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+ vs pzq == 'dhvg':
+ oernx
+ ryfr:
+ pzq = pbzznaqf.trg(pzq)
+ vs pzq:
+ pzq(pbaa, erfg)
+ ryfr:
+ envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ png = pyv.png
+ryfr:
+ pc = tvg.PngCvcr()
+ png = pc.wbva
+
+sbe vq va rkgen:
+ gel:
+ sbe oybo va png(vq):
+ flf.fgqbhg.jevgr(oybo)
+ rkprcg XrlReebe, r:
+ flf.fgqbhg.syhfu()
+ ybt('reebe: %f\a' % r)
+ erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr= erzbgr ercbfvgbel cngu
+g,gerr bhgchg n gerr vq
+p,pbzzvg bhgchg n pbzzvg vq
+a,anzr= anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg qba'g fubj cebterff zrgre
+fznyyre= bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+ b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+ b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+ b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+ pyv = pyvrag.Pyvrag(bcg.erzbgr)
+ byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+ j = pyv.arj_cnpxjevgre()
+ryfr:
+ pyv = Abar
+ byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+ j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+ vs qve.raqfjvgu('/'):
+ erghea qve[:-1]
+ ryfr:
+ erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+ nffreg(cneg)
+ cnegf.nccraq(cneg)
+ funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+ nffreg(yra(cnegf) >= 1)
+ cneg = cnegf.cbc()
+ funyvfg = funyvfgf.cbc()
+ gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+ vs funyvfgf:
+ funyvfgf[-1].nccraq(('40000', cneg, gerr))
+ ryfr: # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+ funyvfgf.nccraq(funyvfg)
+ erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+ tybony pbhag, fhopbhag, ynfgerznva
+ fhopbhag += a
+ pp = pbhag + fhopbhag
+ cpg = gbgny naq (pp*100.0/gbgny) be 0
+ abj = gvzr.gvzr()
+ ryncfrq = abj - gfgneg
+ xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+ xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+ xcf = vag(xcf/xcf_senp)*xcf_senp
+ vs pp:
+ erznva = ryncfrq*1.0/pp * (gbgny-pp)
+ ryfr:
+ erznva = 0.0
+ vs (ynfgerznva naq (erznva > ynfgerznva)
+ naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+ erznva = ynfgerznva
+ ryfr:
+ ynfgerznva = erznva
+ ubhef = vag(erznva/60/60)
+ zvaf = vag(erznva/60 - ubhef*60)
+ frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+ vs ryncfrq < 30:
+ erznvafge = ''
+ xcffge = ''
+ ryfr:
+ xcffge = '%qx/f' % xcf
+ vs ubhef:
+ erznvafge = '%qu%qz' % (ubhef, zvaf)
+ ryvs zvaf:
+ erznvafge = '%qz%q' % (zvaf, frpf)
+ ryfr:
+ erznvafge = '%qf' % frpf
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+ % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+ erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+ erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+ erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+ erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+ sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+ vs abg (sgbgny % 10024):
+ cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+ rkvfgf = rag.rkvfgf()
+ unfuinyvq = nyernql_fnirq(rag)
+ rag.frg_fun_zvffvat(abg unfuinyvq)
+ vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ gbgny += rag.fvmr
+ sgbgny += 1
+ cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+ unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+ (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+ rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+ unfuinyvq = nyernql_fnirq(rag)
+ jnfzvffvat = rag.fun_zvffvat()
+ byqfvmr = rag.fvmr
+ vs bcg.ireobfr:
+ vs abg rkvfgf:
+ fgnghf = 'Q'
+ ryvs abg unfuinyvq:
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ fgnghf = 'N'
+ ryfr:
+ fgnghf = 'Z'
+ ryfr:
+ fgnghf = ' '
+ vs bcg.ireobfr >= 2:
+ ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+ ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+ vs abg ynfgqve.fgnegfjvgu(qve):
+ ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+ ynfgqve = qve
+
+ vs bcg.cebterff:
+ cebterff_ercbeg(0)
+ spbhag += 1
+
+ vs abg rkvfgf:
+ pbagvahr
+ vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+ vs rkvfgf naq abg unfuinyvq:
+ nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+ ynfgfxvc_anzr = rag.anzr
+ pbagvahr
+
+ nffreg(qve.fgnegfjvgu('/'))
+ qvec = qve.fcyvg('/')
+ juvyr cnegf > qvec:
+ _cbc(sbepr_gerr = Abar)
+ vs qve != '/':
+ sbe cneg va qvec[yra(cnegf):]:
+ _chfu(cneg)
+
+ vs abg svyr:
+ # ab svyranzr cbegvba zrnaf guvf vf n fhoqve. Ohg
+ # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+ byqgerr = nyernql_fnirq(rag) # znl or Abar
+ arjgerr = _cbc(sbepr_gerr = byqgerr)
+ vs abg byqgerr:
+ vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+ rag.vainyvqngr()
+ ryfr:
+ rag.inyvqngr(040000, arjgerr)
+ rag.ercnpx()
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ pbagvahr
+
+ # vg'f abg n qverpgbel
+ vq = Abar
+ vs unfuinyvq:
+ zbqr = '%b' % rag.tvgzbqr
+ vq = rag.fun
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ ryfr:
+ vs fgng.F_VFERT(rag.zbqr):
+ gel:
+ s = unfufcyvg.bcra_abngvzr(rag.anzr)
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+ ryfr:
+ vs fgng.F_VFQVE(rag.zbqr):
+ nffreg(0) # unaqyrq nobir
+ ryvs fgng.F_VFYAX(rag.zbqr):
+ gel:
+ ey = bf.ernqyvax(rag.anzr)
+ rkprcg BFReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ rkprcg VBReebe, r:
+ nqq_reebe(r)
+ ynfgfxvc_anzr = rag.anzr
+ ryfr:
+ (zbqr, vq) = ('120000', j.arj_oybo(ey))
+ ryfr:
+ nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+ ynfgfxvc_anzr = rag.anzr
+ vs vq:
+ rag.inyvqngr(vag(zbqr, 8), vq)
+ rag.ercnpx()
+ funyvfgf[-1].nccraq((zbqr,
+ tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+ vq))
+ vs rkvfgf naq jnfzvffvat:
+ pbhag += byqfvmr
+ fhopbhag = 0
+
+
+vs bcg.cebterff:
+ cpg = gbgny naq pbhag*100.0/gbgny be 100
+ cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar. \a'
+ % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+ _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+ cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+ zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+ ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+ pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+ vs bcg.pbzzvg:
+ cevag pbzzvg.rapbqr('urk')
+
+j.pybfr() # zhfg pybfr orsber jr pna hcqngr gur ers
+
+vs bcg.anzr:
+ vs pyv:
+ pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+ ryfr:
+ tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+ pyv.pybfr()
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+ sbe r va vaqrk.ZretrVgre([e1, e2]):
+ # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl? Jura?
+ bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+ qrs __vavg__(frys, y):
+ frys.v = vgre(y)
+ frys.phe = Abar
+ frys.arkg()
+
+ qrs arkg(frys):
+ gel:
+ frys.phe = frys.v.arkg()
+ rkprcg FgbcVgrengvba:
+ frys.phe = Abar
+ erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+ gel:
+ ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+ r = Abar
+ q = {}
+ sbe r va ernqre.sbejneq_vgre():
+ vs r.puvyqera_a:
+ vs bcg.ireobfr:
+ ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+ r.anzr))
+ nffreg(r.puvyqera_bsf)
+ nffreg(r.anzr.raqfjvgu('/'))
+ nffreg(abg q.trg(r.puvyqera_bsf))
+ q[r.puvyqera_bsf] = 1
+ vs r.syntf & vaqrk.VK_UNFUINYVQ:
+ nffreg(r.fun != vaqrk.RZCGL_FUN)
+ nffreg(r.tvgzbqr)
+ nffreg(abg r be r.anzr == '/') # ynfg ragel vf *nyjnlf* /
+ ybt('purpx: purpxvat abezny vgrengvba...\a')
+ ynfg = Abar
+ sbe r va ernqre:
+ vs ynfg:
+ nffreg(ynfg > r.anzr)
+ ynfg = r.anzr
+ rkprcg:
+ ybt('vaqrk reebe! ng %e\a' % r)
+ envfr
+ ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+ ev = vaqrk.Ernqre(vaqrksvyr)
+ jv = vaqrk.Jevgre(vaqrksvyr)
+ evt = VgreUrycre(ev.vgre(anzr=gbc))
+ gfgneg = vag(gvzr.gvzr())
+
+ unfutra = Abar
+ vs bcg.snxr_inyvq:
+ qrs unfutra(anzr):
+ erghea (0100644, vaqrk.SNXR_FUN)
+
+ gbgny = 0
+ sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+ vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+ flf.fgqbhg.jevgr('%f\a' % cngu)
+ flf.fgqbhg.syhfu()
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ ryvs abg (gbgny % 128):
+ cebterff('Vaqrkvat: %q\e' % gbgny)
+ gbgny += 1
+ juvyr evt.phe naq evt.phe.anzr > cngu: # qryrgrq cnguf
+ vs evt.phe.rkvfgf():
+ evt.phe.frg_qryrgrq()
+ evt.phe.ercnpx()
+ evt.arkg()
+ vs evt.phe naq evt.phe.anzr == cngu: # cnguf gung nyernql rkvfgrq
+ vs cfg:
+ evt.phe.sebz_fgng(cfg, gfgneg)
+ vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+ vs unfutra:
+ (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+ evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+ vs bcg.snxr_vainyvq:
+ evt.phe.vainyvqngr()
+ evt.phe.ercnpx()
+ evt.arkg()
+ ryfr: # arj cnguf
+ jv.nqq(cngu, cfg, unfutra = unfutra)
+ cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+
+ vs ev.rkvfgf():
+ ev.fnir()
+ jv.syhfu()
+ vs jv.pbhag:
+ je = jv.arj_ernqre()
+ vs bcg.purpx:
+ ybt('purpx: orsber zretvat: byqsvyr\a')
+ purpx_vaqrk(ev)
+ ybt('purpx: orsber zretvat: arjsvyr\a')
+ purpx_vaqrk(je)
+ zv = vaqrk.Jevgre(vaqrksvyr)
+ zretr_vaqrkrf(zv, ev, je)
+ ev.pybfr()
+ zv.pybfr()
+ je.pybfr()
+ jv.nobeg()
+ ryfr:
+ jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr= gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+ b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+ b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+ b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+ ybt('purpx: fgnegvat vavgvny purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+ vs abg cnguf:
+ b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+ sbe (ec,cngu) va cnguf:
+ hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+ sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+ vs (bcg.zbqvsvrq
+ naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+ pbagvahr
+ yvar = ''
+ vs bcg.fgnghf:
+ vs rag.vf_qryrgrq():
+ yvar += 'Q '
+ ryvs abg rag.vf_inyvq():
+ vs rag.fun == vaqrk.RZCGL_FUN:
+ yvar += 'N '
+ ryfr:
+ yvar += 'Z '
+ ryfr:
+ yvar += ' '
+ vs bcg.unfu:
+ yvar += rag.fun.rapbqr('urk') + ' '
+ vs bcg.ybat:
+ yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+ cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+ ybt('purpx: fgnegvat svany purpx.\a')
+ purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+ ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+ flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+ Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+ b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz. Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg. Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g. Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef. Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+ vs bcg.ireobfr:
+ ybt(f)
+
+qrs eha(neti):
+ # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+ # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+ # rkrpvat sbe fbzr ernfba. Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+ # svefg.
+ sq = bf.qhc(2) # pbcl fgqree
+ gel:
+ c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+ erghea c.jnvg()
+ svanyyl:
+ bf.pybfr(sq)
+
+qrs cne2_frghc():
+ tybony cne2_bx
+ ei = 1
+ gel:
+ c = fhocebprff.Cbcra(['cne2', '--uryc'],
+ fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+ ei = c.jnvg()
+ rkprcg BFReebe:
+ ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+ ryfr:
+ cne2_bx = 1
+
+qrs cnei(yiy):
+ vs bcg.ireobfr >= yiy:
+ vs vfggl:
+ erghea []
+ ryfr:
+ erghea ['-d']
+ ryfr:
+ erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+ erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+ + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+ erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+ erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+ s = bcra(onfr + '.cnpx', 'eo')
+ s.frrx(-20, 2)
+ jnagfhz = s.ernq(20)
+ nffreg(yra(jnagfhz) == 20)
+ s.frrx(0)
+ fhz = Fun1()
+ sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+ fhz.hcqngr(o)
+ vs fhz.qvtrfg() != jnagfhz:
+ envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+ fhz.urkqvtrfg()))
+
+
+qrs tvg_irevsl(onfr):
+ vs bcg.dhvpx:
+ gel:
+ dhvpx_irevsl(onfr)
+ rkprcg Rkprcgvba, r:
+ qroht('reebe: %f\a' % r)
+ erghea 1
+ erghea 0
+ ryfr:
+ erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+
+
+qrs qb_cnpx(onfr, ynfg):
+ pbqr = 0
+ vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+ ierfhyg = cne2_irevsl(onfr)
+ vs ierfhyg != 0:
+ vs bcg.ercnve:
+ eerfhyg = cne2_ercnve(onfr)
+ vs eerfhyg != 0:
+ cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+ pbqr = eerfhyg
+ ryfr:
+ cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+ pbqr = 100
+ ryfr:
+ cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+ pbqr = ierfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+ terfhyg = tvg_irevsl(onfr)
+ vs terfhyg != 0:
+ cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+ pbqr = terfhyg
+ ryfr:
+ vs cne2_bx naq bcg.trarengr:
+ cerfhyg = cne2_trarengr(onfr)
+ vs cerfhyg != 0:
+ cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+ pbqr = cerfhyg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ cevag '%f bx' % ynfg
+ ryfr:
+ nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+ qroht(' fxvccrq: cne2 svyr nyernql trarengrq.\a')
+ erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof= eha 'a' wbof va cnenyyry
+cne2-bx vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2 vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+ vs cne2_bx:
+ flf.rkvg(0) # 'gehr' va fu
+ ryfr:
+ flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+ cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+ qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+ rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+ vs anzr.raqfjvgu('.cnpx'):
+ onfr = anzr[:-5]
+ ryvs anzr.raqfjvgu('.vqk'):
+ onfr = anzr[:-4]
+ ryvs anzr.raqfjvgu('.cne2'):
+ onfr = anzr[:-5]
+ ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+ onfr = anzr
+ ryfr:
+ envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+ (qve,ynfg) = bf.cngu.fcyvg(onfr)
+ cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+ vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+ cne2_rkvfgf = 0
+ flf.fgqbhg.syhfu()
+ qroht('sfpx: purpxvat %f (%f)\a'
+ % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+ vs abg bcg.wbof:
+ ap = qb_cnpx(onfr, ynfg)
+ pbqr = pbqr be ap
+ pbhag += 1
+ ryfr:
+ juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ cvq = bf.sbex()
+ vs cvq: # cnerag
+ bhgfgnaqvat[cvq] = 1
+ ryfr: # puvyq
+ gel:
+ flf.rkvg(qb_cnpx(onfr, ynfg))
+ rkprcg Rkprcgvba, r:
+ ybt('rkprcgvba: %e\a' % r)
+ flf.rkvg(99)
+
+juvyr yra(bhgfgnaqvat):
+ (cvq,ap) = bf.jnvg()
+ ap >>= 8
+ vs cvq va bhgfgnaqvat:
+ qry bhgfgnaqvat[cvq]
+ pbqr = pbqr be ap
+ pbhag += 1
+ vs abg bcg.ireobfr:
+ cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+ ybt('sfpx qbar. \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+ b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+ qrs __vavg__(frys, fvtahz):
+ frys.fvtahz = fvtahz
+ Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+ envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+ ubfganzr = rkgen[0]
+ neti = rkgen[1:]
+ c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+ netif = '\0'.wbva(['ohc'] + neti)
+ c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+ c.fgqva.syhfu()
+
+ znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+ fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+ c.fgqva.pybfr()
+ c.fgqbhg.pybfr()
+
+svanyyl:
+ juvyr 1:
+ # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+ # va pnfr bhe puvyq qbrfa'g qvr.
+ gel:
+ erg = c.jnvg()
+ fc.jnvg()
+ oernx
+ rkprcg FvtRkprcgvba, r:
+ ybt('\aohc eonpxhc: %f\a' % r)
+ bf.xvyy(c.cvq, r.fvtahz)
+ erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+ y = e.fcyvg(nyy, 1)
+ vs yra(y) <= 1:
+ gel:
+ o = bf.ernq(flf.fgqva.svyrab(), 4096)
+ rkprcg XrlobneqVagreehcg:
+ oernx
+ vs abg o:
+ oernx
+ nyy += o
+ ryfr:
+ nffreg(yra(y) == 3)
+ (yvar, fcyvgpune, nyy) = y
+ #fcyvgpune = '\a'
+ flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+ vs fcyvgpune == '\e':
+ ynfgyra = yra(yvar)
+ ryfr:
+ ynfgyra = 0
+ flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+ flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+ b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+ vs v == ynfg:
+ pbagvahr
+ #nffreg(fge(v) >= ynfg)
+ cz = _unfufcyvg.ovgzngpu(ynfg, v)
+ ybatzngpu = znk(ybatzngpu, cz)
+ ynfg = v
+cevag ybatzngpu
+++ /dev/null
-#!/usr/bin/env perl
-#
-# WvTest:
-# Copyright (C) 2007-2009 Versabanq Innovations Inc. and contributors.
-# Copyright (C) 2015 Rob Browning <rlb@defaultvalue.org>
-# Licensed under the GNU Library General Public License, version 2.
-# See the included file named LICENSE for license information.
-#
-use strict;
-use warnings;
-use Getopt::Long qw(GetOptionsFromArray :config no_ignore_case bundling);
-use Pod::Usage;
-use Time::HiRes qw(time);
-
-my $per_test_warn_time = 100000; # upstream was 500
-my $per_test_bad_time = 100000; # upstream was 1000
-my $overall_test_warn_time = 100000; # upstream was 2000
-my $overall_test_bad_time = 100000; # upstream was 5000
-
-my $pid;
-my $istty = -t STDOUT;
-my @log = ();
-
-sub bigkill($)
-{
- my $pid = shift;
-
- if (@log) {
- print "\n" . join("\n", @log) . "\n";
- }
-
- print STDERR "\n! Killed by signal FAILED\n";
-
- ($pid > 0) || die("pid is '$pid'?!\n");
-
- local $SIG{CHLD} = sub { }; # this will wake us from sleep() faster
- kill 15, $pid;
- sleep(2);
-
- if ($pid > 1) {
- kill 9, -$pid;
- }
- kill 9, $pid;
-
- exit(125);
-}
-
-sub colourize($)
-{
- my $result = shift;
- my $pass = ($result eq "ok");
-
- if ($istty) {
- my $colour = $pass ? "\e[32;1m" : "\e[31;1m";
- return "$colour$result\e[0m";
- } else {
- return $result;
- }
-}
-
-sub mstime($$$)
-{
- my ($floatsec, $warntime, $badtime) = @_;
- my $ms = int($floatsec * 1000);
- my $str = sprintf("%d.%03ds", $ms/1000, $ms % 1000);
-
- if ($istty && $ms > $badtime) {
- return "\e[31;1m$str\e[0m";
- } elsif ($istty && $ms > $warntime) {
- return "\e[33;1m$str\e[0m";
- } else {
- return "$str";
- }
-}
-
-sub resultline($$)
-{
- my ($name, $result) = @_;
- return sprintf("! %-65s %s", $name, colourize($result));
-}
-
-my ($start, $stop);
-
-sub endsect()
-{
- $stop = time();
- if ($start) {
- printf " %s %s\n",
- mstime($stop - $start, $per_test_warn_time, $per_test_bad_time),
- colourize("ok");
- }
-}
-
-sub run
-{
- # dup_msgs should be true when "watching". In that case all top
- # level wvtest protocol messages should be duplicated to stderr so
- # that they can be safely captured for report to process later.
- my ($dup_msgs) = @_;
- my $show_counts = 1;
- GetOptionsFromArray(\@ARGV, 'counts!', \$show_counts)
- or pod2usage();
- pod2usage('$0: no command specified') if (@ARGV < 1);
-
- # always flush
- $| = 1;
-
- {
- my $msg = "Testing \"all\" in @ARGV:\n";
- print $msg;
- print STDERR $msg if $dup_msgs;
- }
-
- $pid = open(my $fh, "-|");
- if (!$pid) {
- # child
- setpgrp();
- open STDERR, '>&STDOUT' or die("Can't dup stdout: $!\n");
- exec(@ARGV);
- exit 126; # just in case
- }
-
- # parent
- my $allstart = time();
- local $SIG{INT} = sub { bigkill($pid); };
- local $SIG{TERM} = sub { bigkill($pid); };
- local $SIG{ALRM} = sub {
- print STDERR resultline('Alarm timed out! No test results for too long.\n',
- 'FAILED');
- bigkill($pid);
- };
-
- my ($gpasses, $gfails) = (0,0);
- while (<$fh>)
- {
- chomp;
- s/\r//g;
-
- if (/^\s*Testing "(.*)" in (.*):\s*$/)
- {
- alarm(300);
- my ($sect, $file) = ($1, $2);
-
- endsect();
-
- printf("! %s %s: ", $file, $sect);
- @log = ();
- $start = $stop;
- }
- elsif (/^!\s*(.*?)\s+(\S+)\s*$/)
- {
- alarm(300);
-
- my ($name, $result) = ($1, $2);
- my $pass = ($result eq "ok");
-
- if (!$start) {
- printf("\n! Startup: ");
- $start = time();
- }
-
- push @log, resultline($name, $result);
-
- if (!$pass) {
- $gfails++;
- if (@log) {
- print "\n" . join("\n", @log) . "\n";
- @log = ();
- }
- } else {
- $gpasses++;
- print ".";
- }
- }
- else
- {
- push @log, $_;
- }
- }
-
- endsect();
-
- my $newpid = waitpid($pid, 0);
- if ($newpid != $pid) {
- die("waitpid returned '$newpid', expected '$pid'\n");
- }
-
- my $code = $?;
- my $ret = ($code >> 8);
-
- # return death-from-signal exits as >128. This is what bash does if you ran
- # the program directly.
- if ($code && !$ret) { $ret = $code | 128; }
-
- if ($ret && @log) {
- print "\n" . join("\n", @log) . "\n";
- }
-
- if ($code != 0) {
- my $msg = resultline("Program returned non-zero exit code ($ret)",
- 'FAILED');
- print $msg;
- print STDERR "$msg\n" if $dup_msgs;
- }
-
- print "\n";
- if ($show_counts) {
- my $gtotal = $gpasses + $gfails;
- my $msg = sprintf("WvTest: %d test%s, %d failure%s\n",
- $gtotal, $gtotal == 1 ? "" : "s", $gfails,
- $gfails == 1 ? "" : "s");
- print $msg;
- print STDERR $msg if $dup_msgs;
- }
- {
- my $msg = sprintf("WvTest: result code $ret, total time %s\n",
- mstime(time() - $allstart,
- $overall_test_warn_time,
- $overall_test_bad_time));
- print $msg;
- print STDERR $msg if $dup_msgs;
- }
- return ($ret ? $ret : ($gfails ? 125 : 0));
-}
-
-sub report()
-{
- my ($gpasses, $gfails) = (0,0);
- for my $f (@ARGV)
- {
- my $fh;
- open($fh, '<:crlf', $f) or die "Unable to open $f: $!";
- while (<$fh>)
- {
- chomp;
- s/\r//g;
-
- if (/^\s*Testing "(.*)" in (.*):\s*$/) {
- @log = ();
- }
- elsif (/^!\s*(.*?)\s+(\S+)\s*$/) {
- my ($name, $result) = ($1, $2);
- my $pass = ($result eq "ok");
- push @log, resultline($name, $result);
- if (!$pass) {
- $gfails++;
- if (@log) {
- print "\n" . join("\n", @log) . "\n";
- @log = ();
- }
- } else {
- $gpasses++;
- }
- }
- else
- {
- push @log, $_;
- }
- }
- }
- my $gtotal = $gpasses + $gfails;
- printf("\nWvTest: %d test%s, %d failure%s\n",
- $gtotal, $gtotal == 1 ? "" : "s",
- $gfails, $gfails == 1 ? "" : "s");
- return ($gfails ? 125 : 0);
-}
-
-my ($show_help, $show_manual);
-Getopt::Long::Configure('no_permute');
-GetOptionsFromArray(\@ARGV,
- 'help|?' => \$show_help,
- 'man' => \$show_manual) or pod2usage();
-Getopt::Long::Configure('permute');
-pod2usage(-verbose => 1, -exitval => 0) if $show_help;
-pod2usage(-verbose => 2, -exitval => 0) if $show_manual;
-pod2usage(-msg => "$0: no action specified", -verbose => 1) if (@ARGV < 1);
-
-my $action = $ARGV[0];
-shift @ARGV;
-if ($action eq 'run') { exit run(0); }
-elsif ($action eq 'watch') { run(1); }
-elsif ($action eq 'report') { exit report(); }
-else { pod2usage(-msg => "$0: invalid action $action", -verbose => 1); }
-
-__END__
-
-=head1 NAME
-
-wvtest - the dumbest cross-platform test framework that could possibly work
-
-=head1 SYNOPSIS
-
- wvtest [GLOBAL...] run [RUN_OPT...] [--] command [arg...]
- wvtest [GLOBAL...] watch [RUN_OPT...] [--] command [arg...]
- wvtest [GLOBAL...] report [logfile...]
-
- GLOBAL:
- --help, -? display brief help message and exit
- --man display full documentation
- RUN_OPT:
- --[no-]counts [don't] show success/failure counts
-
-=head1 DESCRIPTION
-
-B<wvtest run some-tests> will run some-tests and report on the result.
-This should work fine as long as some-tests doesn't run any sub-tests
-in parallel.
-
-If you'd like to run your tests in parallel, use B<watch> and
-B<report> as described in the EXAMPLES below.
-
-=head1 EXAMPLES
-
- # Fine if ./tests doesn't produce any output in parallel.
- wvtest run ./tests
-
- # Use watch and report for parallel tests. Note that watch's stderr will
- # include copies of any top level messages - reporting non-zero
- # test command exits, etc., and so must be included in the report arguments.
- wvtest watch --no-counts \
- "sh -c '(test-1 2>&1 | tee test-1.log)& (test-2 2>&1 | tee test-2.log)&'" \
- 2>test-3.log \
- wvtest report test-1.log test-2.log test-3.log
-
-=cut
wvmktempdir ()
{
local script_name="$(basename $0)"
- mkdir -p "$_wvtop/t/tmp" || exit $?
- mktemp -d "$_wvtop/t/tmp/$script_name-XXXXXXX" || exit $?
+ mkdir -p "$_wvtop/test/tmp" || exit $?
+ mktemp -d "$_wvtop/test/tmp/$script_name-XXXXXXX" || exit $?
}
wvmkmountpt ()
{
local script_name="$(basename $0)"
- mkdir -p "$_wvtop/t/mnt" || exit $?
- mktemp -d "$_wvtop/t/mnt/$script_name-XXXXXXX" || exit $?
+ mkdir -p "$_wvtop/test/mnt" || exit $?
+ mktemp -d "$_wvtop/test/mnt/$script_name-XXXXXXX" || exit $?
}
+++ /dev/null
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/dev/bup-python"
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-#
-# WvTest:
-# Copyright (C)2007-2012 Versabanq Innovations Inc. and contributors.
-# Licensed under the GNU Library General Public License, version 2.
-# See the included file named LICENSE for license information.
-# You can get wvtest from: http://github.com/apenwarr/wvtest
-#
-
-from __future__ import absolute_import, print_function
-from os.path import relpath
-import atexit
-import inspect
-import os
-import re
-import sys
-import traceback
-
-_start_dir = os.getcwd()
-
-# NOTE
-# Why do we do we need the "!= main" check? Because if you run
-# wvtest.py as a main program and it imports your test files, then
-# those test files will try to import the wvtest module recursively.
-# That actually *works* fine, because we don't run this main program
-# when we're imported as a module. But you end up with two separate
-# wvtest modules, the one that gets imported, and the one that's the
-# main program. Each of them would have duplicated global variables
-# (most importantly, wvtest._registered), and so screwy things could
-# happen. Thus, we make the main program module *totally* different
-# from the imported module. Then we import wvtest (the module) into
-# wvtest (the main program) here and make sure to refer to the right
-# versions of global variables.
-#
-# All this is done just so that wvtest.py can be a single file that's
-# easy to import into your own applications.
-if __name__ != '__main__': # we're imported as a module
- _registered = []
- _tests = 0
- _fails = 0
-
- def wvtest(func):
- """ Use this decorator (@wvtest) in front of any function you want to
- run as part of the unit test suite. Then run:
- python wvtest.py path/to/yourtest.py [other test.py files...]
- to run all the @wvtest functions in the given file(s).
- """
- _registered.append(func)
- return func
-
-
- def _result(msg, tb, code):
- global _tests, _fails
- _tests += 1
- if code != 'ok':
- _fails += 1
- (filename, line, func, text) = tb
- filename = os.path.basename(filename)
- msg = re.sub(r'\s+', ' ', str(msg))
- sys.stderr.flush()
- print('! %-70s %s' % ('%s:%-4d %s' % (filename, line, msg),
- code))
- sys.stdout.flush()
-
-
- def _caller_stack(wv_call_depth):
- # Without the chdir, the source text lookup may fail
- orig = os.getcwd()
- os.chdir(_start_dir)
- try:
- return traceback.extract_stack()[-(wv_call_depth + 2)]
- finally:
- os.chdir(orig)
-
-
- def _check(cond, msg = 'unknown', tb = None):
- if tb == None: tb = _caller_stack(2)
- if cond:
- _result(msg, tb, 'ok')
- else:
- _result(msg, tb, 'FAILED')
- return cond
-
- def wvcheck(cond, msg, tb = None):
- if tb == None: tb = _caller_stack(2)
- if cond:
- _result(msg, tb, 'ok')
- else:
- _result(msg, tb, 'FAILED')
- return cond
-
- _code_rx = re.compile(r'^\w+\((.*)\)(\s*#.*)?$')
- def _code():
- text = _caller_stack(2)[3]
- return _code_rx.sub(r'\1', text)
-
- def WVSTART(message):
- filename = _caller_stack(1)[0]
- sys.stderr.write('Testing \"' + message + '\" in ' + filename + ':\n')
-
- def WVMSG(message):
- ''' Issues a notification. '''
- return _result(message, _caller_stack(1), 'ok')
-
- def WVPASS(cond = True):
- ''' Counts a test failure unless cond is true. '''
- return _check(cond, _code())
-
- def WVFAIL(cond = True):
- ''' Counts a test failure unless cond is false. '''
- return _check(not cond, 'NOT(%s)' % _code())
-
- def WVPASSEQ(a, b):
- ''' Counts a test failure unless a == b. '''
- return _check(a == b, '%s == %s' % (repr(a), repr(b)))
-
- def WVPASSNE(a, b):
- ''' Counts a test failure unless a != b. '''
- return _check(a != b, '%s != %s' % (repr(a), repr(b)))
-
- def WVPASSLT(a, b):
- ''' Counts a test failure unless a < b. '''
- return _check(a < b, '%s < %s' % (repr(a), repr(b)))
-
- def WVPASSLE(a, b):
- ''' Counts a test failure unless a <= b. '''
- return _check(a <= b, '%s <= %s' % (repr(a), repr(b)))
-
- def WVPASSGT(a, b):
- ''' Counts a test failure unless a > b. '''
- return _check(a > b, '%s > %s' % (repr(a), repr(b)))
-
- def WVPASSGE(a, b):
- ''' Counts a test failure unless a >= b. '''
- return _check(a >= b, '%s >= %s' % (repr(a), repr(b)))
-
- def WVEXCEPT(etype, func, *args, **kwargs):
- ''' Counts a test failure unless func throws an 'etype' exception.
- You have to spell out the function name and arguments, rather than
- calling the function yourself, so that WVEXCEPT can run before
- your test code throws an exception.
- '''
- try:
- func(*args, **kwargs)
- except etype as e:
- return _check(True, 'EXCEPT(%s)' % _code())
- except:
- _check(False, 'EXCEPT(%s)' % _code())
- raise
- else:
- return _check(False, 'EXCEPT(%s)' % _code())
-
- wvstart = WVSTART
- wvmsg = WVMSG
- wvpass = WVPASS
- wvfail = WVFAIL
- wvpasseq = WVPASSEQ
- wvpassne = WVPASSNE
- wvpaslt = WVPASSLT
- wvpassle = WVPASSLE
- wvpassgt = WVPASSGT
- wvpassge = WVPASSGE
- wvexcept = WVEXCEPT
-
- def wvfailure_count():
- return _fails
-
- def _check_unfinished():
- if _registered:
- for func in _registered:
- print('WARNING: not run: %r' % (func,))
- WVFAIL('wvtest_main() not called')
- if _fails:
- sys.exit(1)
-
- atexit.register(_check_unfinished)
-
-
-def _run_in_chdir(path, func, *args, **kwargs):
- oldwd = os.getcwd()
- oldpath = sys.path
- try:
- os.chdir(path)
- sys.path += [path, os.path.split(path)[0]]
- return func(*args, **kwargs)
- finally:
- os.chdir(oldwd)
- sys.path = oldpath
-
-
-def _runtest(fname, f):
- mod = inspect.getmodule(f)
- rpath = relpath(mod.__file__, os.getcwd()).replace('.pyc', '.py')
- print()
- print('Testing "%s" in %s:' % (fname, rpath))
- sys.stdout.flush()
- try:
- _run_in_chdir(os.path.split(mod.__file__)[0], f)
- except Exception as e:
- print()
- print(traceback.format_exc())
- tb = sys.exc_info()[2]
- wvtest._result(e, traceback.extract_tb(tb)[1], 'EXCEPTION')
-
-
-def _run_registered_tests():
- import wvtest as _wvtestmod
- while _wvtestmod._registered:
- t = _wvtestmod._registered.pop(0)
- _runtest(t.__name__, t)
- print()
-
-
-def wvtest_main(extra_testfiles=tuple()):
- import wvtest as _wvtestmod
- _run_registered_tests()
- for modname in extra_testfiles:
- if not os.path.exists(modname):
- print('Skipping: %s' % modname)
- continue
- if modname.endswith('.py'):
- modname = modname[:-3]
- print('Importing: %s' % modname)
- path, mod = os.path.split(os.path.abspath(modname))
- nicename = modname.replace(os.path.sep, '.')
- while nicename.startswith('.'):
- nicename = modname[1:]
- _run_in_chdir(path, __import__, nicename, None, None, [])
- _run_registered_tests()
- print()
- print('WvTest: %d tests, %d failures.' % (_wvtestmod._tests,
- _wvtestmod._fails))
-
-
-if __name__ == '__main__':
- import wvtest as _wvtestmod
- sys.modules['wvtest'] = _wvtestmod
- sys.modules['wvtest.wvtest'] = _wvtestmod
- wvtest = _wvtestmod
- wvtest_main(sys.argv[1:])