From 442008a6905d7374a653e72f4350470bd8090ae7 Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Fri, 4 Jun 2010 01:48:40 -0700
Subject: [PATCH] =?utf8?q?unicode:=20always=20decode=20json=20manifest=20a?=
 =?utf8?q?s=20utf-8=20then=20encode=20for=20stdout=20pyflakes=20pointed=20?=
 =?utf8?q?out=20that=20the=20exception=20handler=20fallback=20called=20an?=
 =?utf8?q?=20un-imported=20function,=20showing=20that=20the=20fallback=20w?=
 =?utf8?q?asn't=20being=20exercised.=20I'm=20not=20100%=20sure=20that=20th?=
 =?utf8?q?is=20patch=20is=20right=20and=20would=20appreciate=20Fran=C3=A7o?=
 =?utf8?q?is=20or=20someone=20reviewing=20it.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 src/allmydata/scripts/tahoe_manifest.py |  8 +++---
 src/allmydata/test/test_cli.py          | 34 ++++++++++++-------------
 2 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/src/allmydata/scripts/tahoe_manifest.py b/src/allmydata/scripts/tahoe_manifest.py
index 6d0b9e8d..88a578a9 100644
--- a/src/allmydata/scripts/tahoe_manifest.py
+++ b/src/allmydata/scripts/tahoe_manifest.py
@@ -6,6 +6,7 @@ from allmydata.scripts.slow_operation import SlowOperationRunner
 from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path, \
                                      UnknownAliasError
 from allmydata.scripts.common_http import do_http
+from allmydata.util.stringutils import unicode_to_stdout
 
 class FakeTransport:
     disconnecting = False
@@ -67,7 +68,7 @@ class ManifestStreamer(LineOnlyReceiver):
             print >>stderr, line
             return
 
-        d = simplejson.loads(line)
+        d = simplejson.loads(line.decode('utf-8'))
         if d["type"] in ("file", "directory"):
             if self.options["storage-index"]:
                 si = d["storage-index"]
@@ -82,10 +83,7 @@ class ManifestStreamer(LineOnlyReceiver):
                 if vc:
                     print >>stdout, vc
             else:
