示例#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])
示例#2
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())
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())
示例#4
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())
示例#5
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])
示例#6
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])
示例#7
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])
示例#8
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)