comparison mercurial/dirstate.py @ 4611:274c99fc629f

dirstate: simplify state()
author Matt Mackall <mpm@selenic.com>
date Mon, 18 Jun 2007 13:24:34 -0500
parents b43f17691ae6
children 86e5500a517e
comparison
equal deleted inserted replaced
4610:b43f17691ae6 4611:274c99fc629f
10 from node import * 10 from node import *
11 from i18n import _ 11 from i18n import _
12 import struct, os, time, bisect, stat, strutil, util, re, errno, ignore 12 import struct, os, time, bisect, stat, strutil, util, re, errno, ignore
13 import cStringIO 13 import cStringIO
14 14
15 _unknown = ('?', 0, 0, 0)
16 _format = ">cllll"
17
15 class dirstate(object): 18 class dirstate(object):
16 format = ">cllll"
17 19
18 def __init__(self, opener, ui, root): 20 def __init__(self, opener, ui, root):
19 self.opener = opener 21 self.opener = opener
20 self.root = root 22 self.root = root
21 self.dirty = 0 23 self.dirty = 0
88 self.write() 90 self.write()
89 91
90 def __getitem__(self, key): 92 def __getitem__(self, key):
91 return self.map[key] 93 return self.map[key]
92 94
93 _unknown = ('?', 0, 0, 0)
94
95 def get(self, key):
96 try:
97 return self[key]
98 except KeyError:
99 return self._unknown
100
101 def __contains__(self, key): 95 def __contains__(self, key):
102 return key in self.map 96 return key in self.map
103 97
104 def parents(self): 98 def parents(self):
105 return self.pl 99 return self.pl
118 def setbranch(self, branch): 112 def setbranch(self, branch):
119 self._branch = branch 113 self._branch = branch
120 self.opener("branch", "w").write(branch + '\n') 114 self.opener("branch", "w").write(branch + '\n')
121 115
122 def state(self, key): 116 def state(self, key):
123 try: 117 return self.map.get(key, ("?",))[0]
124 return self[key][0]
125 except KeyError:
126 return "?"
127 118
128 def read(self): 119 def read(self):
129 self.map = {} 120 self.map = {}
130 self.copymap = {} 121 self.copymap = {}
131 self.pl = [nullid, nullid] 122 self.pl = [nullid, nullid]
140 self.pl = [st[:20], st[20: 40]] 131 self.pl = [st[:20], st[20: 40]]
141 132
142 # deref fields so they will be local in loop 133 # deref fields so they will be local in loop
143 dmap = self.map 134 dmap = self.map
144 copymap = self.copymap 135 copymap = self.copymap
145 format = self.format
146 unpack = struct.unpack 136 unpack = struct.unpack
147 137
148 pos = 40 138 pos = 40
149 e_size = struct.calcsize(format) 139 e_size = struct.calcsize(_format)
150 140
151 while pos < len(st): 141 while pos < len(st):
152 newpos = pos + e_size 142 newpos = pos + e_size
153 e = unpack(format, st[pos:newpos]) 143 e = unpack(_format, st[pos:newpos])
154 l = e[4] 144 l = e[4]
155 pos = newpos 145 pos = newpos
156 newpos = pos + l 146 newpos = pos + l
157 f = st[pos:newpos] 147 f = st[pos:newpos]
158 if '\0' in f: 148 if '\0' in f:
256 cs.write("".join(self.pl)) 246 cs.write("".join(self.pl))
257 for f, e in self.map.iteritems(): 247 for f, e in self.map.iteritems():
258 c = self.copied(f) 248 c = self.copied(f)
259 if c: 249 if c:
260 f = f + "\0" + c 250 f = f + "\0" + c
261 e = struct.pack(self.format, e[0], e[1], e[2], e[3], len(f)) 251 e = struct.pack(_format, e[0], e[1], e[2], e[3], len(f))
262 cs.write(e) 252 cs.write(e)
263 cs.write(f) 253 cs.write(f)
264 st = self.opener("dirstate", "w", atomictemp=True) 254 st = self.opener("dirstate", "w", atomictemp=True)
265 st.write(cs.getvalue()) 255 st.write(cs.getvalue())
266 st.rename() 256 st.rename()