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
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
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
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())
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
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)
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