Пример #1
0
    def run(self):
        """
        Worker method called synchronously or as part of an asynchronous
        thread or subprocess.
        """
        srcpath = self._src
        basepath, path = os.path.split(srcpath)

        if self._drive.is_drivepath(self._src):
            basepath = self._drive.normpath(basepath)

        debug("Source srcpath: %s" % repr(srcpath))
        debug("Source basepath: %s" % repr(basepath))
        debug("Source path: %s" % repr(path))

        if GsyncOptions.relative:
            # Supports the foo/./bar notation in rsync.
            path = re.sub(r'^.*/\./', "", path)

        self._sync = Sync(basepath, self._dst)

        debug("Enumerating: %s" % repr(srcpath))

        try:
            self._walk(srcpath, self._walk_callback, self._dev)

        except KeyboardInterrupt:
            print("\nInterrupted")
            raise

        except Exception as ex:
            debug.exception(ex)
            print("Error: %s" % repr(ex))

        finally:
            verbose("sent %d bytes  received %d bytes  %.2f bytes/sec" %
                    (self._sync.total_bytes_sent,
                     self._sync.total_bytes_received, self._sync.rate()))
Пример #2
0
        debug("Source srcpath: %s" % srcpath)
        debug("Source basepath: %s" % basepath)
        debug("Source path: %s" % path)

        if GsyncOptions.relative:
            # Supports the foo/./bar notation in rsync.
            path = re.sub(r'^.*/\./', "", path)

        self._sync = Sync(basepath, self._dst)

        debug("Enumerating: %s" % srcpath)

        try:
            self._walk(srcpath, self._walkCallback, self._dev)

        except KeyboardInterrupt, e:
            print("\nInterrupted")
            raise

        except Exception, e:
            debug.exception(e)
            print("Error: %s" % str(e))

        finally:
            verbose("sent %d bytes  received %d bytes  %.2f bytes/sec" % (
                self._sync.totalBytesSent,
                self._sync.totalBytesReceived,
                self._sync.rate()
            ))

