diff --git a/bin/is b/bin/is index 0fd362c0af794bb8a45540813a01609157633604..487f856a041796618b1761b2c3d5906ed9f23748 100755 --- a/bin/is +++ b/bin/is @@ -103,7 +103,9 @@ def c_clean(parser, args): ''' Clean a repository ''' - raise NotImplementedError("Not yet implemented") + repoman = load_repositories(args) + for reponame in args.repository: + repoman[reponame].clean() def c_copy(parser, args): ''' @@ -320,6 +322,7 @@ p_cat.set_defaults(func=c_cat) # clean command parser p_clean = subparsers.add_parser("clean", help=c_clean.__doc__.lower()) +p_clean.add_argument("repository", nargs="+", help="repositories to clean") p_clean.set_defaults(func=c_clean) # copy command parser diff --git a/installsystems/repository.py b/installsystems/repository.py index c570ea63cdf343e6ec989d3e685dbe10b0af85ff..1623dcf702baa6897ebefa2a3766c7b6ba64418d 100644 --- a/installsystems/repository.py +++ b/installsystems/repository.py @@ -175,6 +175,36 @@ class Repository(object): arrow(os.path.basename(obj.path), 1) os.unlink(obj.path) + def getallmd5(self): + ''' + Get list of all md5 in DB + ''' + res = self.db.ask("SELECT md5 FROM image UNION SELECT md5 FROM payload").fetchall() + return [ md5[0] for md5 in res ] + + def clean(self): + ''' + Clean the repository's content + ''' + # Check if the repo is local + if not istools.isfile(self.config.path): + raise Exception("Repository must be local") + allmd5 = set(self.getallmd5()) + repofiles = set(os.listdir(self.config.path)) - set([self.config.dbname, self.config.lastname]) + dirtyfiles = repofiles - allmd5 + if len(dirtyfiles) > 0: + if not confirm("Remove dirty files? (yes) "): + raise Exception("Aborted!") + for f in dirtyfiles: + p = os.path.join(self.config.path, f) + try: + if os.path.isdir(p): + os.rmdir(p) + else: + os.unlink(p) + except: + raise Exception("Removing %s failed" % p) + def delete(self, name, version): ''' Delete an image from repository