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
			| 
								 
											3 years 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)
							 |