df
Some checks failed
smoke-mm / Install & smoke test mm --help (push) Has been cancelled
Some checks failed
smoke-mm / Install & smoke test mm --help (push) Has been cancelled
This commit is contained in:
@@ -29,7 +29,11 @@ class Delete_Url(Cmdlet):
|
||||
arg=[
|
||||
SharedArgs.QUERY,
|
||||
SharedArgs.STORE,
|
||||
CmdletArg("url", required=False, description="URL to remove (optional when piping url rows)"),
|
||||
CmdletArg(
|
||||
"url",
|
||||
required=False,
|
||||
description="URL to remove (optional when piping url rows)",
|
||||
),
|
||||
],
|
||||
detail=[
|
||||
"- Removes URL association from file identified by hash+store",
|
||||
@@ -38,7 +42,7 @@ class Delete_Url(Cmdlet):
|
||||
exec=self.run,
|
||||
)
|
||||
self.register()
|
||||
|
||||
|
||||
def run(self, result: Any, args: Sequence[str], config: Dict[str, Any]) -> int:
|
||||
"""Delete URL from file via hash+store backend."""
|
||||
parsed = parse_cmdlet_args(args, self)
|
||||
@@ -47,9 +51,11 @@ class Delete_Url(Cmdlet):
|
||||
if parsed.get("query") and not query_hash:
|
||||
log("Error: -query must be of the form hash:<sha256>")
|
||||
return 1
|
||||
|
||||
|
||||
# Bulk input is common in pipelines; treat a list of PipeObjects as a batch.
|
||||
results: List[Any] = result if isinstance(result, list) else ([result] if result is not None else [])
|
||||
results: List[Any] = (
|
||||
result if isinstance(result, list) else ([result] if result is not None else [])
|
||||
)
|
||||
|
||||
if query_hash and len(results) > 1:
|
||||
log("Error: -query hash:<sha256> cannot be used with multiple piped items")
|
||||
@@ -57,18 +63,20 @@ class Delete_Url(Cmdlet):
|
||||
|
||||
# Extract hash and store from result or args
|
||||
file_hash = query_hash or (get_field(result, "hash") if result is not None else None)
|
||||
store_name = parsed.get("store") or (get_field(result, "store") if result is not None else None)
|
||||
store_name = parsed.get("store") or (
|
||||
get_field(result, "store") if result is not None else None
|
||||
)
|
||||
url_arg = parsed.get("url")
|
||||
|
||||
|
||||
# If we have multiple piped items, we will resolve hash/store per item below.
|
||||
if not results:
|
||||
if not file_hash:
|
||||
log("Error: No file hash provided (pipe an item or use -query \"hash:<sha256>\")")
|
||||
log('Error: No file hash provided (pipe an item or use -query "hash:<sha256>")')
|
||||
return 1
|
||||
if not store_name:
|
||||
log("Error: No store name provided")
|
||||
return 1
|
||||
|
||||
|
||||
# Normalize hash (single-item mode)
|
||||
if not results and file_hash:
|
||||
file_hash = normalize_hash(file_hash)
|
||||
@@ -87,7 +95,7 @@ class Delete_Url(Cmdlet):
|
||||
return [u.strip() for u in normalize_urls(raw) if str(u).strip()]
|
||||
|
||||
urls_from_cli = _urls_from_arg(url_arg)
|
||||
|
||||
|
||||
# Get backend and delete url
|
||||
try:
|
||||
storage = Store(config)
|
||||
@@ -129,21 +137,29 @@ class Delete_Url(Cmdlet):
|
||||
raw_hash = query_hash or get_field(item, "hash")
|
||||
raw_store = store_override or get_field(item, "store")
|
||||
if not raw_hash or not raw_store:
|
||||
ctx.print_if_visible("[delete-url] Warning: Item missing hash/store; skipping", file=sys.stderr)
|
||||
ctx.print_if_visible(
|
||||
"[delete-url] Warning: Item missing hash/store; skipping",
|
||||
file=sys.stderr,
|
||||
)
|
||||
continue
|
||||
|
||||
normalized = normalize_hash(raw_hash)
|
||||
if not normalized:
|
||||
ctx.print_if_visible("[delete-url] Warning: Item has invalid hash; skipping", file=sys.stderr)
|
||||
ctx.print_if_visible(
|
||||
"[delete-url] Warning: Item has invalid hash; skipping", file=sys.stderr
|
||||
)
|
||||
continue
|
||||
|
||||
store_text = str(raw_store).strip()
|
||||
if not store_text:
|
||||
ctx.print_if_visible("[delete-url] Warning: Item has empty store; skipping", file=sys.stderr)
|
||||
ctx.print_if_visible(
|
||||
"[delete-url] Warning: Item has empty store; skipping", file=sys.stderr
|
||||
)
|
||||
continue
|
||||
if not storage.is_available(store_text):
|
||||
ctx.print_if_visible(
|
||||
f"[delete-url] Warning: Store '{store_text}' not configured; skipping", file=sys.stderr
|
||||
f"[delete-url] Warning: Store '{store_text}' not configured; skipping",
|
||||
file=sys.stderr,
|
||||
)
|
||||
continue
|
||||
|
||||
@@ -152,9 +168,17 @@ class Delete_Url(Cmdlet):
|
||||
# - Otherwise, when piping url rows from get-url, delete the url(s) from each item.
|
||||
item_urls = list(urls_from_cli)
|
||||
if not item_urls:
|
||||
item_urls = [u.strip() for u in normalize_urls(get_field(item, "url") or get_field(item, "source_url")) if str(u).strip()]
|
||||
item_urls = [
|
||||
u.strip()
|
||||
for u in normalize_urls(
|
||||
get_field(item, "url") or get_field(item, "source_url")
|
||||
)
|
||||
if str(u).strip()
|
||||
]
|
||||
if not item_urls:
|
||||
ctx.print_if_visible("[delete-url] Warning: Item has no url field; skipping", file=sys.stderr)
|
||||
ctx.print_if_visible(
|
||||
"[delete-url] Warning: Item has no url field; skipping", file=sys.stderr
|
||||
)
|
||||
continue
|
||||
|
||||
batch.setdefault(store_text, []).append((normalized, item_urls))
|
||||
@@ -168,7 +192,7 @@ class Delete_Url(Cmdlet):
|
||||
merged: Dict[str, List[str]] = {}
|
||||
for h, ulist in pairs:
|
||||
merged.setdefault(h, [])
|
||||
for u in (ulist or []):
|
||||
for u in ulist or []:
|
||||
if u and u not in merged[h]:
|
||||
merged[h].append(u)
|
||||
bulk_pairs = [(h, merged[h]) for h in merged.keys()]
|
||||
@@ -195,27 +219,41 @@ class Delete_Url(Cmdlet):
|
||||
# remove the piped url row(s).
|
||||
remove_set = urls_from_cli
|
||||
if not remove_set:
|
||||
remove_set = [u.strip() for u in normalize_urls(get_field(item, "url") or get_field(item, "source_url")) if str(u).strip()]
|
||||
remove_set = [
|
||||
u.strip()
|
||||
for u in normalize_urls(
|
||||
get_field(item, "url") or get_field(item, "source_url")
|
||||
)
|
||||
if str(u).strip()
|
||||
]
|
||||
_set_item_url(item, _remove_urls(existing, list(remove_set)))
|
||||
ctx.emit(item)
|
||||
return 0
|
||||
|
||||
# Single-item mode
|
||||
if not urls_from_cli:
|
||||
urls_from_cli = [u.strip() for u in normalize_urls(get_field(result, "url") or get_field(result, "source_url")) if str(u).strip()]
|
||||
urls_from_cli = [
|
||||
u.strip()
|
||||
for u in normalize_urls(
|
||||
get_field(result, "url") or get_field(result, "source_url")
|
||||
)
|
||||
if str(u).strip()
|
||||
]
|
||||
if not urls_from_cli:
|
||||
log("Error: No URL provided")
|
||||
return 1
|
||||
|
||||
backend = storage[str(store_name)]
|
||||
backend.delete_url(str(file_hash), list(urls_from_cli), config=config)
|
||||
ctx.print_if_visible(f"✓ delete-url: {len(urls_from_cli)} url(s) removed", file=sys.stderr)
|
||||
ctx.print_if_visible(
|
||||
f"✓ delete-url: {len(urls_from_cli)} url(s) removed", file=sys.stderr
|
||||
)
|
||||
if result is not None:
|
||||
existing = get_field(result, "url")
|
||||
_set_item_url(result, _remove_urls(existing, list(urls_from_cli)))
|
||||
ctx.emit(result)
|
||||
return 0
|
||||
|
||||
|
||||
except KeyError:
|
||||
log(f"Error: Storage backend '{store_name}' not configured")
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user