Skip to content

Commit a5fc498

Browse files
authored
Merge pull request #39 from arcivanov/release_0.1.8
Add multi-package delete capabilities
2 parents 4b69a2b + 38a4300 commit a5fc498

File tree

3 files changed

+368
-116
lines changed

3 files changed

+368
-116
lines changed

README.md

+252-24
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ Authentication with TOTP is supported.
3838

3939
```bash
4040
$ pypi-cleanup --help
41-
usage: pypi-cleanup [-h] [-u USERNAME] -p PACKAGE [-t URL] [-r PATTERNS | --leave-most-recent-only] [--query-only] [--do-it] [-y] [-d DAYS] [-v]
41+
usage: pypi-cleanup [-h] [-u USERNAME] -p PACKAGES [-t URL] [-r PATTERNS | --leave-most-recent-only] [--query-only] [--do-it] [--delete-project] [-y] [-d DAYS] [-v]
4242

43-
PyPi Package Cleanup Utility v0.1.7.dev20240624230606
43+
PyPi Package Cleanup Utility v0.1.8
4444

4545
options:
4646
-h, --help show this help message and exit
4747
-u USERNAME, --username USERNAME
4848
authentication username (default: None)
49-
-p PACKAGE, --package PACKAGE
49+
-p PACKAGES, --package PACKAGES
5050
PyPI package name (default: None)
5151
-t URL, --host URL PyPI <proto>://<host> prefix (default: https://pypi.org/)
5252
-r PATTERNS, --version-regex PATTERNS
@@ -55,32 +55,88 @@ options:
5555
delete all releases except the *most recent* one, i.e. the one containing the most recently created files (default: False)
5656
--query-only only queries and processes the package, no login required (default: False)
5757
--do-it actually perform the destructive delete (default: False)
58+
--delete-project actually perform the destructive delete that will remove all versions of the project (default: False)
5859
-y, --yes confirm extremely dangerous destructive delete (default: False)
5960
-d DAYS, --days DAYS only delete releases **matching specified patterns** where all files are older than X days (default: 0)
6061
-v, --verbose be verbose (default: 0)
6162
```
6263

64+
#### Query-Only Mode
65+
66+
Query-only mode is a safe mode that simply displays all package versions matches and exits, without requiring authentication or removing safeties:
67+
68+
```bash
69+
$ pypi-cleanup -p karellen-llvm-core -p karellen-llvm-clang -r '.*rc\d.*' --query-only
70+
INFO:root:Running in QUERY-ONLY mode
71+
INFO:root:Will use the following patterns [re.compile('.*rc\\d.*')] on package 'karellen-llvm-core'
72+
INFO:root:Found the following releases of package 'karellen-llvm-core' to delete:
73+
INFO:root: 19.1.0.0rc1.post62
74+
INFO:root: 19.1.0.0rc2
75+
INFO:root: 19.1.0.0rc2.post43
76+
INFO:root: 19.1.0.0rc2.post45
77+
INFO:root: 19.1.0.0rc2.post52
78+
INFO:root: 19.1.0.0rc2.post59
79+
INFO:root: 19.1.0.0rc2.post69
80+
INFO:root: 19.1.0.0rc3
81+
INFO:root: 19.1.0.0rc3.post12
82+
INFO:root: 19.1.0.0rc3.post50
83+
INFO:root: 19.1.0.0rc3.post53
84+
INFO:root: 19.1.0.0rc4
85+
INFO:root: 19.1.0.0rc4.post6
86+
INFO:root: 19.1.0.0rc4.post13
87+
INFO:root: 19.1.0.0rc4.post18
88+
INFO:root:Query-only mode - exiting
89+
```
90+
6391
#### Regular Cleanup of Development Artifacts
92+
93+
First without the `--do-it` confirmation, i.e. in DRY RUN mode, including authentication and getting as close as possible to deleting without actually doing it:
94+
6495
```bash
6596
$ pypi-cleanup -u arcivanov -p pybuilder
97+
INFO:root:Running in DRY RUN mode
98+
INFO:root:Will use the following patterns [re.compile('.*\\.dev\\d+$')] on package 'pybuilder'
99+
INFO:root:Found the following releases of package 'pybuilder' to delete:
100+
INFO:root: 0.13.13.dev20240604074936
101+
INFO:root: 0.13.14.dev20240814015648
102+
Password:
103+
Authentication code: 933344
104+
INFO:root:Would be deleting 'pybuilder' version 0.13.13.dev20240604074936, but not doing it!
105+
INFO:root:Would be deleting 'pybuilder' version 0.13.14.dev20240814015648, but not doing it!
106+
```
107+
108+
Now to actually delete the specificed packages
109+
```bash
110+
$ pypi-cleanup -u arcivanov -p pybuilder --do-it
111+
WARNING:root:!!! POSSIBLE DESTRUCTIVE OPERATION !!!
112+
INFO:root:Will use the following patterns [re.compile('.*\\.dev\\d+$')] on package 'pybuilder'
113+
INFO:root:Found the following releases of package 'pybuilder' to delete:
114+
INFO:root: 0.13.13.dev20240604074936
115+
INFO:root: 0.13.14.dev20240814015648
66116
Password:
67117
Authentication code: 123456
68-
INFO:root:Deleting pybuilder version 0.12.3.dev20200421010849
69-
INFO:root:Deleted pybuilder version 0.12.3.dev20200421010849
70-
INFO:root:Deleting pybuilder version 0.12.3.dev20200421010857
71-
INFO:root:Deleted pybuilder version 0.12.3.dev20200421010857
118+
WARNING:root:!!! WILL ACTUALLY DELETE THINGS - LAST CHANCE TO CHANGE YOUR MIND !!!
119+
WARNING:root:Sleeping for 5 seconds - Ctrl-C to abort!
120+
INFO:root:Deleting 'pybuilder' version 0.13.13.dev20240604074936
121+
INFO:root:Deleted 'pybuilder' version 0.13.13.dev20240604074936
122+
INFO:root:Deleting 'pybuilder' version 0.13.14.dev20240814015648
123+
INFO:root:Deleted 'pybuilder' version 0.13.14.dev20240814015648
72124
```
73125

