예제 #1
0
    def test_mask_time_big(self):
        path1 = os.path.join(self.folder, "a.txt")
        path2 = os.path.join(self.folder, "b.txt")
        path3 = os.path.join(self.folder, "c")

        dtime = datetime.datetime.now()

        new_path1 = stamp.add_stamp(path1, dtime)
        new_path2 = stamp.add_stamp(path2, dtime)
        new_path3 = stamp.add_stamp(path3, dtime)

        open(new_path1, "w").close()
        open(new_path2, "w").close()
        open(new_path3, "w").close()

        mask1 = stamp.extend_mask_by_stamp(path1)
        mask2 = stamp.extend_mask_by_stamp(path2)
        mask3 = stamp.extend_mask_by_stamp(path3)

        dircetory1, file_mask1 = os.path.split(mask1)
        dircetory2, file_mask2 = os.path.split(mask2)
        dircetory3, file_mask3 = os.path.split(mask3)

        files1 = utils.search(dircetory1, "", file_mask1)
        files1 = [stamp.split_stamp(f)[0] for f in files1]
        files2 = utils.search(dircetory2, "", file_mask2)
        files2 = [stamp.split_stamp(f)[0] for f in files2]
        files3 = utils.search(dircetory3, "", file_mask3)
        files3 = [stamp.split_stamp(f)[0] for f in files3]

        self.assertEqual(files1, [path1])
        self.assertEqual(files2, [path2])
        self.assertEqual(files3, [path3])
예제 #2
0
    def test_simple(self):
        directory = os.path.join(self.files_folder, "e")
        path = os.path.join(directory, "f.txt")

        with self.trash.lock():
            count, size, delta_files = self.trash.add(path)
            self.assertEquals(count, 1)
            self.assertEquals(size, 10)
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, ["f.txt"])

            files = list(utils.search(directory, "*", "*"))
            files = [os.path.relpath(f, directory) for f in files]
            files.sort()
            self.assertEquals(files, ["g.txt", "h.png", "j", "k"])

            count, size, delta_files = self.trash.restore(path)
            self.assertEquals(count, 1)
            self.assertEquals(size, 10)
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, ["f.txt"])

            files = list(utils.search(directory, "*", "*"))
            files = [os.path.relpath(f, directory) for f in files]
            files.sort()
            self.assertEquals(files, ["f.txt", "g.txt", "h.png", "j", "k"])
예제 #3
0
    def test_dir(self):
        directory = self.files_folder
        path = os.path.join(directory, "e")

        with self.trash.lock():
            count, size, delta_files = self.trash.add(path)
            self.assertEquals(count, 5)
            self.assertEquals(size, 15)
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, [
                "e", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k", "e/k/l.txt"
            ])

            files = list(utils.search(directory, "*", "*"))
            files = [os.path.relpath(f, directory) for f in files]
            files.sort()
            self.assertEquals(files, ["a.txt", "b.txt", "c.png", "d"])

            count, size, delta_files = self.trash.restore(path)
            self.assertEquals(count, 5)
            self.assertEquals(size, 15)

            files = list(utils.search(directory, "", "*", recursive=True))
            files = [os.path.relpath(f, directory) for f in files]
            files.sort()
            self.assertEquals(files, [
                "a.txt", "b.txt", "c.png", "d", "e/f.txt", "e/g.txt",
                "e/h.png", "e/j", "e/k/l.txt"
            ])
예제 #4
0
    def test_remove_dir(self):
        directory = self.files_folder
        path = os.path.join(directory, "e")

        with self.trash.lock():
            count, size, delta_files = self.trash.add(path)
            self.assertEquals(count, 5)
            self.assertEquals(size, 15)
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, [
                "e", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k", "e/k/l.txt"
            ])

            count, size, delta_files = self.trash.remove(path)
            self.assertEquals(count, 5)
            self.assertEquals(size, 15)
            delta_files = [f_d[0] for f_d in delta_files]
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, [
                "e", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k", "e/k/l.txt"
            ])

            files = list(utils.search(directory, "*", "*"))
            files = [os.path.relpath(f, directory) for f in files]
            files.sort()

            self.assertEquals(files, ["a.txt", "b.txt", "c.png", "d"])
            self.assertFalse(os.path.exists(self.trash.to_internal(path)))
예제 #5
0
    def search(self, path_mask, recursive=False, find_all=False):
        """Поиск в корзине по маске. Возвращает словарь с версиями.

        Маска задается в формате Unix filename pattern.
        Путь задается относительно

        Позиионные аргументы:
        path_mask -- маска

        Непозиционные аргументы:
        recursive -- производить лиpath поиск в подпапках.
        find_all -- углублять в подпапки,
                если они соответствуют маске (по-умолчанию False)

        """
        path_mask = self.to_internal(path_mask)
        directory, mask = os.path.split(path_mask)

        if not os.path.exists(directory):
            return {}
        file_mask = stamp.extend_mask_by_stamp(mask)
        files = utils.search(directory,
                             mask,
                             file_mask,
                             recursive=recursive,
                             find_all=find_all)
        files = [self.to_external(f) for f in files]
        files_versions = stamp.files_to_file_dict(files)

        return files_versions
