mirror of
https://github.com/facebook/sapling.git
synced 2025-01-08 14:46:47 +03:00
584656dff3
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
160 lines
5.3 KiB
Python
160 lines
5.3 KiB
Python
# Copyright (C) 2006 - Marco Barisione <marco@barisione.org>
|
|
#
|
|
# This is a small extension for Mercurial (https://mercurial-scm.org/)
|
|
# that removes files not known to mercurial
|
|
#
|
|
# This program was inspired by the "cvspurge" script contained in CVS
|
|
# utilities (http://www.red-bean.com/cvsutils/).
|
|
#
|
|
# For help on the usage of "hg purge" use:
|
|
# hg help purge
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
"""command to delete untracked files from the working directory"""
|
|
from __future__ import absolute_import
|
|
|
|
import os
|
|
|
|
from mercurial import cmdutil, error, registrar, scmutil, util
|
|
from mercurial.i18n import _
|
|
|
|
|
|
cmdtable = {}
|
|
command = registrar.command(cmdtable)
|
|
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
|
|
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
|
|
# be specifying the version(s) of Mercurial they are tested with, or
|
|
# leave the attribute unspecified.
|
|
testedwith = "ships-with-hg-core"
|
|
|
|
|
|
def findthingstopurge(repo, match, findfiles, finddirs, includeignored):
|
|
"""Find files and/or directories that should be purged.
|
|
|
|
Returns a pair (files, dirs), where files is an iterable of files to
|
|
remove, and dirs is an iterable of directories to remove.
|
|
"""
|
|
if finddirs:
|
|
directories = []
|
|
match.explicitdir = match.traversedir = directories.append
|
|
|
|
status = repo.status(match=match, ignored=includeignored, unknown=True)
|
|
|
|
if findfiles:
|
|
files = sorted(status.unknown + status.ignored)
|
|
else:
|
|
files = []
|
|
|
|
if finddirs:
|
|
# Use a generator expression to lazily test for directory contents,
|
|
# otherwise nested directories that are being removed would be counted
|
|
# when in reality they'd be removed already by the time the parent
|
|
# directory is to be removed.
|
|
dirs = (
|
|
f
|
|
for f in sorted(directories, reverse=True)
|
|
if (match(f) and not os.listdir(repo.wjoin(f)))
|
|
)
|
|
else:
|
|
dirs = []
|
|
|
|
return files, dirs
|
|
|
|
|
|
@command(
|
|
"purge|clean",
|
|
[
|
|
("a", "abort-on-err", None, _("abort if an error occurs")),
|
|
("", "all", None, _("purge ignored files too")),
|
|
("", "dirs", None, _("purge empty directories")),
|
|
("", "files", None, _("purge files")),
|
|
("p", "print", None, _("print filenames instead of deleting them")),
|
|
(
|
|
"0",
|
|
"print0",
|
|
None,
|
|
_("end filenames with NUL, for use with xargs" " (implies -p/--print)"),
|
|
),
|
|
]
|
|
+ cmdutil.walkopts,
|
|
_("hg purge [OPTION]... [DIR]..."),
|
|
)
|
|
def purge(ui, repo, *dirs, **opts):
|
|
"""removes files not tracked by Mercurial
|
|
|
|
Delete files not known to Mercurial. This is useful to test local
|
|
and uncommitted changes in an otherwise-clean source tree.
|
|
|
|
This means that purge will delete the following by default:
|
|
|
|
- Unknown files: files marked with "?" by :hg:`status`
|
|
- Empty directories: in fact Mercurial ignores directories unless
|
|
they contain files under source control management
|
|
|
|
But it will leave untouched:
|
|
|
|
- Modified and unmodified tracked files
|
|
- Ignored files (unless --all is specified)
|
|
- New files added to the repository (with :hg:`add`)
|
|
|
|
The --files and --dirs options can be used to direct purge to delete
|
|
only files, only directories, or both. If neither option is given,
|
|
both will be deleted.
|
|
|
|
If directories are given on the command line, only files in these
|
|
directories are considered.
|
|
|
|
Be careful with purge, as you could irreversibly delete some files
|
|
you forgot to add to the repository. If you only want to print the
|
|
list of files that this program would delete, use the --print
|
|
option.
|
|
"""
|
|
act = not opts.get("print")
|
|
eol = "\n"
|
|
if opts.get("print0"):
|
|
eol = "\0"
|
|
act = False # --print0 implies --print
|
|
removefiles = opts.get("files")
|
|
removedirs = opts.get("dirs")
|
|
removeignored = opts.get("all")
|
|
if not removefiles and not removedirs:
|
|
removefiles = True
|
|
removedirs = True
|
|
|
|
def remove(remove_func, name):
|
|
if act:
|
|
try:
|
|
remove_func(repo.wjoin(name))
|
|
except OSError:
|
|
m = _("%s cannot be removed") % name
|
|
if opts.get("abort_on_err"):
|
|
raise error.Abort(m)
|
|
ui.warn(_("warning: %s\n") % m)
|
|
else:
|
|
ui.write("%s%s" % (name, eol))
|
|
|
|
match = scmutil.match(repo[None], dirs, opts)
|
|
files, dirs = findthingstopurge(repo, match, removefiles, removedirs, removeignored)
|
|
|
|
for f in files:
|
|
if act:
|
|
ui.note(_("removing file %s\n") % f)
|
|
remove(util.unlink, f)
|
|
|
|
for f in dirs:
|
|
if act:
|
|
ui.note(_("removing directory %s\n") % f)
|
|
remove(os.rmdir, f)
|