bup.git
5 weeks agorev_list: handle multiple results/ref from remote for custom formats master
Rob Browning [Sat, 13 Apr 2019 17:07:18 +0000 (12:07 -0500)]
rev_list: handle multiple results/ref from remote for custom formats

Previously a remote rev_list invocation would crash if a custom format
was provided and the remote produced multiple results for any input
ref.  Change the client/server code to use a blank line to indicate
the end of the rev-list results.  Of course, that means that the parse
function provided must be able to handle (consume) any blank lines
that its format string produces, which may preclude the use of some
format strings, but should be sufficient for now.

Adjust test-ls to (trivially) cover this case, and broaden the use of
the commit hash length tests in the code.

Thanks to Alex Roper for reporting the problem, providing an easy way
to reproduce it, and proposing a fix.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
5 weeks agoHandle commit mergetags (at all)
Rob Browning [Fri, 12 Apr 2019 19:55:13 +0000 (14:55 -0500)]
Handle commit mergetags (at all)

Previously bup would just crash (i.e. bup ls) if it encountered a
commit with a mergetag header (apparently a new thing).  For now,
adjust git.parse_commit to accept and ignore them as long as they only
appear as an optional, final header in the commit.  That may or may
not turn out to be sufficient, and it does mean that for now we won't
be able to preserve mergetags (if we want to) whenever we rewrite
commits via bup gc, get, etc.

A mergetag example (indented two spaces):

  tree 1ebcecb7117725fd567de6e9652dc34b5b103f6d
  parent d3e6b8a251634ad673242aaa4a298edbb2e8ee39
  parent 3a34412caae002accd0fc7a7fc0b718c2f34159b
  author Rob Browning <rlb@defaultvalue.org> 1498341839 -0500
  committer Rob Browning <rlb@defaultvalue.org> 1498341839 -0500
  mergetag object 3a34412caae002accd0fc7a7fc0b718c2f34159b
   type commit
   tag emacs-25.2
   tagger Nicolas Petton <nicolas@petton.fr> 1492704766 +0200

   Emacs 25.2 release
   -----BEGIN PGP SIGNATURE-----
   Version: GnuPG v2

   iQEcBAABCAAGBQJY+N4EAAoJECM1h6R8IHkQFeEH/2FlBZSzsxNnXcMLVNirG0Uu
   8CBEAlme4LcViKs6Ae2uzPP4DrwN1g4LLNGnHBYQoL5nzwPtNOLDjaVtB2D7Q5Lj
   OgtiLix5kHNXh6j2GRnCHI5a6h52FY0yiaslefbstVu554S+1ttDbmqCgo5wtzFM
   eSPbxjLn1SrXSe9Mpfi/tBM2go7J4bihF6GyUktObwAkhOCz3ctJGTMltHzub1RC
   fZBku7bYjgbJocKJ+8MyfcgGz8sb1lV6jeJ9Yu+FuO6PIH9JtHZkjYbFhXqV8TxU
   vHfiCD8QK8w3SJ4RiMltfaFqhc0LFt1mUYOtHzwMbML8nqDV9SfozG7APN7f4OE=
   =oY2c
   -----END PGP SIGNATURE-----

  Merge upstream version 25.2

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
5 weeks agoDon't use "cp -a" (round 2)
Rob Browning [Sun, 29 Mar 2015 16:47:45 +0000 (11:47 -0500)]
Don't use "cp -a" (round 2)

It's not portable -- use portable cp options, or a new t/sync-tree
instead.  Thanks to Greg Troxel (again) for reporting the problem.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
2 months agovint: remove unneded loop guards and improve checks
Rob Browning [Sat, 26 Jan 2019 21:47:08 +0000 (15:47 -0600)]
vint: remove unneded loop guards and improve checks

Don't bother to check the read/write loop guards; rely on checks in
the condiitonal arms.  Check read results for "not x" rather than "x
!= ''".

2 months agoget: note writes in just_write and fsck after tests
Rob Browning [Sun, 19 Feb 2017 18:56:36 +0000 (12:56 -0600)]
get: note writes in just_write and fsck after tests

Thanks to Karl Kiniger for reporting the problem, and to Tim
Riemenschneider for tracking down the cause and suggesting fsck after
each test.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
2 months agoAdd bup get; see the documentation for further information
Rob Browning [Sun, 23 Mar 2014 17:41:06 +0000 (12:41 -0500)]
Add bup get; see the documentation for further information

WARNING: this is a new EXPERIMENTAL command that can (intentionally)
modify your data in destructive ways.  Treat with caution.

