knowledge-base/inc/file-management
Jonathan Hodgson caab854c09 Adds update command for externally modified files
This can be used when a file is modified externally. It will update the
sqlite database and potentially run git commands for the change.

If there are 2 files provided, it assumes that the file was moved. The
first filename should be the old file.

The new, edit and delete functions were also re factored slightly to use
this new update function.

Relevant to #4
Close #2
Close #1
2020-12-20 20:04:52 +00:00

111 lines
2.8 KiB
Bash

#!/usr/bin/env bash
# This file contains functions relating to file operations such as new, edit and deleting files
newFile(){
vecho "newFile $*"
cd "$dataDir" || return
# While there is a - at the begining
local title="$*"
if [ -z "$title" ]; then
echo -n "Enter a title: "
read -r title
fi
local filename
filename="$(escapeFilename "$title.md")"
[ -e "$filename" ] && die "$filename already exists"
echo -e "---
Title: $title
Tags:
-
---
" > "$filename"
editFile "$filename"
}
# Takes the filename as a parameter
editFile(){
vecho "editFile $*"
cd "$dataDir" || return
local filename
filename="$(findFile "$*")"
[ ! -e "$filename" ] && exit 1
"$editor" "$filename"
updateFileChange "$filename"
}
# This is used to update the DB when a file is changed
# param1 is the file
updateFileChange(){
local filename
local title
local newFilename
filename="$(findFile "$1")"
[ ! -e "$filename" ] && die "No such file $1"
title="$(getYamlTitle "$filename")"
newFilename="$(escapeFilename "$title.md")"
echo "Filename: '$filename'
new filename: '$newFilename'"
if [ "$filename" = "$newFilename" ]; then
# The title hasn't changed
# check if the file is in the DB
if ! fileInDB "$filename"; then
# If not, add it
echo "INSERT INTO items (filename, title, type)
VALUES ( '$(safeSQL "$filename")',
'$(safeSQL "$title")', 'normal' );" |
sqlite3 "${sqliteFile}"
fi
# Make sure all the tags are up to date
getYamlTags "$filename" | assignTags "$filename"
gitChange "$filename"
else
# The title has changed so we need to move the file
if [ -e "$newFilename" ]; then
# If the place we need to move it to already exists, die
die -e "$newFilename already exists
$filename title changed
Please resolve manually"
else
mv "$filename" "$newFilename"
if fileInDB "$filename"; then
echo "UPDATE items
SET (filename,title) =
('$(safeSQL "$newFilename")','$(safeSQL "$title")')
WHERE filename = '$(safeSQL "$filename")';" |
sqlite3 "${sqliteFile}"
else
# We get here if the title was changed in the create process
echo "INSERT INTO items (filename, title, type)
VALUES ( '$(safeSQL "$newFilename")',
'$(safeSQL "$title")', 'normal' );" |
sqlite3 "${sqliteFile}"
fi
gitChange "$filename" "$newFilename"
fi
fi
}
deleteFile(){
cd "$dataDir" || return
local filename
local fileID
local rsp
filename="$(findFile "$1")"
fileID="$(findFileId "$filename")"
[ ! -e "$filename" ] && exit 1
echo -n "Are you sure? [yN] "
read -r rsp
if [[ "$(echo "$rsp" | tr '[:upper:]' '[:lower:]')" = "y"* ]]; then
rm "$filename"
# This deletes the file from the sql database and any tag links
echo "DELETE FROM items
WHERE id = '$(safeSQL "$fileID")';
DELETE FROM links
WHERE itemID = '$(safeSQL "$fileID")';" |
sqlite3 --column --header "${sqliteFile}"
gitChange "$filename"
fi
}