Thanks to visit codestin.com
Credit goes to github.com

Skip to content

add git command options #154

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 3 commits into from
Apr 25, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 33 additions & 5 deletions git/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ class Git(LazyMixin):
of the command to stdout.
Set its value to 'full' to see details about the returned values.
"""
__slots__ = ("_working_dir", "cat_file_all", "cat_file_header", "_version_info")
__slots__ = ("_working_dir", "cat_file_all", "cat_file_header", "_version_info",
"_git_options")

# CONFIGURATION
# The size in bytes read from stdout when copying git's output to another stream
Expand Down Expand Up @@ -217,7 +218,8 @@ def __init__(self, working_dir=None):
.git directory in case of bare repositories."""
super(Git, self).__init__()
self._working_dir = working_dir

self._git_options = ()

# cached command slots
self.cat_file_header = None
self.cat_file_all = None
Expand Down Expand Up @@ -386,15 +388,18 @@ def execute(self, command,
else:
return stdout_value

def transform_kwargs(self, **kwargs):
def transform_kwargs(self, split_single_char_options=False, **kwargs):
"""Transforms Python style kwargs into git command line options."""
args = list()
for k, v in kwargs.items():
if len(k) == 1:
if v is True:
args.append("-%s" % k)
elif type(v) is not bool:
args.append("-%s%s" % (k, v))
if split_single_char_options:
args.extend(["-%s" % k, "%s" % v])
else:
args.append("-%s%s" % (k, v))
else:
if v is True:
args.append("--%s" % dashify(k))
Expand All @@ -417,6 +422,22 @@ def __unpack_args(cls, arg_list):
# END for each arg
return outlist

def __call__(self, **kwargs):
"""Specify command line options to the git executable
for a subcommand call

:param kwargs:
is a dict of keyword arguments.
these arguments are passed as in _call_process
but will be passed to the git command rather than
the subcommand.

``Examples``::
git(work_tree='/tmp').difftool()"""
self._git_options = self.transform_kwargs(
split_single_char_options=True, **kwargs)
return self

def _call_process(self, method, *args, **kwargs):
"""Run the given git command with the specified arguments and return
the result as a String
Expand Down Expand Up @@ -455,7 +476,14 @@ def _call_process(self, method, *args, **kwargs):
args = opt_args + ext_args

def make_call():
call = [self.GIT_PYTHON_GIT_EXECUTABLE, dashify(method)]
call = [self.GIT_PYTHON_GIT_EXECUTABLE]

# add the git options, the reset to empty
# to avoid side_effects
call.extend(self._git_options)
self._git_options = ()

call.extend([dashify(method)])
call.extend(args)
return call
#END utility to recreate call after changes
Expand Down
14 changes: 14 additions & 0 deletions git/test/test_git.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,17 @@ def test_cmd_override(self):
finally:
type(self.git).GIT_PYTHON_GIT_EXECUTABLE = prev_cmd
#END undo adjustment

def test_options_are_passed_to_git(self):
# This work because any command after git --version is ignored
git_version = self.git(version=True).NoOp()
git_command_version = self.git.version()
self.assertEquals(git_version, git_command_version)

def test_single_char_git_options_are_passed_to_git(self):
input_value='TestValue'
output_value = self.git(c='user.name={}'.format(input_value)).config('--get', 'user.name')
self.assertEquals(input_value, output_value)

def test_change_to_transform_kwargs_does_not_break_command_options(self):
self.git.log(n=1)