Thanks to Karl Kiniger <karl.kiniger@med.ge.com> for helping track
down various bugs in earlier versions, and for noting that we might
want --verbose to be a little more effusive.  And thanks to Patryck
Rouleau <prouleau72@gmail.com> for suggesting improvements to the
documentation.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
2 months agorepo: add update_ref() and new_packwriter() to support bup-get
Rob Browning [Sat, 31 Mar 2018 21:36:14 +0000 (16:36 -0500)]
repo: add update_ref() and new_packwriter() to support bup-get

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
2 months agorepo: add VFS resolve(); test resolve() via local and remote repos
Rob Browning [Sat, 31 Mar 2018 21:25:34 +0000 (16:25 -0500)]
repo: add VFS resolve(); test resolve() via local and remote repos

Add resolve() to the repositories.  While it's likely to be generally
useful, we need it more immediately to support the forthcoming bup-get
command,

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agorepo: avoid cyclic dependency with is_remote method
Rob Browning [Sat, 31 Mar 2018 20:32:52 +0000 (15:32 -0500)]
repo: avoid cyclic dependency with is_remote method

The current VFS operations (like resolve()) require a repo object, but
we're about to add a VFS resolve() method to the repos.  In and of
itself, that isn't necessarily a problem, but as an optimization, we
want the VFS resolve() to be able to detect when the repo it's been
given is a RemoteRepo and redirect the call to remote_repo.resolve().

Doing so pushes the one single resolve() call to the remote instead of
executing the resolve() locally with a lot of individual calls to the
remote_repo's other methods.

Adding is_remote() makes that possible without having to 'import repo'
in the VFS (repo already imports vfs).

Perhaps we'll rework it later, but this will do for now.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agoMove vfs resolve() tests to tresolve.py
Rob Browning [Sat, 31 Mar 2018 19:14:43 +0000 (14:14 -0500)]
Move vfs resolve() tests to tresolve.py

Move resolve() tests from tvfs to tresolve, and the common tree_dict()
test code to a new test.vfs module, in preparation for more extensive
resolve() testing.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agotest_resolve_loop: ensure exception is actually thrown
Rob Browning [Sat, 12 Jan 2019 22:22:14 +0000 (16:22 -0600)]
test_resolve_loop: ensure exception is actually thrown

Make sure to resolve the correct path, and ensure the call never
returns.  Previously when the path was wrong, and it *was* wrong, the
test would appear to succeed even though it wasn't actually testing
the intended ELOOP case.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agoserver: maintain current LocalRepo var
Rob Browning [Sat, 31 Mar 2018 19:55:25 +0000 (14:55 -0500)]
server: maintain current LocalRepo var

This will be useful for upcoming vfs operations.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agowalk_object: accept a get function instead of catpipe
Rob Browning [Sat, 31 Mar 2018 19:42:07 +0000 (14:42 -0500)]
walk_object: accept a get function instead of catpipe

This will be needed by upcoming changes to the repo classes.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agometadata: always add/store/retrieve size for links and normal files
Rob Browning [Sat, 20 Oct 2018 23:04:27 +0000 (18:04 -0500)]
metadata: always add/store/retrieve size for links and normal files

