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
 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to