comparison lisp/packages.el @ 274:ca9a9ec9c1c1 r21-0b35

Import from CVS: tag r21-0b35
author cvs
date Mon, 13 Aug 2007 10:29:42 +0200
parents c5d627a313b1
children 6330739388db
comparison
equal deleted inserted replaced
273:411aac7253ef 274:ca9a9ec9c1c1
72 (defvar last-packages nil 72 (defvar last-packages nil
73 "Packages last in the load path.") 73 "Packages last in the load path.")
74 74
75 (defvar last-package-load-path nil 75 (defvar last-package-load-path nil
76 "Load path for packages last in the load path.") 76 "Load path for packages last in the load path.")
77
78 (defvar package-locations
79 (list
80 (list "~/.xemacs" 'early #'(lambda () t))
81 (list "mule-packages" 'late #'(lambda () (featurep 'mule)))
82 (list "packages" 'late #'(lambda () t))
83 (list "infodock-packages" 'late #'(lambda () (featurep 'infodock))))
84 "Locations of the various package directories.
85 This is a list each of whose elements describes one directory.
86 A directory description is a three-element list.
87 The first element is either an absolute path or a subdirectory
88 in the XEmacs hierarchy.
89 The second component is one of the symbols EARLY, LATE, LAST,
90 depending on the load-path segment the hierarchy is supposed to
91 show up in.
92 The third component is a thunk which, if it returns NIL, causes
93 the directory to be ignored.")
77 94
78 (defun package-get-key-1 (info key) 95 (defun package-get-key-1 (info key)
79 "Locate keyword `key' in list." 96 "Locate keyword `key' in list."
80 (cond ((null info) 97 (cond ((null info)
81 nil) 98 nil)
296 (setq dir-list data-directory-list)) 313 (setq dir-list data-directory-list))
297 (locate-file name dir-list)) 314 (locate-file name dir-list))
298 315
299 ;; Path setup 316 ;; Path setup
300 317
301 (defun packages-find-package-path (roots) 318 (defun packages-find-package-directories (roots base)
302 "Construct the package path underneath installation roots ROOTS." 319 "Find a set of package directories."
303 (let ((envvar-value (getenv "EMACSPACKAGEPATH"))) 320 (let ((version-directory (paths-find-version-directory roots base))
304 (if envvar-value 321 (site-directory (paths-find-site-directory roots base)))
305 (decode-path-internal envvar-value) 322 (paths-uniq-append
306 (let ((site-base-directory (paths-find-site-directory roots "packages")) 323 (and version-directory (list version-directory))
307 (version-base-directory (paths-find-version-directory roots "packages"))) 324 (and site-directory (list site-directory)))))
308 (if (or site-base-directory version-base-directory)
309 (let ((site-mule-directory
310 (and (featurep 'mule)
311 (paths-find-site-directory roots
312 "mule-packages")))
313 (version-mule-directory
314 (and (featurep 'mule)
315 (paths-find-version-directory roots
316 "mule-packages")))
317 ;; There needs to be a cleverer way of doing this
318 (site-infodock-directory
319 (and (featurep 'infodock)
320 (paths-find-site-directory roots
321 "infodock-packages")))
322 (version-infodock-directory
323 (and (featurep 'infodock)
324 (paths-find-version-directory roots
325 "infodock-packages"))))
326 (append '("~/.xemacs/")
327 '(nil)
328 (and version-infodock-directory
329 (null (string-equal version-infodock-directory
330 site-infodock-directory))
331 (list version-infodock-directory))
332 (and site-infodock-directory
333 (list site-infodock-directory))
334 (and version-mule-directory
335 (null (string-equal version-mule-directory
336 site-mule-directory))
337 (list version-mule-directory))
338 (and site-mule-directory
339 (list site-mule-directory))
340 (and version-base-directory
341 (null (string-equal version-base-directory
342 site-base-directory))
343 (list version-base-directory))
344 (and site-base-directory
345 (list site-base-directory))))
346 configure-package-path)))))
347 325
348 (defvar packages-special-bases '("etc" "info" "lisp" "lib-src" "bin") 326 (defvar packages-special-bases '("etc" "info" "lisp" "lib-src" "bin")
349 "Special subdirectories of packages.") 327 "Special subdirectories of packages.")
350 328
351 (defun packages-find-packages-in-directories (directories) 329 (defun packages-find-packages-in-directories (directories)
353 (paths-find-recursive-path directories 331 (paths-find-recursive-path directories
354 (append paths-version-control-bases 332 (append paths-version-control-bases
355 packages-special-bases))) 333 packages-special-bases)))
356 334
357 (defun packages-split-path (path) 335 (defun packages-split-path (path)
358 "Split PATH at NIL, return pair with two components. 336 "Split PATH at \"/\", return pair with two components.
359 The second component is shared with PATH." 337 The second component is shared with PATH."
360 (let ((reverse-tail '()) 338 (let ((reverse-tail '())
361 (rest path)) 339 (rest path))
362 (while (and rest (null (null (car rest)))) 340 (while (and rest (null (string-equal "/" (car rest))))
363 (setq reverse-tail (cons (car rest) reverse-tail)) 341 (setq reverse-tail (cons (car rest) reverse-tail))
364 (setq rest (cdr rest))) 342 (setq rest (cdr rest)))
365 (if (null rest) 343 (if (null rest)
366 (cons path nil) 344 (cons path nil)
367 (cons (nreverse reverse-tail) (cdr rest))))) 345 (cons (nreverse reverse-tail) (cdr rest)))))
368 346
369 (defun packages-find-packages (package-path &optional inhibit) 347 (defun packages-split-package-path (package-path)
370 "Search for all packages in PACKAGE-PATH. 348 "Split up PACKAGE-PATH into early, late and last components.
371 PACKAGE-PATH may distinguish (by NIL-separation) between early, 349 The separation is by \"/\" components.
372 late and last packages.
373 If INHIBIT is non-NIL, return empty paths.
374 This returns (LIST EARLY-PACKAGES LATE-PACKAGES LAST-PACKAGES)." 350 This returns (LIST EARLY-PACKAGES LATE-PACKAGES LAST-PACKAGES)."
351 ;; When in doubt, it's late
352 (let* ((stuff (packages-split-path package-path))
353 (early (and (cdr stuff) (car stuff)))
354 (late+last (or (cdr stuff) (car stuff)))
355 (stuff (packages-split-path late+last))
356 (late (car stuff))
357 (last (cdr stuff)))
358 (list (packages-find-packages-in-directories early)
359 (packages-find-packages-in-directories late)
360 (packages-find-packages-in-directories last))))
361
362 (defun packages-deconstruct (list consumer)
363 "Deconstruct LIST and feed it to CONSUMER."
364 (apply consumer list))
365
366 (defun packages-find-packages-by-name (roots name)
367 "Find a package hierarchy by its name."
368 (packages-find-packages-in-directories
369 (if (and (file-name-absolute-p name)
370 (file-name-directory (expand-file-name name)))
371 (list (file-name-as-directory (expand-file-name name)))
372 (packages-find-package-directories roots name))))
373
374 (defun packages-find-packages-at-time
375 (roots package-locations time &optional default)
376 "Find packages at given time.
377 For the format of PACKAGE-LOCATIONS, see the global variable of the same name.
378 TIME is either 'EARLY, 'LATE, or 'LAST.
379 DEFAULT is a default list of packages."
380 (let ((packages '()))
381 (while package-locations
382 (packages-deconstruct
383 (car package-locations)
384 #'(lambda (name a-time thunk)
385 (if (and (eq time a-time)
386 (funcall thunk))
387 (setq packages
388 (nconc packages
389 (packages-find-packages-by-name roots name))))))
390 (setq package-locations (cdr package-locations)))
391 (paths-uniq-append packages
392 default)))
393
394 (defun packages-find-packages (roots &optional inhibit)
395 "Find the packages."
375 (if inhibit 396 (if inhibit
376 (list '() '() '()) 397 (list '() '() '())
377 ;; When in doubt, it's late 398 (let ((envvar-value (getenv "EMACSPACKAGEPATH")))
378 (let* ((stuff (packages-split-path package-path)) 399 (if envvar-value
379 (early (and (cdr stuff) (car stuff))) 400 (packages-split-package-path envvar-value)
380 (late+last (or (cdr stuff) (car stuff))) 401 (packages-deconstruct
381 (stuff (packages-split-path late+last)) 402 (packages-split-package-path configure-package-path)
382 (late (car stuff)) 403 #'(lambda (configure-early-packages
383 (last (cdr stuff))) 404 configure-late-packages
384 (list (packages-find-packages-in-directories early) 405 configure-last-packages)
385 (packages-find-packages-in-directories late) 406 (list (packages-find-packages-at-time roots package-locations 'early
386 (packages-find-packages-in-directories last))))) 407 configure-early-packages)
408 (packages-find-packages-at-time roots package-locations 'late
409 configure-late-packages)
410 (packages-find-packages-at-time roots package-locations 'last
411 configure-last-packages))))))))
387 412
388 (defun packages-find-package-library-path (packages suffixes) 413 (defun packages-find-package-library-path (packages suffixes)
389 "Construct a path into a component of the packages hierarchy. 414 "Construct a path into a component of the packages hierarchy.
390 PACKAGES is a list of package directories. 415 PACKAGES is a list of package directories.
391 SUFFIXES is a list of names of package subdirectories to look for." 416 SUFFIXES is a list of names of package subdirectories to look for."