def add_pack(self): """Add a new pack to this object store. :return: Fileobject to write to and a commit function to call when the pack is finished. """ fd, path = tempfile.mkstemp(dir=self.pack_dir, suffix=".pack") f = fs.open(path, 'wb', OSError) def commit(): os.fsync(fd) f.close() if os.path.getsize(path) > 0: return self.move_in_pack(path) else: os.remove(path) return None return f, commit
def add_thin_pack(self): """Add a new thin pack to this object store. Thin packs are packs that contain deltas with parents that exist in a different pack. """ fd, path = tempfile.mkstemp(dir=self.pack_dir, suffix=".pack") f = fs.open(path, 'wb', OSError) def commit(): os.fsync(fd) f.close() if os.path.getsize(path) > 0: return self.move_in_thin_pack(path) else: os.remove(path) return None return f, commit
def GitFile(filename, mode='rb', bufsize=-1): """Create a file object that obeys the git file locking protocol. :return: a builtin file object or a _GitFile object :note: See _GitFile for a description of the file locking protocol. Only read-only and write-only (binary) modes are supported; r+, w+, and a are not. To read and write from the same file, you can take advantage of the fact that opening a file for write does not actually open the file you request. """ if 'a' in mode: raise IOError('append mode not supported for Git files') if '+' in mode: raise IOError('read/write mode not supported for Git files') if 'b' not in mode: raise IOError('text mode not supported for Git files') if 'w' in mode: return _GitFile(filename, mode, bufsize) else: return fs.open(filename, mode, IOError)