|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #!/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)
|