fix for getting scm url and branch for hg repos
authorSateesh Kumar <sateeshkumarb@yahoo.com>
Thu, 12 Dec 2013 18:41:56 +0000 (00:11 +0530)
committerSateesh Kumar <sateeshkumarb@yahoo.com>
Thu, 12 Dec 2013 18:41:56 +0000 (00:11 +0530)
jenkinsapi/job.py
jenkinsapi_tests/unittests/test_job_scm_hg.py [new file with mode: 0644]

index d5e1b69..54d2239 100644 (file)
@@ -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 (file)
index 0000000..2032be4
--- /dev/null
@@ -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 = '''
+        <project>
+        <scm class="hudson.plugins.mercurial.MercurialSCM" plugin="mercurial@1.42">
+        <source>http://cm5/hg/sandbox/v01.0/int</source>
+        <modules/>
+        <branch>testme</branch>
+        <clean>false</clean>
+        <browser class="hudson.plugins.mercurial.browser.HgWeb">
+        <url>http://cm5/hg/sandbox/v01.0/int/</url>
+        </browser>
+        </scm>
+        </project>
+        '''
+        return config_node
+
+    def configtree_with_default_branch(self):
+        config_node = '''
+        <project>
+        <scm class="hudson.plugins.mercurial.MercurialSCM" plugin="mercurial@1.42">
+        <source>http://cm5/hg/sandbox/v01.0/int</source>
+        <modules/>
+        <clean>false</clean>
+        <browser class="hudson.plugins.mercurial.browser.HgWeb">
+        <url>http://cm5/hg/sandbox/v01.0/int/</url>
+        </browser>
+        </scm>
+        </project>
+        '''
+        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()