mercurial/pure/parsers.py
changeset 43077 687b865b95ad
parent 43076 2372284d9457
child 43106 d783f945a701
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
    26 def dirstatetuple(*x):
    26 def dirstatetuple(*x):
    27     # x is a tuple
    27     # x is a tuple
    28     return x
    28     return x
    29 
    29 
    30 
    30 
    31 indexformatng = ">Qiiiiii20s12x"
    31 indexformatng = b">Qiiiiii20s12x"
    32 indexfirst = struct.calcsize('Q')
    32 indexfirst = struct.calcsize(b'Q')
    33 sizeint = struct.calcsize('i')
    33 sizeint = struct.calcsize(b'i')
    34 indexsize = struct.calcsize(indexformatng)
    34 indexsize = struct.calcsize(indexformatng)
    35 
    35 
    36 
    36 
    37 def gettype(q):
    37 def gettype(q):
    38     return int(q & 0xFFFF)
    38     return int(q & 0xFFFF)
    49     def append(self, tup):
    49     def append(self, tup):
    50         self._extra.append(tup)
    50         self._extra.append(tup)
    51 
    51 
    52     def _check_index(self, i):
    52     def _check_index(self, i):
    53         if not isinstance(i, int):
    53         if not isinstance(i, int):
    54             raise TypeError("expecting int indexes")
    54             raise TypeError(b"expecting int indexes")
    55         if i < 0 or i >= len(self):
    55         if i < 0 or i >= len(self):
    56             raise IndexError
    56             raise IndexError
    57 
    57 
    58     def __getitem__(self, i):
    58     def __getitem__(self, i):
    59         if i == -1:
    59         if i == -1:
    81     def _calculate_index(self, i):
    81     def _calculate_index(self, i):
    82         return i * indexsize
    82         return i * indexsize
    83 
    83 
    84     def __delitem__(self, i):
    84     def __delitem__(self, i):
    85         if not isinstance(i, slice) or not i.stop == -1 or i.step is not None:
    85         if not isinstance(i, slice) or not i.stop == -1 or i.step is not None:
    86             raise ValueError("deleting slices only supports a:-1 with step 1")
    86             raise ValueError(b"deleting slices only supports a:-1 with step 1")
    87         i = i.start
    87         i = i.start
    88         self._check_index(i)
    88         self._check_index(i)
    89         if i < self._lgt:
    89         if i < self._lgt:
    90             self._data = self._data[: i * indexsize]
    90             self._data = self._data[: i * indexsize]
    91             self._lgt = i
    91             self._lgt = i
   106         if lgt is not None:
   106         if lgt is not None:
   107             self._offsets = [0] * lgt
   107             self._offsets = [0] * lgt
   108         count = 0
   108         count = 0
   109         while off <= len(self._data) - indexsize:
   109         while off <= len(self._data) - indexsize:
   110             (s,) = struct.unpack(
   110             (s,) = struct.unpack(
   111                 '>i', self._data[off + indexfirst : off + sizeint + indexfirst]
   111                 b'>i', self._data[off + indexfirst : off + sizeint + indexfirst]
   112             )
   112             )
   113             if lgt is not None:
   113             if lgt is not None:
   114                 self._offsets[count] = off
   114                 self._offsets[count] = off
   115             count += 1
   115             count += 1
   116             off += indexsize + s
   116             off += indexsize + s
   117         if off != len(self._data):
   117         if off != len(self._data):
   118             raise ValueError("corrupted data")
   118             raise ValueError(b"corrupted data")
   119         return count
   119         return count
   120 
   120 
   121     def __delitem__(self, i):
   121     def __delitem__(self, i):
   122         if not isinstance(i, slice) or not i.stop == -1 or i.step is not None:
   122         if not isinstance(i, slice) or not i.stop == -1 or i.step is not None:
   123             raise ValueError("deleting slices only supports a:-1 with step 1")
   123             raise ValueError(b"deleting slices only supports a:-1 with step 1")
   124         i = i.start
   124         i = i.start
   125         self._check_index(i)
   125         self._check_index(i)
   126         if i < self._lgt:
   126         if i < self._lgt:
   127             self._offsets = self._offsets[:i]
   127             self._offsets = self._offsets[:i]
   128             self._lgt = i
   128             self._lgt = i
   141 
   141 
   142 
   142 
   143 def parse_dirstate(dmap, copymap, st):
   143 def parse_dirstate(dmap, copymap, st):
   144     parents = [st[:20], st[20:40]]
   144     parents = [st[:20], st[20:40]]
   145     # dereference fields so they will be local in loop
   145     # dereference fields so they will be local in loop
   146     format = ">cllll"
   146     format = b">cllll"
   147     e_size = struct.calcsize(format)
   147     e_size = struct.calcsize(format)
   148     pos1 = 40
   148     pos1 = 40
   149     l = len(st)
   149     l = len(st)
   150 
   150 
   151     # the inner loop
   151     # the inner loop
   152     while pos1 < l:
   152     while pos1 < l:
   153         pos2 = pos1 + e_size
   153         pos2 = pos1 + e_size
   154         e = _unpack(">cllll", st[pos1:pos2])  # a literal here is faster
   154         e = _unpack(b">cllll", st[pos1:pos2])  # a literal here is faster
   155         pos1 = pos2 + e[4]
   155         pos1 = pos2 + e[4]
   156         f = st[pos2:pos1]
   156         f = st[pos2:pos1]
   157         if '\0' in f:
   157         if b'\0' in f:
   158             f, c = f.split('\0')
   158             f, c = f.split(b'\0')
   159             copymap[f] = c
   159             copymap[f] = c
   160         dmap[f] = e[:4]
   160         dmap[f] = e[:4]
   161     return parents
   161     return parents
   162 
   162 
   163 
   163 
   164 def pack_dirstate(dmap, copymap, pl, now):
   164 def pack_dirstate(dmap, copymap, pl, now):
   165     now = int(now)
   165     now = int(now)
   166     cs = stringio()
   166     cs = stringio()
   167     write = cs.write
   167     write = cs.write
   168     write("".join(pl))
   168     write(b"".join(pl))
   169     for f, e in dmap.iteritems():
   169     for f, e in dmap.iteritems():
   170         if e[0] == 'n' and e[3] == now:
   170         if e[0] == b'n' and e[3] == now:
   171             # The file was last modified "simultaneously" with the current
   171             # The file was last modified "simultaneously" with the current
   172             # write to dirstate (i.e. within the same second for file-
   172             # write to dirstate (i.e. within the same second for file-
   173             # systems with a granularity of 1 sec). This commonly happens
   173             # systems with a granularity of 1 sec). This commonly happens
   174             # for at least a couple of files on 'update'.
   174             # for at least a couple of files on 'update'.
   175             # The user could change the file without changing its size
   175             # The user could change the file without changing its size
   179             # mistakenly treating such files as clean.
   179             # mistakenly treating such files as clean.
   180             e = dirstatetuple(e[0], e[1], e[2], -1)
   180             e = dirstatetuple(e[0], e[1], e[2], -1)
   181             dmap[f] = e
   181             dmap[f] = e
   182 
   182 
   183         if f in copymap:
   183         if f in copymap:
   184             f = "%s\0%s" % (f, copymap[f])
   184             f = b"%s\0%s" % (f, copymap[f])
   185         e = _pack(">cllll", e[0], e[1], e[2], e[3], len(f))
   185         e = _pack(b">cllll", e[0], e[1], e[2], e[3], len(f))
   186         write(e)
   186         write(e)
   187         write(f)
   187         write(f)
   188     return cs.getvalue()
   188     return cs.getvalue()