diff --git a/bin/is b/bin/is index b5505987693107d1ab935f9c082837739d214708..ec32bdce7ccbef29cd84e1d3b124f85904ff15d6 100755 --- a/bin/is +++ b/bin/is @@ -37,8 +37,7 @@ def load_repositories(args): args.cache = None # split filter in list if args.repo_filter is not None: - args.repo_filter = [f for f in re.split("[ ,\n\t\v]+", args.repo_filter) - if f != ""] + args.repo_filter = split_repositories(args.repo_filter) # init repo cache object repoman = RepositoryManager(args.cache, timeout=args.timeout, filter=args.repo_filter) # register repositories (order matter) @@ -55,6 +54,14 @@ def load_repositories(args): offline=hasattr(args, "force_offline") and args.force_offline) return repoman +def split_repositories(repos, filter=None): + ''' + Return a list of repository from an comma/space separated list of repo + ''' + if filter is None: + filter = lambda x: x != "" + return [r for r in re.split("[ ,\n\t\v]+", repos) if filter(r)] + def select_image(name, repoman, best=False): ''' Select and load a package image from a standard naming type @@ -77,8 +84,8 @@ def select_image(name, repoman, best=False): if repo is None: # split search path as a list if args.repo_search is not None: - args.repo_search = [s for s in re.split("[ ,\n\t\v]+", args.repo_search) - if s in repoman.onlines] + args.repo_search = split_repositories(args.repo_search, + lambda x: x in repoman.onlines) else: args.repo_search = [] # if we have only one repo, search in it @@ -285,8 +292,11 @@ def c_list(parser, args): List images in repository or image content ''' repoman = load_repositories(args) + if args.search is not None: + args.search = split_repositories(args.repo_search, lambda x: x in repoman.onlines) for pattern in args.image: - repoman.show_images(pattern, all_version=args.all_version, o_long=args.long, o_json=args.json, + repoman.show_images(pattern, all_version=args.all_version, search=args.search, + o_long=args.long, o_json=args.json, o_md5=args.md5, o_date=args.date, o_author=args.author, o_size=args.size, o_url=args.url, o_description=args.description) @@ -560,6 +570,8 @@ p_list.add_argument("-s", "--size", action="store_true", default=False, help="display image size") p_list.add_argument("-u", "--url", action="store_true", default=False, help="display image url") +p_list.add_argument("-S", "--search", action="store_true", default=None, + help="only list image in search path") p_list.add_argument("image", nargs="*", default=['*'], help="image syntax is [repository/]image[:version]") p_list.set_defaults(func=c_list) diff --git a/completion/bash/is b/completion/bash/is index 4c0e0f0d76de3fd3f260aa53ab4036b451b37bb4..66bcfd634e6c0ba243bf099ee080f10430dd274a 100644 --- a/completion/bash/is +++ b/completion/bash/is @@ -127,7 +127,7 @@ _is() { (( args > 2 )) && _filedir ;; list) - [[ "$cur" == -* ]] && _opt '-h --help -l --long -j --json -m --md5 -s --size -d --date -a --all-version -A --author -u --url -D --description --no-sync' && return 0 + [[ "$cur" == -* ]] && _opt '-h --help -l --long -j --json -m --md5 -s --size -d --date -a --all-version -A --author -u --url -D --description -S --search --no-sync' && return 0 _remote_image ;; move) diff --git a/installsystems/repository.py b/installsystems/repository.py index 8128c0fc52c0994cfc5eb00affdf1f67da7f9f9d..6873835d7002d8759aee0e8323f9c63fb8d838b3 100644 --- a/installsystems/repository.py +++ b/installsystems/repository.py @@ -597,13 +597,15 @@ class RepositoryManager(object): ''' return [ r.config.name for r in self.repos if r.config.offline ] - def images(self, pattern, all_version=True): + def images(self, pattern, all_version=True, search=None): ''' Return a list of available images ''' + if search is None: + search = self.onlines # building image list images = {} - for reponame in self.onlines: + for reponame in search: for img in self[reponame].images(): imgname = u"%s/%s:%s" % (reponame, img["name"], img["version"]) images[imgname] = img @@ -686,7 +688,8 @@ class RepositoryManager(object): s += " (%s)" % repo.config.path out(s) - def show_images(self, pattern, all_version=True, o_json=False, o_long=False, + def show_images(self, pattern, all_version=True, search=None, + o_json=False, o_long=False, o_md5=False, o_date=False, o_author=False, o_size=False, o_url=False, o_description=False): ''' @@ -696,7 +699,7 @@ class RepositoryManager(object): all images parameter can be given in arguments to displayed ''' # get image list - images = self.images(pattern, all_version) + images = self.images(pattern, all_version, search) # display result if o_json: s = json.dumps(images)