|
1 |
| -from github.Auth import Auth |
| 1 | +from logging import getLogger as get_logger |
| 2 | + |
| 3 | +from github.GitCommit import GitCommit |
| 4 | +from github.GitTree import GitTree |
| 5 | +from github.InputGitTreeElement import InputGitTreeElement |
| 6 | +from github.Repository import Repository |
2 | 7 |
|
3 | 8 | from .dtos import Blob, Commit, Tree
|
| 9 | +from .enums import Mode, Type |
| 10 | + |
| 11 | + |
| 12 | +def make_tree_blob_element(blob: Blob) -> InputGitTreeElement: |
| 13 | + if blob.sha: |
| 14 | + with blob.path.open() as infile: |
| 15 | + return InputGitTreeElement( |
| 16 | + path=str(blob.path), |
| 17 | + mode=Mode.FILE.value, |
| 18 | + type=Type.BLOB.value, |
| 19 | + content=infile.read(), |
| 20 | + ) |
| 21 | + else: |
| 22 | + return InputGitTreeElement( |
| 23 | + path=str(blob.path), |
| 24 | + mode=Mode.FILE.value, |
| 25 | + type=Type.BLOB.value, |
| 26 | + sha=None, |
| 27 | + ) |
| 28 | + |
| 29 | + |
| 30 | +def make_tree_tree_element(tree: Tree, git_tree: GitTree) -> InputGitTreeElement: |
| 31 | + return InputGitTreeElement( |
| 32 | + path=str(tree.path), |
| 33 | + mode=Mode.SUBDIRECTORY.value, |
| 34 | + type=Type.TREE.value, |
| 35 | + sha=git_tree.sha, |
| 36 | + ) |
4 | 37 |
|
5 | 38 |
|
6 |
| -def write_blob(auth: Auth, blob: Blob) -> None: |
7 |
| - # TODO: write blob |
8 |
| - pass |
| 39 | +def write_tree(repo: Repository, tree: Tree, base_tree: GitTree) -> GitTree: |
| 40 | + logger = get_logger("GitTree") |
9 | 41 |
|
| 42 | + child_git_trees = [write_tree(repo, child, base_tree) for child in tree.trees] |
10 | 43 |
|
11 |
| -def write_tree(auth: Auth, tree: Tree) -> None: |
12 |
| - for tree in tree.trees: |
13 |
| - write_tree(auth, tree) |
| 44 | + tree_items = [make_tree_blob_element(blob) for blob in tree.blobs] + [ |
| 45 | + make_tree_tree_element(child, child_git_tree) |
| 46 | + for child, child_git_tree in zip(tree.trees, child_git_trees) |
| 47 | + ] |
14 | 48 |
|
15 |
| - for blob in tree.blobs: |
16 |
| - write_blob(auth, blob) |
| 49 | + logger.info(f"Creating git tree with {len(tree_items)} items from: {base_tree}") |
| 50 | + git_tree = repo.create_git_tree( |
| 51 | + tree=tree_items, |
| 52 | + base_tree=base_tree, |
| 53 | + ) |
| 54 | + logger.info(f"Created git tree: {git_tree.sha}") |
| 55 | + return git_tree |
17 | 56 |
|
18 |
| - # TODO: write tree |
19 | 57 |
|
| 58 | +def write_commit(repo: Repository, commit: Commit) -> GitCommit: |
| 59 | + logger = get_logger("GitCommit") |
20 | 60 |
|
21 |
| -def write_commit(auth: Auth, commit: Commit) -> None: |
22 |
| - write_tree(auth, commit.tree) |
| 61 | + parent_git_commit = repo.get_git_commit(commit.parents[0]) |
| 62 | + parent_git_tree = parent_git_commit.tree |
| 63 | + git_tree = write_tree(repo, commit.tree, parent_git_tree) |
23 | 64 |
|
24 |
| - # TODO: write commit |
| 65 | + logger.info(f"Creating git commit from tree: {git_tree.sha}") |
| 66 | + git_commit = repo.create_git_commit( |
| 67 | + message=commit.message, |
| 68 | + tree=git_tree, |
| 69 | + parents=[parent_git_commit], |
| 70 | + ) |
| 71 | + logger.info(f"Created git commit: {git_commit.sha}") |
| 72 | + return git_commit |
0 commit comments