Loading bin/is +23 −27 Original line number Diff line number Diff line Loading @@ -251,20 +251,11 @@ def c_list(parser, args): ''' List images in repository or image content ''' # List available repositories repoman = load_repositories(args) if len(args.object) == 0: arrow("Repositories") repoman.show('*', url=args.verbose) else: for o in args.object: repos = fnmatch.filter(repoman.onlines, o) if len(repos) > 0: for reponame in repos: repoman[reponame].show(verbose=args.verbose, aspath=args.as_path) else: img, repo = select_image(o, repoman, args.best) img.show(verbose=args.verbose, changelog=args.changelog) for pattern in args.image: repoman.show_images(pattern, 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) def c_move(parser, args): ''' Loading Loading @@ -300,12 +291,9 @@ def c_repo(parser, args): ''' Get information about repositories ''' # List available repositories repoman = load_repositories(args, force_offline=args.local) # if len(args.repository) == 0: # args.repository = ['*'] for pattern in args.repository: repoman.show(pattern, online=not args.offline, repoman.show_repos(pattern, online=not args.offline, offline=not args.online, url=args.verbose, state=not args.no_state) def c_search(parser, args): Loading Loading @@ -499,16 +487,24 @@ 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("-v", "--verbose", action="store_true", default=False, help="verbose output") p_list.add_argument("-b", "--best", action="store_true", default=False, help="in best mode, image is the most recent in all repositories") p_list.add_argument("-c", "--changelog", action="store_true", default=False, help="display image changelog") p_list.add_argument("-p", "--as-path", action="store_true", default=False, help="display repository content as path") p_list.add_argument("object", nargs="*", help="object syntax is <path|repository|[repository/]image[:version]>") p_list.add_argument("-j", "--json", action="store_true", default=False, help="long display") p_list.add_argument("-l", "--long", action="store_true", default=False, help="long display") p_list.add_argument("-m", "--md5", action="store_true", default=False, help="display image md5") p_list.add_argument("-s", "--size", action="store_true", default=False, help="display image size") p_list.add_argument("-d", "--date", action="store_true", default=False, help="display image date") p_list.add_argument("-a", "--author", action="store_true", default=False, help="display image author") p_list.add_argument("-u", "--url", action="store_true", default=False, help="display image url") p_list.add_argument("-D", "--description", action="store_true", default=False, help="display image description") p_list.add_argument("image", nargs="*", default=['*'], help="image syntax is [repository/]image[:version]") p_list.set_defaults(func=c_list, subparser=p_list) # move command parser Loading completion/bash/is +20 −10 Original line number Diff line number Diff line Loading @@ -6,8 +6,19 @@ _repo() { } # list all images available in any online repositories _remote_image() { COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(is -q --no-color list)" -- "$cur")) } # list all local (files) images _local_image() { COMPREPLY=("${COMPREPLY[@]}" $(compgen -f -X '!*.isimage' -- "$cur")) } # list local and remote images _image() { COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(is -q --no-color list -p '*')" -- "$cur") $(compgen -f -X '!*.isimage' -- "$cur")) _local_image _remote_image } # generate completion from optional arguments Loading Loading @@ -75,17 +86,17 @@ _is() { copy) [[ "$cur" == -* ]] && _opt '-h --help -b --best' && return 0 _count_args (( args == 2 )) && _image (( args > 2 )) && _image && _repo (( args == 2 )) && _remote_image (( args > 2 )) && _remote_image && _repo ;; del) [[ "$cur" == -* ]] && _opt '-h --help -b --best -f --force -p --preserve' && return 0 _image _remote_image ;; diff) [[ "$cur" == -* ]] && _opt '-h --help -b --best' && return 0 _count_args (( args < 4 )) && c_args=$(images) (( args < 4 )) && _image ;; extract) [[ "$cur" == -* ]] && _opt '-h --help -f --force -b --best -p --payload -g --gen-description' && return 0 Loading @@ -95,7 +106,7 @@ _is() { ;; get) [[ "$cur" == -* ]] && _opt '-h --help -f --force -b --best --payload -I --no-image' && return 0 _image _remote_image ;; help) _count_args Loading @@ -116,13 +127,12 @@ _is() { (( args > 2 )) && _filedir ;; list) [[ "$cur" == -* ]] && _opt '-h --help -b --best --verbose -c --changelog -p --as-path' && return 0 _repo _image [[ "$cur" == -* ]] && _opt '-h --help -l --long -j --json -m --md5 -s --size -d --date -a --author -u --url -D --description' && return 0 _remote_image ;; move) [[ "$cur" == -* ]] && _opt '-h --help -b --best -f --force' && return 0 _image _remote_image ;; new) [[ "$cur" == -* ]] && _opt '-h --help -f --force' && return 0 Loading installsystems/repository.py +57 −29 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ import time import shutil import pwd import grp import json import tempfile import fnmatch import cStringIO Loading Loading @@ -320,37 +321,20 @@ class Repository(object): # update last file self.update_last() def show(self, verbose=False, aspath=False): def images(self): ''' List images in repository Return a dict of informations on images ''' if aspath: images = self.db.ask("SELECT md5, name, version FROM image ORDER BY name, version").fetchall() for (image_md5, image_name, image_version) in images: s = "#light##blue#%s#reset#/#light##yellow#%s#reset#:#light##red#%s#reset#" % ( self.config.name, image_name, image_version) if verbose: s += " [%s]" % image_md5 out(s) else: arrow(self.config.name) images = self.db.ask("SELECT md5, name, version, date,\ db_images = self.db.ask("SELECT md5, name, version, date,\ author, description, size FROM image ORDER BY name, version").fetchall() for (image_md5, image_name, image_version, image_date, image_author, image_description, image_size) in images: out("#light##yellow#%s #reset#v%s" % (image_name, image_version)) if verbose: out(" #yellow#Date:#reset# %s" % istools.time_rfc2822(image_date)) out(" #yellow#Description:#reset# %s" % image_description) out(" #yellow#Author:#reset# %s" % image_author) out(" #yellow#MD5:#reset# %s" % image_md5) payloads = self.db.ask("SELECT md5, name, size FROM payload\ WHERE image_md5 = ?", (image_md5,)).fetchall() for payload_md5, payload_name, payload_size in payloads: out(" #light##yellow#Payload:#reset# %s" % payload_name) out(" #yellow#Size:#reset# %s" % (istools.human_size(payload_size))) out(" #yellow#MD5:#reset# %s" % payload_md5) out() images = [] field = ("md5", "name", "version", "date", "author", "description", "size") for info in db_images: d = dict(zip(field, info)) d["repo"] = self.config.name d["url"] = os.path.join(self.config.path, d["md5"]) images.append(d) return images def search(self, pattern): ''' Loading Loading @@ -631,7 +615,7 @@ class RepositoryManager(object): return repo.get(name, version), repo raise Exception("Unable to find image %s v%s" % (name, version)) def show(self, pattern, online=True, offline=True, url=False, state=True): def show_repos(self, pattern, online=True, offline=True, url=False, state=True): ''' Show repository inside manager online: list online repository Loading @@ -651,6 +635,50 @@ class RepositoryManager(object): s += " #light##red#[offline]#reset#" out(s) def show_images(self, pattern, o_json=False, o_long=False, o_md5=False, o_date=False, o_author=False, o_size=False, o_url=False, o_description=False): ''' Show repository inside manager json: display output in json long: display output in long format all images parameter can be given in arguments to displayed ''' # building image list images = {} for reponame in self.onlines: for img in self[reponame].images(): imgname = u"%s/%s:%s" % (reponame, img["name"], img["version"]) images[imgname] = img # filter with pattern for k in images.keys(): if not fnmatch.fnmatch(k, pattern): del images[k] # display result if o_json: s = json.dumps(images) else: l = [] for imgp in sorted(images.keys()): img = images[imgp] l.append(u"#light##blue#%s#reset#/#light#%s#reset#:#light##purple#%s#reset#" % ( img["repo"], img["name"], img["version"])) if o_md5 or o_long: l.append(u" #light#md5:#reset# %s" % img["md5"]) if o_date or o_long: l.append(u" #light#date:#reset# %s" % istools.time_rfc2822(img["date"])) if o_author or o_long: l.append(u" #light#author:#reset# %s" % img["author"]) if o_size or o_long: l.append(u" #light#size:#reset# %s" % istools.human_size(img["size"])) if o_url or o_long: l.append(u" #light#url:#reset# %s" % img["url"]) if o_description or o_long: l.append(u" #light#description:#reset# %s" % img["description"]) s = os.linesep.join(l) if len(s) > 0: out(s) def search(self, pattern): ''' Search pattern accross all registered repositories Loading Loading
bin/is +23 −27 Original line number Diff line number Diff line Loading @@ -251,20 +251,11 @@ def c_list(parser, args): ''' List images in repository or image content ''' # List available repositories repoman = load_repositories(args) if len(args.object) == 0: arrow("Repositories") repoman.show('*', url=args.verbose) else: for o in args.object: repos = fnmatch.filter(repoman.onlines, o) if len(repos) > 0: for reponame in repos: repoman[reponame].show(verbose=args.verbose, aspath=args.as_path) else: img, repo = select_image(o, repoman, args.best) img.show(verbose=args.verbose, changelog=args.changelog) for pattern in args.image: repoman.show_images(pattern, 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) def c_move(parser, args): ''' Loading Loading @@ -300,12 +291,9 @@ def c_repo(parser, args): ''' Get information about repositories ''' # List available repositories repoman = load_repositories(args, force_offline=args.local) # if len(args.repository) == 0: # args.repository = ['*'] for pattern in args.repository: repoman.show(pattern, online=not args.offline, repoman.show_repos(pattern, online=not args.offline, offline=not args.online, url=args.verbose, state=not args.no_state) def c_search(parser, args): Loading Loading @@ -499,16 +487,24 @@ 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("-v", "--verbose", action="store_true", default=False, help="verbose output") p_list.add_argument("-b", "--best", action="store_true", default=False, help="in best mode, image is the most recent in all repositories") p_list.add_argument("-c", "--changelog", action="store_true", default=False, help="display image changelog") p_list.add_argument("-p", "--as-path", action="store_true", default=False, help="display repository content as path") p_list.add_argument("object", nargs="*", help="object syntax is <path|repository|[repository/]image[:version]>") p_list.add_argument("-j", "--json", action="store_true", default=False, help="long display") p_list.add_argument("-l", "--long", action="store_true", default=False, help="long display") p_list.add_argument("-m", "--md5", action="store_true", default=False, help="display image md5") p_list.add_argument("-s", "--size", action="store_true", default=False, help="display image size") p_list.add_argument("-d", "--date", action="store_true", default=False, help="display image date") p_list.add_argument("-a", "--author", action="store_true", default=False, help="display image author") p_list.add_argument("-u", "--url", action="store_true", default=False, help="display image url") p_list.add_argument("-D", "--description", action="store_true", default=False, help="display image description") p_list.add_argument("image", nargs="*", default=['*'], help="image syntax is [repository/]image[:version]") p_list.set_defaults(func=c_list, subparser=p_list) # move command parser Loading
completion/bash/is +20 −10 Original line number Diff line number Diff line Loading @@ -6,8 +6,19 @@ _repo() { } # list all images available in any online repositories _remote_image() { COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(is -q --no-color list)" -- "$cur")) } # list all local (files) images _local_image() { COMPREPLY=("${COMPREPLY[@]}" $(compgen -f -X '!*.isimage' -- "$cur")) } # list local and remote images _image() { COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(is -q --no-color list -p '*')" -- "$cur") $(compgen -f -X '!*.isimage' -- "$cur")) _local_image _remote_image } # generate completion from optional arguments Loading Loading @@ -75,17 +86,17 @@ _is() { copy) [[ "$cur" == -* ]] && _opt '-h --help -b --best' && return 0 _count_args (( args == 2 )) && _image (( args > 2 )) && _image && _repo (( args == 2 )) && _remote_image (( args > 2 )) && _remote_image && _repo ;; del) [[ "$cur" == -* ]] && _opt '-h --help -b --best -f --force -p --preserve' && return 0 _image _remote_image ;; diff) [[ "$cur" == -* ]] && _opt '-h --help -b --best' && return 0 _count_args (( args < 4 )) && c_args=$(images) (( args < 4 )) && _image ;; extract) [[ "$cur" == -* ]] && _opt '-h --help -f --force -b --best -p --payload -g --gen-description' && return 0 Loading @@ -95,7 +106,7 @@ _is() { ;; get) [[ "$cur" == -* ]] && _opt '-h --help -f --force -b --best --payload -I --no-image' && return 0 _image _remote_image ;; help) _count_args Loading @@ -116,13 +127,12 @@ _is() { (( args > 2 )) && _filedir ;; list) [[ "$cur" == -* ]] && _opt '-h --help -b --best --verbose -c --changelog -p --as-path' && return 0 _repo _image [[ "$cur" == -* ]] && _opt '-h --help -l --long -j --json -m --md5 -s --size -d --date -a --author -u --url -D --description' && return 0 _remote_image ;; move) [[ "$cur" == -* ]] && _opt '-h --help -b --best -f --force' && return 0 _image _remote_image ;; new) [[ "$cur" == -* ]] && _opt '-h --help -f --force' && return 0 Loading
installsystems/repository.py +57 −29 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ import time import shutil import pwd import grp import json import tempfile import fnmatch import cStringIO Loading Loading @@ -320,37 +321,20 @@ class Repository(object): # update last file self.update_last() def show(self, verbose=False, aspath=False): def images(self): ''' List images in repository Return a dict of informations on images ''' if aspath: images = self.db.ask("SELECT md5, name, version FROM image ORDER BY name, version").fetchall() for (image_md5, image_name, image_version) in images: s = "#light##blue#%s#reset#/#light##yellow#%s#reset#:#light##red#%s#reset#" % ( self.config.name, image_name, image_version) if verbose: s += " [%s]" % image_md5 out(s) else: arrow(self.config.name) images = self.db.ask("SELECT md5, name, version, date,\ db_images = self.db.ask("SELECT md5, name, version, date,\ author, description, size FROM image ORDER BY name, version").fetchall() for (image_md5, image_name, image_version, image_date, image_author, image_description, image_size) in images: out("#light##yellow#%s #reset#v%s" % (image_name, image_version)) if verbose: out(" #yellow#Date:#reset# %s" % istools.time_rfc2822(image_date)) out(" #yellow#Description:#reset# %s" % image_description) out(" #yellow#Author:#reset# %s" % image_author) out(" #yellow#MD5:#reset# %s" % image_md5) payloads = self.db.ask("SELECT md5, name, size FROM payload\ WHERE image_md5 = ?", (image_md5,)).fetchall() for payload_md5, payload_name, payload_size in payloads: out(" #light##yellow#Payload:#reset# %s" % payload_name) out(" #yellow#Size:#reset# %s" % (istools.human_size(payload_size))) out(" #yellow#MD5:#reset# %s" % payload_md5) out() images = [] field = ("md5", "name", "version", "date", "author", "description", "size") for info in db_images: d = dict(zip(field, info)) d["repo"] = self.config.name d["url"] = os.path.join(self.config.path, d["md5"]) images.append(d) return images def search(self, pattern): ''' Loading Loading @@ -631,7 +615,7 @@ class RepositoryManager(object): return repo.get(name, version), repo raise Exception("Unable to find image %s v%s" % (name, version)) def show(self, pattern, online=True, offline=True, url=False, state=True): def show_repos(self, pattern, online=True, offline=True, url=False, state=True): ''' Show repository inside manager online: list online repository Loading @@ -651,6 +635,50 @@ class RepositoryManager(object): s += " #light##red#[offline]#reset#" out(s) def show_images(self, pattern, o_json=False, o_long=False, o_md5=False, o_date=False, o_author=False, o_size=False, o_url=False, o_description=False): ''' Show repository inside manager json: display output in json long: display output in long format all images parameter can be given in arguments to displayed ''' # building image list images = {} for reponame in self.onlines: for img in self[reponame].images(): imgname = u"%s/%s:%s" % (reponame, img["name"], img["version"]) images[imgname] = img # filter with pattern for k in images.keys(): if not fnmatch.fnmatch(k, pattern): del images[k] # display result if o_json: s = json.dumps(images) else: l = [] for imgp in sorted(images.keys()): img = images[imgp] l.append(u"#light##blue#%s#reset#/#light#%s#reset#:#light##purple#%s#reset#" % ( img["repo"], img["name"], img["version"])) if o_md5 or o_long: l.append(u" #light#md5:#reset# %s" % img["md5"]) if o_date or o_long: l.append(u" #light#date:#reset# %s" % istools.time_rfc2822(img["date"])) if o_author or o_long: l.append(u" #light#author:#reset# %s" % img["author"]) if o_size or o_long: l.append(u" #light#size:#reset# %s" % istools.human_size(img["size"])) if o_url or o_long: l.append(u" #light#url:#reset# %s" % img["url"]) if o_description or o_long: l.append(u" #light#description:#reset# %s" % img["description"]) s = os.linesep.join(l) if len(s) > 0: out(s) def search(self, pattern): ''' Search pattern accross all registered repositories Loading