X-Git-Url: https://git.r.bdr.sh/rbdr/blog/blobdiff_plain/fac54389550aaab8bcb4ad1e6b0b1900fd8887d2..24de2f063e5dfcad0086d1dc81de3cf012a00e4c:/lib/blog.js diff --git a/lib/blog.js b/lib/blog.js index 8ae3e21..6b831f7 100644 --- a/lib/blog.js +++ b/lib/blog.js @@ -3,7 +3,7 @@ const { access, mkdir, readdir, readFile, rm, writeFile } = require('fs/promises'); const { exec } = require('child_process'); const { ncp } = require('ncp'); -const { 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'); @@ -70,7 +70,7 @@ module.exports = class Blog { await this._ensurePostsDirectoryExists(); await this._shift(); - await mkdir(join(this.postsDirectory, '0')); + await this._ensurePostsDirectoryExists(join(this.postsDirectory, '0')); await this.update(postLocation); } @@ -126,6 +126,38 @@ module.exports = class Blog { internals.debuglog('Finished publishing'); } + /** + * Publishes the archive to a host using rsync. Currently assumes + * gemlog archive. + * + * @function publishArchive + * @memberof Blog + * @return {Promise} empty promise, returns no value + * @instance + */ + async publishArchive(host) { + + internals.debuglog(`Publishing archive to ${host}`); + try { + await internals.exec('which rsync'); + } + catch (err) { + console.error('Please install rsync to publish the archive.'); + } + + try { + const gemlogPath = resolve(join(__dirname, '../', '.gemlog')); + internals.debuglog(`Reading archive from ${gemlogPath}`); + await internals.exec(`rsync -r ${gemlogPath}/ ${host}`); + } + catch (err) { + console.error('Failed to publish archive'); + console.error(err.stderr); + } + + internals.debuglog('Finished publishing'); + } + // Parses Gemini for each page, copies assets and generates index. async generate() { @@ -196,14 +228,13 @@ 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}`); @@ -235,6 +266,7 @@ module.exports = class Blog { } finally { internals.debuglog(`Adding ${post.location} to ${targetPath}`); + await this._ensureDirectoryExists(targetPath); await internals.ncp(post.location, targetPath); internals.debuglog(`Added ${post.location} to ${targetPath}`); } @@ -277,12 +309,18 @@ 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); + try { + await rm(targetPath, { recursive: true }); + } + finally { + await this._ensureDirectoryExists(targetPath); + internals.debuglog(`Adding ${postLocation} to ${targetPost}`); + await internals.ncp(postLocation, targetPost); + } } // Ensures a directory exists. @@ -295,7 +333,7 @@ module.exports = class Blog { } catch (error) { if (error.code === internals.kFileNotFoundError) { - internals.debuglog('Creating posts directory'); + internals.debuglog(`Creating ${directory}`); await mkdir(directory); return; } @@ -309,19 +347,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