浏览代码

Mork work on swift module python3 compatibility.

Jelmer Vernooij 8 年之前
父节点
当前提交
bbafb324bb
共有 3 个文件被更改,包括 29 次插入30 次删除
  1. 7 8
      dulwich/contrib/swift.py
  2. 21 21
      dulwich/contrib/test_swift.py
  3. 1 1
      dulwich/refs.py

+ 7 - 8
dulwich/contrib/swift.py

@@ -404,7 +404,7 @@ class SwiftConnector(object):
             raise SwiftException('HEAD request failed with error code %s'
                                  % ret.status_code)
         resp_headers = {}
-        for header, value in ret.iteritems():
+        for header, value in ret.items():
             resp_headers[header.lower()] = value
         return resp_headers
 
@@ -509,7 +509,7 @@ class SwiftPackReader(object):
         self.pack_length = pack_length
         self.offset = 0
         self.base_offset = 0
-        self.buff = ''
+        self.buff = b''
         self.buff_length = self.scon.chunk_length
 
     def _read(self, more=False):
@@ -530,16 +530,14 @@ class SwiftPackReader(object):
         if self.base_offset + end > self.pack_length:
             data = self.buff[self.offset:]
             self.offset = end
-            return "".join(data)
-        try:
-            self.buff[end]
-        except IndexError:
+            return b"".join(data)
+        if end > len(self.buff):
             # Need to read more from swift
             self._read(more=True)
             return self.read(length)
         data = self.buff[self.offset:end]
         self.offset = end
