Skip to content

Commit f9e67e5

Browse files
committed
refactor: backup handling to remove global list-backups support
- Removed support for listing all apps with backups globally. - Updated `--list-backups` to require a specific app name. - Simplified `_handle_list_backups` to focus on app-specific backups. - Replaced `logger` calls with `print` for consistent output formatting. - Updated tests to reflect the removal of global list-backups functionality.
1 parent 11cc8fa commit f9e67e5

File tree

3 files changed

+351
-149
lines changed

3 files changed

+351
-149
lines changed

my_unicorn/cli/parser.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,7 @@ def _add_backup_command(self, subparsers) -> None:
250250
# List backups for specific app
251251
%(prog)s appflowy --list-backups
252252
253-
# List all apps with backups
254-
%(prog)s --list-backups
253+
255254
256255
# Show backup info
257256
%(prog)s appflowy --info
@@ -284,7 +283,7 @@ def _add_backup_command(self, subparsers) -> None:
284283
action_group.add_argument(
285284
"--list-backups",
286285
action="store_true",
287-
help="List available backups (for specific app or all apps)",
286+
help="List available backups for the specified app",
288287
)
289288

290289
action_group.add_argument(

my_unicorn/commands/backup.py

Lines changed: 33 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,14 @@ def _validate_arguments(self, args: Namespace) -> bool:
6969
7070
"""
7171
# Operations that don't require app_name
72-
if (
73-
args.migrate
74-
or (args.list_backups and not args.app_name)
75-
or (args.cleanup and not args.app_name)
76-
):
72+
if args.migrate or (args.cleanup and not args.app_name):
7773
return True
7874

7975
# All other operations require app_name
8076
if not args.app_name:
8177
logger.error("❌ App name is required for this operation")
8278
logger.info("💡 Usage: backup <app_name> [options]")
83-
logger.info(
84-
"💡 For global operations, use: backup --list-backups, backup --cleanup, or backup --migrate"
85-
)
79+
logger.info("💡 For global operations, use: backup --cleanup or backup --migrate")
8680
return False
8781

8882
# Validate app_name format (basic sanitization)
@@ -220,17 +214,14 @@ async def _handle_create_backup(self, app_name: str) -> None:
220214
except Exception as e:
221215
logger.error(f"❌ Failed to create backup for {app_name}: {e}")
222216

223-
async def _handle_list_backups(self, app_name: str | None = None) -> None:
224-
"""Handle list backups operation.
217+
async def _handle_list_backups(self, app_name: str) -> None:
218+
"""Handle list backups operation for a specific app.
225219
226220
Args:
227-
app_name: Name of specific app or None to list all apps with backups
221+
app_name: Name of the application
228222
229223
"""
230-
if app_name:
231-
await self._list_backups_for_app(app_name)
232-
else:
233-
await self._list_all_apps_with_backups()
224+
await self._list_backups_for_app(app_name)
234225

235226
async def _list_backups_for_app(self, app_name: str) -> None:
236227
"""List backups for a specific app.
@@ -245,11 +236,11 @@ async def _list_backups_for_app(self, app_name: str) -> None:
245236
backups = self.backup_service.get_backup_info(app_name)
246237

247238
if not backups:
248-
logger.info(f"No backups found for {app_name}")
239+
print(f"No backups found for {app_name}")
249240
return
250241

251-
logger.info(f"\n📦 Available backups for {app_name}:")
252-
logger.info("=" * 60)
242+
print(f"\n📋 Available backups for {app_name}:")
243+
print("=" * 60)
253244

254245
for backup in backups:
255246
version = backup["version"]
@@ -261,47 +252,17 @@ async def _list_backups_for_app(self, app_name: str) -> None:
261252
)
262253
exists_symbol = "✅" if backup["exists"] else "❌"
263254

264-
logger.info(f" {exists_symbol} v{version}")
265-
logger.info(f" 📁 File: {backup['filename']}")
266-
logger.info(f" 📏 Size: {size_mb:.1f} MB")
267-
logger.info(f" 📅 Created: {created}")
255+
print(f" {exists_symbol} v{version}")
256+
print(f" 📁 File: {backup['filename']}")
257+
print(f" 📏 Size: {size_mb:.1f} MB")
258+
print(f" 📅 Created: {created}")
268259
if backup.get("sha256"):
269-
logger.info(f" 🔐 SHA256: {backup['sha256'][:16]}...")
270-
logger.info("")
260+
print(f" 🔐 SHA256: {backup['sha256'][:16]}...")
261+
print("")
271262

272263
except Exception as e:
273264
logger.error(f"❌ Failed to list backups for {app_name}: {e}")
274265

275-
async def _list_all_apps_with_backups(self) -> None:
276-
"""List all apps that have backups."""
277-
logger.info("📋 Listing all apps with backups...")
278-
279-
try:
280-
apps_with_backups = self.backup_service.list_apps_with_backups()
281-
282-
if not apps_with_backups:
283-
logger.info("No apps with backups found")
284-
logger.info("💡 Create backups using 'backup <app_name>'")
285-
return
286-
287-
logger.info(f"\n📦 Apps with backups ({len(apps_with_backups)}):")
288-
logger.info("=" * 60)
289-
290-
for app_name in apps_with_backups:
291-
backups = self.backup_service.get_backup_info(app_name)
292-
backup_count = len(backups)
293-
latest_version = backups[0]["version"] if backups else "Unknown"
294-
295-
logger.info(f" 📱 {app_name}")
296-
logger.info(f" 📊 Backups: {backup_count}")
297-
logger.info(f" 🔄 Latest: v{latest_version}")
298-
logger.info("")
299-
300-
logger.info("💡 Use 'backup <app_name> --list-backups' for detailed info")
301-
302-
except Exception as e:
303-
logger.error(f"❌ Failed to list apps with backups: {e}")
304-
305266
async def _handle_cleanup(self, app_name: str | None = None) -> None:
306267
"""Handle cleanup old backups operation.
307268
@@ -310,20 +271,18 @@ async def _handle_cleanup(self, app_name: str | None = None) -> None:
310271
311272
"""
312273
if app_name:
313-
logger.info(f"🧹 Cleaning up old backups for {app_name}...")
274+
print(f"🧹 Cleaning up old backups for {app_name}...")
314275
else:
315-
logger.info("🧹 Cleaning up old backups for all apps...")
276+
print("🧹 Cleaning up old backups for all apps...")
316277

317278
try:
318279
self.backup_service.cleanup_old_backups(app_name)
319280

320281
max_backups = self.global_config["max_backup"]
321282
if max_backups == 0:
322-
logger.info("✅ All backups removed (max_backup=0)")
283+
print("✅ All backups removed (max_backup=0)")
323284
else:
324-
logger.info(
325-
f"✅ Cleanup completed (keeping {max_backups} most recent backups)"
326-
)
285+
print(f"✅ Cleanup completed (keeping {max_backups} most recent backups)")
327286

328287
except Exception as e:
329288
logger.error(f"❌ Failed to cleanup backups: {e}")
@@ -335,17 +294,17 @@ async def _handle_info(self, app_name: str) -> None:
335294
app_name: Name of the application
336295
337296
"""
338-
logger.info(f"ℹ️ Backup information for {app_name}...")
297+
print(f"ℹ️ Backup information for {app_name}...")
339298

340299
try:
341300
backups = self.backup_service.get_backup_info(app_name)
342301

343302
if not backups:
344-
logger.info(f"No backup information available for {app_name}")
303+
print(f"No backup information available for {app_name}")
345304
return
346305

347-
logger.info(f"\n📊 Backup Statistics for {app_name}:")
348-
logger.info("=" * 60)
306+
print(f"\n📊 Backup Statistics for {app_name}:")
307+
print("=" * 60)
349308

350309
total_backups = len(backups)
351310
total_size = sum(b["size"] for b in backups if b["size"])
@@ -354,53 +313,47 @@ async def _handle_info(self, app_name: str) -> None:
354313
oldest_backup = backups[-1] if backups else None
355314
newest_backup = backups[0] if backups else None
356315

357-
logger.info(f" 📦 Total backups: {total_backups}")
358-
logger.info(f" 📏 Total size: {total_size_mb:.1f} MB")
316+
print(f" 📦 Total backups: {total_backups}")
317+
print(f" 📏 Total size: {total_size_mb:.1f} MB")
359318

360319
if newest_backup:
361320
latest_created = (
362321
newest_backup["created"].strftime("%Y-%m-%d %H:%M:%S")
363322
if newest_backup["created"]
364323
else "Unknown"
365324
)
366-
logger.info(
367-
f" 🆕 Latest version: v{newest_backup['version']} ({latest_created})"
368-
)
325+
print(f" 🆕 Latest version: v{newest_backup['version']} ({latest_created})")
369326

370327
if oldest_backup:
371328
oldest_created = (
372329
oldest_backup["created"].strftime("%Y-%m-%d %H:%M:%S")
373330
if oldest_backup["created"]
374331
else "Unknown"
375332
)
376-
logger.info(
377-
f" 📜 Oldest version: v{oldest_backup['version']} ({oldest_created})"
378-
)
333+
print(f" 📜 Oldest version: v{oldest_backup['version']} ({oldest_created})")
379334

380335
# Backup configuration
381336
max_backups = self.global_config["max_backup"]
382337
backup_dir = self.global_config["directory"]["backup"]
383338

384-
logger.info("\n⚙️ Configuration:")
385-
logger.info(f" 📁 Backup directory: {backup_dir}")
386-
logger.info(
387-
f" 🔄 Max backups kept: {max_backups if max_backups > 0 else 'unlimited'}"
388-
)
339+
print("\n⚙️ Configuration:")
340+
print(f" 📁 Backup directory: {backup_dir}")
341+
print(f" 🔄 Max backups kept: {max_backups if max_backups > 0 else 'unlimited'}")
389342

390343
except Exception as e:
391344
logger.error(f"❌ Failed to get backup info for {app_name}: {e}")
392345

393346
async def _handle_migrate(self) -> None:
394347
"""Handle migration of old backup format."""
395-
logger.info("🔄 Migrating old backup files to new format...")
348+
print("🔄 Migrating old backup files to new format...")
396349

397350
try:
398351
migrated_count = self.backup_service.migrate_old_backups()
399352

400353
if migrated_count > 0:
401-
logger.info(f"✅ Successfully migrated {migrated_count} backup files")
354+
print(f"✅ Successfully migrated {migrated_count} backup files")
402355
else:
403-
logger.info("ℹ️ No old backup files found to migrate")
356+
print("ℹ️ No old backup files found to migrate")
404357

405358
except Exception as e:
406359
logger.error(f"❌ Failed to migrate old backups: {e}")

0 commit comments

Comments
 (0)