This simplifies cases where we need to transmit Metadata
objects (i.e. bup-get's repo.resolve()), and it means that for trees
created using this new v3 format, retrieving the sizes of chunked
files should be notably less expensive, since they'll be directly
available in the directory's .bupm file.

Without that, we have to seek around in the chunked tree to find the
last byte (cf. vfs._normal_or_chunked_file_size).

Only store the sizes for symlinks and regular files (which might be
chunked) until it's clear that other st_sizes are useful.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agoReplace lresolve with resolve(..., follow=False)
Rob Browning [Tue, 27 Feb 2018 07:32:54 +0000 (23:32 -0800)]
Replace lresolve with resolve(..., follow=False)

Although there's the NOFOLLOW precedent, this is really just to narrow
the API before we add it as a repo method, i.e. so we only have to
handle one function instead of two.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agovfs: change /save/latest back to a symlink to the latest save
Rob Browning [Sun, 9 Dec 2018 18:40:26 +0000 (12:40 -0600)]
vfs: change /save/latest back to a symlink to the latest save

The current, reworked vfs presents /somesave/latest as if it actually
is the latest commit.  Change it back to a symlink to the latest save
to roughly match the previous behavior -- though now it's a link to
the save name, not to the (removed) /.commit/ subtree.

To restore the link, reintroduce the concept of a fake
symlink (i.e. one that has no corresponding blob in the repository).

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
4 months agovfs: use a type prefix for all cache keys
Rob Browning [Sat, 7 Jul 2018 20:32:34 +0000 (15:32 -0500)]
vfs: use a type prefix for all cache keys

This ensures the keys are more obviously unique, and can be identified
by just examining the fixed-length prefix.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
5 months agoMakefile: check _helpers.so uniqueness via python command
Rob Browning [Mon, 17 Dec 2018 00:42:15 +0000 (18:42 -0600)]
Makefile: check _helpers.so uniqueness via python command

Aside from being a bit tortured, the previous approach, using tr -C,
didn't work on NetBSD.

Thanks to Greg Troxel for reporting the problem and testing the fix.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
5 months agoDon't return invalid data for offset reads (observed via fuse)
Rob Browning [Mon, 3 Dec 2018 18:58:03 +0000 (12:58 -0600)]
Don't return invalid data for offset reads (observed via fuse)

Fix a serious bug in the vfs that could cause it to return invalid
data for chunked file read()s that didn't start at the beginning of
the file.  The issue was first observed via fuse, which makes sense
given that it streams a file in chunks that (currently) each come from
independent, increasing seek-offset FileReaders.

The previous dropwhile() invocation in the _tree_chunks generator,
used to skip past chunks that were completely before the offset, was
simple but wrong, and would skip too far.  Replace it with
_skip_chunks_before_offset().

Add randomized tests of both simple streaming reads, and seek offset
reads, which catch the problem, cover additional cases, and should
prevent regressions.

Thanks to voldial for reporting the problem and providing an easy way
to reproduce it.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
5 months agovfs: short circuit read when at EOF
Rob Browning [Mon, 3 Dec 2018 18:45:47 +0000 (12:45 -0600)]
vfs: short circuit read when at EOF

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
5 months agovfs: import EINVAL for FileReader seek and include size in exception
Rob Browning [Mon, 3 Dec 2018 18:39:20 +0000 (12:39 -0600)]
vfs: import EINVAL for FileReader seek and include size in exception

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
5 months agofuse: remove vestigial debugging log res: statement
Rob Browning [Mon, 3 Dec 2018 18:35:22 +0000 (12:35 -0600)]
fuse: remove vestigial debugging log res: statement

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
6 months agoUpdate HACKING, README, and note/ for 0.29.2
Rob Browning [Sun, 14 Oct 2018 16:37:32 +0000 (11:37 -0500)]
Update HACKING, README, and note/ for 0.29.2

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
7 months agoupdate-doc-branches: add command to update man and html
Rob Browning [Sat, 20 Oct 2018 17:35:11 +0000 (12:35 -0500)]
update-doc-branches: add command to update man and html

Create a new command to update the man and html branches, and move the
related code there from the Makefile.

Update the branches based on the current (clean) tree, rather than
consulting the git origin, and rely on ls-files rather than globbing
so that the file lists will always be correct -- we'll immediately
notice deletions, avoid picking up stray files in the directory, etc.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
7 months agoMakefile: fix find -printf issue on FreeBSD
Rob Browning [Sun, 30 Sep 2018 20:29:42 +0000 (15:29 -0500)]
Makefile: fix find -printf issue on FreeBSD

Apparently the use of -printf was causing the error: "printf: missing
format character" with FreeBSD 11.1-RELEASE.  Change the helpers lib
count to rely on -print0 and tr, which should be more portable, but
still be undisturbed by unusual paths.

Thanks to Curtis Dunham for reporting the problem and proposing an
alternate solution.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agovfs: flatten resolution cache key
Rob Browning [Sat, 7 Jul 2018 17:20:47 +0000 (12:20 -0500)]
vfs: flatten resolution cache key

This will require more storage if there are a lot of lookups with the
same parent and differing paths, but otherwise, without more
intentional structure sharing among paths, this should be better, and
we can always revisit the arrangement later.

Serializing the parent path segments should also make sure the same
parent (semantically-speaking) contributes the same hash to the key.
Previously, Metadata objects could prevent that, given their trivial,
pointer-based hashes.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agolib/xstat: use // not / for int division for py3
Julien Goodwin [Thu, 30 Aug 2018 11:21:36 +0000 (21:21 +1000)]
lib/xstat: use // not / for int division for py3

Adjust nsecs_to_timespec() and nsecs_to_timeval() to use // for
integer division for py3.

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agovfs: remove unused izip import
Julien Goodwin [Thu, 30 Aug 2018 10:53:09 +0000 (20:53 +1000)]
vfs: remove unused izip import

izip isn't available in python3 (standard zip now handles its case),
but it's not actually being used anyway.

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit summary and wrap body]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agoUpdate file() calls to open() for py3
Julien Goodwin [Thu, 30 Aug 2018 10:35:32 +0000 (20:35 +1000)]
Update file() calls to open() for py3

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agolib/gc: update lambda syntax for py3
Julien Goodwin [Thu, 30 Aug 2018 10:16:57 +0000 (20:16 +1000)]
lib/gc: update lambda syntax for py3

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit summary]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agoRefuse to run by default if python version is not 2
Rob Browning [Sun, 2 Sep 2018 17:29:01 +0000 (12:29 -0500)]
Refuse to run by default if python version is not 2

Exit with an error if the python major version isn't 2, since we're
working on support for py3, and we'll probably reach a point before
we're finished where bup doesn't immediately crash with py3, but might
well do very bad things to the repository.

