Commit 4f0c89c5 authored by ben's avatar ben

Added new Select code


git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup@43 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
parent b737962f
...@@ -187,6 +187,7 @@ class DestructiveStepping: ...@@ -187,6 +187,7 @@ class DestructiveStepping:
destination file. destination file.
""" """
return None # this code is for the test suites only, use Select instead
if Globals.exclude_device_files and dsrp.isdev(): return 1 if Globals.exclude_device_files and dsrp.isdev(): return 1
if source: exclude_regexps = Globals.exclude_regexps if source: exclude_regexps = Globals.exclude_regexps
......
#!/usr/bin/env python #!/usr/bin/env python
# #
# rdiff-backup -- Mirror files while keeping incremental changes # rdiff-backup -- Mirror files while keeping incremental changes
# Version 0.7.2 released April 30, 2002 # Version 0.7.2 released April 11, 2002
# Copyright (C) 2001, 2002 Ben Escoto <bescoto@stanford.edu> # Copyright (C) 2001, 2002 Ben Escoto <bescoto@stanford.edu>
# #
# This program is licensed under the GNU General Public License (GPL). # This program is licensed under the GNU General Public License (GPL).
......
...@@ -37,7 +37,7 @@ class HighLevel: ...@@ -37,7 +37,7 @@ class HighLevel:
SourceS.set_session_info(session_info) SourceS.set_session_info(session_info)
DestS.set_session_info(session_info) DestS.set_session_info(session_info)
src_init_dsiter = SourceS.split_initial_dsiter(src_rpath) src_init_dsiter = SourceS.split_initial_dsiter()
dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter) dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter)
diffiter = SourceS.get_diffs_and_finalize(dest_sigiter) diffiter = SourceS.get_diffs_and_finalize(dest_sigiter)
DestS.patch_and_finalize(dest_rpath, diffiter, checkpoint) DestS.patch_and_finalize(dest_rpath, diffiter, checkpoint)
...@@ -53,7 +53,7 @@ class HighLevel: ...@@ -53,7 +53,7 @@ class HighLevel:
SourceS.set_session_info(session_info) SourceS.set_session_info(session_info)
DestS.set_session_info(session_info) DestS.set_session_info(session_info)
if not session_info: dest_rpath.conn.SaveState.touch_last_file() if not session_info: dest_rpath.conn.SaveState.touch_last_file()
src_init_dsiter = SourceS.split_initial_dsiter(src_rpath) src_init_dsiter = SourceS.split_initial_dsiter()
dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter) dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter)
diffiter = SourceS.get_diffs_and_finalize(dest_sigiter) diffiter = SourceS.get_diffs_and_finalize(dest_sigiter)
DestS.patch_increment_and_finalize(dest_rpath, diffiter, inc_rpath) DestS.patch_increment_and_finalize(dest_rpath, diffiter, inc_rpath)
...@@ -85,16 +85,15 @@ class HLSourceStruct: ...@@ -85,16 +85,15 @@ class HLSourceStruct:
def set_session_info(cls, session_info): def set_session_info(cls, session_info):
cls._session_info = session_info cls._session_info = session_info
def iterate_from(cls, rpath): def iterate_from(cls):
"""Supply more aruments to DestructiveStepping.Iterate_from""" """Supply more aruments to DestructiveStepping.Iterate_from"""
if cls._session_info: if cls._session_info is None: Globals.select_source.set_iter()
return DestructiveStepping.Iterate_from(rpath, 1, else: Globals.select_source.set_iter(cls._session_info.last_index)
cls._session_info.last_index) return Globals.select_source
else: return DestructiveStepping.Iterate_from(rpath, 1)
def split_initial_dsiter(cls, rpath): def split_initial_dsiter(cls):
"""Set iterators of all dsrps from rpath, returning one""" """Set iterators of all dsrps from rpath, returning one"""
dsiter = cls.iterate_from(rpath) dsiter = cls.iterate_from()
initial_dsiter1, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2) initial_dsiter1, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2)
return initial_dsiter1 return initial_dsiter1
...@@ -131,17 +130,15 @@ class HLDestinationStruct: ...@@ -131,17 +130,15 @@ class HLDestinationStruct:
def set_session_info(cls, session_info): def set_session_info(cls, session_info):
cls._session_info = session_info cls._session_info = session_info
def iterate_from(cls, rpath): def iterate_from(cls):
"""Supply more arguments to DestructiveStepping.Iterate_from""" """Supply more arguments to DestructiveStepping.Iterate_from"""
if cls._session_info: if cls._session_info is None: Globals.select_mirror.set_iter()
return DestructiveStepping.Iterate_from(rpath, None, else: Globals.select_mirror.set_iter(cls._session_info.last_index)
cls._session_info.last_index) return Globals.select_mirror
else: return DestructiveStepping.Iterate_from(rpath, None)
def split_initial_dsiter(cls, rpath): def split_initial_dsiter(cls):
"""Set initial_dsiters (iteration of all dsrps from rpath)""" """Set initial_dsiters (iteration of all dsrps from rpath)"""
dsiter = cls.iterate_from(rpath) result, cls.initial_dsiter2 = Iter.multiplex(cls.iterate_from(), 2)
result, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2)
return result return result
def get_dissimilar(cls, baserp, src_init_iter, dest_init_iter): def get_dissimilar(cls, baserp, src_init_iter, dest_init_iter):
...@@ -197,7 +194,7 @@ class HLDestinationStruct: ...@@ -197,7 +194,7 @@ class HLDestinationStruct:
def get_sigs(cls, baserp, src_init_iter): def get_sigs(cls, baserp, src_init_iter):
"""Return signatures of all dissimilar files""" """Return signatures of all dissimilar files"""
dest_iters1 = cls.split_initial_dsiter(baserp) dest_iters1 = cls.split_initial_dsiter()
dissimilars = cls.get_dissimilar(baserp, src_init_iter, dest_iters1) dissimilars = cls.get_dissimilar(baserp, src_init_iter, dest_iters1)
return RORPIter.Signatures(dissimilars) return RORPIter.Signatures(dissimilars)
......
...@@ -404,6 +404,9 @@ class RPath(RORPath): ...@@ -404,6 +404,9 @@ class RPath(RORPath):
"bar") for "foo/bar" (no base), and ("local", "bin") for "bar") for "foo/bar" (no base), and ("local", "bin") for
"/usr/local/bin" if the base is "/usr". "/usr/local/bin" if the base is "/usr".
For the root directory "/", the index is empty and the base is
"/".
""" """
self.conn = connection self.conn = connection
self.index = index self.index = index
...@@ -487,9 +490,6 @@ class RPath(RORPath): ...@@ -487,9 +490,6 @@ class RPath(RORPath):
def _getdevnums(self): def _getdevnums(self):
"""Return tuple for special file (major, minor)""" """Return tuple for special file (major, minor)"""
if Globals.exclude_device_files:
# No point in finding numbers because it will be excluded anyway
return ()
s = self.conn.reval("lambda path: os.lstat(path).st_rdev", self.path) s = self.conn.reval("lambda path: os.lstat(path).st_rdev", self.path)
return (s >> 8, s & 0xff) return (s >> 8, s & 0xff)
...@@ -596,10 +596,9 @@ class RPath(RORPath): ...@@ -596,10 +596,9 @@ class RPath(RORPath):
def helper(dsrp, base_init_output, branch_reduction): def helper(dsrp, base_init_output, branch_reduction):
if dsrp.isdir(): dsrp.rmdir() if dsrp.isdir(): dsrp.rmdir()
else: dsrp.delete() else: dsrp.delete()
dsiter = DestructiveStepping.Iterate_from(self, None)
itm = IterTreeReducer(lambda x: None, lambda x,y: None, None, itm = IterTreeReducer(lambda x: None, lambda x,y: None, None,
helper) helper)
for dsrp in dsiter: itm(dsrp) for dsrp in Select(self, None).set_iter(): itm(dsrp)
itm.getresult() itm.getresult()
else: self.conn.os.unlink(self.path) else: self.conn.os.unlink(self.path)
self.setdata() self.setdata()
......
...@@ -187,6 +187,7 @@ class DestructiveStepping: ...@@ -187,6 +187,7 @@ class DestructiveStepping:
destination file. destination file.
""" """
return None # this code is for the test suites only, use Select instead
if Globals.exclude_device_files and dsrp.isdev(): return 1 if Globals.exclude_device_files and dsrp.isdev(): return 1
if source: exclude_regexps = Globals.exclude_regexps if source: exclude_regexps = Globals.exclude_regexps
......
...@@ -123,8 +123,8 @@ class Globals: ...@@ -123,8 +123,8 @@ class Globals:
# case-insensitive regular expression won't be compressed (applies # case-insensitive regular expression won't be compressed (applies
# to .snapshots and .diffs). The second below will be the # to .snapshots and .diffs). The second below will be the
# compiled version of the first. # compiled version of the first.
no_compression_regexp_string = ".*\\.(gz|z|bz|bz2|tgz|zip|rpm|deb|" \ no_compression_regexp_string = "(?i).*\\.(gz|z|bz|bz2|tgz|zip|rpm|deb|" \
"jpg|gif|png|mp3|ogg|avi|wmv|mpeg|mpg|rm|mov)$" "jpg|gif|png|jp2|mp3|ogg|avi|wmv|mpeg|mpg|rm|mov)$"
no_compression_regexp = None no_compression_regexp = None
# On the reader and writer connections, the following will be # On the reader and writer connections, the following will be
...@@ -183,9 +183,9 @@ class Globals: ...@@ -183,9 +183,9 @@ class Globals:
def set_select(cls, source, dsrpath, tuplelist): def set_select(cls, source, dsrpath, tuplelist):
"""Initialize select object using tuplelist""" """Initialize select object using tuplelist"""
if source: if source:
cls.select_source = Select(dsrpath) cls.select_source = Select(dsrpath, 1)
cls.select_source.ParseArgs(tuplelist) cls.select_source.ParseArgs(tuplelist)
else: else:
cls.select_mirror = Select(dsrpath) cls.select_mirror = Select(dsrpath, None)
cls.select_mirror.ParseArgs(tuplelist) cls.select_mirror.ParseArgs(tuplelist)
set_select = classmethod(set_select) set_select = classmethod(set_select)
#!/usr/bin/env python #!/usr/bin/env python
# #
# rdiff-backup -- Mirror files while keeping incremental changes # rdiff-backup -- Mirror files while keeping incremental changes
# Version 0.7.2 released April 30, 2002 # Version 0.7.2 released April 11, 2002
# Copyright (C) 2001, 2002 Ben Escoto <bescoto@stanford.edu> # Copyright (C) 2001, 2002 Ben Escoto <bescoto@stanford.edu>
# #
# This program is licensed under the GNU General Public License (GPL). # This program is licensed under the GNU General Public License (GPL).
......
...@@ -37,7 +37,7 @@ class HighLevel: ...@@ -37,7 +37,7 @@ class HighLevel:
SourceS.set_session_info(session_info) SourceS.set_session_info(session_info)
DestS.set_session_info(session_info) DestS.set_session_info(session_info)
src_init_dsiter = SourceS.split_initial_dsiter(src_rpath) src_init_dsiter = SourceS.split_initial_dsiter()
dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter) dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter)
diffiter = SourceS.get_diffs_and_finalize(dest_sigiter) diffiter = SourceS.get_diffs_and_finalize(dest_sigiter)
DestS.patch_and_finalize(dest_rpath, diffiter, checkpoint) DestS.patch_and_finalize(dest_rpath, diffiter, checkpoint)
...@@ -53,7 +53,7 @@ class HighLevel: ...@@ -53,7 +53,7 @@ class HighLevel:
SourceS.set_session_info(session_info) SourceS.set_session_info(session_info)
DestS.set_session_info(session_info) DestS.set_session_info(session_info)
if not session_info: dest_rpath.conn.SaveState.touch_last_file() if not session_info: dest_rpath.conn.SaveState.touch_last_file()
src_init_dsiter = SourceS.split_initial_dsiter(src_rpath) src_init_dsiter = SourceS.split_initial_dsiter()
dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter) dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter)
diffiter = SourceS.get_diffs_and_finalize(dest_sigiter) diffiter = SourceS.get_diffs_and_finalize(dest_sigiter)
DestS.patch_increment_and_finalize(dest_rpath, diffiter, inc_rpath) DestS.patch_increment_and_finalize(dest_rpath, diffiter, inc_rpath)
...@@ -85,16 +85,15 @@ class HLSourceStruct: ...@@ -85,16 +85,15 @@ class HLSourceStruct:
def set_session_info(cls, session_info): def set_session_info(cls, session_info):
cls._session_info = session_info cls._session_info = session_info
def iterate_from(cls, rpath): def iterate_from(cls):
"""Supply more aruments to DestructiveStepping.Iterate_from""" """Supply more aruments to DestructiveStepping.Iterate_from"""
if cls._session_info: if cls._session_info is None: Globals.select_source.set_iter()
return DestructiveStepping.Iterate_from(rpath, 1, else: Globals.select_source.set_iter(cls._session_info.last_index)
cls._session_info.last_index) return Globals.select_source
else: return DestructiveStepping.Iterate_from(rpath, 1)
def split_initial_dsiter(cls, rpath): def split_initial_dsiter(cls):
"""Set iterators of all dsrps from rpath, returning one""" """Set iterators of all dsrps from rpath, returning one"""
dsiter = cls.iterate_from(rpath) dsiter = cls.iterate_from()
initial_dsiter1, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2) initial_dsiter1, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2)
return initial_dsiter1 return initial_dsiter1
...@@ -131,17 +130,15 @@ class HLDestinationStruct: ...@@ -131,17 +130,15 @@ class HLDestinationStruct:
def set_session_info(cls, session_info): def set_session_info(cls, session_info):
cls._session_info = session_info cls._session_info = session_info
def iterate_from(cls, rpath): def iterate_from(cls):
"""Supply more arguments to DestructiveStepping.Iterate_from""" """Supply more arguments to DestructiveStepping.Iterate_from"""
if cls._session_info: if cls._session_info is None: Globals.select_mirror.set_iter()
return DestructiveStepping.Iterate_from(rpath, None, else: Globals.select_mirror.set_iter(cls._session_info.last_index)
cls._session_info.last_index) return Globals.select_mirror
else: return DestructiveStepping.Iterate_from(rpath, None)
def split_initial_dsiter(cls, rpath): def split_initial_dsiter(cls):
"""Set initial_dsiters (iteration of all dsrps from rpath)""" """Set initial_dsiters (iteration of all dsrps from rpath)"""
dsiter = cls.iterate_from(rpath) result, cls.initial_dsiter2 = Iter.multiplex(cls.iterate_from(), 2)
result, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2)
return result return result
def get_dissimilar(cls, baserp, src_init_iter, dest_init_iter): def get_dissimilar(cls, baserp, src_init_iter, dest_init_iter):
...@@ -197,7 +194,7 @@ class HLDestinationStruct: ...@@ -197,7 +194,7 @@ class HLDestinationStruct:
def get_sigs(cls, baserp, src_init_iter): def get_sigs(cls, baserp, src_init_iter):
"""Return signatures of all dissimilar files""" """Return signatures of all dissimilar files"""
dest_iters1 = cls.split_initial_dsiter(baserp) dest_iters1 = cls.split_initial_dsiter()
dissimilars = cls.get_dissimilar(baserp, src_init_iter, dest_iters1) dissimilars = cls.get_dissimilar(baserp, src_init_iter, dest_iters1)
return RORPIter.Signatures(dissimilars) return RORPIter.Signatures(dissimilars)
......
...@@ -125,7 +125,7 @@ class Main: ...@@ -125,7 +125,7 @@ class Main:
sys.exit(1) sys.exit(1)
def misc_setup(self, rps): def misc_setup(self, rps):
"""Set default change ownership flag, umask, regular expressions""" """Set default change ownership flag, umask, Select objects"""
if ((len(rps) == 2 and rps[1].conn.os.getuid() == 0) or if ((len(rps) == 2 and rps[1].conn.os.getuid() == 0) or
(len(rps) < 2 and os.getuid() == 0)): (len(rps) < 2 and os.getuid() == 0)):
# Allow change_ownership if destination connection is root # Allow change_ownership if destination connection is root
...@@ -139,7 +139,7 @@ class Main: ...@@ -139,7 +139,7 @@ class Main:
rps[1].conn.Globals.set_select(None, rps[1], rps[1].conn.Globals.set_select(None, rps[1],
self.select_mirror_opts) self.select_mirror_opts)
Globals.postset_regexp('no_compression_regexp', Globals.postset_regexp('no_compression_regexp',
Globals.no_compression_regexp_string, re.I) Globals.no_compression_regexp_string)
def take_action(self, rps): def take_action(self, rps):
"""Do whatever self.action says""" """Do whatever self.action says"""
...@@ -248,8 +248,8 @@ rdiff-backup with the --force option.""" % rpout.path) ...@@ -248,8 +248,8 @@ rdiff-backup with the --force option.""" % rpout.path)
(rpin.path == "." and rpout.path[0] != '/' and (rpin.path == "." and rpout.path[0] != '/' and
rpout.path[:2] != '..')): rpout.path[:2] != '..')):
# Just a few heuristics, we don't have to get every case # Just a few heuristics, we don't have to get every case
if not DestructiveStepping.isexcluded(rpout, 1): if Globals.backup_reader.Globals.select_source \
Log( .Select(rpout): Log(
"""Warning: The destination directory '%s' may be contained in the """Warning: The destination directory '%s' may be contained in the
source directory '%s'. This could cause an infinite regress. You source directory '%s'. This could cause an infinite regress. You
may need to use the --exclude option.""" % (rpout.path, rpin.path), 2) may need to use the --exclude option.""" % (rpout.path, rpin.path), 2)
......
...@@ -404,6 +404,9 @@ class RPath(RORPath): ...@@ -404,6 +404,9 @@ class RPath(RORPath):
"bar") for "foo/bar" (no base), and ("local", "bin") for "bar") for "foo/bar" (no base), and ("local", "bin") for
"/usr/local/bin" if the base is "/usr". "/usr/local/bin" if the base is "/usr".
For the root directory "/", the index is empty and the base is
"/".
""" """
self.conn = connection self.conn = connection
self.index = index self.index = index
...@@ -487,9 +490,6 @@ class RPath(RORPath): ...@@ -487,9 +490,6 @@ class RPath(RORPath):
def _getdevnums(self): def _getdevnums(self):
"""Return tuple for special file (major, minor)""" """Return tuple for special file (major, minor)"""
if Globals.exclude_device_files:
# No point in finding numbers because it will be excluded anyway
return ()
s = self.conn.reval("lambda path: os.lstat(path).st_rdev", self.path) s = self.conn.reval("lambda path: os.lstat(path).st_rdev", self.path)
return (s >> 8, s & 0xff) return (s >> 8, s & 0xff)
...@@ -596,10 +596,9 @@ class RPath(RORPath): ...@@ -596,10 +596,9 @@ class RPath(RORPath):
def helper(dsrp, base_init_output, branch_reduction): def helper(dsrp, base_init_output, branch_reduction):
if dsrp.isdir(): dsrp.rmdir() if dsrp.isdir(): dsrp.rmdir()
else: dsrp.delete() else: dsrp.delete()
dsiter = DestructiveStepping.Iterate_from(self, None)
itm = IterTreeReducer(lambda x: None, lambda x,y: None, None, itm = IterTreeReducer(lambda x: None, lambda x,y: None, None,
helper) helper)
for dsrp in dsiter: itm(dsrp) for dsrp in Select(self, None).set_iter(): itm(dsrp)
itm.getresult() itm.getresult()
else: self.conn.os.unlink(self.path) else: self.conn.os.unlink(self.path)
self.setdata() self.setdata()
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment