From: Sateesh Kumar Date: Thu, 12 Dec 2013 18:41:56 +0000 (+0530) Subject: fix for getting scm url and branch for hg repos X-Git-Tag: v0.2.23~52^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2edf698e6a7aa74a34c58aad28a9b0bdda18c8f9;p=tools%2Fpython-jenkinsapi.git fix for getting scm url and branch for hg repos --- diff --git a/jenkinsapi/job.py b/jenkinsapi/job.py index d5e1b69..54d2239 100644 --- a/jenkinsapi/job.py +++ b/jenkinsapi/job.py @@ -28,6 +28,7 @@ GIT_URL = './scm/userRemoteConfigs/hudson.plugins.git.UserRemoteConfig/url' HG_URL = './scm/source' GIT_BRANCH = './scm/branches/hudson.plugins.git.BranchSpec/name' HG_BRANCH = './scm/branch' +DEFAULT_HG_BRANCH_NAME = 'default' log = logging.getLogger(__name__) @@ -53,13 +54,13 @@ class Job(JenkinsBase, MutableJenkinsThing): self._scmurlmap = { 'svn': lambda element_tree: list(element_tree.findall(SVN_URL)), 'git': lambda element_tree: list(element_tree.findall(GIT_URL)), - 'hg': lambda element_tree: list(element_tree.find(HG_URL)), + 'hg': lambda element_tree: list(element_tree.findall(HG_URL)), None: lambda element_tree: [] } self._scmbranchmap = { 'svn': lambda element_tree: [], 'git': lambda element_tree: list(element_tree.findall(GIT_BRANCH)), - 'hg': lambda element_tree: list(element_tree.find(HG_BRANCH)), + 'hg': self._get_hg_branch, None: lambda element_tree: [] } JenkinsBase.__init__(self, url) @@ -73,6 +74,17 @@ class Job(JenkinsBase, MutableJenkinsThing): def get_jenkins_obj(self): return self.jenkins + # When the name of the hg branch used in the job is default hg branch (i.e. + # default), Mercurial plugin doesn't store default branch name in config XML + # file of the job. Create XML node corresponding to default branch + def _get_hg_branch(self, element_tree): + branches = element_tree.findall(HG_BRANCH) + if not branches: + hg_default_branch = ET.Element('branch') + hg_default_branch.text = DEFAULT_HG_BRANCH_NAME + branches.append(hg_default_branch) + return branches + def _poll(self): data = JenkinsBase._poll(self) # jenkins loads only the first 100 builds, load more if needed diff --git a/jenkinsapi_tests/unittests/test_job_scm_hg.py b/jenkinsapi_tests/unittests/test_job_scm_hg.py new file mode 100644 index 0000000..2032be4 --- /dev/null +++ b/jenkinsapi_tests/unittests/test_job_scm_hg.py @@ -0,0 +1,105 @@ +import sys +sys.path.append('C:\opensource\jenkinsapi') +import mock +import unittest + +from jenkinsapi import config +from jenkinsapi.job import Job +from jenkinsapi.jenkinsbase import JenkinsBase + + +#TODO: Make JOB_DATA to be one coming from Hg job +class TestHgJob(unittest.TestCase): + JOB_DATA = { + "actions": [], + "description": "test job", + "displayName": "foo", + "displayNameOrNull": None, + "name": "foo", + "url": "http://halob:8080/job/foo/", + "buildable": True, + "builds": [ + {"number": 3, "url": "http://halob:8080/job/foo/3/"}, + {"number": 2, "url": "http://halob:8080/job/foo/2/"}, + {"number": 1, "url": "http://halob:8080/job/foo/1/"} + ], + "color": "blue", + "firstBuild": {"number": 1, "url": "http://halob:8080/job/foo/1/"}, + "healthReport": [ + {"description": "Build stability: No recent builds failed.", "iconUrl": "health-80plus.png", "score": 100} + ], + "inQueue": False, + "keepDependencies": False, + "lastBuild": {"number": 4, "url": "http://halob:8080/job/foo/4/"}, # build running + "lastCompletedBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"}, + "lastFailedBuild": None, + "lastStableBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"}, + "lastSuccessfulBuild": {"number": 3, "url": "http://halob:8080/job/foo/3/"}, + "lastUnstableBuild": None, + "lastUnsuccessfulBuild": None, + "nextBuildNumber": 4, + "property": [], + "queueItem": None, + "concurrentBuild": False, + "downstreamProjects": [], + "scm": {}, + "upstreamProjects": [] + } + + URL_DATA = {'http://halob:8080/job/foo/%s' % config.JENKINS_API: JOB_DATA} + + def fakeGetData(self, url, *args): + try: + return TestHgJob.URL_DATA[url] + except KeyError: + raise Exception("Missing data for %s" % url) + + @mock.patch.object(JenkinsBase, 'get_data', fakeGetData) + def setUp(self): + self.J = mock.MagicMock() # Jenkins object + self.j = Job('http://halob:8080/job/foo/', 'foo', self.J) + + def configtree_with_branch(self): + config_node = ''' + + + http://cm5/hg/sandbox/v01.0/int + + testme + false + + http://cm5/hg/sandbox/v01.0/int/ + + + + ''' + return config_node + + def configtree_with_default_branch(self): + config_node = ''' + + + http://cm5/hg/sandbox/v01.0/int + + false + + http://cm5/hg/sandbox/v01.0/int/ + + + + ''' + return config_node + + @mock.patch.object(Job,'get_config',configtree_with_branch) + def test_hg_attributes(self): + expected_url = ['http://cm5/hg/sandbox/v01.0/int'] + self.assertEquals(self.j.get_scm_type(),'hg') + self.assertEquals(self.j.get_scm_url(),expected_url) + self.assertEquals(self.j.get_scm_branch(),['testme']) + + @mock.patch.object(Job,'get_config',configtree_with_default_branch) + def test_hg_attributes(self): + self.assertEquals(self.j.get_scm_branch(),['default']) + +if __name__ == '__main__': + unittest.main()