[PATCH] util: add a getfstype method

Augie Fackler raf at durin42.com
Thu Mar 2 19:58:14 EST 2017


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.)

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