Allow overriding the check by setting
BUP_ALLOW_UNEXPECTED_PYTHON_VERSION=true so people can still test py3
if they like.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agofuse-cmd: update exception raising for py3
Julien Goodwin [Thu, 30 Aug 2018 09:58:48 +0000 (19:58 +1000)]
fuse-cmd: update exception raising for py3

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agotindex: add 0o to current octal literal
Julien Goodwin [Thu, 30 Aug 2018 09:57:18 +0000 (19:57 +1000)]
tindex: add 0o to current octal literal

Needed for python3.

This preserves current behaviour, but since I get no test failures if I
just chop of the leading 0 and make it a normal int there's a good
chance there's underlying breakage.

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit message summary]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agoMigrate all xrange calls to range in bup.compat
Julien Goodwin [Thu, 30 Aug 2018 08:38:48 +0000 (18:38 +1000)]
Migrate all xrange calls to range in bup.compat

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit message summary]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
8 months agoReplace remaining print statements with print function
Julien Goodwin [Thu, 30 Aug 2018 08:25:25 +0000 (18:25 +1000)]
Replace remaining print statements with print function

Also add the appropriate __future__ import statement.

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: memtest-cmd.py: remove a few preexisting
 trailing spaces that were carried over; adjust commit summary]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
9 months agovfs: include unique repo id in resolution cache key
Rob Browning [Fri, 6 Jul 2018 17:01:55 +0000 (12:01 -0500)]
vfs: include unique repo id in resolution cache key

...since resolve() currently requires a full parent path and the root
refs are only applicable to a particular repository.

Use differing integers to identify repositories that may be
independent (with respect to refs, tags, etc.), and use (typically
small) integers rather than the repo path/address so that they'll be
short if we want to embed them directly in cache keys later.

Use realpath() for local repositories in order to detect when the same
repository is reachable by multiple paths.  (Something similar could
eventually be done for remotes.)

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
9 months agoHACKING: delete hyphen; actual file is CODINGSTYLE, not CODING-STYLE
Julien Goodwin [Sat, 18 Aug 2018 01:38:57 +0000 (18:38 -0700)]
HACKING: delete hyphen; actual file is CODINGSTYLE, not CODING-STYLE

Signed-off-by: Julien Goodwin <jgoodwin@studio442.com.au>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
9 months agoREADME: mention BUP_DIR config more clearly
Rob Browning [Sat, 18 Aug 2018 19:54:36 +0000 (14:54 -0500)]
README: mention BUP_DIR config more clearly

Thanks to Mateusz Konieczny for the suggestion.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
9 months agoREADME: replace du code example's tab prefix with spaces
Mateusz Konieczny [Mon, 30 Jul 2018 06:04:49 +0000 (08:04 +0200)]
README: replace du code example's tab prefix with spaces

The command wasn't rendered as code before this change.

Signed-off-by: Mateusz Konieczny <matkoniecz@gmail.com>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
9 months agotest-xdev: use different filesystem images for each mount point
Rob Browning [Sat, 11 Aug 2018 20:30:18 +0000 (15:30 -0500)]
test-xdev: use different filesystem images for each mount point

Previously we were mounting the same image twice, which was
unintended, and may produce the same device number.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
9 months agotest-index-check-device: use separate files for loopback mounts
Rob Browning [Sat, 11 Aug 2018 17:24:07 +0000 (12:24 -0500)]
test-index-check-device: use separate files for loopback mounts

Previously we were mounting the same image twice, which may produce
the same device number.

Thanks to Mateusz Pavlic for reporting the problem.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
9 months agoFix attributes misspelling in bup-index.md
Artem Leshchev [Sun, 29 Jul 2018 08:33:59 +0000 (11:33 +0300)]
Fix attributes misspelling in bup-index.md

Fix small typo that lintian shows me every time I compile deb package.

Signed-off-by: Artem Leshchev <matshch@gmail.com>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
9 months agoREADME: fix outdated comments about LWN and about reliability
Rob Browning [Sun, 29 Jul 2018 18:44:44 +0000 (13:44 -0500)]
README: fix outdated comments about LWN and about reliability

Thanks to matkoniecz for bringing them up.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
9 months agoREADME: update minimum git version to 1.5.6
Rob Browning [Sun, 29 Jul 2018 18:39:43 +0000 (13:39 -0500)]
README: update minimum git version to 1.5.6

Given the changes in db8a2b95e2cc44f7070ae6ac0bbc086e51696c72

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
10 months agovfs.contents: remove unreachable code to handle commit blobs
Rob Browning [Fri, 6 Jul 2018 20:11:19 +0000 (15:11 -0500)]
vfs.contents: remove unreachable code to handle commit blobs

