From 7f85da1b9dedf8224574fb1264c2b182c36290be Mon Sep 17 00:00:00 2001 From: Chris Kuehl Date: Tue, 15 May 2018 20:59:18 -0700 Subject: [PATCH] Add Rust support --- pre_commit/languages/all.py | 2 ++ pre_commit/languages/rust.py | 68 ++++++++++++++++++++++++++++++++++++ setup.py | 1 + 3 files changed, 71 insertions(+) create mode 100644 pre_commit/languages/rust.py diff --git a/pre_commit/languages/all.py b/pre_commit/languages/all.py index 504c28a0..be74ffd3 100644 --- a/pre_commit/languages/all.py +++ b/pre_commit/languages/all.py @@ -9,6 +9,7 @@ from pre_commit.languages import pygrep from pre_commit.languages import python from pre_commit.languages import python_venv from pre_commit.languages import ruby +from pre_commit.languages import rust from pre_commit.languages import script from pre_commit.languages import swift from pre_commit.languages import system @@ -60,6 +61,7 @@ languages = { 'python': python, 'python_venv': python_venv, 'ruby': ruby, + 'rust': rust, 'script': script, 'swift': swift, 'system': system, diff --git a/pre_commit/languages/rust.py b/pre_commit/languages/rust.py new file mode 100644 index 00000000..e6884c34 --- /dev/null +++ b/pre_commit/languages/rust.py @@ -0,0 +1,68 @@ +from __future__ import unicode_literals + +import contextlib +import os.path + +import toml + +from pre_commit.envcontext import envcontext +from pre_commit.envcontext import Var +from pre_commit.languages import helpers +from pre_commit.util import clean_path_on_failure +from pre_commit.util import cmd_output +from pre_commit.xargs import xargs + + +ENVIRONMENT_DIR = 'rustenv' +get_default_version = helpers.basic_get_default_version +healthy = helpers.basic_healthy + + +def get_env_patch(target_dir): + return ( + ( + 'PATH', + (os.path.join(target_dir, 'release'), os.pathsep, Var('PATH')), + ), + ) + + +@contextlib.contextmanager +def in_env(prefix): + target_dir = prefix.path( + helpers.environment_dir(ENVIRONMENT_DIR, 'default'), + ) + with envcontext(get_env_patch(target_dir)): + yield + + +def _add_dependencies(cargo_toml_path, additional_dependencies): + with open(cargo_toml_path, 'r+') as f: + cargo_toml = toml.load(f) + for dep in additional_dependencies: + name, _, spec = dep.partition(':') + cargo_toml['dependencies'][name] = spec or '*' + f.seek(0) + toml.dump(cargo_toml, f) + f.truncate() + + +def install_environment(prefix, version, additional_dependencies): + helpers.assert_version_default('rust', version) + directory = prefix.path( + helpers.environment_dir(ENVIRONMENT_DIR, 'default'), + ) + + if len(additional_dependencies) > 0: + _add_dependencies(prefix.path('Cargo.toml'), additional_dependencies) + + with clean_path_on_failure(directory): + cmd_output( + 'cargo', 'build', '--release', '--bins', '--target-dir', directory, + cwd=prefix.prefix_dir, + ) + + +def run_hook(prefix, hook, file_args): + with in_env(prefix): + return xargs(helpers.to_cmd(hook), file_args) diff --git a/setup.py b/setup.py index c4504774..831dc000 100644 --- a/setup.py +++ b/setup.py @@ -42,6 +42,7 @@ setup( 'nodeenv>=0.11.1', 'pyyaml', 'six', + 'toml', 'virtualenv', ], entry_points={