1;;; pcmpl-rpm.el --- functions for dealing with rpm completions
2
3;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
4;;   2005, 2006, 2007 Free Software Foundation, Inc.
5
6;; This file is part of GNU Emacs.
7
8;; GNU Emacs is free software; you can redistribute it and/or modify
9;; it under the terms of the GNU General Public License as published by
10;; the Free Software Foundation; either version 2, or (at your option)
11;; any later version.
12
13;; GNU Emacs is distributed in the hope that it will be useful,
14;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16;; GNU General Public License for more details.
17
18;; You should have received a copy of the GNU General Public License
19;; along with GNU Emacs; see the file COPYING.  If not, write to the
20;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21;; Boston, MA 02110-1301, USA.
22
23;;; Commentary:
24
25;; These functions provide completion rules for RedHat's `rpm' tool.
26
27;;; Code:
28
29(provide 'pcmpl-rpm)
30
31(require 'pcomplete)
32
33(defgroup pcmpl-rpm nil
34  "Functions for dealing with CVS completions."
35  :group 'pcomplete)
36
37;; Functions:
38
39(defsubst pcmpl-rpm-packages ()
40  (split-string (pcomplete-process-result "rpm" "-q" "-a")))
41
42(defun pcmpl-rpm-all-query (flag)
43  (message "Querying all packages with `%s'..." flag)
44  (let ((pkgs (pcmpl-rpm-packages))
45	(provs (list t)))
46    (while pkgs
47      (nconc provs (split-string
48		    (pcomplete-process-result
49		     "rpm" "-q" (car pkgs) flag)))
50      (setq pkgs (cdr pkgs)))
51    (pcomplete-uniqify-list (cdr provs))))
52
53(defsubst pcmpl-rpm-files ()
54  (pcomplete-dirs-or-entries "\\.rpm\\'"))
55
56;;;###autoload
57(defun pcomplete/rpm ()
58  "Completion for RedHat's `rpm' command.
59These rules were taken from the output of `rpm --help' on a RedHat 6.1
60system.  They follow my interpretation of what followed, but since I'm
61not a major rpm user/builder, please send me any corrections you find.
62You can use \\[eshell-report-bug] to do so."
63  (let (mode)
64    (while (<= pcomplete-index pcomplete-last)
65      (unless mode
66	(if (pcomplete-match "^--\\(.*\\)" 0)
67	    (pcomplete-here*
68	     '("--addsign"
69	       "--checksig"
70	       "--erase"
71	       "--help"
72	       "--initdb"
73	       "--install"
74	       "--pipe"
75	       "--querytags"
76	       "--rebuild"
77	       "--rebuilddb"
78	       "--recompile"
79	       "--resign"
80	       "--rmsource"
81	       "--setperms"
82	       "--setugids"
83	       "--upgrade"
84	       "--verify"
85	       "--version"))
86	  (pcomplete-opt "vqVyiUebtK")))
87;     -b<stage> <spec>
88;     -t<stage> <tarball>    - build package, where <stage> is one of:
89;	  p                - prep (unpack sources and apply patches)
90;	  l                - list check (do some cursory checks on %files)
91;	  c                - compile (prep and compile)
92;	  i                - install (prep, compile, install)
93;	  b                - binary package (prep, compile, install, package)
94;	  a                - bin/src package (prep, compile, install, package)
95      (cond
96       ((or (eq mode 'query)
97	    (pcomplete-match "-[^-]*q"))
98	(setq mode 'query)
99	(if (pcomplete-match "^--\\(.*\\)" 0)
100	    (progn
101	      (pcomplete-here*
102	       '("--changelog"
103		 "--dbpath"
104		 "--dump"
105		 "--ftpport"            ;nyi for the next four
106		 "--ftpproxy"
107		 "--httpport"
108		 "--httpproxy"
109		 "--provides"
110		 "--queryformat"
111		 "--rcfile"
112		 "--requires"
113		 "--root"
114		 "--scripts"
115		 "--triggeredby"
116		 "--whatprovides"
117		 "--whatrequires"))
118	      (cond
119	       ((pcomplete-test "--dbpath")
120		(pcomplete-here* (pcomplete-dirs)))
121	       ((pcomplete-test "--queryformat")
122		(pcomplete-here*))
123	       ((pcomplete-test "--rcfile")
124		(pcomplete-here* (pcomplete-entries)))
125	       ((pcomplete-test "--root")
126		(pcomplete-here* (pcomplete-dirs)))
127	       ((pcomplete-test "--scripts")
128		(if (pcomplete-match "^--\\(.*\\)" 0)
129		    (pcomplete-here* '("--triggers"))))
130	       ((pcomplete-test "--triggeredby")
131		(pcomplete-here* (pcmpl-rpm-packages)))
132	       ((pcomplete-test "--whatprovides")
133		(pcomplete-here*
134		 (pcmpl-rpm-all-query "--provides")))
135	       ((pcomplete-test "--whatrequires")
136		(pcomplete-here*
137		 (pcmpl-rpm-all-query "--requires")))))
138	  (if (pcomplete-match "^-" 0)
139	      (pcomplete-opt "af.p(pcmpl-rpm-files)ilsdcvR")
140	    (pcomplete-here (pcmpl-rpm-packages)))))
141       ((pcomplete-test "--pipe")
142	(pcomplete-here* (funcall pcomplete-command-completion-function)))
143       ((pcomplete-test "--rmsource")
144	(pcomplete-here* (pcomplete-entries))
145	(throw 'pcomplete-completions nil))
146       ((pcomplete-match "\\`--re\\(build\\|compile\\)\\'")
147	(pcomplete-here (pcmpl-rpm-files))
148	(throw 'pcomplete-completions nil))
149       ((pcomplete-match "\\`--\\(resign\\|addsign\\)\\'")
150	(while (pcomplete-here (pcmpl-rpm-files))))
151       ((or (eq mode 'checksig)
152	    (pcomplete-test "--checksig"))
153	(setq mode 'checksig)
154	(if (pcomplete-match "^--\\(.*\\)" 0)
155	    (progn
156	      (pcomplete-here*
157	       '("--nopgp"
158		 "--nogpg"
159		 "--nomd5"
160		 "--rcfile"))
161	      (cond
162	       ((pcomplete-test "--rcfile")
163		(pcomplete-here* (pcomplete-entries)))))
164	  (if (pcomplete-match "^-" 0)
165	      (pcomplete-opt "v")
166	    (pcomplete-here (pcmpl-rpm-files)))))
167       ((or (eq mode 'rebuilddb)
168	    (pcomplete-test "--rebuilddb"))
169	(setq mode 'rebuilddb)
170	(if (pcomplete-match "^--\\(.*\\)" 0)
171	    (progn
172	      (pcomplete-here*
173	       '("--dbpath"
174		 "--root"
175		 "--rcfile"))
176	      (cond
177	       ((pcomplete-test "--dbpath")
178		(pcomplete-here* (pcomplete-dirs)))
179	       ((pcomplete-test "--root")
180		(pcomplete-here* (pcomplete-dirs)))
181	       ((pcomplete-test "--rcfile")
182		(pcomplete-here* (pcomplete-entries)))))
183	  (if (pcomplete-match "^-" 0)
184	      (pcomplete-opt "v")
185	    (pcomplete-here))))
186       ((memq mode '(install upgrade))
187	(if (pcomplete-match "^--\\(.*\\)" 0)
188	    (progn
189	      (pcomplete-here*
190	       (append
191		'("--allfiles"
192		  "--badreloc"
193		  "--dbpath"
194		  "--excludedocs"
195		  "--excludepath"
196		  "--force"
197		  "--hash"
198		  "--ignorearch"
199		  "--ignoreos"
200		  "--ignoresize"
201		  "--includedocs"
202		  "--justdb"
203		  "--nodeps"
204		  "--noorder"
205		  "--noscripts"
206		  "--notriggers")
207		(if (eq mode 'upgrade)
208		    '("--oldpackage"))
209		'("--percent"
210		  "--prefix"
211		  "--rcfile"
212		  "--relocate"
213		  "--replacefiles"
214		  "--replacepkgs"
215		  "--root")))
216	      (cond
217	       ((pcomplete-test "--dbpath")
218		(pcomplete-here* (pcomplete-dirs)))
219	       ((pcomplete-test "--relocate")
220		(pcomplete-here*))
221	       ((pcomplete-test "--rcfile")
222		(pcomplete-here* (pcomplete-entries)))
223	       ((pcomplete-test "--excludepath")
224		(pcomplete-here* (pcomplete-entries)))
225	       ((pcomplete-test "--root")
226		(pcomplete-here* (pcomplete-dirs)))
227	       ((pcomplete-test "--prefix")
228		(pcomplete-here* (pcomplete-dirs)))))
229	  (if (pcomplete-match "^-" 0)
230	      (pcomplete-opt "vh")
231	    (pcomplete-here (pcmpl-rpm-files)))))
232       ((or (pcomplete-test "--install")
233	    (pcomplete-match "-[^-]*i"))
234	(setq mode 'install))
235       ((or (pcomplete-test "--upgrade")
236	    (pcomplete-match "-[^-]*U"))
237	(setq mode 'upgrade))
238       ((or (eq mode 'erase)
239	    (pcomplete-test "--erase")
240	    (pcomplete-match "-[^-]*e"))
241	(setq mode 'erase)
242	(if (pcomplete-match "^--\\(.*\\)" 0)
243	    (progn
244	      (pcomplete-here*
245	       '("--allmatches"
246		 "--dbpath"
247		 "--justdb"
248		 "--nodeps"
249		 "--noorder"
250		 "--noscripts"
251		 "--notriggers"
252		 "--rcfile"
253		 "--root"))
254	      (cond
255	       ((pcomplete-test "--dbpath")
256		(pcomplete-here* (pcomplete-dirs)))
257	       ((pcomplete-test "--rcfile")
258		(pcomplete-here* (pcomplete-entries)))
259	       ((pcomplete-test "--root")
260		(pcomplete-here* (pcomplete-dirs)))))
261	  (if (pcomplete-match "^-" 0)
262	      (pcomplete-opt "v")
263	    (pcomplete-here (pcmpl-rpm-packages)))))
264       ((or (eq mode 'verify)
265	    (pcomplete-test "--verify"))
266	(setq mode 'verify)
267	(if (pcomplete-match "^--\\(.*\\)" 0)
268	    (progn
269	      (pcomplete-here*
270	       '("--dbpath"
271		 "--nodeps"
272		 "--nofiles"
273		 "--nomd5"
274		 "--rcfile"
275		 "--root"
276		 "--triggeredby"
277		 "--whatprovides"
278		 "--whatrequires"))
279	      (cond
280	       ((pcomplete-test "--dbpath")
281		(pcomplete-here* (pcomplete-dirs)))
282	       ((pcomplete-test "--rcfile")
283		(pcomplete-here* (pcomplete-entries)))
284	       ((pcomplete-test "--root")
285		(pcomplete-here* (pcomplete-dirs)))
286	       ((pcomplete-test "--triggeredby")
287		(pcomplete-here* (pcmpl-rpm-packages)))
288	       ((pcomplete-test "--whatprovides")
289		(pcomplete-here*
290		 (pcmpl-rpm-all-query "--provides")))
291	       ((pcomplete-test "--whatrequires")
292		(pcomplete-here*
293		 (pcmpl-rpm-all-query "--requires")))))
294	  (if (pcomplete-match "^-" 0)
295	      (pcomplete-opt "af.p(pcmpl-rpm-files)v")
296	    (pcomplete-here (pcmpl-rpm-packages)))))
297       ((or (memq mode '(build test))
298	    (pcomplete-match "\\`-[bt]"))
299	(setq mode (if (pcomplete-match "\\`-b")
300		       'build
301		     'test))
302	(if (pcomplete-match "^--\\(.*\\)" 0)
303	    (progn
304	      (pcomplete-here*
305	       '("--buildroot"
306		 "--clean"
307		 "--nobuild"
308		 "--rcfile"
309		 "--rmsource"
310		 "--short-circuit"
311		 "--sign"
312		 "--target"
313		 "--timecheck"))
314	      (cond
315	       ((pcomplete-test "--buildroot")
316		(pcomplete-here* (pcomplete-dirs)))
317	       ((pcomplete-test "--rcfile")
318		(pcomplete-here* (pcomplete-entries)))
319	       ((pcomplete-test "--timecheck")
320		(pcomplete-here*))))
321	  (if (pcomplete-match "^-" 0)
322	      (pcomplete-opt "v")
323	    (pcomplete-here
324	     (if (eq mode 'test)
325		 (pcomplete-dirs-or-entries "\\.tar\\'")
326	       (pcomplete-dirs-or-entries "\\.spec\\'"))))))
327       (t
328	(error "You must select a mode: -q, -i, -U, --verify, etc"))))))
329
330;;; arch-tag: 4e64b490-fecf-430e-b2b9-70a8ad64b8c1
331;;; pcmpl-rpm.el ends here
332