From 8c509e4fc8d09b4ece67d40645342eea815c8505 Mon Sep 17 00:00:00 2001
From: Matthieu Gonnet <matthieu.gonnet@smartjog.com>
Date: Wed, 31 Aug 2011 16:07:12 -0500
Subject: [PATCH] Add check command

Signed-off-by: Seblu <sebastien.luttringer@smartjog.com>
---
 bin/is                       | 13 +++++++++++++
 installsystems/repository.py | 21 +++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/bin/is b/bin/is
index 487f856..2499fb5 100755
--- a/bin/is
+++ b/bin/is
@@ -99,6 +99,14 @@ def c_cat(parser, args):
     for filename in args.file:
         img.cat(filename)
 
+def c_check(parser, args):
+    '''
+    Check for unreferenced and missing files inside a repository
+    '''
+    repoman = load_repositories(args)
+    for reponame in args.repository:
+        repoman[reponame].check()
+
 def c_clean(parser, args):
     '''
     Clean a repository
@@ -320,6 +328,11 @@ p_cat.add_argument("file", nargs="+",
                    help="file inside image to cat (globbing allowed)")
 p_cat.set_defaults(func=c_cat)
 
+# check command parser
+p_check = subparsers.add_parser("check", help=c_check.__doc__.lower())
+p_check.add_argument("repository", nargs="+", help="repositories to check")
+p_check.set_defaults(func=c_check)
+
 # clean command parser
 p_clean = subparsers.add_parser("clean", help=c_clean.__doc__.lower())
 p_clean.add_argument("repository", nargs="+", help="repositories to clean")
diff --git a/installsystems/repository.py b/installsystems/repository.py
index 3664c2f..858b528 100644
--- a/installsystems/repository.py
+++ b/installsystems/repository.py
@@ -182,6 +182,27 @@ class Repository(object):
         res = self.db.ask("SELECT md5 FROM image UNION SELECT md5 FROM payload").fetchall()
         return [ md5[0] for md5 in res ]
 
+    def check(self):
+        '''
+        Check repository for unreferenced and missing files
+        '''
+        # Check if the repo is local
+        if not istools.isfile(self.config.path):
+            raise Exception("Repository must be local")
+        local_files = set(os.listdir(self.config.path))
+        db_files = set(self.getallmd5())
+        db_files.add(self.config.dbname)
+        db_files.add( self.config.lastname)
+        # compute missing and unref files list
+        missing_files = db_files - local_files
+        unref_files = local_files - db_files
+        if len(missing_files) > 0:
+            arrow("Missing files:")
+            out(os.linesep.join(missing_files))
+        if len(unref_files) > 0:
+            arrow("Unreferenced files:")
+            out(os.linesep.join(unref_files))
+
     def clean(self):
         '''
         Clean the repository's content
-- 
GitLab