예제 #6
0
 def test_dict(self):
     mask = stamp.extend_mask_by_stamp(self.path)
     dircetory, file_mask = os.path.split(mask)
     files = utils.search(dircetory, "", file_mask)
     dct = stamp.files_to_file_dict(files)
     self.assertEqual(dct[self.path],
                      [self.dtime3, self.dtime2, self.dtime1])
예제 #7
0
    def test_simple_clear(self):
        directory = os.path.join(self.files_folder, "e")
        path = os.path.join(directory, "f.txt")

        with self.trash.lock():
            count, size, delta_files = self.trash.add(path)
            self.assertEquals(count, 1)
            self.assertEquals(size, 10)
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, ["f.txt"])

            count, size, delta_files = self.trash.remove(path)
            self.assertEquals(count, 1)
            self.assertEquals(size, 10)
            delta_files = [f_d[0] for f_d in delta_files]
            delta_files = unify(delta_files, directory)
            self.assertEquals(delta_files, ["f.txt"])

            files = list(utils.search(directory, "*", "*"))
            files = [os.path.relpath(f, directory) for f in files]
            files.sort()
            self.assertEquals(files, ["g.txt", "h.png", "j", "k"])

            files = stamp.get_versions_list(self.trash.to_internal(path))
            self.assertTrue(len(files) == 0)
예제 #8
0
    def test_time(self):
        mask = stamp.extend_mask_by_stamp(self.path)
        dircetory, file_mask = os.path.split(mask)
        files = utils.search(dircetory, "", file_mask)
        times = [stamp.split_stamp(f)[1] for f in files]
        times.sort()

        self.assertEqual(times, [self.dtime1, self.dtime2, self.dtime3])
예제 #9
0
    def test_remove_mask1(self):
        directory = os.path.join(self.files_folder, "e")
        path = os.path.join(directory, "*")

        count, size, delta_files = self.mrm.remove(path)
        self.assertEquals(count, 5)
        self.assertEquals(size, 15)

        files = list(utils.search(directory, "*", "*"))
        self.assertEquals(len(files), 0)
예제 #10
0
 def test_mask(self):
     path = os.path.join(self.folder, "a.txt")
     dtime = datetime.datetime.now()
     new_path = stamp.add_stamp(path, dtime)
     open(new_path, "w").close()
     mask = stamp.extend_mask_by_stamp(path)
     dircetory, file_mask = os.path.split(mask)
     files = utils.search(dircetory, "", file_mask)
     files = [stamp.split_stamp(f)[0] for f in files]
     self.assertEqual(files, [path])
예제 #11
0
 def test_2(self):
     files = utils.search(self.folder,
                          "*",
                          "*",
                          recursive=False,
                          find_all=False)
     files = list(files)
     files = [os.path.relpath(f, self.folder) for f in files]
     files.sort()
     self.assertEqual(files, ["a.txt", "b.txt", "c", "e.png"])
예제 #12
0
 def test_mask2(self):
     files = utils.search(self.folder,
                          "",
                          "[ab].txt",
                          recursive=True,
                          find_all=False)
     files = list(files)
     files = [os.path.relpath(f, self.folder) for f in files]
     files.sort()
     ans = ["a.txt", "b.txt"]
     self.assertEqual(files, ans)
예제 #13
0
 def test_find_all(self):
     files = utils.search(self.folder,
                          "*",
                          "*",
                          recursive=True,
                          find_all=True)
     files = list(files)
     files = [os.path.relpath(f, self.folder) for f in files]
     files.sort()
     ans = ["a.txt", "b.txt", "c", os.path.join("c", "d.txt"), "e.png"]
     self.assertEqual(files, ans)
예제 #14
0
    def test_remove_mask2(self):
        directory = os.path.join(self.files_folder, "e")
        path = os.path.join(directory, "*.txt")

        count, size, delta_files = self.mrm.remove(path)
        self.assertEquals(count, 2)
        self.assertEquals(size, 15)

        files = list(utils.search(directory, "*", "*"))
        files = [os.path.relpath(f, directory) for f in files]
        files.sort()
        self.assertEquals(files, ["h.png", "j", "k"])
예제 #15
0
    def test_simple_remove(self):
        directory = self.files_folder
        path = os.path.join(directory, "a.txt")

        count, size, delta_files = self.mrm.remove(path)
        self.assertEquals(count, 1)
        self.assertEquals(size, 10)

        files = list(utils.search(directory, "*", "*"))
        files = [os.path.relpath(f, directory) for f in files]
        files.sort()
        self.assertEquals(files, ["b.txt", "c.png", "d", "e"])
