]> git.r.bdr.sh - rbdr/blog/commitdiff
Remove force rms and dependency on ncp
authorRuben Beltran del Rio <redacted>
Fri, 9 Dec 2022 21:18:26 +0000 (22:18 +0100)
committerRuben Beltran del Rio <redacted>
Fri, 9 Dec 2022 21:18:26 +0000 (22:18 +0100)
lib/archivers/gemlog.js
lib/blog.js
lib/constants.js [new file with mode: 0644]
lib/generators/static.js
lib/remote.js
lib/utils.js [new file with mode: 0644]
package-lock.json
package.json

index 50bb33407c7da12fc2f0356c9eb3af15d188c670..3e08be4de7ad4de6bfcd5b08f5ac6c14466a75f4 100644 (file)
@@ -1,14 +1,13 @@
-const { mkdir, readdir, rm, writeFile } = require('fs/promises');
-const { debuglog, promisify } = require('util');
-const { ncp } = require('ncp');
+const { cp, mkdir, readdir, writeFile } = require('fs/promises');
+const { debuglog } = require('util');
 const { resolve, join } = require('path');
 const { resolve, join } = require('path');
+const { rmIfExists } = require('../utils');
 
 const internals = {
   kArchiveName: resolve(join(__dirname, '../..', '.gemlog')),
   kIndexName: 'index.gmi',
   kGeminiRe: /\.gmi$/i,
 
 
 const internals = {
   kArchiveName: resolve(join(__dirname, '../..', '.gemlog')),
   kIndexName: 'index.gmi',
   kGeminiRe: /\.gmi$/i,
 
-  ncp: promisify(ncp),
   debuglog: debuglog('blog'),
 
   buildUrl(id, slug) {
   debuglog: debuglog('blog'),
 
   buildUrl(id, slug) {
@@ -53,7 +52,7 @@ module.exports = async function(archiveDirectory) {
 
   try {
     internals.debuglog('Removing index');
 
   try {
     internals.debuglog('Removing index');
-    await rm(internals.kArchiveName, { recursive: true });
+    await rmIfExists(internals.kArchiveName);
   }
   finally {
     internals.debuglog('Creating index');
   }
   finally {
     internals.debuglog('Creating index');
@@ -62,6 +61,6 @@ module.exports = async function(archiveDirectory) {
     await writeFile(indexFile, index);
 
     internals.debuglog('Copying posts to archive');
     await writeFile(indexFile, index);
 
     internals.debuglog('Copying posts to archive');
-    await internals.ncp(archiveDirectory, internals.kArchiveName);
+    await cp(archiveDirectory, internals.kArchiveName, { recursive: true });
   }
 };
   }
 };
index 0b291dfa71b8c00dd40438c30e5728459f38ae52..d2acbb48d2c11739b4cdf09bd50f915962200f9e 100644 (file)
@@ -1,11 +1,13 @@
 'use strict';
 
 'use strict';
 
-const { access, cp, mkdir, readdir, readFile, rm, writeFile } = require('fs/promises');
+const { access, cp, mkdir, readdir, readFile, writeFile } = require('fs/promises');
 const { exec } = require('child_process');
 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');
 const { exec } = require('child_process');
 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');
+const { ensureDirectoryExists, rmIfExists } = require('./utils');
+const { kFileNotFoundError } = require('./constants');
 
 // Generators for the Blog
 
 
 // Generators for the Blog
 
@@ -31,7 +33,6 @@ const internals = {
 
   // constants
 
 
   // constants
 
-  kFileNotFoundError: 'ENOENT',
   kGeminiRe: /\.gmi$/i,
   kMetadataFilename: 'metadata.json',
 
   kGeminiRe: /\.gmi$/i,
   kMetadataFilename: 'metadata.json',
 
@@ -70,15 +71,15 @@ module.exports = class Blog {
    */
   async add(postLocation) {
 
    */
   async add(postLocation) {
 
-    await this._ensurePostsDirectoryExists();
+    await ensureDirectoryExists(this.postsDirectory);
     try {
       await this.syncDown();
     }
     catch {};
     await this._shift();
     const firstDirectory = join(this.postsDirectory, '0'); 
     try {
       await this.syncDown();
     }
     catch {};
     await this._shift();
     const firstDirectory = join(this.postsDirectory, '0'); 
-    await rm(firstDirectory, { recursive: true, force: true });
-    await this._ensurePostsDirectoryExists(firstDirectory);
+    await rmIfExists(firstDirectory);
+    await ensureDirectoryExists(firstDirectory);
     await this._update(postLocation);
   }
 
     await this._update(postLocation);
   }
 
@@ -221,7 +222,7 @@ module.exports = class Blog {
   async _update(postLocation) {
 
     const metadata = await this._getMetadata();
   async _update(postLocation) {
 
     const metadata = await this._getMetadata();
-    await this._ensurePostsDirectoryExists();
+    await ensureDirectoryExists(this.postsDirectory);
     await this._copyPost(postLocation);
     await this._writeMetadata(metadata);
 
     await this._copyPost(postLocation);
     await this._writeMetadata(metadata);
 
@@ -263,7 +264,7 @@ module.exports = class Blog {
         posts.push(await this._readPost(i));
       }
       catch (error) {
         posts.push(await this._readPost(i));
       }
       catch (error) {
-        if (error.code === internals.kFileNotFoundError) {
+        if (error.code === kFileNotFoundError) {
           internals.debuglog(`Skipping ${i}`);
           continue;
         }
           internals.debuglog(`Skipping ${i}`);
           continue;
         }
@@ -311,14 +312,14 @@ module.exports = class Blog {
 
       try {
         internals.debuglog(`Archiving ${targetPath}`);
 
       try {
         internals.debuglog(`Archiving ${targetPath}`);
-        await rm(targetPath, { recursive: true, force: true });
+        await rmIfExists(targetPath);
         await access(sourcePath); // check the source path
 
         internals.debuglog(`Shifting blog post ${sourcePath} to ${targetPath}`);
         await cp(sourcePath, targetPath, { recursive: true });
       }
       catch (error) {
         await access(sourcePath); // check the source path
 
         internals.debuglog(`Shifting blog post ${sourcePath} to ${targetPath}`);
         await cp(sourcePath, targetPath, { recursive: true });
       }
       catch (error) {
-        if (error.code === internals.kFileNotFoundError) {
+        if (error.code === kFileNotFoundError) {
           internals.debuglog(`Skipping ${sourcePath}: Does not exist.`);
           continue;
         }
           internals.debuglog(`Skipping ${sourcePath}: Does not exist.`);
           continue;
         }
@@ -333,14 +334,14 @@ module.exports = class Blog {
   async _archive() {
     internals.debuglog('Archiving post');
     const post = await this._readPost(0);
   async _archive() {
     internals.debuglog('Archiving post');
     const post = await this._readPost(0);
-    await this._ensureDirectoryExists(this.archiveDirectory);
+    await ensureDirectoryExists(this.archiveDirectory);
 
     const targetPath = join(this.archiveDirectory, post.id);
 
     internals.debuglog(`Removing ${targetPath}`);
 
     const targetPath = join(this.archiveDirectory, post.id);
 
     internals.debuglog(`Removing ${targetPath}`);
-    await rm(targetPath, { recursive: true, force: true });
+    await rmIfExists(targetPath);
     internals.debuglog(`Adding ${post.location} to ${targetPath}`);
     internals.debuglog(`Adding ${post.location} to ${targetPath}`);
-    await this._ensureDirectoryExists(targetPath);
+    await ensureDirectoryExists(targetPath);
     await cp(post.location, targetPath, { recursive: true });
     internals.debuglog(`Added ${post.location} to ${targetPath}`);
   }
     await cp(post.location, targetPath, { recursive: true });
     internals.debuglog(`Added ${post.location} to ${targetPath}`);
   }
@@ -386,39 +387,13 @@ module.exports = class Blog {
     const targetPost = join(targetPath, postName);
 
     internals.debuglog(`Removing ${targetPath}`);
     const targetPost = join(targetPath, postName);
 
     internals.debuglog(`Removing ${targetPath}`);
-    await rm(targetPath, { recursive: true, force: true });
-    await this._ensureDirectoryExists(targetPath);
+    await rmIfExists(targetPath);
+    await ensureDirectoryExists(targetPath);
     internals.debuglog(`Adding ${postLocation} to ${targetPost}`);
     await cp(postLocation, targetPost, { recursive: true });
     internals.debuglog(`Added ${postLocation} to ${targetPath}`);
   }
 
     internals.debuglog(`Adding ${postLocation} to ${targetPost}`);
     await cp(postLocation, targetPost, { recursive: true });
     internals.debuglog(`Added ${postLocation} to ${targetPath}`);
   }
 
-  // Ensures a directory exists.
-
-  async _ensureDirectoryExists(directory) {
-
-    internals.debuglog(`Checking if ${directory} exists.`);
-    try {
-      await access(directory);
-    }
-    catch (error) {
-      if (error.code === internals.kFileNotFoundError) {
-        internals.debuglog(`Creating ${directory}`);
-        await mkdir(directory, { recursive: true });
-        return;
-      }
-
-      throw error;
-    }
-  }
-
-  // Ensures posts directory exists
-
-  async _ensurePostsDirectoryExists() {
-
-    return this._ensureDirectoryExists(this.postsDirectory);
-  }
-
   // Looks for a `.gmi` file in the blog directory, and returns the path
 
   async _findBlogContent(directory) {
   // Looks for a `.gmi` file in the blog directory, and returns the path
 
   async _findBlogContent(directory) {
diff --git a/lib/constants.js b/lib/constants.js
new file mode 100644 (file)
index 0000000..9b4ce31
--- /dev/null
@@ -0,0 +1,3 @@
+module.exports = {
+  kFileNotFoundError: 'ENOENT',
+};
index 4713ea7dca51c841fcd695d46c1a377c1643b714..416076c966e084d06bd5d1680cedbfbc238b1282 100644 (file)
@@ -1,14 +1,13 @@
 'use strict';
 
 'use strict';
 
-const { access, rm } = require('fs/promises');
-const { ncp } = require('ncp');
+const { access, cp } = require('fs/promises');
 const { join } = require('path');
 const { join } = require('path');
-const { debuglog, promisify } = require('util');
+const { debuglog } = require('util');
+const { rmIfExists } = require('../utils');
+const { kFileNotFoundError } = require('../constants');
 
 const internals = {
 
 const internals = {
-  ncp: promisify(ncp),
   debuglog: debuglog('blog'),
   debuglog: debuglog('blog'),
-
   kAssetsDirectoryName: 'assets'
 };
 
   kAssetsDirectoryName: 'assets'
 };
 
@@ -25,7 +24,7 @@ module.exports = async function StaticGenerator(source, target, posts) {
   const assetsTarget = join(target, internals.kAssetsDirectoryName);
 
   internals.debuglog(`Removing ${assetsTarget}`);
   const assetsTarget = join(target, internals.kAssetsDirectoryName);
 
   internals.debuglog(`Removing ${assetsTarget}`);
-  await rm(assetsTarget, { recursive: true, force: true });
+  await rmIfExists(assetsTarget);
 
   for (let i = 0; i < posts.length; ++i) {
     const postSourcePath = join(source, `${i}`);
 
   for (let i = 0; i < posts.length; ++i) {
     const postSourcePath = join(source, `${i}`);
@@ -36,10 +35,10 @@ module.exports = async function StaticGenerator(source, target, posts) {
       const assetsSource = join(postSourcePath, internals.kAssetsDirectoryName);
 
       internals.debuglog(`Copying ${assetsSource} to ${assetsTarget}`);
       const assetsSource = join(postSourcePath, internals.kAssetsDirectoryName);
 
       internals.debuglog(`Copying ${assetsSource} to ${assetsTarget}`);
-      await internals.ncp(assetsSource, assetsTarget);
+      await cp(assetsSource, assetsTarget, { recursive: true });
     }
     catch (error) {
     }
     catch (error) {
-      if (error.code === internals.kFileNotFoundError) {
+      if (error.code === kFileNotFoundError) {
         internals.debuglog(`Skipping ${i}`);
         continue;
       }
         internals.debuglog(`Skipping ${i}`);
         continue;
       }
index 8b29c4e6f6bf7d91d3c97ac9fea39f0aa1d4fbbc..373958fb320cd8e5fe75b4f2875ba171680120e5 100644 (file)
@@ -1,4 +1,5 @@
-const { readFile, rm, writeFile } = require('fs/promises');
+const { readFile, writeFile } = require('fs/promises');
+const { rmIfExists } = require('./utils');
 
 const internals = {
   strings: {
 
 const internals = {
   strings: {
@@ -17,7 +18,7 @@ module.exports = {
 
   async remove(remoteConfig) {
 
 
   async remove(remoteConfig) {
 
-    await rm(remoteConfig, { force: true })
+    await rmIfExists(remoteConfig);
   },
 
   async syncUp(remoteConfig, blogDirectory) {
   },
 
   async syncUp(remoteConfig, blogDirectory) {
diff --git a/lib/utils.js b/lib/utils.js
new file mode 100644 (file)
index 0000000..24b9407
--- /dev/null
@@ -0,0 +1,36 @@
+const { access, constants, mkdir, rm } = require('fs/promises');
+const { kFileNotFoundError } = require('./constants');
+
+// File system utilities
+
+module.exports = {
+  async rmIfExists(location) {
+
+    try {
+      await access(location, constants.F_OK);
+      await rm(location, { recursive: true });
+    }
+    catch (error) {
+      if (error.code === kFileNotFoundError) {
+        return;
+      }
+
+      throw error;
+    }
+  },
+
+  async ensureDirectoryExists(directory) {
+
+    try {
+      await access(directory);
+    }
+    catch (error) {
+      if (error.code === kFileNotFoundError) {
+        await mkdir(directory, { recursive: true });
+        return;
+      }
+
+      throw error;
+    }
+  }
+};
index 4dfb22809ddd84693b26ad64d226809deeab69d4..ac0d1bda4fd77f14543db30e8be50388010c0583 100644 (file)
     "node_modules/ncp": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
     "node_modules/ncp": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
-      "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
+      "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==",
       "bin": {
         "ncp": "bin/ncp"
       }
       "bin": {
         "ncp": "bin/ncp"
       }
     "ncp": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
     "ncp": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
-      "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M="
+      "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA=="
     },
     "neo-async": {
       "version": "2.6.2",
     },
     "neo-async": {
       "version": "2.6.2",
index 1df9fb34b772d4376c4f46b5ab5c76c7d25f0c8e..81d26a818c4b73afcf1dfb58bc5e26cccc2fc814 100644 (file)
@@ -13,9 +13,9 @@
   },
   "repository": {
     "type": "git",
   },
   "repository": {
     "type": "git",
-    "url": "git+https://gitlab.com/rbdr/blog.git"
+    "url": "git+https://git.sr.ht/~rbdr/blog"
   },
   },
-  "author": "Ben Beltran <ben@nsovocal.com>",
+  "author": "Ruben Beltran del Rio <ruben@unlimited.pizza>",
   "license": "Apache-2.0",
   "bugs": {
     "url": "https://gitlab.com/rbdr/blog/issues"
   "license": "Apache-2.0",
   "bugs": {
     "url": "https://gitlab.com/rbdr/blog/issues"
@@ -26,8 +26,7 @@
     "entities": "^3.0.1",
     "gemini-to-html": "^2.1.0",
     "getenv": "^1.0.0",
     "entities": "^3.0.1",
     "gemini-to-html": "^2.1.0",
     "getenv": "^1.0.0",
-    "minimist": "^1.2.5",
-    "ncp": "^2.0.0"
+    "minimist": "^1.2.5"
   },
   "devDependencies": {
     "@hapi/eslint-plugin": "^5.1.0",
   },
   "devDependencies": {
     "@hapi/eslint-plugin": "^5.1.0",
@@ -35,6 +34,6 @@
     "jsdoc-to-markdown": "^7.1.0"
   },
   "engines": {
     "jsdoc-to-markdown": "^7.1.0"
   },
   "engines": {
-    "node": ">=14.0.0"
+    "node": ">=18.0.0"
   }
 }
   }
 }