Pygithub: InputGitTreeElement harus memungkinkan melewati "null" untuk sha

Dibuat pada 14 Des 2019  ·  8Komentar  ·  Sumber: PyGithub/PyGithub

Api pembuatan Pohon Github memungkinkan kita meneruskan sha = null untuk menunjukkan bahwa blob yang ditentukan perlu dihapus.

Namun, saya tidak memiliki cara untuk meneruskan info ini ke InputGitTreeElement . Saya bisa memberikannya str atau github.GithubObject.NotSet . Ini berarti saya tidak memiliki cara untuk menghapus file dari pohon menggunakan PyGithub (Saya ingin menghapus banyak file dalam satu komit sehingga pembuatan pohon adalah pilihan ideal bagi saya).

Desain saat ini hanya meneruskan sha jika benar-benar disetel:
https://github.com/PyGithub/PyGithub/blob/540a085001/github/InputGitTreeElement.py#L81

Saya dapat memahami bahwa memberikan None bertentangan dengan desain. Saya pikir sesuatu seperti github.GithubObject.Null dapat diperkenalkan untuk secara eksplisit mengatakan bahwa bidang ini adalah null . Ini dapat digunakan di mana saja GH API menerima nilai nol.

Contoh

new_tree = repo.create_git_tree(
    [
        InputGitTreeElement(
            path="my/dir/my_file.txt", mode="100644", type="blob", sha=github.GithubObject.Null
        ),
   ],
    base_tree=head_commit.tree
)

Ini akan menghapus my/dir/my_file.txt


Solusi saya saat ini adalah dengan langsung menekan api untuk membuat pohon (menggunakan permintaan, mengatur sha=None ), dapatkan pohon sha & gunakan dengan pygithub untuk alur kerja saya yang tersisa (melakukan, dll).

Tolong beri tahu saya jika saya salah memahami beberapa aspek atau jika ada yang perlu dijelaskan.

Komentar yang paling membantu

Terima kasih banyak! Saya akan mencoba ini di hari berikutnya atau lebih. Mungkin tanpa f-string. :-)

Semua 8 komentar

Sebenarnya NotSet adalah kelas tersendiri yang tidak ada hubungannya dengan None, jadi jika Anda memasukkan None, itu akan berfungsi dengan baik.

Oh, tunggu, aku mengerti. Kami menegaskan itu adalah str! Benar, oke, jadi saya pikir melonggarkan untuk mengizinkan None baik-baik saja, tangkapan yang bagus.

Saya mengalami banyak masalah dengan perubahan ini. Saya telah membuat perubahan yang diperlukan, tetapi create_git_tree() API mengembalikan 422 GitRPC::BadObjectState atau kesalahan 404 Not Found generik. Apakah Anda dapat memberikan contoh kerja terhadap repo publik sehingga saya dapat mengambil data replay untuk unit test?

Kode saya untuk repo pribadi, jadi saya baru saja membuat versi sederhananya untuk Anda di sini:

import json
import requests
from http import HTTPStatus
from github import Github

TOKEN = "<GITHUB TOKEN>"
gh_client = Github(TOKEN)

repo = gh_client.get_repo("duaraghav8/test")
my_branch = "tree-test"

# paths is list of files to delete
paths = ["pods/raghav/network/resources.tf", "abc"]

sha = repo.get_branch(my_branch).commit.sha
head_commit = repo.get_git_commit(sha)

tree_objects = [
    {"path": path, "mode": "100644", "type": "blob", "sha": None}
    for path in paths
]
payload = {
    "base_tree": head_commit.tree.sha,
    "tree": tree_objects,
}
headers = {"Authorization": f"token {TOKEN}"}
url = f"{repo.url}/git/trees"

response = requests.post(url, headers=headers, data=json.dumps(payload))
if response.status_code != HTTPStatus.CREATED:
    raise RuntimeError("Failed")

new_tree_sha = response.json()["sha"]
tree = repo.get_git_tree(new_tree_sha)

1 alasan saya juga menerima 422 GitRPC::BadObjectState adalah karena saya menyediakan nama file di paths yang tidak ada di pohon dasar. Misalnya, coba rusak 1 nama file di atas.

Saya tidak dapat membuat repo pengujian saya menjadi publik, tetapi inilah strukturnya, cukup atur file dummy di repo Anda sendiri

pods/
  raghav/
    network/
      resources.tf

Terima kasih banyak! Saya akan mencoba ini di hari berikutnya atau lebih. Mungkin tanpa f-string. :-)

@stevenk wooo! terima kasih telah memperbaiki ini
cc @rohitpaulk

@stevenk Saya membuat komit seperti ini, tetapi ini komit meskipun perbedaan file nol. Tolong, bantuan apa pun tentang cara melakukan hanya jika ada beberapa diff . Terima kasih !

   file_list = [a.txt]
   file_names =[a.txt] 
    for i, entry in enumerate(file_list):
      with open(entry) as input_file:
        data = input_file.read()
      element = InputGitTreeElement(file_names[i], '100644', 'blob', data)
      element_list.append(element)
    tree = repo.create_git_tree(element_list, base_tree)
    parent = repo.get_git_commit(master_sha)
    commit = repo.create_git_commit(commit_message, tree, [parent])

@Abhishek627 Tree SHA pada dasarnya adalah checksum dari semua file di repositori Anda, jadi Anda bisa memeriksa apakah mereka cocok.

Dalam konteks Anda, itu akan menjadi seperti:

if tree.sha != base_tree.sha:
   # then commit

(Saya tidak ingat metode persis yang digunakan untuk mengambil sha, tetapi Anda mendapatkan idenya)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

surajjacob picture surajjacob  ·  4Komentar

jacquev6 picture jacquev6  ·  3Komentar

BBI-YggyKing picture BBI-YggyKing  ·  5Komentar

diegotejadav picture diegotejadav  ·  5Komentar

PeterJCLaw picture PeterJCLaw  ·  6Komentar