obsolete.py
changeset 44 b243c10a5fbe
parent 43 20fca307d9f0
child 46 3b0364fc822f
equal deleted inserted replaced
43:20fca307d9f0 44:b243c10a5fbe
     9 from mercurial import util
     9 from mercurial import util
    10 from mercurial import context
    10 from mercurial import context
    11 from mercurial import revset
    11 from mercurial import revset
    12 from mercurial import scmutil
    12 from mercurial import scmutil
    13 from mercurial import extensions
    13 from mercurial import extensions
       
    14 from mercurial import pushkey
    14 from mercurial.node import hex, bin
    15 from mercurial.node import hex, bin
    15 
    16 
    16 # Patch changectx
    17 # Patch changectx
    17 #############################
    18 #############################
    18 
    19 
    51         if rebase:
    52         if rebase:
    52             extensions.wrapfunction(rebase, 'concludenode', concludenode)
    53             extensions.wrapfunction(rebase, 'concludenode', concludenode)
    53     except KeyError:
    54     except KeyError:
    54         pass # rebase not found
    55         pass # rebase not found
    55 
    56 
       
    57 # Pushkey mechanism for mutable
       
    58 #########################################
       
    59 
       
    60 def pushobsolete(repo, key, old, relations):
       
    61     assert key == "relations"
       
    62     w = repo.wlock()
       
    63     try:
       
    64         for sub, objs in relations.iteritems():
       
    65             for obj in objs:
       
    66                 repo.addobsolete(sub, obj)
       
    67     finally:
       
    68         w.release()
       
    69 
       
    70 def listobsolete(repo):
       
    71     return {'relations': repo._obssubrels}
       
    72 
       
    73 pushkey.register('obsolete', pushobsolete, listobsolete)
       
    74 
    56 # New commands
    75 # New commands
    57 #############################
    76 #############################
    58 
    77 
    59 
    78 
    60 def cmddebugobsolete(ui, repo, subject, object):
    79 def cmddebugobsolete(ui, repo, subject, object):
    67     return 0
    86     return 0
    68 
    87 
    69 cmdtable = {'debugobsolete': (cmddebugobsolete, [], '<subject> <object>')}
    88 cmdtable = {'debugobsolete': (cmddebugobsolete, [], '<subject> <object>')}
    70 
    89 
    71 def reposetup(ui, repo):
    90 def reposetup(ui, repo):
       
    91 
       
    92     opull = repo.pull
       
    93     opush = repo.push
    72 
    94 
    73     class obsoletingrepo(repo.__class__):
    95     class obsoletingrepo(repo.__class__):
    74 
    96 
    75 
    97 
    76         ### Hidden revision support
    98         ### Hidden revision support
   126                         f.write('%s %s\n' % (hex(sub), hex(obj)))
   148                         f.write('%s %s\n' % (hex(sub), hex(obj)))
   127                 f.rename()
   149                 f.rename()
   128             finally:
   150             finally:
   129                 f.close()
   151                 f.close()
   130 
   152 
       
   153         ### pull // push support
       
   154 
       
   155         def pull(self, remote, *args, **kwargs):
       
   156             obskey = remote.listkeys('obsolete')
       
   157             obsrels = obskey.get('relations', {})
       
   158             result = opull(remote, *args, **kwargs)
       
   159             for sub, objs in obsrels.iteritems():
       
   160                 for obj in objs:
       
   161                     self.addobsolete(sub, obj)
       
   162             return result
       
   163 
       
   164         def push(self, remote, *args, **opts):
       
   165             obskey = remote.listkeys('obsolete')
       
   166             obssupport = 'relations' in obskey
       
   167             result = opush(remote, *args, **opts)
       
   168             if obssupport:
       
   169                 remote.pushkey('obsolete', 'relations', {}, self._obssubrels)
       
   170             return result
       
   171 
       
   172 
   131         ### Public method
   173         ### Public method
   132         def obsoletedby(self, node):
   174         def obsoletedby(self, node):
   133             """return the set of node that make <node> obsolete (obj)"""
   175             """return the set of node that make <node> obsolete (obj)"""
   134             return self._obsobjrels.get(node, set())
   176             return self._obsobjrels.get(node, set())
   135 
   177