-        return "".join(data)
+        return b"".join(data)
 
     def seek(self, offset):
         """Seek to a specified offset
@@ -810,7 +808,8 @@ class SwiftObjectStore(PackBasedObjectStore):
         # Move the pack in.
         entries.sort()
         pack_base_name = posixpath.join(
-            self.pack_dir, 'pack-' + iter_sha1(e[0] for e in entries))
+            self.pack_dir,
+            'pack-' + iter_sha1(e[0] for e in entries).decode(sys.getfilesystemencoding()))
         self.scon.put_object(pack_base_name + '.pack', f)
 
         # Write the index.

+ 21 - 21
dulwich/contrib/test_swift.py

@@ -30,6 +30,7 @@ try:
 except ImportError:
     from io import StringIO
 
+import sys
 from unittest import skipIf
 
 from dulwich.tests import (
@@ -79,6 +80,8 @@ except ImportError:
 
 skipmsg = "Required libraries are not installed (%r)" % missing_libs
 
+skipIfPY3 = skipIf(sys.version_info[0] == 3, "SWIFT module not yet ported to python3.")
+
 if not missing_libs:
     from dulwich.contrib import swift
 
@@ -124,11 +127,7 @@ class Response(object):
         return self.headers[key]
 
     def items(self):
-        return self.headers
-
-    def iteritems(self):
-        for k, v in self.headers.iteritems():
-            yield k, v
+        return self.headers.items()
 
     def read(self):
         return self.content
@@ -258,6 +257,7 @@ class FakeSwiftConnector(object):
 
 
 @skipIf(missing_libs, skipmsg)
+@skipIfPY3
 class TestSwiftObjectStore(TestCase):
 
     def setUp(self):
@@ -475,8 +475,8 @@ class TestSwiftInfoRefsContainer(TestCase):
     def setUp(self):
         super(TestSwiftInfoRefsContainer, self).setUp()
         content = \
-            "22effb216e3a82f97da599b8885a6cadb488b4c5\trefs/heads/master\n" + \
-            "cca703b0e1399008b53a1a236d6b4584737649e4\trefs/heads/dev"
+            b"22effb216e3a82f97da599b8885a6cadb488b4c5\trefs/heads/master\n" + \
+            b"cca703b0e1399008b53a1a236d6b4584737649e4\trefs/heads/dev"
         self.store = {'fakerepo/info/refs': content}
         self.conf = swift.load_conf(file=StringIO(config_file %
                                                   def_config_file))
@@ -489,22 +489,22 @@ class TestSwiftInfoRefsContainer(TestCase):
         self.assertEqual(len(irc._refs), 0)
         self.fsc.store = self.store
         irc = swift.SwiftInfoRefsContainer(self.fsc, self.object_store)
-        self.assertIn('refs/heads/dev', irc.allkeys())
-        self.assertIn('refs/heads/master', irc.allkeys())
+        self.assertIn(b'refs/heads/dev', irc.allkeys())
+        self.assertIn(b'refs/heads/master', irc.allkeys())
 
     def test_set_if_equals(self):
         self.fsc.store = self.store
         irc = swift.SwiftInfoRefsContainer(self.fsc, self.object_store)
-        irc.set_if_equals('refs/heads/dev',
-                          "cca703b0e1399008b53a1a236d6b4584737649e4", '1'*40)
-        self.assertEqual(irc['refs/heads/dev'], '1'*40)
+        irc.set_if_equals(b'refs/heads/dev',
+                          b"cca703b0e1399008b53a1a236d6b4584737649e4", b'1'*40)
+        self.assertEqual(irc[b'refs/heads/dev'], b'1'*40)
 
     def test_remove_if_equals(self):
         self.fsc.store = self.store
         irc = swift.SwiftInfoRefsContainer(self.fsc, self.object_store)
-        irc.remove_if_equals('refs/heads/dev',
-                             "cca703b0e1399008b53a1a236d6b4584737649e4")
-        self.assertNotIn('refs/heads/dev', irc.allkeys())
+        irc.remove_if_equals(b'refs/heads/dev',
+                             b"cca703b0e1399008b53a1a236d6b4584737649e4")
+        self.assertNotIn(b'refs/heads/dev', irc.allkeys())
 
 
 @skipIf(missing_libs, skipmsg)
@@ -596,7 +596,7 @@ class TestSwiftConnector(TestCase):
     def test_put_object(self):
         with patch('geventhttpclient.HTTPClient.request',
                    lambda *args, **kwargs: Response()):
-            self.assertEqual(self.conn.put_object('a', BytesIO('content')),
+            self.assertEqual(self.conn.put_object('a', BytesIO(b'content')),
                              None)
 
     def test_put_object_fails(self):
@@ -604,15 +604,15 @@ class TestSwiftConnector(TestCase):
                    lambda *args, **kwargs: Response(status=400)):
             self.assertRaises(swift.SwiftException,
                               lambda: self.conn.put_object(
-                                  'a', BytesIO('content')))
+                                  'a', BytesIO(b'content')))
 
     def test_get_object(self):
         with patch('geventhttpclient.HTTPClient.request',
-                   lambda *args, **kwargs: Response(content='content')):
-            self.assertEqual(self.conn.get_object('a').read(), 'content')
+                   lambda *args, **kwargs: Response(content=b'content')):
+            self.assertEqual(self.conn.get_object('a').read(), b'content')
         with patch('geventhttpclient.HTTPClient.request',
-                   lambda *args, **kwargs: Response(content='content')):
-            self.assertEqual(self.conn.get_object('a', range='0-6'), 'content')
+                   lambda *args, **kwargs: Response(content=b'content')):
+            self.assertEqual(self.conn.get_object('a', range='0-6'), b'content')
 
     def test_get_object_fails(self):
         with patch('geventhttpclient.HTTPClient.request',

+ 1 - 1
dulwich/refs.py

@@ -756,7 +756,7 @@ def write_packed_refs(f, packed_refs, peeled_refs=None):
 def read_info_refs(f):
     ret = {}
     for l in f.readlines():
-        (sha, name) = l.rstrip("\r\n").split("\t", 1)
+        (sha, name) = l.rstrip(b"\r\n").split(b"\t", 1)
         ret[name] = sha
     return ret