mercurial/hg.py
changeset 227 f57519cddd3d
parent 225 1651a3e61925
child 228 2502aa663484
equal deleted inserted replaced
226:1536ccac47e9 227:f57519cddd3d
   153     def __init__(self, opener, ui):
   153     def __init__(self, opener, ui):
   154         self.opener = opener
   154         self.opener = opener
   155         self.dirty = 0
   155         self.dirty = 0
   156         self.ui = ui
   156         self.ui = ui
   157         self.map = None
   157         self.map = None
       
   158         self.pl = None
   158 
   159 
   159     def __del__(self):
   160     def __del__(self):
   160         if self.dirty:
   161         if self.dirty:
   161             self.write()
   162             self.write()
   162 
   163 
   169 
   170 
   170     def __contains__(self, key):
   171     def __contains__(self, key):
   171         if not self.map: self.read()
   172         if not self.map: self.read()
   172         return key in self.map
   173         return key in self.map
   173 
   174 
       
   175     def parents(self):
       
   176         if not self.pl:
       
   177             self.read()
       
   178         return self.pl
       
   179 
       
   180     def setparents(self, p1, p2 = nullid):
       
   181         self.dirty = 1
       
   182         self.pl = p1, p2
       
   183 
   174     def state(self, key):
   184     def state(self, key):
   175         try:
   185         try:
   176             return self[key][0]
   186             return self[key][0]
   177         except KeyError:
   187         except KeyError:
   178             return "?"
   188             return "?"
   179 
   189 
   180     def read(self):
   190     def read(self):
   181         if self.map is not None: return self.map
   191         if self.map is not None: return self.map
   182 
   192 
   183         self.map = {}
   193         self.map = {}
       
   194         self.pl = [nullid, nullid]
   184         try:
   195         try:
   185             st = self.opener("dirstate").read()
   196             st = self.opener("dirstate").read()
   186         except: return
   197         except: return
   187 
   198 
   188         pos = 0
   199         self.pl = [st[:20], st[20: 40]]
       
   200 
       
   201         pos = 40
   189         while pos < len(st):
   202         while pos < len(st):
   190             e = struct.unpack(">cllll", st[pos:pos+17])
   203             e = struct.unpack(">cllll", st[pos:pos+17])
   191             l = e[4]
   204             l = e[4]
   192             pos += 17
   205             pos += 17
   193             f = st[pos:pos + l]
   206             f = st[pos:pos + l]
   230         self.map = {}
   243         self.map = {}
   231         self.dirty = 1
   244         self.dirty = 1
   232 
   245 
   233     def write(self):
   246     def write(self):
   234         st = self.opener("dirstate", "w")
   247         st = self.opener("dirstate", "w")
       
   248         st.write("".join(self.pl))
   235         for f, e in self.map.items():
   249         for f, e in self.map.items():
   236             e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
   250             e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
   237             st.write(e + f)
   251             st.write(e + f)
   238         self.dirty = 0
   252         self.dirty = 0
   239 
   253 
   295         self.ignorelist = None
   309         self.ignorelist = None
   296         self.tags = None
   310         self.tags = None
   297 
   311 
   298         if not self.remote:
   312         if not self.remote:
   299             self.dirstate = dirstate(self.opener, ui)
   313             self.dirstate = dirstate(self.opener, ui)
   300             try:
   314 
   301                 self.current = bin(self.opener("current").read())
       
   302             except IOError:
       
   303                 self.current = None
       
   304 
       
   305     def setcurrent(self, node):
       
   306         self.current = node
       
   307         self.opener("current", "w").write(hex(node))
       
   308       
       
   309     def ignore(self, f):
   315     def ignore(self, f):
   310         if self.ignorelist is None:
   316         if self.ignorelist is None:
   311             self.ignorelist = []
   317             self.ignorelist = []
   312             try:
   318             try:
   313                 l = open(os.path.join(self.root, ".hgignore"))
   319                 l = open(os.path.join(self.root, ".hgignore"))
   364 
   370 
   365             self.ui.status("discarding dirstate\n")
   371             self.ui.status("discarding dirstate\n")
   366             node = self.changelog.tip()
   372             node = self.changelog.tip()
   367             f.sort()
   373             f.sort()
   368 
   374 
   369             self.setcurrent(node)
   375             self.dirstate.setparents(node)
   370             self.dirstate.update(f, 'i')
   376             self.dirstate.update(f, 'i')
   371         
   377         
   372         else:
   378         else:
   373             self.ui.warn("no undo information available\n")
   379             self.ui.warn("no undo information available\n")
   374 
   380 
   484                 file(f, "w").write(t)
   490                 file(f, "w").write(t)
   485             except IOError:
   491             except IOError:
   486                 os.makedirs(os.path.dirname(f))
   492                 os.makedirs(os.path.dirname(f))
   487                 file(f, "w").write(t)
   493                 file(f, "w").write(t)
   488 
   494 
   489         self.setcurrent(node)
   495         self.dirstate.setparents(node)
   490         self.dirstate.clear()
   496         self.dirstate.clear()
   491         self.dirstate.update([f for f,n in l], "n")
   497         self.dirstate.update([f for f,n in l], "n")
   492 
   498 
   493     def diffdir(self, path, changeset):
   499     def diffdir(self, path, changeset):
   494         changed = []
   500         changed = []