It shouldn't be possible to encounter an Item referring to a commit
blob because they're all (supposed to be) wrapped by a Commit.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agosplit: use // not / for division
Rob Browning [Sun, 21 Jan 2018 22:26:24 +0000 (16:26 -0600)]
split: use // not / for division

Without this, columnate can go off into the weeds because Python 3
changed / to floating point.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agohelpers: use compat.range everywhere for py3
Rob Browning [Sun, 24 Jun 2018 20:57:03 +0000 (15:57 -0500)]
helpers: use compat.range everywhere for py3

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
10 months agohelpers: use // not / for division
Rob Browning [Sun, 21 Jan 2018 22:26:24 +0000 (16:26 -0600)]
helpers: use // not / for division

...because Python 3 changed / to floating point.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agotimespec_to_nsecs(): don't destructure arguments
Rob Browning [Sun, 24 Jun 2018 20:44:48 +0000 (15:44 -0500)]
timespec_to_nsecs(): don't destructure arguments

Python 3 doesn't allow it.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agosplit: switch to print_function
Rob Browning [Thu, 18 Jan 2018 01:57:47 +0000 (19:57 -0600)]
split: switch to print_function

Python 3 requires it.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agosplit: don't require a repo unless we need it
Rob Browning [Sat, 7 Apr 2018 20:04:44 +0000 (15:04 -0500)]
split: don't require a repo unless we need it

This can be handy if you just want to test split performance, e.g.

  time ./bup split --noop whatever

etc.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agovfs: cache resolve() calls to improve (fuse) performance
Rob Browning [Sun, 6 May 2018 16:46:45 +0000 (11:46 -0500)]
vfs: cache resolve() calls to improve (fuse) performance

Include resolve() results in the vfs cache.  This substantially
improves fuse "cat somefile" performance.  (Observed a ~2x rate
improvement with a 500MB urandom file).

This appears to be due to the fact that fuse read(path, offset, len)
is called many times for the file, resulting in many corresponding,
redundant resolve(path) calls.

The previous fuse implementation, based on the previous vfs had its
own cache, but moving the caching to the vfs should be more generally
helpful.

Now bup fuse will again ignore repository changes that affect paths it
has already examined.  This matches its behavior in the current stable
release (0.29.1).

Thanks to voldial for reporting the problem.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agobup-split.md: indicate --noop doesn't require -t and -n
Rob Browning [Sun, 24 Jun 2018 16:52:26 +0000 (11:52 -0500)]
bup-split.md: indicate --noop doesn't require -t and -n

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agotest-split-join: test that split --noop produces no output
Rob Browning [Sun, 24 Jun 2018 16:32:42 +0000 (11:32 -0500)]
test-split-join: test that split --noop produces no output

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
10 months agoAdd bup split --noop <--blobs|--tree>
Robert Evans [Sun, 29 Apr 2018 10:47:30 +0000 (06:47 -0400)]
Add bup split --noop <--blobs|--tree>

This prints the resulting id without storing in the repo.

Signed-off-by: Robert Evans <evansr@google.com>
[rlb@defaultvalue.org: remove trailing period from commit summary]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
12 months agovfs.copy_item: don't try to copy an integer mode
Rob Browning [Sun, 6 May 2018 17:19:18 +0000 (12:19 -0500)]
vfs.copy_item: don't try to copy an integer mode

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
12 months agocache_notice: import randrange; use del not pop(); add tests
Rob Browning [Sun, 6 May 2018 15:56:50 +0000 (10:56 -0500)]
cache_notice: import randrange; use del not pop(); add tests

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
12 months agoprint_clean_line: don't print final sep when None
Rob Browning [Sun, 6 May 2018 15:20:03 +0000 (10:20 -0500)]
print_clean_line: don't print final sep when None

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
12 months agofix t/root-status for CygWin
Patrick Rouleau [Mon, 23 Apr 2018 01:47:37 +0000 (21:47 -0400)]
fix t/root-status for CygWin

Signed-off-by: Patrick Rouleau <prouleau72@gmail.com>
Tested-by: Patrick Rouleau <prouleau72@gmail.com>
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
12 months agoAdd missing space in bup split --bench output.
Robert Evans' via bup-list [Tue, 24 Apr 2018 02:12:35 +0000 (22:12 -0400)]
Add missing space in bup split --bench output.

Signed-off-by: Robert Evans <evansr@google.com>
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
13 months agois_superuser: test for group 544 or 0 on cygwin
Rob Browning [Sat, 31 Mar 2018 16:53:24 +0000 (11:53 -0500)]
is_superuser: test for group 544 or 0 on cygwin

This appears to be the appropriate way to check for admin status in
cygwin right now: https://cygwin.com/ml/cygwin/2015-02/msg00057.html