74126
#### Using Custom Regex Pattern
127+
75128
```bash
76-
$ pypi-cleanup -u arcivanov -p geventmp -r '.*\\.dev1$'
129+
$ pypi-cleanup -u arcivanov -p geventmp -r '.*\\.dev1$'
77130
WARNING:root:
78131
WARNING:
79132
You're using custom patterns: [re.compile('.*\\\\.dev1$')].
80133
If you make a mistake in your patterns you can potentially wipe critical versions irrecoverably.
81134
Make sure to test your patterns before running the destructive cleanup.
82135
Once you're satisfied the patterns are correct re-run with `-y`/`--yes` to confirm you know what you're doing.
83136
Goodbye.
137+
```
138+
139+
```bash
84140
$ pypi-cleanup -u arcivanov -p geventmp -r '.*\\.dev1$' -y
85141
Password:
86142
WARNING:root:RUNNING IN DRY-RUN MODE
@@ -91,24 +147,14 @@ INFO:root:Deleting geventmp version 0.0.1.dev1
91147
92148
#### Deleting All Versions Except The Most Recent One
93149
94-
```bash
95-
$ pypi-cleanup -p pypi-cleanup --leave-most-recent-only
96-
WARNING:root:
97-
WARNING:
98-
You're trying to delete ALL versions of the package EXCEPT for the *most recent one*, i.e.
99-
the one with the most recent (by the wall clock) files, disregarding the actual version numbers
100-
or versioning schemes!
150+
List all versions that are going to be deleted except for the most recent one:
101151
102-
You can potentially wipe critical versions irrecoverably.
103-
Make sure this is what you really want before running the destructive cleanup.
104-
Once you're sure you want to delete all versions except the most recent one,
105-
re-run with `-y`/`--yes` to confirm you know what you're doing.
106-
Goodbye.
107-
$ pypi-cleanup -p pypi-cleanup --leave-most-recent-only -y --query-only
108-
INFO:root:Running in DRY RUN mode
152+
```bash
153+
$ pypi-cleanup -p pypi-cleanup --leave-most-recent-only --query-only
154+
INFO:root:Running in QUERY-ONLY mode
109155
INFO:root:Will only leave the MOST RECENT version of the package 'pypi-cleanup'
110-
INFO:root:Leaving the MOST RECENT package version: 0.1.7.dev20240624221535 - 2024-06-24T22:15:52.778775+0000
111-
INFO:root:Found the following releases to delete:
156+
INFO:root:Leaving the MOST RECENT version for 'pypi-cleanup': 0.1.7 - 2024-06-25T05:53:47.930884+0000
157+
INFO:root:Found the following releases of package 'pypi-cleanup' to delete:
112158
INFO:root: 0.0.1
113159
INFO:root: 0.0.2
114160
INFO:root: 0.0.3
@@ -121,3 +167,185 @@ INFO:root: 0.1.5
121167
INFO:root: 0.1.6
122168
INFO:root:Query-only mode - exiting
123169
```
170+
171+
Proceeding with deletion of everything except the most recent version requires pulling safeties:
172+
173+
```bash
174+
$ pypi-cleanup -p pypi-cleanup --leave-most-recent-only
175+
WARNING:root:
176+
WARNING:
177+
You're trying to delete ALL versions of the package EXCEPT for the *most recent one*, i.e.
178+
the one with the most recent (by the wall clock) files, disregarding the actual version numbers
179+
or versioning schemes!
180+
181+
You can potentially wipe critical versions irrecoverably.
182+
Make sure this is what you really want before running the destructive cleanup.
183+
Once you're sure you want to delete all versions except the most recent one,
184+
re-run with `-y`/`--yes` to confirm you know what you're doing.
185+
Goodbye.
186+
```
187+
188+
#### Deleting Multiple Packages
189+
190+
Specify multiple packages by adding additional `-p` arguments as follows:
191+
192+
```bash
193+
$ pypi-cleanup -p karellen-llvm-core -p karellen-llvm-clang -p karellen-llvm-lldb -p karellen-llvm-toolchain-tools -r '.*rc\d.*' -y -u karellen --do-it
194+
WARNING:root:!!! POSSIBLE DESTRUCTIVE OPERATION !!!
195+
INFO:root:Will use the following patterns [re.compile('.*rc\\d.*')] on package 'karellen-llvm-core'
196+
INFO:root:Will use the following patterns [re.compile('.*rc\\d.*')] on package 'karellen-llvm-clang'
197+
INFO:root:Will use the following patterns [re.compile('.*rc\\d.*')] on package 'karellen-llvm-lldb'
198+
INFO:root:Will use the following patterns [re.compile('.*rc\\d.*')] on package 'karellen-llvm-toolchain-tools'
199+
INFO:root:Found the following releases of package 'karellen-llvm-core' to delete:
200+
INFO:root: 19.1.0.0rc1.post62
201+
INFO:root: 19.1.0.0rc2
202+
INFO:root: 19.1.0.0rc2.post43
203+
INFO:root: 19.1.0.0rc2.post45
204+
INFO:root: 19.1.0.0rc2.post52
205+
INFO:root: 19.1.0.0rc2.post59
206+
INFO:root: 19.1.0.0rc2.post69
207+
INFO:root: 19.1.0.0rc3
208+
INFO:root: 19.1.0.0rc3.post12
209+
INFO:root: 19.1.0.0rc3.post50
210+
INFO:root: 19.1.0.0rc3.post53
211+
INFO:root: 19.1.0.0rc4
212+
INFO:root: 19.1.0.0rc4.post6
213+
INFO:root: 19.1.0.0rc4.post13
214+
INFO:root: 19.1.0.0rc4.post18
215+
INFO:root:Found the following releases of package 'karellen-llvm-clang' to delete:
216+
INFO:root: 19.1.0.0rc1.post62
217+
INFO:root: 19.1.0.0rc2
218+
INFO:root: 19.1.0.0rc2.post43
219+
INFO:root: 19.1.0.0rc2.post45
220+
INFO:root: 19.1.0.0rc2.post52
221+
INFO:root: 19.1.0.0rc2.post59
222+
INFO:root: 19.1.0.0rc2.post69
223+
INFO:root: 19.1.0.0rc3
224+
INFO:root: 19.1.0.0rc3.post12
225+
INFO:root: 19.1.0.0rc3.post50
226+
INFO:root: 19.1.0.0rc3.post53
227+
INFO:root: 19.1.0.0rc4
228+
INFO:root: 19.1.0.0rc4.post6
229+
INFO:root: 19.1.0.0rc4.post13
230+
INFO:root: 19.1.0.0rc4.post18
231+
INFO:root:Found the following releases of package 'karellen-llvm-lldb' to delete:
232+
INFO:root: 19.1.0.0rc4.post6
233+
INFO:root: 19.1.0.0rc4.post13
234+
INFO:root: 19.1.0.0rc4.post18
235+
INFO:root:Found the following releases of package 'karellen-llvm-toolchain-tools' to delete:
236+
INFO:root: 19.1.0.0rc1.post62
237+
INFO:root: 19.1.0.0rc2
238+
INFO:root: 19.1.0.0rc2.post43
239+
INFO:root: 19.1.0.0rc2.post45
240+
INFO:root: 19.1.0.0rc2.post52
241+
INFO:root: 19.1.0.0rc2.post59
242+
INFO:root: 19.1.0.0rc2.post69
243+
INFO:root: 19.1.0.0rc3
244+
INFO:root: 19.1.0.0rc3.post12
245+
INFO:root: 19.1.0.0rc3.post50
246+
INFO:root: 19.1.0.0rc3.post53
247+
INFO:root: 19.1.0.0rc4
248+
INFO:root: 19.1.0.0rc4.post6
249+
INFO:root: 19.1.0.0rc4.post13
250+
INFO:root: 19.1.0.0rc4.post18
251+
Password:
252+
Authentication code: 123456
253+
WARNING:root:!!! WILL ACTUALLY DELETE THINGS - LAST CHANCE TO CHANGE YOUR MIND !!!
254+
WARNING:root:Sleeping for 5 seconds - Ctrl-C to abort!
255+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc1.post62
256+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc1.post62
257+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc2
258+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc2
259+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc2.post43
260+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc2.post43
261+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc2.post45
262+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc2.post45
263+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc2.post52
264+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc2.post52
265+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc2.post59
266+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc2.post59
267+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc2.post69
268+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc2.post69
269+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc3
270+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc3
271+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc3.post12
272+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc3.post12
273+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc3.post50
274+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc3.post50
275+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc3.post53
276+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc3.post53
277+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc4
278+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc4
279+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc4.post6
280+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc4.post6
281+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc4.post13
282+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc4.post13
283+
INFO:root:Deleting 'karellen-llvm-core' version 19.1.0.0rc4.post18
284+
INFO:root:Deleted 'karellen-llvm-core' version 19.1.0.0rc4.post18
285+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc1.post62
286+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc1.post62
287+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc2
288+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc2
289+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc2.post43
290+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc2.post43
291+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc2.post45
292+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc2.post45
293+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc2.post52
294+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc2.post52
295+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc2.post59
296+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc2.post59
297+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc2.post69
298+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc2.post69
299+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc3
300+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc3
301+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc3.post12
302+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc3.post12
303+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc3.post50
304+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc3.post50
305+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc3.post53
306+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc3.post53
307+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc4
308+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc4
309+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc4.post6
310+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc4.post6
311+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc4.post13
312+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc4.post13
313+
INFO:root:Deleting 'karellen-llvm-clang' version 19.1.0.0rc4.post18
314+
INFO:root:Deleted 'karellen-llvm-clang' version 19.1.0.0rc4.post18
315+
INFO:root:Deleting 'karellen-llvm-lldb' version 19.1.0.0rc4.post6
316+
INFO:root:Deleted 'karellen-llvm-lldb' version 19.1.0.0rc4.post6
317+
INFO:root:Deleting 'karellen-llvm-lldb' version 19.1.0.0rc4.post13
318+
INFO:root:Deleted 'karellen-llvm-lldb' version 19.1.0.0rc4.post13
319+
INFO:root:Deleting 'karellen-llvm-lldb' version 19.1.0.0rc4.post18
320+
INFO:root:Deleted 'karellen-llvm-lldb' version 19.1.0.0rc4.post18
321+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc1.post62
322+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc1.post62
323+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2
324+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2
325+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post43
326+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post43
327+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post45
328+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post45
329+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post52
330+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post52
331+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post59
332+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post59
333+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post69
334+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc2.post69
335+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3
336+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3
337+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3.post12
338+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3.post12
339+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3.post50
340+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3.post50
341+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3.post53
342+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc3.post53
343+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4
344+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4
345+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4.post6
346+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4.post6
347+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4.post13
348+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4.post13
349+
INFO:root:Deleting 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4.post18
350+
INFO:root:Deleted 'karellen-llvm-toolchain-tools' version 19.1.0.0rc4.post18
351+
```

build.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929

3030
name = "pypi-cleanup"
31-
version = "0.1.8.dev"
31+
version = "0.1.8"
3232
summary = "PyPI Bulk Release Version Cleanup Utility"
3333

3434
authors = [Author("Arcadiy Ivanov", "[email protected]")]

0 commit comments

Comments
 (0)