Progress meter for site delete
This commit is contained in:
parent
c10dd5239e
commit
f0c10efca6
1 changed files with 45 additions and 6 deletions
|
@ -248,6 +248,7 @@ class SiteStorage(object):
|
||||||
os.makedirs(file_dir)
|
os.makedirs(file_dir)
|
||||||
# Write file
|
# Write file
|
||||||
if hasattr(content, 'read'): # File-like object
|
if hasattr(content, 'read'): # File-like object
|
||||||
|
|
||||||
with open(file_path, "wb") as file:
|
with open(file_path, "wb") as file:
|
||||||
shutil.copyfileobj(content, file) # Write buff to disk
|
shutil.copyfileobj(content, file) # Write buff to disk
|
||||||
else: # Simple string
|
else: # Simple string
|
||||||
|
@ -517,9 +518,13 @@ class SiteStorage(object):
|
||||||
# Delete site's all file
|
# Delete site's all file
|
||||||
@thread_pool_fs_write.wrap
|
@thread_pool_fs_write.wrap
|
||||||
def deleteFiles(self):
|
def deleteFiles(self):
|
||||||
self.log.debug("Deleting files from content.json...")
|
site_title = self.site.content_manager.contents.get("content.json", {}).get("title", self.site.address)
|
||||||
|
message_id = "delete-%s" % self.site.address
|
||||||
|
self.log.debug("Deleting files from content.json (title: %s)..." % site_title)
|
||||||
|
|
||||||
files = [] # Get filenames
|
files = [] # Get filenames
|
||||||
for content_inner_path in list(self.site.content_manager.contents.keys()):
|
content_inner_paths = list(self.site.content_manager.contents.keys())
|
||||||
|
for i, content_inner_path in enumerate(content_inner_paths):
|
||||||
content = self.site.content_manager.contents.get(content_inner_path, {})
|
content = self.site.content_manager.contents.get(content_inner_path, {})
|
||||||
files.append(content_inner_path)
|
files.append(content_inner_path)
|
||||||
# Add normal files
|
# Add normal files
|
||||||
|
@ -531,6 +536,13 @@ class SiteStorage(object):
|
||||||
file_inner_path = helper.getDirname(content_inner_path) + file_relative_path # Relative to site dir
|
file_inner_path = helper.getDirname(content_inner_path) + file_relative_path # Relative to site dir
|
||||||
files.append(file_inner_path)
|
files.append(file_inner_path)
|
||||||
|
|
||||||
|
if i % 100 == 0:
|
||||||
|
num_files = len(files)
|
||||||
|
self.site.messageWebsocket(
|
||||||
|
_("Deleting site <b>{site_title}</b>...<br>Collected {num_files} files"),
|
||||||
|
message_id, (i / len(content_inner_paths)) * 25
|
||||||
|
)
|
||||||
|
|
||||||
if self.isFile("dbschema.json"):
|
if self.isFile("dbschema.json"):
|
||||||
self.log.debug("Deleting db file...")
|
self.log.debug("Deleting db file...")
|
||||||
self.closeDb()
|
self.closeDb()
|
||||||
|
@ -543,7 +555,8 @@ class SiteStorage(object):
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
self.log.error("Db file delete error: %s" % err)
|
self.log.error("Db file delete error: %s" % err)
|
||||||
|
|
||||||
for inner_path in files:
|
num_files = len(files)
|
||||||
|
for i, inner_path in enumerate(files):
|
||||||
path = self.getPath(inner_path)
|
path = self.getPath(inner_path)
|
||||||
if os.path.isfile(path):
|
if os.path.isfile(path):
|
||||||
for retry in range(5):
|
for retry in range(5):
|
||||||
|
@ -553,20 +566,46 @@ class SiteStorage(object):
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
self.log.error("Error removing %s: %s, try #%s" % (inner_path, err, retry))
|
self.log.error("Error removing %s: %s, try #%s" % (inner_path, err, retry))
|
||||||
time.sleep(float(retry) / 10)
|
time.sleep(float(retry) / 10)
|
||||||
|
if i % 100 == 0:
|
||||||
|
self.site.messageWebsocket(
|
||||||
|
_("Deleting site <b>{site_title}</b>...<br>Deleting file {i}/{num_files}"),
|
||||||
|
message_id, 25 + (i / num_files) * 50
|
||||||
|
)
|
||||||
self.onUpdated(inner_path, False)
|
self.onUpdated(inner_path, False)
|
||||||
|
|
||||||
self.log.debug("Deleting empty dirs...")
|
self.log.debug("Deleting empty dirs...")
|
||||||
|
i = 0
|
||||||
for root, dirs, files in os.walk(self.directory, topdown=False):
|
for root, dirs, files in os.walk(self.directory, topdown=False):
|
||||||
for dir in dirs:
|
for dir in dirs:
|
||||||
path = os.path.join(root, dir)
|
path = os.path.join(root, dir)
|
||||||
if os.path.isdir(path) and os.listdir(path) == []:
|
if os.path.isdir(path):
|
||||||
os.rmdir(path)
|
try:
|
||||||
|
i += 1
|
||||||
|
if i % 100 == 0:
|
||||||
|
self.site.messageWebsocket(
|
||||||
|
_("Deleting site <b>{site_title}</b>...<br>Deleting empty directories {i}"),
|
||||||
|
message_id, 85
|
||||||
|
)
|
||||||
|
os.rmdir(path)
|
||||||
|
except OSError: # Not empty
|
||||||
|
pass
|
||||||
|
|
||||||
if os.path.isdir(self.directory) and os.listdir(self.directory) == []:
|
if os.path.isdir(self.directory) and os.listdir(self.directory) == []:
|
||||||
os.rmdir(self.directory) # Remove sites directory if empty
|
os.rmdir(self.directory) # Remove sites directory if empty
|
||||||
|
|
||||||
if os.path.isdir(self.directory):
|
if os.path.isdir(self.directory):
|
||||||
self.log.debug("Some unknown file remained in site data dir: %s..." % self.directory)
|
self.log.debug("Some unknown file remained in site data dir: %s..." % self.directory)
|
||||||
|
self.site.messageWebsocket(
|
||||||
|
_("Deleting site <b>{site_title}</b>...<br>Site deleted, but some unknown files left in the directory"),
|
||||||
|
message_id, 100
|
||||||
|
)
|
||||||
return False # Some files not deleted
|
return False # Some files not deleted
|
||||||
else:
|
else:
|
||||||
self.log.debug("Site data directory deleted: %s..." % self.directory)
|
self.log.debug("Site %s data directory deleted: %s..." % (site_title, self.directory))
|
||||||
|
|
||||||
|
self.site.messageWebsocket(
|
||||||
|
_("Deleting site <b>{site_title}</b>...<br>All files deleted successfully"),
|
||||||
|
message_id, 100
|
||||||
|
)
|
||||||
|
|
||||||
return True # All clean
|
return True # All clean
|
||||||
|
|
Loading…
Reference in a new issue