sapling/hgext/ownercheck.py
Jun Wu 584656dff3 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-25 22:17:29 -07:00

73 lines
1.9 KiB
Python

# ownercheck.py - prevent operations on repos not owned
#
# Copyright 2016 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""prevent operations on repos not owned by the current user
This extension checks the ownership of the local repo path (or its parent if
the path does not exist) and aborts if it does not match the current user.
This prevents some common mistakes like using sudo to clone a repo.
"""
import os
from mercurial import error, extensions, localrepo
from mercurial.i18n import _
try:
import pwd
except ImportError:
pwd = None
def _getowner(path):
"""find uid of a path or its parents. return (uid, path)"""
path = os.path.abspath(path or "")
while True:
try:
stat = os.stat(path)
return stat.st_uid, path
except Exception:
parent = os.path.dirname(path)
if parent == path:
break
path = parent
return None, None
def _describeuser(uid):
"""convert uid to username if possible"""
if pwd:
try:
return pwd.getpwuid(uid).pw_name
except Exception:
pass
return "user %d" % uid
def _checkownedpath(path):
ownerid, path = _getowner(path)
uid = os.getuid()
# allow access to public places owned by root (ex. /tmp)
if ownerid in [None, 0, uid]:
return
raise error.Abort(
_("%s is owned by %s, not you (%s).\n" "you are likely doing something wrong.")
% (path, _describeuser(ownerid), _describeuser(uid)),
hint=_("you can skip the check using " "--config extensions.ownercheck=!"),
)
def _localrepoinit(orig, self, baseui, path=None, create=False):
_checkownedpath(path)
return orig(self, baseui, path, create)
def uisetup(ui):
extensions.wrapfunction(localrepo.localrepository, "__init__", _localrepoinit)