codeberg-cli 0.4.0__py3-none-any.whl → 0.4.2__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.
codeberg_cli/client.py CHANGED
@@ -16,6 +16,28 @@ _VERBS = {
16
16
  class ClientError(RuntimeError):
17
17
  """Raised when the API returns a non-2xx status."""
18
18
 
19
+ def __init__(self, message: str, status_code: int | None = None) -> None:
20
+ super().__init__(message)
21
+ self.status_code = status_code
22
+
23
+
24
+ def _response_error_message(response: httpx.Response) -> str:
25
+ if not response.text:
26
+ return response.reason_phrase or "unknown error"
27
+
28
+ try:
29
+ payload = response.json()
30
+ except ValueError:
31
+ return response.text.strip() or response.reason_phrase or "unknown error"
32
+
33
+ if isinstance(payload, dict):
34
+ for key in ("message", "error", "detail"):
35
+ message = payload.get(key)
36
+ if message:
37
+ return str(message)
38
+
39
+ return response.text.strip() or response.reason_phrase or "unknown error"
40
+
19
41
 
20
42
  class Client:
21
43
  """HTTP client for the Codeberg API."""
@@ -34,7 +56,12 @@ class Client:
34
56
  raw = raw.rstrip("/")
35
57
  if not raw.endswith("/api/v1"):
36
58
  raw += "/api/v1"
37
- self._client = httpx.Client(base_url=raw, headers=headers, timeout=30.0)
59
+ self._client = httpx.Client(
60
+ base_url=raw,
61
+ headers=headers,
62
+ timeout=30.0,
63
+ follow_redirects=True,
64
+ )
38
65
 
39
66
  @property
40
67
  def base_url(self) -> str:
@@ -80,12 +107,10 @@ class Client:
80
107
  with Status(f"{label}..."):
81
108
  response = self._client.request(method, path, **kwargs)
82
109
  if not response.is_success:
83
- msg = (
84
- response.json().get("message", "unknown error")
85
- if response.text
86
- else "unknown error"
110
+ msg = _response_error_message(response)
111
+ raise ClientError(
112
+ f"{response.status_code} {msg}", status_code=response.status_code
87
113
  )
88
- raise ClientError(f"{response.status_code} {msg}")
89
114
  if response.status_code == 204:
90
115
  return None
91
116
  return response.json()
@@ -0,0 +1,59 @@
1
+ from typing import Any, Callable, TypeVar
2
+
3
+ from codeberg_cli.client import ClientError
4
+ from xclif.errors import UsageError
5
+
6
+ T = TypeVar("T")
7
+
8
+
9
+ def actions_request(repo: str, call: Callable[[], T]) -> T:
10
+ """Run an Actions API *call*, turning a 404 into a clear message.
11
+
12
+ Forgejo returns 404 for Actions endpoints when Actions is not enabled on
13
+ the repository (or the repo does not exist), which is otherwise surfaced as
14
+ an opaque ``404 The target couldn't be found.`` traceback.
15
+ """
16
+ try:
17
+ return call()
18
+ except ClientError as exc:
19
+ if exc.status_code == 404:
20
+ raise UsageError(
21
+ f"No Actions found for {repo}.",
22
+ hint="Actions may be disabled for this repository, or the repository may not exist.",
23
+ ) from exc
24
+ raise
25
+
26
+
27
+ def _first(run: dict[str, Any], *keys: str, default: str = "") -> Any:
28
+ for key in keys:
29
+ value = run.get(key)
30
+ if value is not None and value != "":
31
+ return value
32
+ return default
33
+
34
+
35
+ def normalize_run(run: dict[str, Any]) -> dict[str, Any]:
36
+ return {
37
+ "id": run.get("id"),
38
+ "index_in_repo": run.get("index_in_repo"),
39
+ "title": _first(run, "title", "display_title", default=""),
40
+ "status": _first(run, "conclusion", "status", default="?"),
41
+ "event": _first(run, "trigger_event", "event", default="?"),
42
+ "workflow_id": run.get("workflow_id"),
43
+ "created": _first(run, "created", "created_at", default=""),
44
+ "updated": _first(run, "updated", "updated_at", default=""),
45
+ "started": run.get("started"),
46
+ "stopped": run.get("stopped"),
47
+ "ref": _first(run, "prettyref", "head_branch", default=""),
48
+ "commit": _first(run, "commit_sha", "head_sha", default=""),
49
+ "html_url": _first(run, "html_url", "url", default=""),
50
+ }
51
+
52
+
53
+ def list_runs(response: dict[str, Any] | list[dict[str, Any]]) -> list[dict[str, Any]]:
54
+ if isinstance(response, dict):
55
+ runs = response.get("workflow_runs", [])
56
+ if isinstance(runs, list):
57
+ return runs
58
+ return []
59
+ return response
@@ -23,9 +23,20 @@ def _(
23
23
  return 1
24
24
  repo = inferred
25
25
 
26
- client.post(
27
- f"/repos/{repo}/actions/workflows/{workflow}/dispatches",
28
- data={"ref": ref},
29
- action="Dispatching workflow",
30
- )
26
+ from codeberg_cli.client import ClientError
27
+ from xclif.errors import UsageError
28
+
29
+ try:
30
+ client.post(
31
+ f"/repos/{repo}/actions/workflows/{workflow}/dispatches",
32
+ data={"ref": ref},
33
+ action="Dispatching workflow",
34
+ )
35
+ except ClientError as exc:
36
+ if exc.status_code == 404:
37
+ raise UsageError(
38
+ f"No workflow {workflow!r} found in {repo}.",
39
+ hint="List workflows with 'cb actions workflows', or Actions may be disabled for this repository.",
40
+ ) from exc
41
+ raise
31
42
  rich.print(f"[green]Dispatched {workflow} on {ref} in {repo}.[/green]")
@@ -6,6 +6,8 @@ from codeberg_cli.git import infer_repo
6
6
  from codeberg_cli.helpers import is_json_mode, output, require_client
7
7
  from xclif import Arg, Option, command
8
8
 
9
+ from codeberg_cli.routes.actions._format import normalize_run
10
+
9
11
 
10
12
  @command("run")
11
13
  def _(
@@ -22,19 +24,33 @@ def _(
22
24
  return 1
23
25
  repo = inferred
24
26
 
25
- run = client.get(f"/repos/{repo}/actions/runs/{run_id}")
27
+ from codeberg_cli.client import ClientError
28
+ from xclif.errors import UsageError
29
+
30
+ try:
31
+ run = client.get(f"/repos/{repo}/actions/runs/{run_id}")
32
+ except ClientError as exc:
33
+ if exc.status_code == 404:
34
+ raise UsageError(
35
+ f"No run #{run_id} found in {repo}.",
36
+ hint="Check the run ID with 'cb actions runs', or Actions may be disabled for this repository.",
37
+ ) from exc
38
+ raise
26
39
 
27
40
  if is_json_mode():
28
41
  output(run)
29
42
  return
30
43
 
31
- rich.print(f"[bold]Run #{run['id']}:[/bold] {run['display_title']}")
32
- rich.print(f" Status: {run.get('status', '?')}")
33
- rich.print(f" Conclusion: {run.get('conclusion', 'N/A')}")
34
- rich.print(f" Event: {run.get('event', '?')}")
35
- rich.print(f" Branch: {run.get('head_branch', '?')}")
36
- rich.print(f" Commit: {run.get('head_sha', '?')[:12]}")
37
- rich.print(f" Created: {run.get('created_at', '?')}")
38
- rich.print(f" Updated: {run.get('updated_at', '?')}")
39
- if run.get("url"):
40
- rich.print(f" URL: {run['url']}")
44
+ normalized = normalize_run(run)
45
+ commit = normalized["commit"] or "?"
46
+
47
+ rich.print(f"[bold]Run #{normalized['id']}:[/bold] {normalized['title']}")
48
+ rich.print(f" Status: {normalized['status']}")
49
+ rich.print(f" Event: {normalized['event']}")
50
+ rich.print(f" Workflow: {normalized['workflow_id'] or '?'}")
51
+ rich.print(f" Ref: {normalized['ref'] or '?'}")
52
+ rich.print(f" Commit: {commit[:12]}")
53
+ rich.print(f" Created: {normalized['created'] or '?'}")
54
+ rich.print(f" Updated: {normalized['updated'] or '?'}")
55
+ if normalized["html_url"]:
56
+ rich.print(f" URL: {normalized['html_url']}")
@@ -6,6 +6,8 @@ from codeberg_cli.git import infer_repo
6
6
  from codeberg_cli.helpers import print_table, require_client
7
7
  from xclif import Option, command
8
8
 
9
+ from codeberg_cli.routes.actions._format import actions_request, list_runs, normalize_run
10
+
9
11
 
10
12
  @command("runs")
11
13
  def _(
@@ -22,7 +24,11 @@ def _(
22
24
  return 1
23
25
  repo = inferred
24
26
 
25
- runs = client.get(f"/repos/{repo}/actions/runs", params={"limit": limit, "page": 1})
27
+ response = actions_request(
28
+ repo,
29
+ lambda: client.get(f"/repos/{repo}/actions/runs", params={"limit": limit, "page": 1}),
30
+ )
31
+ runs = list_runs(response)
26
32
 
27
33
  if not runs:
28
34
  rich.print(f"[dim]No action runs in {repo}.[/dim]")
@@ -31,19 +37,14 @@ def _(
31
37
  rows = []
32
38
  json_rows = []
33
39
  for run in runs:
34
- status = run.get("status", "?")
35
- conclusion = run.get("conclusion", "")
36
- label = f"{status}" if not conclusion else f"{conclusion}"
37
- rows.append((str(run["id"]), run["display_title"][:72], label, run["event"]))
38
- json_rows.append({
39
- "id": run["id"],
40
- "title": run["display_title"],
41
- "status": status,
42
- "conclusion": conclusion,
43
- "event": run["event"],
44
- "created_at": run.get("created_at", ""),
45
- "head_branch": run.get("head_branch", ""),
46
- })
40
+ normalized = normalize_run(run)
41
+ rows.append((
42
+ str(normalized["id"]),
43
+ normalized["title"][:72],
44
+ normalized["status"],
45
+ normalized["event"],
46
+ ))
47
+ json_rows.append(normalized)
47
48
 
48
49
  print_table(
49
50
  ["ID", "Title", "Status", "Event"],
@@ -2,6 +2,7 @@ from typing import Annotated
2
2
 
3
3
  import rich
4
4
 
5
+ from codeberg_cli.client import ClientError
5
6
  from codeberg_cli.git import infer_repo
6
7
  from codeberg_cli.helpers import print_table, require_client
7
8
  from xclif import Option, command
@@ -10,6 +11,7 @@ from xclif import Option, command
10
11
  @command("workflows")
11
12
  def _(
12
13
  repo: Annotated[str, Option(description="Repository (owner/repo)", name="repo")] = "",
14
+ ref: Annotated[str, Option(description="Branch or ref", name="ref")] = "",
13
15
  ) -> None:
14
16
  """List workflows for a repository."""
15
17
  client = require_client()
@@ -21,26 +23,47 @@ def _(
21
23
  return 1
22
24
  repo = inferred
23
25
 
24
- workflows = client.get(f"/repos/{repo}/actions/workflows")
26
+ params = {}
27
+ if ref:
28
+ params["ref"] = ref
29
+
30
+ try:
31
+ workflows = client.get(
32
+ f"/repos/{repo}/contents/.forgejo/workflows",
33
+ params=params,
34
+ action="Fetching workflow files",
35
+ )
36
+ except ClientError as exc:
37
+ if exc.status_code == 404:
38
+ rich.print(f"[dim]No workflows in {repo}.[/dim]")
39
+ return
40
+ raise
25
41
 
26
42
  if not workflows:
27
43
  rich.print(f"[dim]No workflows in {repo}.[/dim]")
28
44
  return
45
+ if not isinstance(workflows, list):
46
+ rich.print(f"[dim]No workflows in {repo}.[/dim]")
47
+ return
29
48
 
30
49
  rows = []
31
50
  json_rows = []
32
51
  for wf in workflows:
33
- state = wf.get("state", "?")
34
- rows.append((str(wf["id"]), wf["name"], wf.get("filename", ""), state))
52
+ if wf.get("type") != "file":
53
+ continue
54
+ rows.append((wf["name"], wf.get("path", ""), str(wf.get("size", ""))))
35
55
  json_rows.append({
36
- "id": wf["id"],
37
- "name": wf["name"],
38
- "filename": wf.get("filename", ""),
39
- "state": state,
56
+ "filename": wf["name"],
57
+ "path": wf.get("path", ""),
58
+ "size": wf.get("size"),
40
59
  })
41
60
 
61
+ if not rows:
62
+ rich.print(f"[dim]No workflows in {repo}.[/dim]")
63
+ return
64
+
42
65
  print_table(
43
- ["ID", "Name", "Filename", "State"],
66
+ ["Filename", "Path", "Size"],
44
67
  rows,
45
68
  json_data=json_rows,
46
69
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codeberg-cli
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: A Forgejo CLI — works with Codeberg and any Forgejo instance
5
5
  Project-URL: Homepage, https://codeberg.org/ThatXliner/codeberg-cli
6
6
  Project-URL: Repository, https://codeberg.org/ThatXliner/codeberg-cli
@@ -95,10 +95,11 @@ cb config set base_url "https://git.example.com/api/v1" # Self-hosted Forgejo
95
95
 
96
96
  Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 2026.*
97
97
 
98
+ TL;DR: **`cb` is the most feature-complete Forgejo CLI** — by a wide margin.
99
+
98
100
  | | **cb** (this) | **fj** (forgejo-cli) | **berg** (codeberg-cli) | **tea** (gitea/tea) | **gcli** |
99
101
  |---|---|---|---|---|---|
100
102
  | Language | Python | Rust | Rust | Go | C |
101
- | Version | v0.2.0 | v0.5.0 | v0.5.1 | v0.13.0 | v2.11.0 |
102
103
  | Install | `pip install codeberg-cli` | prebuilt binaries/Cargo | `cargo install codeberg-cli` | `brew install tea` | `brew install gcli` |
103
104
  | Multi-instance | `cb config set base_url` | `-H <instance>` | `BERG_BASE_URL` | `tea login add` | `-t forgejo` |
104
105
 
@@ -108,18 +109,18 @@ Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 20
108
109
  | Create | ✅ | ✅ | ✅ | ✅ | ✅ |
109
110
  | List | ✅ | ✅ | ✅ | ✅ | ✅ |
110
111
  | View | ✅ | ✅ | ✅ | ✅ | ✅ |
111
- | Close | ✅ | ✅ | ✅ | ✅ | |
112
- | Reopen | ✅ | — | ✅ | ✅ | |
112
+ | Close | ✅ | ✅ | ✅ | ✅ | |
113
+ | Reopen | ✅ | — | ✅ | ✅ | |
113
114
  | Comment | ✅ | ✅ | ✅ | ✅ | ✅ |
114
- | Edit | ✅ | | ✅ | ✅ | |
115
+ | Edit | ✅ | | ✅ | ✅ | |
115
116
  | Delete | ✅ | — | — | — | — |
116
117
  | Pin/Unpin | ✅ | — | — | ✅ | — |
117
118
  | Search | ✅ | ✅ | — | ✅ | — |
118
119
  | Attachments | — | — | — | ✅ | — |
119
- | Labels (manage on issue) | ✅ | — | — | ✅ | |
120
+ | Labels (manage on issue) | ✅ | — | — | ✅ | |
120
121
  | Reactions | — | — | — | — | — |
121
122
  | Subscriptions | ✅ | — | — | ✅ | — |
122
- | Tracked times | ✅ | — | — | | ✅ |
123
+ | Tracked times | ✅ | — | — | | ✅ |
123
124
  | Dependencies | — | — | — | — | — |
124
125
  | Deadline | — | — | — | ✅ | — |
125
126
  | Templates | — | ✅ | — | — | — |
@@ -131,16 +132,16 @@ Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 20
131
132
  | List | ✅ | ✅ | ✅ | ✅ | ✅ |
132
133
  | View | ✅ | ✅ | ✅ | ✅ | ✅ |
133
134
  | Merge | ✅ | ✅ | ✅ | ✅ | ✅ |
134
- | Close | ✅ | | ✅ | ✅ | |
135
- | Reopen | ✅ | — | ✅ | ✅ | |
135
+ | Close | ✅ | | ✅ | ✅ | |
136
+ | Reopen | ✅ | — | ✅ | ✅ | |
136
137
  | Comment | ✅ | ✅ | ✅ | ✅ | ✅ |
137
- | Edit | ✅ | | ✅ | ✅ | — |
138
- | Checkout | ✅ | | ✅ | ✅ | ✅ |
139
- | Commits | ✅ | | — | | |
140
- | Files/changed | ✅ | | — | | — |
138
+ | Edit | ✅ | | ✅ | ✅ | — |
139
+ | Checkout | ✅ | | ✅ | ✅ | ✅ |
140
+ | Commits | ✅ | | — | | |
141
+ | Files/changed | ✅ | | — | | — |
141
142
  | Reviews | — | ✅ | — | ✅ | ✅ |
142
- | Diff/Patch | ✅ | | — | | |
143
- | Update branch | ✅ | — | — | | — |
143
+ | Diff/Patch | ✅ | | — | | |
144
+ | Update branch | ✅ | — | — | | — |
144
145
  | AGit (no-fork) | — | ✅ | — | — | — |
145
146
  | CI status | — | ✅ | — | — | — |
146
147
  | Templates | — | ✅ | — | — | — |
@@ -151,7 +152,7 @@ Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 20
151
152
  |---|---|---|---|---|---|
152
153
  | Create | ✅ | ✅ | ✅ | ✅ | ✅ |
153
154
  | List | ✅ | ✅ | ✅ | ✅ | ✅ |
154
- | View | ✅ | ✅ | ✅ | ✅ | |
155
+ | View | ✅ | ✅ | ✅ | ✅ | |
155
156
  | Upload assets | ✅ | — | ✅ | — | ✅ |
156
157
  | Delete | ✅ | — | — | ✅ | ✅ |
157
158
  | Edit | ✅ | — | — | ✅ | — |
@@ -164,12 +165,12 @@ Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 20
164
165
  | Create | ✅ | ✅ | ✅ | ✅ | ✅ |
165
166
  | List | ✅ | ✅ | ✅ | ✅ | ✅ |
166
167
  | View | ✅ | ✅ | ✅ | ✅ | ✅ |
167
- | Clone | ✅ | | ✅ | ✅ | — |
168
+ | Clone | ✅ | | ✅ | ✅ | — |
168
169
  | Fork | ✅ | ✅ | ✅ | ✅ | ✅ |
169
170
  | Delete | ✅ | — | ✅ | ✅ | — |
170
171
  | Star | ✅ | ✅ | ✅ | ✅ | — |
171
- | Unstar | ✅ | | ✅ | ✅ | — |
172
- | Watch/Unwatch | ✅ | | — | ✅ | — |
172
+ | Unstar | ✅ | | ✅ | ✅ | — |
173
+ | Watch/Unwatch | ✅ | | — | ✅ | — |
173
174
  | Edit | ✅ | ✅ | — | ✅ | — |
174
175
  | Migrate/Mirror | ✅ | ✅ | — | ✅ | — |
175
176
  | Branches | ✅ | — | — | ✅ | — |
@@ -207,7 +208,7 @@ Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 20
207
208
  |---|---|---|---|---|---|
208
209
  | List | ✅ | — | ✅ | ✅ | ✅ |
209
210
  | Mark read | — | — | — | ✅ | — |
210
- | Thread details | — | — | — | | — |
211
+ | Thread details | — | — | — | | — |
211
212
  | Per-repo | — | — | — | ✅ | — |
212
213
 
213
214
  ### Extra
@@ -225,7 +226,7 @@ Here's how `cb` stacks up against other Forgejo CLI tools. *Last updated: May 20
225
226
  | Config management | ✅ | — | ✅ | — | — |
226
227
  | Web browser flag | on view commands | — | — | ✅ | — |
227
228
 
228
- **`cb` is the most feature-complete Forgejo CLI** — by a wide margin. It dominates on repo management (branches, topics, languages, tags, commits, contents, collaborators, search, archive, transfer, watch/unwatch, sync-fork, migrate), issues (delete, pin, labels, search, subscribe, tracked times), PRs (diff, commits, files, reopen, update), releases (delete, edit, latest, by-tag), and extras (Actions, org/team management, `--json` on every command, raw API, release uploads). Built in Python with [Xclif](https://xclif.readthedocs.io) for a clean, hackable codebase. If something's missing, open an issue!
229
+ Built in Python with [Xclif](https://xclif.readthedocs.io) for a clean, hackable codebase. If something's missing, open an issue!
229
230
 
230
231
  ## License
231
232
 
@@ -1,5 +1,5 @@
1
1
  codeberg_cli/__main__.py,sha256=35xiBzBbgDy9rcHqCJWHdIVsWhGEtPQNd-s9wt3k7yE,141
2
- codeberg_cli/client.py,sha256=FAtrPdrIpQqJQT3KsRR8cz6yrZytsYK6JVcZ80vtw8s,2923
2
+ codeberg_cli/client.py,sha256=BEew6LN5-zchRzlp9dq-Zr1ZBKaeTldkIEEKzuBu3-k,3665
3
3
  codeberg_cli/config.py,sha256=bjVHHM1sG3xTIU6EC7sakwR0nnP-ZsCtO4Jn2od6X4A,822
4
4
  codeberg_cli/git.py,sha256=DIzHSaezhWQGl63f8pkYDNd-qDfoMe7SZBZ7TWVlCxc,1899
5
5
  codeberg_cli/helpers.py,sha256=DQe6Be9B7eLPEVRJ4guo644UWKivAADniS7uh42_3Mk,3268
@@ -8,10 +8,11 @@ codeberg_cli/routes/api.py,sha256=o8she7_o32DNuYqr1v9D0hEHjujW1xEZEhHuxIzKO_8,72
8
8
  codeberg_cli/routes/notifications.py,sha256=Jqjy287S0YevaHMy_xwDp3HSZILWL7RBSS7YskQd3WA,1350
9
9
  codeberg_cli/routes/user.py,sha256=uPQowX-VoOs2zumFhbultqeOeFmZ-OODEMEnu5WvMQ0,1099
10
10
  codeberg_cli/routes/actions/__init__.py,sha256=KCjUWUN2rh_GollBkNwoLZtpm9gPC5PPLfQOvd4gCrc,153
11
- codeberg_cli/routes/actions/dispatch.py,sha256=Lu3FyE7M8DdSHefist1y97Qp2khho0MRPj-QcnoKaAU,1030
12
- codeberg_cli/routes/actions/run.py,sha256=HkM7lAOD5-w668CX2kzmYg3B6NHOjb2KYFA97oPtlX0,1379
13
- codeberg_cli/routes/actions/runs.py,sha256=oK4JqAqIJV6lJturQQ8_pqBxpbsIdvCG3oy9MIC7UIs,1600
14
- codeberg_cli/routes/actions/workflows.py,sha256=f7ERoPM-VM4d7VcGxZZnZewkU9tQ_8gCHtwo1xVEVvw,1225
11
+ codeberg_cli/routes/actions/_format.py,sha256=W0nC-6-EaBp9gCEahEp-iDiZUs6jCgspmXhCTFfUAto,2129
12
+ codeberg_cli/routes/actions/dispatch.py,sha256=C9lUTs9TGBFIlZJtKdUMTIKiNRdNW9s9rQXRzd0YNT0,1459
13
+ codeberg_cli/routes/actions/run.py,sha256=ZnU6quATij-Yrmfh_SMvw7djjAt2XcadiSK7_sId0Mk,1931
14
+ codeberg_cli/routes/actions/runs.py,sha256=rjT-OOEu59HCfu2JZVF30r2eVaTJ-ntfkyDQcuci8ls,1469
15
+ codeberg_cli/routes/actions/workflows.py,sha256=XgkPHMVWgflQpRpwVkmoPu-483FYLCRJDZX6EOkN1PE,1878
15
16
  codeberg_cli/routes/auth/__init__.py,sha256=eQHz7mep-kGESlmrv4tTAD3EPTqlNC2Dy9MeJkTxUi0,139
16
17
  codeberg_cli/routes/auth/login.py,sha256=6QxaEz5cvSgJbr-dXpudP2VbGxsLx3xPw0cMwWZm1aU,654
17
18
  codeberg_cli/routes/auth/logout.py,sha256=LfsYchVxrr77R5c2WNGbKNCLbkyQtbobkhcpw1DH8HA,351
@@ -115,8 +116,8 @@ codeberg_cli/routes/repo/tag/list.py,sha256=HI9K00-bf50XcimXKzQR-YD4l_y7m8Rfp72U
115
116
  codeberg_cli/routes/repo/topics/__init__.py,sha256=lHx6_CZgeOqtFPasOg0sfM6De61V3mfd-FW-bDOsCqM,117
116
117
  codeberg_cli/routes/repo/topics/list.py,sha256=oV-3wZVQj1RlLeZjBg-EAtv_roB71eTfnB9lWDBg680,931
117
118
  codeberg_cli/routes/repo/topics/set.py,sha256=hhVOMw-3btCgwlQXd34n6A6jEu0f56GcSyJTsyuUiDI,911
118
- codeberg_cli-0.4.0.dist-info/METADATA,sha256=LO2YYE3IU1Ok9yf-Y51Vlz54qlUJ0JoIWWqZlprMRrQ,8585
119
- codeberg_cli-0.4.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
120
- codeberg_cli-0.4.0.dist-info/entry_points.txt,sha256=7Kg1K5av7D5TzPCqX_qyFCj09JTneIEvW0f2Gp4q1v4,49
121
- codeberg_cli-0.4.0.dist-info/licenses/LICENSE,sha256=o71itnX05JiF5qOrKHEmWIvuf03sgYcwsc3r6AAW_h0,1065
122
- codeberg_cli-0.4.0.dist-info/RECORD,,
119
+ codeberg_cli-0.4.2.dist-info/METADATA,sha256=V4Is03t_kHviXIRbDr4zA-7j09xl8m8XrHKqMBlvw6U,8124
120
+ codeberg_cli-0.4.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
121
+ codeberg_cli-0.4.2.dist-info/entry_points.txt,sha256=7Kg1K5av7D5TzPCqX_qyFCj09JTneIEvW0f2Gp4q1v4,49
122
+ codeberg_cli-0.4.2.dist-info/licenses/LICENSE,sha256=o71itnX05JiF5qOrKHEmWIvuf03sgYcwsc3r6AAW_h0,1065
123
+ codeberg_cli-0.4.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.29.0
2
+ Generator: hatchling 1.30.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any