[PATCH 1 of 5] scmutil: rename classes from "opener" to "vfs"

Adrian Buehlmann adrian at cadifra.com
Mon Aug 13 02:49:05 CDT 2012


On 2012-08-13 08:17, FUJIWARA Katsunori wrote:
> 
> At Sun, 12 Aug 2012 11:09:59 +0200,
> Adrian Buehlmann wrote:
>>
>> On 2012-08-11 14:14, FUJIWARA Katsunori wrote:
>>> # HG changeset patch
>>> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
>>> # Date 1344687074 -32400
>>> # Node ID dea54508bb39698cfd74b1281b0d12af09aff139
>>> # Parent  b131e24e2984a610d77e124dd3f58b2b5eda6d1a
>>> scmutil: rename classes from "opener" to "vfs"
>>
>> ..
>>
>>> This patch just rename class names, so still leaves original class
>>> names as aliases for renamed classes for backward compatibility.
>>
>> This sentence is erroneous. Perhaps this would work instead:
>>
>> "For backwards compatibility, aliases for the old names are added."
> 
> OK, I'll re-post with such description, thanks.
> 
>> Stupid question: Will the aliases be removed at some point in the
>> future? If yes, when will that happen?
> 
> IMHO, they should be removed:
> 
>   - just after all 'scmutil.*opener()' invocations are removed from
>     Mercurial core implementation("scmutil.opener()" is still invoked,
>     yet), or

[..]

>   - after the next major release of such removing, as grace period for
>     3rd party products

I don't think we've done such things in the past. There has never been
such a thing as a stable Mercurial API.

http://mercurial.selenic.com/wiki/MercurialApi#Why_you_shouldn.27t_use_Mercurial.27s_internal_API

The policy has always been that third party products have to cope with
moving Mercurial API (if they depend on Mercurial on that level).

So I think the only valid reason for "backwards compatibility" is thus a
temporal one: until you have migrated all uses.

>>> diff -r b131e24e2984 -r dea54508bb39 mercurial/scmutil.py
>>> --- a/mercurial/scmutil.py	Mon Aug 06 12:07:21 2012 -0500
>>> +++ b/mercurial/scmutil.py	Sat Aug 11 21:11:14 2012 +0900
>>> @@ -167,7 +167,7 @@
>>>          # want to add "foo/bar/baz" before checking if there's a "foo/.hg"
>>>          self.auditeddir.update(prefixes)
>>>  
>>> -class abstractopener(object):
>>> +class abstractvfs(object):
>>>      """Abstract base class; cannot be instantiated"""
>>>  
>>>      def __init__(self, *args, **kwargs):
>>> @@ -219,8 +219,10 @@
>>>      def makedirs(self, path=None, mode=None):
>>>          return util.makedirs(self.join(path), mode)
>>>  
>>> -class opener(abstractopener):
>>> -    '''Open files relative to a base directory
>>> +abstractopner = abstractvfs
>>              ^
>> Typo.
> 
> Ooops, I'll re-post fixed series.
> 
> "abstractopener" seems to be never referred from core implementation,
> after this patch :-)

So, why adding an alias then?

>>> --- a/mercurial/statichttprepo.py	Mon Aug 06 12:07:21 2012 -0500
>>> +++ b/mercurial/statichttprepo.py	Sat Aug 11 21:11:14 2012 +0900
>>> @@ -64,7 +64,7 @@
>>>      urlopener = url.opener(ui, authinfo)
>>>      urlopener.add_handler(byterange.HTTPRangeHandler())
>>>  
>>> -    class statichttpopener(scmutil.abstractopener):
>>> +    class statichttpvfs(scmutil.abstractvfs):
>>>          def __init__(self, base):
>>>              self.base = base
>>>  
>>> @@ -74,7 +74,7 @@
>>>              f = "/".join((self.base, urllib.quote(path)))
>>>              return httprangereader(f, urlopener)
>>>  
>>> -    return statichttpopener
>>> +    return statichttpvfs
>>>  
>>>  class statichttppeer(localrepo.localpeer):
>>>      def local(self):
>>
>> No alias for statichttpopener?
> 
> I think that "statichttpopener" name is never referred other that this
> function because it is defined function locally.
> 
>>> diff -r b131e24e2984 -r dea54508bb39 mercurial/store.py
>>> --- a/mercurial/store.py	Mon Aug 06 12:07:21 2012 -0500
>>> +++ b/mercurial/store.py	Sat Aug 11 21:11:14 2012 +0900
>>> @@ -367,7 +367,7 @@
>>>              self._load()
>>>          return iter(self.entries)
>>>  
>>> -class _fncacheopener(scmutil.abstractopener):
>>> +class _fncachevfs(scmutil.abstractvfs):
>>>      def __init__(self, op, fnc, encode):
>>>          self.opener = op
>>>          self.fncache = fnc
>>
>> ..
>>
>>> @@ -378,6 +378,8 @@
>>>              self.fncache.add(path)
>>>          return self.opener(self.encode(path), mode, *args, **kw)
>>>  
>>> +_fncacheopener = _fncachevfs
>>> +
>>
>> Is this really needed? _fncacheopener should be private to scmutil (it
>> starts with an underbar)
> 
> Yes, you are right. "_fncacheopener" shouldn't be referred from
> outside, of course.
> 
> But private-ness of "_fncacheopener" is ensured not by "restriction of
> Python" but by "agreement of programmers", and it is fact that
> "_fncacheopener" can be referred from outside of "store.py".
> 
> So, I treat it as same as other "opener" classes in this patch.

[..]

> I'll remove adding "_fncacheopener" alias at re-posting of this
> series, if this decision is bad.

I think you should only add an _fncacheopener alias if it is needed in
Mercurial's own code.

If it isn't needed in Mercurial's own code (includes core extensions,
obviously), then do not add the _fncacheopener alias.


More information about the Mercurial-devel mailing list