mercurial/appendfile.py
changeset 2075 343aeefb553b
parent 2027 94d3170399e1
child 2082 856f0ba200bc
equal deleted inserted replaced
2074:01ee43dda681 2075:343aeefb553b
    40         self.offset = fp.tell()
    40         self.offset = fp.tell()
    41         # real file is not written by anyone else. cache its size so
    41         # real file is not written by anyone else. cache its size so
    42         # seek and read can be fast.
    42         # seek and read can be fast.
    43         self.fpsize = os.fstat(fp.fileno()).st_size
    43         self.fpsize = os.fstat(fp.fileno()).st_size
    44 
    44 
    45     def seek(self, offset):
    45     def end(self):
       
    46         self.tmpfp.flush() # make sure the stat is correct
       
    47         return self.fpsize + os.fstat(self.tmpfp.fileno()).st_size
       
    48 
       
    49     def seek(self, offset, whence=0):
    46         '''virtual file offset spans real file and temp file.'''
    50         '''virtual file offset spans real file and temp file.'''
    47         self.offset = offset
    51         if whence == 0:
       
    52             self.offset = offset
       
    53         elif whence == 1:
       
    54             self.offset += offset
       
    55         elif whence == 2:
       
    56             self.offset = self.end() + offset
       
    57 
    48         if self.offset < self.fpsize:
    58         if self.offset < self.fpsize:
    49             self.realfp.seek(self.offset)
    59             self.realfp.seek(self.offset)
    50         else:
    60         else:
    51             self.tmpfp.seek(self.offset - self.fpsize)
    61             self.tmpfp.seek(self.offset - self.fpsize)
    52 
    62 
   101 
   111 
   102     def __init__(self, fp):
   112     def __init__(self, fp):
   103         self.fp = fp
   113         self.fp = fp
   104         self.offset = 0
   114         self.offset = 0
   105 
   115 
   106     def seek(self, offset):
   116     def tell(self):
   107         self.offset = offset
   117         return self.offset
       
   118 
       
   119     def seek(self, offset, whence=0):
       
   120         if whence == 0:
       
   121             self.offset = offset
       
   122         elif whence == 1:
       
   123             self.offset += offset
       
   124         elif whence == 2:
       
   125             self.offset = self.fp.end() + offset
   108 
   126 
   109     def read(self, count=-1):
   127     def read(self, count=-1):
   110         try:
   128         try:
   111             if self.offset != self.fp.offset:
   129             if self.offset != self.fp.offset:
   112                 self.fp.seek(self.offset)
   130                 self.fp.seek(self.offset)
   141 
   159 
   142     def __call__(self, name, mode='r'):
   160     def __call__(self, name, mode='r'):
   143         '''open file.  return same cached appendfile object for every
   161         '''open file.  return same cached appendfile object for every
   144         later call.'''
   162         later call.'''
   145 
   163 
   146         assert mode in 'ra'
   164         assert mode in 'ra+'
   147         fp = self.fps.get(name)
   165         fp = self.fps.get(name)
   148         if fp is None:
   166         if fp is None:
   149             fp = appendfile(self.realopener(name, 'a+'))
   167             fp = appendfile(self.realopener(name, 'a+'))
   150             self.fps[name] = fp
   168             self.fps[name] = fp
   151         return sharedfile(fp)
   169         return sharedfile(fp)
   163 
   181 
   164 class appendchangelog(changelog.changelog, appendopener):
   182 class appendchangelog(changelog.changelog, appendopener):
   165     def __init__(self, opener):
   183     def __init__(self, opener):
   166         appendopener.__init__(self, opener)
   184         appendopener.__init__(self, opener)
   167         changelog.changelog.__init__(self, self)
   185         changelog.changelog.__init__(self, self)
       
   186     def checkinlinesize(self, fp, tr):
       
   187         return
   168 
   188 
   169 class appendmanifest(manifest.manifest, appendopener):
   189 class appendmanifest(manifest.manifest, appendopener):
   170     def __init__(self, opener):
   190     def __init__(self, opener):
   171         appendopener.__init__(self, opener)
   191         appendopener.__init__(self, opener)
   172         manifest.manifest.__init__(self, self)
   192         manifest.manifest.__init__(self, self)
       
   193     def checkinlinesize(self, fp, tr):
       
   194         return