Ejemplo n.º 1
0
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])
Ejemplo n.º 2
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    for entry in read_index(gitdir):
        try:
            os.remove(entry.name)
        except FileNotFoundError:
            pass
    com = commit_parse(read_object(obj_name, gitdir)[1])
    finished = False
    while not finished:
        trees: tp.List[tp.Tuple[pathlib.Path, tp.List[tp.Tuple[int, str, str]]]]
        trees = [(gitdir.parent, read_tree(read_object(com["tree"], gitdir)[1]))]
        while trees:
            tree_path, tree_content = trees[-1]
            del trees[-1]
            for file_data in tree_content:
                fmt, data = read_object(file_data[2], gitdir)
                if fmt == "tree":
                    trees.append((tree_path / file_data[1], read_tree(data)))
                    if not (tree_path / file_data[1]).exists():
                        (tree_path / file_data[1]).mkdir()
                else:
                    if not (tree_path / file_data[1]).exists():
                        with (tree_path / file_data[1]).open("wb") as f:
                            f.write(data)
                        (tree_path / file_data[1]).chmod(int(str(file_data[0]), 8))
        if "parent" in com:
            com.append(commit_parse((read_object(com["parent"], gitdir)[1])))
        else:
            finished = True
    for dir in gitdir.parent.glob("*"):
        if dir != gitdir and dir.is_dir():
            try:
                os.removedirs(dir)
            except OSError:
                continue
Ejemplo n.º 3
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    for entry in read_index(gitdir):
        try:
            os.remove(entry.name)
        except FileNotFoundError:
            pass
    commit_que = [commit_parse(read_object(obj_name, gitdir)[1])]
    while len(commit_que) != 0:
        comm = commit_que.pop()
        if "parent" in comm:
            commit_que.append(commit_parse((read_object(comm["parent"], gitdir)[1])))
        tree_que: tp.List[tp.Tuple[pathlib.Path, tp.List[tp.Tuple[int, str, str]]]]
        tree_que = [(gitdir.parent, read_tree(read_object(comm["tree"], gitdir)[1]))]
        while len(tree_que) != 0:
            tree_path, tree_content = tree_que.pop()
            for file_data in tree_content:
                fmt, data = read_object(file_data[2], gitdir)
                if fmt == "tree":
                    tree_que.append((tree_path / file_data[1], read_tree(data)))
                    try:
                        (tree_path / file_data[1]).mkdir()
                    except FileExistsError:
                        pass
                else:
                    if not (tree_path / file_data[1]).exists():
                        with (tree_path / file_data[1]).open("wb") as f:
                            f.write(data)
                        (tree_path / file_data[1]).chmod(file_data[0])
    for dir in filter(lambda x: x != gitdir and x.is_dir(), gitdir.parent.glob("*")):
        dir_remover(dir)
Ejemplo n.º 4
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:

    for i in read_index(gitdir):
        if pathlib.Path(i.name).exists():
            os.remove(i.name)
    commit = commit_parse(read_object(obj_name, gitdir)[1])
    q = True
    while q:
        trees: tp.List[tp.Tuple[tp.List[tp.Tuple[int, str, str]], pathlib.Path]] = [
            (read_tree(read_object(commit["tree"], gitdir)[1]), gitdir.parent)
        ]
        while trees:
            tree_content, tree_path = trees.pop()
            for i in tree_content:
                fmt, data = read_object(i[2], gitdir)
                if fmt != "tree":
                    if not (tree_path / i[1]).exists():
                        with (tree_path / i[1]).open("wb") as f:
                            f.write(data)
                            (tree_path / i[1]).chmod(int(str(i[0]), 8))
                            f.close()
                else:
                    if not (tree_path / i[1]).exists():
                        (tree_path / i[1]).mkdir()
                    trees.append((read_tree(data), tree_path / i[1]))
        if "parent" in commit:
            commit = commit_parse((read_object(commit["parent"], gitdir)[1]))
        else:
            q = not q
    for i in gitdir.parent.glob("*"):
        if i.is_dir() and i != gitdir:
            try:
                os.removedirs(i)
            except OSError:
                continue
