annotate lisp/package-admin.el @ 5724:ede80ef92a74

Make soft links in src for module source files, if built in to the executable. This ensures that those files are built with the same compiler flags as all other source files. See these xemacs-beta messages: <CAHCOHQn+q=Xuwq+y68dvqi7afAP9f-TdB7=8YiZ8VYO816sjHg@mail.gmail.com> <f5by5ejqiyk.fsf@calexico.inf.ed.ac.uk>
author Jerry James <james@xemacs.org>
date Sat, 02 Mar 2013 14:32:37 -0700
parents 308d34e9f07d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; package-admin.el --- Installation and Maintenance of XEmacs packages
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1997 by Free Software Foundation, Inc.
1410
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
4 ;; Copyright (C) 2003, Steve Youngs.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Author: SL Baur <steve@xemacs.org>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Keywords: internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
11 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
12 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
13 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
14 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
16 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
17 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
18 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
19 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4720
diff changeset
22 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;;; Synched up with: Not in FSF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;; First pass at lisp front end to package maintenance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 (require 'config)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 (defvar package-admin-xemacs (concat invocation-directory invocation-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 "Location of XEmacs binary to use.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 (defvar package-admin-temp-buffer "*Package Output*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 "Temporary buffer where output of backend commands is saved.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 (defvar package-admin-install-function (if (eq system-type 'windows-nt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 'package-admin-install-function-mswindows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 'package-admin-default-install-function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 "The function to call to install a package.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
44 Three args are passed: FILENAME PKG-DIR BUFFER
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Install package FILENAME into directory PKG-DIR, with any messages output
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
46 to buffer BUFFER.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (defvar package-admin-error-messages '(
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 "No space left on device"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 "No such file or directory"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 "Filename too long"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 "Read-only file system"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 "File too large"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 "Too many open files"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 "Not enough space"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 "Permission denied"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 "Input/output error"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 "Out of memory"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 "Unable to create directory"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 "Directory checksum error"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 "Cannot exclusively open file"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 "corrupted file"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 "incomplete .* tree"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 "Bad table"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 "corrupt input"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 "invalid compressed data"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 "too many leaves in Huffman tree"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 "not a valid zip file"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 "first entry not deflated or stored"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 "encrypted file --"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 "unexpected end of file"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 "Regular expressions of possible error messages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 After each package extraction, the `package-admin-temp-buffer' buffer is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 scanned for these messages. An error code is returned if one of these are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 This is awful, but it exists because error return codes aren't reliable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 under MS Windows.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (defvar package-admin-tar-filename-regexps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 '(
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 ;; GNU tar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 ;; drwxrwxr-x john/doe 123 1997-02-18 15:48 pathname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 "\\S-+\\s-+[-a-z0-9_/]+\\s-+[0-9]+\\s-+[-0-9]+\\s-+[0-9:]+\\s-+\\(\\S-.*\\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 ;; HP-UX & SunOS tar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 ;; rwxrwxr-x 501/501 123 Feb 18 15:46 1997 pathname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 ;; Solaris tar (phooey!):
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 ;; rwxrwxr-x501/501 123 Feb 18 15:46 1997 pathname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 ;; AIX tar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 ;; -rw-r--r-- 147 1019 32919 Mar 26 12:00:09 1992 pathname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 "\\S-+\\s-*[-a-z0-9_]+[/ ][-a-z0-9_]+\\s-+[0-9]+\\s-+[a-z][a-z][a-z]\\s-+[0-9]+\\s-+[0-9:]+\\s-+[0-9]+\\s-+\\(\\S-.*\\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 ;; djtar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 ;; drwx Aug 31 02:01:41 1998 123 pathname
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 "\\S-+\\s-+[a-z][a-z][a-z]\\s-+[0-9]+\\s-+[0-9:]+\\s-+[0-9]+\\s-+[0-9]+\\s-+\\(\\S-.*\\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 "List of regexps to use to search for tar filenames.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 Note that \"\\(\" and \"\\)\" must be used to delimit the pathname (as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 match #1). Don't put \"^\" to match the beginning of the line; this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 is already implicit, as `looking-at' is used. Filenames can,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 unfortunately, contain spaces, so be careful in constructing any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 regexps.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105
628
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
106 (defvar package-install-hook nil
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
107 "*List of hook functions to be called when a new package is successfully
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
108 installed. The hook function is passed two arguments: the package name, and
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
109 the install directory.")
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
110
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
111 (defvar package-delete-hook nil
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
112 "*List of hook functions to be called when a package is deleted. The
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
113 hook is called *before* the package is deleted. The hook function is passed
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
114 two arguments: the package name, and the install directory.")
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
115
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
116 (defun package-admin-install-function-mswindows (file pkg-dir buffer)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
117 "Install function for mswindows."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (let ((default-directory (file-name-as-directory pkg-dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (unless (file-directory-p default-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (make-directory default-directory t))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
121 (call-process "minitar" nil buffer t file)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
123 (defun package-admin-default-install-function (filename pkg-dir buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 "Default function to install a package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 Install package FILENAME into directory PKG-DIR, with any messages output
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
126 to BUFFER."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (let* ((pkg-dir (file-name-as-directory pkg-dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (default-directory pkg-dir)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
129 (filename (expand-file-name filename)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (unless (file-directory-p pkg-dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (make-directory pkg-dir t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 ;; Don't assume GNU tar.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
133 (if (shell-command (concat "gunzip -c " filename " | tar xvf -") buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 0
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
135 1)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
137 ;; A few things needed by the following 2 functions.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
138 (eval-when-compile
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
139 (require 'packages)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
140 (autoload 'package-get-info "package-get")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
141 (autoload 'paths-decode-directory-path "find-paths")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
142 (defvar package-get-install-to-user-init-directory))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
143
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
144 (defun package-admin-find-top-directory (type &optional user-dir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
145 "Return the top level directory for a package.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
146
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
147 Argument TYPE is a symbol that determines the type of package we're
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
148 trying to find a directory for.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
149
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
150 Optional Argument USER-DIR if non-nil use directories off
3179
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
151 `early-package-directories'.
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
152
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
153 If we still can't find a suitable directory, return nil.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
154
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
155 Possible values for TYPE are:
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
156
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
157 std == For \"standard\" packages that go in '/xemacs-packages/'
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
158 mule == For \"mule\" packages that go in '/mule-packages/'
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
159 site == For \"unsupported\" packages that go in '/site-packages/'
3179
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
160 "
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
161 (let* ((hierarchies late-package-hierarchies)
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
162
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
163 (hierarchy-suffix
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
164 (file-name-as-directory
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
165 (cond
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
166 ((eq type 'std) "xemacs-packages")
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
167 ((eq type 'mule) "mule-packages")
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
168 ((eq type 'site) "site-packages"))))
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
169 (suffix-length (length hierarchy-suffix))
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
170 top-dir)
3179
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
171
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
172 (if user-dir
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
173 (expand-file-name hierarchy-suffix
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
174 (if configure-early-package-directories
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
175 (car configure-early-package-directories)
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
176 user-init-directory))
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
177
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
178 (while hierarchies
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
179 (if (string-equal (substring (car hierarchies) (- suffix-length))
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
180 hierarchy-suffix)
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
181 (setq top-dir (car hierarchies)))
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
182 (setq hierarchies (cdr hierarchies)))
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
183 top-dir)))
15139dbf89f4 [xemacs-hg @ 2005-12-27 18:50:47 by michaels]
michaels
parents: 2456
diff changeset
184
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
185
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
186 (defun package-admin-get-install-dir (package &optional pkg-dir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
187 "Find a suitable installation directory for a package.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
188
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
189 Argument PACKAGE is the package to find a installation directory for.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
190 Optional Argument PKG-DIR, if non-nil is a directory to use for
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
191 installation.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
192
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
193 If PKG-DIR is non-nil and writable, return that. Otherwise check to
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
194 see if the PACKAGE is already installed and return that location, if
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
195 it is writable. Finally, fall back to the `user-init-directory' if
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
196 all else fails. As a side effect of installing packages under
2456
f4e405a9d18d [xemacs-hg @ 2004-12-27 12:25:14 by michaels]
michaels
parents: 1561
diff changeset
197 `user-init-directory' these packages become part of `early-package-hierarchies'."
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
198 ;; If pkg-dir specified, return that if writable.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
199 (if (and pkg-dir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
200 (file-writable-p (directory-file-name pkg-dir)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 pkg-dir
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
202 ;; If the user want her packages under ~/.xemacs/, do so.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
203 (let ((type (package-get-info package 'category)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
204 (if package-get-install-to-user-init-directory
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
205 (progn
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
206 (cond ((equal type "standard")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
207 (setq pkg-dir (package-admin-find-top-directory 'std 'user-dir)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
208 ((equal type "mule")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
209 (setq pkg-dir (package-admin-find-top-directory 'mule 'user-dir))))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
210 pkg-dir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
211 ;; Maybe the package has been installed before, if so, return
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
212 ;; that directory.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
213 (let ((package-feature (intern-soft (concat
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
214 (symbol-name package) "-autoloads")))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
215 autoload-dir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
216 (when (and (not (eq package 'unknown))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
217 (featurep package-feature)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
218 (setq autoload-dir (feature-file package-feature))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
219 (setq autoload-dir (file-name-directory autoload-dir))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
220 (member autoload-dir (append early-package-load-path late-package-load-path)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
221 ;; Find the corresponding entry in late-package
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
222 (setq pkg-dir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
223 (car-safe (member-if (lambda (h)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
224 (string-match (concat "^" (regexp-quote h))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
225 autoload-dir))
2456
f4e405a9d18d [xemacs-hg @ 2004-12-27 12:25:14 by michaels]
michaels
parents: 1561
diff changeset
226 (append (cdr early-package-hierarchies) late-package-hierarchies)))))
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
227 (if (and pkg-dir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
228 (file-writable-p (directory-file-name pkg-dir)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
229 pkg-dir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
230 ;; OK, the package hasn't been previously installed so we need
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
231 ;; to guess where it should go.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
232 (cond ((equal type "standard")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
233 (setq pkg-dir (package-admin-find-top-directory 'std)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
234 ((equal type "mule")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
235 (setq pkg-dir (package-admin-find-top-directory 'mule)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
236 (t
1410
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
237 (error 'invalid-operation
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
238 "Invalid package type")))
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
239 (if (and pkg-dir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
240 (file-writable-p (directory-file-name pkg-dir)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
241 pkg-dir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
242 ;; Oh no! Either we still haven't found a suitable
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
243 ;; directory, or we can't write to the one we did find.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
244 ;; Drop back to the `user-init-directory'.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
245 (if (y-or-n-p (format "Directory isn't writable, use %s instead? "
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
246 user-init-directory))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
247 (progn
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
248 (cond ((equal type "standard")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
249 (setq pkg-dir (package-admin-find-top-directory 'std 'user-dir)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
250 ((equal type "mule")
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
251 (setq pkg-dir (package-admin-find-top-directory 'mule 'user-dir)))
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
252 (t
1410
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
253 (error 'invalid-operation
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
254 "Invalid package type")))
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
255 ;; Turn on `package-get-install-to-user-init-directory'
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
256 ;; so we don't get asked for each package we try to
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
257 ;; install in this session.
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
258 (setq package-get-install-to-user-init-directory t)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
259 pkg-dir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
260 ;; If we get to here XEmacs can't make up its mind and
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
261 ;; neither can the user, nothing left to do except barf. :-(
1410
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
262 (error 'search-failed
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
263 (format
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
264 "Can't find suitable installation directory for package: %s"
44de306310b8 [xemacs-hg @ 2003-04-14 03:40:26 by youngs]
youngs
parents: 1378
diff changeset
265 package))))))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (defun package-admin-get-manifest-file (pkg-topdir package)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 "Return the name of the MANIFEST file for package PACKAGE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 Note that PACKAGE is a symbol, and not a string."
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
270 (let ((dir (file-name-as-directory
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
271 (expand-file-name "pkginfo" pkg-topdir))))
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
272 (expand-file-name (concat "MANIFEST." (symbol-name package)) dir)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 (defun package-admin-check-manifest (pkg-outbuf pkg-topdir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 "Check for a MANIFEST.<package> file in the package distribution.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 If it doesn't exist, create and write one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 PKG-OUTBUF is the buffer that holds the output from `tar', and PKG-TOPDIR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 is the top-level directory under which the package was installed."
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
279 (let ((manifest-buf " *pkg-manifest*")
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
280 (case-fold-search (file-system-ignore-case-p pkg-topdir))
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
281 regexp package-name pathname regexps)
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
282 (save-excursion ;; Probably redundant.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
283 (set-buffer (get-buffer pkg-outbuf)) ;; Probably already the current buffer.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
284 (goto-char (point-min))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
285 (setq regexp (concat "\\bpkginfo"
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
286 (char-to-string directory-sep-char)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
287 "MANIFEST\\...*"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
289 ;; Look for the manifest.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
290 (if (not (re-search-forward regexp nil t))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
291 (progn
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
292 ;; We didn't find a manifest. Make one.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
294 ;; Yuk. We weren't passed the package name, and so we have
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
295 ;; to dig for it. Look for it as the subdirectory name below
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
296 ;; "lisp", or "man".
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
297 ;; Here, we don't use a single regexp because we want to search
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
298 ;; the directories for a package name in a particular order.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
299 (if (catch 'done
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
300 (let ((dirs '("lisp" "man"))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
301 rexp)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
302 (while dirs
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
303 (setq rexp (concat "\\b" (car dirs)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
304 "[\\/]\\([^\\/]+\\)[\//]"))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
305 (if (re-search-forward rexp nil t)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
306 (throw 'done t))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
307 (setq dirs (cdr dirs)))))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
308 (progn
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
309 (setq package-name (buffer-substring (match-beginning 1)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
310 (match-end 1)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
312 ;; Get and erase the manifest buffer
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
313 (setq manifest-buf (get-buffer-create manifest-buf))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
314 (buffer-disable-undo manifest-buf)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
315 (erase-buffer manifest-buf)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
316
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
317 ;; Now, scan through the output buffer, looking for
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
318 ;; file and directory names.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
319 (goto-char (point-min))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
320 ;; for each line ...
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
321 (while (< (point) (point-max))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
322 (beginning-of-line)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
323 (setq pathname nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
325 ;; scan through the regexps, looking for a pathname
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
326 (if (catch 'found-path
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
327 (setq regexps package-admin-tar-filename-regexps)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
328 (while regexps
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
329 (if (looking-at (car regexps))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
330 (progn
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
331 (setq pathname
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
332 (buffer-substring
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
333 (match-beginning 1)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
334 (match-end 1)))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
335 (throw 'found-path t)))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
336 (setq regexps (cdr regexps))))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
337 (progn
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
338 ;; found a pathname -- add it to the manifest
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
339 ;; buffer
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
340 (save-excursion
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
341 (set-buffer manifest-buf)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
342 (goto-char (point-max))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
343 (insert pathname "\n"))))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
344 (forward-line 1))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
346 ;; Processed all lines.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
347 ;; Now, create the file, pkginfo/MANIFEST.<pkgname>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
349 ;; We use `expand-file-name' instead of `concat',
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
350 ;; for portability.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
351 (setq pathname (expand-file-name "pkginfo"
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
352 pkg-topdir))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
353 ;; Create pkginfo, if necessary
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
354 (if (not (file-directory-p pathname))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
355 (make-directory pathname))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
356 (setq pathname (expand-file-name
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
357 (concat "MANIFEST." package-name)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
358 pathname))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
359 (save-excursion
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
360 (set-buffer manifest-buf)
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
361 ;; Put the files in sorted order
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
362 (if-fboundp 'sort-lines
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
363 (sort-lines nil (point-min) (point-max))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
364 (warn "`xemacs-base' not installed, MANIFEST.%s not sorted"
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
365 package-name))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
366 ;; Write the file.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
367 ;; Note that using `write-region' *BYPASSES* any check
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
368 ;; to see if XEmacs is currently editing/visiting the
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
369 ;; file.
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
370 (write-region (point-min) (point-max) pathname))
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3179
diff changeset
371 (kill-buffer manifest-buf))))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (defun package-admin-add-binary-package (file &optional pkg-dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 "Install a pre-bytecompiled XEmacs package into package hierarchy."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 (interactive "fPackage tarball: ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 (let ((buf (get-buffer-create package-admin-temp-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 (status 1)
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
379 start err-list)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 (setq pkg-dir (package-admin-get-install-dir 'unknown pkg-dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 ;; Ensure that the current directory doesn't change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 ;; This is not really needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 (setq default-directory (file-name-as-directory pkg-dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (setq case-fold-search t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 (buffer-disable-undo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 (goto-char (setq start (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (if (= 0 (setq status (funcall package-admin-install-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 file pkg-dir buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 ;; First, check for errors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 ;; We can't necessarily rely upon process error codes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (catch 'done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (setq err-list package-admin-error-messages)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (while err-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 (if (re-search-forward (car err-list) nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (setq status 1)
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
401 (throw 'done nil)))
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
402 (setq err-list (cdr err-list))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 ;; Make sure that the MANIFEST file exists
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
404 (package-admin-check-manifest buf pkg-dir))))
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
405 status))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (defun package-admin-rmtree (directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 "Delete a directory and all of its contents, recursively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 This is a feeble attempt at making a portable rmdir."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (setq directory (file-name-as-directory directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (let ((files (directory-files directory nil nil nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (dirs (directory-files directory nil nil nil 'dirs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (while dirs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (if (not (member (car dirs) '("." "..")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (let ((dir (expand-file-name (car dirs) directory)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (condition-case err
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (if (file-symlink-p dir) ;; just in case, handle symlinks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 (delete-file dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (package-admin-rmtree dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 (message "%s: %s: \"%s\"" (nth 1 err) (nth 2 err) (nth 3 err)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 (setq dirs (cdr dirs))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 (while files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 (condition-case err
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (delete-file (expand-file-name (car files) directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 (message "%s: %s: \"%s\"" (nth 1 err) (nth 2 err) (nth 3 err))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (setq files (cdr files)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (condition-case err
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 (delete-directory directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (message "%s: %s: \"%s\"" (nth 1 err) (nth 2 err) (nth 3 err))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (defun package-admin-get-lispdir (pkg-topdir package)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 (let (package-lispdir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 (if (and (setq package-lispdir (expand-file-name "lisp" pkg-topdir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 (setq package-lispdir (expand-file-name (symbol-name package)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 package-lispdir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 (file-accessible-directory-p package-lispdir))
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
440 package-lispdir)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (defun package-admin-delete-binary-package (package pkg-topdir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 "Delete a binary installation of PACKAGE below directory PKG-TOPDIR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 PACKAGE is a symbol, not a string."
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
445 (let (manifest-file package-lispdir dirs file)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (setq pkg-topdir (package-admin-get-install-dir package pkg-topdir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (setq manifest-file (package-admin-get-manifest-file pkg-topdir package))
628
e545f3ec2337 [xemacs-hg @ 2001-07-14 08:42:16 by youngs]
youngs
parents: 448
diff changeset
448 (run-hook-with-args 'package-delete-hook package pkg-topdir)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (if (file-exists-p manifest-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 ;; The manifest file exists! Use it to delete the old distribution.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (message "Removing old files for package \"%s\" ..." package)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (sit-for 0)
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
454 (with-temp-buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (buffer-disable-undo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 (insert-file-contents manifest-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 ;; For each entry in the MANIFEST ...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (while (< (point) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (setq file (expand-file-name (buffer-substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (point-at-eol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 pkg-topdir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (if (file-directory-p file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 ;; Keep a record of each directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (setq dirs (cons file dirs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 ;; Delete each file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 ;; Make sure that the file is writable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 ;; (This is important under MS Windows.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 ;; I do not know why it important under MS Windows but
629
a6c89d799f00 [xemacs-hg @ 2001-07-15 08:18:59 by adrian]
adrian
parents: 628
diff changeset
474 ;; 1. It bombs out when the file does not exist. This can be condition-cased
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 ;; 2. If I removed the write permissions, I do not want XEmacs to just ignore them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 ;; If it wants to, XEmacs may ask, but that is about all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 ;; (set-file-modes file 438) ;; 438 -> #o666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 ;; Note, user might have removed the file!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (delete-file file)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
481 (error nil))) ;; We may want to turn the error into a Warning?
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (forward-line 1))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
483
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ;; Delete empty directories.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (if dirs
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
486 (progn
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
487 (mapc
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
488 (lambda (dir)
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
489 (condition-case ()
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
490 (delete-directory dir)))
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
491 dirs)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 ;; Delete the MANIFEST file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 ;; (set-file-modes manifest-file 438) ;; 438 -> #o666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 ;; Note. Packages can have MANIFEST in MANIFEST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (delete-file manifest-file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (error nil)) ;; Do warning?
1365
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
498 (message "Removing old files for package \"%s\" ... done" package)))
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
499 ;; The manifest file doesn't exist. Fallback to just deleting the
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
500 ;; package-specific lisp directory, if it exists.
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
501 ;;
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
502 ;; Delete old lisp directory, if any
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
503 ;; Gads, this is ugly. However, we're not supposed to use `concat'
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
504 ;; in the name of portability.
02909207294a [xemacs-hg @ 2003-03-20 13:19:56 by youngs]
youngs
parents: 776
diff changeset
505 (setq package-lispdir (package-admin-get-lispdir pkg-topdir package))
1378
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
506 (when package-lispdir
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
507 (message "Removing old lisp directory \"%s\" ..." package-lispdir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
508 (sit-for 0)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
509 (package-admin-rmtree package-lispdir)
69a674f5861f [xemacs-hg @ 2003-03-24 16:30:55 by youngs]
youngs
parents: 1365
diff changeset
510 (message "Removing old lisp directory \"%s\" ... done" package-lispdir)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 ;; Delete the package from the database of installed packages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (package-delete-name package)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (provide 'package-admin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 ;;; package-admin.el ends here