Thanks to at least Andrew Skretvedt, Ruvim Pinka, renpj, and Iar De
for reporting the problem, Ruvim Pinka, Paul Kronenwetter, and renpj
for proposing earlier solutions, and Ben Kelly and Johannes Berg for
helping test this approach.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
13 months agoCatPipe.get: fix error message construction (wrong var)
Rob Browning [Sun, 1 Apr 2018 17:05:17 +0000 (12:05 -0500)]
CatPipe.get: fix error message construction (wrong var)

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agorepo: make repository classes closeable and close client for remotes
Rob Browning [Sat, 31 Mar 2018 20:10:45 +0000 (15:10 -0500)]
repo: make repository classes closeable and close client for remotes

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agoMake PackWriter a "with" context manager
Rob Browning [Sat, 31 Mar 2018 20:30:02 +0000 (15:30 -0500)]
Make PackWriter a "with" context manager

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
13 months agoPackWriter: allow specification of a repo_dir
Rob Browning [Sat, 31 Mar 2018 20:25:55 +0000 (15:25 -0500)]
PackWriter: allow specification of a repo_dir

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agobuptest: base testing subproc funcs ex() and exo() on run()
Rob Browning [Sat, 31 Mar 2018 18:24:48 +0000 (13:24 -0500)]
buptest: base testing subproc funcs ex() and exo() on run()

Rework the subprocess functions, providing ex() and exo() as concise
test functions that print the commands they're executing.  Base them
on a common, lower-level run() function.

Drop exc() since ex() and exo() both check the exit status by default.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agotclient: invoke bup via absolute path
Rob Browning [Sat, 22 Mar 2014 19:07:09 +0000 (14:07 -0500)]
tclient: invoke bup via absolute path

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agobuptest: don't depend on helpers.mkdirp
Rob Browning [Wed, 28 Mar 2018 05:30:33 +0000 (00:30 -0500)]
buptest: don't depend on helpers.mkdirp

Better to keep the test harness independent when the relevant code is
this simple.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agocompat: add range and use it in the vfs
Rob Browning [Sat, 31 Mar 2018 21:42:53 +0000 (16:42 -0500)]
compat: add range and use it in the vfs

Define range as range for py3 and xrange for py2, so that we'll have
the same semantics both places.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agovfs: limit root_items branches to refs/heads
Rob Browning [Sat, 31 Mar 2018 19:48:16 +0000 (14:48 -0500)]
vfs: limit root_items branches to refs/heads

...since the top-level VFS names (without a dot prefix) should only
resolve to branches.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months agoSIGNED-OFF-BY: defer to ./LICENSE
Rob Browning [Tue, 27 Mar 2018 04:17:42 +0000 (23:17 -0500)]
SIGNED-OFF-BY: defer to ./LICENSE

Previously, the SIGNED-OFF-BY only referred to the LGPL-2, even though
several files are covered under a different license (described in
LICENSE).

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
13 months agoAdd "AND CONTRIBUTORS" to options.py license
Rob Browning [Tue, 27 Mar 2018 04:09:38 +0000 (23:09 -0500)]
Add "AND CONTRIBUTORS" to options.py license

From https://groups.google.com/d/msg/bup-list/8lcxXuXilTE/JC9rm69oAQAJ

  From: Avery Pennarun <apenwarr@gmail.com>
  Date: Sun, 25 Mar 2018 21:35:58 -0400
  Message-ID: <CAHqTa-2LB2mqscnzZmmixeTbR86BPh=FTk3UyGQKjPwaQPrZ3g@mail.gmail.com>
  Subject: Re: bupsplit.c copyright and patching
  To: Rob Browning <rlb@defaultvalue.org>
Cc: Robert Evans <evansr@google.com>, bup-list <bup-list@googlegroups.com>
  On Sun, Mar 25, 2018 at 1:48 PM, Rob Browning <rlb@defaultvalue.org> wrote:
  > Avery Pennarun <apenwarr@gmail.com> writes:
  >> On Sun, Mar 18, 2018 at 11:52 AM, Rob Browning <rlb@defaultvalue.org> wrote:
  >>> Avery Pennarun <apenwarr@gmail.com> writes:
  >>> So for the record, it sounds like you approve of changing the relevant
  >>> bupsplit.h and bupsplit.c phrase to this?
  >>>
  >>>   THIS SOFTWARE IS PROVIDED BY AVERY PENNARUN AND CONTRIBUTORS``AS IS'' AND ANY
  >>
  >> Yes, that's fine.
  >
  > And perhaps you'd approve of making the same change to options.py as
  > well?

  Good idea.  Let's do that :)

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
13 months agoAdd "AND CONTRIBUTORS" to bupsplit.h and bupsplit.c licenses
Rob Browning [Sun, 25 Mar 2018 17:19:53 +0000 (12:19 -0500)]
Add "AND CONTRIBUTORS" to bupsplit.h and bupsplit.c licenses

