# HG changeset patch # User FUJIWARA Katsunori # Date 2016-09-22 12:51:56 # Node ID 0c40e64d6154bedbfdf09d7ea8a7dba481c1e3f4 # Parent 041a77a223ca979a7531f88037b1555838d474cf scmutil: factor out common logic of delayclosedfile to reuse it This is a preparation for the subsequent patch, which adds another proxy class for a file object. diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -1300,15 +1300,13 @@ def gddeltaconfig(ui): # experimental config: format.generaldelta return ui.configbool('format', 'generaldelta', False) -class delayclosedfile(object): - """Proxy for a file object whose close is delayed. +class closewrapbase(object): + """Base class of wrapper, which hooks closing Do not instantiate outside of the vfs layer. """ - - def __init__(self, fh, closer): + def __init__(self, fh): object.__setattr__(self, '_origfh', fh) - object.__setattr__(self, '_closer', closer) def __getattr__(self, attr): return getattr(self._origfh, attr) @@ -1323,6 +1321,21 @@ class delayclosedfile(object): return self._origfh.__enter__() def __exit__(self, exc_type, exc_value, exc_tb): + raise NotImplementedError('attempted instantiating ' + str(type(self))) + + def close(self): + raise NotImplementedError('attempted instantiating ' + str(type(self))) + +class delayclosedfile(closewrapbase): + """Proxy for a file object whose close is delayed. + + Do not instantiate outside of the vfs layer. + """ + def __init__(self, fh, closer): + super(delayclosedfile, self).__init__(fh) + object.__setattr__(self, '_closer', closer) + + def __exit__(self, exc_type, exc_value, exc_tb): self._closer.close(self._origfh) def close(self):