[packages/rsnapshot] - rel 4; upstream also broken if ssh_args in use; drop broken patches then

arekm arekm at pld-linux.org
Wed Mar 26 15:26:21 CET 2014


commit 08a4c9ffa148ed07e370a53904cbddd34c952f0e
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Wed Mar 26 15:26:18 2014 +0100

    - rel 4; upstream also broken if ssh_args in use; drop broken patches then

 rsnapshot-git.patch | 3143 ---------------------------------------------------
 rsnapshot.spec      |    4 +-
 2 files changed, 1 insertion(+), 3146 deletions(-)
---
diff --git a/rsnapshot.spec b/rsnapshot.spec
index 5ce04f1..6f744b0 100644
--- a/rsnapshot.spec
+++ b/rsnapshot.spec
@@ -3,12 +3,11 @@ Summary:	Program for efficient remote updates of backup sets
 Summary(pl.UTF-8):	Program do wydajnego zdalnego uaktualniania zbiorów kopii zapasowych
 Name:		rsnapshot
 Version:	1.3.1
-Release:	3
+Release:	4
 License:	GPL v2+
 Group:		Daemons
 Source0:	http://www.rsnapshot.org/downloads/%{name}-%{version}.tar.gz
 # Source0-md5:	588f92995dcf60a6ea6df8d94a017e7e
-Patch0:		%{name}-git.patch
 URL:		http://www.rsnapshot.org/
 BuildRequires:	rpm-perlprov
 Requires:	rsync
@@ -23,7 +22,6 @@ w oparciu o rsynca.
 
 %prep
 %setup -q
-%patch0 -p1
 
 %build
 %configure \
