Mon Apr 27 07:52:03 MDT 2009  francois@ctrlaltdel.ch
  * cli: tahoe cp unicode support

New patches:

[cli: tahoe cp unicode support
francois@ctrlaltdel.ch**20090427135203
 Ignore-this: cd26cdd0753625d1c1252cffd976abd6
] {
hunk ./src/allmydata/scripts/cli.py 179
     def parseArgs(self, *args):
         if len(args) < 2:
             raise usage.UsageError("cp requires at least two arguments")
-        self.sources = args[:-1]
-        self.destination = args[-1]
+        self.sources = map(argv_to_unicode, args[:-1])
+        self.destination = argv_to_unicode(args[-1])
 
 class RmOptions(VDriveOptions):
     def parseArgs(self, where):
hunk ./src/allmydata/scripts/cli.py 184
-        self.where = where
+        self.where = argv_to_unicode(where)
 
     def getSynopsis(self):
         return "%s rm VDRIVE_FILE" % (os.path.basename(sys.argv[0]),)
hunk ./src/allmydata/scripts/tahoe_cp.py 7
 import simplejson
 from cStringIO import StringIO
 from twisted.python.failure import Failure
+import sys
 from allmydata.scripts.common import get_alias, escape_path, DefaultAliasMarker
 from allmydata.scripts.common_http import do_http
 from allmydata import uri
hunk ./src/allmydata/scripts/tahoe_cp.py 11
+from twisted.python import usage
+from allmydata.util.stringutils import fs_to_unicode, unicode_to_fs, unicode_to_url
+from allmydata.util.assertutil import precondition
 
 def ascii_or_none(s):
     if s is None:
hunk ./src/allmydata/scripts/tahoe_cp.py 76
 
 class LocalFileSource:
     def __init__(self, pathname):
+        precondition(isinstance(pathname, unicode), pathname)
         self.pathname = pathname
 
     def need_to_copy_bytes(self):
hunk ./src/allmydata/scripts/tahoe_cp.py 87
 
 class LocalFileTarget:
     def __init__(self, pathname):
+        precondition(isinstance(pathname, unicode), pathname)
         self.pathname = pathname
     def put_file(self, inf):
         outf = open(self.pathname, "wb")
hunk ./src/allmydata/scripts/tahoe_cp.py 100
 
 class LocalMissingTarget:
     def __init__(self, pathname):
+        precondition(isinstance(pathname, unicode), pathname)
         self.pathname = pathname
 
     def put_file(self, inf):
hunk ./src/allmydata/scripts/tahoe_cp.py 114
 
 class LocalDirectorySource:
     def __init__(self, progressfunc, pathname):
+        precondition(isinstance(pathname, unicode), pathname)
+
         self.progressfunc = progressfunc
         self.pathname = pathname
         self.children = None
hunk ./src/allmydata/scripts/tahoe_cp.py 124
         if self.children is not None:
             return
         self.children = {}
-        children = os.listdir(self.pathname)
+        children = os.listdir(unicode_to_fs(self.pathname))
         for i,n in enumerate(children):
hunk ./src/allmydata/scripts/tahoe_cp.py 126
+            n = fs_to_unicode(n)
             self.progressfunc("examining %d of %d" % (i, len(children)))
             pn = os.path.join(self.pathname, n)
             if os.path.isdir(pn):
hunk ./src/allmydata/scripts/tahoe_cp.py 142
 
 class LocalDirectoryTarget:
     def __init__(self, progressfunc, pathname):
+        precondition(isinstance(pathname, unicode), pathname)
+
         self.progressfunc = progressfunc
         self.pathname = pathname
         self.children = None
hunk ./src/allmydata/scripts/tahoe_cp.py 152
         if self.children is not None:
             return
         self.children = {}
-        children = os.listdir(self.pathname)
+        children = os.listdir(unicode_to_fs(self.pathname))
         for i,n in enumerate(children):
hunk ./src/allmydata/scripts/tahoe_cp.py 154
+            n = fs_to_unicode(n)
             self.progressfunc("examining %d of %d" % (i, len(children)))
             pn = os.path.join(self.pathname, n)
             if os.path.isdir(pn):
hunk ./src/allmydata/scripts/tahoe_cp.py 176
         return LocalDirectoryTarget(self.progressfunc, pathname)
 
     def put_file(self, name, inf):
+        precondition(isinstance(name, unicode), name)
         pathname = os.path.join(self.pathname, name)
hunk ./src/allmydata/scripts/tahoe_cp.py 178
-        outf = open(pathname, "wb")
+        outf = open(unicode_to_fs(pathname), "wb")
         while True:
             data = inf.read(32768)
             if not data:
hunk ./src/allmydata/scripts/tahoe_cp.py 367
                 if self.writecap:
                     url = self.nodeurl + "/".join(["uri",
                                                    urllib.quote(self.writecap),
-                                                   urllib.quote(name.encode('utf-8'))])
+                                                   urllib.quote(unicode_to_url(name))])
                 self.children[name] = TahoeFileTarget(self.nodeurl, mutable,
                                                       writecap, readcap, url)
             else:
