# create dummy task if needed task = tasklib.Task() if os.path.exists(filename): raise NoteBookError("File '%s' already exists" % filename) # make sure all modifications are saved first try: notebook.save() except Exception, e: raise NoteBookError("Could not save notebook before archiving", e) # perform archiving archive = tarfile.open(filename, "w:gz", format=tarfile.PAX_FORMAT) path = notebook.get_path() # first count # of files nfiles = 0 for root, dirs, files in os.walk(path): nfiles += len(files) task.set_message(("text", "Archiving %d files..." % nfiles)) nfiles2 = [0] def walk(path, arcname): # add to archive archive.add(path, arcname, False) # report progresss
def restore_notebook(filename, path, rename, task=None): """ Restores a archived notebook filename -- filename of archive path -- name of new notebook rename -- if True, path contains notebook name, otherwise path is basedir of new notebook """ if task is None: # create dummy task if needed task = tasklib.Task() if path == "": raise NoteBookError("Must specify a path for restoring notebook") # remove trailing "/" path = re.sub("/+$", "", path) tar = tarfile.open(filename, "r:gz", format=tarfile.PAX_FORMAT) # create new dirctory, if needed if rename: if not os.path.exists(path): tmppath = get_unique_filename(os.path.dirname(path), os.path.basename(path+"-tmp")) else: raise NoteBookError("Notebook path already exists") try: # extract notebook members = list(tar.getmembers()) if task: task.set_message(("text", "Restoring %d files..." % len(members))) for i, member in enumerate(members): # FIX: tarfile does not seem to keep unicode and str straight # make sure member.name is unicode if 'path' in member.pax_headers: member.name = member.pax_headers['path'] if task: if task.aborted(): raise NoteBookError("Restore canceled") task.set_message(("detail", truncate_filename(member.name))) task.set_percent(i / float(len(members))) tar.extract(member, tmppath) files = os.listdir(tmppath) # assert len(files) = 1 extracted_path = os.path.join(tmppath, files[0]) # move extracted files to proper place if task: task.set_message(("text", "Finishing restore...")) shutil.move(extracted_path, path) os.rmdir(tmppath) except NoteBookError, e: raise e except Exception, e: raise NoteBookError("File writing error while extracting notebook", e)
def archive_notebook(notebook, filename, task=None): """Archive notebook as *.tar.gz filename -- filename of archive to create """ if task is None: # create dummy task if needed task = tasklib.Task() if os.path.exists(filename): raise NoteBookError("File '%s' already exists" % filename) # make sure all modifications are saved first try: notebook.save() except Exception as e: raise NoteBookError("Could not save notebook before archiving", e) # perform archiving archive = tarfile.open(filename, "w:gz", format=tarfile.PAX_FORMAT) path = notebook.get_path() # first count # of files nfiles = 0 for root, dirs, files in os.walk(path): nfiles += len(files) task.set_message(("text", "Archiving %d files..." % nfiles)) nfiles2 = [0] def walk(path, arcname): # add to archive archive.add(path, arcname, False) # report progresss if os.path.isfile(path): nfiles2[0] += 1 if task: task.set_message(("detail", truncate_filename(path))) task.set_percent(nfiles2[0] / float(nfiles)) # recurse if os.path.isdir(path): for f in os.listdir(path): # abort archive if task.aborted(): archive.close() os.remove(filename) raise NoteBookError("Backup canceled") if not os.path.islink(f): walk(os.path.join(path, f), os.path.join(arcname, f)) walk(path, os.path.basename(path)) task.set_message(("text", "Closing archive...")) task.set_message(("detail", "")) archive.close() if task: task.finish()