Skip to content

Commit 0ee88ae

Browse files
authored
Merge pull request #722 from jjjake/ia-delete-glob-bug
Fixed critical bug in ``ia delete --glob`` fixes #720
2 parents f7256c4 + adeb043 commit 0ee88ae

File tree

4 files changed

+155
-5
lines changed

4 files changed

+155
-5
lines changed

HISTORY.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
Release History
44
---------------
55

6-
5.6.2 (2025-10-16)
6+
5.7.0 (2025-10-16)
77
++++++++++++++++++
88

99
**Bugfixes**
1010

11+
- Fixed critical bug in ``ia delete --glob`` where all files were being deleted regardless
12+
of the glob pattern. This bug was introduced in version v5.4.1 (2025-07-16).
1113
- More metadata insert bugfixes and refactoring.
1214

1315
5.6.1 (2025-10-14)

internetarchive/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '5.6.2'
1+
__version__ = '5.7.0.dev1'

internetarchive/cli/ia_delete.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,11 @@ def get_files_to_delete(args: argparse.Namespace, item) -> list:
9696
if args.all or args.file == []:
9797
files = list(item.get_files())
9898
args.cascade = True
99-
elif args.glob:
100-
files = item.get_files(glob_pattern=args.glob)
99+
100+
if args.glob:
101+
files = list(item.get_files(glob_pattern=args.glob))
101102
elif args.format:
102-
files = item.get_files(formats=args.format)
103+
files = list(item.get_files(formats=args.format))
103104
else:
104105
fnames = [f.strip() for f in (sys.stdin if args.file == ["-"] else args.file)]
105106
files = list(item.get_files(fnames))

