Saya bermain-main dengan perpustakaan ini dengan harapan saya dapat mengotomatiskan berbagai hal di Github Enterprise kami. Salah satu hal pertama yang perlu saya lakukan adalah mengatur perlindungan cabang untuk repo kami. Namun, ketika saya memulai objek Cabang dari repositori pengujian (yang sudah memiliki perlindungan cabang yang ditetapkan, ingatlah), satu-satunya atribut yang ditetapkan adalah "nama", dan sebagian besar metode yang tercantum dalam dokumentasi tidak ada di obyek:
import github
github.enable_console_debug_logging()
Github = github.Github
Github("myuser",
'mycreds',
base_url="https://ghe.workworkwork.com/api/v3")
master = g.get_user("myuser").get_repo('cookbook1').get_branch('master')
print master
print master.protection_url
Hasil:
...
GET https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/branches/master {'Authorization': 'Basic (login and password removed)', 'User-Agent': 'PyGithub/Python'} None ==> 200 {'status': '200 OK', 'content-length': '2925', 'x-github-media-type': 'github.v3', 'x-content-type-options': 'nosniff', 'content-security-policy': "default-src 'none'", 'access-control-expose-headers': 'ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval', 'x-github-request-id': '0ec6f4e8-2355-41dc-859d-0e7076a294b1', 'strict-transport-security': 'max-age=31536000; includeSubdomains', 'vary': 'Accept, Authorization, Cookie, X-GitHub-OTP', 'server': 'GitHub.com', 'access-control-allow-origin': '*', 'etag': '"965449c848ed3319d7e028c2a587f414"', 'x-xss-protection': '1; mode=block', 'cache-control': 'private, max-age=60, s-maxage=60', 'date': 'Thu, 16 Aug 2018 23:41:19 GMT', 'x-frame-options': 'deny', 'x-oauth-scopes': 'admin:org_hook, admin:pre_receive_hook, admin:repo_hook, repo', 'content-type': 'application/json; charset=utf-8', 'x-accepted-oauth-scopes': ''} {"name":"master","commit":{"sha":"3548233b67c8ec4cad703ff947fa0ba022df7c66","commit":{"author":{"name":"Garrett Anderson","email":"[email protected]","date":"2018-08-16T18:44:44Z"},"committer":{"name":"GitHub Enterprise","email":"[email protected]","date":"2018-08-16T18:44:44Z"},"message":"Merge pull request #8 from myuser/newfork\n\nwhat","tree":{"sha":"44b3a300094b2ccbbfb79ea7df5f82e627c12b42","url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/git/trees/44b3a300094b2ccbbfb79ea7df5f82e627c12b42"},"url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/git/commits/3548233b67c8ec4cad703ff947fa0ba022df7c66","comment_count":0},"url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/3548233b67c8ec4cad703ff947fa0ba022df7c66","html_url":"https://ghe.workworkwork.com/myuser/cookbook1/commit/3548233b67c8ec4cad703ff947fa0ba022df7c66","comments_url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/3548233b67c8ec4cad703ff947fa0ba022df7c66/comments","author":{"login":"myuser","id":593,"avatar_url":"https://ghe.workworkwork.com/avatars/u/593?","gravatar_id":"","url":"https://ghe.workworkwork.com/api/v3/users/myuser","html_url":"https://ghe.workworkwork.com/myuser","followers_url":"https://ghe.workworkwork.com/api/v3/users/myuser/followers","following_url":"https://ghe.workworkwork.com/api/v3/users/myuser/following{/other_user}","gists_url":"https://ghe.workworkwork.com/api/v3/users/myuser/gists{/gist_id}","starred_url":"https://ghe.workworkwork.com/api/v3/users/myuser/starred{/owner}{/repo}","subscriptions_url":"https://ghe.workworkwork.com/api/v3/users/myuser/subscriptions","organizations_url":"https://ghe.workworkwork.com/api/v3/users/myuser/orgs","repos_url":"https://ghe.workworkwork.com/api/v3/users/myuser/repos","events_url":"https://ghe.workworkwork.com/api/v3/users/myuser/events{/privacy}","received_events_url":"https://ghe.workworkwork.com/api/v3/users/myuser/received_events","type":"User","site_admin":true},"committer":null,"parents":[{"sha":"067642113fe45ee77160ee28cafc4870f2c06b6a","url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/067642113fe45ee77160ee28cafc4870f2c06b6a","html_url":"https://ghe.workworkwork.com/myuser/cookbook1/commit/067642113fe45ee77160ee28cafc4870f2c06b6a"},{"sha":"3a9479c605617a9035cd986a4bf77880ac5dde64","url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/3a9479c605617a9035cd986a4bf77880ac5dde64","html_url":"https://ghe.workworkwork.com/myuser/cookbook1/commit/3a9479c605617a9035cd986a4bf77880ac5dde64"}]},"_links":{"self":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/branches/master","html":"https://ghe.workworkwork.com/myuser/cookbook1/tree/master"}}
Branch(name="master")
AttributeError: 'Branch' object has no attribute 'protection_url'
Juga tidak ada metode di sana:
print master.get_required_status_checks()
OUTPUT:
AttributeError: 'Branch' object has no attribute 'get_required_status_checks'
Atau atribut ini:
print master.protection
OUTPUT:
return self._protected.value
AttributeError: 'Branch' object has no attribute '_protected'
Objek terlihat seperti ini:
print dir(master)
OUTPUT:
['CHECK_AFTER_INIT_FLAG', '_GithubObject__makeSimpleAttribute', '_GithubObject__makeSimpleListAttribute', '_GithubObject__makeTransformedAttribute', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_commit', '_completeIfNeeded', '_headers', '_initAttributes', '_makeBoolAttribute', '_makeClassAttribute', '_makeDatetimeAttribute', '_makeDictAttribute', '_makeDictOfStringsToClassesAttribute', '_makeIntAttribute', '_makeListOfClassesAttribute', '_makeListOfIntsAttribute', '_makeListOfListOfStringsAttribute', '_makeListOfStringsAttribute', '_makeStringAttribute', '_makeTimestampAttribute', '_name', '_parentUrl', '_rawData', '_requester', '_storeAndUseAttributes', '_useAttributes', 'commit', 'contexts', 'enforcement_level', 'etag', 'get__repr__', 'last_modified', 'name', 'protected', 'raw_data', 'raw_headers', 'setCheckAfterInitFlag']
Sepertinya objek tidak dibuat dengan benar.
Versi PyGithub apa yang Anda gunakan? Perhatikan bahwa #790 baru saja digabungkan tetapi belum dirilis.
Saya menggunakan PyGithub-1.40 dan Github Enterprise 2.8.6.
https://github.com/PyGithub/PyGithub/pull/790 jelas terlihat menjanjikan, meskipun versi GHE perusahaan saya sedikit ketinggalan zaman, jadi saya tidak yakin apakah perubahan API memengaruhinya.
UPDATE: dalam proses pengujian master terbaru
Sepertinya penggabungan terbaru memperbaiki masalah atribut dan metode yang hilang, tetapi tampaknya tidak kompatibel dengan versi API saya:
master = g.get_user("ganderson").get_repo('cookbook1').get_branch('master')
print master.protection_url
master.get_protection()
KELUARAN:
None
Traceback (most recent call last):
File "test_pygithub.py", line 12, in <module>
master.get_protection()
File "/Users/me/tmp/ghe-python/venv/lib/python2.7/site-packages/github/Branch.py", line 102, in get_protection
self.protection_url
File "/Users/me/tmp/ghe-python/venv/lib/python2.7/site-packages/github/Requester.py", line 260, in requestJsonAndCheck
return self.__check(*self.requestJson(verb, url, parameters, headers, input, self.__customConnection(url)))
File "/Users/me/tmp/ghe-python/venv/lib/python2.7/site-packages/github/Requester.py", line 276, in __customConnection
if not url.startswith("/"):
AttributeError: 'NoneType' object has no attribute 'startswith'
Ini tampaknya menjadi masalah terpisah, jadi saya akan menutup tiket ini. Terima kasih.
Apakah mengangkat masalah baru jika master istirahat.
Ini juga tampaknya rusak untuk saya di 1.43.2 pada api.github.com standar
Saya memiliki 2 cabang yang dilindungi tetapi objek Cabang tidak pernah mendapatkan set protection_url.
URL perlindungan tidak disetel dan menghasilkan kesalahan untuk apa pun yang menggunakannya untuk membuat URL.
[
{
"name": "develop",
"commit": {
"sha": "XXXX",
"url": "https://api.github.com/repos/X/X/commits/X"
}
},
{
"name": "master",
"commit": {
"sha": "X",
"url": "https://api.github.com/repos/X/X/commits/X"
}
}
]
Jika saya menggulung menggunakan branches?protected=true
maka akan mengembalikan protection_url di payload.
[
{
"name": "develop",
"commit": {
"sha": "X",
"url": "https://api.github.com/repos/X/X/commits/X"
},
"protected": true,
"protection": {
"enabled": true,
"required_status_checks": {
"enforcement_level": "off",
"contexts": [
]
}
},
"protection_url": "https://api.github.com/repos/X/X/branches/develop/protection"
},
{
"name": "master",
"commit": {
"sha": "X",
"url": "https://api.github.com/repos/X/X/commits/X"
},
"protected": true,
"protection": {
"enabled": true,
"required_status_checks": {
"enforcement_level": "off",
"contexts": [
]
}
},
"protection_url": "https://api.github.com/repos/X/X/branches/master/protection"
}
]
Saya membuka kembali masalah atas nama pemberi komentar terakhir
Bisakah Anda mencoba mendapatkan cabang tunggal dengan get_branch("master")
? Saya pikir masalahnya mungkin metode get_branches
ini tidak mendukung parameter protected
.
Saya menghabiskan sedikit waktu untuk men-debug masalah ini dan memunculkan bug terhadap GitHub v3 API.
Saya mengalami masalah ini ketika mengembangkan kode perlindungan cabang -- Repository.get_branches() mengembalikan daftar
cabang, tetapi GitHub tidak mengembalikan informasi yang cukup agar metode di Cabang berguna. Jika Anda ingin menggunakan fitur proteksi, Anda harus memanggil Repository.get_branch('name').
Saya mengalami masalah ini ketika mengembangkan kode perlindungan cabang -- Repository.get_branches() mengembalikan daftar
cabang, tetapi GitHub tidak mengembalikan informasi yang cukup agar metode di Cabang berguna. Jika Anda ingin menggunakan fitur proteksi, Anda harus memanggil Repository.get_branch('name').
Terima kasih, saya mengalami masalah ini hari ini, solusi ini menyelamatkan saya banyak waktu dan frustrasi!
Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.
Komentar yang paling membantu
Saya mengalami masalah ini ketika mengembangkan kode perlindungan cabang -- Repository.get_branches() mengembalikan daftar
cabang, tetapi GitHub tidak mengembalikan informasi yang cukup agar metode di Cabang berguna. Jika Anda ingin menggunakan fitur proteksi, Anda harus memanggil Repository.get_branch('name').