hunk ./src/allmydata/test/test_cli.py 798
     def test_unicode_filename(self):
         self.basedir = "cli/Cp/unicode_filename"
         self.set_up_grid()
+        d = self.do_cli("create-alias", "tahoe")
+
+        # Use unicode strings when calling os functions
+        if sys.getfilesystemencoding() == "ANSI_X3.4-1968":
+            fn1 = os.path.join(self.basedir, u"Artonwall")
+        else:
+            fn1 = os.path.join(self.basedir, u"Ärtonwall")
 
hunk ./src/allmydata/test/test_cli.py 806
-        fn1 = os.path.join(self.basedir, "Ärtonwall")
         DATA1 = "unicode file content"
         open(fn1, "wb").write(DATA1)
hunk ./src/allmydata/test/test_cli.py 808
+        d.addCallback(lambda res: self.do_cli("cp", fn1.encode('utf-8'), "tahoe:Ärtonwall"))
+
+        d.addCallback(lambda res: self.do_cli("get", "tahoe:Ärtonwall"))
+        d.addCallback(lambda (rc,out,err): self.failUnlessEqual(out, DATA1))
+
 
hunk ./src/allmydata/test/test_cli.py 814
-        fn2 = os.path.join(self.basedir, "Metallica")
+        fn2 = os.path.join(self.basedir, u"Metallica")
         DATA2 = "non-unicode file content"
         open(fn2, "wb").write(DATA2)
 
hunk ./src/allmydata/test/test_cli.py 821
         # Bug #534
         # Assure that uploading a file whose name contains unicode character doesn't
         # prevent further uploads in the same directory
-        d = self.do_cli("create-alias", "tahoe")
-        d.addCallback(lambda res: self.do_cli("cp", fn1, "tahoe:"))
-        d.addCallback(lambda res: self.do_cli("cp", fn2, "tahoe:"))
-
-        d.addCallback(lambda res: self.do_cli("get", "tahoe:Ärtonwall"))
-        d.addCallback(lambda (rc,out,err): self.failUnlessEqual(out, DATA1))
+        d.addCallback(lambda res: self.do_cli("cp", fn2.encode('utf-8'), "tahoe:"))
 
         d.addCallback(lambda res: self.do_cli("get", "tahoe:Metallica"))
         d.addCallback(lambda (rc,out,err): self.failUnlessEqual(out, DATA2))
hunk ./src/allmydata/test/test_cli.py 826
 
+        d.addCallback(lambda res: self.do_cli("ls", "tahoe:"))
+
         return d
     test_unicode_filename.todo = "This behavior is not yet supported, although it does happen to work (for reasons that are ill-understood) on many platforms.  See issue ticket #534."
 
}

Context:

