Fix and improve the whole backup restoration procedure

The restore-buffer command was made publicly visible to allow arbitrary
reloads of the backup files, only backup files that were created after
the file has last been modified will be loaded, and several bugs have
been fixed (sed/find patterns).
This commit is contained in:
Frank LENORMAND 2015-08-04 16:56:35 +03:00
parent 548436eaf0
commit 73e788fc59

View File

@ -1,15 +1,20 @@
## If set to true, backups will be removed as soon as they have been restored
decl bool autorestore_purge_restored true
def -hidden _autorestore-restore-buffer %{
nop %sh{
## Insert the content of the backup file into the current buffer, if a suitable one is found
def autorestore-restore-buffer -docstring "Restore the backup for the current file if it exists" %{
%sh{
buffer_basename="${kak_bufname##*/}"
buffer_dirname=$(dirname "${kak_bufname}")
## Find the name of the latest backup created for the buffer that was open
latest_backup_path=$(find "${buffer_dirname}" -maxdepth 1 -type f -readable -name "\.${buffer_basename}\.kak\.*" -printf '%A@/%p\n' 2>/dev/null \
| sort -n -t. -k1 | sed -nr 's/^.+\///;$p')
test ! -z "${latest_backup_path}" || exit
## The backup file has to have been last modified more recently than the file we are editing
latest_backup_path=$(find "${buffer_dirname}" -maxdepth 1 -type f -readable -newer "${kak_bufname}" -name "\.${buffer_basename}\.kak\.*" -printf '%A@/%p\n' 2>/dev/null \
| sort -n -t. -k1 | sed -nr 's/^[^\/]+\///;$p')
test ! -z "${latest_backup_path}" || {
echo "eval -draft %{ autorestore-purge-backups }";
exit;
}
## Replace the content of the buffer with the content of the backup file
echo "
@ -24,7 +29,6 @@ def -hidden _autorestore-restore-buffer %{
echo "
hook -group autorestore global BufWritePost (.+/)?${kak_bufname} %{
nop %sh{
echo \"\${kak_opt_autorestore_purge_restored}\" > /tmp/out
if [ \"\${kak_opt_autorestore_purge_restored,,}\" = yes \
-o \"\${kak_opt_autorestore_purge_restored,,}\" = true ]; then
rm -f '${latest_backup_path}'
@ -36,18 +40,19 @@ def -hidden _autorestore-restore-buffer %{
}
## Remove all the backups that have been created for the current buffer
def autorestore-purge-backups %{
def autorestore-purge-backups -docstring "Remove all the backups of the current buffer" %{
nop %sh{
buffer_basename="${kak_bufname##*/}"
buffer_dirname=$(dirname "${kak_bufname}")
find "${buffer_dirname}" -type f -readable -name ".${buffer_basename}.kak.*" -delete 2>/dev/null
find "${buffer_dirname}" -type f -readable -name "\.${buffer_basename}\.kak\.*" -delete 2>/dev/null
}
echo -color 'Information Backup files removed'
}
## If for some reason, backup files need to be ignored
def autorestore-disable %{
def autorestore-disable -docstring "Disable automatic backup recovering" %{
rmhooks global autorestore
}
hook -group autorestore global BufCreate .* %{ _autorestore-restore-buffer }
hook -group autorestore global BufCreate .* %{ autorestore-restore-buffer }