From 98ec466d5470c7c31e43ba4e70d117f1112ae9e2 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Tue, 24 Feb 2015 01:55:53 -0800
Subject: [PATCH] tahoe_cp.py: store basename in the Source instance

---
 src/allmydata/scripts/tahoe_cp.py | 40 +++++++++++++++++++++----------
 1 file changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/allmydata/scripts/tahoe_cp.py b/src/allmydata/scripts/tahoe_cp.py
index 756db5ba..1f274d28 100644
--- a/src/allmydata/scripts/tahoe_cp.py
+++ b/src/allmydata/scripts/tahoe_cp.py
@@ -61,9 +61,13 @@ def make_tahoe_subdirectory(nodeurl, parent_writecap, name):
 
 
 class LocalFileSource:
-    def __init__(self, pathname):
+    def __init__(self, pathname, basename):
         precondition_abspath(pathname)
         self.pathname = pathname
+        self._basename = basename
+
+    def basename(self):
+        return self._basename
 
     def need_to_copy_bytes(self):
         return True
@@ -88,12 +92,16 @@ class LocalMissingTarget:
         fileutil.put_file(self.pathname, inf)
 
 class LocalDirectorySource:
-    def __init__(self, progressfunc, pathname):
+    def __init__(self, progressfunc, pathname, basename):
         precondition_abspath(pathname)
 
         self.progressfunc = progressfunc
         self.pathname = pathname
         self.children = None
+        self._basename = basename
+
+    def basename(self):
+        return self._basename
 
     def populate(self, recurse):
         if self.children is not None:
@@ -104,12 +112,12 @@ class LocalDirectorySource:
             self.progressfunc("examining %d of %d" % (i+1, len(children)))
             pn = os.path.join(self.pathname, n)
             if os.path.isdir(pn):
-                child = LocalDirectorySource(self.progressfunc, pn)
+                child = LocalDirectorySource(self.progressfunc, pn, n)
                 self.children[n] = child
                 if recurse:
                     child.populate(True)
             elif os.path.isfile(pn):
-                self.children[n] = LocalFileSource(pn)
+                self.children[n] = LocalFileSource(pn, n)
             else:
                 # Could be dangling symlink; probably not copy-able.
                 # TODO: output a warning
@@ -160,11 +168,15 @@ class LocalDirectoryTarget:
 
 
 class TahoeFileSource:
-    def __init__(self, nodeurl, mutable, writecap, readcap):
+    def __init__(self, nodeurl, mutable, writecap, readcap, basename):
         self.nodeurl = nodeurl
         self.mutable = mutable
         self.writecap = writecap
         self.readcap = readcap
+        self._basename = basename # unicode, or None for raw filecaps
+
+    def basename(self):
+        return self._basename
 
     def need_to_copy_bytes(self):
         if self.mutable:
@@ -201,10 +213,14 @@ class TahoeFileTarget:
         # mutable files. ticket #835
 
 class TahoeDirectorySource:
-    def __init__(self, nodeurl, cache, progressfunc):
+    def __init__(self, nodeurl, cache, progressfunc, basename):
         self.nodeurl = nodeurl
         self.cache = cache
         self.progressfunc = progressfunc
+        self._basename = basename # unicode, or None for raw dircaps
+
+    def basename(self):
+        return self._basename
 
     def init_from_grid(self, writecap, readcap):
         self.writecap = writecap
@@ -244,7 +260,7 @@ class TahoeDirectorySource:
                 writecap = to_str(data[1].get("rw_uri"))
                 readcap = to_str(data[1].get("ro_uri"))
                 self.children[name] = TahoeFileSource(self.nodeurl, mutable,
-                                                      writecap, readcap)
+                                                      writecap, readcap, name)
             elif data[0] == "dirnode":
                 writecap = to_str(data[1].get("rw_uri"))
                 readcap = to_str(data[1].get("ro_uri"))
@@ -254,7 +270,7 @@ class TahoeDirectorySource:
                     child = self.cache[readcap]
                 else:
                     child = TahoeDirectorySource(self.nodeurl, self.cache,
-                                                 self.progressfunc)
+                                                 self.progressfunc, name)
                     child.init_from_grid(writecap, readcap)
                     if writecap:
                         self.cache[writecap] = child
@@ -578,10 +594,10 @@ class Copier:
             if not os.path.exists(pathname):
                 raise MissingSourceError(source_spec, quotefn=quote_local_unicode_path)
             if os.path.isdir(pathname):
-                t = LocalDirectorySource(self.progress, pathname)
+                t = LocalDirectorySource(self.progress, pathname, name)
             else:
                 assert os.path.isfile(pathname)
-                t = LocalFileSource(pathname) # non-empty
+                t = LocalFileSource(pathname, name) # non-empty
         else:
             # this is a tahoe object
             url = self.nodeurl + "uri/%s" % urllib.quote(rootcap)
@@ -603,7 +619,7 @@ class Copier:
             nodetype, d = parsed
             if nodetype == "dirnode":
                 t = TahoeDirectorySource(self.nodeurl, self.cache,
-                                         self.progress)
+                                         self.progress, name)
                 t.init_from_parsed(parsed)
             else:
                 writecap = to_str(d.get("rw_uri"))
@@ -616,7 +632,7 @@ class Copier:
                     # assignment above. cf #2329
                     name = source_spec[last_slash+1:]
 
-                t = TahoeFileSource(self.nodeurl, mutable, writecap, readcap)
+                t = TahoeFileSource(self.nodeurl, mutable, writecap, readcap, name)
         return name, t
 
 
-- 
2.45.2