Skip to content

Commit

Permalink
Fix order of operators before executing the git command
Browse files Browse the repository at this point in the history
Since Python 3.3, the hash value of an object is seeded randomly, making it
change between each call. As a consequence, the `dict` type relying on the hash
value for the order of the items upon iterating on it, and the parameters
passed to `git` being passed as `kwargs` to the `execute()` method, the order
of parameters will change randomly between calls.

For example, when you call `git.remote.pull()` in a code, two consecutives run
will generate:

1. git pull --progress -v origin master
2. git pull -v --progress origin master

Within the `transform_kwargs()` method, I'm promoting `kwargs` into an
`collections.OrderedDict` being built with `kwargs` sorted on the keys.
Then it will ensure that each subsequent calls will execute the
parameters in the same order.
  • Loading branch information
guyzmo committed May 12, 2016
1 parent fb577c8 commit 89ade7b
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions git/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import errno
import mmap

from collections import OrderedDict

from contextlib import contextmanager
import signal
from subprocess import (
Expand Down Expand Up @@ -783,6 +785,7 @@ def transform_kwarg(self, name, value, split_single_char_options):
def transform_kwargs(self, split_single_char_options=True, **kwargs):
"""Transforms Python style kwargs into git command line options."""
args = list()
kwargs = OrderedDict(sorted(kwargs.items(), key=lambda x: x[0]))
for k, v in kwargs.items():
if isinstance(v, (list, tuple)):
for value in v:
Expand Down

0 comments on commit 89ade7b

Please sign in to comment.