[PATCH] util: add a getfstype method

Jun Wu quark at fb.com
Thu Mar 2 19:58:30 EST 2017


Excerpts from Augie Fackler's message of 2017-03-02 19:58:14 -0500:
> On Thu, Mar 02, 2017 at 11:22:16AM -0800, Jun Wu wrote:
> > # HG changeset patch
> > # User Jun Wu <quark at fb.com>
> > # Date 1488482129 28800
> > #      Thu Mar 02 11:15:29 2017 -0800
> > # Node ID 1e0decacf511722da03e0297bd846b2379953ae6
> > # Parent  0bb3089fe73527c64f1afc40b86ecb8dfe7fd7aa
> > # Available At https://bitbucket.org/quark-zju/hg-draft 
> > #              hg pull https://bitbucket.org/quark-zju/hg-draft  -r 1e0decacf511
> > util: add a getfstype method
> 
> I'd really like to see this used in context before taking it, or at a
> minimum a sketch of the full path forward (including some testing notions.)

The test is a bit hard to write - we cannot mount filesystem from userspace
(in a portable way). So I guess the best thing we can do is probably testing
equality for two paths that we are sure that they are on a same filesystem.

I'll try to get it used in vfs.

> 
> Thanks!
> 
> >
> > We have been very conservative about things like hardlink, flock etc.
> > because of some buggy (network) filesystem implementations. That's sad
> > because there are a lot of good (local) filesystem implementations where
> > optimizations like hardlinks could be just used safely.
> >
> > This patch adds a "getfstype" method as a first step to solve the problem.
> > It only supports Linux for now, as Linux is widely used and could be
> > supported relatively cleanly. We can add support for other platforms later.
> >
> > diff --git a/mercurial/posix.py b/mercurial/posix.py
> > --- a/mercurial/posix.py
> > +++ b/mercurial/posix.py
> > @@ -658,2 +658,33 @@ def bindunixsocket(sock, path):
> >          os.fchdir(bakwdfd)
> >          os.close(bakwdfd)
> > +
> > +if pycompat.sysplatform.startswith('linux'):
> > +    # for Linux, reading /etc/mtab (symlink to /proc/self/mounts) is a reliable
> > +    # way to get the current filesystem mount information
> > +    def _fstypetable():
> > +        result = {}
> > +        try:
> > +            with open('/etc/mtab', 'r') as f:
> > +                for line in f.read().splitlines():
> > +                    name, path, fs, ops, freq, passno = line.split(' ', 5)
> > +                    result[path] = fs
> > +        except OSError:
> > +            # /etc/mtab is not guaranteed available
> > +            pass
> > +        return result
> > +else:
> > +    # unknown platform
> > +    def _fstypetable():
> > +        return {}
> > +
> > +def getfstype(path):
> > +    """Given a path, return filesystem type or None (best-effort)"""
> > +    table = _fstypetable()
> > +    while True:
> > +        if path in table:
> > +            return table[path]
> > +        nextpath = os.path.dirname(path)
> > +        if nextpath == path:
> > +            return None
> > +        else:
> > +            path = nextpath
> > diff --git a/mercurial/util.py b/mercurial/util.py
> > --- a/mercurial/util.py
> > +++ b/mercurial/util.py
> > @@ -93,7 +93,8 @@ expandglobs = platform.expandglobs
> >  explainexit = platform.explainexit
> >  findexe = platform.findexe
> > +getfstype = platform.getfstype
> >  gethgcmd = platform.gethgcmd
> > +getpid = os.getpid
> >  getuser = platform.getuser
> > -getpid = os.getpid
> >  groupmembers = platform.groupmembers
> >  groupname = platform.groupname
> > diff --git a/mercurial/windows.py b/mercurial/windows.py
> > --- a/mercurial/windows.py
> > +++ b/mercurial/windows.py
> > @@ -478,2 +478,7 @@ def readpipe(pipe):
> >  def bindunixsocket(sock, path):
> >      raise NotImplementedError('unsupported platform')
> > +
> > +def getfstype(path):
> > +    """Given a path, return filesystem type or None (best-effort)"""
> > +    # not implemented for Windows
> > +    return None
> > _______________________________________________
> > Mercurial-devel mailing list
> > Mercurial-devel at mercurial-scm.org
> > https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel 


More information about the Mercurial-devel mailing list