예제 #16
0
    def test_remove_mask6(self):
        directory = os.path.join(self.files_folder)
        path = os.path.join(directory, "*")

        count, size, delta_files = self.mrm.remove(path, recursive=True)
        self.assertEquals(count, 9)
        self.assertEquals(size, 30)

        files = list(utils.search(directory, "*", "*"))
        files = [os.path.relpath(f, directory) for f in files]
        files.sort()
        self.assertEquals(files, [])
예제 #17
0
    def test_restore3(self):
        directory = os.path.join(self.files_folder)
        path = os.path.join(directory, "[bc].*")

        self.mrm.remove(path)
        count, size, delta_files = self.mrm.restore(path)
        self.assertEquals(count, 2)
        self.assertEquals(size, 5)

        files = list(utils.search(directory, "*", "*"))
        files = [os.path.relpath(f, directory) for f in files]
        files.sort()
        self.assertEquals(files, ["a.txt", "b.txt", "c.png", "d", "e"])
예제 #18
0
    def test_remove_mask3(self):
        directory = os.path.join(self.files_folder)
        path = os.path.join(directory, "*.txt")

        count, size, delta_files = self.mrm.remove(path, recursive=True)
        self.assertEquals(count, 5)
        self.assertEquals(size, 30)

        files = list(
            utils.search(directory, "*", "*", recursive=True, find_all=True))
        files = [os.path.relpath(f, directory) for f in files]
        files.sort()
        self.assertEquals(files, ["c.png", "d", "e", "e/h.png", "e/j", "e/k"])
예제 #19
0
    def test_restore5(self):
        directory = os.path.join(self.files_folder)
        path = os.path.join(directory, "*")

        self.mrm.remove(path)
        count, size, delta_files = self.mrm.restore(path)
        self.assertEquals(count, 9)
        self.assertEquals(size, 30)

        files = list(utils.search(directory, "", "*", recursive=True))
        files = [os.path.relpath(f, directory) for f in files]
        files.sort()
        self.assertEquals(files, [
            "a.txt", "b.txt", "c.png", "d", "e/f.txt", "e/g.txt", "e/h.png",
            "e/j", "e/k/l.txt"
        ])
예제 #20
0
def get_versions_list(path):
    """Возвращает список штампом времени добавленных к файлу

    Позицонные аргументы:
    path -- путь к файлу

    Формат штампов:
    "{path}_rmdt={posix_sec}_rmmsec={microsec}_"

    """
    directory, file_name = os.path.split(path)
    extend_file_name = extend_mask_by_stamp(file_name)
    files = utils.search(directory, '', extend_file_name)
    versions = [split_stamp(f)[1] for f in files]
    versions.sort(reverse=True)
    return versions
예제 #21
0
    def remove(self, path_mask, recursive=False):
        """Удаляет фалйы по маске в корзину.

        Возвращает количестов удаленных файлов и их размер.

        Маска задается в формате Unix filename pattern.
        Только последний элемент пути может быть маской.

        Позиионные аргументы:
        path_mask -- маска

        Непозиционные аргументы:
        recursive -- производить ли поиск в подпапках.
                     По умолчанию: False

        Корзина блокируется.

        """
        path_mask = os.path.expanduser(path_mask)
        path_mask = os.path.abspath(path_mask)
        size = 0
        count = 0
        files = []
        directory, mask = os.path.split(path_mask)

        with self.trash.lock():
            found = utils.search(directory, mask, mask, recursive=recursive)
            for path in found:

                if not control.remove(path, interactive=self.interactive):
                    continue

                try:
                    try:
                        if self.dryrun:
                            with self.trash.dryrun_mode():
                                dcount, dsize, dfiles = self.trash.add(path)
                        else:
                            dcount, dsize, dfiles = self.trash.add(path)

                    except LimitExcessException:
                        if self.allow_autoclean and not self.dryrun:
                            log_msg = ("Bukkit limit excess. "
                                       "Trying to autoclean.")
                            logging.info(log_msg)

                            dcount, dsize = self.autocleaner.autoclean()
                            log_fmt = "{count} files({size} bytes) cleaned."
                            log_msg = log_fmt.format(count=dcount, size=dsize)

                            if self.dryrun:
                                with self.trash.dryrun_mode():
                                    dcount, dsize, dfiles = self.trash.add(
                                        path)
                            else:
                                dcount, dsize, dfiles = self.trash.add(path)
                        else:
                            raise
                except Exception:
                    if not self.force:
                        raise

                count += dcount
                size += dsize
                files.extend(dfiles)
        return count, size, files