[test_cli.Backup: increase timeout massively, it takes 1200s on zandr's ARM linkstation
warner@lothar.com**20090609052801] 
[tests: double the timeouts on some tests which time-out on Francois's box
zooko@zooko.com**20090609021753
 Ignore-this: b2727b04402f24a9b9123d2f84068106
] 
[tests: bump up timeouts so that the tests can finish before timeout on Francois's little arm box
zooko@zooko.com**20090608225557
 Ignore-this: fb83698338b2f12546cd3e1dcb896d34
] 
[tests: increase timeouts on some other tests that timed-out on Francois's arm box
zooko@zooko.com**20090605143437
 Ignore-this: 2903cc20d914fc074c8d7a6c47740ba6
] 
[tests: bump up the timeout on a bunch of tests that took longer than the default timeout (120s) on François Lenny-armv5tel
zooko@zooko.com**20090605031444
 Ignore-this: 84d67849b1f8edc88bf7001e31b5f7f3
] 
[backup: remove the --no-backupdb command, the handling of "can't import sqlite", and the related tests, and change an error message to more correctly indicate failure to load the database from disk rather than failure to import sqlite module
zooko@zooko.com**20090604173131
 Ignore-this: 8200a9fdfc49243c280ecd1d0c44fa19
 Fixes #728.
] 
[more refactoring: move get_all_serverids() and get_nickname_for_serverid() from Client to storage_broker
warner@lothar.com**20090602030750] 
[more storage_broker refactoring: downloader gets a broker instead of a client,
warner@lothar.com**20090602022511
 use Client.get_storage_broker() accessor instead of direct attribute access.
] 
[test_runner.py: remove test_client_no_noise: the issue in question is
warner@lothar.com**20090601225007
 ticketed in http://divmod.org/trac/ticket/2830 and doesn't need a Tahoe-side
 change, plus this test fails on win32 for unrelated reasons (and test_client
 is the place to think about the win32 issue).
] 
[remove plaintext-hashing code from the helper interface, to close #722
warner@lothar.com**20090601224916
 and deny the Helper the ability to mount a partial-information-guessing
 attack. This will probably break compatibility between new clients and very
 old (pre-1.0) helpers.
] 
[start to factor server-connection-management into a distinct 'StorageServerFarmBroker' object, separate from the client and the introducer. This is the starting point for #467: static server selection
warner@lothar.com**20090601210604] 
[mutable: catch and display first error, so code bugs which break all servers get displayed better
warner@lothar.com**20090601210407] 
[misc/run-with-pythonpath.py: exec() the child (on unix), to remove the intermediate process
warner@lothar.com**20090601210137] 
[setup: require pysqlite >= v2.0.5. if we are running on Python < 2.5
zooko@zooko.com**20090604154548
 Ignore-this: cf04f46079821df209d01dad2e24b40b
] 
[setup: add pysqlite and sqlite to get_package_versions()
zooko@zooko.com**20090604153728
 Ignore-this: a1dea7fabeab2b08fb0d8d462facdb4d
] 
[docs: small edit to about.html
zooko@zooko.com**20090528233422
 Ignore-this: 1cfbb1f8426ed6d63b2d3952e4464ddc
] 
[docs: add links to Tahoe-LAFS for Paranoids and Tahoe-LAFS for Corporates in about.html
zooko@zooko.com**20090528232717
 Ignore-this: 7b70baa700d6b6f6e9ceec4132efe5
] 
[docs: edit about.html and include network-and-reliance-topology.png (loaded from http://allmydata.org )
zooko@zooko.com**20090527150916
 Ignore-this: 44adc61cde8ced8be2f0a7dfc7d95dad
] 
[docs: a few more edits to network-and-reliance-topology.svg
zooko@zooko.com**20090527150458
 Ignore-this: 2eac8c33fe71be25ff809b399c6193c1
] 
[docs: update NEWS, relnotes.txt, CREDITS to mention WUI Style
zooko@zooko.com**20090526233654
 Ignore-this: 72d16ec833bc4a22af23d29ea1d5ff8b
] 
[docs: update network-and-reliance-topology.svg for beauty and clarity
zooko@zooko.com**20090527031123
 Ignore-this: 5510914849771900ac29b4312470d84
] 
[Modify markup of Tahoe web pages to be more amenable to styling; some minor changes of wording.
Kevin Reid <kpreid@mac.com>**20090526232545
 Ignore-this: 8845937f0df6c7ddc07abe3211428a6f
] 
[Tweak wording in directory page: not-read-only is "modifiable", mention creating a directory _in this directory_.
Kevin Reid <kpreid@mac.com>**20090526232414
 Ignore-this: f006ec52ba2051802e025a60bcface56
] 
[Comment on duplication of code/markup found during styling project.
Kevin Reid <kpreid@mac.com>**20090503203442
 Ignore-this: a4b7f9f0ab57d2c03be9ba761be8d854
] 
[Add CSS styles to spiff up the Tahoe WUI's appearance, particularly the welcome page and directories.
Kevin Reid <kpreid@mac.com>**20090503203142
 Ignore-this: 5c50af241c1a958b5180ef2b6a49f626
] 
[Link all Tahoe web pages to the /tahoe_css stylesheet which already exists.
Kevin Reid <kpreid@mac.com>**20090503202533
 Ignore-this: 2ea8d14d3168b9502cf39d5ea3f2f2a8
] 
[Fix broken link from Provisioning to Reliability page.
Kevin Reid <kpreid@mac.com>**20090501191050
 Ignore-this: 56dc1a5e659b70cc02dc4df7b5d518cd
] 
[docs: network-and-reliance-topology.svg: nicer server icons, mv out of the "specifications" subdir
zooko@zooko.com**20090526165842
 Ignore-this: 8f47ab3a0ab782c1f0d46e10bcaebe5b
] 
[accounting-overview.txt: more edits
warner@lothar.com**20090523190359] 
[accounting-overview.txt: small edits
warner@lothar.com**20090523184011] 
[_auto_deps.py: require foolscap-0.4.1, which adds an important fix for py2.4
warner@lothar.com**20090523011103] 
[immutable/encode.py: tolerate immediate _remove_shareholder by copying the
warner@lothar.com**20090522184424
 landlord list before iterating over it. This can probably only happen in unit
 tests, but cleaning it up makes certain test failures easier to analyze.
] 
[switch to using RemoteException instead of 'wrapped' RemoteReferences. Should fix #653, the rref-EQ problem
warner@lothar.com**20090522004632] 
[switch all foolscap imports to use foolscap.api or foolscap.logging
warner@lothar.com**20090522003823] 
[_auto_deps.py: bump our foolscap dependency to 0.4.0, since I'm about to start using its new features
warner@lothar.com**20090522002100] 
[test_runner.py: fix minor typo
warner@lothar.com**20090520033620] 
[docs: update network-and-reliance-topology.svg
zooko@zooko.com**20090526163105
 Ignore-this: 2b864b4ed8743d4a15dfbb7eff3fa561
] 
[setup: fix bug (wrong import) in error message, as noticed by pyflakes
zooko@zooko.com**20090519195642
 Ignore-this: f1b9f8c00b46c1b5f2f20e5fc424f341
] 
[setup: fix trivial bug in recent patch to test base64.py at startup
zooko@zooko.com**20090519195129
 Ignore-this: f6be038f74b53ca69e7109fe34adfbc
] 
[setup: make Tahoe exit at startup with a useful error message if the base64.py module is buggy (fixes part of #710)
zooko@zooko.com**20090519194555
 Ignore-this: aa4d398235ddca8d417d61c9688e154
] 
[test_introducer.py: add a test for the python2.4.0/2.4.1 bug in base64.b32decode
warner@lothar.com**20090519034101] 
[immutable WriteBucketProxy: use pipeline to speed up uploads by overlapping roundtrips, for #392
warner@lothar.com**20090518234422] 
[util/pipeline.py: new utility class to manage size-limited work pipelines, for #392
warner@lothar.com**20090518234326] 
[docs: add a diagram that I'm about to show to the Boulder Linux Users Group: network-and-reliance-topology.svg
zooko@zooko.com**20090514232059
 Ignore-this: 2420c0a7c254c9f0f2349d9130490d33
] 
[tests: mark test_runner as coded in utf-8 instead of ascii
zooko@zooko.com**20090507223151
 Ignore-this: ccf1ba9e5a9b53602701a36f9fdb545e
] 
[tests: raise timeout on test_runner.RunNode.test_introducer from 120s to 240s, since it hit the 120s time-out on François Lenny-armv5tel
zooko@zooko.com**20090507215012
 Ignore-this: ba18fe6832ba255d4971e8f623ed7da5
] 
[setup: fix comment in setup.py
zooko@zooko.com**20090507215003
 Ignore-this: c46ef664630d52733138ef7fbc551c1c
] 
[docs: how_to_make_a_tahoe_release.txt: a couple of small edits
zooko@zooko.com**20090507214932
 Ignore-this: ae92aa835ad369f4b9e6e49d681957a3
] 
[.darcs-boringfile: also ignore .gitignore
warner@allmydata.com**20090415210550
 Ignore-this: d29db314a1e506f6240859559436b4c3
] 
[.darcs-boringfile: ignore .git, I'm starting to play around with it
warner@allmydata.com**20090415205929
 Ignore-this: 89234453516483c9586cd6e1351e88b5
] 
[fix quicktest: stop using setuptools, add misc/run-with-pythonpath.py, to make it run faster
warner@lothar.com**20090414201400] 
[TAG allmydata-tahoe-1.4.1
zooko@zooko.com**20090414025636
 Ignore-this: de78fc32364c83e9f4e26b5abcfdea4a
] 
Patch bundle hash:
6d069c7520dcb013c4be5b945101a28ea4d4f7c2