diff --git a/bin/is b/bin/is index 0e095e49b203a13d61a82cf19dfad4eeb02b35e3..4c7909a5727ee5e326ea7133fec98b1a7b4b0cd3 100755 --- a/bin/is +++ b/bin/is @@ -257,7 +257,7 @@ def c_list(parser, args): ''' repoman = load_repositories(args) for pattern in args.image: - repoman.show_images(pattern, o_long=args.long, o_json=args.json, + repoman.show_images(pattern, all_version=args.all_version, 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) @@ -505,7 +505,9 @@ p_install.set_defaults(func=c_install, subparser=p_install) # list command parser p_list = subparsers.add_parser("list", help=c_list.__doc__.lower()) -p_list.add_argument("-a", "--author", action="store_true", default=False, +p_list.add_argument("-a", "--all-version", action="store_true", default=False, + help="list all versions of the same image") +p_list.add_argument("-A", "--author", action="store_true", default=False, help="display image author") p_list.add_argument("-d", "--date", action="store_true", default=False, help="display image date") diff --git a/completion/bash/is b/completion/bash/is index 87d5f3c1138b97c39f7bcf23ee8c72ee9be0c02a..4c0e0f0d76de3fd3f260aa53ab4036b451b37bb4 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 --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 --no-sync' && return 0 _remote_image ;; move) diff --git a/installsystems/repository.py b/installsystems/repository.py index 1caf4d50667fe16830f376f843b9ccfeaa83c13a..ede1ac9757e6f3892a4c0eadc77b25f22272ea30 100644 --- a/installsystems/repository.py +++ b/installsystems/repository.py @@ -595,7 +595,7 @@ class RepositoryManager(object): ''' return [ r.config.name for r in self.repos if r.config.offline ] - def images(self, pattern): + def images(self, pattern, all_version=True): ''' Return a list of available images ''' @@ -609,6 +609,17 @@ class RepositoryManager(object): for k in images.keys(): if not fnmatch.fnmatch(k, pattern): del images[k] + # filter multiple versions + if not all_version: + for repo in set((images[i]["repo"] for i in images)): + for img in set((images[i]["name"] for i in images if images[i]["repo"] == repo)): + versions = [ images[i]['version'] + for i in images if images[i]["repo"] == repo and images[i]["name"] == img ] + f = lambda x,y: x if istools.compare_versions(x, y) > 0 else y + last = reduce(f, versions) + versions.remove(last) + for rmv in versions: + del images["%s/%s:%s" % (repo, img, rmv)] return images def get(self, name, version=None, best=False): @@ -671,7 +682,7 @@ class RepositoryManager(object): s += " (%s)" % repo.config.path out(s) - def show_images(self, pattern, o_json=False, o_long=False, + def show_images(self, pattern, all_version=True, o_json=False, o_long=False, o_md5=False, o_date=False, o_author=False, o_size=False, o_url=False, o_description=False): ''' @@ -681,7 +692,7 @@ class RepositoryManager(object): all images parameter can be given in arguments to displayed ''' # get image list - images = self.images(pattern) + images = self.images(pattern, all_version) # display result if o_json: s = json.dumps(images)