diff options
-rwxr-xr-x | fusearchive.py | 66 |
1 files changed, 53 insertions, 13 deletions
diff --git a/fusearchive.py b/fusearchive.py index 25fc046..f648235 100755 --- a/fusearchive.py +++ b/fusearchive.py @@ -30,7 +30,7 @@ debug_level = 4 def dmsg(level,message): if level <= debug_level: - print str(level) + ": " + message + print str(level) + ": " + str(message) def flag2mode(flags): md = {os.O_RDONLY: 'r', os.O_WRONLY: 'w', os.O_RDWR: 'w+'} @@ -110,7 +110,7 @@ def load_chunk( key ): # Todo: make a digest -> path function to share with deflate hexdigest = ''.join( [ "%02x" % ord( x ) for x in chars ] ) - dmsg( 3, "Hash is: " + hash + " sub " + seq ) + dmsg( 3, "Hash is: " + str(hexdigest) + " sub " + str(seq) ) subparts = [ "%02x" % ord( x ) for x in chars[ :magic_depth ] ] subpath = '/'.join( subparts ) dmsg( 3, "Subpath: " + subpath ) @@ -397,8 +397,7 @@ class FuseArchive(Fuse): def _load_chunk( self, index ): # Save this chunk if modified - if self.chunk_modified: - self._save_chunk() + self._save_chunk() dmsg( 3, "Loading chunk " + str(index) ) key = None @@ -413,16 +412,23 @@ class FuseArchive(Fuse): self.chunk = load_chunk( key ) else: dmsg( 3, "No chunk at this index, loading nothing" ) - self.chunk = None + self.chunk = '' self.chunk_index = index self.chunk_modified = False - def _save_chunk(): - dmsg( 3, "Saving chunk " + self.chunk_index ) - key = save_chunk( self.chunk ) - self.chunks[ index ] = key - dmsg( 3, "Key was " + str( key ) ) + def _save_chunk(self): + if self.chunk_modified: + dmsg( 3, "Saving chunk " + str( self.chunk_index ) ) + key = save_chunk( self.chunk ) + + # Make sure we have room for this chunk + size = len( self.chunks ) + if self.chunk_index >= size: + self.chunks.extend( [None] * ( self.chunk_index -size + 1 ) ) + + self.chunks[ self.chunk_index ] = key + dmsg( 3, "Key was " + str( key ) ) def read(self, length, offset): dmsg( 3, "Reading from " + self.orig_path + " offset: " + str( offset ) @@ -459,12 +465,29 @@ class FuseArchive(Fuse): dmsg( 3, "Pulling in chunk for writing" ) self._load_chunk( index ) buf_remain = buf_len - buf_offset - if rest < buf_remain: - dmsg( 3, "Writing " + str( rest ) + " bytes, buffer boundry" ) + chunk_remain = self.chunk_size - rest + if chunk_remain < buf_remain: + dmsg( 3, "Writing " + str( chunk_remain ) + " bytes, buffer boundry" ) + this_len = chunk_remain else: dmsg( 3, "Writing final " + str( buf_remain ) + " bytes" ) + this_len = buf_remain + + # Since python doesn't do in-place reassignment like you + # can with splice() we will reconstruct the data by joining + # stuff by offsets (first chars to skip, then our joining + # buf chunk, the everything that would have been after it) + self.chunk = self.chunk[ :rest ] + \ + buf[ buf_offset:this_len ] + \ + self.chunk[ (rest + this_len): ] + + buf_offset += this_len + + # Advance to next block + rest = 0 + index += 1 + self.chunk_modified = True - self.chunk_modified = True return len(buf) # BUG: If you cp -a a file then quickly ls -l sometimes it doesn't show @@ -479,6 +502,23 @@ class FuseArchive(Fuse): if self.wr: dmsg( 3, "_fflush!" ) # Save our main data + self._save_chunk() + + # Figure out our size based on the number of chunks + the + # len of the final chunk + numchunks = len( self.chunks ) + if numchunks > 0: + # Load the last chunk + dmsg( 3, "We have " + str(numchunks) + " chunks, calculating size" ) + self._load_chunk( numchunks - 1 ) + self.size = ( numchunks - 1 ) * self.chunk_size + \ + len( self.chunk ) + else: + dmsg( 3, "No chunks, setting size to zero" ) + self.size = 0 + + dmsg( 3, "Size calculated is: " + str( self.size ) ) + out = gzip.open( "./tree" + self.orig_path, "w" ) pickle.dump( { 'size': self.size, |