diff --git a/rsnapshot-git.patch b/rsnapshot-git.patch
deleted file mode 100644
index ff40cdd..0000000
--- a/rsnapshot-git.patch
+++ /dev/null
@@ -1,3143 +0,0 @@
-diff --git a/AUTHORS b/AUTHORS
-index 418569f..c60b2e5 100644
---- a/AUTHORS
-+++ b/AUTHORS
-@@ -87,3 +87,5 @@ David Grant <davidgrant at gmail.com>
- Matt McCutchen <matt at mattmccutchen.net>
-     - Wrote rsnapshot-copy (to copy snapshot roots using rsync --link-dest)
- 
-+Imran Chaudhry <ichaudhry at gmail.com>
-+    - added -H to rsnapshot-diff
-diff --git a/ChangeLog b/ChangeLog
-index a2e01d6..28b3bf7 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -3,6 +3,31 @@ rsnapshot changelog
- http://www.rsnapshot.org/
- ------------------------------------------------------------------------------
- 
-+VERSION 1.3.x
-+------------------------------------------------------------------------------
-+- Print rnspashot's PID when logging to syslog, instead of the logger's PID.
-+- make script uses pod2man instead of /usr/bin/pod2man
-+- rsnapshot-diff: Fixed removed files reported as addition (+ mark)
-+- check for SIGPIPE, mainly in case cron fails when trying to mail
-+  (this is probably why rsnapshot dies mysteriously if it outputs when
-+  called by cron on a system which does not have mail working).
-+- add test case for -t showing --link-dest when there is only one snapshot
-+- if gnu_cp_al fails, test out a simple cp -al command before suggesting
-+  that the cp does not support -al.
-+- When snapshot_root does not exist, check existence of parent directories.
-+- include_conf `command` now strips backticks before execution (bug fix
-+  based on suggestion from David Osborn).
-+- Ignore extraneous output from lvremove command.  (patch by Tim Connors) 
-+- Update current maintainer status in Authors section of man page.
-+  (David Cantrell stepped down between 1.3.0 and 1.3.1.) 
-+- Remove some old (1.1.x -> 1.2.0) upgrade notices from man page.
-+- Allow linux_lvm_cmd_* in config file to have options also.
-+- Allow `backticks with options` in include_conf.
-+- Fix inaccurate omission of --link-dest in test-mode output:
-+  http://sourceforge.net/mailarchive/forum.php?thread_name=4986E5A4.3090002%40Media-Brokers.com&forum_name=rsnapshot-discuss
-+- rsnapshot-diff: Add -s option to show size of each file.
-+  http://sourceforge.net/mailarchive/forum.php?thread_name=20080128082704.03568f0c%40szpak&forum_name=rsnapshot-discuss
-+
- VERSION 1.3.1  (Aug 31 2008)
- ------------------------------------------------------------------------------
- - Fix help message mixup in lines between -c and -t.
-@@ -12,7 +37,7 @@ VERSION 1.3.1  (Aug 31 2008)
- - Include rsnapshot-copy script written by Matt McCutchen.
- - Allow `backticks` in include_conf.
- - Apply fix-sync_first-rollback.diff patch from Matt McCutchen (02 Apr 2008).
--- hopefully fix bug with link_dest not being used on second and later backups 
-+- Fix bug with link_dest not being used on second and later backups 
-   when you have link_dest 1 and sync_first 1. (Ignore $sync_dir_was_present)
- - Patch from Adam Greenbaum to allow passing of ssh arguments correctly.
- - David Grant added rsync_numtries to rsnapshot.conf.
-diff --git a/Makefile.am b/Makefile.am
-index b57e439..cd4ca72 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -1,7 +1,7 @@
--# $Id: Makefile.am,v 1.88 2008/06/28 02:02:14 djk20 Exp $ #
-+# $Id: Makefile.am,v 1.91 2009/11/21 06:57:00 djk20 Exp $ #
- 
- # rsnapshot version
--VERSION = 1.3.1
-+VERSION = 1.3.1.1
- 
- # Where RPM files are built on this system
- RPM_BASE_DIR = /usr/src/redhat
-@@ -16,11 +16,11 @@ doc: man html
- man: $(man_MANS)
- rsnapshot.1 : rsnapshot
- 	@# perl 5.8 for this
--	/usr/bin/pod2man -c '' -n 'rsnapshot' -r '' rsnapshot > rsnapshot.1
-+	pod2man -c '' -n 'rsnapshot' -r '' rsnapshot > rsnapshot.1
- 	
- rsnapshot-diff.1 : rsnapshot-diff
- 	@# perl 5.8 for this
--	/usr/bin/pod2man -c '' -n 'rsnapshot-diff' -r '' rsnapshot-diff > rsnapshot-diff.1
-+	pod2man -c '' -n 'rsnapshot-diff' -r '' rsnapshot-diff > rsnapshot-diff.1
- 	
- html: rsnapshot.html
- rsnapshot.html: rsnapshot
-@@ -127,7 +127,10 @@ rsnapshot-$(VERSION).tar.gz: $(man_MANS) rpm-patch Makefile $(bin_SCRIPTS) $(sys
- 	rm -rf rsnapshot-$(VERSION)/
- 	@echo
- 
--test: rsnapshot
-+# If you lack GNU make, you could use "test_cases = t/*.t" as an approximation.
-+test_cases_in := $(wildcard t/*.t.in)
-+test_cases := $(test_cases_in:%.in=%)
-+test: rsnapshot $(test_cases)
- 	@PERL@ -MTest::Harness -e 'runtests(glob "t/*.t")';
- 
- bin_SCRIPTS = rsnapshot rsnapshot-diff
-diff --git a/Makefile.in b/Makefile.in
-index d1c6a2b..4b41ef2 100644
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -14,7 +14,7 @@
- 
- @SET_MAKE@
- 
--# $Id: Makefile.in,v 1.109 2008/08/31 10:48:47 djk20 Exp $ #
-+# $Id: Makefile.in,v 1.111 2009/03/27 21:36:34 djk20 Exp $ #
- 
- 
- srcdir = @srcdir@
-@@ -45,12 +45,14 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
- 	$(top_srcdir)/t/configtest.t.in $(top_srcdir)/t/gnu_cp.t.in \
- 	$(top_srcdir)/t/relative_delete_bugfix.t.in \
- 	$(top_srcdir)/t/rsync.t.in \
-+	$(top_srcdir)/t/snapshot_root_with_space.t.in \
- 	$(top_srcdir)/t/support/etc/configtest.conf.in \
- 	$(top_srcdir)/t/support/etc/gnu_cp.conf.in \
- 	$(top_srcdir)/t/support/etc/relative_delete_bugfix.conf.in \
--	$(top_srcdir)/t/support/etc/rsync.conf.in AUTHORS COPYING \
--	ChangeLog INSTALL NEWS TODO config.guess config.sub install-sh \
--	missing mkinstalldirs
-+	$(top_srcdir)/t/support/etc/rsync.conf.in \
-+	$(top_srcdir)/t/support/etc/snapshot_root_with_space.conf.in \
-+	AUTHORS COPYING ChangeLog INSTALL NEWS TODO config.guess \
-+	config.sub install-sh missing mkinstalldirs
- ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
- am__aclocal_m4_deps = $(top_srcdir)/configure.ac
- am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-@@ -61,8 +63,10 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
- CONFIG_CLEAN_FILES = rsnapshot rsnapshot-diff rsnapshot.conf.default \
- 	t/support/etc/configtest.conf t/support/etc/rsync.conf \
- 	t/support/etc/gnu_cp.conf \
--	t/support/etc/relative_delete_bugfix.conf t/configtest.t \
--	t/rsync.t t/gnu_cp.t t/relative_delete_bugfix.t
-+	t/support/etc/relative_delete_bugfix.conf \
-+	t/support/etc/snapshot_root_with_space.conf t/configtest.t \
-+	t/rsync.t t/gnu_cp.t t/relative_delete_bugfix.t \
-+	t/snapshot_root_with_space.t
- am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
- 	"$(DESTDIR)$(sysconfdir)"
- binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-@@ -141,7 +145,7 @@ TEST_RM = @TEST_RM@
- TEST_SSH = @TEST_SSH@
- 
- # rsnapshot version
--VERSION = 1.3.1
-+VERSION = 1.3.1.1
- ac_ct_STRIP = @ac_ct_STRIP@
- am__leading_dot = @am__leading_dot@
- am__tar = @am__tar@
-@@ -225,6 +229,8 @@ t/support/etc/gnu_cp.conf: $(top_builddir)/config.status $(top_srcdir)/t/support
- 	cd $(top_builddir) && $(SHELL) ./config.status $@
- t/support/etc/relative_delete_bugfix.conf: $(top_builddir)/config.status $(top_srcdir)/t/support/etc/relative_delete_bugfix.conf.in
- 	cd $(top_builddir) && $(SHELL) ./config.status $@
-+t/support/etc/snapshot_root_with_space.conf: $(top_builddir)/config.status $(top_srcdir)/t/support/etc/snapshot_root_with_space.conf.in
-+	cd $(top_builddir) && $(SHELL) ./config.status $@
- t/configtest.t: $(top_builddir)/config.status $(top_srcdir)/t/configtest.t.in
- 	cd $(top_builddir) && $(SHELL) ./config.status $@
- t/rsync.t: $(top_builddir)/config.status $(top_srcdir)/t/rsync.t.in
-@@ -233,6 +239,8 @@ t/gnu_cp.t: $(top_builddir)/config.status $(top_srcdir)/t/gnu_cp.t.in
- 	cd $(top_builddir) && $(SHELL) ./config.status $@
- t/relative_delete_bugfix.t: $(top_builddir)/config.status $(top_srcdir)/t/relative_delete_bugfix.t.in
- 	cd $(top_builddir) && $(SHELL) ./config.status $@
-+t/snapshot_root_with_space.t: $(top_builddir)/config.status $(top_srcdir)/t/snapshot_root_with_space.t.in
-+	cd $(top_builddir) && $(SHELL) ./config.status $@
- install-binSCRIPTS: $(bin_SCRIPTS)
- 	@$(NORMAL_INSTALL)
- 	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
-@@ -549,11 +557,11 @@ doc: man html
- man: $(man_MANS)
- rsnapshot.1 : rsnapshot
- 	@# perl 5.8 for this
--	/usr/bin/pod2man -c '' -n 'rsnapshot' -r '' rsnapshot > rsnapshot.1
-+	pod2man -c '' -n 'rsnapshot' -r '' rsnapshot > rsnapshot.1
- 
- rsnapshot-diff.1 : rsnapshot-diff
- 	@# perl 5.8 for this
--	/usr/bin/pod2man -c '' -n 'rsnapshot-diff' -r '' rsnapshot-diff > rsnapshot-diff.1
-+	pod2man -c '' -n 'rsnapshot-diff' -r '' rsnapshot-diff > rsnapshot-diff.1
- 
- html: rsnapshot.html
- rsnapshot.html: rsnapshot
-diff --git a/NOTES/add_test_case b/NOTES/add_test_case
-new file mode 100644
-index 0000000..b6fd8c0
---- /dev/null
-+++ b/NOTES/add_test_case
-@@ -0,0 +1,32 @@
-+These are some notes on how to add a new test case (XYZ) into rsnapshot.
-+The contents of the test script are not covered here (yet).
-+
-+
-+vi t/XYZ.t.in
-+# Create test script
-+
-+vi t/support/etc/XYZ.conf.in
-+# Create rsnapshot.conf for test (if required)
-+
-+cvs add t/XYZ.t.in t/support/etc/XYZ.conf.in
-+
-+vi configure.ac
-+# Add
-+>> AC_CONFIG_FILES(t/support/etc/XYZ.conf:t/support/etc/XYZ.conf.in)
-+# and
-+>> AC_CONFIG_FILES(t/XYZ.t:t/XYZ.t.in)
-+
-+./configure
-+# To generate t/XYZ.t from t/XYZ.t.in etc
-+# Note that starting 2009-11-21, "make test" will automatically generate
-+# t/ABC.t from t/ABC.t.in, if needed.  This means you should not need to
-+# run ./configure.
-+
-+make test
-+# Verify that test works as expected - if not use vi and make test.
-+
-+cvs commit t/XYZ.t.in t/support/etc/XYZ.conf.in configure.ac
-+# These files were directly updated
-+
-+cvs commit configure Makefile.in
-+# These files would have been regenerated
-diff --git a/README b/README
-index 390736b..30624aa 100644
---- a/README
-+++ b/README
-@@ -7,6 +7,8 @@ and you are welcome to redistribute it under certain conditions.
- See the GNU General Public Licence for details.
- 
- For installation or upgrade instructions, read INSTALL
-+
-+If you want to work on improving rsnapshot, please see README.developers
- ------------------------------------------------------------------------------
- 
- rsnapshot is a filesystem snapshot utility based on rsync.
-@@ -16,14 +18,16 @@ and remote machines over ssh. The code makes extensive use of hard links
- whenever possible, to greatly reduce the disk space required.
- 
- It is written entirely in perl with no module dependencies, and has been
--tested with versions 5.004 through 5.8.5.
-+tested with versions 5.004 through 5.16.3.
- 
- This program should work on any reasonably modern UNIX compatible OS. It
- has been tested successfully on the following operating systems:
-  - Debian: 3.0 (woody), 3.1 (sarge), unstable (sid)
-- - Redhat: 7.x, 8.0, Enterprise Linux 3.0 ES
-- - Fedora Core 1, 3
-- - CentOS 3, 4
-+ - Redhat: 7.x, 8.0
-+ - RedHat Enterprise Linux: 3.0 ES, 5, 6
-+ - Fedora Core: 1, 3
-+ - Fedora: 17, 18
-+ - CentOS: 3, 4, 5, 6
-  - WhiteBox Enterprise Linux 3.0
-  - Slackware 9.0
-  - SuSE: 9.0
-@@ -82,47 +86,47 @@ check to make sure everything is ready to go:
-     rsnapshot configtest
- 
- If this works, you can see essentially what will happen when you run it for
--real by executing the following command (where interval is hourly, daily, etc):
-+real by executing the following command (where interval is alpha, beta, etc):
- 
-     rsnapshot -t [interval]
- 
- Once you are happy with everything, the final step is to setup a cron job to
- automate your backups. Here is a quick example which makes backups every four
--hours, and daily backups for a week:
-+hours, and beta backups for a week:
-     
--    0 */4 * * *     /usr/local/bin/rsnapshot hourly
--    50 23 * * *     /usr/local/bin/rsnapshot daily
-+    0 */4 * * *     /usr/local/bin/rsnapshot alpha
-+    50 23 * * *     /usr/local/bin/rsnapshot beta
-     
--In the previous example, there will be six "hourly" snapshots
-+In the previous example, there will be six "alpha" snapshots
- taken each day (at 0,4,8,12,16, and 20 hours). There will also
--be daily snapshots taken every night at 11:50PM. The number of
-+be beta snapshots taken every night at 11:50PM. The number of
- snapshots that are saved depends on the "interval" settings in
- /etc/rsnapshot.conf.
- 
- For example:
-     
--    interval    hourly    6
-+    interval    alpha    6
-     
--This means that every time "rsnapshot hourly" is run, it will make a
-+This means that every time "rsnapshot alpha" is run, it will make a
- new snapshot, rotate the old ones, and retain the most recent six
--(hourly.0 - hourly.5).
-+(alpha.0 - alpha.5).
- 
--If you prefer instead to have daily, weekly and monthly backups,
--you might set up cron like this:
--    00 00 * * *     /usr/local/bin/rsnapshot daily
--    00 23 * * 6     /usr/local/bin/rsnapshot weekly
--    00 22 1 * *     /usr/local/bin/rsnapshot monthly
-+If you prefer instead to have three levels of backups (which we'll
-+call beta, gamma and delta), you might set up cron like this:
-+    00 00 * * *     /usr/local/bin/rsnapshot beta
-+    00 23 * * 6     /usr/local/bin/rsnapshot gamma
-+    00 22 1 * *     /usr/local/bin/rsnapshot delta
- 
--This specifies a daily rsnapshot at midnight, a weekly snapshot
--on Saturdays at 11:00pm and a monthly rsnapshot at 10pm on the
-+This specifies a beta rsnapshot at midnight, a gamma snapshot
-+on Saturdays at 11:00pm and a delta rsnapshot at 10pm on the
- first day of each month.
- 
- Note that the backups are done from the highest interval first
--(in this case monthly) and go down to the lowest interval.  If
--you are not having cron invoke the "hourly" snapshot interval,
--then you must also ensure that hourly is not listed as one of 
--your intervals in rsnapshot.conf (for example, comment out hourly,
--so that "daily" becomes the lowest interval).
-+(in this case delta) and go down to the lowest interval.  If
-+you are not having cron invoke the "alpha" snapshot interval,
-+then you must also ensure that alpha is not listed as one of 
-+your intervals in rsnapshot.conf (for example, comment out alpha,
-+so that "beta" becomes the lowest interval).
- 
- Remember that it is only the lowest interval which actually does
- the rsync to back up the relevant source directories, the higher
-diff --git a/README.developers b/README.developers
-new file mode 100644
-index 0000000..7c4d28b
---- /dev/null
-+++ b/README.developers
-@@ -0,0 +1,28 @@
-+Source code control
-+-------------------
-+
-+The rsnapshot source code lives on Github:
-+  https://github.com/DrHyde/rsnapshot
-+
-+The 'master' branch should be complete, by which we mean that there should
-+be no half-completed features in it.  This means that anything which
-+requires more than one commit should be done in a branch.
-+
-+Trivial changes (such as correcting spalling mistooks, or which change
-+just one or two lines of code) can go straight into master.  Non-trivial
-+changes should be reviewed by another developer, by raising a github
-+"pull request".
-+
-+Releases and versions
-+---------------------
-+
-+Releases should be done from branches, named for the release version,
-+eg release-1.4.  The first release of that version should be tagged '1.4.0'.
-+Subsequent releases of that version, which should contain no changes other
-+than bugfixes and security fixes, should also be tagged as, eg, '1.4.1'.
-+
-+Bug tracker
-+-----------
-+
-+The bug tracker and mailing lists are on Sourceforge:
-+  https://sourceforge.net/projects/rsnapshot/
-diff --git a/configure b/configure
-index c9a2566..e20a39d 100755
---- a/configure
-+++ b/configure
-@@ -1,6 +1,6 @@
- #! /bin/sh
- # Guess values for system-dependent variables and create Makefiles.
--# Generated by GNU Autoconf 2.59 for rsnapshot 1.3.1.
-+# Generated by GNU Autoconf 2.59 for rsnapshot 1.3.1.1.
- #
- # Report bugs to <rsnapshot-discuss at lists.sourceforge.net>.
- #
-@@ -269,8 +269,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
- # Identity of this package.
- PACKAGE_NAME='rsnapshot'
- PACKAGE_TARNAME='rsnapshot'
--PACKAGE_VERSION='1.3.1'
--PACKAGE_STRING='rsnapshot 1.3.1'
-+PACKAGE_VERSION='1.3.1.1'
-+PACKAGE_STRING='rsnapshot 1.3.1.1'
- PACKAGE_BUGREPORT='rsnapshot-discuss at lists.sourceforge.net'
- 
- ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CWD PERL CMD_RSYNC RSYNC TEST_CP CP CMD_CP RM TEST_RM CMD_RM SSH TEST_SSH CMD_SSH LOGGER TEST_LOGGER CMD_LOGGER DU TEST_DU CMD_DU LIBOBJS LTLIBOBJS'
-@@ -722,7 +722,7 @@ if test "$ac_init_help" = "long"; then
-   # Omit some internal or obsolete options to make the list less imposing.
-   # This message is too long to be a string in the A/UX 3.1 sh.
-   cat <<_ACEOF
--\`configure' configures rsnapshot 1.3.1 to adapt to many kinds of systems.
-+\`configure' configures rsnapshot 1.3.1.1 to adapt to many kinds of systems.
- 
- Usage: $0 [OPTION]... [VAR=VALUE]...
- 
-@@ -784,7 +784,7 @@ fi
- 
- if test -n "$ac_init_help"; then
-   case $ac_init_help in
--     short | recursive ) echo "Configuration of rsnapshot 1.3.1:";;
-+     short | recursive ) echo "Configuration of rsnapshot 1.3.1.1:";;
-    esac
-   cat <<\_ACEOF
- 
-@@ -895,7 +895,7 @@ fi
- test -n "$ac_init_help" && exit 0
- if $ac_init_version; then
-   cat <<\_ACEOF
--rsnapshot configure 1.3.1
-+rsnapshot configure 1.3.1.1
- generated by GNU Autoconf 2.59
- 
- Copyright (C) 2003 Free Software Foundation, Inc.
-@@ -909,7 +909,7 @@ cat >&5 <<_ACEOF
- This file contains any messages produced by compilers while
- running configure, to aid debugging if configure makes a mistake.
- 
--It was created by rsnapshot $as_me 1.3.1, which was
-+It was created by rsnapshot $as_me 1.3.1.1, which was
- generated by GNU Autoconf 2.59.  Invocation command line was
- 
-   $ $0 $@
-@@ -1552,7 +1552,7 @@ fi
- 
- # Define the identity of the package.
-  PACKAGE='rsnapshot'
-- VERSION='1.3.1'
-+ VERSION='1.3.1.1'
- 
- 
- cat >>confdefs.h <<_ACEOF
-@@ -2326,6 +2326,8 @@ CMD_DU="cmd_du		$DU"
- 
-           ac_config_files="$ac_config_files t/support/etc/relative_delete_bugfix.conf:t/support/etc/relative_delete_bugfix.conf.in"
- 
-+          ac_config_files="$ac_config_files t/support/etc/snapshot_root_with_space.conf:t/support/etc/snapshot_root_with_space.conf.in"
-+
- 
-           ac_config_files="$ac_config_files t/configtest.t:t/configtest.t.in"
- 
-@@ -2335,6 +2337,8 @@ CMD_DU="cmd_du		$DU"
- 
-           ac_config_files="$ac_config_files t/relative_delete_bugfix.t:t/relative_delete_bugfix.t.in"
- 
-+          ac_config_files="$ac_config_files t/snapshot_root_with_space.t:t/snapshot_root_with_space.t.in"
-+
- 
- 
- cat >confcache <<\_ACEOF
-@@ -2730,7 +2734,7 @@ _ASBOX
- } >&5
- cat >&5 <<_CSEOF
- 
--This file was extended by rsnapshot $as_me 1.3.1, which was
-+This file was extended by rsnapshot $as_me 1.3.1.1, which was
- generated by GNU Autoconf 2.59.  Invocation command line was
- 
-   CONFIG_FILES    = $CONFIG_FILES
-@@ -2785,7 +2789,7 @@ _ACEOF
- 
- cat >>$CONFIG_STATUS <<_ACEOF
- ac_cs_version="\\
--rsnapshot config.status 1.3.1
-+rsnapshot config.status 1.3.1.1
- configured by $0, generated by GNU Autoconf 2.59,
-   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
- 
-@@ -2896,10 +2900,12 @@ do
-   "t/support/etc/rsync.conf" ) CONFIG_FILES="$CONFIG_FILES t/support/etc/rsync.conf:t/support/etc/rsync.conf.in" ;;
-   "t/support/etc/gnu_cp.conf" ) CONFIG_FILES="$CONFIG_FILES t/support/etc/gnu_cp.conf:t/support/etc/gnu_cp.conf.in" ;;
-   "t/support/etc/relative_delete_bugfix.conf" ) CONFIG_FILES="$CONFIG_FILES t/support/etc/relative_delete_bugfix.conf:t/support/etc/relative_delete_bugfix.conf.in" ;;
-+  "t/support/etc/snapshot_root_with_space.conf" ) CONFIG_FILES="$CONFIG_FILES t/support/etc/snapshot_root_with_space.conf:t/support/etc/snapshot_root_with_space.conf.in" ;;
-   "t/configtest.t" ) CONFIG_FILES="$CONFIG_FILES t/configtest.t:t/configtest.t.in" ;;
-   "t/rsync.t" ) CONFIG_FILES="$CONFIG_FILES t/rsync.t:t/rsync.t.in" ;;
-   "t/gnu_cp.t" ) CONFIG_FILES="$CONFIG_FILES t/gnu_cp.t:t/gnu_cp.t.in" ;;
-   "t/relative_delete_bugfix.t" ) CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix.t:t/relative_delete_bugfix.t.in" ;;
-+  "t/snapshot_root_with_space.t" ) CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space.t:t/snapshot_root_with_space.t.in" ;;
-   *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
- echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-    { (exit 1); exit 1; }; };;
-diff --git a/configure.ac b/configure.ac
-index 339b1b5..490f221 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,6 +1,6 @@
--dnl $Id: configure.ac,v 1.49 2008/04/27 10:23:58 djk20 Exp $
-+dnl $Id: configure.ac,v 1.52 2009/11/21 07:04:02 djk20 Exp $
- 
--AC_INIT(rsnapshot, 1.3.1, rsnapshot-discuss at lists.sourceforge.net)
-+AC_INIT(rsnapshot, 1.3.1.1, rsnapshot-discuss at lists.sourceforge.net)
- AM_INIT_AUTOMAKE
- AC_PROG_MAKE_SET
- AC_PROG_INSTALL
-@@ -261,13 +261,16 @@ AC_CONFIG_FILES(t/support/etc/configtest.conf:t/support/etc/configtest.conf.in)
- AC_CONFIG_FILES(t/support/etc/rsync.conf:t/support/etc/rsync.conf.in)
- AC_CONFIG_FILES(t/support/etc/gnu_cp.conf:t/support/etc/gnu_cp.conf.in)
- AC_CONFIG_FILES(t/support/etc/relative_delete_bugfix.conf:t/support/etc/relative_delete_bugfix.conf.in)
-+AC_CONFIG_FILES(t/support/etc/snapshot_root_with_space.conf:t/support/etc/snapshot_root_with_space.conf.in)
-+AC_CONFIG_FILES(t/support/etc/link-dest_-t_when_only_one_snapshot.conf:t/support/etc/link-dest_-t_when_only_one_snapshot.conf.in)
- 
- dnl regression test scripts
- AC_CONFIG_FILES(t/configtest.t:t/configtest.t.in)
- AC_CONFIG_FILES(t/rsync.t:t/rsync.t.in)
- AC_CONFIG_FILES(t/gnu_cp.t:t/gnu_cp.t.in)
- AC_CONFIG_FILES(t/relative_delete_bugfix.t:t/relative_delete_bugfix.t.in)
--
-+AC_CONFIG_FILES(t/snapshot_root_with_space.t:t/snapshot_root_with_space.t.in)
-+AC_CONFIG_FILES(t/link-dest_-t_when_only_one_snapshot.t:t/link-dest_-t_when_only_one_snapshot.t.in)
- 
- AC_OUTPUT
- 
-diff --git a/redhat/README b/redhat/README
-index b3366d4..bd1cd30 100644
---- a/redhat/README
-+++ b/redhat/README
-@@ -11,3 +11,7 @@ rpm -ivh /path/to/your/RPMS/noarch/rsnapshot-1.x.x-0.noarch.rpm
- 
- If you don't want to make an RPM, you can download the latest version at
- http://www.rsnapshot.org/
-+
-+Fedora includes a rsnapshot RPM directly in its repositories.  And for RedHat
-+Enterprise Linux and its derivatives there is a rsnapshot RPM available in
-+EPEL (http://fedoraproject.org/wiki/EPEL).
-diff --git a/rsnapshot-diff.pl b/rsnapshot-diff.pl
-index 5b69bec..3da6651 100755
---- a/rsnapshot-diff.pl
-+++ b/rsnapshot-diff.pl
-@@ -13,7 +13,7 @@
- # http://www.rsnapshot.org/
- ##############################################################################
- 
--# $Id: rsnapshot-diff.pl,v 1.3 2006/05/31 19:51:03 drhyde Exp $
-+# $Id: rsnapshot-diff.pl,v 1.6 2010/08/10 13:00:15 drhyde Exp $
- 
- =head1 NAME
- 
-@@ -32,20 +32,23 @@ my $program_name = 'rsnapshot-diff';
- my %opts;
- my $verbose = 0;
- my $ignore = 0;
-+my $show_size = 0;
- 
--my $result = getopts('vVhi', \%opts);
-+my $result = getopts('vVhHis', \%opts);
- 
- # help
- if ($opts{'h'}) {
-     print qq{
--    $program_name [-vVhi] dir1 dir2
-+    $program_name [-vVHhi] dir1 dir2
- 
-     $program_name shows the differences between two 'rsnapshot' backups.
- 
-     -h    show this help
--    -v    be verbose
--    -V    be more verbose (mutter about unchanged files)
-+    -H    also show "human" sizes - MB and GB as well as just bytes
-     -i    ignore symlinks, directories, and special files in verbose output
-+    -s    show the size of each changed file
-+    -v    be verbose
-+    -V    be more verbose (mutter about unchanged files and about symlinks)
-     dir1  the first directory to look at
-     dir2  the second directory to look at
- 
-@@ -84,21 +87,31 @@ and added.
- 
- Displays help information
- 
--=item -v (verbose)
--
--Be verbose.  This will spit out a list of all changes as they are encountered,
--as well as the summary at the end.
-+=item -H (human)
- 
--=item -V (more verbose)
--
--Be more verbose - as well as listed changes, unchanged files will be listed
--too.
-+Display more human-friendly numbers - as well as showing the number of
-+bytes changed, also show MB and GB.
- 
- =item -i (ignore)
- 
- If verbosity is turned on, -i suppresses information about symlinks,
- directories, and special files.
- 
-+=item -s (show size)
-+
-+Show the size of each changed file after the + or - sign.  To sort the files by
-+decreasing size, use this option and run the output through "sort -k 2 -rn".
-+
-+=item -v (verbose)
-+
-+Be verbose.  This will spit out a list of all changes as they are encountered,
-+apart from symlink, as well as the summary at the end.
-+
-+=item -V (more verbose)
-+
-+Be more verbose - as well as listing changed files, unchanged files and
-+symlinks will be listed too.
-+
- =item dir1 and dir2
- 
- These are the only compulsory parameters, and should be the names of two
-@@ -120,22 +133,34 @@ if ($opts{'V'}) { $verbose = 2; }
- # ignore
- if ($opts{'i'}) { $ignore = 1; }
- 
-+# size
-+if ($opts{'s'}) { $show_size = 1; }
- 
- if(!exists($ARGV[1]) || !-d $ARGV[0] || !-d $ARGV[1]) {
-     die("$program_name\nUsage: $program_name [-vVhi] dir1 dir2\nType $program_name -h for details\n");
- }
- 
- my($dirold, $dirnew) = @ARGV;
-+my($addedfiles, $addedspace, $deletedfiles, $deletedspace) = (0, 0, 0, 0);
-+my($addedspace_mb, $addedspace_gb, $deletedspace_mb, $deletedspace_gb) = (0, 0, 0, 0);
-+
- ($dirold, $dirnew) = ($dirnew, $dirold) if(-M $dirold < -M $dirnew);
- print "Comparing $dirold to $dirnew\n";
- 
--my($addedfiles, $addedspace, $deletedfiles, $deletedspace) = (0, 0, 0, 0);
--
- compare_dirs($dirold, $dirnew);
- 
-+$addedspace_mb = sprintf("%.2f", $addedspace / (1024 * 1024));
-+$addedspace_gb = sprintf("%.2f", $addedspace_mb / 1024);
-+$deletedspace_mb = sprintf("%.2f", $deletedspace / (1024 * 1024));
-+$deletedspace_gb = sprintf("%.2f", $deletedspace_mb / 1024);
-+
- print "Between $dirold and $dirnew:\n";
--print "  $addedfiles were added, taking $addedspace bytes;\n";
--print "  $deletedfiles were removed, saving $deletedspace bytes;\n";
-+print "  $addedfiles were added, taking $addedspace bytes".
-+  ($opts{H} ? " ($addedspace_mb MB, $addedspace_gb GB)" : '').
-+  "\n";
-+print "  $deletedfiles were removed, saving $deletedspace bytes".
-+  ($opts{H} ? " ($deletedspace_mb MB, $deletedspace_gb GB)" : '').
-+  "\n";
- 
- sub compare_dirs {
-     my($old, $new) = @_;
-@@ -176,10 +201,14 @@ sub add {
-     print "Adding ".join(', ', @added)."\n" if(DEBUG && @added);
-     foreach(grep { !-d } @added) {
-         $addedfiles++;
--        $addedspace += (mystat($_))[7];
-+        my $size = (mystat($_))[7];
-+        $addedspace += $size;
-         # if ignore is on, only print files
-         unless ($ignore && (-l || !-f)) {
--            print "+ $_\n" if($verbose);
-+            print ''.($show_size ? "+ $size $_" : "+ $_").
-+	          (-l $_ ? ' (symlink)' : '').
-+		  "\n"
-+	        if($verbose == 2 || ($verbose == 1 && !-l $_));
-         }
-     }
-     foreach my $dir (grep { !-l && -d } @added) {
-@@ -193,10 +222,14 @@ sub remove {
-     print "Removing ".join(', ', @removed)."\n" if(DEBUG && @removed);
-     foreach(grep { !-d } @removed) {
-         $deletedfiles++;
--        $deletedspace += (mystat($_))[7];
-+        my $size = (mystat($_))[7];
-+        $deletedspace += $size;
-         # if ignore is on, only print files
-         unless ($ignore && (-l || !-f)) {
--            print "- $_\n" if($verbose);
-+            print ''.($show_size ? "- $size $_" : "- $_").
-+	          (-l $_ ? ' (symlink)' : '').
-+		  "\n"
-+	        if($verbose == 2 || ($verbose == 1 && !-l $_));
-         }
-     }
-     foreach my $dir (grep { !-l && -d } @removed) {
-@@ -237,7 +270,7 @@ David Cantrell E<lt>david at cantrell.org.ukE<gt>
- 
- =head1 COPYRIGHT
- 
--Copyright 2005 David Cantrell
-+Copyright 2005-2010 David Cantrell
- 
- =head1 LICENCE
- 
-diff --git a/rsnapshot-program.pl b/rsnapshot-program.pl
-index dfd7ef6..85972fd 100755
---- a/rsnapshot-program.pl
-+++ b/rsnapshot-program.pl
-@@ -26,7 +26,7 @@
- #                                                                      #
- ########################################################################
- 
--# $Id: rsnapshot-program.pl,v 1.398 2008/08/09 02:15:49 djk20 Exp $
-+# $Id: rsnapshot-program.pl,v 1.432 2012/04/24 21:37:11 drhyde Exp $
- 
- # tabstops are set to 4 spaces
- # in vi, do: set ts=4 sw=4
-@@ -81,7 +81,7 @@ my @backup_points;
- # array of backup points to rollback, in the event of failure
- my @rollback_points;
- 
--# "intervals" are user defined time periods (e.g., hourly, daily)
-+# "intervals" are user defined time periods (e.g., alpha, beta)
- # this array holds hash_refs containing the name of the interval,
- # and the number of snapshots to keep of it
- #
-@@ -187,6 +187,8 @@ $SIG{'INT'}		= sub { bail('rsnapshot was sent INT signal... cleaning up');  };
- $SIG{'QUIT'}	= sub { bail('rsnapshot was sent QUIT signal... cleaning up'); };
- $SIG{'ABRT'}	= sub { bail('rsnapshot was sent ABRT signal... cleaning up'); };
- $SIG{'TERM'}	= sub { bail('rsnapshot was sent TERM signal... cleaning up'); };
-+# For a PIPE error, we dont want any more output so set $verbose less than 1.
-+$SIG{'PIPE'}	= sub { $verbose = 0; bail('rsnapshot was sent PIPE signal... Hint: if rsnapshot is running from cron, check that mail is installed on this system, or redirect stdout and stderr in cron job'); };
- 
- ########################################
- ###      CORE PROGRAM STRUCTURE      ###
-@@ -224,7 +226,7 @@ if ($cmd eq 'configtest') {
- }
- 
- # parse config file (if it exists)
--if (defined($config_file) && (-f "$config_file") && (-r "$config_file")) {
-+if (defined($config_file) && -r $config_file) {
- 	# if there is a problem, this subroutine will exit the program and notify the user of the error
- 	parse_config_file();
- 	validate_config_file();
-@@ -283,7 +285,10 @@ chdir($config_vars{'snapshot_root'});
- handle_interval( $cmd );
- 
- # if we have a lockfile, remove it
--remove_lockfile();
-+# however, this will have already been done if use_lazy_deletes is turned
-+#   on, and there may be a lockfile from another process now in place,
-+#   so in that case don't just blindly delete!
-+remove_lockfile() unless($use_lazy_deletes);
- 
- # if we got this far, the program is done running
- # write to the log and syslog with the status of the outcome
-@@ -344,7 +349,7 @@ Commands:
-     diff             - Front-end interface to the rsnapshot-diff program.
-                        Accepts two optional arguments which can be either
-                        filesystem paths or backup directories within the
--                       snapshot_root (e.g., /etc/ daily.0/etc/). The default
-+                       snapshot_root (e.g., /etc/ beta.0/etc/). The default
-                        is to compare the two most recent snapshots.
-     du               - Show disk usage in the snapshot_root.
-                        Accepts an optional destination path for comparison
-@@ -458,7 +463,7 @@ sub parse_cmd_line_opts {
- 			for (my $i=1; $i<scalar(@ARGV); $i++) {
- 				print STDERR "Unknown option: $ARGV[$i]\n";
- 				print STDERR "Please make sure all switches come before commands\n";
--				print STDERR "(e.g., 'rsnapshot -v hourly', not 'rsnapshot hourly -v')\n";
-+				print STDERR "(e.g., 'rsnapshot -v alpha', not 'rsnapshot alpha -v')\n";
- 				exit(1);
- 			}
- 			
-@@ -502,14 +507,14 @@ sub parse_config_file {
- 	my @configs = ();
- 	
- 	# open the config file
--	my $config_file = shift() || $config_file;
-+	my $current_config_file = shift() || $config_file;
- 	my $CONFIG;
--	if($config_file =~ /^`.*`$/) {
--	    open($CONFIG, "$config_file|") ||
--	        bail("Couldn't execute \"$config_file\" to get config information\nAre you sure you have permission?");
-+	if($current_config_file =~ /^`(.*)`$/) {
-+	    open($CONFIG, "$1 |") 
-+	        or bail("Couldn't execute \"$1\" to get config information\n");
- 	} else {
--	    $CONFIG = IO::File->new($config_file)
--		or bail("Could not open config file \"$config_file\"\nAre you sure you have permission?");
-+	    $CONFIG = IO::File->new($current_config_file)
-+		or bail("Could not open config file \"$current_config_file\"\nAre you sure you have permission?");
-         }
- 	
- 	# read it line by line
-@@ -520,6 +525,11 @@ sub parse_config_file {
- 		# count line numbers
- 		$file_line_num++;
- 		
-+		# Ensure the correct filename is reported in error messages.  Setting it on
-+		# every iteration ensures it will be reset after recursive calls to this
-+		# function.
-+		$config_file = $current_config_file;
-+		
- 		# assume the line is formatted incorrectly
- 		my $line_syntax_ok = 0;
- 		
-@@ -529,8 +539,8 @@ sub parse_config_file {
- 		# ignore blank lines
- 		if (is_blank($line)) { next; }
- 
--		# if the next line begins with space or tab it belongs to this line
--		while (defined ($configs[$file_line_num]) && $configs[$file_line_num] =~ /^(\t|\s)/) {
-+		# if the next line begins with space or tab and also has a non-space character, then it belongs to this line as a continuation.
-+		while (defined ($configs[$file_line_num]) && $configs[$file_line_num] =~ /^[\t ]+\S/) {
- 			(my $newline = $configs[$file_line_num]) =~ s/^\s+|\s+$//g;
- 			$line = $line . "\t" . $newline;
- 			$file_line_num++;
-@@ -568,7 +578,7 @@ sub parse_config_file {
- 			$value =~ /^`(.*)`$/;
- 			if(
- 			    (defined($value) && -f $value && -r $value) ||
--			    (defined($1) && -x $1)
-+			    (defined($1) && is_valid_script($1))
- 			) {
- 				$line_syntax_ok = 1;
- 				parse_config_file($value);
-@@ -619,7 +629,7 @@ sub parse_config_file {
- 					next;
- 				}
- 				# make sure it's writable
--				if ( ! -w "$value" ) {
-+				if ( $cmd ne 'du' && ! -w "$value" ) {
- 					config_err($file_line_num, "$line - snapshot_root exists but is not writable");
- 					next;
- 				}
-@@ -755,45 +765,45 @@ sub parse_config_file {
- 		
- 		# CHECK FOR lvcreate (optional)
- 		if ($var eq 'linux_lvm_cmd_lvcreate') {
--			if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) {
-+			if (is_valid_script($value)) {
- 				$config_vars{'linux_lvm_cmd_lvcreate'} = $value;
- 				$line_syntax_ok = 1;
- 				next;
- 			} else {
--				config_err($file_line_num, "$line - $value is not executable");
-+				config_err($file_line_num, "$line - $value is not a valid executable");
- 				next;
- 			}
- 		}
- 		# CHECK FOR lvremove (optional)
- 		if ($var eq 'linux_lvm_cmd_lvremove') {
--			if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) {
-+			if (is_valid_script($value)) {
- 				$config_vars{'linux_lvm_cmd_lvremove'} = $value;
- 				$line_syntax_ok = 1;
- 				next;
- 			} else {
--				config_err($file_line_num, "$line - $value is not executable");
-+				config_err($file_line_num, "$line - $value is not a valid executable");
- 				next;
- 			}
- 		}
- 		# CHECK FOR mount (optional)
- 		if ($var eq 'linux_lvm_cmd_mount') {
--			if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) {
-+			if (is_valid_script($value)) {
- 				$config_vars{'linux_lvm_cmd_mount'} = $value;
- 				$line_syntax_ok = 1;
- 				next;
- 			} else {
--				config_err($file_line_num, "$line - $value is not executable");
-+				config_err($file_line_num, "$line - $value is not a valid executable");
- 				next;
- 			}
- 		}
- 		# CHECK FOR umount (optional)
- 		if ($var eq 'linux_lvm_cmd_umount') {
--			if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) {
-+			if (is_valid_script($value)) {
- 				$config_vars{'linux_lvm_cmd_umount'} = $value;
- 				$line_syntax_ok = 1;
- 				next;
- 			} else {
--				config_err($file_line_num, "$line - $value is not executable");
-+				config_err($file_line_num, "$line - $value is not a valid executable");
- 				next;
- 			}
- 		}
-@@ -915,18 +925,11 @@ sub parse_config_file {
- 				next;
- 			}
- 			
--			if (!defined($dest))	{
-+			if (!defined($dest) || $dest eq "")	{
- 				config_err($file_line_num, "$line - no destination path specified for backup point");
- 				next;
- 			}
- 			
--			# make sure we have a local path for the destination
--			# (we do NOT want an absolute path)
--			if ( is_valid_local_abs_path($dest) ) {
--				config_err($file_line_num, "$line - Backup destination $dest must be a local, relative path");
--				next;
--			}
--			
- 			# make sure we aren't traversing directories
- 			if ( is_directory_traversal($src) ) {
- 				config_err($file_line_num, "$line - Directory traversal attempted in $src");
-@@ -945,7 +948,7 @@ sub parse_config_file {
- 				
- 			# syntactically valid remote ssh?
- 			} elsif ( is_ssh_path($src) ) {
--				# if it's an absolute ssh path, make sure we have ssh
-+				# if it's an ssh path, make sure we have ssh
- 				if (!defined($config_vars{'cmd_ssh'})) {
- 					config_err($file_line_num, "$line - Cannot handle $src, cmd_ssh not defined in $config_file");
- 					next;
-@@ -1005,8 +1008,9 @@ sub parse_config_file {
- 			
- 			# validate destination path
- 			#
--			if ( is_valid_local_abs_path($dest) ) {
--				config_err($file_line_num, "$line - Full paths not allowed for backup destinations");
-+			# make sure we have a local NON absolute path for dest
-+			if ( ! is_valid_local_non_abs_path($dest) ) {
-+				config_err($file_line_num, "$line - Backup destination $dest must be a local, relative path");
- 				next;
- 			}
- 			
-@@ -1022,106 +1026,26 @@ sub parse_config_file {
- 			}
- 			
- 			# remember src/dest
--			# also, first check to see that we're not backing up the snapshot directory
--			#
--			# there are now two methods of making sure the user doesn't accidentally backup their snapshot_root
--			# recursively in a backup point: the good way, and the old way.
--			#
--			# in the old way, when rsnapshot detects the snapshot_root is under a backup point, the files and
--			# directories under that backup point are enumerated and get turned into several distinct rsync calls.
--			# for example, if you tried to back up "/", it would do a separate rsync invocation for "/bin/", "/etc/",
--			# and so on. this wouldn't be so bad except that it makes certain rsync options like one_fs and the
--			# include/exclude rules act funny since rsync isn't starting where the user expects (and there is no
--			# really good way to provide a workaround, either automatically or manually). however, changing this
--			# behaviour that users have come to rely on would not be very nice, so the old code path is left here
--			# for those that specifically enable the rsync_long_args parameter but don't set the --relative option.
--			#
--			# the new way is much nicer, but relies on the --relative option to rsync, which only became the default
--			# in rsnapshot 1.2.0 (primarily for this feature). basically, rsnapshot dynamically constructs an exclude
--			# path to avoid backing up the snapshot_root. clean and simple. many thanks to bharat mediratta for coming
--			# up with this solution!!!
-+			my %hash;
-+			$hash{'src'}	= $src;
-+			$hash{'dest'}	= $dest;
-+			if (defined($opts_ref)) {
-+				$hash{'opts'} = $opts_ref;
-+			}
-+			
-+			# If this backup point contains the snapshot root, add an exclude to avoid
-+			# backing up the snapshot root recursively.  The exclude is anchored (by virtue
-+			# of the leading slash of $config_vars{'snapshot_root'}) and applies to absolute
-+			# paths (the "/" modifier), so it should match the snapshot root and nothing else
-+			# regardless of --relative.
- 			#
--			# we only need to do any of this if the user IS trying to backup the snapshot_root
-+			# This should work in any version of rsync since 2.6.4 except for 2.6.7, due to a bug:
-+			# http://lists.samba.org/archive/rsync/2006-March/014953.html
- 			if ((is_real_local_abs_path("$src")) && ($config_vars{'snapshot_root'} =~ m/^$src/)) {
--				
--				# old, less good, backward compatibility method
--				if ( defined($config_vars{'rsync_long_args'}) && ($config_vars{'rsync_long_args'} !~ m/--relative/) ) {
--					# remove trailing slashes from source and dest, since we will be using our own
--					$src    = remove_trailing_slash($src);
--					$dest   = remove_trailing_slash($dest);
--					
--					opendir(SRC, "$src") or bail("Could not open $src");
--					
--					while (my $node = readdir(SRC)) {
--						next if ($node =~ m/^\.\.?$/o); # skip '.' and '..'
--						
--						# avoid double slashes from root filesystem
--						if ($src eq '/') {
--							$src = '';
--						}
--						
--						# if this directory is in the snapshot_root, skip it
--						# otherwise, back it up
--						#
--						if ("$config_vars{'snapshot_root'}" !~ m/^$src\/$node/) {
--							my %hash;
--							
--							$hash{'src'}    = "$src/$node";
--							$hash{'dest'}   = "$dest/$node";
--							
--							if (defined($opts_ref)) {
--								$hash{'opts'} = $opts_ref;
--							}
--							push(@backup_points, \%hash);
--						}
--					}
--					closedir(SRC);
--					
--				# new, shiny, preferred method. the way of the future.
--				} else {
--					my %hash;
--					my $exclude_path;
--					
--					$hash{'src'}	= $src;
--					$hash{'dest'}	= $dest;
--					if (defined($opts_ref)) {
--						$hash{'opts'} = $opts_ref;
--					}
--					
--					# dynamically generate an exclude path to avoid backing up the snapshot root.
--					# depending on the backup point and the snapshot_root location, this could be
--					# almost anything. it's tempting to think that just using the snapshot_root as
--					# the exclude path will work, but it doesn't. instead, this an exclude path that
--					# starts relative to the backup point. for example, if snapshot_root is set to
--					# /backup/private/snapshots/, and the backup point is /backup/, the exclude path
--					# will be private/snapshots/. the trailing slash does not appear to matter.
--					#
--					# it's also worth noting that this doesn't work at all without the --relative
--					# flag being passed to rsync (which is now the default).
--					#
--					# this method was added by bharat mediratta, and replaces my older, less elegant
--					# attempt to run multiple invocations of rsync instead.
--					#
--					$exclude_path = $config_vars{'snapshot_root'};
--					$exclude_path =~ s/^$src//;
--					
--					# pass it to rsync on this backup point only
--					$hash{'opts'}{'extra_rsync_long_args'} .= sprintf(' --exclude=%s', $exclude_path);
--					
--					push(@backup_points, \%hash);
--				}
--				
--			# the user is NOT trying to backup the snapshot_root. no workarounds required at all.
--			} else {
--				my %hash;
--				$hash{'src'}	= $src;
--				$hash{'dest'}	= $dest;
--				if (defined($opts_ref)) {
--					$hash{'opts'} = $opts_ref;
--				}
--				push(@backup_points, \%hash);
-+				$hash{'opts'}{'extra_rsync_long_args'} .= sprintf(' --filter=-/_%s', $config_vars{'snapshot_root'});
- 			}
- 			
-+			push(@backup_points, \%hash);
- 			next;
- 		}
- 		
-@@ -1147,8 +1071,8 @@ sub parse_config_file {
- 			@script_argv = split(/\s+/, $full_script);
- 			$script = $script_argv[0];
- 			
--			# make sure the destination is a full path
--			if (1 == is_valid_local_abs_path($dest)) {
-+			# make sure the destination is a relative path
-+			if (0 == is_valid_local_non_abs_path($dest)) {
- 				config_err($file_line_num, "$line - Backup destination $dest must be a local, relative path");
- 				next;
- 			}
-@@ -1553,7 +1477,21 @@ sub validate_config_file {
- 				if ( -e "$config_vars{'snapshot_root'}" ) {
- 					print_err ("$config_vars{'snapshot_root'} is not a directory.", 1);
- 				} else {
--					print_err ("$config_vars{'snapshot_root'} does not exist.", 1);
-+					my $snapshot_root = $config_vars{'snapshot_root'};
-+					# Check parent directories until we find one that exists
-+					while (! -e $snapshot_root) { 
-+						print_err ("$snapshot_root does not exist.", 1);
-+						$snapshot_root =~ m%(.*)/[^/]*%;
-+						if (defined($1) && $1 ne $snapshot_root) {
-+							$snapshot_root = $1;
-+						} else {
-+							last;
-+						}
-+					}
-+					if (-e $snapshot_root && ! -d $snapshot_root) {
-+						print_err ("$snapshot_root is not a directory.", 1);
-+						syslog_err("$snapshot_root is not a directory.");
-+					}
- 				}
- 				print_err ("rsnapshot refuses to create snapshot_root when no_create_root is enabled", 1);
- 				syslog_err("rsnapshot refuses to create snapshot_root when no_create_root is enabled");
-@@ -1577,6 +1515,7 @@ sub validate_config_file {
- 			my $tmp_dest_path = $$bp_ref{'dest'};
- 			
- 			# normalize multiple slashes, and strip trailing slash
-+			# FIXME: Decide whether to allow an empty destination path, and reject or handle such paths accordingly.
- 			$tmp_dest_path =~ s/\/+/\//g;
- 			$tmp_dest_path =~ s/\/$//;
- 			
-@@ -1608,7 +1547,7 @@ sub validate_config_file {
- 					$tmp_b  .= '/';
- 					$tmp_bs .= '/';
- 					
--					if ("$b_dest" =~ m/^$bs_dest/) {
-+					if ("$tmp_b" =~ m/^$tmp_bs/) {
- 						# duplicate entries, stop here
- 						print_err (
- 							"destination conflict between \"$tmp_b\" and \"$tmp_bs\" in backup / backup_script entries",
-@@ -1638,7 +1577,7 @@ sub validate_config_file {
- 					$path1 .= '/';
- 					$path2 .= '/';
- 					
--					if (("$path1" =~ m/$path2/) or ("$path2" =~ m/$path1/)) {
-+					if (("$path1" =~ m/^$path2/) or ("$path2" =~ m/^$path1/)) {
- 						print_err (
- 							"destination conflict between \"$path1\" and \"$path2\" in multiple backup_script entries", 1
- 						);
-@@ -2028,7 +1967,7 @@ sub print_warn {
- 	}
- 	
- 	# write to log
--	log_msg($str, $level);
-+	log_warn($str, $level);
- }
- 
- # accepts string, and level
-@@ -2164,15 +2103,15 @@ sub syslog_msg {
- 	if (defined($config_vars{'cmd_logger'})) {
- 		# print out our call to syslog
- 		if (defined($verbose) && ($verbose >= 4)) {
--			print_cmd("$config_vars{'cmd_logger'} -i -p $facility.$level -t rsnapshot $msg");
-+			print_cmd("$config_vars{'cmd_logger'} -p $facility.$level -t rsnapshot[$$] $msg");
- 		}
- 		
- 		# log to syslog
- 		if (0 == $test) {
--			$result = system($config_vars{'cmd_logger'}, '-i', '-p', "$facility.$level", '-t', 'rsnapshot', $msg);
-+			$result = system($config_vars{'cmd_logger'}, '-p', "$facility.$level", '-t', "rsnapshot[$$]", $msg);
- 			if (0 != $result) {
- 				print_warn("Could not log to syslog:", 2);
--				print_warn("$config_vars{'cmd_logger'} -i -p $facility.$level -t rsnapshot $msg", 2);
-+				print_warn("$config_vars{'cmd_logger'} -p $facility.$level -t rsnapshot[$$] $msg", 2);
- 			}
- 		}
- 	}
-@@ -2233,33 +2172,19 @@ sub get_current_date {
- 	# 4 = month + 1
- 	# 5 = year + 1900
- 	
--	# example date format (just like Apache logs)
--	# 28/Feb/2004:23:45:59
--	
--	my @months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
--	
-+	# example date format (ISO 8601)
-+	# 2012-04-24T22:30:13 (used to be 28/Feb/2004:23:45:59, like Apache)
- 	my @fields = localtime(time());
- 	
--	my $datestr =
--					# day of month
--					sprintf("%02i", $fields[3]) .
--					'/' .
--					# name of month
--					$months[$fields[4]] .
--					'/' .
--					# year
--					($fields[5]+1900) .
--					':' .
--					# hours (24 hour clock)
--					sprintf("%02i", $fields[2]) .
--					':' .
--					# minutes
--					sprintf("%02i", $fields[1]) .
--					':' .
--					# seconds
--					sprintf("%02i", $fields[0]);
--	
--	return ($datestr);
-+	return sprintf(
-+	    "%04i-%02i-%02iT%02i:%02i:%02i",
-+	    $fields[5] + 1900,
-+	    $fields[4] + 1,
-+	    $fields[3],
-+	    $fields[2],
-+	    $fields[1],
-+	    $fields[0]
-+	);
- }
- 
- # accepts no arguments
-@@ -2347,9 +2272,12 @@ sub add_lockfile {
- }
- 
- # accepts no arguments
--# accepts the path to a lockfile and tries to remove it
--# returns undef if lockfile isn't defined in the config file, and 1 upon success
--# also, it can exit the program with a value of 1 if it can't remove the lockfile
-+#
-+# returns undef if lockfile isn't defined in the config file
-+# return 1 upon success or if there's no lockfile to remove
-+# warn if the PID in the lockfile is not the same as the PID of this process
-+# exit with a value of 1 if it can't read the lockfile
-+# exit with a value of 1 if it can't remove the lockfile
- #
- # we don't use bail() to exit on error, because that would call
- # this subroutine twice in the event of a failure
-@@ -2363,6 +2291,17 @@ sub remove_lockfile {
- 	my $result = undef;
- 	
- 	if ( -e "$lockfile" ) {
-+	        if(open(LOCKFILE, $lockfile)) {
-+		  chomp(my $locked_pid = <LOCKFILE>);
-+		  close(LOCKFILE);
-+		  if($locked_pid != $$) {
-+		    print_warn("About to remove lockfile $lockfile which belongs to a different process (this is OK if it's a stale lock)");
-+		  }
-+		} else {
-+		  print_err ("Could not read lockfile $lockfile: $!", 0);
-+		  syslog_err("Error! Could not read lockfile $lockfile: $!");
-+		  exit(1);
-+		}
- 		print_cmd("rm -f $lockfile");
- 		if (0 == $test) {
- 			$result = unlink($lockfile);
-@@ -2436,27 +2375,27 @@ sub get_interval_data {
- 	my %hash;
- 	
- 	# which of the intervals are we operating on?
--	# if we defined hourly, daily, weekly ... hourly = 0, daily = 1, weekly = 2
-+	# if we defined alpha, beta, gamma ... alpha = 0, beta = 1, gamma = 2
- 	my $interval_num;
- 	
- 	# the highest possible number for the current interval context
--	# if we are working on hourly, and hourly is set to 6, this would be
-+	# if we are working on alpha, and alpha is set to 6, this would be
- 	# equal to 5 (since we start at 0)
- 	my $interval_max;
- 	
- 	# this is the name of the previous interval, in relation to the one we're
--	# working on. e.g., if we're operating on weekly, this should be "daily"
-+	# working on. e.g., if we're operating on gamma, this should be "beta"
- 	my $prev_interval;
- 	
- 	# same as $interval_max, except for the previous interval.
- 	# this is used to determine which of the previous snapshots to pull from
--	# e.g., cp -al hourly.$prev_interval_max/ daily.0/
-+	# e.g., cp -al alpha.$prev_interval_max/ beta.0/
- 	my $prev_interval_max;
- 	
- 	# FIGURE OUT WHICH INTERVAL WE'RE RUNNING, AND HOW IT RELATES TO THE OTHERS
- 	# THEN RUN THE ACTION FOR THE CHOSEN INTERVAL
- 	# remember, in each hashref in this loop:
--	#   "interval" is something like "daily", "weekly", etc.
-+	#   "interval" is something like "beta", "gamma", etc.
- 	#   "number" is the number of these intervals to keep on the filesystem
- 	
- 	my $i = 0;
-@@ -2485,7 +2424,7 @@ sub get_interval_data {
- 		
- 		# which of the previous interval's numbered directories should we pull from
- 		# for the interval we're currently set to run?
--		# e.g., daily.0/ might get pulled from hourly.6/
-+		# e.g., beta.0/ might get pulled from alpha.6/
- 		#
- 		$prev_interval_max = $$i_ref{'number'} - 1;
- 		
-@@ -2654,7 +2593,7 @@ sub is_blank {
- }
- 
- # accepts path
--# returns 1 if it's a valid ssh absolute path
-+# returns 1 if it's a valid ssh path
- # returns 0 otherwise
- sub is_ssh_path {
- 	my $path = shift(@_);
-@@ -2665,8 +2604,11 @@ sub is_ssh_path {
- 	if ($path =~ m/^\s/)				{ return (undef); }
- 	if ($path =~ m/\s$/)				{ return (undef); }
- 	
--	# must have user at host:[~]/path syntax for ssh
--	if ($path =~ m/^.*?\@.*?:~?\/.*$/)	{ return (1); }
-+	# don't match paths that look like URIs (rsync://, etc.)
-+	if ($path =~ m,://,)				{ return (undef); }
-+	
-+	# must have [user@]host:[~.]/path syntax for ssh
-+	if ($path =~ m/^(.*?\@)?.*?:[~.]?\/.*$/)	{ return (1); }
- 	
- 	return (0);
- }
-@@ -2758,6 +2700,26 @@ sub is_valid_local_abs_path {
- }
- 
- # accepts path
-+# returns 1 if it's a syntactically valid non-absolute (relative) path
-+# returns 0 otherwise
-+# does not check for directory traversal, since we want to use 
-+# a different error message if there is ".." in the path
-+sub is_valid_local_non_abs_path {
-+	my $path	= shift(@_);
-+	
-+	if (!defined($path)) { return (0); }
-+	if ($path =~ m/^\//) {
-+		return (0);		# Absolute path => bad
-+	}
-+	
-+	if ($path =~ m/^\S/) {
-+		 return (1);		# Starts with a non-whitespace => good
-+	} else {
-+		 return (0);		# Empty or starts with whitespace => bad
-+	}
-+}
-+
-+# accepts path
- # returns 1 if it's a directory traversal attempt
- # returns 0 if it's safe
- sub is_directory_traversal {
-@@ -2868,8 +2830,8 @@ sub handle_interval {
- 	
- 	# here we used to check for interval.delete directories.  This was
- 	# removed when we switched to using _delete.$$ directories.  This
--	# was done so that you can run another (eg) rsnapshot hourly, while
--	# the .delete directory from the previous hourly backup was still
-+	# was done so that you can run another (eg) rsnapshot alpha, while
-+	# the .delete directory from the previous alpha backup was still
- 	# going.  Potentially you may have several parallel deletes going on
- 	# with the new scheme, but I'm pretty sure that you'll catch up
- 	# eventually and not hopelessly wedge the machine -- DRC
-@@ -2989,14 +2951,17 @@ sub handle_interval {
- 				bail("Error! rm_rf(\"$config_vars{'snapshot_root'}/_delete.$$\")\n");
- 			}
- 		}
--	} else {
-+	} elsif($use_lazy_deletes) {
-+	        # only spit this out if lazy deletes are turned on.
-+		# Still need to suppress this if they're turned on but we've
-+		# not done enough backups to yet need to delete anything
- 		print_msg("No directory to delete: $config_vars{'snapshot_root'}/_delete.$$", 5);
- 	}
- }
- 
- # accepts an interval_data_ref
--# acts on the interval defined as $$id_ref{'interval'} (e.g., hourly)
--# this should be the smallest interval (e.g., hourly, not daily)
-+# acts on the interval defined as $$id_ref{'interval'} (e.g., alpha)
-+# this should be the smallest interval (e.g., alpha, not beta)
- #
- # rotates older dirs within this interval, hard links .0 to .1,
- # and rsync data over to .0
-@@ -3304,19 +3269,13 @@ sub rsync_backup_point {
- 	
- 	# other misc variables
- 	my @cmd_stack				= undef;
--	my $src						= undef;
-+	my $src						= $$bp_ref{'src'};
- 	my $result					= undef;
--	my $using_relative			= 0;
- 	
- 	my $linux_lvm                     = 0;
- 	my $linux_lvm_oldpwd              = undef;
- 	my $linux_lvm_snapshotname        = undef;
- 
--	if (defined($$bp_ref{'src'})) {
--		$src = remove_trailing_slash( "$$bp_ref{'src'}" );
--		$src = add_slashdot_if_root( "$src" );
--	}
--	
- 	# if we're using link-dest later, that target depends on whether we're doing a 'sync' or a regular interval
- 	# if we're doing a "sync", then look at [lowest-interval].0 instead of [cur-interval].1
- 	my $interval_link_dest;
-@@ -3325,16 +3284,9 @@ sub rsync_backup_point {
- 	# start looking for link_dest targets at interval.$start_num
- 	my $start_num = 1;
- 	
--	my $sync_dir_was_present = 0;
--	
- 	# if we're doing a sync, we'll start looking at [lowest-interval].0 for a link_dest target
- 	if ($interval eq 'sync') {
- 		$start_num = 0;
--		
--		# remember now if the .sync directory exists
--		if ( -d "$config_vars{'snapshot_root'}/.sync" ) {
--			$sync_dir_was_present = 1;
--		}
- 	}
- 	
- 	# look for the most recent link_dest target directory
-@@ -3342,9 +3294,17 @@ sub rsync_backup_point {
- 	foreach my $i_ref (@intervals) {
- 		if (defined($$i_ref{'number'})) {
- 			for (my $i = $start_num; $i < $$i_ref{'number'}; $i++) {
-+				my $i_check;
-+				if ($test && $interval ne 'sync') {
-+					# A real run would already have rotated the snapshots up, but this test run hasn't.
-+					# Hence, to know whether $i would exist at this point of a real run, we must check for $i - 1.
-+					$i_check = $i - 1;
-+				} else {
-+					$i_check = $i;
-+				}
- 				
- 				# once we find a valid link_dest target, the search is over
--				if ( -e "$config_vars{'snapshot_root'}/$$i_ref{'interval'}.$i/$$bp_ref{'dest'}" ) {
-+				if ( -e "$config_vars{'snapshot_root'}/$$i_ref{'interval'}.$i_check/$$bp_ref{'dest'}" ) {
- 					if (!defined($interval_link_dest) && !defined($interval_num_link_dest)) {
- 						$interval_link_dest		= $$i_ref{'interval'};
- 						$interval_num_link_dest = $i;
-@@ -3370,8 +3330,8 @@ sub rsync_backup_point {
- 			$tmp_rollback_point	= remove_trailing_slash($tmp_rollback_point);
- 			
- 			if ("$tmp_dest" eq "$tmp_rollback_point") {
--				print_warn ("$$bp_ref{'src'} skipped due to rollback plan", 2);
--				syslog_warn("$$bp_ref{'src'} skipped due to rollback plan");
-+				print_warn ("$src skipped due to rollback plan", 2);
-+				syslog_warn("$src skipped due to rollback plan");
- 				return (undef);
- 			}
- 		}
-@@ -3444,11 +3404,11 @@ sub rsync_backup_point {
- 	# SEE WHAT KIND OF SOURCE WE'RE DEALING WITH
- 	#
- 	# local filesystem
--	if ( is_real_local_abs_path($$bp_ref{'src'}) ) {
-+	if ( is_real_local_abs_path($src) ) {
- 		# no change
- 		
--	# if this is a user at host:/path, use ssh
--	} elsif ( is_ssh_path($$bp_ref{'src'}) ) {
-+	# if this is a user at host:/path (or ...:./path, or ...:~/...), use ssh
-+	} elsif ( is_ssh_path($src) ) {
- 		
- 		# if we have any args for SSH, add them
- 		if ( defined($ssh_args) ) {
-@@ -3460,17 +3420,17 @@ sub rsync_backup_point {
- 		}
- 		
- 	# anonymous rsync
--	} elsif ( is_anon_rsync_path($$bp_ref{'src'}) ) {
-+	} elsif ( is_anon_rsync_path($src) ) {
- 		# make rsync quiet if we're running in quiet mode
- 		if ($verbose < 2) { $rsync_short_args .= 'q'; }
- 		
- 	# cwrsync path
--	} elsif ( is_cwrsync_path($$bp_ref{'src'}) ) {
-+	} elsif ( is_cwrsync_path($src) ) {
- 		# make rsync quiet if we're running in quiet mode
- 		if ($verbose < 2) { $rsync_short_args .= 'q'; }
- 		
- 	# LVM path
--	} elsif ( is_linux_lvm_path($$bp_ref{'src'}) ) {
-+	} elsif ( is_linux_lvm_path($src) ) {
- 		# take LVM snapshot and mount, reformat src into local path
- 
-         unless (defined($config_vars{'linux_lvm_snapshotsize'})) {
-@@ -3487,15 +3447,15 @@ sub rsync_backup_point {
-         }
- 
-         # parse LVM src ('lvm://vgname/volname/path')
--        my ($linux_lvmvgname,$linux_lvmvolname, $linux_lvmpath) = ($$bp_ref{'src'} =~ m|^lvm://([^/]+)/([^/]+)/(.*)$|);
-+        my ($linux_lvmvgname,$linux_lvmvolname, $linux_lvmpath) = ($src =~ m|^lvm://([^/]+)/([^/]+)/(.*)$|);
-         # lvmvolname and/or path could be the string "0", so test for 'defined':
-         unless (defined($linux_lvmvgname) and defined($linux_lvmvolname) and defined($linux_lvmpath)) {
--            bail("Could not understand LVM source \"$$bp_ref{'src'}\" in backup_lowest_interval()");
-+            bail("Could not understand LVM source \"$src\" in backup_lowest_interval()");
-         }
-         
-         # assemble and execute LVM snapshot command
-         @cmd_stack = ();
--        push(@cmd_stack, $config_vars{'linux_lvm_cmd_lvcreate'});
-+        push(@cmd_stack, split(' ',$config_vars{'linux_lvm_cmd_lvcreate'}));
-         push(@cmd_stack, '--snapshot');
- 
-         push(@cmd_stack, '--size');
-@@ -3518,7 +3478,7 @@ sub rsync_backup_point {
-         
-         # mount the snapshot
-         @cmd_stack = ();
--        push(@cmd_stack, $config_vars{'linux_lvm_cmd_mount'});
-+        push(@cmd_stack, split(' ', $config_vars{'linux_lvm_cmd_mount'}));
- 
-         $linux_lvm_snapshotname = join('/', $config_vars{'linux_lvm_vgpath'}, $linux_lvmvgname, $config_vars{'linux_lvm_snapshotname'});
-         push(@cmd_stack, $linux_lvm_snapshotname);
-@@ -3545,12 +3505,12 @@ sub rsync_backup_point {
-             }
-         }
- 
--        $$bp_ref{'src'} = './' .  $linux_lvmpath;
-+        $src = './' .  $linux_lvmpath;
-         $linux_lvm = 1;
- 		
- 	# this should have already been validated once, but better safe than sorry
- 	} else {
--		bail("Could not understand source \"$$bp_ref{'src'}\" in backup_lowest_interval()");
-+		bail("Could not understand source \"$src\" in backup_lowest_interval()");
- 	}
- 	
- 	# if we're using --link-dest, we'll need to specify the link-dest directory target
-@@ -3558,23 +3518,11 @@ sub rsync_backup_point {
- 	if (1 == $link_dest) {
- 		# bp_ref{'dest'} and snapshot_root have already been validated, but these might be blank
- 		if (defined($interval_link_dest) && defined($interval_num_link_dest)) {
--			
--			# make sure the directory exists
--			if ( -d "$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}" ) {
--				
--				# we don't use link_dest if we already synced once to this directory
--				if (0 && $sync_dir_was_present) { # always false
--					
--					# skip --link-dest, this is the second time the sync has been run, because the .sync directory already exists
--					
--				# default: push link_dest arguments onto cmd stack
--				} else {
--					push(
--						@rsync_long_args_stack,
--						"--link-dest=$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}"
--					);
--				}
--			}
-+			# push link_dest arguments onto cmd stack
-+			push(
-+				@rsync_long_args_stack,
-+				"--link-dest=$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}"
-+			);
- 		}
- 	}
- 	
-@@ -3586,7 +3534,7 @@ sub rsync_backup_point {
- 	#
- 	if (
- 		(1 == $link_dest) &&
--		(is_file($$bp_ref{'src'})) &&
-+		(is_file($src)) &&
- 		defined($interval_link_dest) &&
- 		defined($interval_num_link_dest) &&
- 		(-f "$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}")
-@@ -3616,36 +3564,9 @@ sub rsync_backup_point {
- 		}
- 	}
- 	
--	# figure out if we're using the --relative flag to rsync.
--	# this influences how the source paths are constructed below.
--	foreach my $rsync_long_arg (@rsync_long_args_stack) {
--		if (defined($rsync_long_arg)) {
--			if ('--relative' eq $rsync_long_arg) {
--				$using_relative = 1;
--			}
--		}
--	}
--	
--	if (defined($$bp_ref{'src'})) {
--		# make sure that the source path doesn't have a trailing slash if we're using the --relative flag
--		# this is to work around a bug in most versions of rsync that don't properly delete entries
--		# when the --relative flag is set.
--		#
--		if (1 == $using_relative) {
--			$src = remove_trailing_slash( "$$bp_ref{'src'}" );
--			$src = add_slashdot_if_root( "$src" );
--			
--		# no matter what, we need a source path
--		} else {
--			# put a trailing slash on it if we know it's a directory and it doesn't have one
--			if ((-d "$$bp_ref{'src'}") && ($$bp_ref{'src'} !~ /\/$/)) {
--				$src = $$bp_ref{'src'} . '/';
--				
--			# just use it as-is
--			} else {
--				$src = $$bp_ref{'src'};
--			}
--		}
-+	# put a trailing slash on the source if we know it's a directory and it doesn't have one
-+	if ((-d "$src") && ($$bp_ref{'src'} !~ /\/$/)) {
-+		$src .= '/';
- 	}
- 	
- 	# BEGIN RSYNC COMMAND ASSEMBLY
-@@ -3692,8 +3613,7 @@ sub rsync_backup_point {
- 	$result = 1;
- 	if (0 == $test) {
- 		while ($tryCount < $rsync_numtries && $result !=0) {
--			# join is Michael Ashley's fix for some filter/space problems		
--			$result = system(join(' ', @cmd_stack));
-+			$result = system(@cmd_stack);
- 			$tryCount += 1;
- 		}
- 
-@@ -3722,15 +3642,13 @@ sub rsync_backup_point {
-         }
- 
-         @cmd_stack = ();
--        push(@cmd_stack, $config_vars{'linux_lvm_cmd_umount'});
-+        push(@cmd_stack, split(' ', $config_vars{'linux_lvm_cmd_umount'}));
- 
-         push(@cmd_stack, $config_vars{'linux_lvm_mountpath'});
-         
-         print_cmd(@cmd_stack);
-         if (0 == $test) {
--            # silence gratuitous lvremove output
--            #$result = system(@cmd_stack);
--            $result = system(join " ", @cmd_stack, ">/dev/null");
-+            $result = system(@cmd_stack);
-             
-             if ($result != 0) {
-                 bail("Unmount LVM snapshot failed: $result");
-@@ -3745,7 +3663,9 @@ sub rsync_backup_point {
-         
-         print_cmd(@cmd_stack);
-         if (0 == $test) {
--            $result = system(@cmd_stack);
-+            # silence gratuitous lvremove output
-+            #$result = system(@cmd_stack);
-+            $result = system(join " ", @cmd_stack, ">/dev/null");
-             
-             if ($result != 0) {
-                 bail("Removal of LVM snapshot failed: $result");
-@@ -3769,18 +3689,21 @@ sub split_long_args_with_quotes {
- 		$#stack++;
- 	        next;
-             # not in quotes and got a quote? remember that we're in quotes
--            } elsif($thischar =~ /['"]/ && !$inquotes) {
-+	    # NB the unnecessary \ are to appease emacs
-+            } elsif($thischar =~ /[\'\"]/ && !$inquotes) {
- 	        $inquotes = $thischar;
-             # in quotes and got a different quote? no nesting allowed
--            } elsif($thischar =~ /['"]/ && $inquotes ne $thischar) {
-+	    #   more emacs appeasement
-+            } elsif($thischar =~ /[\'\"]/ && $inquotes ne $thischar) {
- 	        print_err("Nested quotes not allowed in $argname", 1);
- 	        syslog_err("Nested quotes not allowed in $argname");
- 		exit(1);
-         # in quotes and got a close quote
- 	    } elsif($thischar eq $inquotes) {
- 	        $inquotes = '';
--            }
--	    $stack[-1] .= $thischar;
-+            } else {
-+	        $stack[-1] .= $thischar;
-+	    }
- 	}
- 	if($inquotes) {
- 	    print_err("Unbalanced quotes in $argname", 1);
-@@ -4236,7 +4159,7 @@ sub touch_interval_dir {
- 
- # accepts an interval_data_ref
- # looks at $$id_ref{'interval'} as the interval to act on,
--# and the previous interval $$id_ref{'prev_interval'} to pull up the directory from (e.g., daily, hourly)
-+# and the previous interval $$id_ref{'prev_interval'} to pull up the directory from (e.g., beta, alpha)
- # the interval being acted upon should not be the lowest one.
- #
- # rotates older dirs within this interval, and hard links
-@@ -4333,7 +4256,7 @@ sub rotate_higher_interval {
- 		# or if the previous interval isn't the smallest one,
- 		# move the last one up a level
- 		if (($prev_interval_max >= 1) or ($interval_num >= 2)) {
--			# mv hourly.5 to daily.0 (or whatever intervals we're using)
-+			# mv alpha.5 to beta.0 (or whatever intervals we're using)
- 			print_cmd(
- 				"mv $config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max/ ",
- 				"$config_vars{'snapshot_root'}/$interval.0/"
-@@ -4356,7 +4279,7 @@ sub rotate_higher_interval {
- 			exit(1);
- 		}
- 	} else {
--		print_msg("$config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max not present (yet), nothing to copy", 3);
-+		print_msg("$config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max not present (yet), nothing to copy", 2);
- 	}
- }
- 
-@@ -4408,6 +4331,29 @@ sub cp_al {
- 	return ($result);
- }
- 
-+# This is to test whether cp -al seems to work in a simple case
-+# return 0  if cp -al succeeds
-+# return 1  if cp -al fails
-+# return -1 if something else failed - test inconclusive
-+sub test_cp_al {
-+	my $s = "$config_vars{'snapshot_root'}/cp_al1";
-+	my $d = "$config_vars{'snapshot_root'}/cp_al2";
-+	my $result;
-+
-+	-d $s || mkdir($s) || return (-1);
-+	open(TT1, ">>$s/tt1") || return (-1);
-+	close(TT1) || return (-1);
-+	$result = system( $config_vars{'cmd_cp'}, '-al', "$s", "$d" );
-+	if ($result != 0) {
-+		return (1);
-+	}
-+	unlink("$d/tt1");
-+	unlink("$s/tt1");
-+	rmdir($d);
-+	rmdir($s);
-+	return (0);
-+}
-+
- # this is a wrapper to call the GNU version of "cp"
- # it might fail in mysterious ways if you have a different version of "cp"
- #
-@@ -4434,7 +4380,10 @@ sub gnu_cp_al {
- 	$result = system( $config_vars{'cmd_cp'}, '-al', "$src", "$dest" );
- 	if ($result != 0) {
- 		$status = $result >> 8;
--		print_err("$config_vars{'cmd_cp'} -al $src $dest failed (result $result, exit status $status).  Perhaps your cp does not support -al options?", 2);
-+		print_err("$config_vars{'cmd_cp'} -al $src $dest failed (result $result, exit status $status).", 2);
-+		if (test_cp_al() > 0 ) {
-+			print_err("Perhaps your cp does not support -al options?", 2);
-+		}
- 		return (0);
- 	}
- 	
-@@ -4728,8 +4677,7 @@ sub rsync_cleanup_after_native_cp_al {
- 	print_cmd(@cmd_stack);
- 	
- 	if (0 == $test) {
--                # join is Michael Ashley's fix for some filter/space problems
--		my $result = system(join(' ', @cmd_stack));
-+		my $result = system(@cmd_stack);
- 		
- 		if ($result != 0) {
- 			# bitmask return value
-@@ -4783,7 +4731,7 @@ sub rm_rf {
- 	
- 	# extra bonus safety feature!
- 	# confirm that whatever we're deleting must be inside the snapshot_root
--	if ("$path" !~ m/^$config_vars{'snapshot_root'}/o) {
-+	if (index($path, $config_vars{'snapshot_root'}) != 0) { 
- 		bail("rm_rf() tried to delete something outside of $config_vars{'snapshot_root'}! Quitting now!");
- 	}
- 	
-@@ -4832,9 +4780,9 @@ sub cmd_rm_rf {
- # that's why the print_* subroutines aren't used here.
- #
- sub show_disk_usage {
--	my $intervals_str = '';
-+	my @du_dirs = ();
- 	my $cmd_du	= 'du';
--	my $du_args	= '-csh';
-+	my $du_args	= $default_du_args;
- 	my $dest_path = '';
- 	my $retval;
- 	
-@@ -4867,7 +4815,7 @@ sub show_disk_usage {
- 			print STDERR "ERROR: Directory traversal is not allowed\n";
- 			exit(1);
- 		}
--		if (is_valid_local_abs_path($dest_path)) {
-+		if (! is_valid_local_non_abs_path($dest_path)) {
- 			print STDERR "ERROR: Full paths are not allowed\n";
- 			exit(1);
- 		}
-@@ -4879,7 +4827,7 @@ sub show_disk_usage {
- 		# if we have a .sync directory, that will have the most recent files, and should be first
- 		if (-d "$config_vars{'snapshot_root'}/.sync") {
- 			if (-r "$config_vars{'snapshot_root'}/.sync") {
--				$intervals_str .= "$config_vars{'snapshot_root'}/.sync ";
-+				push(@du_dirs, "$config_vars{'snapshot_root'}/.sync");
- 			}
- 		}
- 		
-@@ -4890,22 +4838,24 @@ sub show_disk_usage {
- 			
- 			for (my $i=0; $i < $max_interval_num; $i++) {
- 				if (-r "$config_vars{'snapshot_root'}/$interval.$i/$dest_path") {
--					$intervals_str .= "$config_vars{'snapshot_root'}/$interval.$i/$dest_path ";
-+					push(@du_dirs, "$config_vars{'snapshot_root'}/$interval.$i/$dest_path");
- 				}
- 			}
- 		}
- 	}
--	chop($intervals_str);
- 	
- 	# if we can see any of the intervals, find out how much space they're taking up
- 	# most likely we can either see all of them or none at all
--	if ('' ne $intervals_str) {
-+	if (scalar(@du_dirs) > 0) {
-+		my @cmd_stack = ($cmd_du,
-+			split_long_args_with_quotes('du_args', $du_args),
-+			@du_dirs);
- 		if (defined($verbose) && ($verbose >= 3)) {
--			print wrap_cmd("$cmd_du $du_args $intervals_str"), "\n\n";
-+			print wrap_cmd(join(' ', @cmd_stack)), "\n\n";
- 		}
- 		
- 		if (0 == $test) {
--			$retval = system("$cmd_du $du_args $intervals_str");
-+			$retval = system(@cmd_stack);
- 			if (0 == $retval) {
- 				# exit showing success
- 				exit(0);
-@@ -4929,7 +4879,7 @@ sub show_disk_usage {
- 	exit(1);
- }
- 
--# accept two args from $ARGV[1] and [2], like "daily.0" "daily.1" etc.
-+# accept two args from $ARGV[1] and [2], like "beta.0" "beta.1" etc.
- # stick the full snapshot_root path on the beginning, and call rsnapshot-diff with these args
- # NOTE: since this is a read-only operation, we're not concerned with directory traversals and relative paths
- sub show_rsnapshot_diff {
-@@ -5469,6 +5419,11 @@ sub copy_symlink {
- 	# This is done in two steps:
- 	# Reading/dereferencing the link, and creating a new one
- 	#
-+	# Why not just hard link the symlink?
-+	# see http://www.rsnapshot.org/security/2005/001.html
-+	# and also msgid <5036B23B.3000606 at scubaninja.com> on
-+	# rsnapshot-discuss, on 2012-08-23
-+	#
- 	# Step 1: READ THE LINK
- 	if (($verbose > 4) or ($loglevel > 4)) {
- 		my $cmd_string = "readlink(\"$src\")\n";
-@@ -6217,7 +6172,8 @@ B<linux_lvm_cmd_umount>
- =over 4
- 
- Paths to lvcreate, lvremove, mount and umount commands, for use with Linux
--LVMs.  The lvcreate, lvremove, mount and umount commands are required for
-+LVMs.  You may include options to the commands also. 
-+The lvcreate, lvremove, mount and umount commands are required for
- managing snapshots of LVM volumes and are otherwise optional.
- 
- =back
-@@ -6226,7 +6182,7 @@ B<retain>             [name]   [number]
- 
- =over 4
- 
--"name" refers to the name of this backup level (e.g., hourly, daily,
-+"name" refers to the name of this backup level (e.g., alpha, beta,
- so also called the 'interval'). "number"
- is the number of snapshots for this type of interval that will be retained.
- The value of "name" will be the command passed to B<rsnapshot> to perform
-@@ -6234,43 +6190,43 @@ this type of backup.
- 
- A deprecated alias for 'retain' is 'interval'.
- 
--Example: B<retain hourly 6>
-+Example: B<retain alpha 6>
- 
--[root at localhost]# B<rsnapshot hourly>
-+[root at localhost]# B<rsnapshot alpha>
- 
- For this example, every time this is run, the following will happen:
- 
--<snapshot_root>/hourly.5/ will be deleted, if it exists.
-+<snapshot_root>/alpha.5/ will be deleted, if it exists.
- 
--<snapshot_root>/hourly.{1,2,3,4} will all be rotated +1, if they exist.
-+<snapshot_root>/alpha.{1,2,3,4} will all be rotated +1, if they exist.
- 
--<snapshot_root>/hourly.0/ will be copied to <snapshot_root>/hourly.1/
-+<snapshot_root>/alpha.0/ will be copied to <snapshot_root>/alpha.1/
- using hard links.
- 
- Each backup point (explained below) will then be rsynced to the
--corresponding directories in <snapshot_root>/hourly.0/
-+corresponding directories in <snapshot_root>/alpha.0/
- 
- Backup levels must be specified in the config file in order, from most
- frequent to least frequent. The first entry is the one which will be
--synced with the backup points. The subsequent backup levels (e.g., daily,
--weekly, etc) simply rotate, with each higher backup level pulling from the
-+synced with the backup points. The subsequent backup levels (e.g., beta,
-+gamma, etc) simply rotate, with each higher backup level pulling from the
- one below it for its .0 directory.
- 
- Example:
- 
- =over 4
- 
--B<retain  hourly 6>
-+B<retain  alpha 6>
- 
--B<retain  daily  7>
-+B<retain  beta  7>
- 
--B<retain  weekly 4>
-+B<retain  gamma 4>
- 
- =back
- 
--daily.0/ will be copied from hourly.5/, and weekly.0/ will be copied from daily.6/
-+beta.0/ will be copied from alpha.5/, and gamma.0/ will be copied from beta.6/
- 
--hourly.0/ will be rsynced directly from the filesystem.
-+alpha.0/ will be rsynced directly from the filesystem.
- 
- =back
- 
-@@ -6398,21 +6354,10 @@ B<rsync_long_args     --delete --numeric-ids --relative --delete-excluded>
- 
- =over 4
- 
--List of long arguments to pass to rsync. Beginning with rsnapshot 1.2.0, this
--default has changed. In previous versions, the default values were
--
--    --delete --numeric-ids
--
--Starting with version 1.2.0, the default values are
--
-+List of long arguments to pass to rsync.  The default values are
-     --delete --numeric-ids --relative --delete-excluded
--
--This directly affects how the destination paths in your backup points are
--constructed. Depending on what behaviour you want, you can explicitly set
--the values to make the program behave like the old version or the current
--version. The newer settings are recommended if you're just starting. If
--you are upgrading, read the upgrade guide in the INSTALL file in the
--source distribution for more information.
-+This means that the directory structure in each backup point destination 
-+will match that in the backup point source.
- 
- Quotes are permitted in rsync_long_args, eg --rsync-path="sudo /usr/bin/rsync".
- You may use either single (') or double (") quotes, but nested quotes (including
-@@ -6488,7 +6433,7 @@ disk space. The default is 0 (off).
- 
- The details of how this works have changed in rsnapshot version 1.3.1.
- Originally you could only ever have one .delete directory per backup level.
--Now you can have many, so if your next (eg) hourly backup kicks off while the
-+Now you can have many, so if your next (eg) alpha backup kicks off while the
- previous one is still doing a lazy delete you may temporarily have extra
- _delete directories hanging around.
- 
-@@ -6526,17 +6471,6 @@ Mount point to use to temporarily mount the snapshot(s).
- 
- =back
- 
--
--B<UPGRADE NOTICE:>
--
--=over 4
--
--If you have used an older version of rsnapshot, you might notice that the
--destination paths on the backup points have changed. Please read the INSTALL
--file in the source distribution for upgrade options.
--
--=back
--
- B<backup>  /etc/                       localhost/
- 
- B<backup>  root at example.com:/etc/      example.com/
-@@ -6580,6 +6514,15 @@ using rsync over ssh
- 
- =back
- 
-+B<backup   example.com:/etc/       example.com/>
-+
-+=over 4
-+
-+Same thing but let ssh choose the remote username (as specified in
-+~/.ssh/config, otherwise the same as the local username)
-+
-+=back
-+
- B<backup   root at example.com:/usr/local/ example.com/>
- 
- =over 4
-@@ -6699,10 +6642,10 @@ Putting it all together (an example file):
-     linux_lvm_vgpath          /dev
-     linux_lvm_mountpath       /mnt/lvm-snapshot
- 
--    retain              hourly  6
--    retain              daily   7
--    retain              weekly  7
--    retain              monthly 3
-+    retain              alpha  6
-+    retain              beta   7
-+    retain              gamma  7
-+    retain              delta 3
- 
-     backup              /etc/                     localhost/
-     backup              /home/                    localhost/
-@@ -6716,6 +6659,8 @@ Putting it all together (an example file):
- 
- =back
- 
-+=back
-+
- =head1 USAGE
- 
- B<rsnapshot> can be used by any user, but for system-wide backups
-@@ -6728,18 +6673,18 @@ When you are first setting up your backups, you will probably
- also want to run it from the command line once or twice to get
- a feel for what it's doing.
- 
--Here is an example crontab entry, assuming that backup levels B<hourly>,
--B<daily>, B<weekly> and B<monthly> have been defined in B</etc/rsnapshot.conf>
-+Here is an example crontab entry, assuming that backup levels B<alpha>,
-+B<beta>, B<gamma> and B<delta> have been defined in B</etc/rsnapshot.conf>
- 
- =over 4
- 
--B<0 */4 * * *         /usr/local/bin/rsnapshot hourly>
-+B<0 */4 * * *         /usr/local/bin/rsnapshot alpha>
- 
--B<50 23 * * *         /usr/local/bin/rsnapshot daily>
-+B<50 23 * * *         /usr/local/bin/rsnapshot beta>
- 
--B<40 23 * * 6         /usr/local/bin/rsnapshot weekly>
-+B<40 23 * * 6         /usr/local/bin/rsnapshot gamma>
- 
--B<30 23 1 * *         /usr/local/bin/rsnapshot monthly>
-+B<30 23 1 * *         /usr/local/bin/rsnapshot delta>
- 
- =back
- 
-@@ -6747,30 +6692,30 @@ This example will do the following:
- 
- =over 4
- 
--6 hourly backups a day (once every 4 hours, at 0,4,8,12,16,20)
-+6 alpha backups a day (once every 4 hours, at 0,4,8,12,16,20)
- 
--1 daily backup every day, at 11:50PM
-+1 beta backup every day, at 11:50PM
- 
--1 weekly backup every week, at 11:40PM, on Saturdays (6th day of week)
-+1 gamma backup every week, at 11:40PM, on Saturdays (6th day of week)
- 
--1 monthly backup every month, at 11:30PM on the 1st day of the month
-+1 delta backup every month, at 11:30PM on the 1st day of the month
- 
- =back
- 
- It is usually a good idea to schedule the larger backup levels to run a bit before the
--lower ones. For example, in the crontab above, notice that "daily" runs 10 minutes
--before "hourly".  The main reason for this is that the daily rotate will
--pull out the oldest hourly and make that the youngest daily (which means
--that the next hourly rotate will not need to delete the oldest hourly),
-+lower ones. For example, in the crontab above, notice that "beta" runs 10 minutes
-+before "alpha".  The main reason for this is that the beta rotate will
-+pull out the oldest alpha and make that the youngest beta (which means
-+that the next alpha rotate will not need to delete the oldest alpha),
- which is more efficient.  A secondary reason is that it is harder to
- predict how long the lowest backup level will take, since it needs to actually
- do an rsync of the source as well as the rotate that all backups do.
- 
--If rsnapshot takes longer than 10 minutes to do the "daily" rotate
--(which usually includes deleting the oldest daily snapshot), then you
-+If rsnapshot takes longer than 10 minutes to do the "beta" rotate
-+(which usually includes deleting the oldest beta snapshot), then you
- should increase the time between the backup levels.
- Otherwise (assuming you have set the B<lockfile> parameter, as is recommended)
--your hourly snapshot will fail sometimes because the daily still has the lock.  
-+your alpha snapshot will fail sometimes because the beta still has the lock.  
- 
- Remember that these are just the times that the program runs.
- To set the number of backups stored, set the B<retain> numbers in
-@@ -6812,11 +6757,11 @@ For example:
- 
- =over 4
- 
--B<rsnapshot diff daily.0 daily.1>
-+B<rsnapshot diff beta.0 beta.1>
- 
--B<rsnapshot diff daily.0/localhost/etc daily.1/localhost/etc>
-+B<rsnapshot diff beta.0/localhost/etc beta.1/localhost/etc>
- 
--B<rsnapshot diff /.snapshots/daily.0 /.snapshots/daily.1>
-+B<rsnapshot diff /.snapshots/beta.0 /.snapshots/beta.1>
- 
- =back
- 
-@@ -6833,13 +6778,13 @@ the lowest, most frequent backup level, and right before. For example:
- 
- =over 4
- 
--B<0 */4 * * *         /usr/local/bin/rsnapshot sync && /usr/local/bin/rsnapshot hourly>
-+B<0 */4 * * *         /usr/local/bin/rsnapshot sync && /usr/local/bin/rsnapshot alpha>
- 
--B<50 23 * * *         /usr/local/bin/rsnapshot daily>
-+B<50 23 * * *         /usr/local/bin/rsnapshot beta>
- 
--B<40 23 1,8,15,22 * * /usr/local/bin/rsnapshot weekly>
-+B<40 23 1,8,15,22 * * /usr/local/bin/rsnapshot gamma>
- 
--B<30 23 1 * *         /usr/local/bin/rsnapshot monthly>
-+B<30 23 1 * *         /usr/local/bin/rsnapshot delta>
- 
- =back
- 
-@@ -6990,17 +6935,17 @@ you will need to go into the <snapshot_root> directory and manually
- remove the files from the smallest backup level's ".0" directory.
- 
- For example, if you were previously backing up /home/ with a destination
--of localhost/, and hourly is your smallest backup level, you would need to do
-+of localhost/, and alpha is your smallest backup level, you would need to do
- the following to reclaim that disk space:
- 
- =over 4
- 
--rm -rf <snapshot_root>/hourly.0/localhost/home/
-+rm -rf <snapshot_root>/alpha.0/localhost/home/
- 
- =back
- 
- Please note that the other snapshots previously made of /home/ will still
--be using that disk space, but since the files are flushed out of hourly.0/,
-+be using that disk space, but since the files are flushed out of alpha.0/,
- they will no longer be copied to the subsequent directories, and will thus
- be removed in due time as the rotations happen.
- 
-@@ -7020,7 +6965,7 @@ Nathan Rosenquist (B<nathan at rsnapshot.org>)
- =over 4
- 
- =item -
--Primary author and previous maintainer of rsnapshot.
-+Primary author and original maintainer of rsnapshot.
- 
- =back
- 
-@@ -7029,7 +6974,7 @@ David Cantrell (B<david at cantrell.org.uk>)
- =over 4
- 
- =item -
--Current co-maintainer of rsnapshot
-+Previous maintainer of rsnapshot
- 
- =item -
- Wrote the rsnapshot-diff utility
-@@ -7045,7 +6990,7 @@ David Keegel <djk at cybersource.com.au>
- =over 4
- 
- =item -
--Co-maintainer, with responsibility for release management since 1.2.9
-+Current rsnapshot maintainer
- 
- =item -
- Fixed race condition in lock file creation, improved error reporting
-@@ -7267,3 +7212,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
- 
- =cut
- 
-+# more emacs-appeasement
-+######################################################################
-+### Local Variables:
-+### tab-width: 4
-+### End:
-diff --git a/rsnapshot.1 b/rsnapshot.1
-index 4e9a06a..fd2288c 100644
---- a/rsnapshot.1
-+++ b/rsnapshot.1
-@@ -1,4 +1,4 @@
--.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14
-+.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05)
- .\"
- .\" Standard preamble:
- .\" ========================================================================
-@@ -25,11 +25,11 @@
- ..
- .\" Set up some character translations and predefined strings.  \*(-- will
- .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
--.\" double quote, and \*(R" will give a right double quote.  | will give a
--.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
--.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
--.\" expand to `' in nroff, nothing in troff, for use with C<>.
--.tr \(*W-|\(bv\*(Tr
-+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-+.\" nothing in troff, for use with C<>.
-+.tr \(*W-
- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
- .ie n \{\
- .    ds -- \(*W-
-@@ -48,22 +48,25 @@
- .    ds R" ''
- 'br\}
- .\"
-+.\" Escape single quotes in literal strings from groff's Unicode transform.
-+.ie \n(.g .ds Aq \(aq
-+.el       .ds Aq '
-+.\"
- .\" If the F register is turned on, we'll generate index entries on stderr for
- .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
- .\" entries marked with X<> in POD.  Of course, you'll have to process the
- .\" output yourself in some meaningful fashion.
--.if \nF \{\
-+.ie \nF \{\
- .    de IX
- .    tm Index:\\$1\t\\n%\t"\\$2"
- ..
- .    nr % 0
- .    rr F
- .\}
--.\"
--.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
--.\" way too many mistakes in technical documents.
--.hy 0
--.if n .na
-+.el \{\
-+.    de IX
-+..
-+.\}
- .\"
- .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
- .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-@@ -128,8 +131,12 @@
- .rm #[ #] #H #V #F C
- .\" ========================================================================
- .\"
--.IX Title "rsnapshot 1"
--.TH rsnapshot 1 "2008-08-31" "" ""
-+.IX Title "RSNAPSHOT-PROGRAM 1"
-+.TH RSNAPSHOT-PROGRAM 1 "2010-03-17" "perl v5.10.0" "User Contributed Perl Documentation"
-+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-+.\" way too many mistakes in technical documents.
-+.if n .ad l
-+.nh
- .SH "NAME"
- rsnapshot \- remote filesystem snapshot utility
- .SH "SYNOPSIS"
-@@ -275,7 +282,8 @@ rotations).
- .Sp
- .RS 4
- Paths to lvcreate, lvremove, mount and umount commands, for use with Linux
--LVMs.  The lvcreate, lvremove, mount and umount commands are required for
-+LVMs.  You may include options to the commands also. 
-+The lvcreate, lvremove, mount and umount commands are required for
- managing snapshots of \s-1LVM\s0 volumes and are otherwise optional.
- .RE
- .RE
-@@ -284,7 +292,7 @@ managing snapshots of \s-1LVM\s0 volumes and are otherwise optional.
- \&\fBretain\fR             [name]   [number]
- .Sp
- .RS 4
--\&\*(L"name\*(R" refers to the name of this backup level (e.g., hourly, daily,
-+\&\*(L"name\*(R" refers to the name of this backup level (e.g., alpha, beta,
- so also called the 'interval'). \*(L"number\*(R"
- is the number of snapshots for this type of interval that will be retained.
- The value of \*(L"name\*(R" will be the command passed to \fBrsnapshot\fR to perform
-@@ -292,43 +300,43 @@ this type of backup.
- .Sp
- A deprecated alias for 'retain' is 'interval'.
- .Sp
--Example: \fBretain hourly 6\fR
-+Example: \fBretain alpha 6\fR
- .Sp
--[root at localhost]# \fBrsnapshot hourly\fR
-+[root at localhost]# \fBrsnapshot alpha\fR
- .Sp
- For this example, every time this is run, the following will happen:
- .Sp
--<snapshot_root>/hourly.5/ will be deleted, if it exists.
-+<snapshot_root>/alpha.5/ will be deleted, if it exists.
- .Sp
--<snapshot_root>/hourly.{1,2,3,4} will all be rotated +1, if they exist.
-+<snapshot_root>/alpha.{1,2,3,4} will all be rotated +1, if they exist.
- .Sp
--<snapshot_root>/hourly.0/ will be copied to <snapshot_root>/hourly.1/
-+<snapshot_root>/alpha.0/ will be copied to <snapshot_root>/alpha.1/
- using hard links.
- .Sp
- Each backup point (explained below) will then be rsynced to the
--corresponding directories in <snapshot_root>/hourly.0/
-+corresponding directories in <snapshot_root>/alpha.0/
- .Sp
- Backup levels must be specified in the config file in order, from most
- frequent to least frequent. The first entry is the one which will be
--synced with the backup points. The subsequent backup levels (e.g., daily,
--weekly, etc) simply rotate, with each higher backup level pulling from the
-+synced with the backup points. The subsequent backup levels (e.g., beta,
-+gamma, etc) simply rotate, with each higher backup level pulling from the
- one below it for its .0 directory.
- .Sp
- Example:
- .Sp
- .RS 4
--\&\fBretain  hourly 6\fR
-+\&\fBretain  alpha 6\fR
- .Sp
--\&\fBretain  daily  7\fR
-+\&\fBretain  beta  7\fR
- .Sp
--\&\fBretain  weekly 4\fR
-+\&\fBretain  gamma 4\fR
- .RE
- .RE
- .RS 4
- .Sp
--daily.0/ will be copied from hourly.5/, and weekly.0/ will be copied from daily.6/
-+beta.0/ will be copied from alpha.5/, and gamma.0/ will be copied from beta.6/
- .Sp
--hourly.0/ will be rsynced directly from the filesystem.
-+alpha.0/ will be rsynced directly from the filesystem.
- .RE
- .RE
- .RS 4
-@@ -458,25 +466,10 @@ backups, then add \*(L"H\*(R" to this.
- \&\fBrsync_long_args     \-\-delete \-\-numeric\-ids \-\-relative \-\-delete\-excluded\fR
- .Sp
- .RS 4
--List of long arguments to pass to rsync. Beginning with rsnapshot 1.2.0, this
--default has changed. In previous versions, the default values were
--.Sp
--.Vb 1
--\&    --delete --numeric-ids
--.Ve
--.Sp
--Starting with version 1.2.0, the default values are
--.Sp
--.Vb 1
--\&    --delete --numeric-ids --relative --delete-excluded
--.Ve
--.Sp
--This directly affects how the destination paths in your backup points are
--constructed. Depending on what behaviour you want, you can explicitly set
--the values to make the program behave like the old version or the current
--version. The newer settings are recommended if you're just starting. If
--you are upgrading, read the upgrade guide in the \s-1INSTALL\s0 file in the
--source distribution for more information.
-+List of long arguments to pass to rsync.  The default values are
-+    \-\-delete \-\-numeric\-ids \-\-relative \-\-delete\-excluded
-+This means that the directory structure in each backup point destination 
-+will match that in the backup point source.
- .Sp
- Quotes are permitted in rsync_long_args, eg \-\-rsync\-path=\*(L"sudo /usr/bin/rsync\*(R".
- You may use either single (') or double (") quotes, but nested quotes (including
-@@ -552,7 +545,7 @@ disk space. The default is 0 (off).
- .Sp
- The details of how this works have changed in rsnapshot version 1.3.1.
- Originally you could only ever have one .delete directory per backup level.
--Now you can have many, so if your next (eg) hourly backup kicks off while the
-+Now you can have many, so if your next (eg) alpha backup kicks off while the
- previous one is still doing a lazy delete you may temporarily have extra
- _delete directories hanging around.
- .RE
-@@ -586,17 +579,7 @@ Path to the \s-1LVM\s0 Volume Groups.
- \&\fBlinux_lvm_mountpath		/mnt/lvm\-snapshot\fR
- .Sp
- .RS 4
--Mount point to use to temporarily mount the snapshot(s). 
--.RE
--.RE
--.RS 4
--.Sp
--\&\fB\s-1UPGRADE\s0 \s-1NOTICE:\s0\fR
--.Sp
--.RS 4
--If you have used an older version of rsnapshot, you might notice that the
--destination paths on the backup points have changed. Please read the \s-1INSTALL\s0
--file in the source distribution for upgrade options.
-+Mount point to use to temporarily mount the snapshot(s).
- .RE
- .RE
- .RS 4
-@@ -643,6 +626,15 @@ using rsync over ssh
- .RE
- .RS 4
- .Sp
-+\&\fBbackup   example.com:/etc/       example.com/\fR
-+.Sp
-+.RS 4
-+Same thing but let ssh choose the remote username (as specified in
-+~/.ssh/config, otherwise the same as the local username)
-+.RE
-+.RE
-+.RS 4
-+.Sp
- \&\fBbackup   root at example.com:/usr/local/ example.com/\fR
- .Sp
- .RS 4
-@@ -739,168 +731,143 @@ Putting it all together (an example file):
- .Sp
- .Vb 1
- \&    # THIS IS A COMMENT, REMEMBER TABS MUST SEPARATE ALL ELEMENTS
--.Ve
--.Sp
--.Vb 1
-+\&
- \&    config_version  1.2
--.Ve
--.Sp
--.Vb 1
-+\&
- \&    snapshot_root   /.snapshots/
--.Ve
--.Sp
--.Vb 6
-+\&
- \&    cmd_rsync           /usr/bin/rsync
- \&    cmd_ssh             /usr/bin/ssh
- \&    #cmd_cp             /bin/cp
- \&    cmd_rm              /bin/rm
- \&    cmd_logger          /usr/bin/logger
- \&    cmd_du              /usr/bin/du
--.Ve
--.Sp
--.Vb 4
-+\&
- \&    linux_lvm_cmd_lvcreate        /sbin/lvcreate
- \&    linux_lvm_cmd_lvremove        /sbin/lvremove
- \&    linux_lvm_cmd_mount           /bin/mount
- \&    linux_lvm_cmd_umount          /bin/umount
--.Ve
--.Sp
--.Vb 4
-+\&
- \&    linux_lvm_snapshotsize    2G
- \&    linux_lvm_snapshotname    rsnapshot
- \&    linux_lvm_vgpath          /dev
--\&    linux_lvm_mountpath       /mnt/lvm-snapshot
--.Ve
--.Sp
--.Vb 4
--\&    retain              hourly  6
--\&    retain              daily   7
--\&    retain              weekly  7
--\&    retain              monthly 3
--.Ve
--.Sp
--.Vb 3
-+\&    linux_lvm_mountpath       /mnt/lvm\-snapshot
-+\&
-+\&    retain              alpha  6
-+\&    retain              beta   7
-+\&    retain              gamma  7
-+\&    retain              delta 3
-+\&
- \&    backup              /etc/                     localhost/
- \&    backup              /home/                    localhost/
- \&    backup_script       /usr/local/bin/backup_mysql.sh  mysql_backup/
--.Ve
--.Sp
--.Vb 5
-+\&
- \&    backup              root at foo.com:/etc/        foo.com/
- \&    backup              root at foo.com:/home/       foo.com/
- \&    backup              root at mail.foo.com:/home/  mail.foo.com/
- \&    backup              rsync://example.com/pub/  example.com/pub/
--\&    backup              lvm://vg0/xen-home/       lvm-vg0/xen-home/
-+\&    backup              lvm://vg0/xen\-home/       lvm\-vg0/xen\-home/
- .Ve
- .RE
- .RS 4
-+.RE
- .SH "USAGE"
- .IX Header "USAGE"
- \&\fBrsnapshot\fR can be used by any user, but for system-wide backups
- you will probably want to run it as root.
--.Sp
-+.PP
- Since backups usually get neglected if human intervention is
- required, the preferred way is to run it from cron.
--.Sp
-+.PP
- When you are first setting up your backups, you will probably
- also want to run it from the command line once or twice to get
- a feel for what it's doing.
--.Sp
--Here is an example crontab entry, assuming that backup levels \fBhourly\fR,
--\&\fBdaily\fR, \fBweekly\fR and \fBmonthly\fR have been defined in \fB/etc/rsnapshot.conf\fR
-+.PP
-+Here is an example crontab entry, assuming that backup levels \fBalpha\fR,
-+\&\fBbeta\fR, \fBgamma\fR and \fBdelta\fR have been defined in \fB/etc/rsnapshot.conf\fR
- .Sp
- .RS 4
--\&\fB0 */4 * * *         /usr/local/bin/rsnapshot hourly\fR
-+\&\fB0 */4 * * *         /usr/local/bin/rsnapshot alpha\fR
- .Sp
--\&\fB50 23 * * *         /usr/local/bin/rsnapshot daily\fR
-+\&\fB50 23 * * *         /usr/local/bin/rsnapshot beta\fR
- .Sp
--\&\fB40 23 * * 6         /usr/local/bin/rsnapshot weekly\fR
-+\&\fB40 23 * * 6         /usr/local/bin/rsnapshot gamma\fR
- .Sp
--\&\fB30 23 1 * *         /usr/local/bin/rsnapshot monthly\fR
-+\&\fB30 23 1 * *         /usr/local/bin/rsnapshot delta\fR
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- This example will do the following:
- .Sp
- .RS 4
--6 hourly backups a day (once every 4 hours, at 0,4,8,12,16,20)
-+6 alpha backups a day (once every 4 hours, at 0,4,8,12,16,20)
- .Sp
--1 daily backup every day, at 11:50PM
-+1 beta backup every day, at 11:50PM
- .Sp
--1 weekly backup every week, at 11:40PM, on Saturdays (6th day of week)
-+1 gamma backup every week, at 11:40PM, on Saturdays (6th day of week)
- .Sp
--1 monthly backup every month, at 11:30PM on the 1st day of the month
-+1 delta backup every month, at 11:30PM on the 1st day of the month
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- It is usually a good idea to schedule the larger backup levels to run a bit before the
--lower ones. For example, in the crontab above, notice that \*(L"daily\*(R" runs 10 minutes
--before \*(L"hourly\*(R".  The main reason for this is that the daily rotate will
--pull out the oldest hourly and make that the youngest daily (which means
--that the next hourly rotate will not need to delete the oldest hourly),
-+lower ones. For example, in the crontab above, notice that \*(L"beta\*(R" runs 10 minutes
-+before \*(L"alpha\*(R".  The main reason for this is that the beta rotate will
-+pull out the oldest alpha and make that the youngest beta (which means
-+that the next alpha rotate will not need to delete the oldest alpha),
- which is more efficient.  A secondary reason is that it is harder to
- predict how long the lowest backup level will take, since it needs to actually
- do an rsync of the source as well as the rotate that all backups do.
--.Sp
--If rsnapshot takes longer than 10 minutes to do the \*(L"daily\*(R" rotate
--(which usually includes deleting the oldest daily snapshot), then you
-+.PP
-+If rsnapshot takes longer than 10 minutes to do the \*(L"beta\*(R" rotate
-+(which usually includes deleting the oldest beta snapshot), then you
- should increase the time between the backup levels.
- Otherwise (assuming you have set the \fBlockfile\fR parameter, as is recommended)
--your hourly snapshot will fail sometimes because the daily still has the lock.  
--.Sp
-+your alpha snapshot will fail sometimes because the beta still has the lock.
-+.PP
- Remember that these are just the times that the program runs.
- To set the number of backups stored, set the \fBretain\fR numbers in
- \&\fB/etc/rsnapshot.conf\fR
--.Sp
-+.PP
- To check the disk space used by rsnapshot, you can call it with the \*(L"du\*(R" argument.
--.Sp
-+.PP
- For example:
- .Sp
- .RS 4
- \&\fBrsnapshot du\fR
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- This will show you exactly how much disk space is taken up in the snapshot root. This
- feature requires the \s-1UNIX\s0 \fBdu\fR command to be installed on your system, for it to
- support the \*(L"\-csh\*(R" command line arguments, and to be in your path. You can also
- override your path settings and the flags passed to du using the cmd_du and du_args
- parameters.
--.Sp
-+.PP
- It is also possible to pass a relative file path as a second argument, to get a report
- on a particular file or subdirectory.
- .Sp
- .RS 4
- \&\fBrsnapshot du localhost/home/\fR
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- The \s-1GNU\s0 version of \*(L"du\*(R" is preferred. The \s-1BSD\s0 version works well also, but does
- not support the \-h flag (use \-k instead, to see the totals in kilobytes). Other
- versions of \*(L"du\*(R", such as Solaris, may not work at all.
--.Sp
-+.PP
- To check the differences between two directories, call rsnapshot with the \*(L"diff\*(R"
- argument, followed by two backup levels or directory paths.
--.Sp
-+.PP
- For example:
- .Sp
- .RS 4
--\&\fBrsnapshot diff daily.0 daily.1\fR
-+\&\fBrsnapshot diff beta.0 beta.1\fR
- .Sp
--\&\fBrsnapshot diff daily.0/localhost/etc daily.1/localhost/etc\fR
-+\&\fBrsnapshot diff beta.0/localhost/etc beta.1/localhost/etc\fR
- .Sp
--\&\fBrsnapshot diff /.snapshots/daily.0 /.snapshots/daily.1\fR
--.RE
-+\&\fBrsnapshot diff /.snapshots/beta.0 /.snapshots/beta.1\fR
- .RE
--.RS 4
--.Sp
-+.PP
- This will call the rsnapshot-diff program, which will scan both directories
- looking for differences (based on hard links).
--.Sp
-+.PP
- \&\fBrsnapshot sync\fR
- .Sp
- .RS 4
-@@ -909,13 +876,13 @@ argument, followed by the other usual cron entries. The sync should happen as
- the lowest, most frequent backup level, and right before. For example:
- .Sp
- .RS 4
--\&\fB0 */4 * * *         /usr/local/bin/rsnapshot sync && /usr/local/bin/rsnapshot hourly\fR
-+\&\fB0 */4 * * *         /usr/local/bin/rsnapshot sync && /usr/local/bin/rsnapshot alpha\fR
- .Sp
--\&\fB50 23 * * *         /usr/local/bin/rsnapshot daily\fR
-+\&\fB50 23 * * *         /usr/local/bin/rsnapshot beta\fR
- .Sp
--\&\fB40 23 1,8,15,22 * * /usr/local/bin/rsnapshot weekly\fR
-+\&\fB40 23 1,8,15,22 * * /usr/local/bin/rsnapshot gamma\fR
- .Sp
--\&\fB30 23 1 * *         /usr/local/bin/rsnapshot monthly\fR
-+\&\fB30 23 1 * *         /usr/local/bin/rsnapshot delta\fR
- .RE
- .RE
- .RS 4
-@@ -923,9 +890,7 @@ the lowest, most frequent backup level, and right before. For example:
- The sync operation simply runs rsync and all backup scripts. In this scenario, all
- calls simply rotate directories, even the lowest backup level.
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- \&\fBrsnapshot sync [dest]\fR
- .Sp
- .RS 4
-@@ -948,8 +913,6 @@ It will \s-1NOT\s0 get any other backup points with slightly different values (l
- example.com/etc/, for example). In order to sync example.com/etc, you would need to
- run rsnapshot again, using example.com/etc as the optional parameter.
- .RE
--.RE
--.RS 4
- .SH "EXIT VALUES"
- .IX Header "EXIT VALUES"
- .RS 4
-@@ -959,8 +922,6 @@ run rsnapshot again, using example.com/etc as the optional parameter.
- .Sp
- \&\fB2\fR  Some warnings occurred, but the backup still finished
- .RE
--.RE
--.RS 4
- .SH "FILES"
- .IX Header "FILES"
- /etc/rsnapshot.conf
-@@ -973,40 +934,40 @@ Use the \fB\-t\fR flag to see what commands would have been executed. This will
- you the commands rsnapshot would try to run. There are a few minor differences
- (for example, not showing an attempt to remove the lockfile because it wasn't
- really created in the test), but should give you a very good idea what will happen.
--.Sp
-+.PP
- Using the \fB\-v\fR, \fB\-V\fR, and \fB\-D\fR flags will print increasingly more information
- to \s-1STDOUT\s0.
--.Sp
-+.PP
- Make sure you don't have spaces in the config file that you think are actually tabs.
--.Sp
-+.PP
- Much other weird behavior can probably be attributed to plain old file system
- permissions and ssh authentication issues.
- .SH "BUGS"
- .IX Header "BUGS"
- Please report bugs (and other comments) to the rsnapshot-discuss mailing list:
--.Sp
-+.PP
- \&\fBhttp://lists.sourceforge.net/lists/listinfo/rsnapshot\-discuss\fR
- .SH "NOTES"
- .IX Header "NOTES"
- Make sure your /etc/rsnapshot.conf file has all elements separated by tabs.
- See /etc/rsnapshot.conf.default for a working example file.
--.Sp
-+.PP
- Make sure you put a trailing slash on the end of all directory references.
- If you don't, you may have extra directories created in your snapshots.
- For more information on how the trailing slash is handled, see the
- \&\fB\f(BIrsync\fB\|(1)\fR manpage.
--.Sp
-+.PP
- Make sure to make the snapshot directory chmod 700 and owned by root
- (assuming backups are made by the root user). If the snapshot directory
- is readable by other users, they will be able to modify the snapshots
- containing their files, thus destroying the integrity of the snapshots.
--.Sp
-+.PP
- If you would like regular users to be able to restore their own backups,
- there are a number of ways this can be accomplished. One such scenario
- would be:
--.Sp
-+.PP
- Set \fBsnapshot_root\fR to \fB/.private/.snapshots\fR in \fB/etc/rsnapshot.conf\fR
--.Sp
-+.PP
- Set the file permissions on these directories as follows:
- .Sp
- .RS 4
-@@ -1014,15 +975,13 @@ drwx\-\-\-\-\-\-    /.private
- .Sp
- drwxr-xr-x    /.private/.snapshots
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Export the /.private/.snapshots directory over read-only \s-1NFS\s0, a read-only
- Samba share, etc.
--.Sp
-+.PP
- See the rsnapshot \s-1HOWTO\s0 for more information on making backups
- accessible to non-privileged users.
--.Sp
-+.PP
- For ssh to work unattended through cron, you will probably want to use
- public key logins. Create an ssh key with no passphrase for root, and
- install the public key on each machine you want to backup. If you are
-@@ -1032,11 +991,11 @@ on the machine just for backups. Give the user a different name such
- as \*(L"rsnapshot\*(R", but keep the \s-1UID\s0 and \s-1GID\s0 set to 0, to give root
- privileges. However, make logins more restrictive, either through ssh
- configuration, or using an alternate shell.
--.Sp
-+.PP
- \&\s-1BE\s0 \s-1CAREFUL\s0! If the private key is obtained by an attacker, they will
- have free run of all the systems involved. If you are unclear on how
- to do this, see \fB\f(BIssh\fB\|(1)\fR, \fB\f(BIsshd\fB\|(1)\fR, and \fB\f(BIssh\-keygen\fB\|(1)\fR.
--.Sp
-+.PP
- Backup scripts are run as the same user that rsnapshot is running as.
- Typically this is root. Make sure that all of your backup scripts are
- only writable by root, and that they don't call any other programs
-@@ -1044,7 +1003,7 @@ that aren't owned by root. If you fail to do this, anyone who can
- write to the backup script or any program it calls can fully take
- over the machine. Of course, this is not a situation unique to
- rsnapshot.
--.Sp
-+.PP
- By default, rsync transfers are done using the \-\-numeric\-ids option.
- This means that user names and group names are ignored during transfers,
- but the \s-1UID/GID\s0 information is kept intact. The assumption is that the
-@@ -1054,25 +1013,23 @@ be unmanageable. If you are archiving snapshots with \s-1GNU\s0 tar, you may
- want to use the \-\-numeric\-owner parameter. Also, keep a copy of the
- archived system's /etc/passwd and /etc/group files handy for the \s-1UID/GID\s0
- to name mapping.
--.Sp
-+.PP
- If you remove backup points in the config file, the previously archived
- files under those points will permanently stay in the snapshots directory
- unless you remove the files yourself. If you want to conserve disk space,
- you will need to go into the <snapshot_root> directory and manually
- remove the files from the smallest backup level's \*(L".0\*(R" directory.
--.Sp
-+.PP
- For example, if you were previously backing up /home/ with a destination
--of localhost/, and hourly is your smallest backup level, you would need to do
-+of localhost/, and alpha is your smallest backup level, you would need to do
- the following to reclaim that disk space:
- .Sp
- .RS 4
--rm \-rf <snapshot_root>/hourly.0/localhost/home/
--.RE
-+rm \-rf <snapshot_root>/alpha.0/localhost/home/
- .RE
--.RS 4
--.Sp
-+.PP
- Please note that the other snapshots previously made of /home/ will still
--be using that disk space, but since the files are flushed out of hourly.0/,
-+be using that disk space, but since the files are flushed out of alpha.0/,
- they will no longer be copied to the subsequent directories, and will thus
- be removed in due time as the rotations happen.
- .SH "AUTHORS"
-@@ -1080,30 +1037,24 @@ be removed in due time as the rotations happen.
- Mike Rubel \- \fBhttp://www.mikerubel.org/computers/rsync_snapshots/\fR
- .IP "\- Created the original shell scripts on which this project is based" 4
- .IX Item "- Created the original shell scripts on which this project is based"
--.RE
--.RS 4
--.Sp
-+.PP
- Nathan Rosenquist (\fBnathan at rsnapshot.org\fR)
--.IP "\- Primary author and previous maintainer of rsnapshot." 4
--.IX Item "- Primary author and previous maintainer of rsnapshot."
--.RE
--.RS 4
--.Sp
-+.IP "\- Primary author and original maintainer of rsnapshot." 4
-+.IX Item "- Primary author and original maintainer of rsnapshot."
-+.PP
- David Cantrell (\fBdavid at cantrell.org.uk\fR)
--.IP "\- Current co-maintainer of rsnapshot" 4
--.IX Item "- Current co-maintainer of rsnapshot"
-+.IP "\- Previous maintainer of rsnapshot" 4
-+.IX Item "- Previous maintainer of rsnapshot"
- .PD 0
- .IP "\- Wrote the rsnapshot-diff utility" 4
- .IX Item "- Wrote the rsnapshot-diff utility"
- .IP "\- Improved how use_lazy_deletes work so slow deletes don't screw up the next backup at that backup level." 4
- .IX Item "- Improved how use_lazy_deletes work so slow deletes don't screw up the next backup at that backup level."
--.RE
--.RS 4
- .PD
--.Sp
-+.PP
- David Keegel <djk at cybersource.com.au>
--.IP "\- Co\-maintainer, with responsibility for release management since 1.2.9" 4
--.IX Item "- Co-maintainer, with responsibility for release management since 1.2.9"
-+.IP "\- Current rsnapshot maintainer" 4
-+.IX Item "- Current rsnapshot maintainer"
- .PD 0
- .IP "\- Fixed race condition in lock file creation, improved error reporting" 4
- .IX Item "- Fixed race condition in lock file creation, improved error reporting"
-@@ -1112,180 +1063,136 @@ David Keegel <djk at cybersource.com.au>
- .IX Item "- Allowed remote ssh directory paths starting with ~/ as well as /"
- .IP "\- Fixed a number of other bugs and buglets" 4
- .IX Item "- Fixed a number of other bugs and buglets"
--.RE
--.RS 4
- .PD
--.Sp
-+.PP
- Carl Wilhelm Soderstrom \fB(chrome at real\-time.com)\fR
- .IP "\- Created the \s-1RPM\s0 .spec file which allowed the \s-1RPM\s0 package to be built, among other things." 4
- .IX Item "- Created the RPM .spec file which allowed the RPM package to be built, among other things."
--.RE
--.RS 4
--.Sp
-+.PP
- Ted Zlatanov (\fBtzz at lifelogs.com\fR)
- .IP "\- Added the one_fs feature, autoconf support, good advice, and much more." 4
- .IX Item "- Added the one_fs feature, autoconf support, good advice, and much more."
--.RE
--.RS 4
--.Sp
-+.PP
- Ralf van Dooren (\fBr.vdooren at snow.nl\fR)
- .IP "\- Added and maintains the rsnapshot entry in the FreeBSD ports tree." 4
- .IX Item "- Added and maintains the rsnapshot entry in the FreeBSD ports tree."
--.RE
--.RS 4
--.Sp
-+.PP
- SlapAyoda
- .IP "\- Provided access to his computer museum for software testing." 4
- .IX Item "- Provided access to his computer museum for software testing."
--.RE
--.RS 4
--.Sp
-+.PP
- Carl Boe (\fBboe at demog.berkeley.edu\fR)
- .IP "\- Found several subtle bugs and provided fixes for them." 4
- .IX Item "- Found several subtle bugs and provided fixes for them."
--.RE
--.RS 4
--.Sp
-+.PP
- Shane Leibling (\fBshane at cryptio.net\fR)
- .IP "\- Fixed a compatibility bug in utils/backup_smb_share.sh" 4
- .IX Item "- Fixed a compatibility bug in utils/backup_smb_share.sh"
--.RE
--.RS 4
--.Sp
-+.PP
- Christoph Wegscheider (\fBchristoph.wegscheider at wegi.net\fR)
- .IP "\- Added (and previously maintained) the Debian rsnapshot package." 4
- .IX Item "- Added (and previously maintained) the Debian rsnapshot package."
--.RE
--.RS 4
--.Sp
-+.PP
- Bharat Mediratta (\fBbharat at menalto.com\fR)
- .IP "\- Improved the exclusion rules to avoid backing up the snapshot root (among other things)." 4
- .IX Item "- Improved the exclusion rules to avoid backing up the snapshot root (among other things)."
--.RE
--.RS 4
--.Sp
-+.PP
- Peter Palfrader (\fBweasel at debian.org\fR)
- .IP "\- Enhanced error reporting to include command line options." 4
- .IX Item "- Enhanced error reporting to include command line options."
--.RE
--.RS 4
--.Sp
-+.PP
- Nicolas Kaiser (\fBnikai at nikai.net\fR)
- .IP "\- Fixed typos in program and man page" 4
- .IX Item "- Fixed typos in program and man page"
--.RE
--.RS 4
--.Sp
-+.PP
- Chris Petersen \- (\fBhttp://www.forevermore.net/\fR)
- .Sp
- .RS 4
- Added cwrsync permanent-share support
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Robert Jackson (\fBRobertJ at promedicalinc.com\fR)
- .Sp
- .RS 4
- Added use_lazy_deletes feature
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Justin Grote (\fBjustin at grote.name\fR)
- .Sp
- .RS 4
- Improved rsync error reporting code
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Anthony Ettinger (\fBapwebdesign at yahoo.com\fR)
- .Sp
- .RS 4
- Wrote the utils/mysqlbackup.pl script
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Sherman Boyd
- .Sp
- .RS 4
- Wrote utils/random_file_verify.sh script
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- William Bear (\fBbear at umn.edu\fR)
- .Sp
- .RS 4
- Wrote the utils/rsnapreport.pl script (pretty summary of rsync stats)
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Eric Anderson (\fBanderson at centtech.com\fR)
- .Sp
- .RS 4
- Improvements to utils/rsnapreport.pl.
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Alan Batie (\fBalan at batie.org\fR)
- .Sp
- .RS 4
- Bug fixes for include_conf
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Dieter Bloms (\fBdieter at bloms.de\fR)
- .Sp
- .RS 4
- Multi-line configuration options
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Henning Moll (\fBnewsScott at gmx.de\fR)
- .Sp
- .RS 4
- stop_on_stale_lockfile
- .RE
--.RE
--.RS 4
--.Sp
-+.PP
- Ben Low (\fBben at bdlow.net\fR)
- .Sp
- .RS 4
- Linux \s-1LVM\s0 snapshot support
- .RE
--.RE
--.RS 4
- .SH "COPYRIGHT"
- .IX Header "COPYRIGHT"
- Copyright (C) 2003\-2005 Nathan Rosenquist
--.Sp
-+.PP
- Portions Copyright (C) 2002\-2007 Mike Rubel, Carl Wilhelm Soderstrom,
- Ted Zlatanov, Carl Boe, Shane Liebling, Bharat Mediratta, Peter Palfrader,
- Nicolas Kaiser, David Cantrell, Chris Petersen, Robert Jackson, Justin Grote,
- David Keegel, Alan Batie, Dieter Bloms, Henning Moll, Ben Low, Anthony
- Ettinger
--.Sp
-+.PP
- This man page is distributed under the same license as rsnapshot:
- the \s-1GPL\s0 (see below).
--.Sp
-+.PP
- This program is free software; you can redistribute it and/or modify
- it under the terms of the \s-1GNU\s0 General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
--.Sp
-+.PP
- This program is distributed in the hope that it will be useful,
- but \s-1WITHOUT\s0 \s-1ANY\s0 \s-1WARRANTY\s0; without even the implied warranty of
- \&\s-1MERCHANTABILITY\s0 or \s-1FITNESS\s0 \s-1FOR\s0 A \s-1PARTICULAR\s0 \s-1PURPOSE\s0.  See the
- \&\s-1GNU\s0 General Public License for more details.
--.Sp
-+.PP
- You should have received a copy of the \s-1GNU\s0 General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, \s-1MA\s0  02110\-1301 \s-1USA\s0
-diff --git a/rsnapshot.conf.default.in b/rsnapshot.conf.default.in
-index c2d86bf..2379763 100644
---- a/rsnapshot.conf.default.in
-+++ b/rsnapshot.conf.default.in
-@@ -2,14 +2,10 @@
- # rsnapshot.conf - rsnapshot configuration file #
- #################################################
- #                                               #
--# PLEASE BE AWARE OF THE FOLLOWING RULES:       #
-+# PLEASE BE AWARE OF THE FOLLOWING RULE:        #
- #                                               #
- # This file requires tabs between elements      #
- #                                               #
--# Directories require a trailing slash:         #
--#   right: /home/                               #
--#   wrong: /home                                #
--#                                               #
- #################################################
- 
- #######################
-@@ -81,15 +77,15 @@ snapshot_root	/.snapshots/
- #cmd_postexec	/path/to/postexec/script
- 
- #########################################
--#           BACKUP INTERVALS            #
-+#     BACKUP LEVELS / INTERVALS         #
- # Must be unique and in ascending order #
--# i.e. hourly, daily, weekly, etc.      #
-+# e.g. alpha, beta, gamma, etc.         #
- #########################################
- 
--interval	hourly	6
--interval	daily	7
--interval	weekly	4
--#interval	monthly	3
-+retain	alpha	6
-+retain	beta	7
-+retain	gamma	4
-+#retain	delta	3
- 
- ############################################
- #              GLOBAL OPTIONS              #
-@@ -160,7 +156,7 @@ lockfile	/var/run/rsnapshot.pid
- #include_file	/path/to/include/file
- #exclude_file	/path/to/exclude/file
- 
--# If your version of rsync supports --link-dest, consider enable this.
-+# If your version of rsync supports --link-dest, consider enabling this.
- # This is the best way to support special files (FIFOs, etc) cross-platform.
- # The default is 0 (off).
- #
-@@ -168,7 +164,7 @@ lockfile	/var/run/rsnapshot.pid
- 
- # When sync_first is enabled, it changes the default behaviour of rsnapshot.
- # Normally, when rsnapshot is called with its lowest interval
--# (i.e.: "rsnapshot hourly"), it will sync files AND rotate the lowest
-+# (i.e.: "rsnapshot alpha"), it will sync files AND rotate the lowest
- # intervals. With sync_first enabled, "rsnapshot sync" handles the file sync,
- # and all interval calls simply rotate files. See the man page for more
- # details. The default is 0 (off).
-@@ -182,9 +178,9 @@ lockfile	/var/run/rsnapshot.pid
- #use_lazy_deletes	0
- 
- # Number of rsync re-tries. If you experience any network problems or
--# network card issues that tend to cause ssh to crap-out with
--# "Corrupted MAC on input" errors, for example, set this to a non-zero
--# value to have the rsync operation re-tried
-+# network card issues that tend to cause ssh to fail with errors like
-+# "Corrupted MAC on input", for example, set this to a non-zero value
-+# to have the rsync operation re-tried.
- #
- #rsync_numtries 0
- 
-@@ -208,7 +204,7 @@ backup	/usr/local/	localhost/
- #backup	root at example.com:/etc/	example.com/	exclude=mtab,exclude=core
- #backup_script	ssh root at example.com "mysqldump -A > /var/db/dump/mysql.sql"	unused2
- #backup	root at example.com:/var/db/dump/	example.com/
--#backup_script	/bin/date	"+ backup of example.com ended at %c"	unused9
-+#backup_script	/bin/date "+ backup of example.com ended at %c"	unused9
- 
- # CVS.SOURCEFORGE.NET
- #backup_script	/usr/local/bin/backup_rsnapshot_cvsroot.sh	rsnapshot.cvs.sourceforge.net/
-diff --git a/t/link-dest_-t_when_only_one_snapshot.t.in b/t/link-dest_-t_when_only_one_snapshot.t.in
-new file mode 100644
-index 0000000..43a8332
---- /dev/null
-+++ b/t/link-dest_-t_when_only_one_snapshot.t.in
-@@ -0,0 +1,28 @@
-+#!/usr/bin/perl -w
-+
-+use strict;
-+use Test::More tests => 5;
-+
-+my $snap_root="t/support/snapshots/link-dest_t";
-+
-+# Make sure snap_root directory does not exist before we start 
-+ok(! -d "$snap_root" || ! `rm -rf "$snap_root"`,
-+	" snapshot root does not exist before testing starts");
-+
-+ok(! `@PERL@ ./rsnapshot -c t/support/etc/link-dest_-t_when_only_one_snapshot.conf daily`,
-+	" first rsnapshot ran");
-+
-+ok(-d "$snap_root/daily.0" && ! -d "$snap_root/daily.1",
-+	" daily.0 exists but daily.1 does not");
-+
-+my $output=`@PERL@ ./rsnapshot -c t/support/etc/link-dest_-t_when_only_one_snapshot.conf -t daily`;
-+
-+open(TMP,">>/tmp/test_output");
-+print TMP "output=$output\n";
-+close(TMP);
-+
-+ok($output =~ / --link-dest=/,
-+	" link-dest is used");
-+
-+ok(! `rm -rf "$snap_root"`,
-+	" Removed snapshot root to clean up");
-diff --git a/t/snapshot_root_with_space.t.in b/t/snapshot_root_with_space.t.in
-new file mode 100644
-index 0000000..7178dbf
---- /dev/null
-+++ b/t/snapshot_root_with_space.t.in
-@@ -0,0 +1,20 @@
-+#!/usr/bin/perl -w
-+
-+use strict;
-+use Test::More tests => 5;
-+
-+my $snap_root="t/support/snapshot root";
-+
-+# Make sure snap_root directory does not exist before we start 
-+ok(! -d "$snap_root" || ! `rm -rf "$snap_root"`,
-+	" snapshot root does not exist before testing starts");
-+
-+ok(! `@PERL@ ./rsnapshot -c t/support/etc/snapshot_root_with_space.conf hourly`,
-+	" first rsnapshot ran");
-+ok(! `@PERL@ ./rsnapshot -c t/support/etc/snapshot_root_with_space.conf hourly`,
-+	" second rsnapshot ran");
-+ok(-d "$snap_root/hourly.0" && -d "$snap_root/hourly.1",
-+	" hourly.0 and hourly.1 directories exist afterward");
-+
-+ok(! `rm -rf "$snap_root"`,
-+	" Removed snapshot root to clean up");
-diff --git a/t/support/etc/link-dest_-t_when_only_one_snapshot.conf.in b/t/support/etc/link-dest_-t_when_only_one_snapshot.conf.in
-new file mode 100644
-index 0000000..35f2500
---- /dev/null
-+++ b/t/support/etc/link-dest_-t_when_only_one_snapshot.conf.in
-@@ -0,0 +1,6 @@
-+config_version	1.2
-+snapshot_root	@CWD@/t/support/snapshots/link-dest_t
-+cmd_rsync	@RSYNC@
-+link_dest	1
-+interval	daily	7
-+backup	@CWD@/t/support/etc/link-dest_-t_when_only_one_snapshot.conf	link_dest
-diff --git a/t/support/etc/snapshot_root_with_space.conf.in b/t/support/etc/snapshot_root_with_space.conf.in
-new file mode 100644
-index 0000000..d464ae9
---- /dev/null
-+++ b/t/support/etc/snapshot_root_with_space.conf.in
-@@ -0,0 +1,5 @@
-+config_version	1.2
-+snapshot_root	@CWD@/t/support/snapshot root/
-+cmd_rsync		@RSYNC@
-+interval		hourly	6
-+backup			@CWD@/t/support/etc/snapshot_root_with_space.conf	localhost/
-diff --git a/utils/rsnapshot-copy b/utils/rsnapshot-copy
-index be9801e..2c10f3d 100644
---- a/utils/rsnapshot-copy
-+++ b/utils/rsnapshot-copy
-@@ -62,7 +62,7 @@ dest="${@: -1:1}"
- do_cmd rsync "${rsync_opts[@]}" --exclude=* "$src/" "$dest/"
- 
- # Obtain a list of snapshot names in newest to oldest order.
--# List the src -> filter to `2008/04/09T17:59:43 hourly.0' format
-+# List the src -> filter to `2008/04/09T17:59:43 alpha.0' format
- # -> sort newest to oldest -> read each line, ignoring the time.
- rsync "${rsync_opts[@]}" --list-only --no-r -d --no-l "$src/" \
- 	| sed -nre 's,^d[^ ]+ +[^ ]+ (..../../..) (..:..:..) (.*\.[0-9]+)$,\1T\2 \3,p' \
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/rsnapshot.git/commitdiff/08a4c9ffa148ed07e370a53904cbddd34c952f0e



More information about the pld-cvs-commit mailing list