python-gitea 0.8.0__tar.gz → 0.9.0__tar.gz

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.
Files changed (307) hide show
  1. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/codeql.yml +3 -3
  2. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/support_floor_update.yml +1 -1
  3. {python_gitea-0.8.0 → python_gitea-0.9.0}/.pre-commit-config.yaml +2 -2
  4. {python_gitea-0.8.0 → python_gitea-0.9.0}/PKG-INFO +1 -1
  5. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/dev/architecture.md +7 -1
  6. python_gitea-0.9.0/docs/user-guide/cli.md +519 -0
  7. python_gitea-0.9.0/docs/user-guide/python-api.md +196 -0
  8. {python_gitea-0.8.0 → python_gitea-0.9.0}/pyproject.toml +2 -2
  9. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/comment/add.py +15 -7
  10. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/comment/delete.py +9 -4
  11. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/comment/edit.py +9 -4
  12. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/comment/list.py +15 -7
  13. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/config/add.py +12 -0
  14. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/config/delete.py +17 -2
  15. python_gitea-0.9.0/src/gitea/cli/config/list.py +54 -0
  16. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/config/update.py +13 -0
  17. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/create.py +9 -4
  18. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/dependency/add.py +32 -12
  19. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/dependency/list.py +15 -7
  20. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/dependency/remove.py +32 -12
  21. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/edit.py +15 -7
  22. python_gitea-0.9.0/src/gitea/cli/issue/get.py +109 -0
  23. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/list.py +9 -4
  24. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/main.py +4 -0
  25. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/label/create.py +9 -4
  26. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/label/delete.py +9 -4
  27. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/label/list.py +9 -4
  28. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/label/update.py +9 -4
  29. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/main.py +44 -1
  30. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/milestone/create.py +9 -4
  31. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/milestone/list.py +9 -4
  32. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/notification/list.py +1 -1
  33. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/notification/read.py +1 -1
  34. python_gitea-0.9.0/src/gitea/cli/output.py +70 -0
  35. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/column/create.py +1 -1
  36. python_gitea-0.8.0/src/gitea/cli/project/issue/remove.py → python_gitea-0.9.0/src/gitea/cli/project/column/issues.py +19 -10
  37. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/column/list.py +1 -1
  38. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/create.py +1 -1
  39. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/delete.py +1 -1
  40. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/edit.py +1 -1
  41. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/get.py +1 -1
  42. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/issue/add.py +32 -7
  43. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/issue/move.py +33 -8
  44. python_gitea-0.9.0/src/gitea/cli/project/issue/remove.py +110 -0
  45. python_gitea-0.9.0/src/gitea/cli/project/issues.py +108 -0
  46. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/list.py +1 -1
  47. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/main.py +4 -0
  48. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/pull_request/list.py +9 -4
  49. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/user/get.py +1 -1
  50. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/user/update_settings.py +1 -1
  51. python_gitea-0.9.0/src/gitea/cli/utils/api.py +96 -0
  52. python_gitea-0.9.0/src/gitea/cli/utils/errors.py +56 -0
  53. python_gitea-0.9.0/src/gitea/cli/utils/issue.py +253 -0
  54. python_gitea-0.9.0/src/gitea/cli/utils/options.py +110 -0
  55. python_gitea-0.9.0/src/gitea/cli/watch/__init__.py +1 -0
  56. python_gitea-0.9.0/src/gitea/cli/watch/list.py +419 -0
  57. python_gitea-0.9.0/src/gitea/cli/watch/main.py +21 -0
  58. python_gitea-0.9.0/src/gitea/issue/__init__.py +9 -0
  59. python_gitea-0.9.0/src/gitea/issue/project_column.py +336 -0
  60. python_gitea-0.9.0/src/gitea/utils/pagination.py +100 -0
  61. python_gitea-0.9.0/src/gitea/watch/__init__.py +54 -0
  62. python_gitea-0.9.0/src/gitea/watch/changes.py +336 -0
  63. python_gitea-0.9.0/src/gitea/watch/state.py +468 -0
  64. python_gitea-0.9.0/tests/board.py +122 -0
  65. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/comment/test_cli_comment_add.py +1 -1
  66. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/comment/test_cli_comment_list.py +1 -1
  67. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/config/test_cli_config_add.py +125 -1
  68. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/config/test_cli_config_delete.py +106 -1
  69. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/config/test_cli_config_list.py +63 -0
  70. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/config/test_cli_config_update.py +146 -1
  71. python_gitea-0.9.0/tests/cli/envelope.py +49 -0
  72. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/dependency/test_cli_issue_dependency.py +5 -5
  73. python_gitea-0.9.0/tests/cli/issue/test_cli_issue_comment.py +55 -0
  74. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/test_cli_issue_edit.py +1 -1
  75. python_gitea-0.9.0/tests/cli/issue/test_cli_issue_get.py +206 -0
  76. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/notification/test_cli_notification.py +89 -0
  77. python_gitea-0.9.0/tests/cli/project/test_cli_project.py +796 -0
  78. python_gitea-0.9.0/tests/cli/project/test_cli_project_column_issues.py +347 -0
  79. python_gitea-0.9.0/tests/cli/rendering.py +39 -0
  80. python_gitea-0.9.0/tests/cli/test_cli_main.py +919 -0
  81. python_gitea-0.9.0/tests/cli/test_cli_output.py +101 -0
  82. python_gitea-0.9.0/tests/cli/transport.py +105 -0
  83. python_gitea-0.9.0/tests/cli/utils/test_cli_utils_api.py +182 -0
  84. python_gitea-0.9.0/tests/cli/utils/test_cli_utils_errors.py +47 -0
  85. python_gitea-0.9.0/tests/cli/utils/test_cli_utils_issue.py +410 -0
  86. python_gitea-0.9.0/tests/cli/utils/test_cli_utils_options.py +113 -0
  87. python_gitea-0.9.0/tests/cli/watch/__init__.py +1 -0
  88. python_gitea-0.9.0/tests/cli/watch/test_cli_watch_list.py +1174 -0
  89. python_gitea-0.9.0/tests/issue/test_issue_async_project_column.py +231 -0
  90. python_gitea-0.9.0/tests/issue/test_issue_project_column.py +334 -0
  91. python_gitea-0.9.0/tests/utils/test_utils_pagination.py +139 -0
  92. python_gitea-0.9.0/tests/watch/__init__.py +1 -0
  93. python_gitea-0.9.0/tests/watch/test_watch_changes.py +414 -0
  94. python_gitea-0.9.0/tests/watch/test_watch_state.py +697 -0
  95. {python_gitea-0.8.0 → python_gitea-0.9.0}/uv.lock +233 -163
  96. python_gitea-0.8.0/docs/user-guide/cli.md +0 -152
  97. python_gitea-0.8.0/docs/user-guide/python-api.md +0 -88
  98. python_gitea-0.8.0/src/gitea/cli/config/list.py +0 -40
  99. python_gitea-0.8.0/src/gitea/cli/issue/get.py +0 -76
  100. python_gitea-0.8.0/src/gitea/cli/utils/api.py +0 -32
  101. python_gitea-0.8.0/src/gitea/issue/__init__.py +0 -8
  102. python_gitea-0.8.0/tests/cli/issue/test_cli_issue_get.py +0 -39
  103. python_gitea-0.8.0/tests/cli/project/test_cli_project.py +0 -404
  104. python_gitea-0.8.0/tests/cli/test_cli_main.py +0 -99
  105. python_gitea-0.8.0/tests/cli/utils/test_cli_utils_api.py +0 -46
  106. {python_gitea-0.8.0 → python_gitea-0.9.0}/.coderabbit.yaml +0 -0
  107. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  108. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  109. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  110. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/pull_request_template.md +0 -0
  111. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/ci.yml +0 -0
  112. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/documentation.yml +0 -0
  113. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/draft_release.yml +0 -0
  114. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/publish.yml +0 -0
  115. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/publish_testpypi.yml +0 -0
  116. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/release.yml +0 -0
  117. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/scheduled_release.yml +0 -0
  118. {python_gitea-0.8.0 → python_gitea-0.9.0}/.github/workflows/semantic_pull_request.yml +0 -0
  119. {python_gitea-0.8.0 → python_gitea-0.9.0}/.gitignore +0 -0
  120. {python_gitea-0.8.0 → python_gitea-0.9.0}/.markdownlint.yaml +0 -0
  121. {python_gitea-0.8.0 → python_gitea-0.9.0}/.prettierrc +0 -0
  122. {python_gitea-0.8.0 → python_gitea-0.9.0}/.pypirc +0 -0
  123. {python_gitea-0.8.0 → python_gitea-0.9.0}/.typos.toml +0 -0
  124. {python_gitea-0.8.0 → python_gitea-0.9.0}/CITATION.cff +0 -0
  125. {python_gitea-0.8.0 → python_gitea-0.9.0}/CODE_OF_CONDUCT.md +0 -0
  126. {python_gitea-0.8.0 → python_gitea-0.9.0}/CONTRIBUTING.md +0 -0
  127. {python_gitea-0.8.0 → python_gitea-0.9.0}/LICENSE +0 -0
  128. {python_gitea-0.8.0 → python_gitea-0.9.0}/README.md +0 -0
  129. {python_gitea-0.8.0 → python_gitea-0.9.0}/SECURITY.md +0 -0
  130. {python_gitea-0.8.0 → python_gitea-0.9.0}/SUPPORT.md +0 -0
  131. {python_gitea-0.8.0 → python_gitea-0.9.0}/cliff.toml +0 -0
  132. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/contributing.md +0 -0
  133. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/dev/troubleshooting.md +0 -0
  134. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/gen_ref_pages.py +0 -0
  135. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/index.md +0 -0
  136. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/javascripts/mathjax.js +0 -0
  137. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/security.md +0 -0
  138. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/style/api.css +0 -0
  139. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/user-guide/configuration.md +0 -0
  140. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/user-guide/installation.md +0 -0
  141. {python_gitea-0.8.0 → python_gitea-0.9.0}/docs/user-guide/quickstart.md +0 -0
  142. {python_gitea-0.8.0 → python_gitea-0.9.0}/mkdocs.yml +0 -0
  143. {python_gitea-0.8.0 → python_gitea-0.9.0}/renovate.json +0 -0
  144. {python_gitea-0.8.0 → python_gitea-0.9.0}/scripts/release_version.py +0 -0
  145. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/__init__.py +0 -0
  146. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/__main__.py +0 -0
  147. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/__init__.py +0 -0
  148. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/comment/__init__.py +0 -0
  149. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/comment/main.py +0 -0
  150. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/config/__init__.py +0 -0
  151. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/config/main.py +0 -0
  152. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/__init__.py +0 -0
  153. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/dependency/__init__.py +0 -0
  154. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/issue/dependency/main.py +0 -0
  155. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/label/__init__.py +0 -0
  156. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/label/main.py +0 -0
  157. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/milestone/__init__.py +0 -0
  158. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/milestone/main.py +0 -0
  159. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/notification/__init__.py +0 -0
  160. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/notification/main.py +0 -0
  161. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/__init__.py +0 -0
  162. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/column/__init__.py +0 -0
  163. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/project/issue/__init__.py +0 -0
  164. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/pull_request/__init__.py +0 -0
  165. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/pull_request/main.py +0 -0
  166. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/user/__init__.py +0 -0
  167. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/user/main.py +0 -0
  168. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/utils/__init__.py +0 -0
  169. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/utils/auth.py +0 -0
  170. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/cli/utils/convert.py +0 -0
  171. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/client/__init__.py +0 -0
  172. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/client/async_gitea.py +0 -0
  173. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/client/base.py +0 -0
  174. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/client/gitea.py +0 -0
  175. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/comment/__init__.py +0 -0
  176. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/comment/async_comment.py +0 -0
  177. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/comment/base.py +0 -0
  178. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/comment/comment.py +0 -0
  179. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/config/__init__.py +0 -0
  180. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/config/manager.py +0 -0
  181. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/config/model.py +0 -0
  182. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/issue/async_issue.py +0 -0
  183. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/issue/base.py +0 -0
  184. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/issue/issue.py +0 -0
  185. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/label/__init__.py +0 -0
  186. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/label/async_label.py +0 -0
  187. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/label/base.py +0 -0
  188. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/label/label.py +0 -0
  189. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/milestone/__init__.py +0 -0
  190. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/milestone/async_milestone.py +0 -0
  191. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/milestone/base.py +0 -0
  192. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/milestone/milestone.py +0 -0
  193. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/notification/__init__.py +0 -0
  194. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/notification/async_notification.py +0 -0
  195. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/notification/base.py +0 -0
  196. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/notification/notification.py +0 -0
  197. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/project/__init__.py +0 -0
  198. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/project/async_project.py +0 -0
  199. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/project/base.py +0 -0
  200. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/project/project.py +0 -0
  201. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/pull_request/__init__.py +0 -0
  202. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/pull_request/async_pull_request.py +0 -0
  203. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/pull_request/base.py +0 -0
  204. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/pull_request/pull_request.py +0 -0
  205. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/repository/__init__.py +0 -0
  206. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/repository/async_repository.py +0 -0
  207. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/repository/base.py +0 -0
  208. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/repository/repository.py +0 -0
  209. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/resource/__init__.py +0 -0
  210. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/resource/async_resource.py +0 -0
  211. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/resource/resource.py +0 -0
  212. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/user/__init__.py +0 -0
  213. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/user/async_user.py +0 -0
  214. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/user/base.py +0 -0
  215. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/user/user.py +0 -0
  216. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/utils/__init__.py +0 -0
  217. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/utils/log.py +0 -0
  218. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/utils/response.py +0 -0
  219. {python_gitea-0.8.0 → python_gitea-0.9.0}/src/gitea/version.py +0 -0
  220. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/__init__.py +0 -0
  221. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/__init__.py +0 -0
  222. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/comment/__init__.py +0 -0
  223. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/comment/test_cli_comment_delete.py +0 -0
  224. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/comment/test_cli_comment_edit.py +0 -0
  225. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/comment/test_cli_comment_main.py +0 -0
  226. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/config/__init__.py +0 -0
  227. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/config/test_cli_config_main.py +0 -0
  228. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/__init__.py +0 -0
  229. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/dependency/__init__.py +0 -0
  230. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/test_cli_issue_create.py +0 -0
  231. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/test_cli_issue_list.py +0 -0
  232. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/issue/test_cli_issue_main.py +0 -0
  233. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/label/__init__.py +0 -0
  234. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/label/test_cli_label_create.py +0 -0
  235. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/label/test_cli_label_delete.py +0 -0
  236. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/label/test_cli_label_list.py +0 -0
  237. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/label/test_cli_label_main.py +0 -0
  238. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/label/test_cli_label_update.py +0 -0
  239. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/milestone/__init__.py +0 -0
  240. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/milestone/test_cli_milestone_create.py +0 -0
  241. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/milestone/test_cli_milestone_list.py +0 -0
  242. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/milestone/test_cli_milestone_main.py +0 -0
  243. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/notification/__init__.py +0 -0
  244. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/project/__init__.py +0 -0
  245. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/pull_request/__init__.py +0 -0
  246. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/pull_request/test_cli_pull_request_list.py +0 -0
  247. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/pull_request/test_cli_pull_request_main.py +0 -0
  248. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/user/__init__.py +0 -0
  249. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/user/test_cli_user_get.py +0 -0
  250. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/user/test_cli_user_update_settings.py +0 -0
  251. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/utils/__init__.py +0 -0
  252. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/utils/test_cli_utils_auth.py +0 -0
  253. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/cli/utils/test_cli_utils_convert.py +0 -0
  254. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/client/__init__.py +0 -0
  255. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/client/test_client_async_gitea.py +0 -0
  256. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/client/test_client_base.py +0 -0
  257. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/client/test_client_gitea.py +0 -0
  258. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/comment/__init__.py +0 -0
  259. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/comment/test_comment_async_comment.py +0 -0
  260. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/comment/test_comment_base.py +0 -0
  261. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/comment/test_comment_comment.py +0 -0
  262. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/config/__init__.py +0 -0
  263. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/config/test_config_manager.py +0 -0
  264. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/config/test_config_model.py +0 -0
  265. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/conftest.py +0 -0
  266. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/issue/__init__.py +0 -0
  267. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/issue/test_issue_async_issue.py +0 -0
  268. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/issue/test_issue_base.py +0 -0
  269. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/issue/test_issue_dependencies.py +0 -0
  270. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/issue/test_issue_issue.py +0 -0
  271. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/label/__init__.py +0 -0
  272. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/label/test_label_async_label.py +0 -0
  273. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/label/test_label_base.py +0 -0
  274. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/label/test_label_label.py +0 -0
  275. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/milestone/__init__.py +0 -0
  276. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/milestone/test_milestone_async_milestone.py +0 -0
  277. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/milestone/test_milestone_base.py +0 -0
  278. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/milestone/test_milestone_milestone.py +0 -0
  279. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/notification/__init__.py +0 -0
  280. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/notification/test_notification_base.py +0 -0
  281. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/notification/test_notification_notification.py +0 -0
  282. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/project/__init__.py +0 -0
  283. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/project/test_project_base.py +0 -0
  284. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/project/test_project_project.py +0 -0
  285. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/pull_request/__init__.py +0 -0
  286. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/pull_request/test_pull_request_async_pull_request.py +0 -0
  287. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/pull_request/test_pull_request_base.py +0 -0
  288. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/pull_request/test_pull_request_pull_request.py +0 -0
  289. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/repository/__init__.py +0 -0
  290. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/repository/test_repository_async_repository.py +0 -0
  291. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/repository/test_repository_base.py +0 -0
  292. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/repository/test_repository_repository.py +0 -0
  293. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/resource/__init__.py +0 -0
  294. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/resource/test_resource_async_resource.py +0 -0
  295. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/resource/test_resource_resource.py +0 -0
  296. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/smoke_test.py +0 -0
  297. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/test_import.py +0 -0
  298. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/test_main.py +0 -0
  299. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/test_release_version.py +0 -0
  300. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/test_version.py +0 -0
  301. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/user/__init__.py +0 -0
  302. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/user/test_user_async_user.py +0 -0
  303. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/user/test_user_base.py +0 -0
  304. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/user/test_user_user.py +0 -0
  305. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/utils/__init__.py +0 -0
  306. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/utils/test_utils_log.py +0 -0
  307. {python_gitea-0.8.0 → python_gitea-0.9.0}/tests/utils/test_utils_response.py +0 -0