From https://groups.google.com/d/msg/bup-list/8lcxXuXilTE/UyOe7VGuCQAJ

  From: Avery Pennarun <apenwarr@gmail.com>
  Date: Sun, 18 Mar 2018 18:35:15 -0400
  Message-ID: <CAHqTa-1ghU6+Y0Y2pBOjbS=7CWKMytPvj-c1Z0aE3=PqpPi1OA@mail.gmail.com>
  Subject: Re: bupsplit.c copyright and patching
  To: Rob Browning <rlb@defaultvalue.org>
Cc: Robert Evans <evansr@google.com>, bup-list <bup-list@googlegroups.com>
    ...

  > So for the record, it sounds like you approve of changing the relevant
  > bupsplit.h and bupsplit.c phrase to this?
  >
  >   THIS SOFTWARE IS PROVIDED BY AVERY PENNARUN AND CONTRIBUTORS``AS IS'' AND ANY

  Yes, that's fine.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
13 months agotest-sparse-files: check sparse file size more carefully
Rob Browning [Tue, 27 Mar 2018 04:29:17 +0000 (23:29 -0500)]
test-sparse-files: check sparse file size more carefully

Test the actual sparse file with du, not the parent restore
directory.  Unnecessarily testing the whole tree broke the tests on a
docker system because the directories themselves were large.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
13 months ago_cmp_sha: Replace manual sha comparison with memcmp
Rob Browning [Sun, 25 Feb 2018 18:03:21 +0000 (10:03 -0800)]
_cmp_sha: Replace manual sha comparison with memcmp

...under the assumption that the platform-specific version may be more
efficient.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
14 months agoREADME.md: recommend the stable release when building from source
Rob Browning [Tue, 13 Mar 2018 01:09:45 +0000 (20:09 -0500)]
README.md: recommend the stable release when building from source

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
14 months agoRevert "lib/__init__.py: remove, since lib is not a package"
Rob Browning [Tue, 13 Mar 2018 01:05:21 +0000 (20:05 -0500)]
Revert "lib/__init__.py: remove, since lib is not a package"

...because at the moment this breaks wvtest.py.

This reverts commit 90ffb64f57bd754a7c562171c5a11c441f97bbfa.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
14 months agolib/__init__.py: remove, since lib is not a package
Rob Browning [Sat, 10 Mar 2018 19:16:02 +0000 (13:16 -0600)]
lib/__init__.py: remove, since lib is not a package

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
14 months agoSwitch mincore to Py_buffer for py3
Rob Browning [Sun, 25 Feb 2018 17:50:05 +0000 (09:50 -0800)]
Switch mincore to Py_buffer for py3

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
15 months agoMakefile: Don't use printf '\c'; not needed, and not portable
Rob Browning [Sat, 10 Feb 2018 16:18:08 +0000 (10:18 -0600)]
Makefile: Don't use printf '\c'; not needed, and not portable

Remove the printf '\c' introduced in
3306a802a11b8d945af081cb835bb7fe208dc84c.

Thanks to Alexander Barton for reporting the problem (seen on macOS)
and proposing an alternate solution.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agomain: don't set stdio to nonblocking
Rob Browning [Sat, 27 Jan 2018 21:19:24 +0000 (15:19 -0600)]
main: don't set stdio to nonblocking

This was left in the newliner replacement patch, and I can't remember
a justification for it.  Having it in there affects other processes,
so take it out.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agogit.repo: don't unintentionally set global repodir
Rob Browning [Wed, 31 Jan 2018 07:26:27 +0000 (01:26 -0600)]
git.repo: don't unintentionally set global repodir

Stop setting the global repodir when probing for and finding a .git/
subdirectory.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agoLocalRepo.__init__: use correct dir everywhere
Rob Browning [Wed, 31 Jan 2018 06:32:36 +0000 (00:32 -0600)]
LocalRepo.__init__: use correct dir everywhere

Don't set self.repo_dir to the correct value and then ignore that when
setting _cp and rev_list.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agoUse absolute_import from the __future__ everywhere
Rob Browning [Sat, 27 Jan 2018 17:40:02 +0000 (11:40 -0600)]
Use absolute_import from the __future__ everywhere

Without this, among other things, we can end up with conflicts with
new upstream modules.  For example, given lib/bup/io.py:

  Traceback (most recent call last):
    File "/home/rlb/src/bup/main-4/cmd/bup-index", line 10, in <module>
      from bup import metadata, options, git, index, drecurse, hlinkdb
    File "/home/rlb/src/bup/main-4/lib/bup/metadata.py", line 10, in <module>
      from io import BytesIO
  ImportError: cannot import name BytesIO

