def update_total_size(self, bytes_removed): """Callback to update the total size cleaned""" context_id = self.status_bar.get_context_id('size') text = FileUtilities.bytes_to_human(bytes_removed) if 0 == bytes_removed: text = "" self.status_bar.push(context_id, text)
def fill_memory_linux(): """Fill unallocated memory""" report_free() allocbytes = int(physical_free() * 0.4) if allocbytes < 1024: return bytes_str = FileUtilities.bytes_to_human(allocbytes) print "info: allocating and wiping %s (%d B) of memory" % (bytes_str, allocbytes) try: buf = '\x00' * allocbytes except MemoryError: pass else: fill_memory_linux() print "debug: freeing %s of memory" % bytes_str del buf report_free()
def run(self): """Perform the main cleaning process which has these phases 1. General cleaning 2. Deep scan 3. Memory 4. Free disk space""" self.deepscans = {} # prioritize self.delayed_ops = [] for operation in self.operations: delayables = ['free_disk_space', 'memory'] for delayable in delayables: if operation not in ('system', '_gui'): continue if delayable in self.operations[operation]: i = self.operations[operation].index(delayable) del self.operations[operation][i] priority = 99 if 'free_disk_space' == delayable: priority = 100 new_op = (priority, {operation: [delayable]}) self.delayed_ops.append(new_op) # standard operations for dummy in self.run_operations(self.operations): # yield to GTK+ idle loop yield True # run deep scan if self.deepscans: for dummy in self.run_deep_scan(): yield dummy # delayed operations for op in sorted(self.delayed_ops): operation = op[1].keys()[0] for option_id in op[1].values()[0]: for ret in self.run_delayed_op(operation, option_id): # yield to GTK+ idle loop yield True # print final stats bytes_delete = FileUtilities.bytes_to_human(self.total_bytes) if self.really_delete: # TRANSLATORS: This refers to disk space that was # really recovered (in other words, not a preview) line = _("Disk space recovered: %s") % bytes_delete else: # TRANSLATORS: This refers to a preview (no real # changes were made yet) line = _("Disk space to be recovered: %s") % bytes_delete self.ui.append_text("\n%s" % line) if self.really_delete: # TRANSLATORS: This refers to the number of files really # deleted (in other words, not a preview). line = _("Files deleted: %d") % self.total_deleted else: # TRANSLATORS: This refers to the number of files that # would be deleted (in other words, simply a preview). line = _("Files to be deleted: %d") % self.total_deleted self.ui.append_text("\n%s" % line) if self.total_special > 0: line = _("Special operations: %d") % self.total_special self.ui.append_text("\n%s" % line) if self.total_errors > 0: line = _("Errors: %d") % self.total_errors self.ui.append_text("\n%s" % line, 'error') if self.really_delete: self.ui.update_total_size(self.total_bytes) self.ui.worker_done(self, self.really_delete) yield False
except SystemExit: pass except Exception, e: # 2 = does not exist # 13 = permission denied from errno import ENOENT, EACCES if not (isinstance(e, OSError) and e.errno in (ENOENT, EACCES)): traceback.print_exc() line = "%s\n" % (str(sys.exc_info()[1])) self.total_errors += 1 self.ui.append_text(line, 'error') else: if None == ret: return if isinstance(ret['size'], (int, long)): size = FileUtilities.bytes_to_human(ret['size']) self.total_bytes += ret['size'] else: size = "?B" if ret['path']: path = ret['path'] else: path = '' path = path.decode('utf8', 'replace') # for invalid encoding line = u"%s %s %s\n" % (ret['label'], size, path) self.total_deleted += ret['n_deleted'] self.total_special += ret['n_special'] if ret['label']: # the label may be a hidden operation # (e.g., win.shell.change.notify) self.ui.append_text(line)
def report_free(): """Report free memory""" bytes_free = physical_free() bytes_str = FileUtilities.bytes_to_human(bytes_free) print "debug: physical free: %s (%d B)" % \ (bytes_str, bytes_free)
except SystemExit: pass except Exception, e: # 2 = does not exist # 13 = permission denied from errno import ENOENT, EACCES if not (isinstance(e, OSError) and e.errno in (ENOENT, EACCES)): traceback.print_exc() line = "%s\n" % (str(sys.exc_info()[1])) self.total_errors += 1 self.ui.append_text(line, 'error') else: if None == ret: return if isinstance(ret['size'], (int, long)): size = FileUtilities.bytes_to_human(ret['size']) self.total_bytes += ret['size'] else: size = "?B" if ret['path']: path = ret['path'] else: path = '' path = path.decode('utf8', 'replace') # for invalid encoding line = u"%s %s %s\n" % (ret['label'], size, path) self.total_deleted += ret['n_deleted'] self.total_special += ret['n_special'] self.ui.append_text(line) def clean_operation(self, operation): """Perform a single cleaning operation"""
pass except Exception, e: # 2 = does not exist # 13 = permission denied from errno import ENOENT, EACCES if not (isinstance(e, OSError) and e.errno in (ENOENT, EACCES)): traceback.print_exc() line = "%s\n" % (str(sys.exc_info()[1])) self.total_errors += 1 self.ui.append_text(line, "error") else: if None == ret: return if isinstance(ret["size"], (int, long)): size = FileUtilities.bytes_to_human(ret["size"]) self.total_bytes += ret["size"] else: size = "?B" if ret["path"]: path = ret["path"] else: path = "" path = path.decode("utf8", "replace") # for invalid encoding line = u"%s %s %s\n" % (ret["label"], size, path) self.total_deleted += ret["n_deleted"] self.total_special += ret["n_special"] self.ui.append_text(line) def clean_operation(self, operation): """Perform a single cleaning operation"""