Пример #1
0
    def check_exist_commit_file(self, check_dir="./"):
        """
        проверка на существования такого же commit файла,
        также проверяется корректность файла если он существует
        :param check_dir  - папка там где находится файл commitobject
        :return: True - если такой файл существует
        """

        directory = self.sha1[:2] + '/'
        filename = self.sha1[2:]
        full_filename = check_dir + directory + filename
        flag_exist_file = os.path.exists(full_filename)

        if flag_exist_file:
            with open(full_filename, "br") as f:
                filecontent = f.read()

            sha1_file = obj_sha1(filecontent)
            if sha1_file != self.sha1:
                error_text = f"FATAL ERROR: Файл {directory + filename} существует, но содержимое скомпрометировано."
                # print(error_text)
                raise BaseException(error_text)
        else:
            return False

        return True
Пример #2
0
    def save(self, output_dir='./'):
        """
        сохранение коммита в папку output_dir
        return: True - если сохранился коммит в файл, иначе False
        """
        # TODO: здесь должно быть  сохранение коммита

        filecontent = self.generate()

        if filecontent is None:
            return False

        self.sha1 = obj_sha1(filecontent.encode())

        if self.sha1 is None:
            return False

        commit_dir = output_dir + self.sha1[:2] + '/'
        # проверка на существование корректного commit-файла
        if self.check_exist_commit_file(output_dir):
            return True

        try:
            os.makedirs(commit_dir)
        except FileExistsError:
            # если файл существует проверяем на то что он корректный с точки зрения хеша
            flag = self.check_exist_commit_file(output_dir)
            if flag:
                return self.sha1

        with open(commit_dir + self.sha1[2:], "tw") as f:
            f.write(filecontent)
        return True
Пример #3
0
    def check_exist_blob(self, check_dir=""):
        """
        проверка на существования такого же blob файла
        :param check_dir  - папка там где находится файл blobobject
        :return: True - если такой файл существует
        """
        if check_dir == "":
            check_dir = self.output_dir

        directory = self.sha1[:2] + '/'
        filename = self.sha1[2:]
        full_filename = check_dir + directory + filename
        flag_exist_file = os.path.exists(full_filename)

        if flag_exist_file:
            with open(full_filename, "br") as f:
                filecontent = f.read()

            sha1_file = obj_sha1(filecontent)
            if sha1_file != self.sha1:
                error_text = f"FATAL ERROR: Файл {directory + filename} существует, но содержимое скомпрометировано."
                # print(error_text)
                raise BaseException(error_text)
        else:
            return False

        return True
Пример #4
0
 def get_sha1(self):
     """
     получение sha1 по содержимому obj
     """
     sort_obj = sorted(self.obj, reverse=False)
     res = '\n'.join(str(e) for e in sort_obj)
     return obj_sha1(res.encode())
Пример #5
0
    def save(self):
        """
        сохранение тектового представления дерева в файл filename
        return: sha1 объекта
        """
        # если нет объектов, то нечего сохранять
        # генерация перед сохранением данных
        flag_empty_dir = self.generate()

        if not flag_empty_dir:
            return None

        # удаляем директории которые без файлов
        self.compress()

        # print(self.obj)
        if self.obj == set():
            return None

        sort_obj = sorted(self.obj, reverse=True)
        filecontent = '\n'.join(str(e) for e in sort_obj)

        self.sha1 = obj_sha1(filecontent.encode())

        if self.sha1 is None:
            return None

        tree_dir = self.output_dir + self.sha1[:2] + '/'
        # проверка на существование корректного tree-файла
        if self.check_exist_blob():
            return self.sha1

        try:
            os.makedirs(tree_dir)
        except FileExistsError:
            # если файл существует проверяем на то что он корректный с точки зрения хеша
            flag = self.check_exist_blob()
            if flag:
                return self.sha1

        # первой строкой добавляем размер файла, остальное самим файлом
        with open(tree_dir + self.sha1[2:], "tw") as f:
            f.write(filecontent)
        return self.sha1
Пример #6
0
    def test_save_commit_file(self):
        """
        проверка сохранения коммита
        """
        output_dir = self.output_dir + 'save-commit/'
        create_new_dir(output_dir)

        mycommit = CommitObject(treeobj_sha1='123456789',
                                parrent_commint=['13131313'],
                                author={
                                    'name': 'Ilnur Saifutdinov',
                                    'email': '*****@*****.**'
                                },
                                commiter={
                                    'name': 'Amir Saifutdinov',
                                    'email': '*****@*****.**'
                                },
                                message_commit='first commit')

        mycommit.save(output_dir=output_dir)

        files, directory = get_file_dirs(output_dir)
        self.assertEqual(len(files), 0)
        self.assertEqual(len(directory), 1)
        sha1_dir = directory.pop()
        files_sub, directory_sub = get_file_dirs(output_dir + sha1_dir)
        self.assertEqual(len(directory_sub), 0)
        self.assertEqual(len(files_sub), 1)
        sha1_file = files_sub.pop()
        sha1 = sha1_dir + sha1_file
        # print(sha1)

        with open(output_dir + sha1_dir + '/' + sha1_file, 'br') as f:
            filecontent = f.read()

        self.assertEqual(obj_sha1(filecontent) == sha1, True)
Пример #7
0
    def save(self):
        """
        сохранить blob файл в указанную папку, также если существует blob файл проверить на целостность
        :return:
        """
        if not os.path.exists(self.filename):
            str_err = f'Файл {self.filename} не существует.'
            raise FileNotFoundError(str_err)

        self.size = os.path.getsize(self.filename)

        bstr_size = str.encode(str(self.size) + '\n')

        with open(self.filename, 'br') as f:
            filecontent = f.read()

        filecontent = bstr_size + filecontent
        self.sha1 = obj_sha1(filecontent)
        blob_dir = self.output_dir + self.sha1[:2] + '/'

        # проверка на существование корректного blob-файла
        if self.check_exist_blob():
            return self.sha1

        try:
            os.makedirs(blob_dir)
        except FileExistsError:
            # если файл существует проверяем на то что он корректный с точки зрения хеша
            flag = self.check_exist_blob()
            if flag:
                return self.sha1

        # первой строкой добавляем размер файла, остальное самим файлом
        with open(blob_dir + self.sha1[2:], "bw") as f:
            f.write(filecontent)
        return self.sha1