pulli 0.2.5__tar.gz → 0.2.7__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.
- {pulli-0.2.5 → pulli-0.2.7}/PKG-INFO +1 -1
- {pulli-0.2.5 → pulli-0.2.7}/scripts/release.sh +6 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/__init__.py +1 -1
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/tree.py +21 -4
- {pulli-0.2.5 → pulli-0.2.7}/.gitignore +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/LICENSE +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/README.md +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/pyproject.toml +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/cli.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/discovery.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/pull.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/spinner.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/status.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/src/pulli/update.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/tests/test_pulli.py +0 -0
- {pulli-0.2.5 → pulli-0.2.7}/uv.lock +0 -0
|
@@ -65,6 +65,12 @@ git push origin main "refs/tags/$TAG"
|
|
|
65
65
|
|
|
66
66
|
if [ "$PUBLISH" = "--publish" ]; then
|
|
67
67
|
echo "── Publish to PyPI ──"
|
|
68
|
+
# Token sources, in order: env → credgoo (Airtable backend).
|
|
69
|
+
# credgoo is the canonical store; .env files are not (no second copy).
|
|
70
|
+
if [ -z "${UV_PUBLISH_TOKEN:-}" ] && command -v credgoo >/dev/null 2>&1; then
|
|
71
|
+
UV_PUBLISH_TOKEN="$(credgoo UV_PUBLISH_TOKEN 2>/dev/null)" || true
|
|
72
|
+
export UV_PUBLISH_TOKEN
|
|
73
|
+
fi
|
|
68
74
|
if [ -z "${UV_PUBLISH_TOKEN:-}" ]; then
|
|
69
75
|
echo " UV_PUBLISH_TOKEN not set — get one at pypi.org (account settings"
|
|
70
76
|
echo " → API tokens, scope: this project) and re-run with it set:"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""pulli — discover git repos under a root and report their status."""
|
|
2
|
-
__version__ = "0.2.
|
|
2
|
+
__version__ = "0.2.7"
|
|
@@ -153,15 +153,22 @@ def _status_glyph(node: RepoNode) -> tuple[str, str]:
|
|
|
153
153
|
return "●", _GREEN
|
|
154
154
|
|
|
155
155
|
|
|
156
|
-
def _ahead_behind(node: RepoNode) -> str:
|
|
156
|
+
def _ahead_behind(node: RepoNode, C=lambda s, *c: s) -> str:
|
|
157
157
|
"""↓behind ↑ahead, or a clear placeholder when there is no upstream.
|
|
158
158
|
|
|
159
159
|
Showing `↓0 ↑0` for a repo with no upstream reads as "in sync with
|
|
160
160
|
something", which is a lie — there is nothing to be in sync with.
|
|
161
|
+
A repo that is behind is the one actionable state in this list — that
|
|
162
|
+
is what `pulli pull` acts on — so the count is highlighted (cyan,
|
|
163
|
+
bold) instead of sitting in the same grey as `↑0`. Up to date stays
|
|
164
|
+
quiet: no news takes no color.
|
|
161
165
|
"""
|
|
162
166
|
if not node.upstream:
|
|
163
167
|
return "· ·"
|
|
164
|
-
|
|
168
|
+
behind, ahead = node.behind or 0, node.ahead or 0
|
|
169
|
+
b = C(f"↓{behind}", _CYAN, _BOLD) if behind else f"↓{behind}"
|
|
170
|
+
a = C(f"↑{ahead}", _CYAN, _BOLD) if ahead else f"↑{ahead}"
|
|
171
|
+
return f"{b} {a}"
|
|
165
172
|
|
|
166
173
|
|
|
167
174
|
def _repo_tail_parts(node: RepoNode, C) -> list[str]:
|
|
@@ -178,7 +185,7 @@ def _repo_tail_parts(node: RepoNode, C) -> list[str]:
|
|
|
178
185
|
parts = [
|
|
179
186
|
C(url, _DIM) if url else "",
|
|
180
187
|
C(node.branch or "?", _BOLD),
|
|
181
|
-
_ahead_behind(node),
|
|
188
|
+
_ahead_behind(node, C),
|
|
182
189
|
]
|
|
183
190
|
|
|
184
191
|
if node.operation:
|
|
@@ -325,7 +332,13 @@ def _build_flat_lines(
|
|
|
325
332
|
if len(cols) >= 4:
|
|
326
333
|
cols[0] = cols[0] + " " * (url_width - _visible_width(cols[0]))
|
|
327
334
|
text = " ".join(c for c in cols if c)
|
|
328
|
-
|
|
335
|
+
line = padded + " " + text
|
|
336
|
+
# A repo that is behind is the actionable one — `pulli pull` acts on
|
|
337
|
+
# it — so the whole line is highlighted (cyan) instead of just the
|
|
338
|
+
# count. Everything up to date stays quiet: no news takes no color.
|
|
339
|
+
if n.behind and not n.error:
|
|
340
|
+
line = C(line, _CYAN)
|
|
341
|
+
lines.append(line)
|
|
329
342
|
repo_line[id(n)] = len(lines) - 1
|
|
330
343
|
repo_base[id(n)] = padded
|
|
331
344
|
return lines, repo_line, repo_base
|
|
@@ -449,6 +462,10 @@ class LiveTree:
|
|
|
449
462
|
if self._flat and len(cols) >= 4:
|
|
450
463
|
cols[0] = cols[0] + " " * (self._url_width - _visible_width(cols[0]))
|
|
451
464
|
text = self.repo_base[nid] + " " + " ".join(c for c in cols if c)
|
|
465
|
+
# Same highlight rule as _build_flat_lines: the whole line goes
|
|
466
|
+
# cyan when the repo is behind — that is the actionable state.
|
|
467
|
+
if self._flat and node.behind and not node.error:
|
|
468
|
+
text = self._C(text, _CYAN)
|
|
452
469
|
text = _clip_ansi(text, self._width)
|
|
453
470
|
with self._lock:
|
|
454
471
|
self._rewrite(i, text)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|