main.py: forward SIGTSTP/SIGCONT so "C-z" will actually suspend everything.

Catch and forward SIGTSTP (as SIGSTOP) and SIGCONT to the subprocess
as we already do for SIGTERM and SIGINT so that the subprocess will
also suspend/resume.

This still leaves bup with potentially unexpected behavior since the
(detached) subprocess will never see a SIGSTOP delivered to the parent
(because SIGSTOP can't be intercepted and forwarded).  This is due to
the os.setsid() call that was originally introduced to support current
newliner arrangement (cf. b7a524ccb662c9ed3ebd786da0f45f459929ef45).

Thanks to Kalle for the report.

Reported-by: krichter722@aol.de
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
save-cmd.py: don't write an irrelevant and incomplete .bupm fragment.

When finishing up (leaving) a directory and preparing to store its
related tree in the repository, don't write the pending .bupm (which
is still incomplete) to the pack if we know the directory already
exists in the repository (i.e. when we're not going to write it
either).

This problem was discovered when Zoran noticed that two consecutive
saves without an intervening index could produce a repository with an
unreferenced blob (according to git fsck).

Reported-by: Zoran Zaric <zz@zoranzaric.de>
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Add --human-readable option to "bup web".

When --human-readable is specified, print sizes like 3.5K, 1.8G,
etc., instead of the exact byte count.

Signed-Off-By: Kumar Appaiah <a.kumar@alumni.iitm.ac.in>
Reviewed-by: Zoran Zaric <zz@zoranzaric.de>
[rlb@defaultvalue.org: adjust commit message; squash two of Kumar's
 patches into this one.]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Add -l and --human-readable options to "bup ls".

When -l is specified, include the size in bytes for each item.

When --human-readable is also specified, print sizes like 3.5K, 1.8G,
etc., instead of the exact byte count.

Signed-Off-By: Kumar Appaiah <a.kumar@alumni.iitm.ac.in>
Reviewed-by: Zoran Zaric <zz@zoranzaric.de>
[rlb@defaultvalue.org: adjust commit message; adjust newlines; squash
 two of Kumar's patches into this one.]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Preserve filesystem timestamps during "make install".

A good idea regardless, and recommended by the Fedora and Debian
packaging guidelines.

From debian-policy:

  The rationale is that there is some information conveyed by knowing
  the age of the file, for example, you could recognize that some
  documentation is very old by looking at the modification time, so it
  would be nice if the modification time of the upstream source would
  be preserved.

It should also help prevent unnecessary backup churn after upgrades.

Signed-off-by: Christopher Meng <cickumqt@gmail.com>
Reviewed-by: Zoran Zaric <zz@zoranzaric.de>
Tested-by: Zoran Zaric <zz@zoranzaric.de>
[rlb@defaultvalue.org: adjust commit message]
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Mention tmp/review/ branches in HACKING.

Signed-off-by: Zoran Zaric <zz@zoranzaric.de>
[rlb@defaultvalue.org: make minor wording changes.]
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Stop interleaving stream and mmap IO operations when writing the index.

Previously bup would write the index via a simultaneous combination of
stream operations and mmap writes to non-overlapping, but adjacent
regions of the same file.  This was causing index corruption in some
cases.

Instead, make an extra pass over the data in memory to precompute the
size of the final index section, which contains any 31+-bit offsets.
Then mmap and write the entire set of tables directly, avoiding the
need for simultaneous stream operations.

Reported-by: Alan Jenkins <alan.christopher.jenkins@gmail.com>
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Greg Troxel <gdt@lexort.com>
Reviewed-by: Greg Troxel <gdt@lexort.com>
bup-init.md: update after dropping automatic ~/.bup init.

Signed-off-by: Zoran Zaric <zz@zoranzaric.de>
[rlb@defaultvalue.org: adjust commit message; remove escape from
 BUP\_DIR after list discussion; remove additional "bup init" from
 README.md example.]
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Don't try to load POSIX1e ACLs when the library isn't installed.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Always fall back to socket()/bind() when os.mknod(...S_IFSOCK) fails.

Previously bup would use socket()/bind() instead of os.mknod(... |
stat.S_IFSOCK) on Cygwin, but this issue isn't Cygwin specific.
Remove the platform conditionalization, and fall back to
socket()/bind() any time mknod() fails with EINVAL.

Thanks to Robert Edmonds <edmonds@debian.org> for reporting the
relevant failure on a Debian kFreeBSD buildd.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Fix minor typo in Metadata.read() in metadata.py.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Treat ENOSYS like EOPNOTSUPP in _add_posix1e_acl().

Thanks to Robert Edmonds <edmonds@debian.org> for reporting the
relevant failure on a Debian kFreeBSD buildd.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Fix path ownership restoration problems on Cygwin.

It turns out that Cygwin won't allow you to chown() a path to an
unknown uid or gid, even when "root".

For now, make that a deferred error on Cygwin, rework the tests to
avoid it when possible, and disable the tests (on Cygwin) that require
it.

For the record, it appears that tar doesn't normally hit this problem
on Cygwin because it uses "geteuid() == 0" to detect super-user
status, which won't be true in the normal case, even if the user is an
administrator.

Signed-off-by: Rob Browning <rlb@defaultvalue.org>