aboutsummaryrefslogtreecommitdiff
path: root/src/feature/syncclean.nim
diff options
context:
space:
mode:
Diffstat (limited to 'src/feature/syncclean.nim')
-rw-r--r--src/feature/syncclean.nim51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/feature/syncclean.nim b/src/feature/syncclean.nim
new file mode 100644
index 0000000..2e57908
--- /dev/null
+++ b/src/feature/syncclean.nim
@@ -0,0 +1,51 @@
+import
+ future, options, os, posix, sequtils, strutils, tables,
+ "../args", "../aur", "../common", "../config", "../format", "../lists",
+ "../package", "../pacman", "../utils",
+ "../wrapper/alpm"
+
+proc handleSyncClean*(args: seq[Argument], config: Config): int =
+ let code = pacmanRun(true, config.color, args)
+ if code != 0:
+ code
+ else:
+ let cleanCount = args.count(%%%"clean")
+ let noconfirm = args.noconfirm
+
+ let reposCacheDir = config.userCacheCurrent.cache(CacheKind.repositories)
+ let homeDir = currentUser.home
+ let printReposCacheDir = if reposCacheDir.find(homeDir & "/") == 0:
+ '~' & reposCacheDir[homeDir.len .. ^1]
+ else:
+ reposCacheDir
+ echo()
+ echo(tr"Repositories directory: $#" % [printReposCacheDir])
+
+ if (cleanCount == 1 and
+ printColonUserChoice(config.color, tr"Do you want to remove unused repositories?",
+ ['y', 'n'], 'y', 'n', noconfirm, 'y') == 'y') or
+ (cleanCount >= 2 and
+ printColonUserChoice(config.color, tr"Do you want to remove ALL repositories?",
+ ['y', 'n'], 'n', 'n', noconfirm, 'n') == 'y'):
+ if cleanCount == 1:
+ echo(tr"removing unused package repositories...")
+ else:
+ echo(tr"removing all package repositories...")
+
+ if existsDir(reposCacheDir):
+ withAlpmConfig(config, false, handle, dbs, errors):
+ for e in errors: printError(config.color, e)
+
+ let local = handle.local
+ for file in walkDir(reposCacheDir):
+ if file.kind == pcDir:
+ let index = file.path.rfind('/')
+ let dirName = if index >= 0: file.path[index + 1 .. ^1] else: file.path
+ for name in bareFullNameDeconstruct(BareKind.pkg, dirName):
+ if cleanCount >= 2 or local[name] == nil:
+ removeDirQuiet(file.path)
+
+ discard rmdir(reposCacheDir)
+ discard rmdir(config.userCacheCurrent)
+
+ 0