tests/cli/test_ia_delete.py

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import argparse
2+
import sys
3+
4+
from internetarchive.cli.ia_delete import get_files_to_delete
5+
6+
7+
def make_args(**kwargs):
8+
args = dict(all=False, file=[], glob=None, format=None, cascade=False) # noqa: C408
9+
args.update(kwargs)
10+
return argparse.Namespace(**args)
11+
12+
13+
def test_get_files_to_delete_all(nasa_item):
14+
args = make_args(all=True)
15+
files = list(get_files_to_delete(args, nasa_item))
16+
expected = {
17+
'NASAarchiveLogo.jpg',
18+
'globe_west_540.jpg',
19+
'nasa_archive.torrent',
20+
'nasa_files.xml',
21+
'nasa_meta.xml',
22+
'nasa_reviews.xml',
23+
}
24+
assert {f.name for f in files} == expected
25+
26+
27+
def test_get_files_to_delete_empty_file_list(nasa_item):
28+
args = make_args(file=[])
29+
files = list(get_files_to_delete(args, nasa_item))
30+
expected = {
31+
'NASAarchiveLogo.jpg',
32+
'globe_west_540.jpg',
33+
'nasa_archive.torrent',
34+
'nasa_files.xml',
35+
'nasa_meta.xml',
36+
'nasa_reviews.xml',
37+
}
38+
assert {f.name for f in files} == expected
39+
40+
41+
def test_get_files_to_delete_with_glob(nasa_item):
42+
args = make_args(glob="*xml")
43+
files = list(get_files_to_delete(args, nasa_item))
44+
expected = {'nasa_meta.xml', 'nasa_reviews.xml', 'nasa_files.xml'}
45+
assert {f.name for f in files} == expected
46+
47+
args = make_args(glob="*west_*")
48+
files = list(get_files_to_delete(args, nasa_item))
49+
expected = {'globe_west_540.jpg'}
50+
assert {f.name for f in files} == expected
51+
52+
args = make_args(glob="*west_*|*torrent")
53+
files = list(get_files_to_delete(args, nasa_item))
54+
expected = {'globe_west_540.jpg', 'nasa_archive.torrent'}
55+
assert {f.name for f in files} == expected
56+
57+
args = make_args(glob="nasa_[!m]*.xml")
58+
files = list(get_files_to_delete(args, nasa_item))
59+
expected = {'nasa_files.xml', 'nasa_reviews.xml'}
60+
assert {f.name for f in files} == expected
61+
62+
args = make_args(glob="nasa_???????.xml")
63+
files = list(get_files_to_delete(args, nasa_item))
64+
expected = {'nasa_reviews.xml'}
65+
assert {f.name for f in files} == expected
66+
67+
args = make_args(glob="*_[0-9]*")
68+
files = list(get_files_to_delete(args, nasa_item))
69+
expected = {'globe_west_540.jpg'}
70+
assert {f.name for f in files} == expected
71+
72+
# Match JPEG files with uppercase letters in the name prefix
73+
args = make_args(glob="[A-Z]*.jpg")
74+
files = list(get_files_to_delete(args, nasa_item))
75+
expected = {'NASAarchiveLogo.jpg'}
76+
assert {f.name for f in files} == expected
77+
78+
79+
# Match lowercase-only names ending in .jpg
80+
args = make_args(glob="[a-z]*.jpg")
81+
files = list(get_files_to_delete(args, nasa_item))
82+
expected = {'globe_west_540.jpg'}
83+
assert {f.name for f in files} == expected
84+
85+
args = make_args(glob="nasa_[fm]*.xml")
86+
files = list(get_files_to_delete(args, nasa_item))
87+
expected = {'nasa_files.xml', 'nasa_meta.xml'}
88+
assert {f.name for f in files} == expected
89+
90+
91+
args = make_args(glob="*.[a-z][a-z][a-z]")
92+
files = list(get_files_to_delete(args, nasa_item))
93+
expected = {
94+
'NASAarchiveLogo.jpg',
95+
'globe_west_540.jpg',
96+
'nasa_files.xml',
97+
'nasa_meta.xml',
98+
'nasa_reviews.xml'
99+
}
100+
assert {f.name for f in files} == expected
101+
102+
args = make_args(glob="?a*")
103+
files = list(get_files_to_delete(args, nasa_item))
104+
expected = {
105+
'nasa_archive.torrent',
106+
'nasa_files.xml',
107+
'nasa_meta.xml',
108+
'nasa_reviews.xml'
109+
}
110+
assert {f.name for f in files} == expected
111+
112+
args = make_args(glob="g*.jpg")
113+
files = list(get_files_to_delete(args, nasa_item))
114+
expected = {'globe_west_540.jpg'}
115+
assert {f.name for f in files} == expected
116+
117+
args = make_args(glob="nasa_*[st].xml")
118+
files = list(get_files_to_delete(args, nasa_item))
119+
expected = {'nasa_files.xml', 'nasa_reviews.xml'}
120+
assert {f.name for f in files} == expected
121+
122+
args = make_args(glob="[!nN]*")
123+
files = list(get_files_to_delete(args, nasa_item))
124+
expected = {'globe_west_540.jpg'}
125+
assert {f.name for f in files} == expected
126+
127+
128+
def test_get_files_to_delete_with_format(nasa_item):
129+
args = make_args(format="JPEG")
130+
files = list(get_files_to_delete(args, nasa_item))
131+
expected = {'globe_west_540.jpg'}
132+
assert {f.name for f in files} == expected
133+
134+
135+
def test_get_files_to_delete_with_explicit_file_list(nasa_item):
136+
args = make_args(file=["nasa_meta.xml", "nasa_reviews.xml"])
137+
files = list(get_files_to_delete(args, nasa_item))
138+
expected = {f.name for f in nasa_item.get_files(["nasa_meta.xml", "nasa_reviews.xml"])}
139+
assert {f.name for f in files} == expected
140+
141+
142+
def test_get_files_to_delete_with_stdin(monkeypatch, nasa_item):
143+
args = make_args(file=["-"])
144+
monkeypatch.setattr(sys, "stdin", ["nasa_meta.xml\n", "nasa_reviews.xml\n"])
145+
files = list(get_files_to_delete(args, nasa_item))
146+
expected = {f.name for f in nasa_item.get_files(["nasa_meta.xml", "nasa_reviews.xml"])}
147+
assert {f.name for f in files} == expected

0 commit comments

Comments
 (0)