Adds the ability to add files that already exist

Work on #16

This was a relatively large amount of work. It introduces assets which
are stored in the assets sub directory and stored in the database with
the asset type in the database.
This commit is contained in:
Jonathan Hodgson 2020-12-30 16:42:47 +00:00
parent 980eef941b
commit a3bbe9b4a2
4 changed files with 123 additions and 15 deletions

View file

@ -23,6 +23,85 @@ Tags:
editFile "$filename"
}
addFile(){
vecho "addFile $*"
local copiedFile
local subFolder=""
local ext
local file
local filenameTitle
local yaml
local yamlBlock
local yamlTitle
while [[ $1 = -?* ]]; do
case "$1" in
--asset) mkdir -p "${dataDir}assets"; subFolder+="assets/" ;;
--yaml-header) yaml="header" ;;
--yaml-file) yaml="file" ;;
*) die "invalid add option: '$1'." ;;
esac
shift
done
file="$1"
[ -z "$file" ] && die "You must specify a file"
[ -f "$file" ] || die "File $file not found"
ext="${file##*.}"
copiedFile="${file##*/}"
# If the type of yaml entry hasn't been specified on the command line
if [ -z "$yaml" ]; then
# We want a header if it's markdown, otherwise a seperate file
if [ "$ext" = "md" ]; then
yaml="header"
else
yaml="file"
fi
fi
[ -e "$dataDir$copiedFile" ] && die "File $copiedFile already exists"
cp "$file" "$dataDir$subFolder$copiedFile"
# The title as specified in yaml (or empty string)
yamlBlock="$(getYamlBlock "$subFolder$copiedFile")"
yamlTitle="$(getYamlTitle "$subFolder$copiedFile")"
# The title generated from filename
filenameTitle="$(echo "$copiedFile" | tr '_' ' ' | sed -E 's/\..[^.]+$//')"
if [ -z "$yamlTitle" ] || [ "$yamlTitle" = "null" ]; then
# If empty, generate the title from the filename
yamlTitle="$filenameTitle"
else
# If the yaml title and the filename title are different, then use the yaml title
if [ "$yamlTitle" != "$filenameTitle" ]; then
local newFilename=$(escapeFilename "$yamlTitle").$ext
echo mv "$dataDir$subFolder$copiedFile" "$dataDir$subFolder$newFilename"
warn "File renamed from $copiedFile to "$newFilename
copiedFile="$newFilename"
fi
fi
yamlBlock="Title: $yamlTitle
$yamlBlock"
if [ "$yaml" = "header" ]; then
local tmpfile=$(mktemp)
echo "---
$yamlBlock
---" > $tmpfile
sed '1 { /^---/ { :a N; /\n---/! ba; d} }' "$dataDir$subFolder$copiedFile" >> "$tmpfile"
mv "$tmpfile" "$dataDir$subFolder$copiedFile"
else
echo "$yamlBlock" > "$dataDir$subFolder$copiedFile.yaml"
fi
updateFileChange "$subFolder$copiedFile"
}
# Takes the filename as a parameter
editFile(){
vecho "editFile $*"
@ -37,13 +116,23 @@ editFile(){
# This is used to update the DB when a file is changed
# param1 is the file
updateFileChange(){
vecho "updateFileChange $*"
cd "$dataDir" || return
local filename
local directory=""
local title
local newFilename
local filetype="normal"
local ext
filename="$(findFile "$1")"
ext="${filename##*.}"
[ ! -e "$filename" ] && die "No such file $1"
if echo "$filename" | grep -q '^assets/'; then
filetype="asset"
directory="assets/"
fi
title="$(getYamlTitle "$filename")"
newFilename="$(escapeFilename "$title.md")"
newFilename="$directory$(escapeFilename "$title.$ext")"
if [ "$filename" = "$newFilename" ]; then
# The title hasn't changed
# check if the file is in the DB
@ -51,7 +140,7 @@ updateFileChange(){
# If not, add it
echo "INSERT INTO items (filename, title, type)
VALUES ( '$(safeSQL "$filename")',
'$(safeSQL "$title")', 'normal' );" |
'$(safeSQL "$title")', '$(safeSQL "$filetype")' );" |
sqlite3 "${sqliteFile}"
fi
# Make sure all the tags are up to date
@ -76,7 +165,7 @@ Please resolve manually"
# 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' );" |
'$(safeSQL "$title")', '$(safeSQL "$filetype")' );" |
sqlite3 "${sqliteFile}"
fi
@ -86,6 +175,7 @@ Please resolve manually"
}
deleteFile(){
vecho "deleteFile $*"
cd "$dataDir" || return
local filename
local fileID
@ -108,6 +198,7 @@ deleteFile(){
}
viewFile(){
vecho "viewFile $*"
cd "$dataDir" || return
local id="$1"

View file

@ -15,7 +15,8 @@ initKnowledgeBase(){
git init "$dataDir" > "$output"
# TODO: make gitignore use new sqlite file
echo "/knowledgebase.sqlite3" >> "${dataDir}/.gitignore"
# Datadir always has a trailing slash
echo "/knowledgebase.sqlite3" >> "${dataDir}.gitignore"
git -C "$dataDir" add .gitignore > "$output"
git -C "$dataDir" commit -m "Knowledge base initialised" > "$output"

View file

@ -40,8 +40,8 @@ getYamlTitle(){
}
getYamlTags(){
vecho "getYamlTitle $*"
vecho "getYamlTags $*"
cd "$dataDir" || return
getYamlBlock "$1" | yq -r '.Tags | join("\n")'
getYamlBlock "$1" | yq -r '.Tags | if . == null then [] else . end | join("\n")'
}