Skip to content

Implemented Per-Call Environment Variables #645

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Sep 28, 2017
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Contributors are:
-Timothy B. Hartman <tbhartman _at_ gmail.com>
-Konstantin Popov <konstantin.popov.89 _at_ yandex.ru>
-Peter Jones <pjones _at_ redhat.com>
-Anson Mansfield <anson.mansfield _at_ gmail.com>
-Ken Odegard <ken.odegard _at_ gmail.com>
-Alexis Horgix Chotard

Expand Down
9 changes: 8 additions & 1 deletion git/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
execute_kwargs = set(('istream', 'with_extended_output',
'with_exceptions', 'as_process', 'stdout_as_string',
'output_stream', 'with_stdout', 'kill_after_timeout',
'universal_newlines', 'shell'))
'universal_newlines', 'shell', 'env'))

log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())
Expand Down Expand Up @@ -597,6 +597,7 @@ def execute(self, command,
with_stdout=True,
universal_newlines=False,
shell=None,
env=None,
**subprocess_kwargs
):
"""Handles executing the command on the shell and consumes and returns
Expand Down Expand Up @@ -640,6 +641,9 @@ def execute(self, command,
decoded into a string using the default encoding (usually utf-8).
The latter can fail, if the output contains binary data.

:param env:
A dictionary of environment variables to be passed to `subprocess.Popen`.

:param subprocess_kwargs:
Keyword arguments to be passed to subprocess.Popen. Please note that
some of the valid kwargs are already set by this method, the ones you
Expand Down Expand Up @@ -685,6 +689,7 @@ def execute(self, command,
cwd = self._working_dir or os.getcwd()

# Start the process
inline_env = env
env = os.environ.copy()
# Attempt to force all output to plain ascii english, which is what some parsing code
# may expect.
Expand All @@ -693,6 +698,8 @@ def execute(self, command,
env["LANGUAGE"] = "C"
env["LC_ALL"] = "C"
env.update(self._environment)
if inline_env is not None:
env.update(inline_env)

if is_win:
cmd_not_found_exception = OSError
Expand Down
Empty file added git/test/fixtures/ls_tree_empty
Empty file.
15 changes: 15 additions & 0 deletions git/test/test_git.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,21 @@ def test_it_ignores_false_kwargs(self, git):
self.git.version(pass_this_kwarg=False)
assert_true("pass_this_kwarg" not in git.call_args[1])

def test_it_accepts_environment_variables(self):
filename = fixture_path("ls_tree_empty")
with open(filename, 'r') as fh:
tree = self.git.mktree(istream=fh)
env = {
'GIT_AUTHOR_NAME': 'Author Name',
'GIT_AUTHOR_EMAIL': 'author@example.com',
'GIT_AUTHOR_DATE': '1400000000+0000',
'GIT_COMMITTER_NAME': 'Committer Name',
'GIT_COMMITTER_EMAIL': 'committer@example.com',
'GIT_COMMITTER_DATE': '1500000000+0000',
}
commit = self.git.commit_tree(tree, m='message', env=env)
assert_equal(commit, '4cfd6b0314682d5a58f80be39850bad1640e9241')

def test_persistent_cat_file_command(self):
# read header only
import subprocess as sp
Expand Down