Ejemplo n.º 5
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    head_route = gitdir / "refs" / "heads" / obj_name
    if head_route.exists():
        with head_route.open(mode="r") as f1:
            obj_name = f1.read()
    index = read_index(gitdir)
    for entry in index:
        if pathlib.Path(entry.name).is_file():
            if "/" in entry.name:
                shutil.rmtree(entry.name[:entry.name.find("/")])
            else:
                # os.umask(777)
                os.chmod(entry.name, 777)
                # time.sleep(2)
                os.remove(entry.name)
    object_all_path = gitdir / "objects" / obj_name[:2] / obj_name[2:]
    with object_all_path.open(mode="rb") as f2:
        commit_content = f2.read()
    tree_sha = commit_parse(commit_content).decode()

    for file in find_tree_files(tree_sha, gitdir):
        if "/" in file[0]:
            dir_name = file[0][:file[0].find("/")]
            os.mkdir(dir_name)
        with open(file[0], "w") as f3:
            header, content = read_object(file[1], gitdir)
            f3.write(content.decode())
Ejemplo n.º 6
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    if is_detached(gitdir) and get_ref(gitdir) == obj_name:
        return
    elif get_ref(gitdir).split("/")[2] == obj_name:
        return
    elif resolve_head(gitdir) == obj_name:
        return
    elif (gitdir / 'refs' / 'heads' / obj_name).exists():
        with open(gitdir / 'refs' / 'heads' / obj_name, 'r') as file:
            obj_name = file.read()

    index = read_index(gitdir)
    for entry in index:
        if pathlib.Path(entry.name).exists():
            if '/' in entry.name:
                shutil.rmtree(entry.name[:entry.name.find('/')])
            else:
                os.remove(entry.name)

    path_to_commit = gitdir / "objects" / obj_name[:2] / obj_name[2:]
    if path_to_commit:
        with open(path_to_commit, 'rb') as file:
            raw = file.read()
        data = commit_parse(raw)
        tree_sha = data[data.find(b'tree ') + 5:data.find(b'\n')].decode()

        for file in find_tree_files(tree_sha, gitdir):
            if '/' in file[0]:
                dir_name = file[0][:file[0].find('/')]
                os.mkdir(dir_name)
            with open(file[0], 'w') as new_file:
                header, content = read_object(file[1], gitdir)
                new_file.write(content.decode())
Ejemplo n.º 7
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    if is_detached(gitdir) and get_ref(gitdir) == obj_name:
        return
    elif get_ref(gitdir).split("/")[2] == obj_name:
        return
    elif resolve_head(gitdir) == obj_name:
        return
    elif (gitdir / "refs" / "heads" / obj_name).exists():
        with open(gitdir / "refs" / "heads" / obj_name, "r") as f1:
            obj_name = f1.read()

    index = read_index(gitdir)
    for entry in index:
        if os.path.exists(entry.name):
            if "/" in entry.name:
                shutil.rmtree(entry.name[:entry.name.find("/")])
            else:
                os.remove(entry.name)

    with open(gitdir / "objects" / obj_name[:2] / obj_name[2:], "rb") as f2:
        commit_content = f2.read()
    tree_sha = commit_parse(commit_content).decode()

    for file in find_tree_files(tree_sha, gitdir):
        if "/" in file[0]:
            dir_name = file[0][:file[0].find("/")]
            os.mkdir(dir_name)
        with open(file[0], "w") as f3:
            header, content = read_object(file[1], gitdir)
            f3.write(content.decode())
Ejemplo n.º 8
0
 def test_read_object(self):
     gitdir = repo.repo_create(".")
     blob_path = gitdir / "objects" / "7e" / "774cf533c51803125d4659f3488bd9dffc41a6"
     blob_contents = (
         b"x\x9cK\xca\xc9OR02`(\xc9H,Q/V(\x07R\n\xc5\x19\xa9\n\xc5\x89\x99)\x00\x83:\tb"
     )
     self.fs.create_file(file_path=blob_path, contents=blob_contents)
     fmt, data = objects.read_object("7e774cf533c51803125d4659f3488bd9dffc41a6", gitdir)
     self.assertEqual("blob", fmt)
     self.assertEqual(b"that's what she said", data)
