diff --git a/bin/is b/bin/is index 80065f876f05a54ccefed0c2b34edede4e283124..1fa03f8866d6a051fb2a09a05ed46ba9fdac59f6 100755 --- a/bin/is +++ b/bin/is @@ -358,6 +358,13 @@ def c_new(args): ''' SourceImage.create(args.path, args.force) +def c_payload(args): + ''' + List payloads + ''' + repoman = load_repositories(args) + repoman.show_payloads(args.payload, o_images=args.images, o_json=args.json) + def c_prepare_chroot(args): ''' Helper to prepare a path to be chrooted @@ -603,6 +610,15 @@ def arg_parser_init(): help="overwrite existing source image") p.add_argument("path", help="new image directory path") p.set_defaults(func=c_new) + # payload command parser + p = subparser.add_parser("payload", help=c_payload.__doc__.lower()) + p.add_argument("-j", "--json", action="store_true", + help="output is formated in json") + p.add_argument("-i", "--images", action="store_true", + help="list images using payload") + p.add_argument("payload", nargs='*', default=[""], + help="payload md5 pattern") + p.set_defaults(func=c_payload) # prepare_chroot command parser p = subparser.add_parser("prepare_chroot", help=c_prepare_chroot.__doc__.lower()) diff --git a/completion/bash/is b/completion/bash/is index 1f4288f26c3d0f2ccbc0c724be62d7f7b1a49c2e..deba6b56ad605f9a3cd0e645285e416e210cff55 100644 --- a/completion/bash/is +++ b/completion/bash/is @@ -40,7 +40,7 @@ _is() { _get_first_arg cmds=('add' 'build' 'cat' 'changelog' 'check' 'chroot' 'clean' 'copy' 'del' 'extract' 'get' 'help' 'info' 'init' 'install' 'list' 'move' 'new' 'repo' - 'search' 'version' 'diff' 'prepare_chroot' 'unprepare_chroot') + 'search' 'version' 'diff' 'payload' 'prepare_chroot' 'unprepare_chroot') opts=('-h' '--help' '-V' '--version' '-v' '--verbosity' @@ -152,6 +152,9 @@ _is() { [[ "$cur" == -* ]] && _opt '-h --help -f --force' && return 0 _filedir -d ;; + payload) + [[ "$cur" == -* ]] && _opt '-h --help -j --json -i --images' && return 0 + ;; prepare_chroot) [[ "$cur" == -* ]] && _opt '-h --help -m --no-mount' && return 0 _filedir -d diff --git a/installsystems/repository.py b/installsystems/repository.py index 65682b74859bf7e7caf6632d9589dbd6b38c582f..33a876fbce500bec070b3e150609a4c6b2bf124f 100644 --- a/installsystems/repository.py +++ b/installsystems/repository.py @@ -376,6 +376,25 @@ class Repository(object): images.append(d) return images + def payloads(self): + ''' + Return a dict of informations on payloads + ''' + db_payloads = self.db.ask("SELECT payload.md5,payload.size,payload.isdir,image.name,image.version,payload.name FROM payload inner join image on payload.image_md5 = image.md5").fetchall() + res = {} + for payload in db_payloads: + md5 = payload[0] + # create entry if not exists + if md5 not in res: + res[md5] = {"size": payload[1], "isdir": payload[2], "images": {}} + # add image to list + imgpath = "%s/%s:%s" % (self.config.name, payload[3], payload[4]) + res[md5]["images"][imgpath] = {"repo": self.config.name, + "imgname": payload[3], + "imgver": payload[4], + "payname": payload[5]} + return res + def search(self, pattern): ''' Search pattern in a repository @@ -742,6 +761,56 @@ class RepositoryManager(object): if len(s) > 0: out(s) + def select_payloads(self, pattern): + ''' + Return a list of available payloads + ''' + if len(self.onlines) == 0: + raise Exception("No online repository") + # building payload list + paylist = {} + for reponame in self.onlines: + for md5, info in self[reponame].payloads().items(): + if md5 not in paylist: + paylist[md5] = info + else: + paylist[md5]["images"].update(info["images"]) + # check if pattern is md5 startpath + if pattern is not None: + for md5 in paylist.keys(): + if not md5.startswith(pattern): + del paylist[md5] + return paylist + + def show_payloads(self, patterns, o_images=False, o_json=False): + ''' + Show payloads inside manager + ''' + # get payload list + payloads = {} + for pattern in patterns: + payloads.update(self.select_payloads(pattern)) + # display result + if o_json: + s = json.dumps(payloads) + else: + l = [] + for payname in sorted(payloads.keys()): + pay = payloads[payname] + l.append(u"#l##y#%s#R#" % payname) + l.append(u" size: %s" % istools.human_size(pay["size"])) + l.append(u" directory: %s" % bool(pay["isdir"])) + l.append(u" image count: %d" % len(pay["images"])) + l.append(u" names: %s" % ", ".join(set((v["payname"] for v in pay["images"].values())))) + if o_images: + l.append(u" images:") + for path, obj in pay["images"].items(): + l.append(u" %s#R#/#l##b#%s#R#:#p#%s#R# (%s)" % ( + obj["repo"], obj["imgname"], obj["imgver"], obj["payname"])) + s = os.linesep.join(l) + if len(s) > 0: + out(s) + def purge_cache(self, pattern): ''' Remove local cached repository files