From 609627e6d8ab41395c8bb06c7bffd1a500ee2916 Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sun, 10 Jan 2010 02:12:47 -0500 Subject: [PATCH] Oops, 'bup save /' produced an invalid tree. Add a bunch of assertions to make sure that never happens. --- cmd-save.py | 6 ++++-- git.py | 9 +++++++-- t/test.sh | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmd-save.py b/cmd-save.py index 67cb30c..c707b02 100755 --- a/cmd-save.py +++ b/cmd-save.py @@ -56,6 +56,7 @@ parts = [''] shalists = [[]] def _push(part): + assert(part) parts.append(part) shalists.append([]) @@ -90,8 +91,9 @@ for (transname,ent) in index.Reader(git.repo('bupindex')).filter(extra): dirp = dir.split('/') while parts > dirp: _pop() - for part in dirp[len(parts):]: - _push(part) + if dir != '/': + for part in dirp[len(parts):]: + _push(part) if not file: # directory already handled. diff --git a/git.py b/git.py index 5aa7933..f79fa3d 100644 --- a/git.py +++ b/git.py @@ -200,8 +200,13 @@ class PackWriter: def new_tree(self, shalist): shalist = sorted(shalist, key = _shalist_sort_key) - l = ['%s %s\0%s' % (mode,name,bin) - for (mode,name,bin) in shalist] + l = [] + for (mode,name,bin) in shalist: + assert(mode) + assert(mode[0] != '0') + assert(name) + assert(len(bin) == 20) + l.append('%s %s\0%s' % (mode,name,bin)) return self.maybe_write('tree', ''.join(l)) def _new_commit(self, tree, parent, author, adate, committer, cdate, msg): diff --git a/t/test.sh b/t/test.sh index 7e994c1..4472956 100755 --- a/t/test.sh +++ b/t/test.sh @@ -94,7 +94,7 @@ WVSTART "save/fsck" cd "$BUP_DIR" || exit 1 #git repack -Ad #git prune - (cd "$TOP/t/sampledata" && WVPASS bup save -vvn master .) || WVFAIL + (cd "$TOP/t/sampledata" && WVPASS bup save -vvn master /) || WVFAIL n=$(git fsck --full --strict 2>&1 | egrep -v 'dangling (commit|tree)' | tee -a /dev/stderr | -- 2.39.2