Pygithub: InputGitTreeElement sollte die Übergabe von "null" für sha . ermöglichen

Erstellt am 14. Dez. 2019  ·  8Kommentare  ·  Quelle: PyGithub/PyGithub

Die Baumerstellungs- API von Github ermöglicht es uns, sha = null zu übergeben, um anzugeben, dass der angegebene Blob gelöscht werden muss.

Ich habe jedoch keine Möglichkeit, diese Informationen an mein InputGitTreeElement weiterzugeben. Ich kann ihm entweder ein str oder ein github.GithubObject.NotSet . Das bedeutet, dass ich mit PyGithub keine Möglichkeit habe, Dateien aus einem Baum zu löschen (ich möchte mehrere Dateien in einem einzigen Commit löschen, daher ist die Baumerstellung die ideale Wahl für mich).

Das aktuelle Design soll sha wenn es tatsächlich gesetzt ist:
https://github.com/PyGithub/PyGithub/blob/540a085001/github/InputGitTreeElement.py#L81

Ich kann verstehen, dass das Übergeben eines None gegen das Design verstößt. Ich denke, etwas wie github.GithubObject.Null könnte eingeführt werden, um explizit zu sagen, dass dieses Feld null . Es kann überall dort verwendet werden, wo die GH-API einen Nullwert akzeptiert.

Beispiel

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
)

Dadurch werden my/dir/my_file.txt gelöscht


Meine aktuelle Problemumgehung besteht darin, direkt auf die API zu klicken, um einen Baum zu erstellen (mit Anforderungen, Einstellung von sha=None ), den Baum sha zu erhalten und ihn mit pygithub für meinen verbleibenden Workflow (Commiting usw.) zu verwenden.

Bitte lassen Sie es mich wissen, falls ich einen Aspekt falsch verstanden habe oder etwas näher ausgeführt werden muss.

Hilfreichster Kommentar

Vielen Dank! Ich werde das in den nächsten Tagen oder so ausprobieren. Vielleicht ohne die F-Saiten. :-)

Alle 8 Kommentare

Eigentlich ist NotSet eine eigene Klasse, die nichts mit None zu tun hat. Wenn Sie also None übergeben, sollte es gut funktionieren.

Oh, warte, ich verstehe. Wir behaupten, es ist ein str! Stimmt, okay, also ich denke, keine Lockerungen zuzulassen ist dann vollkommen in Ordnung, schöner Fang.

Ich habe große Probleme mit dieser Änderung. Ich habe die notwendigen Änderungen vorgenommen, aber die create_git_tree() API gibt entweder 422 GitRPC::BadObjectState oder einen generischen 404 Not Found Fehler zurück. Können Sie ein funktionierendes Beispiel für ein öffentliches Repository bereitstellen, damit ich die Wiedergabedaten für den Komponententest abrufen kann?

Mein Code ist für ein privates Repo, daher habe ich hier gerade eine abgespeckte Version davon für Sie erstellt:

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)

Ein Grund, warum ich auch 422 GitRPC::BadObjectState war, dass ich Dateinamen in paths anlieferte, die im Basisbaum nicht existierten. Versuchen Sie zB, einen der obigen Dateinamen zu beschädigen.

Ich kann mein Test-Repository nicht veröffentlichen, aber hier ist die Struktur, richten Sie einfach Dummy-Dateien in Ihrem eigenen Repository ein

pods/
  raghav/
    network/
      resources.tf

Vielen Dank! Ich werde das in den nächsten Tagen oder so ausprobieren. Vielleicht ohne die F-Saiten. :-)

@stevenk wohoo! danke, dass du das behoben hast
cc @rohitpaulk

@stevenk Ich erstelle einen solchen Commit, aber dieser wird auch dann festgeschrieben, wenn der Dateidiff null ist. Bitte, jede Hilfe zum Commit nur, wenn es einige Diff gibt. Vielen Dank !

   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 Baum-SHAs sind im Wesentlichen Prüfsummen aller Dateien in Ihrem Repository, sodass Sie einfach überprüfen können, ob sie übereinstimmen.

In deinem Kontext wäre das etwa so:

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

(Ich erinnere mich nicht an die genaue Methode, mit der ein Sha abgerufen wurde, aber Sie bekommen die Idee)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kodeshpa picture kodeshpa  ·  3Kommentare

BBI-YggyKing picture BBI-YggyKing  ·  5Kommentare

PeterJCLaw picture PeterJCLaw  ·  6Kommentare

jacquev6 picture jacquev6  ·  3Kommentare

grayaii picture grayaii  ·  4Kommentare