mercurial/manifest.py
changeset 2845 d0159c5f18bf
parent 2844 e196aa1df169
child 2846 35af2e56f15a
equal deleted inserted replaced
2844:e196aa1df169 2845:d0159c5f18bf
    13 class manifestflags(dict):
    13 class manifestflags(dict):
    14     def __init__(self, mapping={}):
    14     def __init__(self, mapping={}):
    15         dict.__init__(self, mapping)
    15         dict.__init__(self, mapping)
    16     def execf(self, f):
    16     def execf(self, f):
    17         "test for executable in manifest flags"
    17         "test for executable in manifest flags"
    18         return self.get(f, False)
    18         return "x" in self.get(f, "")
    19     def linkf(self, f):
    19     def linkf(self, f):
    20         "test for symlink in manifest flags"
    20         "test for symlink in manifest flags"
    21         return False
    21         return "l" in self.get(f, "")
    22     def set(self, f, execf=False, linkf=False):
    22     def set(self, f, execf=False, linkf=False):
    23         self[f] = execf
    23         fl = ""
       
    24         if execf: fl = "x"
       
    25         if linkf: fl = "l"
       
    26         self[f] = fl
    24     def copy(self):
    27     def copy(self):
    25         return manifestflags(dict.copy(self))
    28         return manifestflags(dict.copy(self))
    26 
    29 
    27 class manifest(revlog):
    30 class manifest(revlog):
    28     def __init__(self, opener, defversion=REVLOGV0):
    31     def __init__(self, opener, defversion=REVLOGV0):
    41         self.listcache = array.array('c', text)
    44         self.listcache = array.array('c', text)
    42         lines = text.splitlines(1)
    45         lines = text.splitlines(1)
    43         for l in lines:
    46         for l in lines:
    44             (f, n) = l.split('\0')
    47             (f, n) = l.split('\0')
    45             map[f] = bin(n[:40])
    48             map[f] = bin(n[:40])
    46             flag[f] = (n[40:-1] == "x")
    49             flag[f] = n[40:-1]
    47         self.mapcache = (node, map, flag)
    50         self.mapcache = (node, map, flag)
    48         return map
    51         return map
    49 
    52 
    50     def readflags(self, node):
    53     def readflags(self, node):
    51         if node == nullid: return manifestflags() # don't upset local cache
    54         if node == nullid: return manifestflags() # don't upset local cache
   135             files = map.keys()
   138             files = map.keys()
   136             files.sort()
   139             files.sort()
   137 
   140 
   138             # if this is changed to support newlines in filenames,
   141             # if this is changed to support newlines in filenames,
   139             # be sure to check the templates/ dir again (especially *-raw.tmpl)
   142             # be sure to check the templates/ dir again (especially *-raw.tmpl)
   140             text = ["%s\000%s%s\n" %
   143             text = ["%s\000%s%s\n" % (f, hex(map[f]), flags[f]) for f in files]
   141                             (f, hex(map[f]), flags[f] and "x" or '')
       
   142                             for f in files]
       
   143             self.listcache = array.array('c', "".join(text))
   144             self.listcache = array.array('c', "".join(text))
   144             cachedelta = None
   145             cachedelta = None
   145         else:
   146         else:
   146             addlist = self.listcache
   147             addlist = self.listcache
   147 
   148 
   163             for w in work:
   164             for w in work:
   164                 f = w[0]
   165                 f = w[0]
   165                 # bs will either be the index of the item or the insert point
   166                 # bs will either be the index of the item or the insert point
   166                 start, end = self._search(addbuf, f, start)
   167                 start, end = self._search(addbuf, f, start)
   167                 if w[1] == 0:
   168                 if w[1] == 0:
   168                     l = "%s\000%s%s\n" % (f, hex(map[f]),
   169                     l = "%s\000%s%s\n" % (f, hex(map[f]), flags[f])
   169                                           flags[f] and "x" or '')
       
   170                 else:
   170                 else:
   171                     l = ""
   171                     l = ""
   172                 if start == end and w[1] == 1:
   172                 if start == end and w[1] == 1:
   173                     # item we want to delete was not found, error out
   173                     # item we want to delete was not found, error out
   174                     raise AssertionError(
   174                     raise AssertionError(