@@ -22,13 +22,13 @@ jobs:
22
22
  uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
23
23
 
24
24
  - name: Initialize CodeQL
25
- uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4
25
+ uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4
26
26
  with:
27
27
  languages: python
28
28
  queries: security-and-quality
29
29
 
30
30
  - name: Autobuild
31
- uses: github/codeql-action/autobuild@5595ccaf912efad79be6eef63a5619ff05969be3 # v4
31
+ uses: github/codeql-action/autobuild@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4
32
32
 
33
33
  - name: Perform CodeQL Analysis
34
- uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4
34
+ uses: github/codeql-action/analyze@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4
@@ -22,7 +22,7 @@ jobs:
22
22
 
23
23
  - name: Apply support policy (spec0, from pyproject tool table)
24
24
  id: policy
25
- uses: isaac-cf-wong/dependency-support-policy-action@8cfabba7ba994cda4699cdbd0fbc7ede04dac145 # v0.2.3
25
+ uses: isaac-cf-wong/dependency-support-policy-action@7cce60e19b902747b4267c4f8e53820e3f3656ea # v0.2.4
26
26
  with:
27
27
  mode: update
28
28
 
@@ -16,7 +16,7 @@ repos:
16
16
  - id: check-json
17
17
 
18
18
  - repo: https://github.com/astral-sh/ruff-pre-commit
