This commit is contained in:
2026-01-16 04:57:05 -08:00
parent 00bee0011c
commit 0f71ec7873
8 changed files with 446 additions and 137 deletions

View File

@@ -547,6 +547,9 @@ class Add_Tag(Cmdlet):
# @N | download-file | add-tag ... | add-file ...
store_override = parsed.get("store")
stage_ctx = ctx.get_stage_context()
is_last_stage = (stage_ctx is None) or bool(
getattr(stage_ctx, "is_last_stage", False)
)
has_downstream = bool(
stage_ctx is not None and not getattr(stage_ctx,
"is_last_stage",
@@ -644,6 +647,7 @@ class Add_Tag(Cmdlet):
extract_matched_items = 0
extract_no_match_items = 0
display_items: List[Any] = []
for res in results:
store_name: Optional[str]
@@ -858,12 +862,17 @@ class Add_Tag(Cmdlet):
)
return 1
try:
existing_tag, _src = backend.get_tag(resolved_hash, config=config)
except Exception:
existing_tag = []
inline_tags = _extract_item_tags(res)
use_inline_tags = bool(inline_tags)
existing_tag_list = [t for t in (existing_tag or []) if isinstance(t, str)]
if use_inline_tags:
existing_tag_list = [t for t in inline_tags if isinstance(t, str)]
else:
try:
existing_tag, _src = backend.get_tag(resolved_hash, config=config)
except Exception:
existing_tag = []
existing_tag_list = [t for t in (existing_tag or []) if isinstance(t, str)]
existing_lower = {t.lower()
for t in existing_tag_list}
original_title = _extract_title_tag(existing_tag_list)
@@ -935,29 +944,47 @@ class Add_Tag(Cmdlet):
item_tag_to_add.append(new_tag)
changed = False
refreshed_list = list(existing_tag_list)
try:
ok_add = backend.add_tag(resolved_hash, item_tag_to_add, config=config)
from SYS.metadata import compute_namespaced_tag_overwrite
except Exception:
compute_namespaced_tag_overwrite = None # type: ignore
tags_to_remove: List[str] = []
tags_to_add: List[str] = []
merged_tags: List[str] = list(existing_tag_list)
if compute_namespaced_tag_overwrite:
try:
tags_to_remove, tags_to_add, merged_tags = compute_namespaced_tag_overwrite(
existing_tag_list,
item_tag_to_add,
)
except Exception:
tags_to_remove = []
tags_to_add = []
merged_tags = list(existing_tag_list)
try:
ok_add = backend.add_tag(
resolved_hash,
item_tag_to_add,
config=config,
existing_tags=existing_tag_list,
)
if not ok_add:
log("[add_tag] Warning: Store rejected tag update", file=sys.stderr)
except Exception as exc:
log(f"[add_tag] Warning: Failed adding tag: {exc}", file=sys.stderr)
ok_add = False
try:
refreshed_tag, _src2 = backend.get_tag(resolved_hash, config=config)
refreshed_list = [
t for t in (refreshed_tag or []) if isinstance(t, str)
]
except Exception:
refreshed_list = existing_tag_list
if ok_add and merged_tags:
refreshed_list = list(merged_tags)
else:
refreshed_list = list(existing_tag_list)
# Decide whether anything actually changed (case-sensitive so title casing updates count).
if set(refreshed_list) != set(existing_tag_list):
if tags_to_add or tags_to_remove:
changed = True
before_lower = {t.lower()
for t in existing_tag_list}
after_lower = {t.lower()
for t in refreshed_list}
total_added += len(after_lower - before_lower)
total_added += len(tags_to_add)
total_modified += 1
# Update the result's tag using canonical field
@@ -969,7 +996,7 @@ class Add_Tag(Cmdlet):
final_title = _extract_title_tag(refreshed_list)
_apply_title_to_result(res, final_title)
if final_title and (not original_title or final_title != original_title):
if final_title and (not original_title or final_title != original_title) and not is_last_stage:
_refresh_result_table_title(
final_title,
resolved_hash,
@@ -977,9 +1004,12 @@ class Add_Tag(Cmdlet):
raw_path
)
if changed:
if changed and not is_last_stage and not use_inline_tags:
_refresh_tag_view(res, resolved_hash, str(store_name), raw_path, config)
if is_last_stage:
display_items.append(res)
ctx.emit(res)
log(
@@ -987,6 +1017,29 @@ class Add_Tag(Cmdlet):
file=sys.stderr,
)
if is_last_stage and display_items:
try:
from SYS.rich_display import render_item_details_panel
from SYS.result_table import ResultTable
for idx, item in enumerate(display_items, 1):
render_item_details_panel(item, title=f"#{idx} Item Details")
table = ResultTable("Result")
for item in display_items:
table.add_result(item)
setattr(table, "_rendered_by_cmdlet", True)
subject = display_items[0] if len(display_items) == 1 else list(display_items)
ctx.set_last_result_table_overlay(table, list(display_items), subject=subject)
except Exception:
pass
try:
if stage_ctx is not None:
stage_ctx.emits = []
except Exception:
pass
if extract_template and extract_matched_items == 0:
log(
f"[add_tag] extract: no matches for template '{extract_template}' across {len(results)} item(s)",