[Git-Sync] Create branch of private project 37/150037/1
authorYonghee Han <onstudy@samsung.com>
Thu, 14 Sep 2017 05:20:40 +0000 (14:20 +0900)
committerYonghee Han <onstudy@samsung.com>
Thu, 14 Sep 2017 05:20:40 +0000 (14:20 +0900)
Add a create branch of private project.

Change-Id: If2de7a1a263b08af7de12640d161a5ff235b8336

common/git.py
job_submit_request_git_sync.py

index f811c9d..75ba2dc 100644 (file)
@@ -139,6 +139,45 @@ class Git(GitRepository):
         overwrite_commit = outs.strip()
         return (True, overwrite_commit)
 
+    def _get_branches(self):
+        """Return the branches list, current working branch is the first
+        element.
+        """
+        branches = []
+        for line in self._exec_git('branch', ['--no-color'])[1].splitlines():
+            br = line.strip().split()[-1]
+
+            if line.startswith('*'):
+                current_branch = br
+
+            branches.append(br)
+
+        return (current_branch, branches)
+
+    def get_branches(self):
+        if not self.cur_branch or not self.branches:
+            self.cur_branch, self.branches = \
+                self._get_branches()
+
+        return (self.cur_branch, self.branches)
+
+    def has_branch(self, br, remote=False):
+        """Check if the repository has branch 'br'
+          @param remote: only liste remote branches
+        """
+
+        if remote:
+            options = [ '--no-color', '-r' ]
+
+            for line in self._exec_git('branch', options)[1].splitlines():
+                rbr = line.strip().split()[-1]
+                if br == rbr:
+                    return True
+
+            return False
+
+        else:
+            return (br in self.get_branches()[1])
 
 def _update_gitproject(localdir, gitpath=None):
     """Fetch latest code to local dir"""
index 5d60dfa..ef36b28 100644 (file)
@@ -19,6 +19,8 @@ from common.buildtrigger import trigger_info, trigger_next
 from common.send_mail import prepare_mail
 from time import sleep
 
+from common.workflow import MailSender
+
 GIT_URL = 'ssh://%s@%s:%s' % (os.getenv('GERRIT_USERNAME'),
                               os.getenv('GERRIT_HOSTNAME'),
                               os.getenv('GERRIT_SSHPORT'))
@@ -32,82 +34,6 @@ class OverwriteError(Exception): pass
 class MergeError(Exception): pass
 class SubmitError(Exception): pass
 
-class MailSender(object):
-    email_title = ''
-    email_head  = ''
-    email_body = ''
-    email_footer = '\n\n--------------------------------------------------------\n'\
-                   'Automatically generated by backend service.\n'\
-                   'Please DO NOT Reply!'
-    email_to = []
-
-    def __init__(self, receiver=None, title=None, body=None):
-        if receiver is not None: self.email_to = receiver
-        if title is not None: self.email_title = title
-        if body is not None: self.email_body = body
-
-    def add_receiver(self, add_new):
-        """ add receiver """
-        if type(add_new) == list:
-            self.email_to.extend(x for x in add_new)
-        elif type(add_new) == str: 
-            self.email_to.append(add_new)
-        else:
-            print 'TYPE(%s) == %s' % (add_new, type(add_new))
-        self.email_to = list(set(self.email_to))
-
-    def add_title(self, add_new):
-        """ add title """
-        self.email_title = self.email_title + ' ' + add_new
-
-    def add_message(self, add_new, top=None):
-        """ add message """
-        if top is not None:
-            self.email_body = add_new + '\n' + self.email_body
-        else:
-            self.email_body = self.email_body + '\n' + add_new
-
-    def add_maintainers(self, mygerrit, group_name=None, project=None):
-        """ add maintainers """
-        if not mygerrit:
-            print 'mygerrit is Null...'
-            return
-
-        if not project and group_name:
-            mbrs = mygerrit.ls_members(['\'\"%s\"\'' % group_name, '--recursive'])
-            for line in mbrs:
-                self.add_receiver(line.split('\t')[3])
-            return
-
-        if project:
-            grps = mygerrit.ls_groups(['--project %s' % project])
-            dest_grp = [s for s in grps if " - Maintainers" in s]
-            for dg in dest_grp:
-                mbrs = mygerrit.ls_members(['\'\"%s\"\'' % dg, '--recursive'])
-                for line in mbrs:
-                    self.add_receiver(line.split('\t')[3])
-            return
-
-    def send_mail(self):
-        """ send mail """  
-        self.email_body = self.email_head + self.email_body + self.email_footer
-
-        self.email_to = [x for x in self.email_to if x != 'n/a']
-        print '\n\n'
-        print self.email_title
-        #m_body = ''
-        #for m in self.email_body.splitlines():
-        #    m_body += '\n'.join(m[i:i+128] for i in xrange(0, len(m), 128)) + '\n'
-        #self.email_body = m_body
-        print self.email_body
-        print self.email_to
-
-        prepare_mail("%s.env" % os.getenv('BUILD_TAG'), \
-                     self.email_title, \
-                     self.email_body, \
-                     os.getenv('NOREPLY_EMAIL_SENDER'), \
-                     self.email_to)
-
 def submit_gerrit_change(gerritobj, gitprj, project, branch, commit):
     result = True
     gerritobj.review(commit=commit, project=project, message='Submitted by system administrator', verified=1, codereview=2, submit=True)
@@ -173,18 +99,18 @@ def update_sync_for_git_sync(tmpdir, private_gerrit, target, requests, request_s
     private_git_dir = ''
 
     for item  in requests[requests.keys()[0]]:
-        project = item['gerrit_project']
-        revision = item['cid']
-        submitter = item['submitter']
-        git_tag = item['git_tag']
-        deleted = item['deleted']
+        project = item.get('gerrit_project')
+        revision = item.get('cid')
+        submitter = item.get('submitter')
+        git_tag = item.get('git_tag')
+        deleted = item.get('deleted')
 
         if project.startswith(HIGHLIGHT) or deleted:
             continue
         else:
            project = project[1:]
            request_projects.append((project, revision, submitter, git_tag))
-
+           is_mixed_git = True
         try:
             print '\n-----[Manifest Information]-------------------------------'
             print 'GIT_PREFIX:', GIT_PREFIX
@@ -234,7 +160,14 @@ def update_sync_for_git_sync(tmpdir, private_gerrit, target, requests, request_s
             if retcode != 0:
                 raise RevisionError('error')
 
-            if True: ## Merge 
+            if not private_gitprj.has_branch('origin/%s' % branch, True):
+                print '\n* Create %s branch on %s repository as %s' % (branch, private_project, commit)
+                ret = private_gitprj._git_inout('push',['-q', '-f', '%s/%s' % (GIT_URL, private_project), \
+                                       '%s:refs/heads/%s' % (commit, branch)])
+                if ret == None:
+                    raise UpstreamError('create %s branch failed(%s)' % (branch, private_project))
+                merge_successs.append((private_project, '%s -> %s' %(commit, commit)))
+            elif is_mixed_git: ## Merge
                 if branch in private_gitprj.branch_contains(commit):
                     print 'already merge %s branch..' % (branch)
                     continue