Pygithub: يجب أن يسمح InputGitTreeElement بتمرير "null" لـ sha

تم إنشاؤها على ١٤ ديسمبر ٢٠١٩  ·  8تعليقات  ·  مصدر: PyGithub/PyGithub

تتيح لنا واجهة برمجة تطبيقات إنشاء شجرة Github تمرير sha = null للإشارة إلى ضرورة حذف blob المحدد.

ومع ذلك ، ليس لدي طريقة لتمرير هذه المعلومات إلى InputGitTreeElement . يمكنني إما إعطائها str أو github.GithubObject.NotSet . هذا يعني أنه ليس لدي طريقة لحذف الملفات من شجرة باستخدام PyGithub (أرغب في حذف ملفات متعددة في التزام واحد ، لذا فإن إنشاء الشجرة هو الخيار المثالي بالنسبة لي).

التصميم الحالي هو تمرير sha إذا تم تعيينه بالفعل:
https://github.com/PyGithub/PyGithub/blob/540a085001/github/InputGitTreeElement.py#L81

أستطيع أن أفهم أن تمرير None يتعارض مع التصميم. أعتقد أنه يمكن تقديم شيء مثل github.GithubObject.Null ليقول صراحة أن هذا الحقل هو null . يمكن استخدامه في كل مكان يقبل GH API قيمة فارغة.

مثال

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
)

سيؤدي هذا إلى حذف my/dir/my_file.txt


الحل الحالي الخاص بي هو النقر مباشرةً على واجهة برمجة التطبيقات لإنشاء شجرة (باستخدام الطلبات ، وإعداد sha=None ) ، والحصول على شكل الشجرة واستخدامه مع pygithub لسير العمل المتبقي (الالتزام ، وما إلى ذلك).

يرجى إعلامي في حال أسأت فهم بعض الجوانب أو إذا كان هناك أي شيء بحاجة إلى توضيح.

التعليق الأكثر فائدة

شكرا جزيلا! سأجرب هذه المحاولة في اليوم التالي أو نحو ذلك. ربما بدون خيوط f. :-)

ال 8 كومينتر

في الواقع NotSet هي فئة في حد ذاتها لا علاقة لها بـ None ، لذلك إذا نجحت في None ، فيجب أن تعمل بشكل جيد.

أوه ، انتظر ، فهمت. نحن نؤكد أنها شارع! حسنًا ، حسنًا ، لذلك أعتقد أن التخفيف للسماح بلا شيء جيد تمامًا ، إذن ، صيد لطيف.

أواجه الكثير من المشاكل مع هذا التغيير. لقد أجريت التغييرات اللازمة ، لكن واجهة برمجة التطبيقات create_git_tree () تُرجع 422 GitRPC :: BadObjectState أو خطأ 404 غير موجود عام. هل أنت قادر على تقديم مثال عملي مقابل الريبو العام حتى أتمكن من الحصول على بيانات إعادة التشغيل لاختبار الوحدة؟

الكود الخاص بي هو لريبو خاص ، لذلك قمت للتو بإنشاء نسخة مجردة منه من أجلك هنا:

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)

السبب الأول الذي تلقيته أيضًا 422 GitRPC::BadObjectState هو أنني كنت أقدم أسماء ملفات في paths لم تكن موجودة في الشجرة الأساسية. على سبيل المثال ، حاول إفساد أحد أسماء الملفات أعلاه.

لا يمكنني جعل الريبو التجريبي الخاص بي عامًا ، ولكن هنا الهيكل ، فقط قم بإعداد ملفات وهمية في الريبو الخاص بك

pods/
  raghav/
    network/
      resources.tf

شكرا جزيلا! سأجرب هذه المحاولة في اليوم التالي أو نحو ذلك. ربما بدون خيوط f. :-)

تضمين التغريدة شكرا لإصلاح هذا
ccrohitpaulk

stevenk أنا أقوم بإنشاء التزام مثل هذا ، ولكن هذا يتم تنفيذه حتى إذا كان الملف diff هو صفر. من فضلك ، أي مساعدة بشأن كيفية الالتزام فقط إذا كان هناك بعض الاختلافات. شكرا !

   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 SHAs هي في الأساس مجاميع اختبارية لجميع الملفات في المستودع الخاص بك ، لذا يمكنك فقط التحقق مما إذا كانت متطابقة.

في سياقك ، سيكون هذا شيئًا مثل:

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

(لا أتذكر الطريقة الدقيقة المستخدمة لجلب sha ، لكنك حصلت على الفكرة)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات