back to vsys-scripts-0.95-25
[build.git] / module-tools.py
index 940e4b5..1afe04e 100755 (executable)
@@ -259,17 +259,17 @@ class GitRepository:
         return os.path.basename(self.path)
 
     def url(self):
-        self.repo_root()
+        return self.repo_root()
 
     def repo_root(self):
         c = Command("git remote show origin", self.options)
         out = self.__run_in_repo(c.output_of)
         for line in out.split('\n'):
             if line.strip().startswith("Fetch URL:"):
-                repo = line.split()[2]
+                return line.split()[2]
 
     @classmethod
-    def checkout(cls, remote, local, options, depth=1):
+    def checkout(cls, remote, local, options, depth=0):
         Command("rm -rf %s" % local, options).run_silent()
         Command("git clone --depth %d %s %s" % (depth, remote, local), options).run_fatal()
         return GitRepository(local, options)
@@ -298,21 +298,34 @@ class GitRepository:
         else:
             return self.__run_in_repo(c.run_fatal)
 
+    def __is_commit_id(self, id):
+        c = Command("git show %s | grep commit | awk '{print $2;}'" % id, self.options)
+        ret = self.__run_in_repo(c.output_of, with_stderr=False)
+        if ret.strip() == id:
+            return True
+        return False
+
     def update(self, subdir=None, recursive=None, branch="master"):
         if branch == "master":
             self.__run_command_in_repo("git checkout %s" % branch)
         else:
-            self.__run_command_in_repo("git checkout origin/%s" % branch)
+            self.to_branch(branch, remote=True)
         self.__run_command_in_repo("git fetch origin --tags")
         self.__run_command_in_repo("git fetch origin")
-        self.__run_command_in_repo("git merge --ff origin/%s" % branch)
+        if not self.__is_commit_id(branch):
+            # we don't need to merge anythign for commit ids.
+            self.__run_command_in_repo("git merge --ff origin/%s" % branch)
 
     def to_branch(self, branch, remote=True):
+        self.revert()
         if remote:
-            branch = "origin/%s" % branch
+            command = "git branch --track %s origin/%s" % (branch, branch)
+            c = Command(command, self.options)
+            self.__run_in_repo(c.output_of, with_stderr=True)
         return self.__run_command_in_repo("git checkout %s" % branch)
 
     def to_tag(self, tag):
+        self.revert()
         return self.__run_command_in_repo("git checkout %s" % tag)
 
     def tag(self, tagname, logfile):
@@ -327,11 +340,14 @@ class GitRepository:
         c = Command("git diff %s" % tagname, self.options)
         return self.__run_in_repo(c.output_of, with_stderr=True)
 
-    def commit(self, logfile):
+    def commit(self, logfile, branch="master"):
         self.__run_command_in_repo("git add .", ignore_errors=True)
         self.__run_command_in_repo("git add -u", ignore_errors=True)
         self.__run_command_in_repo("git commit -F  %s" % logfile, ignore_errors=True)
-        self.__run_command_in_repo("git push")
+        if branch == "master" or self.__is_commit_id(branch):
+            self.__run_command_in_repo("git push")
+        else:
+            self.__run_command_in_repo("git push origin %s:%s" % (branch, branch))
         self.__run_command_in_repo("git push --tags")
 
     def revert(self, f=""):
@@ -822,17 +838,17 @@ that for other purposes than tagging""" % options.workdir
         else:
             if self.options.verbose:
                 print 'Searching for -SVNPATH or -GITPATH lines referring to /%s/\n\tin %s .. '%(self.name,tagsfile),
-            pattern="\A\s*(?P<make_name>[^\s]+)-(SVNPATH|GITPATH)\s*(=|:=)\s*(?P<url_main>[^\s]+)/%s[^\s]+"\
-                                          %(self.name)
+            pattern="\A\s*%s-(SVNPATH|GITPATH)\s*(=|:=)\s*(?P<url_main>[^\s]+)/%s[^\s]+"\
+                                          %(self.name,self.name)
             matcher_module=re.compile(pattern)
             for line in tags.readlines():
                 attempt=matcher_module.match(line)
                 if attempt:
                     if line.find("-GITPATH") >= 0:
-                        modulepath = "%s-GITPATH"%(attempt.group('make_name'))
+                        modulepath = "%s-GITPATH"%self.name
                         replacement = "%-32s:= %s/%s.git@%s\n"%(modulepath,attempt.group('url_main'),self.name,newname)
                     else:
-                        modulepath = "%s-SVNPATH"%(attempt.group('make_name'))
+                        modulepath = "%s-SVNPATH"%self.name
                         replacement = "%-32s:= %s/%s/tags/%s\n"%(modulepath,attempt.group('url_main'),self.name,newname)
                     if self.options.verbose:
                         print ' ' + modulepath, 
@@ -972,7 +988,7 @@ Please write a changelog for this new tag in the section above
                     elif choice == 'f':
                         self.patch_tags_file(tagsfile,old_tag_name,new_tag_name,fine_grain=False)
                     elif choice == 'd':
-                        print build.diff(f=tagsfile)
+                        print build.diff(f=os.path.basename(tagsfile))
                     elif choice == 'r':
                         build.revert(f=tagsfile)
                     elif choice == 'c':
@@ -997,7 +1013,10 @@ n: move to next file"""%locals()
             print self.repository.diff()
 
         def commit_all_changes(log):
-            self.repository.commit(log)
+            if hasattr(self,'branch'):
+                self.repository.commit(log, branch=self.branch)
+            else:
+                self.repository.commit(log)
             build.commit(log)
 
         self.run_prompt("Review module and build", diff_all_changes)
@@ -1026,6 +1045,7 @@ n: move to next file"""%locals()
                 return
             else:
                 self.html_print ("%-16s %s"%(varname,spec_dict[varname]))
+        self.html_print ("%-16s %s"%('url',self.repository.url()))
         if self.options.verbose:
             self.html_print ("%-16s %s"%('main specfile:',self.main_specname()))
             self.html_print ("%-16s %s"%('specfiles:',self.all_specnames()))