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