summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2019-01-21 09:38:51 -0500
committerA. Jesse Jiryu Davis <jesse@mongodb.com>2019-01-21 10:09:40 -0500
commit4106f183ad0875734ba2c697570f9fd272970804 (patch)
tree85393df59990032913ef2ecf18b709ab9936a56e
parenta26349d8df88107bd59fd69c06114d3b213d0b27 (diff)
downloadgitpython-4106f183ad0875734ba2c697570f9fd272970804.tar.gz
Use items and items_all correctly
#717
-rw-r--r--git/config.py35
-rw-r--r--git/test/test_config.py12
2 files changed, 27 insertions, 20 deletions
diff --git a/git/config.py b/git/config.py
index e2c055fd..b03d9d42 100644
--- a/git/config.py
+++ b/git/config.py
@@ -176,11 +176,19 @@ class _OMD(OrderedDict):
prior = super(_OMD, self).__getitem__(key)
prior[-1] = value
+ def get(self, key, default=None):
+ return super(_OMD, self).get(key, [default])[-1]
+
def getall(self, key):
return super(_OMD, self).__getitem__(key)
+ def items(self):
+ """List of (key, last value for key)."""
+ return [(k, self[k]) for k in self]
+
def items_all(self):
- return [(k, self.get(k)) for k in self]
+ """List of (key, list of values for key)."""
+ return [(k, self.getall(k)) for k in self]
class GitConfigParser(with_metaclass(MetaParserBuilder, cp.RawConfigParser, object)):
@@ -481,14 +489,9 @@ class GitConfigParser(with_metaclass(MetaParserBuilder, cp.RawConfigParser, obje
git compatible format"""
def write_section(name, section_dict):
fp.write(("[%s]\n" % name).encode(defenc))
- for (key, value) in section_dict.items_all():
+ for (key, values) in section_dict.items_all():
if key == "__name__":
continue
- elif isinstance(value, list):
- values = value
- else:
- # self._defaults isn't a multidict
- values = [value]
for v in values:
fp.write(("\t%s = %s\n" % (key, self._value_to_string(v).replace('\n', '\n\t'))).encode(defenc))
@@ -506,25 +509,19 @@ class GitConfigParser(with_metaclass(MetaParserBuilder, cp.RawConfigParser, obje
def items_all(self, section_name):
""":return: list((option, [values...]), ...) pairs of all items in the given section"""
- rv = OrderedDict()
- for k, v in self._defaults:
- rv[k] = [v]
+ rv = _OMD(self._defaults)
- for k, v in self._sections[section_name].items_all():
+ for k, vs in self._sections[section_name].items_all():
if k == '__name__':
continue
- if k not in rv:
- rv[k] = v
- continue
-
- if rv[k] == v:
+ if k in rv and rv.getall(k) == vs:
continue
- rv[k].extend(v)
+ for v in vs:
+ rv.add(k, v)
- # For consistency with items(), return a list, even in Python 3
- return list(rv.items())
+ return rv.items_all()
@needs_values
def write(self):
diff --git a/git/test/test_config.py b/git/test/test_config.py
index 67e4810d..93f94748 100644
--- a/git/test/test_config.py
+++ b/git/test/test_config.py
@@ -11,7 +11,7 @@ from git import (
GitConfigParser
)
from git.compat import string_types
-from git.config import cp
+from git.config import _OMD, cp
from git.test.lib import (
TestCase,
fixture_path,
@@ -362,3 +362,13 @@ class TestBase(TestCase):
self.assertEqual(cr.items_all('section1'),
[('option1', ['value1a', 'value1b', 'value1c']),
('other_option1', ['other_value1'])])
+
+ def test_setlast(self):
+ # Test directly, not covered by higher-level tests.
+ omd = _OMD()
+ omd.setlast('key', 'value1')
+ self.assertEqual(omd['key'], 'value1')
+ self.assertEqual(omd.getall('key'), ['value1'])
+ omd.setlast('key', 'value2')
+ self.assertEqual(omd['key'], 'value2')
+ self.assertEqual(omd.getall('key'), ['value2'])