From 5141b61f493db4afe39bec3a2d0c98e0ab76a3e0 Mon Sep 17 00:00:00 2001 From: Mike Bonnet Date: May 10 2012 20:28:06 +0000 Subject: add support for querying past information with the taginfo command --- diff --git a/cli/koji b/cli/koji index dbb9403..5b29e5b 100755 --- a/cli/koji +++ b/cli/koji @@ -4084,14 +4084,21 @@ def anon_handle_taginfo(options, session, args): usage = _("usage: %prog taginfo [options] [ ...]") usage += _("\n(Specify the --help global option for a list of other help options)") parser = OptionParser(usage=usage) + parser.add_option("--event", type='int', metavar="EVENT#", help=_("query at event")) + parser.add_option("--ts", type='int', metavar="TIMESTAMP", help=_("query at timestamp")) + parser.add_option("--repo", type='int', metavar="REPO#", help=_("query at event for a repo")) (options, args) = parser.parse_args(args) if len(args) < 1: parser.error(_("Please specify a tag")) assert False activate_session(session) + event = koji.util.eventFromOpts(session, options) or {} + if event: + event['timestr'] = time.asctime(time.localtime(event['ts'])) + print "Querying at event %(id)i (%(timestr)s)" % event perms = dict([(p['id'], p['name']) for p in session.getAllPerms()]) for tag in args: - info = session.getTag(tag) + info = session.getTag(tag, event=event.get('id')) if info is None: print "No such tag: %s\n" % tag continue @@ -4102,15 +4109,15 @@ def anon_handle_taginfo(options, session, args): if info.get('perm_id') is not None: perm_id = info['perm_id'] print "Required permission: %r" % perms.get(perm_id, perm_id) - dest_targets = session.getBuildTargets(destTagID=info['id']) - build_targets = session.getBuildTargets(buildTagID=info['id']) if session.mavenEnabled(): print "Maven support?: %s" % (info['maven_support'] and 'yes' or 'no') print "Include all Maven archives?: %s" % (info['maven_include_all'] and 'yes' or 'no') + dest_targets = session.getBuildTargets(destTagID=info['id'], event=event.get('id')) + build_targets = session.getBuildTargets(buildTagID=info['id'], event=event.get('id')) repos = {} for target in dest_targets + build_targets: if not repos.has_key(target['build_tag']): - repo = session.getRepo(target['build_tag']) + repo = session.getRepo(target['build_tag'], event=event.get('id')) if repo is None: repos[target['build_tag']] = "no active repo" else: @@ -4125,13 +4132,13 @@ def anon_handle_taginfo(options, session, args): print "Targets that build from this tag:" for target in build_targets: print " %s" % target['name'] - external_repos = session.getTagExternalRepos(tag_info=info['id']) + external_repos = session.getTagExternalRepos(tag_info=info['id'], event=event.get('id')) if external_repos: print "External repos:" for rinfo in external_repos: print " %(priority)3i %(external_repo_name)s (%(url)s)" % rinfo print "Inheritance:" - for parent in session.getInheritanceData(tag): + for parent in session.getInheritanceData(tag, event=event.get('id')): flags = '' for code,expr in ( ('M',parent['maxdepth'] is not None), diff --git a/hub/kojihub.py b/hub/kojihub.py index 09c194b..a4c8150 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -7788,12 +7788,12 @@ class RootExports(object): getGlobalInheritance = staticmethod(readGlobalInheritance) - def getInheritanceData(self,tag): + def getInheritanceData(self,tag,event=None): """Return inheritance data for tag""" if not isinstance(tag,int): #lookup tag id tag = get_tag_id(tag,strict=True) - return readInheritanceData(tag) + return readInheritanceData(tag,event) def setInheritanceData(self,tag,data,clear=False): if not isinstance(tag,int): @@ -8186,7 +8186,7 @@ class RootExports(object): break return taginfo - def getRepo(self,tag,state=None): + def getRepo(self,tag,state=None,event=None): if isinstance(tag,int): id = tag else: @@ -8196,9 +8196,13 @@ class RootExports(object): aliases = ['id', 'state', 'create_event', 'creation_time', 'create_ts'] joins = ['events ON repo.create_event = events.id'] clauses = ['repo.tag_id = %(id)i'] - if state is None: - state = koji.REPO_READY - clauses.append('repo.state = %(state)s' ) + if event: + # the repo table doesn't have all the fields of a _config table, just create_event + clauses.append('create_event <= %(event)i') + else: + if state is None: + state = koji.REPO_READY + clauses.append('repo.state = %(state)s' ) query = QueryProcessor(columns=fields, aliases=aliases, tables=['repo'], joins=joins, clauses=clauses,