From 429589937a4565fd259eb5c24fcd0f9bd3bc57d1 Mon Sep 17 00:00:00 2001
From: Sebastien Luttringer <sebastien.luttringer@smartjog.com>
Date: Thu, 8 Dec 2011 13:47:47 +0100
Subject: [PATCH] add a local state to repositories

this state can be matched by option -l and -r in repo command
---
 bin/is                       | 18 ++++++++++------
 completion/bash/is           |  2 +-
 installsystems/repository.py | 41 ++++++++++++++++++++++--------------
 3 files changed, 38 insertions(+), 23 deletions(-)

diff --git a/bin/is b/bin/is
index 6700652..db18395 100755
--- a/bin/is
+++ b/bin/is
@@ -303,8 +303,8 @@ def c_repo(parser, args):
     '''
     repoman = load_repositories(args)
     for pattern in args.repository:
-        repoman.show_repos(pattern, online=not args.offline,
-                     offline=not args.online, url=args.verbose, state=not args.no_state)
+        repoman.show_repos(pattern, online=args.online, local=args.local,
+                           url=args.verbose, state=not args.no_state)
 
 def c_search(parser, args):
     '''
@@ -556,10 +556,16 @@ p_prepare_chroot.set_defaults(func=c_prepare_chroot)
 p_repo = subparsers.add_parser("repo", help=c_repo.__doc__.lower())
 p_repo.add_argument("--force-offline", action="store_true", default=False,
                     help="force repository to be offline")
-p_repo.add_argument("-o", "--online", action="store_true", default=False,
-                    help="list only online repository")
-p_repo.add_argument("-O", "--offline", action="store_true", default=False,
-                    help="list only offline repository")
+p_repo_mgroup = p_repo.add_mutually_exclusive_group()
+p_repo_mgroup.add_argument("-l", "--local", action="store_true", default=None,
+                           help="list local repository (filter)")
+p_repo_mgroup.add_argument("-r", "--remote", action="store_false", dest="local",
+                           help="list remote repository (filter)")
+p_repo_mgroup = p_repo.add_mutually_exclusive_group()
+p_repo_mgroup.add_argument("-o", "--online", action="store_true", default=None,
+                           help="list online repository (filter)")
+p_repo_mgroup.add_argument("-O", "--offline", action="store_false", dest="online",
+                           help="list offline repository (filter)")
 p_repo.add_argument("-S", "--no-state", action="store_true", default=False,
                     help="doesn't display repository state (online/offline)")
 p_repo.add_argument("-v", "--verbose", action="store_true", default=False,
diff --git a/completion/bash/is b/completion/bash/is
index 785c8c9..4bd6b97 100644
--- a/completion/bash/is
+++ b/completion/bash/is
@@ -139,7 +139,7 @@ _is() {
             _filedir -d
             ;;
 	repo)
-            [[ "$cur" == -* ]] && _opt '-h --help -v --verbose -o --online -O --offline -S --no-state --force-offline' && return 0
+            [[ "$cur" == -* ]] && _opt '-h --help -v --verbose -l --local -r --remote -o --online -O --offline -S --no-state --force-offline' && return 0
 	    _repo
 	    ;;
 	search)
diff --git a/installsystems/repository.py b/installsystems/repository.py
index 8c04ce9..fda172f 100644
--- a/installsystems/repository.py
+++ b/installsystems/repository.py
@@ -68,14 +68,16 @@ class Repository(object):
     def __init__(self, config):
         self.config = config
         self.version = 1
-        if not config.offline:
+        self.local = istools.isfile(self.config.path)
+        if not self.config.offline:
             try:
                 self.db = Database(config.dbpath)
             except:
                 self.config.offline = True
-        if config.offline:
+        if self.config.offline:
             debug("Repository %s is offline" % config.name)
 
+
     def __getattribute__(self, name):
         '''
         Raise an error if repository is unavailable
@@ -83,8 +85,8 @@ class Repository(object):
         because repository is not initialized
         '''
         config = object.__getattribute__(self, "config")
-        # config and init are always accessible
-        if name in ("init", "config"):
+        # config, init, local are always accessible
+        if name in ("init", "config", "local"):
             return object.__getattribute__(self, name)
         # if no db (not init or not accessible) raise error
         if config.offline:
@@ -97,7 +99,7 @@ class Repository(object):
         '''
         config = self.config
         # check local repository
-        if not istools.isfile(self.config.path):
+        if not self.local:
             raise Exception("Repository creation must be local")
         # create base directories
         arrow("Creating base directories")
@@ -128,7 +130,7 @@ class Repository(object):
         Update last file to current time
         '''
         # check local repository
-        if not istools.isfile(self.config.path):
+        if not self.local:
             raise Exception("Repository addition must be local")
         try:
             arrow("Updating last file")
@@ -155,7 +157,7 @@ class Repository(object):
         if delete is true, remove original files
         '''
         # check local repository
-        if not istools.isfile(self.config.path):
+        if not self.local:
             raise Exception("Repository addition must be local")
         # cannot add already existant image
         if self.has(image.name, image.version):
@@ -232,7 +234,7 @@ class Repository(object):
         Check repository for unreferenced and missing files
         '''
         # Check if the repo is local
-        if not istools.isfile(self.config.path):
+        if not self.local:
             raise Exception("Repository must be local")
         local_files = set(os.listdir(self.config.path))
         local_files.remove(self.config.dbname)
@@ -262,7 +264,7 @@ class Repository(object):
         Clean the repository's content
         '''
         # Check if the repo is local
-        if not istools.isfile(self.config.path):
+        if not self.local:
             raise Exception("Repository must be local")
         allmd5 = set(self.getallmd5())
         repofiles = set(os.listdir(self.config.path)) - set([self.config.dbname, self.config.lastname])
@@ -295,7 +297,7 @@ class Repository(object):
         Delete an image from repository
         '''
         # check local repository
-        if not istools.isfile(self.config.path):
+        if not self.local:
             raise Exception("Repository deletion must be local")
         # get md5 of files related to images (exception is raised if not exists
         md5s = self.getmd5(name, version)
@@ -621,18 +623,25 @@ class RepositoryManager(object):
                 return repo.get(name, version), repo
         raise Exception("Unable to find image %s v%s" % (name, version))
 
-    def show_repos(self, pattern, online=True, offline=True, url=False, state=True):
+    def show_repos(self, pattern, local=None, online=None, url=False, state=True):
         '''
         Show repository inside manager
-        online: list online repository
-        offline: list offline repository
-        verbose: display path
+        if :param online: is true, list only online repositories
+        if :param online: is false, list only offline repostiories
+        if :param online: is None, list both online and offline repostiories.
+        if :param local: is true, list only local repositories
+        if :param local: is false, list only remote repostiories
+        if :param local: is None, list both local and remote repostiories.
         '''
         for reponame in fnmatch.filter(self.names, pattern):
             repo = self[reponame]
-            if repo.config.offline and not offline:
+            if repo.config.offline and online is True:
+                continue
+            if not repo.config.offline and online is False:
+                continue
+            if repo.local and local is False:
                 continue
-            if not repo.config.offline and not online:
+            if not repo.local and local is True:
                 continue
             s = "#light##blue#%s#reset#"% repo.config.name
             if url:
-- 
GitLab