예제 #1
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
예제 #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
    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)
예제 #3
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
예제 #4
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())
예제 #5
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])
예제 #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())
예제 #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())
예제 #8
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
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
예제 #10
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)