diff options
author | bescoto <bescoto@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109> | 2005-12-16 20:25:58 +0000 |
---|---|---|
committer | bescoto <bescoto@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109> | 2005-12-16 20:25:58 +0000 |
commit | de66d93df7e024b160116409dedea240056818b5 (patch) | |
tree | 6f807c94a1f29dcc0878f4dd6d4f7e83b09ef7e7 /rdiff-backup/rdiff_backup/metadata.py | |
parent | 895779c70dd4f6dd4c8d13b286540a4d5896b97f (diff) | |
download | rdiff-backup-de66d93df7e024b160116409dedea240056818b5.tar.gz |
Don't gzip 0 length files
git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup/trunk@712 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
Diffstat (limited to 'rdiff-backup/rdiff_backup/metadata.py')
-rw-r--r-- | rdiff-backup/rdiff_backup/metadata.py | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/rdiff-backup/rdiff_backup/metadata.py b/rdiff-backup/rdiff_backup/metadata.py index bf7cb94..cb8ef41 100644 --- a/rdiff-backup/rdiff_backup/metadata.py +++ b/rdiff-backup/rdiff_backup/metadata.py @@ -355,19 +355,33 @@ class FlatFile: _extractor = FlatExtractor # Override to class that iterates objects _object_to_record = None # Set to function converting object to record _prefix = None # Set to required prefix - def __init__(self, rp, mode, check_path = 1, compress = 1): - """Open rp for reading ('r') or writing ('w')""" - self.rp = rp + def __init__(self, rp_base, mode, check_path = 1, compress = 1, + callback = None): + """Open rp (or rp+'.gz') for reading ('r') or writing ('w') + + If callback is available, it will be called on the rp upon + closing (because the rp may not be known in advance). + + """ self.mode = mode + self.callback = callback self._record_buffer = [] if check_path: - assert rp.isincfile() and rp.getincbase_str() == self._prefix, rp - compress = rp.isinccompressed() + assert (rp_base.isincfile() and + rp_base.getincbase_str() == self._prefix), rp_base + compress = 1 if mode == 'r': + self.rp = rp_base self.fileobj = self.rp.open("rb", compress) else: - assert mode == 'w' and not self.rp.lstat(), (mode, rp) - self.fileobj = self.rp.open("wb", compress) + assert mode == 'w' + if compress and not rp_base.isinccompressed(): + def callback(rp): self.rp = rp + self.fileobj = rpath.MaybeGzip(rp_base, callback) + else: + self.rp = rp_base + assert not self.rp.lstat(), self.rp + self.fileobj = self.rp.open("wb", compress = compress) def write_record(self, record): """Write a (text) record into the file""" @@ -398,12 +412,11 @@ class FlatFile: if self._buffering_on and self._record_buffer: self.fileobj.write("".join(self._record_buffer)) self._record_buffer = [] - try: fileno = self.fileobj.fileno() # will not work if GzipFile - except AttributeError: fileno = self.fileobj.fileobj.fileno() - os.fsync(fileno) result = self.fileobj.close() self.fileobj = None + self.rp.fsync_with_dir() self.rp.setdata() + if self.callback: self.callback(self.rp) return result class MetadataFile(FlatFile): @@ -449,6 +462,7 @@ class Manager: def add_incrp(self, rp): """Add rp to list of inc rps in the rbdir""" + assert rp.isincfile(), rp self.rplist.append(rp) time = rp.getinctime() if self.timerpmap.has_key(time): @@ -508,12 +522,11 @@ class Manager: """Used in the get_xx_writer functions, returns a writer class""" if time is None: timestr = Time.curtimestr else: timestr = Time.timetostring(time) - filename = '%s.%s.%s.gz' % (prefix, timestr, typestr) + filename = '%s.%s.%s' % (prefix, timestr, typestr) rp = Globals.rbdir.append(filename) assert not rp.lstat(), "File %s already exists!" % (rp.path,) assert rp.isincfile() - self.add_incrp(rp) - return flatfileclass(rp, 'w') + return flatfileclass(rp, 'w', callback = self.add_incrp) def get_meta_writer(self, typestr, time): """Return MetadataFile object opened for writing at given time""" |