rosotacom-dev 2.5.dev72__py3-none-any.whl → 2.5.dev73__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.
rosotacom/cli.py CHANGED
@@ -794,6 +794,31 @@ def _new_instance_id() -> str:
794
794
  return hashlib.sha1(seed.encode("utf-8")).hexdigest()[:8]
795
795
 
796
796
 
797
+ #: The timestamp every instance directory carries between its session slug and
798
+ #: its id: `<slug>_YYYY-MM-DD_HH-MM-SS_<id>`. Spelled out digit by digit rather
799
+ #: than left as `*`, because a session's name may be a *prefix* of another
800
+ #: session's name and `f"{slug}_*"` then collects the other session's instances
801
+ #: too. `ccng_remote_assist_*` matches every `ccng_remote_assist_kilted_dds_*`,
802
+ #: and because the matches are ordered by name, `[-1]` answers with the wrong
803
+ #: session's run whenever the longer name sorts after a digit — which `k` does.
804
+ #:
805
+ #: That is not hypothetical. On 2026-08-21 it made `rosotacom status
806
+ #: ccng_remote_assist` report a `ccng_remote_assist_kilted_dds` run that had
807
+ #: been shut down 45 minutes earlier, so three two-host runs concluded their
808
+ #: link never came up while it was in fact carrying traffic for eleven minutes.
809
+ #: Nothing in the reading said it came from another session.
810
+ _INSTANCE_STAMP_GLOB = "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
811
+
812
+
813
+ def _instance_glob(session_slug: str, instance_id: str | None = None) -> str:
814
+ """The pattern matching this session's instances, and no other session's.
815
+
816
+ With the stamp pinned, the names sort chronologically, so `sorted(...)[-1]`
817
+ is the newest instance rather than merely the last name.
818
+ """
819
+ return f"*/{session_slug}_{_INSTANCE_STAMP_GLOB}_{instance_id or '*'}"
820
+
821
+
797
822
  def _session_instances_root(runtime: RuntimeConfig) -> Path:
798
823
  return (runtime.session_instances_dir or (Path.cwd() / "session-instances")).resolve()
799
824
 
