You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.6 KiB
113 lines
2.6 KiB
2 months ago
|
#!/usr/bin/env node
|
||
|
const touch = require("../index.js")
|
||
|
|
||
|
const usage = code => {
|
||
|
console[code ? 'error' : 'log'](
|
||
|
'usage:\n' +
|
||
|
'touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...'
|
||
|
)
|
||
|
process.exit(code)
|
||
|
}
|
||
|
|
||
|
const singleFlags = {
|
||
|
a: 'atime',
|
||
|
m: 'mtime',
|
||
|
c: 'nocreate',
|
||
|
f: 'force'
|
||
|
}
|
||
|
|
||
|
const singleOpts = {
|
||
|
r: 'ref',
|
||
|
t: 'time'
|
||
|
}
|
||
|
|
||
|
const files = []
|
||
|
const args = process.argv.slice(2)
|
||
|
const options = {}
|
||
|
for (let i = 0; i < args.length; i++) {
|
||
|
const arg = args[i]
|
||
|
if (!arg.match(/^-/)) {
|
||
|
files.push(arg)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
// expand shorthands
|
||
|
if (arg.charAt(1) !== '-') {
|
||
|
const expand = []
|
||
|
for (let f = 1; f < arg.length; f++) {
|
||
|
const fc = arg.charAt(f)
|
||
|
const sf = singleFlags[fc]
|
||
|
const so = singleOpts[fc]
|
||
|
if (sf)
|
||
|
expand.push('--' + sf)
|
||
|
else if (so) {
|
||
|
const soslice = arg.slice(f + 1)
|
||
|
const soval = soslice.charAt(0) === '=' ? soslice : '=' + soslice
|
||
|
expand.push('--' + so + soval)
|
||
|
f = arg.length
|
||
|
} else if (arg !== '-' + fc)
|
||
|
expand.push('-' + fc)
|
||
|
}
|
||
|
if (expand.length) {
|
||
|
args.splice.apply(args, [i, 1].concat(expand))
|
||
|
i--
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const argsplit = arg.split('=')
|
||
|
const key = argsplit.shift().replace(/^\-\-/, '')
|
||
|
const val = argsplit.length ? argsplit.join('=') : null
|
||
|
|
||
|
switch (key) {
|
||
|
case 'time':
|
||
|
const timestr = val || args[++i]
|
||
|
// [-t [[CC]YY]MMDDhhmm[.SS]]
|
||
|
const parsedtime = timestr.match(
|
||
|
/^(([0-9]{2})?([0-9]{2}))?([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})(\.([0-9]{2}))?$/
|
||
|
)
|
||
|
if (!parsedtime) {
|
||
|
console.error('touch: out of range or illegal ' +
|
||
|
'time specification: ' +
|
||
|
'[[CC]YY]MMDDhhmm[.SS]')
|
||
|
process.exit(1)
|
||
|
} else {
|
||
|
const y = +parsedtime[1]
|
||
|
const year = parsedtime[2] ? y
|
||
|
: y <= 68 ? 2000 + y
|
||
|
: 1900 + y
|
||
|
|
||
|
const MM = +parsedtime[4] - 1
|
||
|
const dd = +parsedtime[5]
|
||
|
const hh = +parsedtime[6]
|
||
|
const mm = +parsedtime[7]
|
||
|
const ss = +parsedtime[8]
|
||
|
|
||
|
options.time = new Date(Date.UTC(year, MM, dd, hh, mm, ss))
|
||
|
}
|
||
|
continue
|
||
|
|
||
|
case 'ref':
|
||
|
options.ref = val || args[++i]
|
||
|
continue
|
||
|
|
||
|
case 'mtime':
|
||
|
case 'nocreate':
|
||
|
case 'atime':
|
||
|
case 'force':
|
||
|
options[key] = true
|
||
|
continue
|
||
|
|
||
|
default:
|
||
|
console.error('touch: illegal option -- ' + arg)
|
||
|
usage(1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!files.length)
|
||
|
usage()
|
||
|
|
||
|
process.exitCode = 0
|
||
|
Promise.all(files.map(f => touch(f, options)))
|
||
|
.catch(er => process.exitCode = 1)
|