Jelmer Vernooij преди 13 години
родител
ревизия
ca29e9c081
променени са 2 файла, в които са добавени 56 реда и са изтрити 2 реда
  1. 27 2
      dulwich/config.py
  2. 29 0
      dulwich/tests/test_config.py

+ 27 - 2
dulwich/config.py

@@ -22,6 +22,7 @@
 
 import errno
 import os
+import re
 
 from dulwich.file import GitFile
 
@@ -39,6 +40,16 @@ class Config(object):
         """
         raise NotImplementedError(self.get)
 
+    def get_boolean(self, name):
+        """Retrieve a configuration setting as boolean.
+
+        :parma name: Name of the setting, including section and possible
+            subsection.
+        :return: Contents of the setting
+        :raise KeyError: if the value is not set
+        """
+        return bool(self.get(name))
+
     def set(self, name, value):
         """Set a configuration value.
         
@@ -79,8 +90,22 @@ class ConfigDict(Config):
         return self._values[section][None][variable]
 
     def set(self, name, value):
-        (section, subsection, variable) = self._parse_setting(name)
-        self._values.setdefault(section, {}).setdefault(subsection, {})[variable] = value
+        (section_name, subsection_name, variable) = self._parse_setting(name)
+        section = self._values.setdefault(section_name, {})
+        section.setdefault(subsection_name, {})[variable] = value
+
+
+def _unescape_value(value):
+    """Unescape a value."""
+    def unescape(c):
+        return {
+            "\\\\": "\\",
+            "\\\"": "\"",
+            "\\n": "\n",
+            "\\t": "\t",
+            "\\b": "\b",
+            }[c.group(0)]
+    return re.sub(r"(\\.)", unescape, value)
 
 
 class ConfigFile(ConfigDict):

+ 29 - 0
dulwich/tests/test_config.py

@@ -20,8 +20,10 @@
 
 from cStringIO import StringIO
 from dulwich.config import (
+    ConfigDict,
     ConfigFile,
     StackedConfig,
+    _unescape_value,
     )
 from dulwich.tests import TestCase
 
@@ -42,7 +44,34 @@ class ConfigFileTests(TestCase):
         self.assertEquals(ConfigFile(), cf)
 
 
+class ConfigDictTests(TestCase):
+
+    def test_get_set(self):
+        cd = ConfigDict()
+        self.assertRaises(KeyError, cd.get, "core.foo")
+        cd.set("core.foo", "bla")
+        self.assertEquals("bla", cd.get("core.foo"))
+        cd.set("core.foo", "bloe")
+        self.assertEquals("bloe", cd.get("core.foo"))
+
+
 class StackedConfigTests(TestCase):
 
     def test_default_backends(self):
         StackedConfig.default_backends()
+
+
+class UnescapeTests(TestCase):
+
+    def test_nothing(self):
+        self.assertEquals("", _unescape_value(""))
+
+    def test_tab(self):
+        self.assertEquals("\tbar\t", _unescape_value("\\tbar\\t"))
+
+    def test_newline(self):
+        self.assertEquals("\nbar\t", _unescape_value("\\nbar\\t"))
+
+    def test_quote(self):
+        self.assertEquals("\"foo\"", _unescape_value("\\\"foo\\\""))
+