This switch also revealed a circular dependency between midx and git,
and several places where we weren't qualifying our bup imports
properly, i.e. "import git" rather than "from bup import git".

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agoRemove circular dep between git and midx
Rob Browning [Sat, 27 Jan 2018 17:39:30 +0000 (11:39 -0600)]
Remove circular dep between git and midx

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months ago_helpers: fix module init, and get it at least building with py3
Rob Browning [Sat, 20 Jan 2018 20:15:13 +0000 (14:15 -0600)]
_helpers: fix module init, and get it at least building with py3

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agoAdd compat.items() and use it
Rob Browning [Thu, 18 Jan 2018 02:00:00 +0000 (20:00 -0600)]
Add compat.items() and use it

Python 3 made items behave like iteritems and dropped iteritems.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agoDon't use cmp()
Rob Browning [Mon, 13 Mar 2017 06:08:39 +0000 (01:08 -0500)]
Don't use cmp()

Python 3 dropped it.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
15 months agocolumnate: use // not / for division
Rob Browning [Sun, 21 Jan 2018 22:26:24 +0000 (16:26 -0600)]
columnate: use // not / for division

Without this, columnate can go off into the weeds because Python 3
changed / to floating point.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agopath_components: adjust exception raise for py3
Rob Browning [Sat, 20 Jan 2018 20:17:14 +0000 (14:17 -0600)]
path_components: adjust exception raise for py3

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agoversion: switch to print_function
Rob Browning [Thu, 18 Jan 2018 01:57:47 +0000 (19:57 -0600)]
version: switch to print_function

Python 3 requires it.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agooptions: use items() instead of iteritems()
Rob Browning [Thu, 18 Jan 2018 01:56:46 +0000 (19:56 -0600)]
options: use items() instead of iteritems()

Python 3 dropped iteritems().

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agoroot-status: use print_function
Rob Browning [Wed, 15 Mar 2017 04:05:14 +0000 (23:05 -0500)]
root-status: use print_function

Python 3 requires it.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agoIgnore mincore when it returns ENOSYS
Rob Browning [Sat, 13 Jan 2018 16:23:49 +0000 (10:23 -0600)]
Ignore mincore when it returns ENOSYS

Observed on WSL.  Thanks to Levent Dane <leventdane@gmail.com> for
reporting the problem and helping test the fix.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
16 months agoClean subprocess output without newliner
Rob Browning [Sun, 26 Jun 2016 20:49:14 +0000 (15:49 -0500)]
Clean subprocess output without newliner

Instead of launching a newliner subprocess from main.py to clean up the
output from other subprocesses (with respect to \r, shorter lines as
compared to the previous line, etc.), do something similar directly from
main.py via select, and then drop all of the attendant signal
forwarding, subprocess detaching via setsid(), etc. that the newliner
arrangement had accumulated.

Among other things, this should make bup much more responsive to
TERM/QUIT/etc. signals (i.e. C-c).  Previously the
index/save/... subprocess might continue running even after bup
appeared to have quit.

To clean up the output, regularly check tty_width() and always write
"whole" space-padded lines, tracking stdout and stderr independently
(bup-newliner redirected both to stdout).

Related:

  aa6f2c87e6f1292f1fa22f618532b65a5565d604
  b7a524ccb662c9ed3ebd786da0f45f459929ef45
  119f9dd3b3421c31578105954a34fc5e32826ae5
  073b383882e73904ae04179e69a68419d8d57199

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agowvtest: set a very large timeout to disable test time colors
Rob Browning [Sun, 31 Dec 2017 19:29:53 +0000 (13:29 -0600)]
wvtest: set a very large timeout to disable test time colors

I find them distracting and would rather only "see red" for failed
tests.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agoCODINGSTYLE: add python exception handling guidelines
Rob Browning [Sun, 31 Dec 2017 18:29:05 +0000 (12:29 -0600)]
CODINGSTYLE: add python exception handling guidelines

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
16 months agochain_ex: don't opportunistically add tracebacks to context_ex
Rob Browning [Sun, 31 Dec 2017 18:23:01 +0000 (12:23 -0600)]
chain_ex: don't opportunistically add tracebacks to context_ex

Don't add a traceback to the context_ex while chaining.  This could be
wrong, depending on the context, and in the common case, the traceback
more likely belonged on the result exception, not the context_ex.,
i.e.

  except ... as ex:
      raise chain_ex(ex, pending_ex)

Instead, just combine chain_ex with add_ex_tb when appropriate:

  except ... as ex:
      raise chain_ex(add_tb_ex(ex), pending_ex)

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agoadd_ex_tb: return the exception
Rob Browning [Sun, 31 Dec 2017 18:15:40 +0000 (12:15 -0600)]
add_ex_tb: return the exception

Allows:

  chain_ex(add_ex_tb(ex2), ex)

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
16 months agoCODINGSTYLE: convert to restructured text
Rob Browning [Sun, 31 Dec 2017 17:53:16 +0000 (11:53 -0600)]
CODINGSTYLE: convert to restructured text