gitcode-api 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1458 @@
1
+ """Repository, contents, branch, and commit resource groups."""
2
+
3
+ from typing import Any, List
4
+
5
+ from .._models import (
6
+ APIObject,
7
+ Blob,
8
+ Branch,
9
+ Commit,
10
+ CommitComment,
11
+ CommitComparison,
12
+ CommitResult,
13
+ ContentObject,
14
+ Contributor,
15
+ ProtectedBranch,
16
+ Repository,
17
+ Tree,
18
+ UserSummary,
19
+ as_model,
20
+ )
21
+ from ._shared import AsyncResource, SyncResource
22
+
23
+
24
+ class ReposResource(SyncResource):
25
+ """Synchronous repository endpoints."""
26
+
27
+ def get(self, *, owner: str | None = None, repo: str | None = None) -> Repository:
28
+ """Get a repository.
29
+
30
+ :param owner: Repository owner path. Uses the client default when omitted.
31
+ :param repo: Repository name. Uses the client default when omitted.
32
+ :returns: Repository metadata.
33
+ """
34
+ return self._model("GET", self._client._repo_path(owner=owner, repo=repo), Repository)
35
+
36
+ def list_user(
37
+ self,
38
+ *,
39
+ visibility: str | None = None,
40
+ affiliation: str | None = None,
41
+ type: str | None = None,
42
+ sort: str | None = None,
43
+ direction: str | None = None,
44
+ q: str | None = None,
45
+ page: int | None = None,
46
+ per_page: int | None = None,
47
+ ) -> List[Repository]:
48
+ """List repositories visible to the authenticated user.
49
+
50
+ :param visibility: Visibility filter such as ``public``, ``private``, or ``all``.
51
+ :param affiliation: Ownership filter accepted by the REST API.
52
+ :param type: Repository type filter.
53
+ :param sort: Sort field such as ``created`` or ``full_name``.
54
+ :param direction: Sort direction.
55
+ :param q: Optional keyword filter.
56
+ :param page: Page number.
57
+ :param per_page: Page size.
58
+ :returns: Matching repositories.
59
+ """
60
+ return self._models(
61
+ "GET",
62
+ self._client._path("user", "repos"),
63
+ Repository,
64
+ params={
65
+ "visibility": visibility,
66
+ "affiliation": affiliation,
67
+ "type": type,
68
+ "sort": sort,
69
+ "direction": direction,
70
+ "q": q,
71
+ "page": page,
72
+ "per_page": per_page,
73
+ },
74
+ )
75
+
76
+ def list_for_owner(
77
+ self,
78
+ *,
79
+ owner: str,
80
+ type: str | None = None,
81
+ sort: str | None = None,
82
+ direction: str | None = None,
83
+ page: int | None = None,
84
+ per_page: int | None = None,
85
+ ) -> List[Repository]:
86
+ """List public repositories for a user or owner path.
87
+
88
+ :param owner: Repository owner path or username.
89
+ :param type: Repository type filter.
90
+ :param sort: Sort field.
91
+ :param direction: Sort direction.
92
+ :param page: Page number.
93
+ :param per_page: Page size.
94
+ :returns: Matching repositories.
95
+ """
96
+ return self._models(
97
+ "GET",
98
+ self._client._path("users", owner, "repos"),
99
+ Repository,
100
+ params={
101
+ "type": type,
102
+ "sort": sort,
103
+ "direction": direction,
104
+ "page": page,
105
+ "per_page": per_page,
106
+ },
107
+ )
108
+
109
+ def create_personal(
110
+ self,
111
+ *,
112
+ name: str,
113
+ description: str | None = None,
114
+ path: str | None = None,
115
+ private: bool | None = None,
116
+ auto_init: bool | None = None,
117
+ has_issues: bool | None = None,
118
+ has_wiki: bool | None = None,
119
+ default_branch: str | None = None,
120
+ gitignore_template: str | None = None,
121
+ license_template: str | None = None,
122
+ ) -> Repository:
123
+ """Create a repository for the authenticated user.
124
+
125
+ :param name: Repository name.
126
+ :param description: Repository description.
127
+ :param path: Optional repository path.
128
+ :param private: Whether the repository should be private.
129
+ :param auto_init: Whether to initialize the repository with a README.
130
+ :param has_issues: Whether issues are enabled.
131
+ :param has_wiki: Whether wiki support is enabled.
132
+ :param default_branch: Default branch name when initializing.
133
+ :param gitignore_template: Optional gitignore template.
134
+ :param license_template: Optional license template.
135
+ :returns: Created repository metadata.
136
+ """
137
+ return self._model(
138
+ "POST",
139
+ self._client._path("user", "repos"),
140
+ Repository,
141
+ json={
142
+ "name": name,
143
+ "description": description,
144
+ "path": path,
145
+ "private": private,
146
+ "auto_init": auto_init,
147
+ "has_issues": has_issues,
148
+ "has_wiki": has_wiki,
149
+ "default_branch": default_branch,
150
+ "gitignore_template": gitignore_template,
151
+ "license_template": license_template,
152
+ },
153
+ )
154
+
155
+ def create_for_org(
156
+ self,
157
+ *,
158
+ org: str,
159
+ name: str,
160
+ description: str | None = None,
161
+ homepage: str | None = None,
162
+ path: str | None = None,
163
+ private: bool | None = None,
164
+ public: int | None = None,
165
+ auto_init: bool | None = None,
166
+ has_issues: bool | None = None,
167
+ has_wiki: bool | None = None,
168
+ can_comment: bool | None = None,
169
+ default_branch: str | None = None,
170
+ gitignore_template: str | None = None,
171
+ license_template: str | None = None,
172
+ ) -> Repository:
173
+ """Create a repository under an organization.
174
+
175
+ :param org: Organization path or login.
176
+ :param name: Repository name.
177
+ :param description: Repository description.
178
+ :param homepage: Repository homepage URL.
179
+ :param path: Optional repository path.
180
+ :param private: Whether the repository should be private.
181
+ :param public: Visibility mode used by the GitCode API.
182
+ :param auto_init: Whether to initialize the repository with a README.
183
+ :param has_issues: Whether issues are enabled.
184
+ :param has_wiki: Whether wiki support is enabled.
185
+ :param can_comment: Whether comments are enabled.
186
+ :param default_branch: Default branch name when initializing.
187
+ :param gitignore_template: Optional gitignore template.
188
+ :param license_template: Optional license template.
189
+ :returns: Created repository metadata.
190
+ """
191
+ return self._model(
192
+ "POST",
193
+ self._client._path("orgs", org, "repos"),
194
+ Repository,
195
+ json={
196
+ "name": name,
197
+ "description": description,
198
+ "homepage": homepage,
199
+ "path": path,
200
+ "private": private,
201
+ "public": public,
202
+ "auto_init": auto_init,
203
+ "has_issues": has_issues,
204
+ "has_wiki": has_wiki,
205
+ "can_comment": can_comment,
206
+ "default_branch": default_branch,
207
+ "gitignore_template": gitignore_template,
208
+ "license_template": license_template,
209
+ },
210
+ )
211
+
212
+ def update(self, *, owner: str | None = None, repo: str | None = None, **changes: Any) -> Repository:
213
+ """Update repository metadata.
214
+
215
+ :param owner: Repository owner path. Uses the client default when omitted.
216
+ :param repo: Repository name. Uses the client default when omitted.
217
+ :param changes: Repository fields accepted by the update endpoint.
218
+ :returns: Updated repository metadata.
219
+ """
220
+ return self._model("PATCH", self._client._repo_path(owner=owner, repo=repo), Repository, json=changes)
221
+
222
+ def delete(self, *, owner: str | None = None, repo: str | None = None) -> None:
223
+ """Delete a repository.
224
+
225
+ :param owner: Repository owner path. Uses the client default when omitted.
226
+ :param repo: Repository name. Uses the client default when omitted.
227
+ """
228
+ self._request("DELETE", self._client._repo_path(owner=owner, repo=repo))
229
+
230
+ def fork(
231
+ self,
232
+ *,
233
+ owner: str | None = None,
234
+ repo: str | None = None,
235
+ namespace: str | None = None,
236
+ path: str | None = None,
237
+ name: str | None = None,
238
+ ) -> Repository:
239
+ """Fork a repository.
240
+
241
+ :param owner: Source repository owner path.
242
+ :param repo: Source repository name.
243
+ :param namespace: Optional destination namespace.
244
+ :param path: Optional destination repository path.
245
+ :param name: Optional destination repository name.
246
+ :returns: Forked repository metadata.
247
+ """
248
+ return self._model(
249
+ "POST",
250
+ self._client._repo_path("forks", owner=owner, repo=repo),
251
+ Repository,
252
+ json={"namespace": namespace, "path": path, "name": name},
253
+ )
254
+
255
+ def list_forks(
256
+ self,
257
+ *,
258
+ owner: str | None = None,
259
+ repo: str | None = None,
260
+ sort: str | None = None,
261
+ page: int | None = None,
262
+ per_page: int | None = None,
263
+ ) -> List[Repository]:
264
+ """List forks of a repository.
265
+
266
+ :param owner: Repository owner path. Uses the client default when omitted.
267
+ :param repo: Repository name. Uses the client default when omitted.
268
+ :param sort: Optional sort field.
269
+ :param page: Page number.
270
+ :param per_page: Page size.
271
+ :returns: Fork repositories.
272
+ """
273
+ return self._models(
274
+ "GET",
275
+ self._client._repo_path("forks", owner=owner, repo=repo),
276
+ Repository,
277
+ params={"sort": sort, "page": page, "per_page": per_page},
278
+ )
279
+
280
+ def list_contributors(
281
+ self,
282
+ *,
283
+ owner: str | None = None,
284
+ repo: str | None = None,
285
+ page: int | None = None,
286
+ per_page: int | None = None,
287
+ ) -> List[Contributor]:
288
+ """List repository contributors.
289
+
290
+ :param owner: Repository owner path. Uses the client default when omitted.
291
+ :param repo: Repository name. Uses the client default when omitted.
292
+ :param page: Page number.
293
+ :param per_page: Page size.
294
+ :returns: Contributors for the repository.
295
+ """
296
+ return self._models(
297
+ "GET",
298
+ self._client._repo_path("contributors", owner=owner, repo=repo),
299
+ Contributor,
300
+ params={"page": page, "per_page": per_page},
301
+ )
302
+
303
+ def list_languages(self, *, owner: str | None = None, repo: str | None = None) -> dict[str, int]:
304
+ """List language statistics for a repository.
305
+
306
+ :param owner: Repository owner path. Uses the client default when omitted.
307
+ :param repo: Repository name. Uses the client default when omitted.
308
+ :returns: Mapping of language names to byte counts.
309
+ """
310
+ return self._request("GET", self._client._repo_path("languages", owner=owner, repo=repo))
311
+
312
+ def list_stargazers(
313
+ self,
314
+ *,
315
+ owner: str | None = None,
316
+ repo: str | None = None,
317
+ page: int | None = None,
318
+ per_page: int | None = None,
319
+ ) -> List[UserSummary]:
320
+ """List users who starred a repository.
321
+
322
+ :param owner: Repository owner path. Uses the client default when omitted.
323
+ :param repo: Repository name. Uses the client default when omitted.
324
+ :param page: Page number.
325
+ :param per_page: Page size.
326
+ :returns: Users who starred the repository.
327
+ """
328
+ return self._models(
329
+ "GET",
330
+ self._client._repo_path("stargazers", owner=owner, repo=repo),
331
+ UserSummary,
332
+ params={"page": page, "per_page": per_page},
333
+ )
334
+
335
+ def list_subscribers(
336
+ self,
337
+ *,
338
+ owner: str | None = None,
339
+ repo: str | None = None,
340
+ page: int | None = None,
341
+ per_page: int | None = None,
342
+ ) -> List[UserSummary]:
343
+ """List users watching a repository.
344
+
345
+ :param owner: Repository owner path. Uses the client default when omitted.
346
+ :param repo: Repository name. Uses the client default when omitted.
347
+ :param page: Page number.
348
+ :param per_page: Page size.
349
+ :returns: Subscribers for the repository.
350
+ """
351
+ return self._models(
352
+ "GET",
353
+ self._client._repo_path("subscribers", owner=owner, repo=repo),
354
+ UserSummary,
355
+ params={"page": page, "per_page": per_page},
356
+ )
357
+
358
+ def update_module_settings(
359
+ self, *, owner: str | None = None, repo: str | None = None, **settings: Any
360
+ ) -> APIObject:
361
+ """Update repository module settings.
362
+
363
+ :param owner: Repository owner path. Uses the client default when omitted.
364
+ :param repo: Repository name. Uses the client default when omitted.
365
+ :param settings: Module settings accepted by the GitCode API.
366
+ :returns: API response payload.
367
+ """
368
+ return self._model(
369
+ "PUT",
370
+ self._client._repo_path("module", "setting", owner=owner, repo=repo),
371
+ APIObject,
372
+ json=settings,
373
+ )
374
+
375
+ def update_reviewer_settings(
376
+ self, *, owner: str | None = None, repo: str | None = None, **settings: Any
377
+ ) -> APIObject:
378
+ """Update repository reviewer settings.
379
+
380
+ :param owner: Repository owner path. Uses the client default when omitted.
381
+ :param repo: Repository name. Uses the client default when omitted.
382
+ :param settings: Reviewer settings accepted by the GitCode API.
383
+ :returns: API response payload.
384
+ """
385
+ return self._model(
386
+ "PUT",
387
+ self._client._repo_path("reviewer", owner=owner, repo=repo),
388
+ APIObject,
389
+ json=settings,
390
+ )
391
+
392
+ def set_org_repo_status(self, *, org: str, repo: str, **payload: Any) -> APIObject:
393
+ """Update organization repository status metadata.
394
+
395
+ :param org: Organization path.
396
+ :param repo: Repository path.
397
+ :param payload: Status fields accepted by the API.
398
+ :returns: API response payload.
399
+ """
400
+ return self._model("PUT", self._client._path("org", org, "repo", repo, "status"), APIObject, json=payload)
401
+
402
+ def transfer_to_org(self, *, org: str, repo: str, **payload: Any) -> APIObject:
403
+ """Transfer a repository to an organization.
404
+
405
+ :param org: Destination organization path.
406
+ :param repo: Repository path.
407
+ :param payload: Transfer options accepted by the API.
408
+ :returns: API response payload.
409
+ """
410
+ return self._model(
411
+ "POST", self._client._path("org", org, "projects", repo, "transfer"), APIObject, json=payload
412
+ )
413
+
414
+ def get_transition(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
415
+ """Get repository transition settings.
416
+
417
+ :param owner: Repository owner path. Uses the client default when omitted.
418
+ :param repo: Repository name. Uses the client default when omitted.
419
+ :returns: Transition configuration.
420
+ """
421
+ return self._model("GET", self._client._repo_path("transition", owner=owner, repo=repo), APIObject)
422
+
423
+ def update_transition(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
424
+ """Update repository transition settings.
425
+
426
+ :param owner: Repository owner path. Uses the client default when omitted.
427
+ :param repo: Repository name. Uses the client default when omitted.
428
+ :param payload: Transition settings accepted by the API.
429
+ :returns: API response payload.
430
+ """
431
+ return self._model(
432
+ "PUT", self._client._repo_path("transition", owner=owner, repo=repo), APIObject, json=payload
433
+ )
434
+
435
+ def update_push_config(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
436
+ """Update repository push configuration.
437
+
438
+ :param owner: Repository owner path. Uses the client default when omitted.
439
+ :param repo: Repository name. Uses the client default when omitted.
440
+ :param payload: Push configuration values accepted by the API.
441
+ :returns: API response payload.
442
+ """
443
+ return self._model(
444
+ "PUT", self._client._repo_path("push_config", owner=owner, repo=repo), APIObject, json=payload
445
+ )
446
+
447
+ def get_push_config(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
448
+ """Get repository push configuration.
449
+
450
+ :param owner: Repository owner path. Uses the client default when omitted.
451
+ :param repo: Repository name. Uses the client default when omitted.
452
+ :returns: Push configuration payload.
453
+ """
454
+ return self._model("GET", self._client._repo_path("push_config", owner=owner, repo=repo), APIObject)
455
+
456
+ def upload_image(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
457
+ """Upload an image asset for a repository.
458
+
459
+ :param owner: Repository owner path. Uses the client default when omitted.
460
+ :param repo: Repository name. Uses the client default when omitted.
461
+ :param payload: Upload fields accepted by the API.
462
+ :returns: Uploaded image metadata.
463
+ """
464
+ return self._model(
465
+ "POST", self._client._repo_path("img", "upload", owner=owner, repo=repo), APIObject, json=payload
466
+ )
467
+
468
+ def upload_file(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
469
+ """Upload a file asset for a repository.
470
+
471
+ :param owner: Repository owner path. Uses the client default when omitted.
472
+ :param repo: Repository name. Uses the client default when omitted.
473
+ :param payload: Upload fields accepted by the API.
474
+ :returns: Uploaded file metadata.
475
+ """
476
+ return self._model(
477
+ "POST", self._client._repo_path("file", "upload", owner=owner, repo=repo), APIObject, json=payload
478
+ )
479
+
480
+ def update_repo_settings(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
481
+ """Update repository settings.
482
+
483
+ :param owner: Repository owner path. Uses the client default when omitted.
484
+ :param repo: Repository name. Uses the client default when omitted.
485
+ :param payload: Settings fields accepted by the API.
486
+ :returns: API response payload.
487
+ """
488
+ return self._model(
489
+ "PUT", self._client._repo_path("repo_settings", owner=owner, repo=repo), APIObject, json=payload
490
+ )
491
+
492
+ def get_repo_settings(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
493
+ """Get repository settings.
494
+
495
+ :param owner: Repository owner path. Uses the client default when omitted.
496
+ :param repo: Repository name. Uses the client default when omitted.
497
+ :returns: Repository settings payload.
498
+ """
499
+ return self._model("GET", self._client._repo_path("repo_settings", owner=owner, repo=repo), APIObject)
500
+
501
+ def get_pull_request_settings(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
502
+ """Get pull request settings for a repository.
503
+
504
+ :param owner: Repository owner path. Uses the client default when omitted.
505
+ :param repo: Repository name. Uses the client default when omitted.
506
+ :returns: Pull request settings payload.
507
+ """
508
+ return self._model("GET", self._client._repo_path("pull_request_settings", owner=owner, repo=repo), APIObject)
509
+
510
+ def update_pull_request_settings(
511
+ self, *, owner: str | None = None, repo: str | None = None, **payload: Any
512
+ ) -> APIObject:
513
+ """Update pull request settings for a repository.
514
+
515
+ :param owner: Repository owner path. Uses the client default when omitted.
516
+ :param repo: Repository name. Uses the client default when omitted.
517
+ :param payload: Pull request settings accepted by the API.
518
+ :returns: API response payload.
519
+ """
520
+ return self._model(
521
+ "PUT",
522
+ self._client._repo_path("pull_request_settings", owner=owner, repo=repo),
523
+ APIObject,
524
+ json=payload,
525
+ )
526
+
527
+ def set_member_role(
528
+ self,
529
+ *,
530
+ username: str,
531
+ owner: str | None = None,
532
+ repo: str | None = None,
533
+ permission: str | None = None,
534
+ ) -> APIObject:
535
+ """Set a repository member role.
536
+
537
+ :param username: Member username or login.
538
+ :param owner: Repository owner path. Uses the client default when omitted.
539
+ :param repo: Repository name. Uses the client default when omitted.
540
+ :param permission: Permission or role name accepted by the API.
541
+ :returns: API response payload.
542
+ """
543
+ return self._model(
544
+ "PUT",
545
+ self._client._repo_path("members", username, owner=owner, repo=repo),
546
+ APIObject,
547
+ json={"permission": permission},
548
+ )
549
+
550
+ def transfer(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
551
+ """Transfer a repository to another owner or namespace.
552
+
553
+ :param owner: Repository owner path. Uses the client default when omitted.
554
+ :param repo: Repository name. Uses the client default when omitted.
555
+ :param payload: Transfer options accepted by the API.
556
+ :returns: API response payload.
557
+ """
558
+ return self._model("POST", self._client._repo_path("transfer", owner=owner, repo=repo), APIObject, json=payload)
559
+
560
+ def list_customized_roles(self, *, owner: str | None = None, repo: str | None = None) -> List[APIObject]:
561
+ """List customized roles for a repository.
562
+
563
+ :param owner: Repository owner path. Uses the client default when omitted.
564
+ :param repo: Repository name. Uses the client default when omitted.
565
+ :returns: Customized role definitions.
566
+ """
567
+ data = self._request("GET", self._client._repo_path("customized_roles", owner=owner, repo=repo))
568
+ return [as_model(item, APIObject) for item in data]
569
+
570
+ def get_download_statistics(self, *, owner: str | None = None, repo: str | None = None, **params: Any) -> APIObject:
571
+ """Get download statistics for a repository.
572
+
573
+ :param owner: Repository owner path. Uses the client default when omitted.
574
+ :param repo: Repository name. Uses the client default when omitted.
575
+ :param params: Query parameters accepted by the statistics endpoint.
576
+ :returns: Download statistics payload.
577
+ """
578
+ return self._model(
579
+ "GET",
580
+ self._client._repo_path("download_statistics", owner=owner, repo=repo),
581
+ APIObject,
582
+ params=params,
583
+ )
584
+
585
+ def get_contributor_statistics(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
586
+ """Get code contribution statistics for a repository.
587
+
588
+ :param owner: Repository owner path. Uses the client default when omitted.
589
+ :param repo: Repository name. Uses the client default when omitted.
590
+ :returns: Contributor statistics payload.
591
+ """
592
+ return self._model(
593
+ "GET",
594
+ self._client._repo_path("contributors", "statistic", owner=owner, repo=repo),
595
+ APIObject,
596
+ )
597
+
598
+ def list_events(
599
+ self,
600
+ *,
601
+ owner: str | None = None,
602
+ repo: str | None = None,
603
+ page: int | None = None,
604
+ per_page: int | None = None,
605
+ ) -> List[APIObject]:
606
+ """List repository events.
607
+
608
+ :param owner: Repository owner path. Uses the client default when omitted.
609
+ :param repo: Repository name. Uses the client default when omitted.
610
+ :param page: Page number.
611
+ :param per_page: Page size.
612
+ :returns: Repository event payloads.
613
+ """
614
+ data = self._request(
615
+ "GET",
616
+ self._client._repo_path("events", owner=owner, repo=repo),
617
+ params={"page": page, "per_page": per_page},
618
+ )
619
+ return [as_model(item, APIObject) for item in data]
620
+
621
+
622
+ class RepoContentsResource(SyncResource):
623
+ """Synchronous repository contents endpoints."""
624
+
625
+ def get(
626
+ self,
627
+ *,
628
+ path: str,
629
+ owner: str | None = None,
630
+ repo: str | None = None,
631
+ ref: str | None = None,
632
+ ) -> ContentObject:
633
+ """Get a file or directory entry from a repository.
634
+
635
+ :param path: Repository-relative file path.
636
+ :param owner: Repository owner path. Uses the client default when omitted.
637
+ :param repo: Repository name. Uses the client default when omitted.
638
+ :param ref: Optional branch, tag, or commit SHA.
639
+ :returns: Content metadata and payload details.
640
+ """
641
+ return self._model(
642
+ "GET",
643
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
644
+ ContentObject,
645
+ params={"ref": ref},
646
+ )
647
+
648
+ def create(
649
+ self,
650
+ *,
651
+ path: str,
652
+ content: str,
653
+ message: str,
654
+ owner: str | None = None,
655
+ repo: str | None = None,
656
+ branch: str | None = None,
657
+ author_name: str | None = None,
658
+ author_email: str | None = None,
659
+ ) -> CommitResult:
660
+ """Create a file in a repository.
661
+
662
+ :param path: Repository-relative file path.
663
+ :param content: File content, typically base64-encoded for this API.
664
+ :param message: Commit message.
665
+ :param owner: Repository owner path. Uses the client default when omitted.
666
+ :param repo: Repository name. Uses the client default when omitted.
667
+ :param branch: Optional target branch.
668
+ :param author_name: Optional commit author name.
669
+ :param author_email: Optional commit author email.
670
+ :returns: Commit result payload.
671
+ """
672
+ return self._model(
673
+ "POST",
674
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
675
+ CommitResult,
676
+ json={
677
+ "content": content,
678
+ "message": message,
679
+ "branch": branch,
680
+ "author": {"name": author_name, "email": author_email},
681
+ },
682
+ )
683
+
684
+ def update(
685
+ self,
686
+ *,
687
+ path: str,
688
+ content: str,
689
+ message: str,
690
+ sha: str,
691
+ owner: str | None = None,
692
+ repo: str | None = None,
693
+ branch: str | None = None,
694
+ author_name: str | None = None,
695
+ author_email: str | None = None,
696
+ ) -> CommitResult:
697
+ """Update a file in a repository.
698
+
699
+ :param path: Repository-relative file path.
700
+ :param content: Updated file content, typically base64-encoded.
701
+ :param message: Commit message.
702
+ :param sha: Current blob SHA required by the API.
703
+ :param owner: Repository owner path. Uses the client default when omitted.
704
+ :param repo: Repository name. Uses the client default when omitted.
705
+ :param branch: Optional target branch.
706
+ :param author_name: Optional commit author name.
707
+ :param author_email: Optional commit author email.
708
+ :returns: Commit result payload.
709
+ """
710
+ return self._model(
711
+ "PUT",
712
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
713
+ CommitResult,
714
+ json={
715
+ "content": content,
716
+ "message": message,
717
+ "sha": sha,
718
+ "branch": branch,
719
+ "author": {"name": author_name, "email": author_email},
720
+ },
721
+ )
722
+
723
+ def delete(
724
+ self,
725
+ *,
726
+ path: str,
727
+ message: str,
728
+ sha: str,
729
+ owner: str | None = None,
730
+ repo: str | None = None,
731
+ branch: str | None = None,
732
+ author_name: str | None = None,
733
+ author_email: str | None = None,
734
+ ) -> CommitResult:
735
+ """Delete a file from a repository.
736
+
737
+ :param path: Repository-relative file path.
738
+ :param message: Commit message.
739
+ :param sha: Current blob SHA required by the API.
740
+ :param owner: Repository owner path. Uses the client default when omitted.
741
+ :param repo: Repository name. Uses the client default when omitted.
742
+ :param branch: Optional target branch.
743
+ :param author_name: Optional commit author name.
744
+ :param author_email: Optional commit author email.
745
+ :returns: Commit result payload.
746
+ """
747
+ return self._model(
748
+ "DELETE",
749
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
750
+ CommitResult,
751
+ json={
752
+ "message": message,
753
+ "sha": sha,
754
+ "branch": branch,
755
+ "author": {"name": author_name, "email": author_email},
756
+ },
757
+ )
758
+
759
+ def list_paths(
760
+ self,
761
+ *,
762
+ owner: str | None = None,
763
+ repo: str | None = None,
764
+ ref_name: str | None = None,
765
+ file_name: str | None = None,
766
+ ) -> List[str]:
767
+ """List repository paths known to GitCode.
768
+
769
+ :param owner: Repository owner path. Uses the client default when omitted.
770
+ :param repo: Repository name. Uses the client default when omitted.
771
+ :param ref_name: Optional ref name to inspect.
772
+ :param file_name: Optional filename filter.
773
+ :returns: Matching repository paths.
774
+ """
775
+ return self._request(
776
+ "GET",
777
+ self._client._repo_path("file_list", owner=owner, repo=repo),
778
+ params={"ref_name": ref_name, "file_name": file_name},
779
+ )
780
+
781
+ def get_tree(
782
+ self,
783
+ *,
784
+ sha: str,
785
+ owner: str | None = None,
786
+ repo: str | None = None,
787
+ recursive: int | None = None,
788
+ page: int | None = None,
789
+ per_page: int | None = None,
790
+ ) -> Tree:
791
+ """Get a Git tree object.
792
+
793
+ :param sha: Tree SHA.
794
+ :param owner: Repository owner path. Uses the client default when omitted.
795
+ :param repo: Repository name. Uses the client default when omitted.
796
+ :param recursive: Whether to traverse recursively.
797
+ :param page: Page number for large trees.
798
+ :param per_page: Page size for large trees.
799
+ :returns: Tree metadata and entries.
800
+ """
801
+ return self._model(
802
+ "GET",
803
+ self._client._repo_path("git", "trees", sha, owner=owner, repo=repo),
804
+ Tree,
805
+ params={"recursive": recursive, "page": page, "per_page": per_page},
806
+ )
807
+
808
+ def get_blob(self, *, sha: str, owner: str | None = None, repo: str | None = None) -> Blob:
809
+ """Get a Git blob object by SHA.
810
+
811
+ :param sha: Blob SHA.
812
+ :param owner: Repository owner path. Uses the client default when omitted.
813
+ :param repo: Repository name. Uses the client default when omitted.
814
+ :returns: Blob metadata and content.
815
+ """
816
+ return self._model("GET", self._client._repo_path("git", "blobs", sha, owner=owner, repo=repo), Blob)
817
+
818
+ def get_raw(
819
+ self,
820
+ *,
821
+ path: str,
822
+ owner: str | None = None,
823
+ repo: str | None = None,
824
+ ref: str | None = None,
825
+ ) -> bytes:
826
+ """Download raw file bytes from a repository.
827
+
828
+ :param path: Repository-relative file path.
829
+ :param owner: Repository owner path. Uses the client default when omitted.
830
+ :param repo: Repository name. Uses the client default when omitted.
831
+ :param ref: Optional branch, tag, or commit SHA.
832
+ :returns: Raw file bytes.
833
+ """
834
+ return self._request(
835
+ "GET",
836
+ self._client._repo_file_path("raw", path, owner=owner, repo=repo),
837
+ params={"ref": ref},
838
+ raw=True,
839
+ )
840
+
841
+
842
+ class BranchesResource(SyncResource):
843
+ """Synchronous branch endpoints."""
844
+
845
+ def list(
846
+ self,
847
+ *,
848
+ owner: str | None = None,
849
+ repo: str | None = None,
850
+ sort: str | None = None,
851
+ direction: str | None = None,
852
+ page: int | None = None,
853
+ per_page: int | None = None,
854
+ ) -> List[Branch]:
855
+ """List branches in a repository.
856
+
857
+ :param owner: Repository owner path. Uses the client default when omitted.
858
+ :param repo: Repository name. Uses the client default when omitted.
859
+ :param sort: Optional sort field such as ``name`` or ``updated``.
860
+ :param direction: Sort direction, usually ``asc`` or ``desc``.
861
+ :param page: Page number.
862
+ :param per_page: Page size.
863
+ :returns: Repository branches.
864
+ """
865
+ return self._models(
866
+ "GET",
867
+ self._client._repo_path("branches", owner=owner, repo=repo),
868
+ Branch,
869
+ params={"sort": sort, "direction": direction, "page": page, "per_page": per_page},
870
+ )
871
+
872
+ def get(self, *, branch: str, owner: str | None = None, repo: str | None = None) -> Branch:
873
+ """Get a single branch.
874
+
875
+ :param branch: Branch name.
876
+ :param owner: Repository owner path. Uses the client default when omitted.
877
+ :param repo: Repository name. Uses the client default when omitted.
878
+ :returns: Branch details.
879
+ """
880
+ return self._model("GET", self._client._repo_path("branches", branch, owner=owner, repo=repo), Branch)
881
+
882
+ def create(self, *, branch: str, ref: str, owner: str | None = None, repo: str | None = None) -> Branch:
883
+ """Create a branch from an existing ref.
884
+
885
+ :param branch: New branch name.
886
+ :param ref: Starting ref such as a branch, tag, or commit SHA.
887
+ :param owner: Repository owner path. Uses the client default when omitted.
888
+ :param repo: Repository name. Uses the client default when omitted.
889
+ :returns: Created branch details.
890
+ """
891
+ return self._model(
892
+ "POST",
893
+ self._client._repo_path("branches", owner=owner, repo=repo),
894
+ Branch,
895
+ json={"branch_name": branch, "refs": ref},
896
+ )
897
+
898
+ def list_protected(self, *, owner: str | None = None, repo: str | None = None) -> List[ProtectedBranch]:
899
+ """List protected branch rules for a repository.
900
+
901
+ :param owner: Repository owner path. Uses the client default when omitted.
902
+ :param repo: Repository name. Uses the client default when omitted.
903
+ :returns: Protected branch rules.
904
+ """
905
+ return self._models(
906
+ "GET",
907
+ self._client._repo_path("protect_branches", owner=owner, repo=repo),
908
+ ProtectedBranch,
909
+ )
910
+
911
+
912
+ class CommitsResource(SyncResource):
913
+ """Synchronous commit endpoints."""
914
+
915
+ def list(
916
+ self,
917
+ *,
918
+ owner: str | None = None,
919
+ repo: str | None = None,
920
+ sha: str | None = None,
921
+ path: str | None = None,
922
+ page: int | None = None,
923
+ per_page: int | None = None,
924
+ ) -> List[Commit]:
925
+ """List commits in a repository.
926
+
927
+ :param owner: Repository owner path. Uses the client default when omitted.
928
+ :param repo: Repository name. Uses the client default when omitted.
929
+ :param sha: Optional starting SHA or ref.
930
+ :param path: Optional file path filter.
931
+ :param page: Page number.
932
+ :param per_page: Page size.
933
+ :returns: Matching commits.
934
+ """
935
+ return self._models(
936
+ "GET",
937
+ self._client._repo_path("commits", owner=owner, repo=repo),
938
+ Commit,
939
+ params={"sha": sha, "path": path, "page": page, "per_page": per_page},
940
+ )
941
+
942
+ def get(self, *, sha: str, owner: str | None = None, repo: str | None = None) -> Commit:
943
+ """Get a single commit.
944
+
945
+ :param sha: Commit SHA or branch name accepted by the API.
946
+ :param owner: Repository owner path. Uses the client default when omitted.
947
+ :param repo: Repository name. Uses the client default when omitted.
948
+ :returns: Commit details.
949
+ """
950
+ return self._model("GET", self._client._repo_path("commits", sha, owner=owner, repo=repo), Commit)
951
+
952
+ def compare(self, *, base: str, head: str, owner: str | None = None, repo: str | None = None) -> CommitComparison:
953
+ """Compare two refs in a repository.
954
+
955
+ :param base: Base commit SHA, branch, or tag.
956
+ :param head: Head commit SHA, branch, or tag.
957
+ :param owner: Repository owner path. Uses the client default when omitted.
958
+ :param repo: Repository name. Uses the client default when omitted.
959
+ :returns: Commit comparison payload.
960
+ """
961
+ return self._model(
962
+ "GET",
963
+ self._client._repo_path("compare", f"{base}...{head}", owner=owner, repo=repo),
964
+ CommitComparison,
965
+ )
966
+
967
+ def list_comments(
968
+ self,
969
+ *,
970
+ owner: str | None = None,
971
+ repo: str | None = None,
972
+ page: int | None = None,
973
+ per_page: int | None = None,
974
+ ) -> List[CommitComment]:
975
+ """List commit comments for a repository.
976
+
977
+ :param owner: Repository owner path. Uses the client default when omitted.
978
+ :param repo: Repository name. Uses the client default when omitted.
979
+ :param page: Page number.
980
+ :param per_page: Page size.
981
+ :returns: Commit comments.
982
+ """
983
+ return self._models(
984
+ "GET",
985
+ self._client._repo_path("comments", owner=owner, repo=repo),
986
+ CommitComment,
987
+ params={"page": page, "per_page": per_page},
988
+ )
989
+
990
+ def get_comment(
991
+ self,
992
+ *,
993
+ comment_id: int | str,
994
+ owner: str | None = None,
995
+ repo: str | None = None,
996
+ ) -> CommitComment:
997
+ """Get a single commit comment.
998
+
999
+ :param comment_id: Commit comment identifier.
1000
+ :param owner: Repository owner path. Uses the client default when omitted.
1001
+ :param repo: Repository name. Uses the client default when omitted.
1002
+ :returns: Commit comment details.
1003
+ """
1004
+ return self._model(
1005
+ "GET", self._client._repo_path("comments", comment_id, owner=owner, repo=repo), CommitComment
1006
+ )
1007
+
1008
+ def create_comment(
1009
+ self,
1010
+ *,
1011
+ sha: str,
1012
+ body: str,
1013
+ owner: str | None = None,
1014
+ repo: str | None = None,
1015
+ path: str | None = None,
1016
+ position: int | None = None,
1017
+ ) -> CommitComment:
1018
+ """Create a comment on a commit.
1019
+
1020
+ :param sha: Commit SHA.
1021
+ :param body: Comment body.
1022
+ :param owner: Repository owner path. Uses the client default when omitted.
1023
+ :param repo: Repository name. Uses the client default when omitted.
1024
+ :param path: Optional file path associated with the comment.
1025
+ :param position: Optional diff position.
1026
+ :returns: Created commit comment.
1027
+ """
1028
+ return self._model(
1029
+ "POST",
1030
+ self._client._repo_path("commits", sha, "comments", owner=owner, repo=repo),
1031
+ CommitComment,
1032
+ json={"body": body, "path": path, "position": position},
1033
+ )
1034
+
1035
+ def update_comment(
1036
+ self,
1037
+ *,
1038
+ comment_id: int | str,
1039
+ body: str,
1040
+ owner: str | None = None,
1041
+ repo: str | None = None,
1042
+ ) -> CommitComment:
1043
+ """Update a commit comment.
1044
+
1045
+ :param comment_id: Commit comment identifier.
1046
+ :param body: Updated comment body.
1047
+ :param owner: Repository owner path. Uses the client default when omitted.
1048
+ :param repo: Repository name. Uses the client default when omitted.
1049
+ :returns: Updated commit comment.
1050
+ """
1051
+ return self._model(
1052
+ "PATCH",
1053
+ self._client._repo_path("comments", comment_id, owner=owner, repo=repo),
1054
+ CommitComment,
1055
+ json={"body": body},
1056
+ )
1057
+
1058
+ def delete_comment(self, *, comment_id: int | str, owner: str | None = None, repo: str | None = None) -> None:
1059
+ """Delete a commit comment.
1060
+
1061
+ :param comment_id: Commit comment identifier.
1062
+ :param owner: Repository owner path. Uses the client default when omitted.
1063
+ :param repo: Repository name. Uses the client default when omitted.
1064
+ """
1065
+ self._request("DELETE", self._client._repo_path("comments", comment_id, owner=owner, repo=repo))
1066
+
1067
+
1068
+ class AsyncReposResource(AsyncResource):
1069
+ """Asynchronous repository endpoints."""
1070
+
1071
+ async def get(self, *, owner: str | None = None, repo: str | None = None) -> Repository:
1072
+ return await self._model("GET", self._client._repo_path(owner=owner, repo=repo), Repository)
1073
+
1074
+ async def list_user(self, **params: Any) -> List[Repository]:
1075
+ return await self._models("GET", self._client._path("user", "repos"), Repository, params=params)
1076
+
1077
+ async def list_for_owner(self, *, owner: str, **params: Any) -> List[Repository]:
1078
+ return await self._models("GET", self._client._path("users", owner, "repos"), Repository, params=params)
1079
+
1080
+ async def create_personal(self, *, name: str, **payload: Any) -> Repository:
1081
+ payload["name"] = name
1082
+ return await self._model("POST", self._client._path("user", "repos"), Repository, json=payload)
1083
+
1084
+ async def create_for_org(self, *, org: str, name: str, **payload: Any) -> Repository:
1085
+ payload["name"] = name
1086
+ return await self._model("POST", self._client._path("orgs", org, "repos"), Repository, json=payload)
1087
+
1088
+ async def update(self, *, owner: str | None = None, repo: str | None = None, **changes: Any) -> Repository:
1089
+ return await self._model("PATCH", self._client._repo_path(owner=owner, repo=repo), Repository, json=changes)
1090
+
1091
+ async def delete(self, *, owner: str | None = None, repo: str | None = None) -> None:
1092
+ await self._request("DELETE", self._client._repo_path(owner=owner, repo=repo))
1093
+
1094
+ async def fork(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> Repository:
1095
+ return await self._model(
1096
+ "POST", self._client._repo_path("forks", owner=owner, repo=repo), Repository, json=payload
1097
+ )
1098
+
1099
+ async def list_forks(self, *, owner: str | None = None, repo: str | None = None, **params: Any) -> List[Repository]:
1100
+ return await self._models(
1101
+ "GET", self._client._repo_path("forks", owner=owner, repo=repo), Repository, params=params
1102
+ )
1103
+
1104
+ async def list_contributors(
1105
+ self, *, owner: str | None = None, repo: str | None = None, **params: Any
1106
+ ) -> List[Contributor]:
1107
+ return await self._models(
1108
+ "GET",
1109
+ self._client._repo_path("contributors", owner=owner, repo=repo),
1110
+ Contributor,
1111
+ params=params,
1112
+ )
1113
+
1114
+ async def list_languages(self, *, owner: str | None = None, repo: str | None = None) -> dict[str, int]:
1115
+ return await self._request("GET", self._client._repo_path("languages", owner=owner, repo=repo))
1116
+
1117
+ async def list_stargazers(
1118
+ self, *, owner: str | None = None, repo: str | None = None, **params: Any
1119
+ ) -> List[UserSummary]:
1120
+ return await self._models(
1121
+ "GET", self._client._repo_path("stargazers", owner=owner, repo=repo), UserSummary, params=params
1122
+ )
1123
+
1124
+ async def list_subscribers(
1125
+ self, *, owner: str | None = None, repo: str | None = None, **params: Any
1126
+ ) -> List[UserSummary]:
1127
+ return await self._models(
1128
+ "GET",
1129
+ self._client._repo_path("subscribers", owner=owner, repo=repo),
1130
+ UserSummary,
1131
+ params=params,
1132
+ )
1133
+
1134
+ async def update_module_settings(
1135
+ self, *, owner: str | None = None, repo: str | None = None, **settings: Any
1136
+ ) -> APIObject:
1137
+ return await self._model(
1138
+ "PUT", self._client._repo_path("module", "setting", owner=owner, repo=repo), APIObject, json=settings
1139
+ )
1140
+
1141
+ async def update_reviewer_settings(
1142
+ self, *, owner: str | None = None, repo: str | None = None, **settings: Any
1143
+ ) -> APIObject:
1144
+ return await self._model(
1145
+ "PUT", self._client._repo_path("reviewer", owner=owner, repo=repo), APIObject, json=settings
1146
+ )
1147
+
1148
+ async def set_org_repo_status(self, *, org: str, repo: str, **payload: Any) -> APIObject:
1149
+ return await self._model("PUT", self._client._path("org", org, "repo", repo, "status"), APIObject, json=payload)
1150
+
1151
+ async def transfer_to_org(self, *, org: str, repo: str, **payload: Any) -> APIObject:
1152
+ return await self._model(
1153
+ "POST", self._client._path("org", org, "projects", repo, "transfer"), APIObject, json=payload
1154
+ )
1155
+
1156
+ async def get_transition(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
1157
+ return await self._model("GET", self._client._repo_path("transition", owner=owner, repo=repo), APIObject)
1158
+
1159
+ async def update_transition(
1160
+ self, *, owner: str | None = None, repo: str | None = None, **payload: Any
1161
+ ) -> APIObject:
1162
+ return await self._model(
1163
+ "PUT", self._client._repo_path("transition", owner=owner, repo=repo), APIObject, json=payload
1164
+ )
1165
+
1166
+ async def update_push_config(
1167
+ self, *, owner: str | None = None, repo: str | None = None, **payload: Any
1168
+ ) -> APIObject:
1169
+ return await self._model(
1170
+ "PUT", self._client._repo_path("push_config", owner=owner, repo=repo), APIObject, json=payload
1171
+ )
1172
+
1173
+ async def get_push_config(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
1174
+ return await self._model("GET", self._client._repo_path("push_config", owner=owner, repo=repo), APIObject)
1175
+
1176
+ async def upload_image(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
1177
+ return await self._model(
1178
+ "POST", self._client._repo_path("img", "upload", owner=owner, repo=repo), APIObject, json=payload
1179
+ )
1180
+
1181
+ async def upload_file(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
1182
+ return await self._model(
1183
+ "POST", self._client._repo_path("file", "upload", owner=owner, repo=repo), APIObject, json=payload
1184
+ )
1185
+
1186
+ async def update_repo_settings(
1187
+ self, *, owner: str | None = None, repo: str | None = None, **payload: Any
1188
+ ) -> APIObject:
1189
+ return await self._model(
1190
+ "PUT", self._client._repo_path("repo_settings", owner=owner, repo=repo), APIObject, json=payload
1191
+ )
1192
+
1193
+ async def get_repo_settings(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
1194
+ return await self._model("GET", self._client._repo_path("repo_settings", owner=owner, repo=repo), APIObject)
1195
+
1196
+ async def get_pull_request_settings(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
1197
+ return await self._model(
1198
+ "GET", self._client._repo_path("pull_request_settings", owner=owner, repo=repo), APIObject
1199
+ )
1200
+
1201
+ async def update_pull_request_settings(
1202
+ self, *, owner: str | None = None, repo: str | None = None, **payload: Any
1203
+ ) -> APIObject:
1204
+ return await self._model(
1205
+ "PUT", self._client._repo_path("pull_request_settings", owner=owner, repo=repo), APIObject, json=payload
1206
+ )
1207
+
1208
+ async def set_member_role(
1209
+ self, *, username: str, owner: str | None = None, repo: str | None = None, permission: str | None = None
1210
+ ) -> APIObject:
1211
+ return await self._model(
1212
+ "PUT",
1213
+ self._client._repo_path("members", username, owner=owner, repo=repo),
1214
+ APIObject,
1215
+ json={"permission": permission},
1216
+ )
1217
+
1218
+ async def transfer(self, *, owner: str | None = None, repo: str | None = None, **payload: Any) -> APIObject:
1219
+ return await self._model(
1220
+ "POST", self._client._repo_path("transfer", owner=owner, repo=repo), APIObject, json=payload
1221
+ )
1222
+
1223
+ async def list_customized_roles(self, *, owner: str | None = None, repo: str | None = None) -> List[APIObject]:
1224
+ data = await self._request("GET", self._client._repo_path("customized_roles", owner=owner, repo=repo))
1225
+ return [as_model(item, APIObject) for item in data]
1226
+
1227
+ async def get_download_statistics(
1228
+ self, *, owner: str | None = None, repo: str | None = None, **params: Any
1229
+ ) -> APIObject:
1230
+ return await self._model(
1231
+ "GET", self._client._repo_path("download_statistics", owner=owner, repo=repo), APIObject, params=params
1232
+ )
1233
+
1234
+ async def get_contributor_statistics(self, *, owner: str | None = None, repo: str | None = None) -> APIObject:
1235
+ return await self._model(
1236
+ "GET", self._client._repo_path("contributors", "statistic", owner=owner, repo=repo), APIObject
1237
+ )
1238
+
1239
+ async def list_events(self, *, owner: str | None = None, repo: str | None = None, **params: Any) -> List[APIObject]:
1240
+ data = await self._request("GET", self._client._repo_path("events", owner=owner, repo=repo), params=params)
1241
+ return [as_model(item, APIObject) for item in data]
1242
+
1243
+
1244
+ class AsyncRepoContentsResource(AsyncResource):
1245
+ """Asynchronous repository contents endpoints."""
1246
+
1247
+ async def get(
1248
+ self, *, path: str, owner: str | None = None, repo: str | None = None, ref: str | None = None
1249
+ ) -> ContentObject:
1250
+ return await self._model(
1251
+ "GET",
1252
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
1253
+ ContentObject,
1254
+ params={"ref": ref},
1255
+ )
1256
+
1257
+ async def create(
1258
+ self,
1259
+ *,
1260
+ path: str,
1261
+ content: str,
1262
+ message: str,
1263
+ owner: str | None = None,
1264
+ repo: str | None = None,
1265
+ branch: str | None = None,
1266
+ author_name: str | None = None,
1267
+ author_email: str | None = None,
1268
+ ) -> CommitResult:
1269
+ return await self._model(
1270
+ "POST",
1271
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
1272
+ CommitResult,
1273
+ json={
1274
+ "content": content,
1275
+ "message": message,
1276
+ "branch": branch,
1277
+ "author": {"name": author_name, "email": author_email},
1278
+ },
1279
+ )
1280
+
1281
+ async def update(
1282
+ self,
1283
+ *,
1284
+ path: str,
1285
+ content: str,
1286
+ message: str,
1287
+ sha: str,
1288
+ owner: str | None = None,
1289
+ repo: str | None = None,
1290
+ branch: str | None = None,
1291
+ author_name: str | None = None,
1292
+ author_email: str | None = None,
1293
+ ) -> CommitResult:
1294
+ return await self._model(
1295
+ "PUT",
1296
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
1297
+ CommitResult,
1298
+ json={
1299
+ "content": content,
1300
+ "message": message,
1301
+ "sha": sha,
1302
+ "branch": branch,
1303
+ "author": {"name": author_name, "email": author_email},
1304
+ },
1305
+ )
1306
+
1307
+ async def delete(
1308
+ self,
1309
+ *,
1310
+ path: str,
1311
+ message: str,
1312
+ sha: str,
1313
+ owner: str | None = None,
1314
+ repo: str | None = None,
1315
+ branch: str | None = None,
1316
+ author_name: str | None = None,
1317
+ author_email: str | None = None,
1318
+ ) -> CommitResult:
1319
+ return await self._model(
1320
+ "DELETE",
1321
+ self._client._repo_file_path("contents", path, owner=owner, repo=repo),
1322
+ CommitResult,
1323
+ json={
1324
+ "message": message,
1325
+ "sha": sha,
1326
+ "branch": branch,
1327
+ "author": {"name": author_name, "email": author_email},
1328
+ },
1329
+ )
1330
+
1331
+ async def list_paths(
1332
+ self,
1333
+ *,
1334
+ owner: str | None = None,
1335
+ repo: str | None = None,
1336
+ ref_name: str | None = None,
1337
+ file_name: str | None = None,
1338
+ ) -> List[str]:
1339
+ return await self._request(
1340
+ "GET",
1341
+ self._client._repo_path("file_list", owner=owner, repo=repo),
1342
+ params={"ref_name": ref_name, "file_name": file_name},
1343
+ )
1344
+
1345
+ async def get_tree(
1346
+ self,
1347
+ *,
1348
+ sha: str,
1349
+ owner: str | None = None,
1350
+ repo: str | None = None,
1351
+ recursive: int | None = None,
1352
+ page: int | None = None,
1353
+ per_page: int | None = None,
1354
+ ) -> Tree:
1355
+ return await self._model(
1356
+ "GET",
1357
+ self._client._repo_path("git", "trees", sha, owner=owner, repo=repo),
1358
+ Tree,
1359
+ params={"recursive": recursive, "page": page, "per_page": per_page},
1360
+ )
1361
+
1362
+ async def get_blob(self, *, sha: str, owner: str | None = None, repo: str | None = None) -> Blob:
1363
+ return await self._model("GET", self._client._repo_path("git", "blobs", sha, owner=owner, repo=repo), Blob)
1364
+
1365
+ async def get_raw(
1366
+ self, *, path: str, owner: str | None = None, repo: str | None = None, ref: str | None = None
1367
+ ) -> bytes:
1368
+ return await self._request(
1369
+ "GET", self._client._repo_file_path("raw", path, owner=owner, repo=repo), params={"ref": ref}, raw=True
1370
+ )
1371
+
1372
+
1373
+ class AsyncBranchesResource(AsyncResource):
1374
+ """Asynchronous branch endpoints."""
1375
+
1376
+ async def list(self, *, owner: str | None = None, repo: str | None = None, **params: Any) -> List[Branch]:
1377
+ return await self._models(
1378
+ "GET", self._client._repo_path("branches", owner=owner, repo=repo), Branch, params=params
1379
+ )
1380
+
1381
+ async def get(self, *, branch: str, owner: str | None = None, repo: str | None = None) -> Branch:
1382
+ return await self._model("GET", self._client._repo_path("branches", branch, owner=owner, repo=repo), Branch)
1383
+
1384
+ async def create(self, *, branch: str, ref: str, owner: str | None = None, repo: str | None = None) -> Branch:
1385
+ return await self._model(
1386
+ "POST",
1387
+ self._client._repo_path("branches", owner=owner, repo=repo),
1388
+ Branch,
1389
+ json={"branch_name": branch, "refs": ref},
1390
+ )
1391
+
1392
+ async def list_protected(self, *, owner: str | None = None, repo: str | None = None) -> List[ProtectedBranch]:
1393
+ return await self._models(
1394
+ "GET", self._client._repo_path("protect_branches", owner=owner, repo=repo), ProtectedBranch
1395
+ )
1396
+
1397
+
1398
+ class AsyncCommitsResource(AsyncResource):
1399
+ """Asynchronous commit endpoints."""
1400
+
1401
+ async def list(self, *, owner: str | None = None, repo: str | None = None, **params: Any) -> List[Commit]:
1402
+ return await self._models(
1403
+ "GET", self._client._repo_path("commits", owner=owner, repo=repo), Commit, params=params
1404
+ )
1405
+
1406
+ async def get(self, *, sha: str, owner: str | None = None, repo: str | None = None) -> Commit:
1407
+ return await self._model("GET", self._client._repo_path("commits", sha, owner=owner, repo=repo), Commit)
1408
+
1409
+ async def compare(
1410
+ self, *, base: str, head: str, owner: str | None = None, repo: str | None = None
1411
+ ) -> CommitComparison:
1412
+ return await self._model(
1413
+ "GET", self._client._repo_path("compare", f"{base}...{head}", owner=owner, repo=repo), CommitComparison
1414
+ )
1415
+
1416
+ async def list_comments(
1417
+ self, *, owner: str | None = None, repo: str | None = None, **params: Any
1418
+ ) -> List[CommitComment]:
1419
+ return await self._models(
1420
+ "GET", self._client._repo_path("comments", owner=owner, repo=repo), CommitComment, params=params
1421
+ )
1422
+
1423
+ async def get_comment(
1424
+ self, *, comment_id: int | str, owner: str | None = None, repo: str | None = None
1425
+ ) -> CommitComment:
1426
+ return await self._model(
1427
+ "GET", self._client._repo_path("comments", comment_id, owner=owner, repo=repo), CommitComment
1428
+ )
1429
+
1430
+ async def create_comment(
1431
+ self,
1432
+ *,
1433
+ sha: str,
1434
+ body: str,
1435
+ owner: str | None = None,
1436
+ repo: str | None = None,
1437
+ path: str | None = None,
1438
+ position: int | None = None,
1439
+ ) -> CommitComment:
1440
+ return await self._model(
1441
+ "POST",
1442
+ self._client._repo_path("commits", sha, "comments", owner=owner, repo=repo),
1443
+ CommitComment,
1444
+ json={"body": body, "path": path, "position": position},
1445
+ )
1446
+
1447
+ async def update_comment(
1448
+ self, *, comment_id: int | str, body: str, owner: str | None = None, repo: str | None = None
1449
+ ) -> CommitComment:
1450
+ return await self._model(
1451
+ "PATCH",
1452
+ self._client._repo_path("comments", comment_id, owner=owner, repo=repo),
1453
+ CommitComment,
1454
+ json={"body": body},
1455
+ )
1456
+
1457
+ async def delete_comment(self, *, comment_id: int | str, owner: str | None = None, repo: str | None = None) -> None:
1458
+ await self._request("DELETE", self._client._repo_path("comments", comment_id, owner=owner, repo=repo))