def commit(self,dryrun=True): """ update target with data from source """ queue=[] updates = [] import datetime time = datetime.datetime.now() queue.append( (LtrDrop("","/",self.fspath),self) ) sourcefilter = lambda n: True targetfilter = lambda n: n.boxname == self.id while len(queue): (source,target)= queue.pop(0) source = dictbyname(filter(sourcefilter,source.children())) target = dictbyname(filter(targetfilter,target.children())) srcunique = set(source.keys()) - set(target.keys()) absent = set(target.keys()) - set(source.keys()) common = set(target.keys()) & set(source.keys()) for filename in common: existing = source[filename] updating = target[filename] diff = updating.diff(existing) if diff != []: show("M %s %s\n" %(existing.volpath,diff)) show("[ updateDrop %s ]" % existing.name ) updating.updateDrop(existing) updates.append(updating) if updating.ftype == "dir": queue.append((existing,updating)) for gone in absent: gone = target.get(gone) if gone.ftype == "dir": queue.append((LtrDrop(gone.name,gone.path,self.fspath),gone)) if LtrNode.COPY_FLAG in gone.flags: show("D %s\n" %(gone.getVolPath())) gone.flags.remove(LtrNode.COPY_FLAG) updates.append(gone) if not LtrNode.COPY_FLAG in gone.flags \ and not LtrNode.SKIP_FLAG in gone.flags: show("W %s\n" %(gone.getVolPath())) for new in map(lambda x:source.get(x),srcunique): newnode = LtrNode().new() show("[ updateDrop %s ]" % new.volpath ) newnode.updateDrop(new,dryrun=dryrun) newnode.boxname = self.id if not LtrNode.COPY_FLAG in newnode.flags: newnode.flags.append(LtrNode.COPY_FLAG) newnode.addtime = time show("N %s\n" %(new.volpath)) updates.append(newnode) if new.ftype == "dir": queue.append((new,newnode)) if not dryrun: print "." * len(updates) self.space.records.update(updates) if len(updates): #import pprint #pprint.pprint(updates) return True else: return False