@@ -818,7 +843,7 @@ def _resolve_session_instance(
818
843
  resolved_instance_id = _safe_path_token(instance_id or _new_instance_id())
819
844
 
820
845
  if instance_id:
821
- matches = sorted(root.glob(f"*/{session_slug}_*_{resolved_instance_id}"))
846
+ matches = sorted(root.glob(_instance_glob(session_slug, resolved_instance_id)))
822
847
  if matches:
823
848
  host_dir = matches[-1].resolve()
824
849
  else:
@@ -8781,10 +8806,7 @@ def smoke(args: argparse.Namespace) -> int:
8781
8806
  def _find_latest_instance_dir(runtime: RuntimeConfig, session: ResolvedSession, instance_id: str | None) -> Path:
8782
8807
  root = _session_instances_root(runtime)
8783
8808
  session_slug = _session_instance_slug(session, runtime)
8784
- if instance_id:
8785
- pattern = f"*/{session_slug}_*_{_safe_path_token(instance_id)}"
8786
- else:
8787
- pattern = f"*/{session_slug}_*"
8809
+ pattern = _instance_glob(session_slug, _safe_path_token(instance_id) if instance_id else None)
8788
8810
  matches = sorted(p for p in root.glob(pattern) if p.is_dir())
8789
8811
  if not matches:
8790
8812
  raise RuntimeError(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rosotacom-dev
3
- Version: 2.5.dev72
3
+ Version: 2.5.dev73
4
4
  Summary: Host CLI for ROS OTA communication sessions.
5
5
  Author: develNor
6
6
  License-Expression: BSD-3-Clause
@@ -6,7 +6,7 @@ rosotacom/benched_set.py,sha256=lBA1Rj04dbr2e-lIvYTWoL55_LdUpCAC-y7eIvJZ8lc,2721
6
6
  rosotacom/benchmark.py,sha256=3QoXJtWUGQPwvDWyQT_fOjx6K9G2pmvtnVurA21G2QY,76612
7
7
  rosotacom/benchmark_delta.py,sha256=qXzriBkbXOeJdlLKM4ziov1F-JfwlseYHE48S9hjFsQ,10005
8
8
  rosotacom/bundle_check.py,sha256=l_3BSuYk6juXQmsNU6jkxRbH8ayH2GkiW9ONKMQ1oJY,18270
9
- rosotacom/cli.py,sha256=RAe1VAlQorfvV9nQCeK_YUBr4CFrEacRzgNi3MmaL4s,436666
9
+ rosotacom/cli.py,sha256=WOl0PLl-tEu28ahHh9HIpu-hmNlD4WcH2b45HzoqMJg,438036
10
10
  rosotacom/cli_benchmark.py,sha256=yL5izp7_Y_ngGsx5R8yN2lSUe_Y5qxBYiMArDx4ms5I,355085
11
11
  rosotacom/deployment.py,sha256=XVhB8JjxhAsglSEEPtiVSeV6fCG0rgGmDRulh14oIYQ,7318
12
12
  rosotacom/ffmpeg_packet.py,sha256=zB1BHgY1kexr5sETVMkm4bkVnRytj9k2t0uOYiHUZ6M,4267
@@ -205,9 +205,9 @@ rosotacom/resources/ws/session/creation/generate_session_files.py,sha256=3Sx4xTS
205
205
  rosotacom/resources/ws/session/creation/run_session.py,sha256=G2hJhrmLp11gm3JZ6_C-zZcqu_reXlE_wmobB7BiCfU,16849
206
206
  rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py,sha256=Ub_5f-ttUUc-rAPrZmg_Op34s8Z4C91hTyEn8fgyt-E,2633
207
207
  rosotacom/resources/ws/session/creation/strip_ansi.py,sha256=vNjpemcq4xHr0VG4x0bZqvgwEBEfOgN-b4PzbrM5nfM,851
208
- rosotacom_dev-2.5.dev72.dist-info/licenses/LICENSE.txt,sha256=FDB3-fao3lqZ94wsJHKAH7U88kAnfvZhZC8Hm5rN__g,1459
209
- rosotacom_dev-2.5.dev72.dist-info/METADATA,sha256=efB62nSlWgH7pSZVKXwAKdBh_dDziHTrPXJtjm8a9uU,58884
210
- rosotacom_dev-2.5.dev72.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
211
- rosotacom_dev-2.5.dev72.dist-info/entry_points.txt,sha256=im11ZWqBbgjQUBz2Ik2RNfMu54wlMwgiVpsBKeI7dCI,49
212
- rosotacom_dev-2.5.dev72.dist-info/top_level.txt,sha256=BZrtQcIVDWn_pQZR3Mlssqy5SaRXHjOa6B-1D9Fy4Ao,10
213
- rosotacom_dev-2.5.dev72.dist-info/RECORD,,
208
+ rosotacom_dev-2.5.dev73.dist-info/licenses/LICENSE.txt,sha256=FDB3-fao3lqZ94wsJHKAH7U88kAnfvZhZC8Hm5rN__g,1459
209
+ rosotacom_dev-2.5.dev73.dist-info/METADATA,sha256=Waeqm5ydlo3j0N--3kXVQXNF1QHPikSLYu3Y_dnQ9k0,58884
210
+ rosotacom_dev-2.5.dev73.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
211
+ rosotacom_dev-2.5.dev73.dist-info/entry_points.txt,sha256=im11ZWqBbgjQUBz2Ik2RNfMu54wlMwgiVpsBKeI7dCI,49
212
+ rosotacom_dev-2.5.dev73.dist-info/top_level.txt,sha256=BZrtQcIVDWn_pQZR3Mlssqy5SaRXHjOa6B-1D9Fy4Ao,10
213
+ rosotacom_dev-2.5.dev73.dist-info/RECORD,,