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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pulli
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: Walk a directory tree, show git repos with status, and fast-forward the ones that are behind upstream.
5
5
  Author: Stefan Waldherr
6
6
  License-Expression: MIT
@@ -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.5"
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
- return f"↓{node.behind or 0} ↑{node.ahead or 0}"
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
- lines.append(padded + " " + text)
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