From 63dbc56bde2f260153064ee307cfac9e333683d5 Mon Sep 17 00:00:00 2001 From: Xibo Ning Date: Jun 29 2017 19:15:51 +0000 Subject: patch2 for issue 288 --- diff --git a/builder/kojid b/builder/kojid index 1a10483..477a3b8 100755 --- a/builder/kojid +++ b/builder/kojid @@ -1364,6 +1364,7 @@ class BuildMavenTask(BaseBuildTask): scm = SCM(url) scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=scm.contextData()) repo_id = opts.get('repo_id') if not repo_id: @@ -1417,6 +1418,9 @@ class BuildMavenTask(BaseBuildTask): # Check out sources from the SCM sourcedir = scm.checkout(scmdir, self.session, uploadpath, logfile) + self.run_plugin("postSCMCheckout", + scminfo=scm.contextData(), + extra_keys={"sourcedir": sourcedir}) # zip up pristine sources for auditing purposes self._zip_dir(sourcedir, os.path.join(outputdir, 'scm-sources.zip')) @@ -1426,9 +1430,13 @@ class BuildMavenTask(BaseBuildTask): patchlog = self.workdir + '/patches.log' patch_scm = SCM(self.opts.get('patches')) patch_scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=patch_scm.contextData()) # never try to check out a common/ dir when checking out patches patch_scm.use_common = False patchcheckoutdir = patch_scm.checkout(patchdir, self.session, uploadpath, patchlog) + self.run_plugin("postSCMCheckout", + scminfo=patch_scm.contextData(), + extra_keys={"sourcedir": patchcheckoutdir}) self._zip_dir(patchcheckoutdir, os.path.join(outputdir, 'patches.zip')) # Apply patches, if present @@ -1691,6 +1699,7 @@ class WrapperRPMTask(BaseBuildTask): scm = SCM(spec_url) scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=scm.contextData()) repo_id = opts.get('repo_id') if not repo_id: @@ -1710,6 +1719,9 @@ class WrapperRPMTask(BaseBuildTask): scmdir = buildroot.rootdir() + '/tmp/scmroot' koji.ensuredir(scmdir) specdir = scm.checkout(scmdir, self.session, self.getUploadDir(), logfile) + self.run_plugin("postSCMCheckout", + scminfo=scm.contextData(), + extra_keys={"sourcedir": specdir}) spec_template = None for path, dir, files in os.walk(specdir): @@ -2639,8 +2651,12 @@ class ImageTask(BaseTaskHandler): if self.opts.get('ksurl'): scm = SCM(self.opts['ksurl']) scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=scm.contextData()) logfile = os.path.join(self.workdir, 'checkout.log') scmsrcdir = scm.checkout(scmdir, self.session, self.getUploadDir(), logfile) + self.run_plugin("postSCMCheckout", + scminfo=scm.contextData(), + extra_keys={"sourcedir": scmsrcdir}) kspath = os.path.join(scmsrcdir, ksfile) else: kspath = self.localPath("work/%s" % ksfile) @@ -3251,9 +3267,13 @@ class OzImageTask(BaseTaskHandler): if self.opts.get('ksurl'): scm = SCM(self.opts['ksurl']) scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=scm.contextData()) logfile = os.path.join(self.workdir, 'checkout-%s.log' % self.arch) scmsrcdir = scm.checkout(self.workdir, self.session, self.getUploadDir(), logfile) + self.run_plugin("postSCMCheckout", + scminfo=scm.contextData(), + extra_keys={"sourcedir": scmsrcdir}) kspath = os.path.join(scmsrcdir, os.path.basename(ksfile)) else: tops = dict([(k, getattr(self.options, k)) for k in 'topurl','topdir']) @@ -4058,9 +4078,13 @@ class BuildIndirectionImageTask(OzImageTask): if fileurl: scm = SCM(fileurl) scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=scm.contextData()) logfile = os.path.join(self.workdir, 'checkout.log') scmsrcdir = scm.checkout(self.workdir, self.session, self.getUploadDir(), logfile) + self.run_plugin("postSCMCheckout", + scminfo=scm.contextData(), + extra_keys={"sourcedir": scmsrcdir}) final_path = os.path.join(scmsrcdir, os.path.basename(filepath)) else: tops = dict([(k, getattr(self.options, k)) for k in 'topurl','topdir']) @@ -4370,6 +4394,7 @@ class BuildSRPMFromSCMTask(BaseBuildTask): # will throw a BuildError if the url is invalid scm = SCM(url) scm.assert_allowed(self.options.allowed_scms) + self.run_plugin('preSCMCheckout', scminfo=scm.contextData()) if opts is None: opts = {} @@ -4403,6 +4428,9 @@ class BuildSRPMFromSCMTask(BaseBuildTask): # Check out spec file, etc. from SCM sourcedir = scm.checkout(scmdir, self.session, uploadpath, logfile) + self.run_plugin("postSCMCheckout", + scminfo=scm.contextData(), + extra_keys={"sourcedir": sourcedir}) # chown the sourcedir and everything under it to the mockuser # so we can build the srpm as non-root uid = pwd.getpwnam(self.options.mockuser)[2] diff --git a/koji/daemon.py b/koji/daemon.py index 637566f..9e12b3e 100644 --- a/koji/daemon.py +++ b/koji/daemon.py @@ -229,6 +229,11 @@ class SCM(object): # should never happen raise koji.GenericError('Invalid SCM URL: %s' % url) + def contextData(self, keys=None): + if keys is None: + keys = ["url", "scheme", "user", "host", "path", "query", "revision", "scmtype"] + return dict([(k, vars(self)[k]) for k in keys if vars(self).has_key(k)]) + def _parse_url(self): """ Parse the SCM url into usable components. diff --git a/koji/plugin.py b/koji/plugin.py index e4fe19d..b17632e 100644 --- a/koji/plugin.py +++ b/koji/plugin.py @@ -48,6 +48,8 @@ callbacks = { 'postRepoDone': [], 'preCommit': [], 'postCommit': [], + 'preSCMCheckout': [], + 'postSCMCheckout': [], } class PluginTracker(object): diff --git a/koji/tasks.py b/koji/tasks.py index b2258e3..9ad3bcf 100644 --- a/koji/tasks.py +++ b/koji/tasks.py @@ -402,6 +402,45 @@ class BaseTaskHandler(object): repo_info = self.wait(task_id)[task_id] return repo_info + @classmethod + def request_keys(cls, method_name='handler', filter=None): + try: + keys = cls.requestKeys + except AttributeError: + pass + else: + return keys + + if filter is None: + filter = (lambda name, obj: + inspect.ismethod(obj) and name == method_name) + methods = [(name, obj) for name, obj in inspect.getmembers(cls) + if filter(name, obj)] + _, method = methods[0] + keys, args, kwargs, default_vals = tuple(inspect.getargspec(method)) + keys = keys + [item for item in args, kwargs if item is not None] + return keys[1:] + + def parsed_request(self, request=None, keys=None): + if request is None: + request = self.session.getTaskRequest(self.id) + if keys is None: + keys = self.request_keys() + + return zip(keys, request) + + def contextData(self): + taskinfo = self.session.getTaskInfo(self.id, request=True) + request = self.parsed_request(taskinfo['request']) + return taskinfo.update(request) + + def run_plugin(self, plugin, scminfo=None, extra_keys=None): + taskinfo = self.contextData() + if extra_keys: + scminfo.update(extra_keys) + + koji.plugin.run_callbacks(plugin, taskinfo=taskinfo, scminfo=scminfo) + class FakeTask(BaseTaskHandler): Methods = ['someMethod']