summary refs log tree commit diff
path: root/Completion/Unix/Command/_cpio
blob: 4cccbe609c9e976fb66964acae3cb9331f1f5c5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#compdef cpio

(( $+_is_gnu )) || typeset -gA _is_gnu

local cmd=$service args ig context curcontext="$curcontext" state line opt_args
local expl ret
local fmts='(bar bin odc newc crc tar ustar hpbin hpodc)'

if (( ! $+_is_gnu[$cmd] )); then
  if [[ $(_call_program version $cmd --version </dev/null 2>/dev/null) = *GNU* ]]
  then
    _is_gnu[$cmd]=yes
  else
    _is_gnu[$cmd]=
  fi
fi 
ig=$_is_gnu[$cmd]

if (( $CURRENT == 2 )); then
   # Complete arguments 
   args=('-o[create archive]' '-i[extract from archive]'
   '-p[run as filter on directory tree]')
   [[ -n $ig ]] && args=($args '--create[create archive]'
   '--extract[extract from archive]' 
   '--pass-through[run as filter on directory tree]'
   '--help[show help text]' '--version[show version information]')
else
  if [[ -n ${words[(r)(-o*|-[^-]*o*|--create)]} ]]; then
    # Optiona for creating archive
    if [[ -n $ig ]]; then
	args=(
	   '--file=:archive file:->afile'
	   "--format=:format type:$fmts"
	   '--message=:message at end of volume:'
	   '--null' '--reset-access-time'
	   '--verbose' '--dot' '--append' 
	   '--block-size=:block size in 512 byte units:'
	   '--dereference'
	   '--io-size=:block size in bytes'
	   '--quiet' '--force-local'  '--help'   '--version')
    fi
    args=($args
	  '-A[append files to archive]'
	  '-B[block size 5120 bytes with special file]'
	  '-C[set block size per record]:block size in bytes:(8192)'
	  '-F[set archive file to use]:archive file:->afile'
	  '(-H)-c[read/write header in ASCII]'
	  "(-c)-H[set format type for archive header]:$fmts"
	  '-L[follow symbolic links]'
	  '-M[print message at end of volume]:message to print:'
	  '-O[set output archive file]:output archive file:_files'
	 )
  elif [[ -n ${words[(r)(-i*|-[^-]*i*|--extract)]} ]]; then
    if [[ -n $ig ]]; then
      args=('--file=:archive file:->afile'
	    "--format=:format type:$fmts"
	    '--make-directories' '--nonmatching' 
            '--preserve-modification-time' '--numeric'
	    '--rename' '--list' '--swap-bytes' '--swap-halfwords'
	    '--dot' '--unconditional' '--verbose' 
	    '--block-size=:block size in 512 byte units:'
	    '--swap-halfwords'
	    '--io-size=:block size in bytes:'
	    '--pattern-file=:file with list of patterns:_files'
	    '--owner=:user (and group) for files:->user'  '--no-preserve-owner'
	    '--message=:message at end of volume:'
            '--force-local'
	    '--no-absolute-filenames' '--sparse' '--only-verify-crc'
	    '--quiet' '--help' '--version')
    fi
    args=($args
	  '-b[reverse bytes in word]'
	  '-B[block size 5120 bytes with special file]'
	  '-d[create directories as needed]'
	  '-C[set block size per record]:block size in bytes:(8192)'
	  '-E[read filenames from file]:file name for list of files:_files'
	  '-f[only copy files not matching patterns]'
	  '-F[set archive file to use]:archive file:->afile'
	  '(-H)-c[read/write header in ASCII]'
	  "(-c)-H[set format type for archive header]:$fmts"
	  '-I[set input archive file]:input archive file:_files'
	  '-m[preserve file modification times]'
	  '-M[print message at end of volume]:message to print:'
	  '-n[show UID and GID numerically]'
	  '-r[interactively rename files]'
	  '-R[set user and group for files]:user (and group) for files:->user'
	  '-s[swap bytes within each halfword]'
	  '-S[swap bytes within each word]'
	  '-t[print a table of contents]'
	  '*:pattern to extract'
	  )
  elif [[ -n ${words[(r)(-p*|-[^-]*p*|--pass-through)]} ]]; then
    if [[ -n $ig ]]; then
      args=('--null' '--reset-access-time' '--make-directories'
            '--link' '--quiet' '--preserve-modification-time'
	    '--unconditional' '--verbose' '--dot' '--dereference'
	    '--owner=:user (and group) for files:->user'
	    '--no-preserve-owner' '--sparse'  '--help'  '--version')
    fi
    args=($args
	  '-d[create directories as needed]'
	  '-l[link files instead of copying]'
	  '-L[follow symbolic links]'
	  '-m[preserve file modification times]'
	  '-R[set user and group for files]:user (and group) for files:->user'
	  '*:destination directory:_files -/'
	  )
  else
    return 1
  fi
  args=($args
	'-a[reset access time of input files]'
	)
fi 

ret=1
_arguments -s "$args[@]" && ret=0

if [[ $state = afile ]]; then
  if compset -P '*:'; then
    # TODO: doesn't need to be rsh.
    _wanted files expl 'remote files' \
       compadd $(rsh ${words[CURRENT]%:*} echo ${words[CURRENT]#*:}\*) && ret=0
  elif compset -P '*@'; then
    _wanted hosts expl 'remote host name' _hosts && ret=0
  else
    _alternative \
	'files:: _files' \
	'hosts:remote host name:_hosts -S:' \
	'users:user name:_users -qS@' && ret=0
  fi
elif [[ $state = user ]]; then
  if compset -P '*[:.]'; then
    _groups
  else
    local suf=.
    [[ $OSTYPE = (solaris|hpux)* ]] && suf=:
    compset -S '.*' && unset suf
    _users -S "$suf" -q
  fi
fi

return ret