Пример #3
0
    def _sync(self, path):
        debug("Synchronising: %s" % repr(path))

        relPath = self.src.relativeTo(path)
        debug("Destination: %s" % repr(self.dst))
        debug("Relative: %s" % repr(relPath))

        srcFile = self.src.getInfo(relPath)
        if srcFile is None:
            debug("File not found: %s" % repr(path))
            return None

        folder = bool(srcFile.mimeType == MimeTypes.FOLDER)
        dstPath = None
        dstFile = None
        create = False
        update = False

        force_dest_file = GsyncOptions.force_dest_file
        debug("force_dest_file = %s" % force_dest_file)

        # If GsyncOptions.force_dest_file is None, the following are ignored.
        if force_dest_file:
            folder = False
            dstFile = self.dst.getInfo()
            dstPath = self.dst + ""
            relPath = os.path.basename(dstPath)
            debug("Forcing destination file: %s" % repr(dstPath))

        else:
            dstPath = self.dst + relPath
            dstFile = self.dst.getInfo(relPath)
            debug("Defaulting destination directory: %s" % repr(dstPath))

        debug("srcFile = %s" % repr(srcFile), 3)
        debug("dstFile = %s" % repr(dstFile), 3)

        if dstFile is None:
            debug("File not found: %s" % repr(dstPath))
        elif dstFile.mimeType != srcFile.mimeType:
            debug("Destination mimetype(%s) != source mimetype(%s)" % (
                dstFile.mimeType, srcFile.mimeType
            ))

        if dstFile is None or dstFile.mimeType != srcFile.mimeType:
            changes = bytearray("+++++++++++")
            create = True
        else:
            changes = bytearray("...........")

            if GsyncOptions.update:
                if srcFile.modifiedDate <= dstFile.modifiedDate:
                    debug("File up to date: %s" % repr(path))
                    return None

            if srcFile.fileSize != dstFile.fileSize:
                if folder:
                    debug("Folder size differs, so what...?: %s" % repr(path))
                    return None

                debug("File size mismatch: %s" % repr(path))
                debug("    source size:      %d" % srcFile.fileSize)
                debug("    destination size: %d" % dstFile.fileSize)

                if GsyncOptions.append:
                    update = True
                else:
                    create = True

                changes[3] = 's'

            elif GsyncOptions.checksum:
                if srcFile.md5Checksum != dstFile.md5Checksum:
                    debug("File checksum mismatch: %s" % repr(path))
                    debug("    source md5:      %s" % srcFile.md5Checksum)
                    debug("    destination md5: %s" % dstFile.md5Checksum)

                    changes[2] = 'c'
                    update = True

            if srcFile.modifiedDate >= dstFile.modifiedDate:
                if folder and not GsyncOptions.times:
                    debug("Don't update folders unless --times: %s" % 
                        repr(path))
                    return None

                if srcFile.modifiedDate > dstFile.modifiedDate:
                    debug("File timestamp mismatch: %s" % repr(path))
                    debug(" * source mtime:      %d" %
                        int(srcFile.modifiedDate))
                    debug(" * destination mtime: %d" %
                        int(dstFile.modifiedDate))
                    debug(" * delta:             %s" %
                        repr(srcFile.modifiedDate - dstFile.modifiedDate))

                    if GsyncOptions.times:
                        changes[4] = 't'
                    else:
                        changes[4] = 'T'

                    update = True

            elif GsyncOptions.update:
                debug("Skipping, dest file is newer: %s" % repr(dstPath))
                return None

            if update or create:
                if srcFile.statInfo and dstFile.statInfo:
                    dstSt = dstFile.statInfo
                    srcSt = srcFile.statInfo

                    if GsyncOptions.perms and dstSt.st_mode != srcSt.st_mode:
                        changes[5] = 'p'

                    if GsyncOptions.owner and dstSt.st_uid != srcSt.st_uid:
                        changes[6] = 'o'
                    
                    if GsyncOptions.group and dstSt.st_gid != srcSt.st_gid:
                        changes[7] = 'g'

                if srcFile.modifiedDate != dstFile.modifiedDate:
                    if GsyncOptions.times:
                        changes[4] = 't'
                    else:
                        changes[4] = 'T'

            # TODO: Check acl = changes[9] = 'a'
            # TODO: Check extended attributes = changes[10] = 'x'

            if not update and not create:
                debug("File up to date: %s" % repr(dstPath))
                return None

        if folder:
            if create:
                changes[0] = 'c'

            changes[1] = 'd'
            relPath += "/"
        else:
            changes[1] = 'f'

            if update or create:
                if self.dst.islocal():
                    changes[0] = '>'
                else:
                    changes[0] = '<'

        if GsyncOptions.itemize_changes:
            itemize(changes, relPath)
        else:
            verbose(relPath)

        try:
            if create:
                self.dst.create(dstPath, srcFile)

            elif GsyncOptions.ignore_existing:
                debug("File exists on the receiver, skipping: %s" % (
                    repr(path)
                ))
                return None

            elif update:
                self.dst.update(dstPath, srcFile)

        except KeyboardInterrupt, e:
            debug("Interrupted")
            raise
Пример #4
0
        if self._drive.is_drivepath(self._src):
            basepath = self._drive.normpath(basepath)

        debug("Source srcpath: %s" % repr(srcpath))
        debug("Source basepath: %s" % repr(basepath))
        debug("Source path: %s" % repr(path))

        if GsyncOptions.relative:
            # Supports the foo/./bar notation in rsync.
            path = re.sub(r'^.*/\./', "", path)

        self._sync = Sync(basepath, self._dst)

        debug("Enumerating: %s" % repr(srcpath))

        try:
            self._walk(srcpath, self._walk_callback, self._dev)

        except KeyboardInterrupt, ex:
            print("\nInterrupted")
            raise

        except Exception, ex:
            debug.exception(ex)
            print("Error: %s" % repr(ex))

        finally:
            verbose("sent %d bytes  received %d bytes  %.2f bytes/sec" %
                    (self._sync.total_bytes_sent,
                     self._sync.total_bytes_received, self._sync.rate()))
