Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 4106f18

Browse filesBrowse files
committed
Use items and items_all correctly
#717
1 parent a26349d commit 4106f18
Copy full SHA for 4106f18

File tree

2 files changed

+27
-20
lines changed
Filter options

2 files changed

+27
-20
lines changed

‎git/config.py

Copy file name to clipboardExpand all lines: git/config.py
+16-19Lines changed: 16 additions & 19 deletions
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

Copy file name to clipboardExpand all lines: git/test/test_config.py
+11-1Lines changed: 11 additions & 1 deletion
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.