d
This commit is contained in:
@@ -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)",
|
||||
|
||||
Reference in New Issue
Block a user