2022-01-06 01:42:23 +03:00
|
|
|
# Portions Copyright (c) Meta Platforms, Inc. and affiliates.
|
2019-11-01 22:33:28 +03:00
|
|
|
#
|
|
|
|
# This software may be used and distributed according to the terms of the
|
|
|
|
# GNU General Public License version 2.
|
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
# vfs.py - Mercurial 'vfs' classes
|
|
|
|
#
|
2022-05-17 04:40:28 +03:00
|
|
|
# Copyright Olivia Mackall <olivia@selenic.com>
|
2017-03-01 13:00:12 +03:00
|
|
|
#
|
|
|
|
# This software may be used and distributed according to the terms of the
|
|
|
|
# GNU General Public License version 2 or any later version.
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
2020-02-01 21:30:49 +03:00
|
|
|
import abc
|
2017-03-01 13:00:12 +03:00
|
|
|
import contextlib
|
|
|
|
import errno
|
|
|
|
import os
|
2019-09-04 21:07:35 +03:00
|
|
|
import re
|
2017-03-01 13:00:12 +03:00
|
|
|
import shutil
|
|
|
|
import stat
|
|
|
|
import tempfile
|
|
|
|
import threading
|
2020-02-04 08:35:13 +03:00
|
|
|
import typing
|
|
|
|
from typing import (
|
|
|
|
Any,
|
|
|
|
BinaryIO,
|
|
|
|
Callable,
|
|
|
|
ContextManager,
|
apply import merging for fbcode (4 of 11)
Summary:
Applies new import merging and sorting from µsort v1.0.
When merging imports, µsort will make a best-effort to move associated
comments to match merged elements, but there are known limitations due to
the diynamic nature of Python and developer tooling. These changes should
not produce any dangerous runtime changes, but may require touch-ups to
satisfy linters and other tooling.
Note that µsort uses case-insensitive, lexicographical sorting, which
results in a different ordering compared to isort. This provides a more
consistent sorting order, matching the case-insensitive order used when
sorting import statements by module name, and ensures that "frog", "FROG",
and "Frog" always sort next to each other.
For details on µsort's sorting and merging semantics, see the user guide:
https://usort.readthedocs.io/en/stable/guide.html#sorting
Reviewed By: lisroach
Differential Revision: D36402162
fbshipit-source-id: 6d180e9003d466c4f866fc9d454c6531766ca1dd
2022-05-15 22:53:03 +03:00
|
|
|
IO,
|
2020-02-04 08:35:13 +03:00
|
|
|
Iterable,
|
|
|
|
List,
|
|
|
|
Optional,
|
|
|
|
Tuple,
|
|
|
|
Union,
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
from . import encoding, error, pathutil, pycompat, util
|
2017-03-01 13:00:12 +03:00
|
|
|
from .i18n import _
|
2020-01-29 18:38:41 +03:00
|
|
|
from .pycompat import decodeutf8, encodeutf8
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2017-07-04 17:13:47 +03:00
|
|
|
def _avoidambig(path, oldstat):
|
|
|
|
"""Avoid file stat ambiguity forcibly
|
|
|
|
|
|
|
|
This function causes copying ``path`` file, if it is owned by
|
|
|
|
another (see issue5418 and issue5584 for detail).
|
|
|
|
"""
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-07-04 17:13:47 +03:00
|
|
|
def checkandavoid():
|
|
|
|
newstat = util.filestat.frompath(path)
|
|
|
|
# return whether file stat ambiguity is (already) avoided
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
return not newstat.isambig(oldstat) or newstat.avoidambig(path, oldstat)
|
|
|
|
|
2017-07-04 17:13:47 +03:00
|
|
|
if not checkandavoid():
|
|
|
|
# simply copy to change owner of path to get privilege to
|
|
|
|
# advance mtime (see issue5418)
|
|
|
|
util.rename(util.mktempcopy(path), path)
|
|
|
|
checkandavoid()
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2020-02-01 21:30:49 +03:00
|
|
|
class abstractvfs(pycompat.ABC):
|
2017-03-01 13:00:12 +03:00
|
|
|
"""Abstract base class; cannot be instantiated"""
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
_backgroundfilecloser: "Optional[backgroundfilecloser]" = None
|
2020-02-01 21:30:49 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def __init__(self, *args, **kwargs):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""Prevent instantiation; don't call this from subclasses."""
|
|
|
|
raise NotImplementedError("attempted instantiating " + str(type(self)))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2020-02-01 21:30:49 +03:00
|
|
|
@abc.abstractmethod
|
|
|
|
def __call__(
|
|
|
|
self,
|
2022-02-10 01:26:09 +03:00
|
|
|
path: str,
|
|
|
|
mode: str = "r",
|
|
|
|
text: bool = False,
|
|
|
|
atomictemp: bool = False,
|
|
|
|
notindexed: bool = False,
|
|
|
|
backgroundclose: bool = False,
|
|
|
|
checkambig: bool = False,
|
|
|
|
auditpath: bool = True,
|
|
|
|
) -> "BinaryIO":
|
2020-02-03 18:33:24 +03:00
|
|
|
raise NotImplementedError("must be implemented by subclasses")
|
2020-02-01 21:30:49 +03:00
|
|
|
|
2020-02-04 02:26:15 +03:00
|
|
|
@abc.abstractmethod
|
2022-02-10 01:26:09 +03:00
|
|
|
def join(self, path: "Optional[str]", *insidef: str) -> str:
|
2020-02-04 02:26:15 +03:00
|
|
|
raise NotImplementedError("must be implemented by subclasses")
|
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def tryread(self, path):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""gracefully return an empty string for missing files"""
|
2017-03-01 13:00:12 +03:00
|
|
|
try:
|
|
|
|
return self.read(path)
|
|
|
|
except IOError as inst:
|
|
|
|
if inst.errno != errno.ENOENT:
|
|
|
|
raise
|
2020-01-29 18:38:41 +03:00
|
|
|
return b""
|
|
|
|
|
|
|
|
def tryreadutf8(self, path):
|
|
|
|
return decodeutf8(self.tryread(path))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
def tryreadlines(self, path, mode="rb"):
|
|
|
|
"""gracefully return an empty array for missing files"""
|
2017-03-01 13:00:12 +03:00
|
|
|
try:
|
|
|
|
return self.readlines(path, mode=mode)
|
|
|
|
except IOError as inst:
|
|
|
|
if inst.errno != errno.ENOENT:
|
|
|
|
raise
|
|
|
|
return []
|
|
|
|
|
|
|
|
@util.propertycache
|
2022-02-10 01:26:09 +03:00
|
|
|
def open(
|
|
|
|
self,
|
|
|
|
) -> "Callable[[str, str, bool, bool, bool, bool, bool, bool], BinaryIO]":
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""Open ``path`` file, which is relative to vfs root.
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
Newly created directories are marked as "not to be indexed by
|
|
|
|
the content indexing service", if ``notindexed`` is specified
|
|
|
|
for "write" mode access.
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""
|
2017-03-01 13:00:12 +03:00
|
|
|
return self.__call__
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def read(self, path: str) -> bytes:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
with self(path, "rb") as fp:
|
2017-03-01 13:00:12 +03:00
|
|
|
return fp.read()
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def readutf8(self, path: str) -> str:
|
2020-01-29 18:38:41 +03:00
|
|
|
return decodeutf8(self.read(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def readlines(self, path: str, mode: str = "rb") -> "List[bytes]":
|
2017-03-01 13:00:12 +03:00
|
|
|
with self(path, mode=mode) as fp:
|
|
|
|
return fp.readlines()
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def write(self, path: str, data: bytes, backgroundclose: bool = False) -> int:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
with self(path, "wb", backgroundclose=backgroundclose) as fp:
|
2017-03-01 13:00:12 +03:00
|
|
|
return fp.write(data)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def writeutf8(self, path: str, data: str) -> None:
|
2020-02-01 21:30:49 +03:00
|
|
|
self.write(path, encodeutf8(data))
|
2020-01-29 18:38:41 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def writelines(
|
|
|
|
self, path: str, data: "List[bytes]", mode: str = "wb", notindexed: bool = False
|
|
|
|
) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
with self(path, mode=mode, notindexed=notindexed) as fp:
|
|
|
|
return fp.writelines(data)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def append(self, path: str, data: bytes) -> int:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
with self(path, "ab") as fp:
|
2017-03-01 13:00:12 +03:00
|
|
|
return fp.write(data)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def basename(self, path: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
"""return base element of a path (as os.path.basename would do)
|
|
|
|
|
|
|
|
This exists to allow handling of strange encoding if needed."""
|
|
|
|
return os.path.basename(path)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def chmod(self, path: str, mode: int) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.chmod(self.join(path), mode)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def dirname(self, path: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
"""return dirname element of a path (as os.path.dirname would do)
|
|
|
|
|
|
|
|
This exists to allow handling of strange encoding if needed."""
|
|
|
|
return os.path.dirname(path)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def exists(self, path: "Optional[str]" = None) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.path.exists(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def fstat(self, fp: "IO") -> "util.wrapped_stat_result":
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.fstat(fp)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def isdir(self, path: "Optional[str]" = None) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.path.isdir(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def isfile(self, path: "Optional[str]" = None) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.path.isfile(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def islink(self, path: "Optional[str]" = None) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.path.islink(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def isexec(self, path: "Optional[str]" = None) -> bool:
|
2018-02-27 22:05:33 +03:00
|
|
|
return util.isexec(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def isfileorlink(self, path: "Optional[str]" = None) -> bool:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""return whether path is a regular file or a symlink
|
2017-03-01 13:00:12 +03:00
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
Unlike isfile, this doesn't follow symlinks."""
|
2017-03-01 13:00:12 +03:00
|
|
|
try:
|
|
|
|
st = self.lstat(path)
|
|
|
|
except OSError:
|
|
|
|
return False
|
|
|
|
mode = st.st_mode
|
|
|
|
return stat.S_ISREG(mode) or stat.S_ISLNK(mode)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def reljoin(self, *paths: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
"""join various elements of a path together (as os.path.join would do)
|
|
|
|
|
|
|
|
The vfs base is not injected so that path stay relative. This exists
|
|
|
|
to allow handling of strange encoding if needed."""
|
|
|
|
return os.path.join(*paths)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def split(self, path: str) -> "Tuple[str, str]":
|
2017-03-01 13:00:12 +03:00
|
|
|
"""split top-most element of a path (as os.path.split would do)
|
|
|
|
|
|
|
|
This exists to allow handling of strange encoding if needed."""
|
|
|
|
return os.path.split(path)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def lexists(self, path: "Optional[str]" = None) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.path.lexists(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def lstat(self, path: "Optional[str]" = None) -> "util.wrapped_stat_result":
|
2019-12-10 00:09:25 +03:00
|
|
|
return util.lstat(self.join(path))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def listdir(self, path: "Optional[str]" = None) -> "List[str]":
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.listdir(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def makedir(self, path: "Optional[str]" = None, notindexed: bool = True) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.makedir(self.join(path), notindexed)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def makedirs(
|
|
|
|
self, path: "Optional[str]" = None, mode: "Optional[int]" = None
|
|
|
|
) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.makedirs(self.join(path), mode)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def makelock(
|
|
|
|
self, info: str, path: str, checkdeadlock: bool = True
|
|
|
|
) -> "Optional[int]":
|
2021-11-05 19:58:42 +03:00
|
|
|
return util.makelock(info, self.join(path), checkdeadlock=checkdeadlock)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def mkdir(self, path: "Optional[str]" = None) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.mkdir(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def mkstemp(
|
|
|
|
self,
|
|
|
|
suffix: str = "",
|
|
|
|
prefix: str = "tmp",
|
|
|
|
dir: "Optional[str]" = None,
|
|
|
|
text: bool = False,
|
|
|
|
) -> "Tuple[int, str]":
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
fd, name = tempfile.mkstemp(
|
|
|
|
suffix=suffix, prefix=prefix, dir=self.join(dir), text=text
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
dname, fname = util.split(name)
|
|
|
|
if dir:
|
|
|
|
return fd, os.path.join(dir, fname)
|
|
|
|
else:
|
|
|
|
return fd, fname
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def readdir(
|
|
|
|
self,
|
|
|
|
path: "Optional[str]" = None,
|
|
|
|
stat: "Optional[bool]" = None,
|
|
|
|
skip: "Optional[str]" = None,
|
|
|
|
) -> "List[str]":
|
2022-08-04 11:23:02 +03:00
|
|
|
# pyre-fixme[7]: Expected `List[str]` but got `Union[List[Tuple[str, int]],
|
|
|
|
# List[Tuple[str, int, stat]]]`.
|
2017-04-26 16:26:28 +03:00
|
|
|
return util.listdir(self.join(path), stat, skip)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def readlock(self, path: "Optional[str]") -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.readlock(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def rename(self, src: str, dst: str, checkambig: bool = False) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
"""Rename from src to dst
|
|
|
|
|
|
|
|
checkambig argument is used with util.filestat, and is useful
|
|
|
|
only if destination file is guarded by any lock
|
|
|
|
(e.g. repo.lock or repo.wlock).
|
2017-07-04 17:13:47 +03:00
|
|
|
|
|
|
|
To avoid file stat ambiguity forcibly, checkambig=True involves
|
|
|
|
copying ``src`` file, if it is owned by another. Therefore, use
|
|
|
|
checkambig=True only in limited cases (see also issue5418 and
|
|
|
|
issue5584 for detail).
|
2017-03-01 13:00:12 +03:00
|
|
|
"""
|
vfs: create copy at renaming to avoid file stat ambiguity if needed
In order to fix issue5418, 0d920bcb0fd1 made vfs.rename(checkambig=True)
omit advancing mtime of renamed file, if renamed file is owned by
another (EPERM is raised in this case).
But this omission causes rewinding mtime at restoration in such
situation, and makes avoiding file stat ambiguity difficult, because
ExactCacheValidationPlan assumes that mtime should be advanced, if a
file is changed in same ctime.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
Ambiguity of file stat also requires issue5584 to be fixed with other
than file stat, but "hash of file", "generation ID" and so on were
already rejected ideas (please see original RFC linked from "Outline
of issue" in ExactCacheValidationPlan page).
This omission occurs:
- only for non append-only files (dirstate, bookmarks, and phaseroots), and
- only if previous transaction is rollbacked by another user
The latter means "sharing a repository clone via group permission".
This is reasonable usecase, but not ordinary for many users, IMHO.
"hg rollback" itself has been deprecated since Mercurial 2.7, too.
Therefore, increasing the cost at rollbacking previous transaction
executed by another a little seems reasonable, for avoidance of file
stat ambiguity.
This patch does:
- create copy of (already renamed) source file, if advancing mtime
fails for EPERM
- rename from copied file to destination file, and
- advance mtime of renamed file, which is now owned by current user
This patch also factors "self.join(src)" out to reduce redundancy.
2017-06-09 06:58:18 +03:00
|
|
|
srcpath = self.join(src)
|
2017-03-01 13:00:12 +03:00
|
|
|
dstpath = self.join(dst)
|
2017-06-11 00:09:54 +03:00
|
|
|
oldstat = checkambig and util.filestat.frompath(dstpath)
|
2017-03-01 13:00:12 +03:00
|
|
|
if oldstat and oldstat.stat:
|
2017-07-04 17:13:47 +03:00
|
|
|
ret = util.rename(srcpath, dstpath)
|
|
|
|
_avoidambig(dstpath, oldstat)
|
2017-03-01 13:00:12 +03:00
|
|
|
return ret
|
vfs: create copy at renaming to avoid file stat ambiguity if needed
In order to fix issue5418, 0d920bcb0fd1 made vfs.rename(checkambig=True)
omit advancing mtime of renamed file, if renamed file is owned by
another (EPERM is raised in this case).
But this omission causes rewinding mtime at restoration in such
situation, and makes avoiding file stat ambiguity difficult, because
ExactCacheValidationPlan assumes that mtime should be advanced, if a
file is changed in same ctime.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
Ambiguity of file stat also requires issue5584 to be fixed with other
than file stat, but "hash of file", "generation ID" and so on were
already rejected ideas (please see original RFC linked from "Outline
of issue" in ExactCacheValidationPlan page).
This omission occurs:
- only for non append-only files (dirstate, bookmarks, and phaseroots), and
- only if previous transaction is rollbacked by another user
The latter means "sharing a repository clone via group permission".
This is reasonable usecase, but not ordinary for many users, IMHO.
"hg rollback" itself has been deprecated since Mercurial 2.7, too.
Therefore, increasing the cost at rollbacking previous transaction
executed by another a little seems reasonable, for avoidance of file
stat ambiguity.
This patch does:
- create copy of (already renamed) source file, if advancing mtime
fails for EPERM
- rename from copied file to destination file, and
- advance mtime of renamed file, which is now owned by current user
This patch also factors "self.join(src)" out to reduce redundancy.
2017-06-09 06:58:18 +03:00
|
|
|
return util.rename(srcpath, dstpath)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def readlink(self, path: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
return os.readlink(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def removedirs(self, path: "Optional[str]" = None) -> None:
|
2020-10-15 06:19:13 +03:00
|
|
|
"""Remove a leaf directory and all empty intermediate ones"""
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.removedirs(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def rmtree(
|
|
|
|
self,
|
|
|
|
path: "Optional[str]" = None,
|
|
|
|
ignore_errors: bool = False,
|
|
|
|
forcibly: bool = False,
|
|
|
|
) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
"""Remove a directory tree recursively
|
|
|
|
|
|
|
|
If ``forcibly``, this tries to remove READ-ONLY files, too.
|
|
|
|
"""
|
|
|
|
if forcibly:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def onerror(function, path, excinfo):
|
|
|
|
if function is not os.remove:
|
|
|
|
raise
|
|
|
|
# read-only files cannot be unlinked under Windows
|
|
|
|
s = os.stat(path)
|
|
|
|
if (s.st_mode & stat.S_IWRITE) != 0:
|
|
|
|
raise
|
|
|
|
os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE)
|
|
|
|
os.remove(path)
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
else:
|
|
|
|
onerror = None
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
return shutil.rmtree(
|
|
|
|
self.join(path), ignore_errors=ignore_errors, onerror=onerror
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def setflags(self, path: str, l: bool, x: bool) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.setflags(self.join(path), l, x)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def stat(self, path: "Optional[str]" = None) -> "util.wrapped_stat_result":
|
2019-12-10 00:09:25 +03:00
|
|
|
return util.stat(self.join(path))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def unlink(self, path: "Optional[str]" = None) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.unlink(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def tryunlink(self, path: "Optional[str]" = None) -> None:
|
2017-03-21 16:50:28 +03:00
|
|
|
"""Attempt to remove a file, ignoring missing file errors."""
|
|
|
|
util.tryunlink(self.join(path))
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def unlinkpath(
|
|
|
|
self, path: "Optional[str]" = None, ignoremissing: bool = False
|
|
|
|
) -> None:
|
2015-01-14 03:15:26 +03:00
|
|
|
return util.unlinkpath(self.join(path), ignoremissing=ignoremissing)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def utime(self, path=None, t=None):
|
|
|
|
return os.utime(self.join(path), t)
|
|
|
|
|
2020-02-04 08:35:13 +03:00
|
|
|
def walk(
|
|
|
|
self,
|
2022-02-10 01:26:09 +03:00
|
|
|
path: "Optional[str]" = None,
|
|
|
|
onerror: "Optional[Callable[[OSError], None]]" = None,
|
|
|
|
) -> "Iterable[Tuple[str, List[str], List[str]]]":
|
2017-03-01 13:00:12 +03:00
|
|
|
"""Yield (dirpath, dirs, files) tuple for each directories under path
|
|
|
|
|
|
|
|
``dirpath`` is relative one from the root of this vfs. This
|
|
|
|
uses ``os.sep`` as path separator, even you specify POSIX
|
|
|
|
style ``path``.
|
|
|
|
|
|
|
|
"The root of this vfs" is represented as empty ``dirpath``.
|
|
|
|
"""
|
|
|
|
root = os.path.normpath(self.join(None))
|
|
|
|
# when dirpath == root, dirpath[prefixlen:] becomes empty
|
|
|
|
# because len(dirpath) < prefixlen.
|
|
|
|
prefixlen = len(pathutil.normasprefix(root))
|
|
|
|
for dirpath, dirs, files in os.walk(self.join(path), onerror=onerror):
|
|
|
|
yield (dirpath[prefixlen:], dirs, files)
|
|
|
|
|
|
|
|
@contextlib.contextmanager
|
2022-02-10 01:26:09 +03:00
|
|
|
def backgroundclosing(
|
|
|
|
self, ui: "Any", expectedcount: int = -1
|
|
|
|
) -> "ContextManager[backgroundfilecloser]":
|
2017-03-01 13:00:12 +03:00
|
|
|
"""Allow files to be closed asynchronously.
|
|
|
|
|
|
|
|
When this context manager is active, ``backgroundclose`` can be passed
|
|
|
|
to ``__call__``/``open`` to result in the file possibly being closed
|
|
|
|
asynchronously, on a background thread.
|
|
|
|
"""
|
2017-12-12 03:51:13 +03:00
|
|
|
# Sharing backgroundfilecloser between threads is complex and using
|
|
|
|
# multiple instances puts us at risk of running out of file descriptors
|
|
|
|
# only allow to use backgroundfilecloser when in main thread.
|
2020-02-04 08:35:13 +03:00
|
|
|
if not isinstance(
|
|
|
|
# pyre isn't aware of threading._MainThread
|
|
|
|
# Once we are Python 3 only we should switch to threading.main_thread()
|
|
|
|
threading.currentThread(),
|
|
|
|
threading._MainThread, # pyre-fixme
|
|
|
|
):
|
2020-03-06 22:57:48 +03:00
|
|
|
# pyre-fixme[7]: Expected `ContextManager[backgroundfilecloser]` but got
|
|
|
|
# `Generator[None, None, None]`.
|
2017-12-12 03:51:13 +03:00
|
|
|
yield
|
2022-05-05 05:32:11 +03:00
|
|
|
# pyre-fixme[7]: Expected `ContextManager[backgroundfilecloser]` but got
|
|
|
|
# `Generator[typing.Any, typing.Any, None]`.
|
2017-12-12 03:51:13 +03:00
|
|
|
return
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
vfs = getattr(self, "vfs", self)
|
2020-02-01 21:30:49 +03:00
|
|
|
if vfs._backgroundfilecloser is not None:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
raise error.Abort(_("can only have 1 active background file closer"))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
with backgroundfilecloser(ui, expectedcount=expectedcount) as bfc:
|
|
|
|
try:
|
|
|
|
vfs._backgroundfilecloser = bfc
|
2020-02-20 02:03:28 +03:00
|
|
|
# pyre-fixme[7]: Expected `ContextManager[backgroundfilecloser]` but
|
|
|
|
# got `Generator[typing.Any, None, None]`.
|
2017-03-01 13:00:12 +03:00
|
|
|
yield bfc
|
|
|
|
finally:
|
|
|
|
vfs._backgroundfilecloser = None
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
class vfs(abstractvfs):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""Operate files relative to a base directory
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
This class is used to hide the details of COW semantics and
|
|
|
|
remote file access from higher level code.
|
2017-07-26 16:10:15 +03:00
|
|
|
|
|
|
|
'cacheaudited' should be enabled only if (a) vfs object is short-lived, or
|
|
|
|
(b) the base directory is managed by hg and considered sort-of append-only.
|
|
|
|
See pathutil.pathauditor() for details.
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(
|
2022-02-10 01:26:09 +03:00
|
|
|
self,
|
|
|
|
base: str,
|
|
|
|
audit: bool = True,
|
|
|
|
cacheaudited: bool = False,
|
|
|
|
expandpath: bool = False,
|
|
|
|
realpath: bool = False,
|
|
|
|
) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
if expandpath:
|
|
|
|
base = util.expandpath(base)
|
|
|
|
if realpath:
|
|
|
|
base = os.path.realpath(base)
|
|
|
|
self.base = base
|
2017-07-02 05:26:42 +03:00
|
|
|
self._audit = audit
|
|
|
|
if audit:
|
2017-07-26 16:10:15 +03:00
|
|
|
self.audit = pathutil.pathauditor(self.base, cached=cacheaudited)
|
2017-03-01 13:00:12 +03:00
|
|
|
else:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
self.audit = lambda path, mode=None: True
|
2017-07-02 05:26:42 +03:00
|
|
|
self.createmode = None
|
|
|
|
self._trustnlink = None
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
@util.propertycache
|
2022-02-10 01:26:09 +03:00
|
|
|
def _cansymlink(self) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.checklink(self.base)
|
|
|
|
|
|
|
|
@util.propertycache
|
2022-02-10 01:26:09 +03:00
|
|
|
def _chmod(self) -> bool:
|
2017-03-01 13:00:12 +03:00
|
|
|
return util.checkexec(self.base)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def _fixfilemode(self, name: str) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
if self.createmode is None or not self._chmod:
|
|
|
|
return
|
2020-02-04 08:35:13 +03:00
|
|
|
os.chmod(name, typing.cast(int, self.createmode) & 0o666)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
def __call__(
|
|
|
|
self,
|
2022-02-10 01:26:09 +03:00
|
|
|
path: str,
|
|
|
|
mode: str = "r",
|
|
|
|
text: bool = False,
|
|
|
|
atomictemp: bool = False,
|
|
|
|
notindexed: bool = False,
|
|
|
|
backgroundclose: bool = False,
|
|
|
|
checkambig: bool = False,
|
|
|
|
auditpath: bool = True,
|
|
|
|
) -> "BinaryIO":
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""Open ``path`` file, which is relative to vfs root.
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
Newly created directories are marked as "not to be indexed by
|
|
|
|
the content indexing service", if ``notindexed`` is specified
|
|
|
|
for "write" mode access.
|
|
|
|
|
|
|
|
If ``backgroundclose`` is passed, the file may be closed asynchronously.
|
|
|
|
It can only be used if the ``self.backgroundclosing()`` context manager
|
|
|
|
is active. This should only be specified if the following criteria hold:
|
|
|
|
|
|
|
|
1. There is a potential for writing thousands of files. Unless you
|
|
|
|
are writing thousands of files, the performance benefits of
|
|
|
|
asynchronously closing files is not realized.
|
|
|
|
2. Files are opened exactly once for the ``backgroundclosing``
|
|
|
|
active duration and are therefore free of race conditions between
|
|
|
|
closing a file on a background thread and reopening it. (If the
|
|
|
|
file were opened multiple times, there could be unflushed data
|
|
|
|
because the original file handle hasn't been flushed/closed yet.)
|
|
|
|
|
|
|
|
``checkambig`` argument is passed to atomictemplfile (valid
|
|
|
|
only for writing), and is useful only if target file is
|
|
|
|
guarded by any lock (e.g. repo.lock or repo.wlock).
|
2017-07-04 17:13:47 +03:00
|
|
|
|
|
|
|
To avoid file stat ambiguity forcibly, checkambig=True involves
|
|
|
|
copying ``path`` file opened in "append" mode (e.g. for
|
|
|
|
truncation), if it is owned by another. Therefore, use
|
|
|
|
combination of append mode and checkambig=True only in limited
|
|
|
|
cases (see also issue5418 and issue5584 for detail).
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""
|
2020-01-29 18:38:41 +03:00
|
|
|
assert isinstance(path, str)
|
2020-01-29 22:05:00 +03:00
|
|
|
assert isinstance(mode, str)
|
2017-07-02 03:28:04 +03:00
|
|
|
if auditpath:
|
|
|
|
if self._audit:
|
|
|
|
r = util.checkosfilename(path)
|
|
|
|
if r:
|
|
|
|
raise error.Abort("%s: %r" % (r, path))
|
2017-07-11 13:27:58 +03:00
|
|
|
self.audit(path, mode=mode)
|
2017-03-01 13:00:12 +03:00
|
|
|
f = self.join(path)
|
|
|
|
|
|
|
|
if not text and "b" not in mode:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
mode += "b" # for that other OS
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
nlink = -1
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
if mode not in ("r", "rb"):
|
2017-03-01 13:00:12 +03:00
|
|
|
dirname, basename = util.split(f)
|
|
|
|
# If basename is empty, then the path is malformed because it points
|
|
|
|
# to a directory. Let the posixfile() call below raise IOError.
|
|
|
|
if basename:
|
|
|
|
if atomictemp:
|
|
|
|
util.makedirs(dirname, self.createmode, notindexed)
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
return util.atomictempfile(
|
|
|
|
f, mode, self.createmode, checkambig=checkambig
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
try:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
if "w" in mode:
|
2018-06-20 02:17:22 +03:00
|
|
|
util.unlink(f)
|
|
|
|
nlink = 0
|
2017-03-01 13:00:12 +03:00
|
|
|
else:
|
|
|
|
# nlinks() may behave differently for files on Windows
|
|
|
|
# shares if the file is open.
|
|
|
|
with util.posixfile(f):
|
|
|
|
nlink = util.nlinks(f)
|
|
|
|
if nlink < 1:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
nlink = 2 # force mktempcopy (issue1922)
|
2017-03-01 13:00:12 +03:00
|
|
|
except (OSError, IOError) as e:
|
|
|
|
if e.errno != errno.ENOENT:
|
|
|
|
raise
|
|
|
|
nlink = 0
|
|
|
|
util.makedirs(dirname, self.createmode, notindexed)
|
|
|
|
if nlink > 0:
|
|
|
|
if self._trustnlink is None:
|
|
|
|
self._trustnlink = nlink > 1 or util.checknlink(f)
|
|
|
|
if nlink > 1 or not self._trustnlink:
|
|
|
|
util.rename(util.mktempcopy(f), f)
|
|
|
|
fp = util.posixfile(f, mode)
|
|
|
|
if nlink == 0:
|
|
|
|
self._fixfilemode(f)
|
|
|
|
|
|
|
|
if checkambig:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
if mode in ("r", "rb"):
|
|
|
|
raise error.Abort(
|
|
|
|
_(
|
|
|
|
"implementation error: mode %s is not"
|
|
|
|
" valid for checkambig=True"
|
|
|
|
)
|
|
|
|
% mode
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
fp = checkambigatclosing(fp)
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
if backgroundclose and isinstance(
|
2020-02-01 21:30:49 +03:00
|
|
|
threading.currentThread(), threading._MainThread # pyre-fixme
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
):
|
2017-03-01 13:00:12 +03:00
|
|
|
if not self._backgroundfilecloser:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
raise error.Abort(
|
|
|
|
_(
|
|
|
|
"backgroundclose can only be used when a "
|
|
|
|
"backgroundclosing context manager is active"
|
|
|
|
)
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
fp = delayclosedfile(fp, self._backgroundfilecloser)
|
|
|
|
|
2020-05-22 05:31:01 +03:00
|
|
|
# pyre-fixme[7]: Expected `BinaryIO` but got `Union[IO[typing.Any],
|
|
|
|
# checkambigatclosing, delayclosedfile]`.
|
2017-03-01 13:00:12 +03:00
|
|
|
return fp
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def symlink(self, src: "Union[bytes, str]", dst: str) -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
self.audit(dst)
|
|
|
|
linkname = self.join(dst)
|
2017-03-21 16:50:28 +03:00
|
|
|
util.tryunlink(linkname)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
util.makedirs(os.path.dirname(linkname), self.createmode)
|
|
|
|
|
|
|
|
if self._cansymlink:
|
|
|
|
try:
|
|
|
|
os.symlink(src, linkname)
|
|
|
|
except OSError as err:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
raise OSError(
|
|
|
|
err.errno,
|
|
|
|
_("could not symlink to %r: %s")
|
|
|
|
% (src, encoding.strtolocal(err.strerror)),
|
|
|
|
linkname,
|
|
|
|
)
|
2017-03-01 13:00:12 +03:00
|
|
|
else:
|
2020-02-04 08:35:13 +03:00
|
|
|
if isinstance(src, str):
|
|
|
|
self.writeutf8(dst, src)
|
|
|
|
else:
|
|
|
|
self.write(dst, src)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def join(self, path: "Optional[str]", *insidef: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
if path:
|
|
|
|
return os.path.join(self.base, path, *insidef)
|
|
|
|
else:
|
|
|
|
return self.base
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
opener = vfs
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-07-07 17:40:00 +03:00
|
|
|
class proxyvfs(object):
|
2022-02-10 01:26:09 +03:00
|
|
|
def __init__(self, vfs: "abstractvfs") -> None:
|
2017-03-01 13:00:12 +03:00
|
|
|
self.vfs = vfs
|
|
|
|
|
|
|
|
@property
|
|
|
|
def options(self):
|
|
|
|
return self.vfs.options
|
|
|
|
|
|
|
|
@options.setter
|
|
|
|
def options(self, value):
|
|
|
|
self.vfs.options = value
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-07-07 17:40:00 +03:00
|
|
|
class filtervfs(abstractvfs, proxyvfs):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""Wrapper vfs for filtering filenames with a function."""
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def __init__(self, vfs: "abstractvfs", filter: "Callable[[str], str]") -> None:
|
2017-07-07 17:40:00 +03:00
|
|
|
proxyvfs.__init__(self, vfs)
|
2017-03-01 13:00:12 +03:00
|
|
|
self._filter = filter
|
|
|
|
|
|
|
|
def __call__(self, path, *args, **kwargs):
|
|
|
|
return self.vfs(self._filter(path), *args, **kwargs)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def join(self, path: "Optional[str]", *insidef: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
if path:
|
|
|
|
return self.vfs.join(self._filter(self.vfs.reljoin(path, *insidef)))
|
|
|
|
else:
|
|
|
|
return self.vfs.join(path)
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
filteropener = filtervfs
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-07-07 17:40:00 +03:00
|
|
|
class readonlyvfs(abstractvfs, proxyvfs):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
"""Wrapper vfs preventing any writing."""
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def __init__(self, vfs):
|
2017-07-07 17:40:00 +03:00
|
|
|
proxyvfs.__init__(self, vfs)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def __call__(
|
|
|
|
self, path: str, mode: str = "r", *args: bool, **kw: bool
|
|
|
|
) -> "BinaryIO":
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
if mode not in ("r", "rb"):
|
|
|
|
raise error.Abort(_("this vfs is read only"))
|
2017-03-01 13:00:12 +03:00
|
|
|
return self.vfs(path, mode, *args, **kw)
|
|
|
|
|
2022-02-10 01:26:09 +03:00
|
|
|
def join(self, path: "Optional[str]", *insidef: str) -> str:
|
2017-03-01 13:00:12 +03:00
|
|
|
return self.vfs.join(path, *insidef)
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
class closewrapbase(object):
|
|
|
|
"""Base class of wrapper, which hooks closing
|
|
|
|
|
|
|
|
Do not instantiate outside of the vfs layer.
|
|
|
|
"""
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def __init__(self, fh):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
object.__setattr__(self, r"_origfh", fh)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def __getattr__(self, attr):
|
|
|
|
return getattr(self._origfh, attr)
|
|
|
|
|
|
|
|
def __setattr__(self, attr, value):
|
|
|
|
return setattr(self._origfh, attr, value)
|
|
|
|
|
|
|
|
def __delattr__(self, attr):
|
|
|
|
return delattr(self._origfh, attr)
|
|
|
|
|
|
|
|
def __enter__(self):
|
|
|
|
return self._origfh.__enter__()
|
|
|
|
|
|
|
|
def __exit__(self, exc_type, exc_value, exc_tb):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
raise NotImplementedError("attempted instantiating " + str(type(self)))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def close(self):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
raise NotImplementedError("attempted instantiating " + str(type(self)))
|
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
class delayclosedfile(closewrapbase):
|
|
|
|
"""Proxy for a file object whose close is delayed.
|
|
|
|
|
|
|
|
Do not instantiate outside of the vfs layer.
|
|
|
|
"""
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def __init__(self, fh, closer):
|
|
|
|
super(delayclosedfile, self).__init__(fh)
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
object.__setattr__(self, r"_closer", closer)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def __exit__(self, exc_type, exc_value, exc_tb):
|
|
|
|
self._closer.close(self._origfh)
|
|
|
|
|
|
|
|
def close(self):
|
|
|
|
self._closer.close(self._origfh)
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
class backgroundfilecloser(object):
|
|
|
|
"""Coordinates background closing of file handles on multiple threads."""
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def __init__(self, ui, expectedcount=-1):
|
|
|
|
self._running = False
|
|
|
|
self._entered = False
|
|
|
|
self._threads = []
|
|
|
|
self._threadexception = None
|
|
|
|
|
|
|
|
# Only Windows/NTFS has slow file closing. So only enable by default
|
|
|
|
# on that platform. But allow to be enabled elsewhere for testing.
|
2017-10-13 09:30:46 +03:00
|
|
|
defaultenabled = pycompat.iswindows
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
enabled = ui.configbool("worker", "backgroundclose", defaultenabled)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
if not enabled:
|
|
|
|
return
|
|
|
|
|
|
|
|
# There is overhead to starting and stopping the background threads.
|
|
|
|
# Don't do background processing unless the file count is large enough
|
|
|
|
# to justify it.
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
minfilecount = ui.configint("worker", "backgroundcloseminfilecount")
|
2017-03-01 13:00:12 +03:00
|
|
|
# FUTURE dynamically start background threads after minfilecount closes.
|
|
|
|
# (We don't currently have any callers that don't know their file count)
|
|
|
|
if expectedcount > 0 and expectedcount < minfilecount:
|
|
|
|
return
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
maxqueue = ui.configint("worker", "backgroundclosemaxqueue")
|
|
|
|
threadcount = ui.configint("worker", "backgroundclosethreadcount")
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
self._queue = util.queue(maxsize=maxqueue)
|
|
|
|
self._running = True
|
|
|
|
|
|
|
|
for i in range(threadcount):
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
t = threading.Thread(target=self._worker, name="backgroundcloser")
|
2017-03-01 13:00:12 +03:00
|
|
|
self._threads.append(t)
|
|
|
|
t.start()
|
|
|
|
|
|
|
|
def __enter__(self):
|
|
|
|
self._entered = True
|
|
|
|
return self
|
|
|
|
|
|
|
|
def __exit__(self, exc_type, exc_value, exc_tb):
|
|
|
|
self._running = False
|
|
|
|
|
|
|
|
# Wait for threads to finish closing so open files don't linger for
|
|
|
|
# longer than lifetime of context manager.
|
|
|
|
for t in self._threads:
|
|
|
|
t.join()
|
|
|
|
|
|
|
|
def _worker(self):
|
|
|
|
"""Main routine for worker thread."""
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
fh = self._queue.get(block=True, timeout=0.100)
|
|
|
|
# Need to catch or the thread will terminate and
|
|
|
|
# we could orphan file descriptors.
|
|
|
|
try:
|
|
|
|
fh.close()
|
|
|
|
except Exception as e:
|
|
|
|
# Stash so can re-raise from main thread later.
|
|
|
|
self._threadexception = e
|
|
|
|
except util.empty:
|
|
|
|
if not self._running:
|
|
|
|
break
|
|
|
|
|
|
|
|
def close(self, fh):
|
|
|
|
"""Schedule a file for closing."""
|
|
|
|
if not self._entered:
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
raise error.Abort(_("can only call close() when context manager " "active"))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
# If a background thread encountered an exception, raise now so we fail
|
|
|
|
# fast. Otherwise we may potentially go on for minutes until the error
|
|
|
|
# is acted on.
|
|
|
|
if self._threadexception:
|
|
|
|
e = self._threadexception
|
|
|
|
self._threadexception = None
|
|
|
|
raise e
|
|
|
|
|
|
|
|
# If we're not actively running, close synchronously.
|
|
|
|
if not self._running:
|
|
|
|
fh.close()
|
|
|
|
return
|
|
|
|
|
|
|
|
self._queue.put(fh, block=True, timeout=None)
|
|
|
|
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
class checkambigatclosing(closewrapbase):
|
|
|
|
"""Proxy for a file object, to avoid ambiguity of file stat
|
|
|
|
|
|
|
|
See also util.filestat for detail about "ambiguity of file stat".
|
|
|
|
|
|
|
|
This proxy is useful only if the target file is guarded by any
|
|
|
|
lock (e.g. repo.lock or repo.wlock)
|
|
|
|
|
|
|
|
Do not instantiate outside of the vfs layer.
|
|
|
|
"""
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
|
2017-03-01 13:00:12 +03:00
|
|
|
def __init__(self, fh):
|
|
|
|
super(checkambigatclosing, self).__init__(fh)
|
codemod: join the auto-formatter party
Summary:
Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`.
Then run `arc lint` again so some other autofixers like spellchecker etc. looked
at the code base. Manually accept the changes whenever they make sense, or use
a workaround (ex. changing "dict()" to "dict constructor") where autofix is false
positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less
interesting to fix (hgsubversion tests), or cannot be fixed without breaking
OSS build (FBPYTHON4).
Conflicted linters (test-check-module-imports.t, part of test-check-code.t,
test-check-pyflakes.t) are removed or disabled.
Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed.
An issue of the auto-formatter is lines are no longer guarnateed to be <= 80
chars. But that seems less important comparing with the benefit auto-formatter
provides.
As we're here, also remove test-check-py3-compat.t, as it is currently broken
if `PYTHON3=/bin/python3` is set.
Reviewed By: wez, phillco, simpkins, pkaush, singhsrb
Differential Revision: D8173629
fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
2018-05-26 07:34:37 +03:00
|
|
|
object.__setattr__(self, r"_oldstat", util.filestat.frompath(fh.name))
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def _checkambig(self):
|
|
|
|
oldstat = self._oldstat
|
|
|
|
if oldstat.stat:
|
2017-07-04 17:13:47 +03:00
|
|
|
_avoidambig(self._origfh.name, oldstat)
|
2017-03-01 13:00:12 +03:00
|
|
|
|
|
|
|
def __exit__(self, exc_type, exc_value, exc_tb):
|
|
|
|
self._origfh.__exit__(exc_type, exc_value, exc_tb)
|
|
|
|
self._checkambig()
|
|
|
|
|
|
|
|
def close(self):
|
|
|
|
self._origfh.close()
|
|
|
|
self._checkambig()
|
2019-09-04 21:07:35 +03:00
|
|
|
|
|
|
|
|
|
|
|
# 64 bytes for SHA256
|
|
|
|
_blobvfsre = re.compile(r"\A[a-f0-9]{64}\Z")
|
|
|
|
|
|
|
|
|
|
|
|
class blobvfs(vfs):
|
2022-02-10 01:26:09 +03:00
|
|
|
def join(self, path: "Optional[str]", *insidef: str) -> str:
|
2019-09-04 21:07:35 +03:00
|
|
|
"""split the path at first two characters, like: XX/XXXXX..."""
|
2020-02-04 02:26:15 +03:00
|
|
|
if path is None or not _blobvfsre.match(path):
|
|
|
|
raise error.ProgrammingError("unexpected blob vfs path: %r" % (path,))
|
|
|
|
if insidef:
|
|
|
|
raise error.ProgrammingError(
|
|
|
|
"unexpected blob vfs path: %r, %r" % (path, insidef)
|
|
|
|
)
|
2019-09-04 21:07:35 +03:00
|
|
|
return super(blobvfs, self).join(path[0:2], path[2:])
|
|
|
|
|
2020-02-04 08:35:13 +03:00
|
|
|
def walk(
|
|
|
|
self,
|
2022-02-10 01:26:09 +03:00
|
|
|
path: "Optional[str]" = None,
|
|
|
|
onerror: "Optional[Callable[[OSError], None]]" = None,
|
|
|
|
) -> "Iterable[Tuple[str, List[str], List[str]]]":
|
2019-09-04 21:07:35 +03:00
|
|
|
"""Yield (dirpath, [], oids) tuple for blobs under path
|
|
|
|
|
|
|
|
Oids only exist in the root of this vfs, so dirpath is always ''.
|
|
|
|
"""
|
|
|
|
root = os.path.normpath(self.base)
|
|
|
|
# when dirpath == root, dirpath[prefixlen:] becomes empty
|
|
|
|
# because len(dirpath) < prefixlen.
|
|
|
|
prefixlen = len(pathutil.normasprefix(root))
|
|
|
|
oids = []
|
|
|
|
|
|
|
|
for dirpath, dirs, files in os.walk(
|
|
|
|
self.reljoin(self.base, path or ""), onerror=onerror
|
|
|
|
):
|
|
|
|
dirpath = dirpath[prefixlen:]
|
|
|
|
|
|
|
|
# Silently skip unexpected files and directories
|
|
|
|
if len(dirpath) == 2:
|
|
|
|
oids.extend(
|
|
|
|
[dirpath + f for f in files if _blobvfsre.match(dirpath + f)]
|
|
|
|
)
|
|
|
|
|
|
|
|
yield ("", [], oids)
|
|
|
|
|
|
|
|
def linktovfs(self, oid, vfs):
|
|
|
|
"""Hardlink a file to another blob vfs"""
|
|
|
|
src = self.join(oid)
|
|
|
|
dst = vfs.join(oid)
|
|
|
|
util.makedirs(os.path.dirname(dst))
|
|
|
|
util.copyfile(src, dst, hardlink=True)
|