Ejemplo n.º 9
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    index = read_index(gitdir)
    for entry in index:
        if pathlib.Path(entry.name).exists():
            os.remove(entry.name)
    commit_data = commit_parse(read_object(obj_name, gitdir)[1])
    end = False
    while not end:
        trees: tp.List[tp.Tuple[pathlib.Path,
                                tp.List[tp.Tuple[int, str, str]]]] = [
                                    (gitdir.parent,
                                     read_tree(
                                         read_object(commit_data["tree"],
                                                     gitdir)[1]))
                                ]
        while trees:
            tree_path, tree_content = trees.pop()
            for file_data in tree_content:
                fmt, data = read_object(file_data[1], gitdir)
                if fmt == "tree":
                    trees.append((tree_path / file_data[2], read_tree(data)))
                    if not (tree_path / file_data[2]).exists():
                        (tree_path / file_data[2]).mkdir()
                else:
                    if not (tree_path / file_data[2]).exists():
                        with (tree_path / file_data[2]).open("wb") as f:
                            f.write(data)
                        (tree_path / file_data[2]).chmod(
                            int(str(file_data[0]), 8))
        if "parent" in commit_data:
            commit_data = commit_parse((read_object(commit_data["parent"],
                                                    gitdir)[1]))
        else:
            end = True
    dirs = gitdir.parent.glob("*")
    for dir in dirs:
        if dir != gitdir and dir.is_dir():
            try:
                os.removedirs(dir)
            except OSError:
                continue
Ejemplo n.º 10
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    # PUT YOUR CODE HERE
    indexes = [index.name for index in read_index(gitdir)]
    catalog = gitdir.parent
    for obj in catalog.iterdir():
        if obj in [gitdir.name]:
            continue
        if obj.name in indexes:
            os.remove(obj)

    commit = read_object(obj_name, gitdir)[1].decode()
    tree = commit.split()[1]  #разделяет по всем нечитаемым символам
Ejemplo n.º 11
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    ref = get_ref(gitdir)
    if os.path.isfile(gitdir / ref):
        f = pathlib.Path(gitdir / ref).open("r")
        ref = f.read()
        f.close()
    fmt, old_content = read_object(ref, gitdir)
    old_content = old_content.decode()
    tree_sha = old_content[5:45]
    old_objects = find_tree_files(tree_sha, gitdir)
    dirs = gitdir.absolute().parent
    for i in old_objects:
        os.remove(dirs / i[0])
        next_path = pathlib.Path(i[0]).parent
        while len(next_path.parents) > 0:
            os.rmdir(next_path)
            next_path = pathlib.Path(next_path).parent
    f = pathlib.Path(gitdir / "HEAD").open("w")
    f.write(obj_name)
    f.close()
    fmt, new_content = read_object(obj_name, gitdir)
    new_content = new_content.decode()
    new_tree_sha = new_content[5:45]
    new_objects = find_tree_files(new_tree_sha, gitdir)
    for i in new_objects:
        z = len(pathlib.Path(i[0]).parents)
        sub_path = dirs
        for sub in range(z - 2, -1, -1):
            sub_path /= pathlib.Path(i[0]).parents[sub]
            if not os.path.isdir(sub_path):
                os.mkdir(sub_path)
        fmt, obj_content = read_object(i[1], gitdir)
        if fmt == "blob":
            pathlib.Path(dirs / i[0]).touch()
            f = pathlib.Path(dirs / i[0]).open("w")
            f.write(obj_content.decode())
            f.close()
        else:
            os.mkdir(dirs / i[0])
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    ref = get_ref(gitdir)
    if os.path.isfile(gitdir / ref):
        branch_head = open(gitdir / ref, "r")
        ref = branch_head.read()
        branch_head.close()
    fmt, old_content = read_object(ref, gitdir)
    old_content_s = old_content.decode()
    objects = find_tree_files(old_content_s[5:25], gitdir)
    project_dir = gitdir.absolute().parent
    for obj in objects:
        os.remove(project_dir / obj[0])
        par_path = pathlib.Path(obj[0]).parent
        while len(par_path.parents) > 0:
            os.rmdir(par_path)
            par_path = pathlib.Path(par_path).parent
    f_ref = open(gitdir / "HEAD", "w")
    f_ref.write(obj_name)
    f_ref.close()
    fmt, new_content = read_object(obj_name, gitdir)
    new_content_s = new_content.decode()
    objects = find_tree_files(new_content_s[5:25], gitdir)
    for obj in objects:
        par_cnt = len(pathlib.Path(obj[0]).parents)
        par_path = project_dir
        for par in range(par_cnt - 2, -1, -1):
            par_path /= pathlib.Path(obj[0]).parents[par]
            if not os.path.isdir(par_path):
                os.mkdir(par_path)
        fmt, obj_content = read_object(obj[1], gitdir)
        if fmt == "blob":
            pathlib.Path(project_dir / obj[0]).touch()
            f_blob = open(project_dir / obj[0], "w")
            f_blob.write(obj_content.decode())
            f_blob.close()
        else:
            os.mkdir(project_dir / obj[0])
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    # PUT YOUR CODE HERE
    for entry in read_index(gitdir):
        if pathlib.Path(entry.name).exists():
            os.remove(entry.name)
    commit_data = commit_parse(read_object(obj_name, gitdir)[1])
    doing = True
    while doing:
        trees: tp.List[tp.Tuple[tp.List[tp.Tuple[int, str, str]],
                                pathlib.Path]] = [(read_tree(
                                    read_object(commit_data["tree"],
                                                gitdir)[1]), gitdir.parent)]
        while trees:
            tree_content, tree_path = trees.pop()
            for file_data in tree_content:
                fmt, data = read_object(file_data[2], gitdir)
                if fmt != "tree":
                    if not (tree_path / file_data[1]).exists():
                        with (tree_path / file_data[1]).open("wb") as file:
                            file.write(data)
                            (tree_path / file_data[1]).chmod(
                                int(str(file_data[0]), 8))
                else:
                    if not (tree_path / file_data[1]).exists():
                        (tree_path / file_data[1]).mkdir()
                    trees.append((read_tree(data), tree_path / file_data[1]))
        if "parent" in commit_data:
            commit_data = commit_parse((read_object(commit_data["parent"],
                                                    gitdir)[1]))
        else:
            doing = not doing
    for dir in gitdir.parent.glob("*"):
        if dir.is_dir() and dir != gitdir:
            try:
                os.removedirs(dir)
            except OSError:
                continue
