コード例 #1
0
ファイル: box.py プロジェクト: thouters/ltr
    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