summaryrefslogtreecommitdiff
path: root/morphlib/localartifactcache.py
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2014-07-11 17:37:54 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2014-07-11 17:37:54 +0000
commit40a5c752de62dd1b3ef3ec0850f1f24e7af67052 (patch)
tree960834307ff18840454a8c1dd6ad01376aecb89d /morphlib/localartifactcache.py
parent1a5e3e748a5ea4f48e3e88fa3859db4c186d6ba5 (diff)
downloadmorph-40a5c752de62dd1b3ef3ec0850f1f24e7af67052.tar.gz
Allow non-unicode paths to be hardlinked into staging areasbaserock/richardmaw/bugfix/unicode-safe-paths
Parts of the morphology go into the name of the staging area, so it helps to convert them into a str, so later attempts to join it with another string don't result in a unicode string. pyfilesystem insists that file paths must be unicode. It is incorrect, but we passed something unicode compatible in in the first place, so we can get away with converting it back to a bytestring.
Diffstat (limited to 'morphlib/localartifactcache.py')
-rw-r--r--morphlib/localartifactcache.py15
1 files changed, 12 insertions, 3 deletions
diff --git a/morphlib/localartifactcache.py b/morphlib/localartifactcache.py
index 4c7f7832..955ee97f 100644
--- a/morphlib/localartifactcache.py
+++ b/morphlib/localartifactcache.py
@@ -96,14 +96,23 @@ class LocalArtifactCache(object):
os.utime(filename, None)
return open(filename)
+ def _join(self, basename):
+ '''Wrapper for pyfilesystem's getsyspath.
+
+ This is required because its API throws us a garbage unicode
+ string, when file paths are binary data.
+ '''
+ return str(self.cachefs.getsyspath(basename))
+
def artifact_filename(self, artifact):
- return self.cachefs.getsyspath(artifact.basename())
+ basename = artifact.basename()
+ return self._join(basename)
def _artifact_metadata_filename(self, artifact, name):
- return self.cachefs.getsyspath(artifact.metadata_basename(name))
+ return self._join(artifact.metadata_basename(name))
def _source_metadata_filename(self, source, cachekey, name):
- return self.cachefs.getsyspath('%s.%s' % (cachekey, name))
+ return self._join('%s.%s' % (cachekey, name))
def clear(self):
'''Clear everything from the artifact cache directory.