tag 558035 +patch thanks
I am attaching 03_fix_hardlinks.dpatch Simply copy it into debian/patches, add the file name to debian/patches/00list, raise version in changelog and build a new package. Please keep in mind that upstream for rdiff-backup is dead [1], so don't wait forever until a new release happens to apply this on Debian please. Thanks [1] http://lists.nongnu.org/archive/html/rdiff-backup-users/2011-11/msg00006.html -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Carlos Alberto Lopez Perez http://neutrino.es Igalia - Free Software Engineering http://www.igalia.com ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#! /bin/sh /usr/share/dpatch/dpatch-run ## fix_hardlinks.dpatch by <clo...@igalia.com> ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: Apply hard-links bug fix patch ## DP: https://savannah.nongnu.org/bugs/index.php?26848 @DPATCH@ diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' rdiff-backup-1.2.8~/rdiff_backup/Hardlink.py rdiff-backup-1.2.8/rdiff_backup/Hardlink.py --- rdiff-backup-1.2.8~/rdiff_backup/Hardlink.py 2009-03-16 14:36:21.000000000 +0000 +++ rdiff-backup-1.2.8/rdiff_backup/Hardlink.py 2012-01-03 11:44:21.708987145 +0000 @@ -95,7 +95,13 @@ src_rorp.getnumlinks() == dest_rorp.getnumlinks() == 1): return 1 # Hard links don't apply - if src_rorp.getnumlinks() < dest_rorp.getnumlinks(): return 0 + """The sha1 of linked files is only stored in the metadata of the first + linked file on the dest side. If the first linked file on the src side is + deleted, then the sha1 will also be deleted on the dest side, so we test for this + & report not equal so that another sha1 will be stored with the next linked + file on the dest side""" + if (not islinked(src_rorp) and not dest_rorp.has_sha1()): return 0 + if src_rorp.getnumlinks() != dest_rorp.getnumlinks(): return 0 src_key = get_inode_key(src_rorp) index, remaining, dest_key, digest = _inode_index[src_key] if dest_key == "NA": diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' rdiff-backup-1.2.8~/rdiff_backup/compare.py rdiff-backup-1.2.8/rdiff_backup/compare.py --- rdiff-backup-1.2.8~/rdiff_backup/compare.py 2009-03-16 14:36:21.000000000 +0000 +++ rdiff-backup-1.2.8/rdiff_backup/compare.py 2012-01-03 11:43:33.792989189 +0000 @@ -25,7 +25,7 @@ """ from __future__ import generators -import Globals, restore, rorpiter, log, backup, static, rpath, hash, robust +import Globals, restore, rorpiter, log, backup, static, rpath, hash, robust, Hardlink def Compare(src_rp, mirror_rp, inc_rp, compare_time): """Compares metadata in src_rp dir with metadata in mirror_rp at time""" @@ -80,14 +80,15 @@ bad_files = 0 for repo_rorp in repo_iter: if not repo_rorp.isreg(): continue - if not repo_rorp.has_sha1(): + verify_sha1 = get_hash(repo_rorp) + if not verify_sha1: log.Log("Warning: Cannot find SHA1 digest for file %s,\n" "perhaps because this feature was added in v1.1.1" % (repo_rorp.get_indexpath(),), 2) continue fp = RepoSide.rf_cache.get_fp(base_index + repo_rorp.index, repo_rorp) computed_hash = hash.compute_sha1_fp(fp) - if computed_hash == repo_rorp.get_sha1(): + if computed_hash == verify_sha1: log.Log("Verified SHA1 digest of " + repo_rorp.get_indexpath(), 5) else: bad_files += 1 @@ -95,11 +96,24 @@ "doesn't match recorded digest of\n %s\n" "Your backup repository may be corrupted!" % (repo_rorp.get_indexpath(), computed_hash, - repo_rorp.get_sha1()), 2) + verify_sha1), 2) RepoSide.close_rf_cache() if not bad_files: log.Log("Every file verified successfully.", 3) return bad_files +def get_hash (repo_rorp): + """ Try to get a sha1 digest from the repository. If hardlinks + are saved in the metadata, get the sha1 from the first hardlink """ + Hardlink.add_rorp(repo_rorp) + if Hardlink.islinked(repo_rorp): + verify_sha1 = Hardlink.get_sha1(repo_rorp) + elif repo_rorp.has_sha1(): + verify_sha1 = repo_rorp.get_sha1() + else: + verify_sha1 = None + Hardlink.del_rorp(repo_rorp) + return verify_sha1 + def print_reports(report_iter): """Given an iter of CompareReport objects, print them to screen""" assert not Globals.server @@ -199,12 +213,13 @@ """Like above, but also compare sha1 sums of any regular files""" def hashes_changed(src_rp, mir_rorp): """Return 0 if their data hashes same, 1 otherwise""" - if not mir_rorp.has_sha1(): + verify_sha1 = get_hash(mir_rorp) + if not verify_sha1: log.Log("Warning: Metadata file has no digest for %s, " "unable to compare." % (mir_rorp.get_indexpath(),), 2) return 0 elif (src_rp.getsize() == mir_rorp.getsize() and - hash.compute_sha1(src_rp) == mir_rorp.get_sha1()): + hash.compute_sha1(src_rp) == verify_sha1): return 0 return 1
signature.asc
Description: OpenPGP digital signature