Ejemplo n.º 15
0
def checkout(gitdir: pathlib.Path, obj_name: str) -> None:
    # PUT YOUR CODE HERE
    ref = get_ref(gitdir)
    if os.path.isfile(gitdir / ref):
        branch_head = open(gitdir / ref, "r")
        ref = branch_head.read()
        branch_head.close()
    _, old_store_bytes = read_object(ref, gitdir)
    old_store_string = old_store_bytes.decode()
    objects = find_tree_files(old_store_string[5:25], gitdir)
    project_dir = gitdir.absolute().parent
    for obj in objects:
        os.remove(project_dir / obj[0])
        par_path = pathlib.Path(obj[0]).parent
        while len(par_path.parents) > 0:
            os.rmdir(par_path)
            par_path = pathlib.Path(par_path).parent
    f_ref = open(gitdir / "HEAD", "w")
    f_ref.write(obj_name)
    f_ref.close()
    fmt, new_store_bytes = read_object(obj_name, gitdir)
    new_store_string = new_store_bytes.decode()
    objects = find_tree_files(new_store_string[5:25], gitdir)
    for obj in objects:
        parents_number = len(pathlib.Path(obj[0]).parents)
        par_path = project_dir
        for par in range(parents_number - 2, -1, -1):
            par_path /= pathlib.Path(obj[0]).parents[par]
            if not os.path.isdir(par_path):
                os.mkdir(par_path)
        fmt, obj_store = read_object(obj[1], gitdir)
        if fmt.__eq__("blob"):
            f = open(pathlib.Path(project_dir / obj[0]), "x")
            f.write(obj_store.decode())
            f.close()
        else:
            os.mkdir(project_dir / obj[0])
Ejemplo n.º 16
0
def checkout(gitdir: pathlib.Path, commit_sha: str) -> None:
    '''
    :param gitdir:
    :param commit_sha: sha объекта на который мы хотим сместить голову
    :return: None
    Изменяет положение головы и удаляет все файлы и дирректрории, ненаходящиеся в измененоном
    положении HEAD. Дирректория удаляется если в она была добавлена только следующем коммите
    '''
    files_shas, needed_files = zip(
        *find_all_files_from_commit_sha(gitdir, commit_sha))
    file_indexes_to_create = delete_files_and_return_file_to_create(
        gitdir, needed_files)
    for index in file_indexes_to_create:
        file_path: pathlib.Path = needed_files[index]
        file_sha = files_shas[index]
        file_type, file_content = read_object(file_sha, gitdir)[1]
        if file_type == 'tree':
            file_path.mkdir(parents=True, exist_ok=True)
        if file_type == 'blob':
            with open(file_path, 'w') as file:
                file.write(file_content)

    with open(gitdir / 'HEAD', 'w') as file:
        file.write(commit_sha)