19
- rev: v0.16.2
19
+ rev: v0.16.3
20
20
  hooks:
21
21
  - id: ruff
22
22
  args: [--fix, --config=pyproject.toml]
@@ -52,7 +52,7 @@ repos:
52
52
  - id: actionlint
53
53
 
54
54
  - repo: https://github.com/astral-sh/uv-pre-commit
55
- rev: 0.12.3
55
+ rev: 0.12.5
56
56
  hooks:
57
57
  # Update the uv lockfile
58
58
  - id: uv-lock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-gitea
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: A Python package for interacting with the Gitea API, offering a simple interface to access repositories, users, organizations, issues, and more for automation and data management.
5
5
  Project-URL: Documentation, https://isaac-cf-wong.github.io/python-gitea
6
6
  Project-URL: Source, https://github.com/isaac-cf-wong/python-gitea
@@ -56,8 +56,9 @@ src/gitea/
56
56
  │ ├── project/ # project, column, and project-issue commands
57
57
  │ ├── user/ # user commands
58
58
  │ └── utils/ # auth resolution, API helpers, conversions
59
- └── utils/ # Logging and response helpers
59
+ └── utils/ # Logging, pagination, and response helpers
60
60
  ├── log.py # Logger setup
61
+ ├── pagination.py # Paginated-listing walkers
61
62
  └── response.py # Response processing helpers