Пример #5
0
    def _sync(self, path):
        """Internal synchronisation method, accessible by calling the class
        instance and providing the path to the file to synchronise.

        @param {String} path   The path to the file to synchronise.
        """

        debug("Synchronising: %s" % repr(path))

        rel_path = self.src.relative_to(path)
        debug("Destination: %s" % repr(self.dst))
        debug("Relative: %s" % repr(rel_path))

        src_file = self.src.get_info(rel_path)
        if src_file is None:
            debug("File not found: %s" % repr(path))
            return None

        dst_path, dst_file = None, None

        debug("force_dest_file = %s" % GsyncOptions.force_dest_file)

        if GsyncOptions.force_dest_file:
            dst_file = self.dst.get_info()
            dst_path = self.dst + ""
            rel_path = os.path.basename(dst_path)
        else:
            dst_path = self.dst + rel_path
            dst_file = self.dst.get_info(rel_path)

        debug("src_file = %s" % repr(src_file), 3)
        debug("dst_file = %s" % repr(dst_file), 3)

        rules = SyncRules(src_file, dst_file, sync_type=self.dst.sync_type())
        action, changes = rules.apply()

        if not action & (CREATE | UPDATE_DATA | UPDATE_ATTRS):
            debug("File up to date: %s" % repr(dst_path))
            return None

        if rules.is_dir:
            rel_path += "/"

        if GsyncOptions.itemize_changes:
            itemize(changes, rel_path)
        else:
            verbose(rel_path)

        try:
            if action & CREATE:
                self.dst.create(dst_path, src_file)

            elif action & UPDATE_DATA:
                self.dst.update_data(dst_path, src_file)

            if action & UPDATE_ATTRS:
                self.dst.update_attrs(dst_path, src_file)

        finally:
            self.total_bytes_sent += self.dst.bytes_written
            self.total_bytes_received += self.dst.bytes_read
Пример #6
0
    def _sync(self, path):
        """Internal synchronisation method, accessible by calling the class
        instance and providing the path to the file to synchronise.

        @param {String} path   The path to the file to synchronise.
        """

        debug("Synchronising: %s" % repr(path))

        rel_path = self.src.relative_to(path)
        debug("Destination: %s" % repr(self.dst))
        debug("Relative: %s" % repr(rel_path))

        src_file = self.src.get_info(rel_path)
        if src_file is None:
            debug("File not found: %s" % repr(path))
            return None

        dst_path, dst_file = None, None

        debug("force_dest_file = %s" % GsyncOptions.force_dest_file)

        if GsyncOptions.force_dest_file:
            dst_file = self.dst.get_info()
            dst_path = self.dst + ""
            rel_path = os.path.basename(dst_path)
        else:
            dst_path = self.dst + rel_path
            dst_file = self.dst.get_info(rel_path)

        debug("src_file = %s" % repr(src_file), 3)
        debug("dst_file = %s" % repr(dst_file), 3)

        rules = SyncRules(src_file, dst_file, sync_type=self.dst.sync_type())
        action, changes = rules.apply()

        if not action & (CREATE | UPDATE_DATA | UPDATE_ATTRS):
            debug("File up to date: %s" % repr(dst_path))
            return None

        if rules.is_dir:
            rel_path += "/"

        if GsyncOptions.itemize_changes:
            itemize(changes, rel_path)
        else:
            verbose(rel_path)

        try:
            if action & CREATE:
                self.dst.create(dst_path, src_file)

            elif action & UPDATE_DATA:
                self.dst.update_data(dst_path, src_file)

            if action & UPDATE_ATTRS:
                self.dst.update_attrs(dst_path, src_file)

        finally:
            self.total_bytes_sent += self.dst.bytes_written
            self.total_bytes_received += self.dst.bytes_read
Пример #7
0
    def __call__(self, path):
        changes = self._sync(path)

        if changes is not None:
            if not GsyncOptions.itemize_changes:
                verbose(changes[1])