Skip to content

Commit 4106f18

Browse files
committed
Use items and items_all correctly
#717
1 parent a26349d commit 4106f18

File tree

2 files changed

+27
-20
lines changed

2 files changed

+27
-20
lines changed

git/config.py

+16-19
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,19 @@ def setlast(self, key, value):
176176
prior = super(_OMD, self).__getitem__(key)
177177
prior[-1] = value
178178

179+
def get(self, key, default=None):
180+
return super(_OMD, self).get(key, [default])[-1]
181+
179182
def getall(self, key):
180183
return super(_OMD, self).__getitem__(key)
181184

185+
def items(self):
186+
"""List of (key, last value for key)."""
187+
return [(k, self[k]) for k in self]
188+
182189
def items_all(self):
183-
return [(k, self.get(k)) for k in self]
190+
"""List of (key, list of values for key)."""
191+
return [(k, self.getall(k)) for k in self]
184192

185193

186194
class GitConfigParser(with_metaclass(MetaParserBuilder, cp.RawConfigParser, object)):
@@ -481,14 +489,9 @@ def _write(self, fp):
481489
git compatible format"""
482490
def write_section(name, section_dict):
483491
fp.write(("[%s]\n" % name).encode(defenc))
484-
for (key, value) in section_dict.items_all():
492+
for (key, values) in section_dict.items_all():
485493
if key == "__name__":
486494
continue
487-
elif isinstance(value, list):
488-
values = value
489-
else:
490-
# self._defaults isn't a multidict
491-
values = [value]
492495

493496
for v in values:
494497
fp.write(("\t%s = %s\n" % (key, self._value_to_string(v).replace('\n', '\n\t'))).encode(defenc))
@@ -506,25 +509,19 @@ def items(self, section_name):
506509

507510
def items_all(self, section_name):
508511
""":return: list((option, [values...]), ...) pairs of all items in the given section"""
509-
rv = OrderedDict()
510-
for k, v in self._defaults:
511-
rv[k] = [v]
512+
rv = _OMD(self._defaults)
512513

513-
for k, v in self._sections[section_name].items_all():
514+
for k, vs in self._sections[section_name].items_all():
514515
if k == '__name__':
515516
continue
516517

517-
if k not in rv:
518-
rv[k] = v
519-
continue
520-
521-
if rv[k] == v:
518+
if k in rv and rv.getall(k) == vs:
522519
continue
523520

524-
rv[k].extend(v)
521+
for v in vs:
522+
rv.add(k, v)
525523

526-
# For consistency with items(), return a list, even in Python 3
527-
return list(rv.items())
524+
return rv.items_all()
528525

529526
@needs_values
530527
def write(self):

git/test/test_config.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
GitConfigParser
1212
)
1313
from git.compat import string_types
14-
from git.config import cp
14+
from git.config import _OMD, cp
1515
from git.test.lib import (
1616
TestCase,
1717
fixture_path,
@@ -362,3 +362,13 @@ def test_add_to_multiple(self):
362362
self.assertEqual(cr.items_all('section1'),
363363
[('option1', ['value1a', 'value1b', 'value1c']),
364364
('other_option1', ['other_value1'])])
365+
366+
def test_setlast(self):
367+
# Test directly, not covered by higher-level tests.
368+
omd = _OMD()
369+
omd.setlast('key', 'value1')
370+
self.assertEqual(omd['key'], 'value1')
371+
self.assertEqual(omd.getall('key'), ['value1'])
372+
omd.setlast('key', 'value2')
373+
self.assertEqual(omd['key'], 'value2')
374+
self.assertEqual(omd.getall('key'), ['value2'])

0 commit comments

Comments
 (0)