62
63
  ```
63
64
 
@@ -96,6 +97,11 @@ names. Methods map one-to-one onto Gitea REST endpoints and return either:
96
97
  JSON payload and `status` carries metadata such as the HTTP status code, or
97
98
  - the raw HTTP response for mutating operations.
98
99
 
100
+ Work that spans several endpoints lives beside the resource rather than inside
101
+ it, so the resource methods stay one-to-one with the API. For example,
102
+ `gitea.issue.project_column` resolves the board column an issue's card sits in,
103
+ which Gitea only reveals through the project's column listings.
104
+
99
105
  ## CLI Layer
100
106
 
101
107
  The CLI is a single Typer application registered in `cli/main.py`. Each resource
@@ -0,0 +1,519 @@
1
+ # Command-Line Interface
2
+
3
+ The `gitea-cli` command wraps the Gitea REST API for quick, scriptable
4
+ operations. Run `gitea-cli --help` for the full list at any time.
5
+
6
+ ## Global Options
7
+
8
+ ```bash
9
+ gitea-cli [OPTIONS] COMMAND [ARGS]...
10
+ ```
11
+
12
+ | Option | Description |
13
+ | ----------------------- | --------------------------------------------------------------------------------------- |
14
+ | `--config-path <path>` | Config file path; defaults to `PYTHON_GITEA_CONFIG_PATH` or platform location. |
15
+ | `-v, --verbose <level>` | Log level; default `INFO`. |
16
+ | `-o, --output <format>` | Output format, `text` or `json`; default `text`. See [Output formats](#output-formats). |
17
+ | `--version` | Print the installed `python-gitea` version and exit. |
18
+
19
+ All resource commands share authentication options:
20
+
21
+ | Option | Description |
22
+ | ----------------------- | -------------------------------------- |
23
+ | `--account-name <name>` | Use the stored account with this name. |
24
+ | `--token <token>` | Token for authentication. |
25
+ | `--base-url <url>` | Base URL of the Gitea platform. |
26
+
27
+ See [Configuration](configuration.md) for how authentication is resolved.
28
+
29
+ ## Output formats
30
+
31
+ `--output` is a **global** option accepted by every subcommand, so a script
32
+ never has to know which command renders text and which renders JSON. Because it
33
+ belongs to the top-level command, it goes **before** the subcommand:
34
+
35
+ ```bash
36
+ gitea-cli --output json config list # correct
37
+ gitea-cli config list --output json # not a valid option here
38
+ ```
39
+
40
+ It can also be set once for a whole session with the `PYTHON_GITEA_OUTPUT`
41
+ environment variable; an explicit `--output` on the command line wins.
42
+
43
+ Two formats are supported:
44
+
45
+ - `text` (default) — human-readable rendering where a command has one. Commands
46
+ that only report an API result print the JSON envelope below in either format,
47
+ so `text` never loses information. One command prints nothing at all in this
48
+ format when it has nothing to say: see
49
+ [Watch](#watch---report-what-changed-since-the-last-run).
50
+ - `json` — always the same envelope on stdout:
51
+
52
+ ```json
53
+ {
54
+ "data": ...,
55
+ "metadata": { ... }
56
+ }
57
+ ```
58
+
59
+ `data` is the result itself and is never wrapped any further: the object or list
60
+ returned by the Gitea API, or - for local commands such as `config` - an object
61
+ describing what the command read or changed.
62
+
63
+ `metadata` describes the call rather than the result, and its keys vary by
64
+ command:
65
+
66
+ - API commands report `status_code`.
67
+ - Commands that page through the API add counts, such as `column_count` and
68
+ `issue_count` for `project issues`.
69
+ - `config` commands report `config_path`.
70
+ - It is `{}` when the command made no call at all.
71
+
72
+ Errors are not part of the envelope: messages go to stderr and the process exits
73
+ non-zero, so nothing is printed on stdout for a failed command. Log output also
74
+ goes to stderr in both formats, so stdout stays parsable.
75
+
76
+ One failure is deliberately not an error: the board lookup that fills in the
77
+ `column_id` of `issue get`. A refused, timed-out or otherwise failed lookup logs
78
+ a warning to stderr and reports that project's column as `null`, because the
79
+ issue the command was asked for has already been retrieved and is not worth
80
+ failing over an enrichment of it.
81
+
82
+ Tokens are never included in the output of `config` commands in either format.
83
+
84
+ ## Option naming
85
+
86
+ Every resource command addresses its target the same way, so an invocation can
87
+ be written without reading `--help` first:
88
+
89
+ | Option | Meaning |
90
+ | --------------- | -------------------------------------------------------- |
91
+ | `--owner` | The user or organization that owns the target. Required. |
92
+ | `--repository` | Narrows the target to one repository of that owner. |
93
+ | `--<entity>-id` | Names the entity acted on. |
94
+
95
+ The entity options are `--issue-id`, `--project-id`, `--column-id`, `--label-id`
96
+ and `--comment-id`.
97
+
98
+ Omitting `--repository` asks for the target that belongs to the owner itself
99
+ rather than to one of its repositories. The `project` commands have both forms:
100
+
101
+ ```bash
102
+ gitea-cli project get --owner my-org --project-id 1 # organization project
103
+ gitea-cli project get --owner my-org --repository my-repo --project-id 1 # repository project
104
+ ```
105
+
106
+ The other families have no owner-wide endpoint - an issue, a comment, a label, a
107
+ milestone and a pull request all live in a repository - so omitting
108
+ `--repository` there is reported as an error naming the option to pass:
109
+
110
+ ```console
111
+ $ gitea-cli issue get --owner my-org --issue-id 42
112
+ ERROR 'gitea-cli issue get' needs a repository: pass --repository REPOSITORY.
113
+ Omitting --repository asks for the target of the owner itself, which only
114
+ the 'gitea-cli project' commands have.
115
+ ```
116
+
117
+ A second target named in the same command carries its own coordinates, and those
118
+ are required together because there is no scope for them to fall back to:
119
+ `issue dependency add` takes `--dependency-owner`, `--dependency-repository` and
120
+ `--dependency-issue-id`.
121
+
122
+ `notification` is the one family where `--owner` is optional as well: given
123
+ neither `--owner` nor `--repository` it acts on the authenticated user's
124
+ notifications, and the two must be passed together or not at all.
125
+
126
+ ### Deprecated option names
127
+
128
+ `--index` has been renamed to `--issue-id`, so that one option name means "which
129
+ issue" in every family. The old names are still accepted and log a deprecation
130
+ warning naming their replacement, so existing scripts keep working; they are
131
+ hidden from `--help` and will be removed in a future release.
132
+
133
+ | Deprecated | Use instead |
134
+ | -------------------- | ----------------------- |
135
+ | `--index` | `--issue-id` |
136
+ | `--dependency-index` | `--dependency-issue-id` |
137
+
138
+ `--index` is still accepted by `issue get`, `issue edit`, the three
139
+ `issue dependency` commands and `comment add`/`comment list` - and by the same
140
+ commands under the `issue comment` alias. `--dependency-index` is still accepted
141
+ by `issue dependency add` and `issue dependency remove`.
142
+
143
+ Passing both names for the same issue is accepted while they agree, and is an
144
+ error when they disagree.
145
+
146
+ ## Commands
147
+
148
+ An option written bare below has to be passed; one written `[--like this]` may
149
+ be omitted. `--repository` is bare outside the `project` and `notification`
150
+ families: those commands accept the invocation without it - the option is
151
+ optional everywhere, as the convention above says - but they have no owner-wide
152
+ endpoint to serve it with, so they answer by naming the option to pass.
153
+
154
+ ### Config - manage accounts
155
+
156
+ - `gitea-cli config add --name <name> --token <token> [--base-url <url>] [--default]`
157
+ - `gitea-cli config list`
158
+ - `gitea-cli config update --name <name> [--token <token>] [--base-url <url>] [--default]`
159
+ - `gitea-cli config delete --name <name> [--force]`
160
+ - Under `--output json` the confirmation prompt is written to stderr so that
161
+ stdout stays parsable; pass `--force` to skip it entirely.
162
+
163
+ ### Issue - manage issues
164
+
165
+ - `gitea-cli issue create --owner <owner> --repository <repo> --title <title>`
166
+ - Optional: `--body`, `--assignees`, `--labels`, `--milestone`,
167
+ `--due-date`, `--closed`
168
+ - `gitea-cli issue list --owner <owner> --repository <repo>`
169
+ - Optional: `--state`, `--labels`, `--search-string`, `--created-by`,
170
+ `--assigned-by`, `--since`, `--before`, `--page`, `--limit`
171
+ - `gitea-cli issue get --owner <owner> --repository <repo> --issue-id <number>`
172
+ - The `comment_count` field is the number of comments on the issue, not the
173
+ comments themselves; use `gitea-cli issue comment list` to read the
174
+ bodies.
175
+ - Each entry of `projects` carries a `column_id`: the column the issue's
176
+ card sits in, or `null` when the issue has no card on that project. Gitea
177
+ does not report it on the issue itself, so it is resolved from each
178
+ project's board, which costs a few extra requests per project.
179
+ - Resolution is best-effort. It reflects the board as it was during the
180
+ walk, not at one instant: a card moved while the columns are being read
181
+ may be reported under either column or as `null`. A lookup that is
182
+ refused, times out, or fails in transport leaves that project's
183
+ `column_id` at `null` and logs a warning rather than failing `issue get` -
184
+ so `null` means "no card here" and "could not tell" alike. The columns of
185
+ a user-owned (individual) project cannot be listed at all, so its
186
+ `column_id` is always `null`.
187
+ - `gitea-cli issue edit --owner <owner> --repository <repo> --issue-id <number>`
188
+ - Optional: `--title`, `--body`, `--state`, `--assignees`, `--milestone`,
189
+ `--due-date`
190
+ - `gitea-cli issue dependency add --owner <owner> --repository <repo> --issue-id <number>`
191
+ - Required: `--dependency-owner <owner>`, `--dependency-repository <repo>`,
192
+ `--dependency-issue-id <number>`
193
+ - `gitea-cli issue dependency list --owner <owner> --repository <repo> --issue-id <number>`
194
+ - `gitea-cli issue dependency remove --owner <owner> --repository <repo> --issue-id <number>`
195
+ - Required: `--dependency-owner <owner>`, `--dependency-repository <repo>`,
196
+ `--dependency-issue-id <number>`
197
+
198
+ ### Pull Request - manage pull requests
199
+
200
+ - `gitea-cli pull-request list --owner <owner> --repository <repo>`
201
+ - Optional: `--state`, `--base-branch`, `--labels`, `--milestone`,
202
+ `--poster`, `--sort`, `--page`, `--limit`
203
+
204
+ ### Comment - manage issue comments
205
+
206
+ - `gitea-cli comment add --owner <owner> --repository <repo> --issue-id <number> --body <body>`
207
+ - `gitea-cli comment list --owner <owner> --repository <repo> --issue-id <number>`
208
+ - `gitea-cli comment edit --owner <owner> --repository <repo> --comment-id <id> --body <body>`
209
+ - `gitea-cli comment delete --owner <owner> --repository <repo> --comment-id <id>`
210
+
211
+ These commands are also available as `gitea-cli issue comment <command>`, which
212
+ is the same implementation under a second, more discoverable name.
213
+
214
+ ### Label - manage labels
215
+
216
+ - `gitea-cli label create --owner <owner> --repository <repo> --name <name> --color <hex>`
217
+ - Optional: `--description`
218
+ - `gitea-cli label list --owner <owner> --repository <repo>`
219
+ - `gitea-cli label update --owner <owner> --repository <repo> --label-id <id>`
220
+ - Optional: `--name`, `--color`, `--description`
221
+ - `gitea-cli label delete --owner <owner> --repository <repo> --label-id <id>`
222
+
223
+ ### Milestone - manage milestones
224
+
225
+ - `gitea-cli milestone create --owner <owner> --repository <repo> --title <title>`
226
+ - Optional: `--description`, `--due-on`, `--state`
227
+ - `gitea-cli milestone list --owner <owner> --repository <repo>`
228
+ - Optional: `--state`, `--name`, `--page`, `--limit`
229
+
230
+ ### Notification - manage notifications
231
+
232
+ - `gitea-cli notification list`
233
+ - Optional: `--owner`, `--repository`, `--status-type`, `--subject-type`,
234
+ `--since`, `--before`, `--all`, `--page`, `--limit`
235
+ - `gitea-cli notification read`
236
+ - Optional: `--owner`, `--repository`, `--status-type`, `--to-status`,
237
+ `--last-read-at`, `--all`
238
+
239
+ ### Project - manage projects
240
+
241
+ Every command here takes `--repository` as an option rather than a requirement:
242
+ passing it acts on that repository's project, omitting it acts on the
243
+ organization's own project. It is written `[--repository <repo>]` below to say
244
+ so.
245
+
246
+ ```bash
247
+ gitea-cli project list --owner my-org # the organization's projects
248
+ gitea-cli project list --owner my-org --repository my-repo # that repository's projects
249
+ ```
250
+
251
+ - `gitea-cli project create --owner <owner> [--repository <repo>] --title <title>`
252
+ - Optional: `--description`, `--card-type`, `--template-type`
253
+ - `gitea-cli project list --owner <owner> [--repository <repo>]`
254
+ - `gitea-cli project get --owner <owner> [--repository <repo>] --project-id <id>`
255
+ - `gitea-cli project edit --owner <owner> [--repository <repo>] --project-id <id>`
256
+ - Optional: `--title`, `--description`, `--state`, `--card-type`
257
+ - `gitea-cli project delete --owner <owner> [--repository <repo>] --project-id <id>`
258
+ - `gitea-cli project column create --owner <owner> [--repository <repo>] --project-id <id> --title <title>`
259
+ - Optional: `--color`
260
+ - `gitea-cli project column list --owner <owner> [--repository <repo>] --project-id <id>`
261
+ - `gitea-cli project column issues --owner <owner> [--repository <repo>] --project-id <id> --column-id <id>`
262
+ - Optional: `--page`, `--limit`
263
+ - `gitea-cli project issues --owner <owner> [--repository <repo>] --project-id <id>`
264
+ - `gitea-cli project issue add --owner <owner> [--repository <repo>] --project-id <id> --column-id <id> --issue-id <id>`
265
+ - Optional: `--issue-repository`
266
+ - `gitea-cli project issue move --owner <owner> [--repository <repo>] --project-id <id> --column-id <id> --issue-id <id>`
267
+ - Optional: `--sorting`, `--issue-repository`
268
+ - `gitea-cli project issue remove --owner <owner> [--repository <repo>] --project-id <id> --column-id <id> --issue-id <id>`
269
+ - Optional: `--issue-repository`
270
+
271
+ The project endpoints identify an issue by its global ID, which is not the
272
+ number shown in the web UI: `my-org/my-repo#15` may well be global ID `1854`.
273
+ The three `project issue` commands therefore take `--issue-id` as the number
274
+ whenever they know which repository holds the issue, and look the global ID up
275
+ for you:
276
+
277
+ - On a repository project, `--repository` already names that repository, so
278
+ `--issue-id 15` means `#15` of it.
279
+ - On an organization project, `--repository` is omitted and the issue may come
280
+ from any repository of the organization. Name it with `--issue-repository` to
281
+ address the issue by number; without it, `--issue-id` is read as the global
282
+ ID. `--issue-repository` also overrides `--repository`, for the case of a
283
+ repository project holding an issue from elsewhere.
284
+
285
+ The global ID the command used comes back as `metadata.resolved_issue_id`. A
286
+ number the repository does not have, and a call the project endpoint refuses,
287
+ are both reported as errors naming the issue and what to check - never as an
288
+ empty result. An instance that cannot be reached at all, whether the connection
289
+ fails or times out, is reported as one line naming the base URL rather than as a
290
+ traceback. A request that fails before any response for another reason - a
291
+ malformed base URL, say - is reported the same way, without claiming the
292
+ instance is down.
293
+
294
+ ### User - manage users
295
+
296
+ - `gitea-cli user get [--username <name>]`
297
+ - `gitea-cli user update-settings`
298
+ - Optional: `--full-name`, `--website`, `--location`, `--language`,
299
+ `--theme`, `--diff-view-style`, `--hide-email`, `--hide-activity`
300
+
301
+ ### Watch - report what changed since the last run
302
+
303
+ Every other command answers a question about the instance now. `watch` answers
304
+ what moved since you last looked: it keeps a local cache of issue snapshots and
305
+ reports the difference between that cache and the instance, then records the
306
+ instance as the new baseline.
307
+
308
+ The family is called `watch` because that is what it is for. `state` names the
309
+ cache rather than the purpose, and `diff` suggests comparing two things you
310
+ name, where this compares the present against whatever was last seen.
311
+
312
+ - `gitea-cli watch list --owner <owner> [--repository <repo>] [--project-id <id>]`
313
+ - Optional: `--state-file`, `--dry-run`
314
+
315
+ Each `--repository` watches the open issues of that repository, and each
316
+ `--project-id` watches the cards on that board. Both may be repeated, and both
317
+ may be given together, so one invocation reports what changed across several
318
+ repositories and boards:
319
+
320
+ ```bash
321
+ gitea-cli watch list --owner my-org --repository api --repository web --project-id 29
322
+ ```
323
+
324
+ A project is resolved the way every other `project` command resolves one:
325
+ against `--repository` when exactly one is named, and against the owner itself
326
+ when none is. Naming projects alongside several repositories is an error,
327
+ because there is no single scope left for them to belong to.
328
+
329
+ #### What counts as a change
330
+
331
+ Per issue, four things: it appeared, its assignees changed, its labels changed,
332
+ or its comments changed. An issue that dropped out of what is being watched -
333
+ closed, deleted, or moved off the board - is reported as `gone`. An issue that
334
+ changed in more than one way is reported once per way.
335
+
336
+ Comments are compared by a stable hash of each comment rather than by counting
337
+ them, so a comment edited in place is reported, and a comment added while
338
+ another was deleted is two movements rather than none.
339
+
340
+ A title or body edited on its own is **not** reported. Gitea bumps an issue's
341
+ `updated_at` for every edit, including ones there is nothing to say about, so
342
+ comparing it would report far more than it is worth.
343
+
344
+ #### The cache
345
+
346
+ The cache lives in the user cache directory (`~/.cache/gitea/watch-state.json`
347
+ on Linux) unless `--state-file` or `PYTHON_GITEA_WATCH_STATE_FILE` names
348
+ another; the option wins over the variable. Each repository and each project is
349
+ cached separately, so watching several of them keeps their deltas apart, and a
350
+ scope added later does not disturb the ones already recorded.
351
+
352
+ Three behaviours of it are worth knowing before it surprises you:
353
+
354
+ - **The first run against a scope reports nothing.** It records what is there
355
+ and reports from the second run onwards, so pointing this at a repository with
356
+ 200 open issues does not announce all 200.
357
+ - **An unreadable cache is treated as no cache.** A missing, empty, corrupt or
358
+ not-even-text file baselines every scope again rather than failing, so a
359
+ scheduled run recovers by itself - at the cost of never reporting what changed
360
+ while the cache was gone. The recovery is logged.
361
+ - **A run writes only the scopes it watched.** The cache is written by renaming
362
+ a temporary file over it, so an interrupted run cannot leave a half-written
363
+ one, and it is re-read immediately before that so only the scopes of this run
364
+ are replaced. The re-read and the write are held under a lock on a `.lock`
365
+ file beside the cache, so two runs that overlap - a timer shorter than a run
366
+ takes is enough - record both their scopes instead of the later one erasing
367
+ the earlier one's. The lock is released if a run is killed, so a crash cannot
368
+ wedge the runs after it, and a filesystem that will not lock is logged and
369
+ watched anyway. Two runs watching the _same_ scope still end with the later
370
+ one's snapshots, which is what watching one thing twice means.
371
+ - **A cache from an older version is recorded afresh.** Upgrading to a release
372
+ that changed how a comment is recognised makes one run silent, rather than
373
+ announcing every comment on every watched issue as rewritten. It is logged,
374
+ and it happens once.
375
+
376
+ `--dry-run` reports the changes and leaves the cache untouched, so the same
377
+ changes come back on the next run. Everything else about the run is unchanged,
378
+ including the requests it makes.
379
+
380
+ A cache that cannot be written fails the run: the changes it reported would
381
+ otherwise be reported again forever, which is worth an error rather than a
382
+ silent one-line difference. As with every other failure, nothing is printed on
383
+ stdout.
384
+
385
+ #### Output
386
+
387
+ In `text` - the default - the command prints one line per change and **nothing
388
+ at all when nothing changed**:
389
+
390
+ ```console
391
+ $ gitea-cli watch list --owner my-org --repository my-repo
392
+ my-org/my-repo#15 comments: 1 new · Fix the docs
393
+ my-org/my-repo#16 assignees: +alice -bob · Ship the release
394
+ $ gitea-cli watch list --owner my-org --repository my-repo
395
+ $
396
+ ```
397
+
398
+ That empty tick is the point: a `cron` entry mailing its output sends nothing on
399
+ a quiet run, and a watchdog reading its output has nothing to act on.
400
+
401
+ In `json` it is the usual envelope, always present whether or not anything
402
+ changed. `data` is the list of changes, each naming the scope it was seen in,
403
+ what kind of change it was, and what was added and removed:
404
+
405
+ ```json
406
+ {
407
+ "kind": "assignees",
408
+ "scope": "repo:my-org/my-repo",
409
+ "issue_id": 1900,
410
+ "number": 16,
411
+ "title": "Ship the release",
412
+ "repository": "my-org/my-repo",
413
+ "detail": "+alice -bob",
414
+ "added": ["alice"],
415
+ "removed": ["bob"]
416
+ }
417
+ ```
418
+
419
+ `metadata` names the scopes watched, the ones baselined by this run,
420
+ `issue_count`, `change_count`, `state_file` and `dry_run`, so a run that
421
+ reported nothing still says why.
422
+
423
+ #### Cost
424
+
425
+ A run lists every page of each scope, and then every page of the comments of
426
+ every issue in it. That is one request per page of issues plus one per page of
427
+ comments per issue, which is what makes comment edits detectable and what makes
428
+ a large repository worth a longer interval.
429
+
430
+ ## Examples
431
+
432
+ List all open issues in a repository:
433
+
434
+ ```bash
435
+ gitea-cli issue list --owner my-org --repository my-repo --state open
436
+ ```
437
+
438
+ Create an issue with labels and a milestone:
439
+
440
+ ```bash
441
+ gitea-cli issue create \
442
+ --owner my-org \
443
+ --repository my-repo \
444
+ --title "Fix the docs" \
445
+ --labels 1,2 \
446
+ --milestone 3
447
+ ```
448
+
449
+ Move an issue into a project column, addressing it by the number shown in the
450
+ web UI:
451
+
452
+ ```bash
453
+ gitea-cli project issue add \
454
+ --owner my-org \
455
+ --repository my-repo \
456
+ --project-id 1 \
457
+ --column-id 2 \
458
+ --issue-id 42
459
+ ```
460
+
461
+ Move `my-repo#42` on an organization project, where the repository holding the
462
+ issue has to be named separately:
463
+
464
+ ```bash
465
+ gitea-cli project issue move \
466
+ --owner my-org \
467
+ --project-id 1 \
468
+ --column-id 2 \
469
+ --issue-repository my-repo \
470
+ --issue-id 42
471
+ ```
472
+
473
+ List the issues sitting in one column of an organization project (omit
474
+ `--repository`; it is only needed for repository projects):
475
+
476
+ ```bash
477
+ gitea-cli project column issues \
478
+ --owner my-org \
479
+ --project-id 1 \
480
+ --column-id 2
481
+ ```
482
+
483
+ Show every card on a project together with the column it is in:
484
+
485
+ ```bash
486
+ gitea-cli project issues --owner my-org --project-id 1
487
+ ```
488
+
489
+ Report what changed across two repositories and a board since the last run,
490
+ quietly enough to be worth a `cron` entry:
491
+
492
+ ```bash
493
+ gitea-cli watch list \
494
+ --owner my-org \
495
+ --repository api \
496
+ --repository web \
497
+ --project-id 29
498
+ ```
499
+
500
+ Read the same digest from a script, listing the issues that gained a comment:
501
+
502
+ ```bash
503
+ gitea-cli --output json watch list --owner my-org --repository my-repo |
504
+ jq -r '.data[] | select(.kind == "comments") | "\(.repository)#\(.number)"'
505
+ ```
506
+
507
+ Read a configured account's base URL from a script, with `jq` unwrapping the
508
+ envelope described in [Output formats](#output-formats):
509
+
510
+ ```bash
511
+ gitea-cli --output json config list |
512
+ jq -r '.data.accounts[] | select(.name == "my-account") | .base_url'
513
+ ```
514
+
515
+ ## See Also
516
+
517
+ - [Quick Start](quickstart.md)
518
+ - [Configuration](configuration.md)
519
+ - [Python API](python-api.md)