summaryrefslogtreecommitdiff
path: root/obnam
diff options
context:
space:
mode:
Diffstat (limited to 'obnam')
-rw-r--r--obnam/app.py49
1 files changed, 39 insertions, 10 deletions
diff --git a/obnam/app.py b/obnam/app.py
index 660cb05b..0b301847 100644
--- a/obnam/app.py
+++ b/obnam/app.py
@@ -43,6 +43,7 @@ class Application:
self._filelist = None
self._prev_gen = None
self._store = obnam.Store(self._context)
+ self._total = 0
# When we traverse the file system tree while making a backup,
# we process children before the parent. This is necessary for
@@ -134,7 +135,7 @@ class Application:
return False
return True
- def filegroup_is_unchanged(self, dirname, fg, filenames, stat=os.stat):
+ def filegroup_is_unchanged(self, dirname, fg, filenames, stat=os.lstat):
"""Is a filegroup unchanged from the previous generation?
Given a filegroup and a list of files in the given directory,
@@ -142,7 +143,7 @@ class Application:
the previous generation.
The optional stat argument can be used by unit tests to
- override the use of os.stat.
+ override the use of os.lstat.
"""
@@ -182,6 +183,7 @@ class Application:
"""
+ logging.debug("Setting previous generation FILELIST.")
self._filelist = filelist
def get_previous_generation(self):
@@ -215,6 +217,7 @@ class Application:
"""
+ logging.debug("Computing rsync signature for %s" % filename)
sigdata = obnam.rsync.compute_signature(self._context, filename)
id = obnam.obj.object_id_new()
sig = obnam.obj.SignatureObject(id=id, sigdata=sigdata)
@@ -222,7 +225,7 @@ class Application:
return sig
def find_unchanged_filegroups(self, dirname, filegroups, filenames,
- stat=os.stat):
+ stat=os.lstat):
"""Return list of filegroups that are unchanged.
The filenames and stat arguments have the same meaning as
@@ -236,21 +239,34 @@ class Application:
if self.filegroup_is_unchanged(dirname, filegroup, filenames,
stat=stat):
unchanged.append(filegroup)
-
+
+ logging.debug("There are %d unchanged filegroups in %s" %
+ (len(unchanged), dirname))
return unchanged
def get_file_in_previous_generation(self, pathname):
"""Return non-directory file in previous generation, or None."""
- file = self.find_file_by_name(pathname)
- if file:
- return file
+ if self._filelist:
+ logging.debug("Have FILELIST, searching it for %s" % pathname)
+ file = self.find_file_by_name(pathname)
+ if file:
+ logging.debug("Found in prevgen FILELIST: %s" % pathname)
+ return file
+ else:
+ logging.debug("Not found in FILELIST.")
+ else:
+ logging.debug("No FILELIST for previous generation.")
gen = self.get_previous_generation()
if gen:
+ logging.debug("Looking up file in previous gen: %s" % pathname)
return self.get_store().lookup_file(gen, pathname)
else:
+ logging.debug("No previous gen in which to find %s" % pathname)
return None
def _reuse_existing(self, old_file):
+ logging.debug("Re-using existing file contents: %s" %
+ old_file.first_string_by_kind(obnam.cmp.FILENAME))
return (old_file.first_string_by_kind(obnam.cmp.CONTREF),
old_file.first_string_by_kind(obnam.cmp.SIGREF),
old_file.first_string_by_kind(obnam.cmp.DELTAREF))
@@ -267,6 +283,7 @@ class Application:
def _compute_delta(self, old_file, filename):
old_sig_data = self._get_old_sig(old_file)
if old_sig_data:
+ logging.debug("Computing delta for %s" % filename)
old_contref = old_file.first_string_by_kind(obnam.cmp.CONTREF)
old_deltaref = old_file.first_string_by_kind(obnam.cmp.DELTAREF)
deltapart_ids = obnam.rsync.compute_delta(self.get_context(),
@@ -282,9 +299,12 @@ class Application:
return None, sig.get_id(), delta.get_id()
else:
+ logging.debug("Signature for previous version not found for %s" %
+ filename)
return self._backup_new(filename)
def _backup_new(self, filename):
+ logging.debug("Storing new file %s" % filename)
contref = obnam.io.create_file_contents_object(self._context,
filename)
sig = self.compute_signature(filename)
@@ -294,8 +314,9 @@ class Application:
def add_to_filegroup(self, fg, filename):
"""Add a file to a filegroup."""
+ logging.debug("Backing up %s" % filename)
self._context.progress.update_current_action(filename)
- st = os.stat(filename)
+ st = os.lstat(filename)
if stat.S_ISREG(st.st_mode):
unsolved = obnam.io.unsolve(self.get_context(), filename)
old_file = self.get_file_in_previous_generation(unsolved)
@@ -340,11 +361,13 @@ class Application:
"""Return directory in previous generation, or None."""
gen = self.get_previous_generation()
if gen:
+ logging.debug("Looking up in previous generation: %s" % dirname)
return self.get_store().lookup_dir(gen, dirname)
else:
+ logging.debug("No previous generation to search for %s" % dirname)
return None
- def select_files_to_back_up(self, dirname, filenames, stat=os.stat):
+ def select_files_to_back_up(self, dirname, filenames, stat=os.lstat):
"""Select files to backup in a directory, compared to previous gen.
Look up the directory in the previous generation, and see which
@@ -401,7 +424,7 @@ class Application:
dir = obnam.obj.DirObject(id=obnam.obj.object_id_new(),
name=os.path.basename(dirname),
- stat=os.stat(dirname),
+ stat=os.lstat(dirname),
dirrefs=dirrefs,
filegrouprefs=filegrouprefs)
@@ -432,9 +455,11 @@ class Application:
for tuple in obnam.walk.depth_first(resolved, prune=self.prune):
dirname, dirnames, filenames = tuple
+ filenames.sort()
logging.debug("Walked to directory %s" % dirname)
logging.debug(" with dirnames: %s" % dirnames)
logging.debug(" and filenames: %s" % filenames)
+ self.get_context().progress.update_current_action(dirname)
subdirs = subdirs_for_dir.get(dirname, [])
@@ -451,6 +476,9 @@ class Application:
if dirname in subdirs_for_dir:
del subdirs_for_dir[dirname]
+ self._total += 1 + len(filenames)
+ self.get_context().progress.update_total_files(self._total)
+
return root_object
def backup(self, roots):
@@ -458,6 +486,7 @@ class Application:
start = int(time.time())
root_objs = []
+ self._total = 0
for root in roots:
root_objs.append(self.backup_one_root(root))
end = int(time.time())