X-Git-Url: https://git.r.bdr.sh/rbdr/blog/blobdiff_plain/65d379f5db381423165e0da8cc788f85112873b8..c5cbbd3835ccd509179504cdf7d5e74356d7dca5:/lib/blog.js diff --git a/lib/blog.js b/lib/blog.js index ff52554..ba9ae53 100644 --- a/lib/blog.js +++ b/lib/blog.js @@ -1,9 +1,8 @@ 'use strict'; -const { access, mkdir, readdir, readFile, rm, writeFile } = require('fs/promises'); +const { access, cp, mkdir, readdir, readFile, rm, writeFile } = require('fs/promises'); const { exec } = require('child_process'); -const { ncp } = require('ncp'); -const { resolve, join } = require('path'); +const { basename, resolve, join } = require('path'); const ParseGemini = require('gemini-to-html/parse'); const RenderGemini = require('gemini-to-html/render'); const { debuglog, promisify } = require('util'); @@ -19,11 +18,14 @@ const TXTGenerator = require('./generators/txt'); const GemlogArchiver = require('./archivers/gemlog'); +// Remote Handler + +const Remote = require('./remote'); + const internals = { // Promisified functions exec: promisify(exec), - ncp: promisify(ncp), debuglog: debuglog('blog'), @@ -69,8 +71,12 @@ module.exports = class Blog { async add(postLocation) { await this._ensurePostsDirectoryExists(); + try { + await this.syncDown(); + } + catch {}; await this._shift(); - await mkdir(join(this.postsDirectory, '0')); + await this._ensurePostsDirectoryExists(join(this.postsDirectory, '0')); await this.update(postLocation); } @@ -86,6 +92,10 @@ module.exports = class Blog { */ async update(postLocation) { + try { + await this.syncDown(); + } + catch {}; const metadata = await this._getMetadata(); await this._ensurePostsDirectoryExists(); await this._copyPost(postLocation); @@ -94,6 +104,10 @@ module.exports = class Blog { await this._archive(postLocation); await this.generate(); + try { + await this.syncUp(); + } + catch {}; } /** @@ -158,6 +172,55 @@ module.exports = class Blog { internals.debuglog('Finished publishing'); } + /** + * Adds a remote + * + * @function addRemote + * @memberof Blog + * @return {Promise} empty promise, returns no value + * @instance + */ + async addRemote(remote) { + await Remote.add(this.remoteConfig, remote) + } + + /** + * Removes a remote + * + * @function removeRemote + * @memberof Blog + * @return {Promise} empty promise, returns no value + * @instance + */ + async removeRemote() { + await Remote.remove(this.remoteConfig) + } + + + /** + * Pulls the posts and archive from the remote + * + * @function syncDown + * @memberof Blog + * @return {Promise} empty promise, returns no value + * @instance + */ + async syncDown() { + await Remote.syncDown(this.remoteConfig, this.blogDirectory) + } + + /** + * Pushes the posts and archive to the remote + * + * @function syncUp + * @memberof Blog + * @return {Promise} empty promise, returns no value + * @instance + */ + async syncUp() { + await Remote.syncUp(this.remoteConfig, this.blogDirectory) + } + // Parses Gemini for each page, copies assets and generates index. async generate() { @@ -228,18 +291,17 @@ module.exports = class Blog { async _shift() { - for (let i = this.maxPosts - 1; i >= 0; --i) { + for (let i = this.maxPosts - 1; i >= 1; --i) { const targetPath = join(this.postsDirectory, `${i}`); const sourcePath = join(this.postsDirectory, `${i - 1}`); try { internals.debuglog(`Archiving ${targetPath}`); - await rm(targetPath, { recursive: true }); - + await rm(targetPath, { recursive: true, force: true }); await access(sourcePath); // check the source path internals.debuglog(`Shifting blog post ${sourcePath} to ${targetPath}`); - await internals.ncp(sourcePath, targetPath); + await cp(sourcePath, targetPath, { recursive: true }); } catch (error) { if (error.code === internals.kFileNotFoundError) { @@ -261,15 +323,12 @@ module.exports = class Blog { const targetPath = join(this.archiveDirectory, post.id); - try { - internals.debuglog(`Removing ${targetPath}`); - await rm(targetPath, { recursive: true }); - } - finally { - internals.debuglog(`Adding ${post.location} to ${targetPath}`); - await internals.ncp(post.location, targetPath); - internals.debuglog(`Added ${post.location} to ${targetPath}`); - } + internals.debuglog(`Removing ${targetPath}`); + await rm(targetPath, { recursive: true, force: true }); + internals.debuglog(`Adding ${post.location} to ${targetPath}`); + await this._ensureDirectoryExists(targetPath); + await cp(post.location, targetPath, { recursive: true }); + internals.debuglog(`Added ${post.location} to ${targetPath}`); } // Attempts to read existing metadata. Otherwise generates new set. @@ -309,12 +368,15 @@ module.exports = class Blog { async _copyPost(postLocation) { const targetPath = join(this.postsDirectory, '0'); + const postName = basename(postLocation); + const targetPost = join(targetPath, postName); internals.debuglog(`Removing ${targetPath}`); - await rm(targetPath, { recursive: true }); - - internals.debuglog(`Adding ${postLocation} to ${targetPath}`); - await internals.ncp(postLocation, targetPath); + await rm(targetPath, { recursive: true, force: true }); + await this._ensureDirectoryExists(targetPath); + internals.debuglog(`Adding ${postLocation} to ${targetPost}`); + await cp(postLocation, targetPost, { recursive: true }); + internals.debuglog(`Added ${postLocation} to ${targetPath}`); } // Ensures a directory exists. @@ -327,8 +389,8 @@ module.exports = class Blog { } catch (error) { if (error.code === internals.kFileNotFoundError) { - internals.debuglog('Creating posts directory'); - await mkdir(directory); + internals.debuglog(`Creating ${directory}`); + await mkdir(directory, { recursive: true }); return; } @@ -341,19 +403,6 @@ module.exports = class Blog { async _ensurePostsDirectoryExists() { return this._ensureDirectoryExists(this.postsDirectory); - internals.debuglog(`Checking if ${this.postsDirectory} exists.`); - try { - await access(this.postsDirectory); - } - catch (error) { - if (error.code === internals.kFileNotFoundError) { - internals.debuglog('Creating posts directory'); - await mkdir(this.postsDirectory); - return; - } - - throw error; - } } // Looks for a `.gmi` file in the blog directory, and returns the path