-                try:
-                    print >>stdout, d["cap"], "/".join(d["path"])
-                except UnicodeEncodeError:
-                    print >>stdout, d["cap"], "/".join([unicode_to_stdout(p)
+                print >>stdout, d["cap"], "/".join([unicode_to_stdout(p)
                                                         for p in d["path"]])
 
 def manifest(options):
diff --git a/src/allmydata/test/test_cli.py b/src/allmydata/test/test_cli.py
index 00176a36..59855880 100644
--- a/src/allmydata/test/test_cli.py
+++ b/src/allmydata/test/test_cli.py
@@ -1018,7 +1018,7 @@ class List(GridTestMixin, CLITestMixin, unittest.TestCase):
         def _stash_root_and_create_file(n):
             self.rootnode = n
             self.rooturi = n.get_uri()
-            return n.add_file(u"good", upload.Data(small, convergence=""))
+            return n.add_file(u"gööd", upload.Data(small, convergence=""))
         d.addCallback(_stash_root_and_create_file)
         def _stash_goodcap(n):
             self.goodcap = n.get_uri()
@@ -1035,7 +1035,7 @@ class List(GridTestMixin, CLITestMixin, unittest.TestCase):
         def _check1((rc,out,err)):
             self.failUnlessEqual(err, "")
             self.failUnlessEqual(rc, 0)
-            self.failUnlessEqual(out.splitlines(), ["0share", "1share", "good"])
+            self.failUnlessEqual(out.splitlines(), ["0share", "1share", "gööd"])
         d.addCallback(_check1)
         d.addCallback(lambda ign: self.do_cli("ls", "missing"))
         def _check2((rc,out,err)):
@@ -1058,16 +1058,16 @@ class List(GridTestMixin, CLITestMixin, unittest.TestCase):
             # listing a file (as dir/filename) should have the edge metadata,
             # including the filename
             self.failUnlessEqual(rc, 0)
-            self.failUnlessIn("good", out)
+            self.failUnlessIn("gööd", out)
             self.failIfIn("-r-- %d -" % len(small), out,
                           "trailing hyphen means unknown date")
-        d.addCallback(lambda ign: self.do_cli("ls", "-l", "good"))
+        d.addCallback(lambda ign: self.do_cli("ls", "-l", "gööd"))
         d.addCallback(_check4)
         # listing a file as $DIRCAP/filename should work just like dir/filename
-        d.addCallback(lambda ign: self.do_cli("ls", "-l", self.rooturi + "/good"))
+        d.addCallback(lambda ign: self.do_cli("ls", "-l", self.rooturi + "/gööd"))
         d.addCallback(_check4)
         # and similarly for $DIRCAP:./filename
-        d.addCallback(lambda ign: self.do_cli("ls", "-l", self.rooturi + ":./good"))
+        d.addCallback(lambda ign: self.do_cli("ls", "-l", self.rooturi + ":./gööd"))
         d.addCallback(_check4)
         def _check5((rc, out, err)):
             # listing a raw filecap should not explode, but it will have no
@@ -1959,12 +1959,12 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
         def _stash_root_and_create_file(n):
             self.rootnode = n
             self.rooturi = n.get_uri()
-            return n.add_file(u"good", upload.Data(DATA, convergence=""))
+            return n.add_file(u"gööd", upload.Data(DATA, convergence=""))
         d.addCallback(_stash_root_and_create_file)
         def _stash_uri(fn, which):
             self.uris[which] = fn.get_uri()
             return fn
-        d.addCallback(_stash_uri, "good")
+        d.addCallback(_stash_uri, "gööd")
         d.addCallback(lambda ign:
                       self.rootnode.add_file(u"small",
                                              upload.Data("literal",
@@ -1984,7 +1984,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
         d.addCallback(_check1)
 
         # root
-        # root/good
+        # root/gööd
         # root/small
         # root/mutable
 
@@ -1996,7 +1996,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
             lines = out.splitlines()
             self.failUnless("<root>: Healthy" in lines, out)
             self.failUnless("small: Healthy (LIT)" in lines, out)
-            self.failUnless("good: Healthy" in lines, out)
+            self.failUnless("gööd: Healthy" in lines, out)
             self.failUnless("mutable: Healthy" in lines, out)
             self.failUnless("done: 4 objects checked, 4 healthy, 0 unhealthy"
                             in lines, out)
@@ -2018,7 +2018,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
         d.addCallback(_check_stats)
 
         def _clobber_shares(ignored):
-            shares = self.find_shares(self.uris["good"])
+            shares = self.find_shares(self.uris["gööd"])
             self.failUnlessEqual(len(shares), 10)
             os.unlink(shares[0][2])
 
@@ -2035,7 +2035,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
         d.addCallback(_clobber_shares)
 
         # root
-        # root/good  [9 shares]
+        # root/gööd  [9 shares]
         # root/small
         # root/mutable [1 corrupt share]
 
@@ -2048,7 +2048,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
             self.failUnless("<root>: Healthy" in lines, out)
             self.failUnless("small: Healthy (LIT)" in lines, out)
             self.failUnless("mutable: Healthy" in lines, out) # needs verifier
-            self.failUnless("good: Not Healthy: 9 shares (enc 3-of-10)"
+            self.failUnless("gööd: Not Healthy: 9 shares (enc 3-of-10)"
                             in lines, out)
             self.failIf(self._corrupt_share_line in lines, out)
             self.failUnless("done: 4 objects checked, 3 healthy, 1 unhealthy"
@@ -2068,7 +2068,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
             self.failUnless(mutable.startswith("mutable: Unhealthy: 9 shares (enc 3-of-10)"),
                             mutable)
             self.failUnless(self._corrupt_share_line in lines, out)
-            self.failUnless("good: Not Healthy: 9 shares (enc 3-of-10)"
+            self.failUnless("gööd: Not Healthy: 9 shares (enc 3-of-10)"
                             in lines, out)
             self.failUnless("done: 4 objects checked, 2 healthy, 2 unhealthy"
                             in lines, out)
@@ -2082,7 +2082,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
             self.failUnlessEqual(rc, 0)
             lines = out.splitlines()
             units = [simplejson.loads(line) for line in lines]
-            # root, small, good, mutable,  stats
+            # root, small, gööd, mutable,  stats
             self.failUnlessEqual(len(units), 4+1)
         d.addCallback(_check5)
 
@@ -2098,7 +2098,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
             self.failUnless("small: healthy" in lines, out)
             self.failUnless("mutable: not healthy" in lines, out)
             self.failUnless(self._corrupt_share_line in lines, out)
-            self.failUnless("good: not healthy" in lines, out)
+            self.failUnless("gööd: not healthy" in lines, out)
             self.failUnless("done: 4 objects checked" in lines, out)
             self.failUnless(" pre-repair: 2 healthy, 2 unhealthy" in lines, out)
             self.failUnless(" 2 repairs attempted, 2 successful, 0 failed"
@@ -2118,7 +2118,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
                                                   range(10)))
 
         # root
-        # root/good
+        # rootgööd/
         # root/small
         # root/mutable
         # root/subdir [unrecoverable: 0 shares]
-- 
2.45.2