Changeset 3241

Show
Ignore:
Timestamp:
02/15/08 03:37:04 (10 months ago)
Author:
hvr
Message:

GitPlugin: implemented internal shortrev() method to avoid having to waste cpu cycles with fork+exec to git rev-parse --short

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gitplugin/0.11/tracext/git/PyGIT.py

    r3238 r3241  
    114114 
    115115class Storage: 
     116    __SREV_MIN = 6 # minimum short-rev length 
     117 
    116118    @staticmethod 
    117119    def git_version(): 
     
    175177                self.logger.debug("triggered rebuild of commit tree db for %d" % id(self)) 
    176178                new_db = {} 
     179                new_sdb = {} 
    177180                new_tags = set([]) 
    178181                parent = None 
     
    186189 
    187190                    rev = revs[0] 
     191 
     192                    # shortrev "hash" map 
     193                    new_sdb.setdefault(rev[:self.__SREV_MIN], set()).add(rev) 
     194 
    188195                    parents = set(revs[1:]) 
    189196 
     
    210217                            new_db[parent] = (set([rev]), set(), 0) # dummy ordinal_id 
    211218 
    212                 self._commit_db = new_db, parent, new_tags 
     219                self._commit_db = new_db, parent, new_tags, new_sdb 
    213220                self.last_youngest_rev = youngest 
    214221                self.logger.debug("rebuilt commit tree db for %d with %d entries" % (id(self),len(new_db))) 
     
    297304    def shortrev(self, rev): 
    298305        "try to shorten sha id" 
    299         return self.repo.rev_parse("--short", str(rev)).read().strip() 
     306        #try to emulate the following: 
     307        #return self.repo.rev_parse("--short", str(rev)).read().strip() 
     308 
     309        rev = str(rev) 
     310 
     311        db = self.get_commits() 
     312        sdb = self._commit_db[3] 
     313 
     314        if rev not in db: 
     315            return rev 
     316 
     317        srev = rev[:self.__SREV_MIN] 
     318        srevs = sdb[srev] 
     319 
     320        if len(srevs) == 1: 
     321            return srev # we already got a unique id 
     322 
     323        # find a shortened id for which rev doesn't conflict with 
     324        # the other ones from srevs 
     325        crevs = srevs - set([rev]) 
     326 
     327        for l in range(self.__SREV_MIN+1, 40): 
     328            srev = rev[:l] 
     329            if srev not in [ r[:l] for r in crevs ]: 
     330                return srev 
     331 
     332        return rev # worst-case, all except the last character match 
    300333 
    301334    def get_branches(self): 
     
    504537 
    505538if __name__ == '__main__': 
    506     import sys, logging 
    507  
    508     print "git version [%s]" % str(git_version()) 
     539    import sys, logging, timeit 
     540 
     541    print "git version [%s]" % str(Storage.git_version()) 
    509542 
    510543    g = Storage(sys.argv[1], logging) 
     
    549582    print len(check4loops(g.parents(g.head())[0])) 
    550583 
     584    #p = g.head() 
     585    #revs = [ g.history_relative_rev(p, i) for i in range(0,10) ] 
     586    revs = g.get_commits().keys() 
     587 
     588    def shortrev_test(): 
     589        for i in revs: 
     590            i = str(i) 
     591            s = g.shortrev(i) 
     592            assert i.startswith(s) 
     593 
     594    iters = 1 
     595    print "timing %d*shortrev_test()..." % len(revs) 
     596    t = timeit.Timer("shortrev_test()", "from __main__ import shortrev_test") 
     597    print "%.2f usec/rev" % (1000000 * t.timeit(number=iters)/len(revs)) 
     598 
    551599    #print len(check4loops(g.oldest_rev())) 
    552600