hlink
Advanced tools
Comparing version 0.6.3 to 0.7.0
import chalk from "chalk"; | ||
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n $ hlink [--Options] [sourceDir] destPath\n\n\u5B50\u547D\u4EE4:\n ").concat(chalk.gray('备份hlink目录缓存等 备份路径'), "\n $ hlink backup /path/to/back\n ").concat(chalk.gray('还原hlink目录缓存等 还原路径'), "\n $ hlink restore /path/to/restore\n ").concat(chalk.gray('移除命令查看帮助'), "\n $ hlink rm --help\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --saveMode,-s \u4FDD\u5B58\u6A21\u5F0F,\u9ED8\u8BA4\u4E3A\u6A21\u5F0F0\n ").concat(chalk.gray("saveMode=1 \u4FDD\u5B58\u4E00\u7EA7\u76EE\u5F55\n saveMode=0 \u4FDD\u5B58\u539F\u6709\u7684\u76F8\u5BF9\u6E90\u5730\u5740\u7684\u8DEF\u5F84"), "\n\n --includeExtname,-i \u5305\u542B\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\n ").concat(chalk.gray("\u5982\u679C\u4E0D\u914D\u7F6E\u8BE5\u9879,\u4F1A\u91C7\u7528\u4EE5\u4E0B\u7B56\u7565\n 1. \u914D\u7F6E\u4E86excludeExtnam,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u6392\u9664\u540E\u7684\u5176\u4ED6\u6587\u4EF6\n 2. \u672A\u914D\u7F6EexcludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6"), "\n\n --excludeExtname,-e \u6392\u9664\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\u5982\u679C\u914D\u7F6E\u4E86").concat(chalk.cyan('includeExtname'), "\u5219\u8BE5\u914D\u7F6E\u65E0\u6548\n\n --mkdirIfSingle,-m \u662F\u5426\u4E3A\u72EC\u7ACB\u6587\u4EF6\u521B\u5EFA\u540C\u540D\u6587\u4EF6\u5939,\u9ED8\u8BA4\u4E3Atrue,\u4F1A\u521B\u5EFA\n\n --openCache,-o \u662F\u5426\u6253\u5F00\u7F13\u5B58,\u9ED8\u8BA4\u4E3Atrue, \u4F1A\u6253\u5F00\n ").concat(chalk.gray('打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链'), "\n\n --configPath,-c \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84,\u8BF7\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\n --generateConfig,-g \u751F\u6210config\u6587\u4EF6,\u53EF\u4EE5\u4F7F\u7528 hlink -g \u67E5\u770B\u8DEF\u5F84\n --removeConfig,-r \u5220\u9664\u914D\u7F6E\u6587\u4EF6\n\n\u4F8B\u5B50:\n ").concat(chalk.grey('# 创建 /share/download 下面文件到目标地址 /share/movie'), "\n $ hlink /share/download /share/movie\n ").concat(chalk.grey('# 生成配置文件'), "\n $ hlink -g"); | ||
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n $ hlink [--Options] [sourceDir] destPath\n\n\u5B50\u547D\u4EE4:\n ").concat(chalk.gray('备份hlink目录缓存等 备份路径'), "\n $ hlink backup /path/to/back\n ").concat(chalk.gray('还原hlink目录缓存等 还原路径'), "\n $ hlink restore /path/to/restore\n ").concat(chalk.gray('移除命令查看帮助'), "\n $ hlink rm --help\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --saveMode,-s \u4FDD\u5B58\u6A21\u5F0F,\u9ED8\u8BA4\u4E3A\u6A21\u5F0F0\n ").concat(chalk.gray("saveMode=1 \u4FDD\u5B58\u4E00\u7EA7\u76EE\u5F55\n saveMode=0 \u4FDD\u5B58\u539F\u6709\u7684\u76F8\u5BF9\u6E90\u5730\u5740\u7684\u8DEF\u5F84"), "\n\n --includeExtname,-i \u5305\u542B\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\n ").concat(chalk.gray("\u5982\u679C\u4E0D\u914D\u7F6E\u8BE5\u9879,\u4F1A\u91C7\u7528\u4EE5\u4E0B\u7B56\u7565\n 1. \u914D\u7F6E\u4E86excludeExtnam,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u6392\u9664\u540E\u7684\u5176\u4ED6\u6587\u4EF6\n 2. \u672A\u914D\u7F6EexcludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6"), "\n\n --excludeExtname,-e \u6392\u9664\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\u5982\u679C\u914D\u7F6E\u4E86").concat(chalk.cyan('includeExtname'), "\u5219\u8BE5\u914D\u7F6E\u65E0\u6548\n\n --mkdirIfSingle,-m \u662F\u5426\u4E3A\u72EC\u7ACB\u6587\u4EF6\u521B\u5EFA\u540C\u540D\u6587\u4EF6\u5939,\u9ED8\u8BA4\u4E3Atrue,\u4F1A\u521B\u5EFA\n\n --openCache,-o \u662F\u5426\u6253\u5F00\u7F13\u5B58,\u9ED8\u8BA4\u4E3Afalse, \u4E0D\u4F1A\u4F1A\u6253\u5F00\n ").concat(chalk.gray('打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链'), "\n\n --configPath,-c \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84,\u8BF7\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\n --generateConfig,-g \u751F\u6210config\u6587\u4EF6,\u53EF\u4EE5\u4F7F\u7528 hlink -g \u67E5\u770B\u8DEF\u5F84\n --removeConfig,-r \u5220\u9664\u914D\u7F6E\u6587\u4EF6\n\n\u4F8B\u5B50:\n ").concat(chalk.grey('# 创建 /share/download 下面文件到目标地址 /share/movie'), "\n $ hlink /share/download /share/movie\n ").concat(chalk.grey('# 生成配置文件'), "\n $ hlink -g"); |
@@ -46,5 +46,5 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
} | ||
function checkDirectory(source, dest) { | ||
export function checkDirectory(source, dest) { | ||
warning(!source || !dest, '必须指定原地址和目标地址'); | ||
warning(!fs.existsSync(source), '源地址不存在,请检查路径是否正确'); | ||
warning(!!source && !fs.existsSync(source), '源地址不存在,请检查路径是否正确'); | ||
warning(source === dest, '源地址和目标地址不能相同'); | ||
@@ -51,0 +51,0 @@ } |
@@ -26,4 +26,5 @@ #!/usr/bin/env node | ||
import meow from 'meow'; | ||
import rm from './bins/rm/index.js'; | ||
import { restore, backup } from './bins/qnap.js'; | ||
import doctor from './bins/doctor.js'; | ||
import prune from './bins/prune/index.js'; | ||
import hlink from './bins/main/index.js'; | ||
@@ -58,2 +59,11 @@ import { log } from './utils.js'; | ||
}, | ||
pruneDir: { | ||
type: 'boolean', | ||
alias: 'p' | ||
}, | ||
withoutConfirm: { | ||
type: 'boolean', | ||
alias: 'w', | ||
"default": false | ||
}, | ||
del: { | ||
@@ -74,18 +84,17 @@ type: 'boolean', | ||
alias: 'c' | ||
}, | ||
watch: { | ||
type: 'boolean', | ||
alias: 'w' | ||
}, | ||
all: { | ||
type: 'boolean', | ||
alias: 'a', | ||
"default": false | ||
} | ||
} | ||
}); | ||
var _a = cli.flags, help = _a.help, watch = _a.watch, all = _a.all, del = _a.del, flags = __rest(_a, ["help", "watch", "all", "del"]); | ||
var _a = cli.flags, help = _a.help, del = _a.del, flags = __rest(_a, ["help", "del"]); | ||
var _b = cli.input, _command = _b[0], inputs = _b.slice(1); | ||
function logDeprecatedRm() { | ||
log.info("".concat(chalk.gray('rm'), " \u547D\u4EE4\u5F7B\u5E95\u5E9F\u9664\uFF0C\u4F7F\u7528\u4F53\u611F\u7279\u522B\u5DEE\uFF0C\u6CA1\u6709\u5B58\u5728\u7684\u610F\u4E49")); | ||
log.info("\u5982\u679C\u4F60\u53EA\u662F\u7B80\u5355\u60F3\u5220\u9664\u786C\u94FE\uFF0C\u8BF7\u4F7F\u7528\u7CFB\u7EDF\u81EA\u5E26\u7684 rm \u547D\u4EE4\uFF0C\u7528\u6CD5\u53EF\u4EE5\u53C2\u8003".concat(chalk.cyan('https://www.linuxcool.com/rm'))); | ||
log.info("\u5982\u679C\u4F60\u53EA\u662F\u5728\u79FB\u9664\u6E90\u6587\u4EF6\u540E\uFF0C\u68C0\u6D4B\u591A\u4F59\u7684\u786C\u94FE\uFF0C\u53EF\u4EE5\u4F7F\u7528 ".concat(chalk.cyan('hlink prune'), " \u6765\u8FDB\u884C")); | ||
} | ||
/** | ||
* @deprecated | ||
*/ | ||
if (del) { | ||
log.warn("\u5DF2\u79FB\u9664 ".concat(chalk.gray('-d'), " \u914D\u7F6E\u9009\u9879\uFF0C\u8BF7\u4F7F\u7528 ").concat(chalk.cyan('hlink rm'), " \u66FF\u4EE3,\u8BE6\u60C5\u89C1 ").concat(chalk.cyan('hlink rm --help'))); | ||
logDeprecatedRm; | ||
process.exit(0); | ||
@@ -100,8 +109,14 @@ } | ||
break; | ||
case 'doctor': | ||
doctor(); | ||
break; | ||
case 'remove': | ||
case 'rm': | ||
rm(inputs, { | ||
watch: watch, | ||
logDeprecatedRm(); | ||
break; | ||
case 'prune': | ||
prune(inputs[0], inputs[1], { | ||
help: help, | ||
all: all | ||
pruneDir: flags.pruneDir, | ||
withoutConfirm: flags.withoutConfirm | ||
}); | ||
@@ -108,0 +123,0 @@ break; |
@@ -0,8 +1,13 @@ | ||
import { execaSync } from 'execa'; | ||
import fs from 'fs-extra'; | ||
import path from 'path'; | ||
import os from 'os'; | ||
import { hlinkHomeDir } from '../paths.js'; | ||
var Config = /** @class */ (function () { | ||
function Config(filename, defaultValue, saveDir) { | ||
saveDir = saveDir || path.join(os.homedir(), '.hlink'); | ||
saveDir = saveDir || hlinkHomeDir; | ||
if (process.env.NODE_ENV === 'development') { | ||
saveDir = path.resolve('hlink'); | ||
} | ||
this.jsonPath = path.join(saveDir, filename); | ||
this.backupPath = this.jsonPath + '_backup'; | ||
this.saveDir = saveDir; | ||
@@ -24,3 +29,3 @@ this.defaultValue = defaultValue; | ||
fs.writeJSONSync(_this.jsonPath, content, { | ||
spaces: 2 | ||
spaces: 0 | ||
}); | ||
@@ -41,4 +46,37 @@ }, 20); | ||
}; | ||
Config.prototype.backup = function () { | ||
if (!this.exist(true) && this.exist()) { | ||
try { | ||
execaSync('cp', [this.jsonPath, this.backupPath]); | ||
this.rm(); | ||
} | ||
catch (e) { } | ||
} | ||
}; | ||
Config.prototype.restore = function () { | ||
if (this.exist(true) && !this.exist()) { | ||
try { | ||
execaSync('cp', [this.backupPath, this.jsonPath]); | ||
this.rm(true); | ||
} | ||
catch (e) { } | ||
} | ||
}; | ||
Config.prototype.exist = function (backup) { | ||
if (backup === void 0) { backup = false; } | ||
try { | ||
return fs.existsSync(backup ? this.backupPath : this.jsonPath); | ||
} | ||
catch (e) { | ||
return false; | ||
} | ||
}; | ||
Config.prototype.rm = function (backup) { | ||
if (backup === void 0) { backup = false; } | ||
if (this.exist(backup)) { | ||
execaSync('rm', [backup ? this.backupPath : this.jsonPath]); | ||
} | ||
}; | ||
return Config; | ||
}()); | ||
export default Config; |
@@ -36,7 +36,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | ||
} | ||
function filter(records, pathOrNumber) { | ||
if (Number.isNaN(Number(pathOrNumber))) { | ||
function filter(records, pathOrINode) { | ||
if (Number.isNaN(Number(pathOrINode))) { | ||
return records.filter(function (_a) { | ||
var source = _a.source, dest = _a.dest; | ||
return makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrNumber) === -1; | ||
return makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrINode) === -1; | ||
}); | ||
@@ -47,10 +47,10 @@ } | ||
var inode = _a.inode; | ||
return inode !== pathOrNumber; | ||
return inode !== pathOrINode; | ||
}); | ||
} | ||
} | ||
export function deleteRecord(filePathOrNumber) { | ||
export function deleteRecord(filepathOrINode) { | ||
var records = fileRecord.read(); | ||
if (Array.isArray(filePathOrNumber)) { | ||
filePathOrNumber.forEach(function (n) { | ||
if (Array.isArray(filepathOrINode)) { | ||
filepathOrINode.forEach(function (n) { | ||
records = filter(records, n); | ||
@@ -60,13 +60,13 @@ }); | ||
else { | ||
records = records = filter(records, filePathOrNumber); | ||
records = records = filter(records, filepathOrINode); | ||
} | ||
fileRecord.write(records); | ||
} | ||
function find(records, pathOrNumber, delAll) { | ||
function find(records, pathOrINode, delAll) { | ||
var inodes = []; | ||
var files = makeOnly(records.reduce(function (result, _a) { | ||
var source = _a.source, dest = _a.dest, inode = _a.inode; | ||
if (Number.isNaN(Number(pathOrNumber)) | ||
? makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrNumber) > -1 | ||
: inode === pathOrNumber) { | ||
if (Number.isNaN(Number(pathOrINode)) | ||
? makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrINode) > -1 | ||
: inode === pathOrINode) { | ||
inodes.push(inode); | ||
@@ -86,7 +86,7 @@ result = result.concat(dest); | ||
} | ||
export function findFilesFromRecord(filePathOrNumber, delAll) { | ||
export function findFilesFromRecord(filepathOrINode, delAll) { | ||
if (delAll === void 0) { delAll = false; } | ||
var record = fileRecord.read(); | ||
if (Array.isArray(filePathOrNumber)) { | ||
return filePathOrNumber.reduce(function (result, file) { | ||
if (Array.isArray(filepathOrINode)) { | ||
return filepathOrINode.reduce(function (result, file) { | ||
var re = find(record, file, delAll); | ||
@@ -99,4 +99,4 @@ result.files = result.files.concat(makeOnly(re.files)); | ||
else { | ||
return find(record, filePathOrNumber, delAll); | ||
return find(record, filepathOrINode, delAll); | ||
} | ||
} |
@@ -16,3 +16,4 @@ import lsirf from "./lsirf.js"; | ||
} | ||
export function getList(dir) { | ||
export function getList(dir, ignoreError) { | ||
if (ignoreError === void 0) { ignoreError = false; } | ||
var files = []; | ||
@@ -22,3 +23,5 @@ var inodes = []; | ||
var fileAndInodeMap = {}; | ||
parseLs(dir, function (inode, fullPath) { | ||
var results = parseLs(dir, ignoreError); | ||
results.forEach(function (result) { | ||
var inode = result.inode, fullPath = result.fullPath; | ||
if (inodes.indexOf(inode) === -1) { | ||
@@ -25,0 +28,0 @@ files.push(fullPath); |
import path from 'path'; | ||
import parseFilePath from './parseFilePath.js'; | ||
import lsirf from './lsirf.js'; | ||
function parseLs(dir, callback, ignoreError) { | ||
function parseLs(dir, ignoreError) { | ||
if (ignoreError === void 0) { ignoreError = false; } | ||
@@ -10,2 +10,3 @@ var str = lsirf(dir, ignoreError); | ||
var prevIsBlank = true; // 记录上一行是否是空行 | ||
var results = []; | ||
files.forEach(function (file) { | ||
@@ -27,7 +28,11 @@ // 上一行是空行,并且是:结尾,表示是目录 | ||
prevIsBlank = false; | ||
var _a = parseFilePath(file, currentDir), number = _a[0], fullPath = _a[1]; | ||
callback(number, fullPath); | ||
var _a = parseFilePath(file, currentDir), inode = _a[0], fullPath = _a[1]; | ||
results.push({ | ||
inode: inode, | ||
fullPath: fullPath | ||
}); | ||
} | ||
}); | ||
return results; | ||
} | ||
export default parseLs; |
@@ -10,1 +10,2 @@ import path from 'path'; | ||
export var fileRecord = new Config('files.json', []); | ||
export var newFileRecord = new Config('record-files.json', []); |
@@ -241,1 +241,26 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
} | ||
/** | ||
* | ||
* @param _paths 路劲集合 | ||
* @returns 返回_paths的公共父目录 | ||
* | ||
* _paths = ['/a/c/d/e', '/a/b/c/d/e'] | ||
* result = '/a/' | ||
* | ||
*/ | ||
export function findParent(_paths) { | ||
var paths = __spreadArray([], _paths, true); | ||
if (!paths.length) | ||
return ''; | ||
/** | ||
* 排序,把最短的路劲排到最前面 | ||
*/ | ||
paths = paths.sort(function (a, b) { return a.split(path.sep).length - b.split(path.sep).length; }); | ||
var firstItem = paths.shift(); // 这里必有 | ||
var dirname = path.join(path.dirname(firstItem), '/'); | ||
// 如果paths里面每个都包含了最短路劲,说明最短路劲就算所有路劲的目录了 | ||
while (!paths.every(function (p) { return p.includes(dirname); })) { | ||
dirname = path.join(path.dirname(dirname), '/'); | ||
} | ||
return dirname; | ||
} |
{ | ||
"name": "hlink", | ||
"version": "0.6.3", | ||
"version": "0.7.0", | ||
"description": "hlink", | ||
@@ -25,2 +25,4 @@ "license": "MIT", | ||
"prepublishOnly": "npm run build", | ||
"rm": "rm /usr/local/bin/hlink ", | ||
"env": "ln -s $PWD/lib/cli-dev.js /usr/local/bin/hlink && chmod +x ./lib/cli-dev.js", | ||
"np": "np --no-cleanup --no-tests --no-yarn", | ||
@@ -27,0 +29,0 @@ "np:beta": "np --tag=beta --any-branch --no-cleanup --no-tests --no-yarn", |
@@ -31,3 +31,3 @@ # hlink | ||
## 教程 | ||
- [威联通开机启动添加环境变量](./qnap.md) | ||
- [威联通开机启动添加环境变量](./docs/qnap.md) | ||
@@ -34,0 +34,0 @@ ## 更新日志 |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
1802
89144
29
12