Pygithub: рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдирд╡ре░ 2017  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: PyGithub/PyGithub

рдХрд┐рд╕реА рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .get_contents() рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ:

{'errors': [{'code': 'too_large', 'field': 'data',
     'resource': 'Blob'}],
     'message': 'This API returns blobs up to 1 MB in size. The requested blob is too large to fetch via the API, but you can use the Git Data API to request blobs up to 100 MB in size.',
     'documentation_url': 'https://developer.github.com/v3/repos/contents/#get-contents'}

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ:

contents = repository.get_dir_contents(urllib.parse.quote(server_path), ref=sha)

for content in contents:
   if content.type != 'dir':
     file_content = repository.get_contents(urllib.parse.quote(content.path), ref=sha)

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

file_content = repository.get_git_blob(content.sha)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдХреА рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рдЕрдВрддред

  1. рдЕрдЧрд░ рд╣рдо рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рд╕рднреА рдлрд╛рдЗрд▓ рдХреЛ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ 1M рд╕реЗ рдмрдбрд╝реА рд╣реИрдВ,
 file_contents = repo.get_contents(dir_name, ref=branch)

рддрдм sha рдкреНрд░рддреНрдпреЗрдХ file_content рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмреНрд▓реЛ рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

for file_content in file_contents:
    try:
        if file_content.encoding != 'base64':
            # some error ...
        # ok... 
    except GithubException:
        # if file_content DOES NOT HAVE encoding, it is a large file 
        blob = repo.get_git_blob(file_content.sha)
        # do something with blob

рдпрджрд┐ path_name рдПрдХ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ 1M рд╕реЗ рдмрдбрд╝реА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ / рдЕрдкрд╡рд╛рдж рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

        try:
            res = repo.get_contents(path_name, ref=branch)
            # ok, we have the content
        except GithubException:
           return get_blob_content(repo, branch, path_name)

рдЬрд╣рд╛рдБ get_blob_content рдХреБрдЫ рдРрд╕рд╛ рд╣реИ

def get_blob_content(repo, branch, path_name):
    # first get the branch reference
    ref = repo.get_git_ref(f'heads/{branch}')
    # then get the tree
    tree = repo.get_git_tree(ref.object.sha, recursive='/' in path_name).tree
    # look for path in tree
    sha = [x.sha for x in tree if x.path == path_name]
    if not sha:
        # well, not found..
        return None
    # we have sha
    return repo.get_git_blob(sha[0])

рддреНрд░реБрдЯрд┐-рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓рдВрдмрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдБ рд╣реИред

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рднреА рднрд╛рдЧ рдЪреБрдХрд╛ рд╣реВрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдмреВрдБрдж рдХрд╛ SHA рдерд╛, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп git_git_blob рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, get_git_blob рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП blob (рдЗрд╕рд▓рд┐рдП рдирд╛рдо) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

рдлрд╝реЙрд▓рдмреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рджреЛ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛:

  1. рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ред
  2. рд╡рд╕реНрддреБ рдХрд╛ SHAред

рдпрджрд┐ get_contents рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдЗрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рд╡рд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдордмреИрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

wontfix рд░реВрдк рдореЗрдВ рдмрдВрджред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реВрдБред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдл рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдореИрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдХреА рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рдЕрдВрддред

  1. рдЕрдЧрд░ рд╣рдо рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рд╕рднреА рдлрд╛рдЗрд▓ рдХреЛ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ 1M рд╕реЗ рдмрдбрд╝реА рд╣реИрдВ,
 file_contents = repo.get_contents(dir_name, ref=branch)

рддрдм sha рдкреНрд░рддреНрдпреЗрдХ file_content рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмреНрд▓реЛ рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

for file_content in file_contents:
    try:
        if file_content.encoding != 'base64':
            # some error ...
        # ok... 
    except GithubException:
        # if file_content DOES NOT HAVE encoding, it is a large file 
        blob = repo.get_git_blob(file_content.sha)
        # do something with blob

рдпрджрд┐ path_name рдПрдХ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ 1M рд╕реЗ рдмрдбрд╝реА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ / рдЕрдкрд╡рд╛рдж рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

        try:
            res = repo.get_contents(path_name, ref=branch)
            # ok, we have the content
        except GithubException:
           return get_blob_content(repo, branch, path_name)

рдЬрд╣рд╛рдБ get_blob_content рдХреБрдЫ рдРрд╕рд╛ рд╣реИ

def get_blob_content(repo, branch, path_name):
    # first get the branch reference
    ref = repo.get_git_ref(f'heads/{branch}')
    # then get the tree
    tree = repo.get_git_tree(ref.object.sha, recursive='/' in path_name).tree
    # look for path in tree
    sha = [x.sha for x in tree if x.path == path_name]
    if not sha:
        # well, not found..
        return None
    # we have sha
    return repo.get_git_blob(sha[0])

рддреНрд░реБрдЯрд┐-рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓рдВрдмрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдБ рд╣реИред

рдмреВрдБрдж рдорд┐рд▓рдиреЗ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

    blob = repo.get_git_blob(sha[0])
    b64 = base64.b64decode(blob.content)
    return b64.decode("utf8")

рд╕рд╛рде рд╣реА, рдЕрдкрдбреЗрдЯ рдлрд╝рд╛рдЗрд▓ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░реЗрдЧреАред

raise self.__createException(status, responseHeaders, output)

github.GithubException.UnknownObjectException: 404 { "message": "рдирд╣реАрдВ рдорд┐рд▓рд╛", "documentation_url": " https://docs.github.com/rest/reference/repos#get -repository-рд╕рд╛рдордЧреНрд░реА"} рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬрдм рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдкреНрдд рднрдВрдбрд╛рд░ рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

hsluoyz picture hsluoyz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

PeterJCLaw picture PeterJCLaw  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BBI-YggyKing picture BBI-YggyKing  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kodeshpa picture kodeshpa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rthill91 picture rthill91  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