mercurial/dirstate.py
changeset 4611 274c99fc629f
parent 4610 b43f17691ae6
child 4612 86e5500a517e
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()