From 1427fdb455ad326b095273825621a6727850274e Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 10 Jul 2020 13:40:55 -0700 Subject: [PATCH] misc: Remove support for checking out as a mercurial repo. This will still be technically possible with the right converters, but this removes the tags, ignore file, and style checking hooks related to mercurial. We no longer maintain a mercurial mirror of the main git repository, and this support adds clutter and could diverge from the git style hooks, etc, over time. Change-Id: Icf4833c4f0fda51ea98989d1d741432ae3ddc6dd Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/31174 Reviewed-by: Jason Lowe-Power Reviewed-by: Andreas Sandberg Maintainer: Gabe Black Maintainer: Andreas Sandberg Tested-by: kokoro --- .hgignore | 17 --- .hgtags | 30 ---- site_scons/site_tools/default.py | 1 - site_scons/site_tools/mercurial.py | 147 ------------------- util/hgfilesize.py | 34 ----- util/hgstyle.py | 219 ----------------------------- util/style.py | 1 - util/style/file_types.py | 2 +- util/style/repo.py | 45 ------ util/style/style.py | 12 -- 10 files changed, 1 insertion(+), 507 deletions(-) delete mode 100644 .hgignore delete mode 100644 .hgtags delete mode 100644 site_scons/site_tools/mercurial.py delete mode 100644 util/hgfilesize.py delete mode 100755 util/hgstyle.py diff --git a/.hgignore b/.hgignore deleted file mode 100644 index 03dead633..000000000 --- a/.hgignore +++ /dev/null @@ -1,17 +0,0 @@ -syntax: glob -build -parser.out -parsetab.py -cscope.files -cscope.out -*.pyc -*~ -.*.swp -m5out -src/doxygen -ext/dramsim2/DRAMSim2 -ext/mcpat/regression/*/*.out -util/m5/*.o -util/m5/*.a -util/m5/m5 -system/arm/dt/*.dtb diff --git a/.hgtags b/.hgtags deleted file mode 100644 index 124eac935..000000000 --- a/.hgtags +++ /dev/null @@ -1,30 +0,0 @@ -6b99127531fd692ff0f202e327d0826ed2bfcf5f m5_1.0_beta1 -1a40e60270c11ec24f11c783e70367e2740cdc56 m5_1.0_beta1 -069849384988e553b6edae71ecaf1fb6e918d738 m5_1.0_beta2 -4cfa92eca35d532b339507f1c631e1986d87b258 m5_1.0_tutorial -ffe1942d845c67fb3fd04692420c9433638eba13 m5_1.0_web -af8bf5e4e85ba1a773183cc3f6c43bcdf0ce146a m5_1.1 -1c0eeb0dae9b6a2a5479faf3ab52fb1ed0ce703f m5_1.1 -c486924ed90eb6805e8cf44ddee5ad5435c79051 m5_1.1 -01e679b66ca9474f10f8f96d391693adf76fc73a m5_1.1 -2608cd7def85c9fdc84251295c8023fab990d530 m5_1.1 -cdd48642d9bf584bd445b40abec9e7f934a5900b m5_1.1 -8d690c7c2efced99f7991b7ace56d769bae7cfdd m5_2.0_beta1 -d83885ad2b41777c97b94882aa8f07e761e55ac1 m5_2.0_beta1_patch1 -1906dcace7c27b2153bfb95ca1218660e1cc1f70 m5_2.0_beta2 -b174ae14f007ba0c341f8df77d36f57f48369cc8 m5_2.0_beta2 -91a9ac67662aa3a79315ade29b17a85961fecd88 m5_2.0_beta3 -dce5a8655829b7d2e24ce40cafc9c8873a71671f m5_2.0_beta5 -1ac44b6c87ec71a8410c9a9c219269eca71f8077 m5_2.0_beta4 -60a931b03fb165807f02bcccc4f7d0fd705a67a9 copyright_update -d8b246a665c160a31751b4091f097022cde16dd7 m5_2.0_beta6 -5de565c4b7bdf46670611858b709c1eb50ad7c5c Calvin_Submission -549b72de8f725bd411a9c73ee0d15ccbdf47bb0f stable_2012_02_02 -f75ee4849c404a0c7d93413f443cec640b721f2f stable_2012_06_28 -07352f119e489452b3c0bbf6d4f70e21e80e17e3 stable_2013_06_16 -6a043adb1e8d67fbb03ac5cee58dd26f75663714 stable_2013_10_14 -459491344fcf7f9e29250e71f33a7c7150f54d64 stable_2014_02_15 -cb2e6950956d475da97b04c41f19769ce2e8541a stable_2014_08_26 -bdb307e8be54a5808a9af2537e9261d88de6ed1b stable_2014_12_14 -e1794974515011f81f8d0fda7543ba3360a12c9b stable_2015_04_15 -60eb3fef9c2d51cf98cdb5501ee0c4ac0efe6eae stable_2015_09_03 diff --git a/site_scons/site_tools/default.py b/site_scons/site_tools/default.py index 08736f01a..8e8e86366 100644 --- a/site_scons/site_tools/default.py +++ b/site_scons/site_tools/default.py @@ -80,7 +80,6 @@ def common_config(env): gem5_tool_list = [ 'git', - 'mercurial', ] def generate(env): diff --git a/site_scons/site_tools/mercurial.py b/site_scons/site_tools/mercurial.py deleted file mode 100644 index 3c91b3834..000000000 --- a/site_scons/site_tools/mercurial.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (c) 2013, 2015-2017 ARM Limited -# All rights reserved. -# -# The license below extends only to copyright in the software and shall -# not be construed as granting a license to any other intellectual -# property including but not limited to intellectual property relating -# to a hardware implementation of the functionality of the software -# licensed hereunder. You may use the software subject to the license -# terms below provided that you ensure that this notice is replicated -# unmodified and in its entirety in all distributions of the software, -# modified or unmodified, in source code or in binary form. -# -# Copyright (c) 2011 Advanced Micro Devices, Inc. -# Copyright (c) 2009 The Hewlett-Packard Development Company -# Copyright (c) 2004-2005 The Regents of The University of Michigan -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -from __future__ import print_function -import re -import sys - -import gem5_scons.util - -mercurial_style_message = """ -You're missing the gem5 style hook, which automatically checks your code -against the gem5 style rules on hg commit and qrefresh commands. -This script will now install the hook in your .hg/hgrc file. -Press enter to continue, or ctrl-c to abort: """ - -mercurial_style_upgrade_message = """ -Your Mercurial style hooks are not up-to-date. This script will now -try to automatically update them. A backup of your hgrc will be saved -in .hg/hgrc.old. -Press enter to continue, or ctrl-c to abort: """ - -mercurial_style_hook_template = """ -# The following lines were automatically added by gem5/SConstruct -# to provide the gem5 style-checking hooks -[extensions] -hgstyle = %s/util/hgstyle.py - -[hooks] -pretxncommit.style = python:hgstyle.check_style -pre-qrefresh.style = python:hgstyle.check_style -# End of SConstruct additions - -""" - -mercurial_lib_not_found = """ -Mercurial libraries cannot be found, ignoring style hook. If -you are a gem5 developer, please fix this and run the style -hook. It is important. -""" - -def install_style_hooks(env): - hgdir = env.Dir('#.hg') - - style_hook = True - style_hooks = tuple() - hgrc = hgdir.File('hgrc') - hgrc_old = hgdir.File('hgrc.old') - try: - from mercurial import ui - ui = ui.ui() - ui.readconfig(hgrc.abspath) - style_hooks = (ui.config('hooks', 'pretxncommit.style', None), - ui.config('hooks', 'pre-qrefresh.style', None)) - style_hook = all(style_hooks) - style_extension = ui.config('extensions', 'style', None) - except ImportError: - print(mercurial_lib_not_found) - - if "python:style.check_style" in style_hooks: - # Try to upgrade the style hooks - print(mercurial_style_upgrade_message) - # continue unless user does ctrl-c/ctrl-d etc. - try: - raw_input() - except: - print("Input exception, exiting scons.\n") - sys.exit(1) - shutil.copyfile(hgrc.abspath, hgrc_old.abspath) - re_style_hook = re.compile(r"^([^=#]+)\.style\s*=\s*([^#\s]+).*") - re_style_extension = re.compile("style\s*=\s*([^#\s]+).*") - old, new = open(hgrc_old.abspath, 'r'), open(hgrc.abspath, 'w') - for l in old: - m_hook = re_style_hook.match(l) - m_ext = re_style_extension.match(l) - if m_hook: - hook, check = m_hook.groups() - if check != "python:style.check_style": - print("Warning: %s.style is using a non-default " \ - "checker: %s" % (hook, check)) - if hook not in ("pretxncommit", "pre-qrefresh"): - print("Warning: Updating unknown style hook: %s" % hook) - - l = "%s.style = python:hgstyle.check_style\n" % hook - elif m_ext and m_ext.group(1) == style_extension: - l = "hgstyle = %s/util/hgstyle.py\n" % env.root.abspath - - new.write(l) - elif not style_hook: - print(mercurial_style_message, end=' ') - # continue unless user does ctrl-c/ctrl-d etc. - try: - raw_input() - except: - print("Input exception, exiting scons.\n") - sys.exit(1) - hgrc_path = '%s/.hg/hgrc' % env.root.abspath - print("Adding style hook to", hgrc_path, "\n") - try: - with open(hgrc_path, 'a') as f: - f.write(mercurial_style_hook_template % env.root.abspath) - except: - print("Error updating", hgrc_path) - sys.exit(1) - -def generate(env): - if exists(env) and not gem5_scons.util.ignore_style(): - install_style_hooks(env) - -def exists(env): - return env.Dir('#.hg').exists() diff --git a/util/hgfilesize.py b/util/hgfilesize.py deleted file mode 100644 index 8016582d3..000000000 --- a/util/hgfilesize.py +++ /dev/null @@ -1,34 +0,0 @@ -from mercurial import context -from mercurial.i18n import _ - -''' -[extensions] -hgfilesize=~/m5/incoming/util/hgfilesize.py - -[hooks] -pretxncommit = python:hgfilesize.limit_file_size -pretxnchangegroup = python:hgfilesize.limit_file_size - -[limit_file_size] -maximum_file_size = 200000 -''' - -def limit_file_size(ui, repo, node=None, **kwargs): - '''forbid files over a given size''' - - # default limit is 1 MB - limit = int(ui.config('limit_file_size', 'maximum_file_size', 1024*1024)) - existing_tip = context.changectx(repo, node).rev() - new_tip = context.changectx(repo, 'tip').rev() - for rev in xrange(existing_tip, new_tip + 1): - ctx = context.changectx(repo, rev) - for f in ctx.files(): - if f not in ctx: - continue - fctx = ctx.filectx(f) - if fctx.size() > limit: - ui.write(_('file %s of %s is too large: %d > %d\n') % \ - (f, ctx, fctx.size(), limit)) - return True # This is invalid - - return False # Things are OK. diff --git a/util/hgstyle.py b/util/hgstyle.py deleted file mode 100755 index 3b7168f9d..000000000 --- a/util/hgstyle.py +++ /dev/null @@ -1,219 +0,0 @@ -#! /usr/bin/env python2.7 -# Copyright (c) 2014 ARM Limited -# All rights reserved -# -# The license below extends only to copyright in the software and shall -# not be construed as granting a license to any other intellectual -# property including but not limited to intellectual property relating -# to a hardware implementation of the functionality of the software -# licensed hereunder. You may use the software subject to the license -# terms below provided that you ensure that this notice is replicated -# unmodified and in its entirety in all distributions of the software, -# modified or unmodified, in source code or in binary form. -# -# Copyright (c) 2006 The Regents of The University of Michigan -# Copyright (c) 2007,2011 The Hewlett-Packard Development Company -# Copyright (c) 2016 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import sys -import os -from os.path import join as joinpath - -current_dir = os.path.dirname(__file__) -sys.path.insert(0, current_dir) - -from style.verifiers import all_verifiers -from style.style import MercurialUI, check_ignores -from style.region import * - -from mercurial import bdiff, mdiff, commands - -def modified_regions(old_data, new_data): - regions = Regions() - beg = None - for pbeg, pend, fbeg, fend in bdiff.blocks(old_data, new_data): - if beg is not None and beg != fbeg: - regions.append(beg, fbeg) - beg = fend - return regions - -def modregions(wctx, fname): - fctx = wctx.filectx(fname) - pctx = fctx.parents() - - file_data = fctx.data() - lines = mdiff.splitnewlines(file_data) - if len(pctx) in (1, 2): - mod_regions = modified_regions(pctx[0].data(), file_data) - if len(pctx) == 2: - m2 = modified_regions(pctx[1].data(), file_data) - # only the lines that are new in both - mod_regions &= m2 - else: - mod_regions = Regions() - mod_regions.append(0, len(lines)) - - return mod_regions - - -def _modified_regions(repo, patterns, **kwargs): - opt_all = kwargs.get('all', False) - opt_no_ignore = kwargs.get('no_ignore', False) - - # Import the match (repository file name matching helper) - # function. Different versions of Mercurial keep it in different - # modules and implement them differently. - try: - from mercurial import scmutil - m = scmutil.match(repo[None], patterns, kwargs) - except ImportError: - from mercurial import cmdutil - m = cmdutil.match(repo, patterns, kwargs) - - modified, added, removed, deleted, unknown, ignore, clean = \ - repo.status(match=m, clean=opt_all) - - if not opt_all: - try: - wctx = repo.workingctx() - except: - from mercurial import context - wctx = context.workingctx(repo) - - files = [ (fn, all_regions) for fn in added ] + \ - [ (fn, modregions(wctx, fn)) for fn in modified ] - else: - files = [ (fn, all_regions) for fn in added + modified + clean ] - - for fname, mod_regions in files: - if opt_no_ignore or not check_ignores(fname): - yield fname, mod_regions - - -def do_check_style(hgui, repo, *pats, **opts): - """check files for proper m5 style guidelines - - Without an argument, checks all modified and added files for gem5 - coding style violations. A list of files can be specified to limit - the checker to a subset of the repository. The style rules are - normally applied on a diff of the repository state (i.e., added - files are checked in their entirety while only modifications of - modified files are checked). - - The --all option can be specified to include clean files and check - modified files in their entirety. - - The --fix-, --ignore-, and --skip- options - can be used to control individual style checks: - - --fix- will perform the check and automatically attempt to - fix sny style error (printing a warning if unsuccessful) - - --ignore- will perform the check but ignore any errors - found (other than printing a message for each) - - --skip- will skip performing the check entirely - - If none of these options are given, all checks will be performed - and the user will be prompted on how to handle each error. - - --fix-all, --ignore-all, and --skip-all are equivalent to specifying - --fix-, --ignore-, or --skip- for all checks, - respectively. However, option settings for specific checks take - precedence. Thus --skip-all --fix-white can be used to skip every - check other than whitespace errors, which will be checked and - automatically fixed. - - The -v/--verbose flag will display the offending line(s) as well - as their location. - """ - - ui = MercurialUI(hgui, verbose=hgui.verbose) - - # instantiate varifier objects - verifiers = [v(ui, opts, base=repo.root) for v in all_verifiers] - - for fname, mod_regions in _modified_regions(repo, pats, **opts): - for verifier in verifiers: - if verifier.apply(joinpath(repo.root, fname), mod_regions): - return True - - return False - -def check_hook(hooktype): - if hooktype not in ('pretxncommit', 'pre-qrefresh'): - raise AttributeError, \ - "This hook is not meant for %s" % hooktype - -# This function provides a hook that is called before transaction -# commit and on qrefresh -def check_style(ui, repo, hooktype, **kwargs): - check_hook(hooktype) - args = {} - - try: - return do_check_style(ui, repo, **args) - except Exception, e: - import traceback - traceback.print_exc() - return True - -try: - from mercurial.i18n import _ -except ImportError: - def _(arg): - return arg - -_common_region_options = [ - ('a', 'all', False, - _("include clean files and unmodified parts of modified files")), - ('', 'no-ignore', False, _("ignore the style ignore list")), - ] - - -fix_opts = [('f', 'fix-all', False, _("fix all style errors"))] + \ - [('', 'fix-' + v.opt_name, False, - _('fix errors in ' + v.test_name)) for v in all_verifiers] -ignore_opts = [('', 'ignore-all', False, _("ignore all style errors"))] + \ - [('', 'ignore-' + v.opt_name, False, - _('ignore errors in ' + v.test_name)) for v in all_verifiers] -skip_opts = [('', 'skip-all', False, _("skip all style error checks"))] + \ - [('', 'skip-' + v.opt_name, False, - _('skip checking for ' + v.test_name)) for v in all_verifiers] -all_opts = fix_opts + ignore_opts + skip_opts - - -cmdtable = { - '^m5style' : ( - do_check_style, all_opts + _common_region_options + commands.walkopts, - _('hg m5style [-a] [FILE]...')), -} - -if __name__ == '__main__': - print >> sys.stderr, "This file cannot be used from the command line. Use" - print >> sys.stderr, "style.py instead." - sys.exit(1) diff --git a/util/style.py b/util/style.py index 476219a49..8af8c2b06 100755 --- a/util/style.py +++ b/util/style.py @@ -84,7 +84,6 @@ repo_types = { "auto" : detect_repo, "none" : lambda : None, "git" : repo.GitRepo, - "hg" : repo.MercurialRepo, } if __name__ == '__main__': diff --git a/util/style/file_types.py b/util/style/file_types.py index 40d0c6f28..38de6f0bc 100644 --- a/util/style/file_types.py +++ b/util/style/file_types.py @@ -118,7 +118,7 @@ def lang_type(filename, firstline=None, openok=True): return None # directories and files to ignore by default -default_dir_ignore = frozenset(('.hg', '.svn', 'build', 'ext')) +default_dir_ignore = frozenset(('build', 'ext')) default_file_ignore = frozenset(('parsetab.py', )) def find_files(base, languages=all_languages, diff --git a/util/style/repo.py b/util/style/repo.py index a0eee98fa..f66c16b68 100644 --- a/util/style/repo.py +++ b/util/style/repo.py @@ -202,50 +202,6 @@ class GitRepo(AbstractRepo): [ self.git, "show", "%s:%s" % (self.head_revision(), name) ]) \ .decode() -class MercurialRepo(AbstractRepo): - def __init__(self): - self.hg = "hg" - self._repo_base = None - - def repo_base(self): - if self._repo_base is None: - self._repo_base = subprocess.check_output( - [ self.hg, "root" ]).decode().rstrip("\n") - - return self._repo_base - - def staged_files(self): - added = [] - modified = [] - for action, fname in self.status(): - if action == "M": - modified.append(fname) - elif action == "A": - added.append(fname) - - return added, modified - - def staged_regions(self, fname, context=0): - return self.modified_regions(fname, context=context) - - def modified_regions(self, fname, context=0): - old = self.file_from_tip(fname).split("\n") - new = self.get_file(fname).split("\n") - - return modified_regions(old, new, context=context) - - def status(self, filter=None): - files = subprocess.check_output([ self.hg, "status" ]) \ - .decode().rstrip("\n") - if files: - return [ f.split(" ") for f in files.split("\n") ] - else: - return [] - - def file_from_tip(self, name): - return subprocess.check_output([ self.hg, "cat", name ]) \ - .decode() - def detect_repo(path="."): """Auto-detect the revision control system used for a source code directory. The code starts searching for repository meta data @@ -259,7 +215,6 @@ def detect_repo(path="."): _repo_types = ( (".git", GitRepo), - (".hg", MercurialRepo), ) repo_types = [] diff --git a/util/style/style.py b/util/style/style.py index c505dafea..a8a86f786 100644 --- a/util/style/style.py +++ b/util/style/style.py @@ -79,18 +79,6 @@ class StdioUI(UserInterface): def write(self, string): sys.stdout.write(string) -class MercurialUI(UserInterface): - def __init__(self, ui, *args, **kwargs): - super(MercurialUI, self).__init__(*args, **kwargs) - self.hg_ui = ui - - def _prompt(self, prompt, results, default): - return self.hg_ui.prompt(prompt, default=default) - - def write(self, string): - self.hg_ui.write(string) - - def _re_ignore(expr): """Helper function to create regular expression ignore file matcher functions""" -- 2.30.2