Beispiel #1
0
    def generate_diff(self, write_deltafile: bool = True) -> DiffHead:
        self.logger.debug('Generating %s delta `%s` -> `%s`', self.name,
                          self.base, self.target)
        self.logger.debug('working directory is `%s`', os.getcwd())

        if not os.path.exists(self._deltapath):
            os.makedirs(self._deltapath)

        bireus_head = DiffHead(repository=self.name,
                               base_version=self.base,
                               target_version=self.target)

        top_folder_diff = self._compare_directory('')

        bireus_head.items.append(top_folder_diff)

        if write_deltafile:
            with open(os.path.join(self._deltapath, '.bireus'),
                      'w+') as diffFile:
                json.dump(bireus_head.to_dict(), diffFile)

            abs_delta_path = os.path.join(os.getcwd(), self._deltapath)
            shutil.make_archive(
                os.path.join(self.name, '__patches__',
                             '%s_to_%s' % (self.base, self.target)), 'xztar',
                abs_delta_path
            )  # file extension gets added to filename automatically
            shutil.rmtree(
                os.path.join(self.name, self.base, '.delta_to')
            )  # remove the delta folder, only the patchfile remains

        return bireus_head
Beispiel #2
0
def test_empty_repo(empty_repo_with_2_version):
    tmpdir, repo_folder, v1_folder, v2_folder = empty_repo_with_2_version

    repo_manager = RepositoryManager(tmpdir.strpath)
    repo_manager.full_update()

    filename = os.path.join(repo_folder.strpath, '__patches__',
                            'v1_to_v2.tar.xz')
    targetfolder = os.path.join(v1_folder.strpath, '.delta_to', 'v2')
    shutil.unpack_archive(filename, targetfolder, 'xztar')

    assert os.path.exists(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2',
                     '.bireus'))  # delta file written
    with open(os.path.join(v1_folder.strpath, '.delta_to', 'v2',
                           '.bireus')) as json_file:
        json_result = json.load(json_file)
        assert json_result['repository'] == "test_repo"
        assert json_result['base_version'] == "v1"
        assert json_result['target_version'] == "v2"
        assert len(json_result['items']) == 1
        assert json_result['items'][0]['name'] == ''
        assert json_result['items'][0]['type'] == 'directory'
        assert json_result['items'][0]['action'] == 'delta'
        assert len(json_result['items'][0]['items']) == 0

    delta = DiffHead.load_json_file(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', '.bireus'))
    assert delta.repository == "test_repo"
    assert delta.base_version == "v1"
    assert delta.target_version == "v2"
    assert len(delta.items) == 1
Beispiel #3
0
def test_zipdelta(empty_repo_with_2_version):
    tmpdir, repo_folder, v1_folder, v2_folder = empty_repo_with_2_version

    v1_zipdir = tmpdir.mkdir("test_zipdelta_v1")
    create_simplefile(v1_zipdir.strpath, "test.txt",
                      "Das ist die alte Version!")
    shutil.make_archive(os.path.join(v1_folder.strpath, "test"), 'zip',
                        v1_zipdir.strpath)

    v2_zipdir = tmpdir.mkdir("test_zipdelta_v2")
    create_simplefile(v2_zipdir.strpath, "test.txt",
                      "Das ist die neue Version!")
    shutil.make_archive(os.path.join(v2_folder.strpath, "test"), 'zip',
                        v2_zipdir.strpath)

    shutil.rmtree(v1_zipdir.strpath)
    shutil.rmtree(v2_zipdir.strpath)

    repo_manager = RepositoryManager(tmpdir.strpath)
    repo_manager.full_update()

    filename = os.path.join(repo_folder.strpath, '__patches__',
                            'v1_to_v2.tar.xz')
    targetfolder = os.path.join(v1_folder.strpath, '.delta_to', 'v2')
    shutil.unpack_archive(filename, targetfolder, 'xztar')

    result = DiffHead.load_json_file(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', '.bireus')).items[0]
    assert len(result.items) == 1
    assert result.items[0].type == "file"
    assert result.items[0].name == "test.zip"
    assert result.items[0].action == "zipdelta"
    assert len(result.items[0].items) == 1
Beispiel #4
0
def test_file_changed(empty_repo_with_2_version):
    tmpdir, repo_folder, v1_folder, v2_folder = empty_repo_with_2_version

    create_simplefile(v1_folder.strpath, "test.txt",
                      "Das ist die alte Version!")
    create_simplefile(v2_folder.strpath, "test.txt",
                      "Das ist die neue Version!")

    repo_manager = RepositoryManager(tmpdir.strpath)
    repo_manager.full_update()

    filename = os.path.join(repo_folder.strpath, '__patches__',
                            'v1_to_v2.tar.xz')
    targetfolder = os.path.join(v1_folder.strpath, '.delta_to', 'v2')
    shutil.unpack_archive(filename, targetfolder, 'xztar')

    result = DiffHead.load_json_file(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', '.bireus')).items[0]
    assert len(result.items) == 1
    assert result.items[0].type == "file"
    assert result.items[0].name == "test.txt"
    assert result.items[0].action == "bsdiff"
    assert len(result.items[0].items) == 0

    assert os.path.exists(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', 'test.txt'))
    bsdiff4.file_patch(
        os.path.join(v1_folder.strpath, 'test.txt'),
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', 'test.txt.patched'),
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', 'test.txt'))
    assert filecmp.cmp(
        os.path.join(v2_folder.strpath, 'test.txt'),
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', 'test.txt.patched'))
Beispiel #5
0
    def _apply_patch(self, target_version) -> None:
        patch_dir = Path(
            tempfile.TemporaryDirectory(prefix="bireus_",
                                        suffix="_" + target_version).name)
        patch_file = self._absolute_path / self._internal_path / Path(
            '%s_to_%s.tar.xz' % (self.current_version, target_version))

        shutil.unpack_archive(str(patch_file), str(patch_dir), 'xztar')

        diff_head = DiffHead.load_json_file(str(patch_dir.joinpath('.bireus')))

        if len(diff_head.items) == 0 or len(diff_head.items) > 1:
            logger.error("Invalid diff_head - only top directory allowed")
            raise Exception("Invalid diff_head - only top directory allowed")

        PatchTask(self.url, self._absolute_path, Path('.'), Path(patch_dir),
                  diff_head, diff_head.items[0]).patch()
Beispiel #6
0
def test_folder_removed(empty_repo_with_2_version):
    tmpdir, repo_folder, v1_folder, v2_folder = empty_repo_with_2_version

    v1_folder_FR = v1_folder.mkdir("fr")  # folder FR removed

    repo_manager = RepositoryManager(tmpdir.strpath)
    repo_manager.full_update()

    filename = os.path.join(repo_folder.strpath, '__patches__',
                            'v1_to_v2.tar.xz')
    targetfolder = os.path.join(v1_folder.strpath, '.delta_to', 'v2')
    shutil.unpack_archive(filename, targetfolder, 'xztar')

    result = DiffHead.load_json_file(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', '.bireus')).items[0]
    assert len(result.items) == 1
    assert result.items[0].type == "directory"
    assert result.items[0].name == "fr"
    assert result.items[0].action == "remove"
    assert len(result.items[0].items) == 0
Beispiel #7
0
def test_file_added(empty_repo_with_2_version):
    tmpdir, repo_folder, v1_folder, v2_folder = empty_repo_with_2_version

    create_simplefile(v2_folder.strpath, "test.txt", "test")

    repo_manager = RepositoryManager(tmpdir.strpath)
    repo_manager.full_update()

    filename = os.path.join(repo_folder.strpath, '__patches__',
                            'v1_to_v2.tar.xz')
    targetfolder = os.path.join(v1_folder.strpath, '.delta_to', 'v2')
    shutil.unpack_archive(filename, targetfolder, 'xztar')

    result = DiffHead.load_json_file(
        os.path.join(v1_folder.strpath, '.delta_to', 'v2', '.bireus')).items[0]
    assert len(result.items) == 1
    assert result.items[0].type == "file"
    assert result.items[0].name == "test.txt"
    assert result.items[0].action == "add"
    assert len(result.items[0].items) == 0