summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-02-25 14:23:29 +0000
committerLars Wirzenius <liw@liw.fi>2012-02-25 14:23:29 +0000
commita4a011dd30194eb3f1af728a887199d99da7ec29 (patch)
tree6f0233e8faeaf5375dd8d8e752040896c49187f1
parentc2990d501379a4b8e7c84070c4453eae947578a9 (diff)
downloadsummain-a4a011dd30194eb3f1af728a887199d99da7ec29.tar.gz
Fix mangling of relative paths
Previously, the whole path would be mangled, rather than just the relative name.
-rwxr-xr-xsummain15
-rw-r--r--summainlib.py23
-rw-r--r--tests/manglepaths.stdout10
3 files changed, 25 insertions, 23 deletions
diff --git a/summain b/summain
index 026a2ae..a9e7ead 100755
--- a/summain
+++ b/summain
@@ -150,10 +150,8 @@ class Summain(cliapp.Application):
for filename in self.files(root):
o = summainlib.FilesystemObject(filename, nn, pn, exclude)
if relative:
- name = self.relative_path(root, o)
- else:
- name = o['Name']
- yield name, o
+ o.relative = self.relative_path(root, o)
+ yield o['Name'], o
def relative_path(self, root, o):
'''Return a path that is relative to root, if possible.
@@ -167,13 +165,12 @@ class Summain(cliapp.Application):
root2 = root
else:
root2 = root + os.sep
- pathname = o['Name']
- if pathname.startswith(root2):
- return pathname[len(root2):]
- elif pathname == root and o.isdir():
+ if o.filename.startswith(root2):
+ return o.filename[len(root2):]
+ elif o.filename == root and o.isdir():
return '.'
else:
- return pathname
+ return o.filename
def new_formatter(self, checksums, objects):
table = {
diff --git a/summainlib.py b/summainlib.py
index ae6dcb2..475a060 100644
--- a/summainlib.py
+++ b/summainlib.py
@@ -137,7 +137,8 @@ class FilesystemObject(object):
stat_result=None, sha1=None, sha224=None,
sha256=None, sha384=None, sha512=None,
md5=None, open_file=None, readlink=None):
- self._filename = filename
+ self.filename = filename
+ self.relative = None
self._exclude = set(self._normalize_key(k) for k in exclude)
self._pn = pn
self._nn = nn
@@ -153,7 +154,11 @@ class FilesystemObject(object):
self.values = dict()
def _compute_name(self):
- return urllib.quote(self._pn.normalize(self._filename))
+ if self.relative is None:
+ name = self.filename
+ else:
+ name = self.relative # pragma: no cover
+ return urllib.quote(self._pn.normalize(name))
def _compute_mtime(self):
return self.format_time(self._stat_result[RESULT_MTIME_SEC],
@@ -188,26 +193,26 @@ class FilesystemObject(object):
return self.lookup_group(self._stat_result[RESULT_GID])
def _compute_md5(self):
- return self.compute_checksum(self._filename, self._md5)
+ return self.compute_checksum(self.filename, self._md5)
def _compute_sha1(self):
- return self.compute_checksum(self._filename, self._sha1)
+ return self.compute_checksum(self.filename, self._sha1)
def _compute_sha224(self):
- return self.compute_checksum(self._filename, self._sha224)
+ return self.compute_checksum(self.filename, self._sha224)
def _compute_sha256(self):
- return self.compute_checksum(self._filename, self._sha256)
+ return self.compute_checksum(self.filename, self._sha256)
def _compute_sha384(self):
- return self.compute_checksum(self._filename, self._sha384)
+ return self.compute_checksum(self.filename, self._sha384)
def _compute_sha512(self):
- return self.compute_checksum(self._filename, self._sha512)
+ return self.compute_checksum(self.filename, self._sha512)
def _compute_target(self):
if stat.S_ISLNK(self._stat_result[RESULT_MODE]):
- return self.readlink(self._filename)
+ return self.readlink(self.filename)
def format_time(self, secs, nsecs):
s = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(secs))
diff --git a/tests/manglepaths.stdout b/tests/manglepaths.stdout
index 703b780..cbeb1f2 100644
--- a/tests/manglepaths.stdout
+++ b/tests/manglepaths.stdout
@@ -1,10 +1,10 @@
-Name: ea4435b9ac411c20b01a0ba224092e1c
+Name: a59d6cc610302892d2f5d06dfd4e8b5f
Mode: 40700
Ino: 1
Dev: 1
Nlink: 2
-Name: 33997cd210f8004f9cf702a06b668957
+Name: 5157341f60990e87222257ef4f6dae74
Mode: 100666
Ino: 2
Dev: 1
@@ -12,7 +12,7 @@ Nlink: 1
Size: 4
SHA1: e242ed3bffccdf271b7fbaf34ed72d089537b42f
-Name: 96190c379ef3530f4d9d8bb4a1a0c71d
+Name: 4acb10ca3965a14a080297db0921950c
Mode: 100666
Ino: 3
Dev: 1
@@ -20,7 +20,7 @@ Nlink: 1
Size: 4
SHA1: f1d2d2f924e986ac86fdf7b36c94bcdf32beec15
-Name: b87060f4ff8c3d12cdf0ef8f5cf83e96
+Name: 425980b11f70991f4249a68c754357d4
Mode: 100666
Ino: 4
Dev: 1
@@ -28,7 +28,7 @@ Nlink: 1
Size: 7
SHA1: 988881adc9fc3655077dc2d4d757d480b5ea0e11
-Name: 5a2c785fc7c149c0a3dea4fd625dfccb
+Name: 5d0878e8255c3ae21cf006ee7b282ef2
Mode: 100666
Ino: 5
Dev: 1