def checkout(gitdir: pathlib.Path, obj_name: str) -> None: # PUT YOUR CODE HERE update_ref(gitdir, "HEAD", obj_name) hash = commit_parse(read_object(obj_name, gitdir)[1]) files = find_tree_files(hash, gitdir) index = read_index(gitdir) names = [] for i in index: names.append(i.name) update_index(gitdir, [pathlib.Path(i[1]) for i in files], write=True) for i in names: first = i.split("/")[0] if pathlib.Path(first).is_dir(): shutil.rmtree(first) else: if pathlib.Path(first).exists(): os.remove(first) for i in files: isFound = i[1].find("/") if isFound != -1: elem1 = os.path.split(i[1])[0] if pathlib.Path(elem1).exists() == False: os.makedirs(elem1) with open(i[1], "wb") as f: f.write(read_object(i[0], gitdir)[1])
def test_write_tree_subdirs(self): gitdir = repo_create(".") mode100644 = stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH quote = pathlib.Path("quote.txt") self.fs.create_file(quote, contents="that's what she said", st_mode=mode100644) letters = pathlib.Path("alphabeta") / "letters.txt" self.fs.create_file(letters, contents="abcdefg", st_mode=mode100644) digits = pathlib.Path("numbers") / "digits.txt" self.fs.create_file(digits, contents="1234567890", st_mode=mode100644) update_index(gitdir, [quote, letters, digits], write=True) entries = read_index(gitdir) sha = write_tree(gitdir, entries) self.assertEqual("a9cde03408c68cbb205b038140b4c3a38aa1d01a", sha) alphabeta_tree_sha = "7926bf494dcdb82261e1ca113116610f8d05470b" alphabeta_tree_obj = gitdir / "objects" / alphabeta_tree_sha[: 2] / alphabeta_tree_sha[ 2:] self.assertTrue(alphabeta_tree_obj.exists()) numbers_tree_sha = "32ad3641a773ce34816dece1ce63cc24c8a514d0" numbers_tree_obj = gitdir / "objects" / numbers_tree_sha[: 2] / numbers_tree_sha[ 2:] self.assertTrue(numbers_tree_obj.exists())
def test_cat_tree_file(self): gitdir = repo.repo_create(".") mode100644 = stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH quote = pathlib.Path("quote.txt") self.fs.create_file(quote, contents="that's what she said", st_mode=mode100644) letters = pathlib.Path("alphabeta") / "letters.txt" self.fs.create_file(letters, contents="abcdefg", st_mode=mode100644) digits = pathlib.Path("numbers") / "digits.txt" self.fs.create_file(digits, contents="1234567890", st_mode=mode100644) index.update_index(gitdir, [quote, letters, digits], write=True) entries = index.read_index(gitdir) sha = tree.write_tree(gitdir, entries) self.assertEqual("a9cde03408c68cbb205b038140b4c3a38aa1d01a", sha) expected_output = "\n".join( [ "040000 tree 7926bf494dcdb82261e1ca113116610f8d05470b\talphabeta", "040000 tree 32ad3641a773ce34816dece1ce63cc24c8a514d0\tnumbers", "100644 blob 7e774cf533c51803125d4659f3488bd9dffc41a6\tquote.txt", ] ) with patch("sys.stdout", new=io.StringIO()) as out: objects.cat_file(sha, pretty=True) self.assertEqual(expected_output, out.getvalue().strip())
def add(gitdir: pathlib.Path, paths: tp.List[pathlib.Path]) -> None: # PUT YOUR CODE HERE update_index(gitdir, list(filter(lambda x: x.is_file(), paths)), write=True) for path in filter(lambda x: x.is_dir(), paths): add(gitdir, list(path.glob("*")))
def add(gitdir: pathlib.Path, paths: tp.List[pathlib.Path]) -> None: # PUT YOUR CODE HERE for path in paths: if path.is_file(): update_index(gitdir, [path], write=True) if path.is_dir(): add(gitdir, list(path.glob("*")))
def test_write_tree(self): gitdir = repo_create(".") animals = pathlib.Path("animals.txt") mode100644 = stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH self.fs.create_file( animals, contents="Big blue basilisks bawl in the basement\n", st_mode=mode100644, ) update_index(gitdir, [animals], write=True) entries = read_index(gitdir) sha = write_tree(gitdir, entries) self.assertEqual("dc6b8ea09fb7573a335c5fb953b49b85bb6ca985", sha)
def test_update_index(self): gitdir = repo_create(".") index = gitdir / "index" quote = pathlib.Path("quote.txt") self.fs.create_file(quote, contents="that's what she said") self.assertFalse(index.exists()) update_index(gitdir, [quote]) self.assertTrue(index.exists()) entries = read_index(gitdir) self.assertEqual(1, len(entries)) expected_sha = "7e774cf533c51803125d4659f3488bd9dffc41a6" obj_path = gitdir / "objects" / expected_sha[:2] / expected_sha[2:] self.assertTrue(obj_path.exists())
def test_update_index_many(self): gitdir = repo_create(".") index = gitdir / "index" letters = pathlib.Path("letters.txt") self.fs.create_file(letters, contents="abcdefg") digits = pathlib.Path("digits.txt") self.fs.create_file(digits, contents="1234567890") self.assertFalse(index.exists()) update_index(gitdir, [letters, digits]) self.assertTrue(index.exists()) entries = read_index(gitdir) self.assertEqual(2, len(entries)) names = [e.name for e in entries] self.assertEqual(["digits.txt", "letters.txt"], names)
def test_update_index_subdirs(self): gitdir = repo_create(".") index = gitdir / "index" quote = pathlib.Path("quote.txt") self.fs.create_file(quote, contents="that's what she said") letters = pathlib.Path("alphabeta") / "letters.txt" self.fs.create_file(letters, contents="abcdefg") digits = pathlib.Path("numbers") / "digits.txt" self.fs.create_file(digits, contents="1234567890") self.assertFalse(index.exists()) update_index(gitdir, [quote, letters, digits]) self.assertTrue(index.exists()) entries = read_index(gitdir) self.assertEqual(3, len(entries)) names = [e.name for e in entries] self.assertEqual(["alphabeta/letters.txt", "numbers/digits.txt", "quote.txt"], names)
def checkout(gitdir: pathlib.Path, obj_name: str) -> None: update_ref(gitdir, "HEAD", obj_name) index_names = [entry.name for entry in read_index(gitdir)] _, commit_data = read_object(obj_name, gitdir) tree_hash = commit_parse(commit_data) files = find_tree_files(tree_hash, gitdir) to_be_updated = [pathlib.Path(i[1]) for i in files] update_index(gitdir, to_be_updated, write=True) for name in index_names: nodes = name.split("\\") if pathlib.Path(nodes[0]).is_dir(): shutil.rmtree(nodes[0]) else: if pathlib.Path(nodes[0]).exists(): os.remove(nodes[0]) for sha, name in files: if name.find("\\") != -1: prefix, _ = os.path.split(name) if not pathlib.Path(prefix).exists(): os.makedirs(prefix) _, content = read_object(sha, gitdir) with open(name, "wb") as file_obj: file_obj.write(content)
def add(gitdir: pathlib.Path, paths: tp.List[pathlib.Path]) -> None: for path in paths: if path.is_dir(): add(gitdir, list(path.glob("*"))) else: update_index(gitdir, [path], write=True)
def add(gitdir: pathlib.Path, paths: tp.List[pathlib.Path]) -> None: update_index(gitdir, paths, write=True)
def add(gitdir: pathlib.Path, paths: tp.List[pathlib.Path]) -> None: # PUT YOUR CODE HERE update_index(gitdir, path)
def add(gitdir: pathlib.Path, paths: tp.List[pathlib.Path]) -> None: for path in paths: if os.path.isfile(path): update_index(gitdir, [path], write=True) if os.path.isdir(path): add(gitdir, list(path.glob("*")))
def cmd_update_index(args: argparse.Namespace) -> None: gitdir = repo_find() update_index(gitdir, args.paths, write=args.add)