Add fetch and check change feature
authorgaoxuesx <xuesongx.gao@intel.com>
Thu, 4 Sep 2014 08:23:20 +0000 (16:23 +0800)
committergaoxuesx <xuesongx.gao@intel.com>
Thu, 4 Sep 2014 09:50:57 +0000 (17:50 +0800)
We can use fetch_change function to check out one change.

Change-Id: Ie836c1f287fcd438632116cdf39d78ce2da35da4
Signed-off-by: gaoxuesx <xuesongx.gao@intel.com>
common/git.py
common/iris_rest_client.py
job_monitor_scm_meta_git.py

index c53936c..a77ff04 100644 (file)
@@ -161,3 +161,17 @@ def clone_gitproject(gerritprj, localdir, giturl=None, bare=False):
 
 
     return _clone_gitproject(giturl, gerritprj, localdir, bare)
+
+
+def fetch_change(gerritprj, localdir, refspec, giturl=None, bare=False):
+    """Fecth and checkout change to local dir"""
+
+    if not giturl:
+        giturl = 'ssh://%s@%s:%s/%s' % (os.getenv('GERRIT_USERNAME'),
+                                    os.getenv('GERRIT_HOSTNAME'),
+                                    os.getenv('GERRIT_SSHPORT'),
+                                    gerritprj)
+
+    git = Git.create(localdir, bare)
+    git.fetch(repo=giturl, refspec=refspec)
+    git.checkout('FETCH_HEAD')
index aa407ca..5ca5c1d 100644 (file)
@@ -1,7 +1,6 @@
 """IRIS requests client"""
 
 
-import os
 import sys
 import urlparse
 from distutils.sysconfig import get_python_lib
@@ -14,10 +13,12 @@ import requests
 
 
 class IrisRestClient(object):
+    """IRIS Rest Client"""
     def __init__(self, server):
         self.server = server
         self.session = None
         self.csrftoken = None
+        self.header = None
 
     def login(self, user, pwd):
         """
@@ -33,19 +34,23 @@ class IrisRestClient(object):
         data = dict(username=user, password=pwd)
         header = {'X-CSRFToken': csrftoken}
 
-        r = self.session.post(urlparse.urljoin(self.server, '/login/'), data=data,
-                              headers=header)
+        response = self.session.post(urlparse.urljoin(self.server, '/login/'),
+                                     data=data, headers=header)
 
         self.csrftoken = self.session.cookies['csrftoken']
         self.header = {'X-CSRFToken': self.csrftoken}
-        return r
+        return response
 
     def _post(self, url, **kwargs):
         """Commom post method with header"""
-        r = self.session.post(urlparse.urljoin(self.server, url),
-                                 headers=self.header, **kwargs)
-        detail = r.json()
-        detail['status'] = r.status_code
+        detail = {}
+        response = self.session.post(urlparse.urljoin(self.server, url),
+                                     headers=self.header, **kwargs)
+        try:
+            detail.update(response.json())
+        except ValueError:
+            detail['detail'] = 'Server error, please contact the administrator!'
+        detail['status'] = response.status_code
         return detail
 
     def scm_update(self, domain_file, gittree_file):
index b4a21d6..e204929 100755 (executable)
@@ -7,18 +7,15 @@ import sys
 import os
 import base64
 import argparse
-from urllib2 import HTTPError
 from distutils.sysconfig import get_python_lib
 
 sys.path.insert(0, get_python_lib())
 
 import requests
 
-from common.tempbuildpkg import TempPackageBuild
 from common.gerrit import Gerrit, GerritError, get_gerrit_event
-from common.git import Git, clone_gitproject
+from common.git import clone_gitproject, fetch_change
 from common.iris_rest_client import IrisRestClient
-from job_submitobs import find_submit_tag
 
 # set default char-set endcoding to utf-8
 reload(sys)
@@ -33,6 +30,7 @@ WORKSPACE = os.getenv('WORKSPACE')
 GERRIT_HOSTNAME = os.getenv('GERRIT_HOSTNAME')
 GERRIT_USERNAME = os.getenv('GERRIT_USERNAME')
 GERRIT_SSHPORT = os.getenv('GERRIT_SSHPORT')
+GERRIT_SILENT_MODE = os.getenv('GERRIT_SILENT_MODE')
 
 
 def scm_check(client, gerrit, events, domains, gittrees):
@@ -46,11 +44,20 @@ def scm_check(client, gerrit, events, domains, gittrees):
     print '########################################'
 
     if result['status'] == 200:
-        return 0
-    if result['status'] == 406:
+        try:
+            gerrit.review(commit=events['patchset_revision'], verified=1)
+            return 0
+        except GerritError, err:
+            print >> sys.stderr, 'Error posting review comment '\
+                                 'back to Gerrit: %s' % str(err)
+            # return 1 if this exception is not caused by invalid commit
+            if 'no such patch set' not in str(err):
+                return 1
+    else:
         try:
             gerrit.review(commit=events['patchset_revision'],
                           message=result['detail'], verified=-1)
+            return 0
         except GerritError, err:
             print >> sys.stderr, 'Error posting review comment '\
                                  'back to Gerrit: %s' % str(err)
@@ -91,9 +98,11 @@ def main():
     if not clone_gitproject(GERRIT_PROJECT, proj_path):
         return -1
 
-    git = Git(proj_path)
+    # fecth and checkout change
+    fetch_change(GERRIT_PROJECT, proj_path, events['refspec'])
+
     gerrit = Gerrit(GERRIT_HOSTNAME, GERRIT_USERNAME, GERRIT_SSHPORT,
-                    GERRIT_SILENT_MOD)
+                    GERRIT_SILENT_MODE)
 
     domains = os.path.join(proj_path, 'domains')
     gittrees = os.path.join(proj_path, 'git-trees')