all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: David Kastrup <dak@gnu.org>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Fixes to let woman.el deal with MANPATH_MAP elements
Date: Fri, 23 Mar 2007 22:09:26 +0100	[thread overview]
Message-ID: <858xdnekft.fsf@lola.goethe.zz> (raw)
In-Reply-To: <85wt1720e3.fsf@lola.goethe.zz> (David Kastrup's message of "Fri\, 23 Mar 2007 21\:03\:16 +0100")

[-- Attachment #1: Type: text/plain, Size: 1489 bytes --]

David Kastrup <dak@gnu.org> writes:

> I am utterly befuddled by the code in woman.el.  Should I be using
> "parse-colon-path" or "woman-parse-colon-path" here?
>
> It is not clear to me whether "PATH" is covered by the same special
> rules that either one of the above functions would use.
>
> As the code appears to be cowritten by you, could you suggest what to
> use instead of
>
> (split-string (getenv "PATH") ":" t)
>
> here?  Should I use one of the above-mentioned functions, or just
> (split-string (getenv "PATH") path-separator t)?

Ok, I have seen that parse-colon-path returns directory names rather
than directory file names, so that is unsuitable for MANPATH_MAP.
Also it would appear that I overlooked woman-Cyg-to-Win's behavior
(not sure whether Cygwin even has MANPATH_MAP, but better safe than
sorry).  I believe that now the behavior should be more or less
consistent in the Windows case (at least not less consistent than the
preexisting mess).

I don't understand why all this Cygwinniness should be in woman.el to
start with: this kind of stuff does not seem specific to woman.el, but
more like a general problem.

It also turns out that woman.texi exists, so it seems like I need to
add some words there, too.

Sigh.  Fixing things is more work than I'd like to.

Could some people using Windows and/or Cygwin systems perhaps check
the behavior?  Bonus points if their manpath.conf contains MANPATH_MAP
elements.  The current code should not cause a regression.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 8174 bytes --]

*** woman.el	12 Mar 2007 20:24:09 +0100	1.55
--- woman.el	23 Mar 2007 21:39:56 +0100	
***************
*** 486,509 ****
  
  (defun woman-Cyg-to-Win (file)
    "Convert an absolute filename FILE from Cygwin to Windows form."
!   ;; Code taken from w32-symlinks.el
!   (if (eq (aref file 0) ?/)
!       ;; Try to use Cygwin mount table via `cygpath.exe'.
!       (condition-case nil
! 	  (with-temp-buffer
! 	    ;; cygpath -m file
! 	    (call-process "cygpath" nil t nil "-m" file)
! 	    (buffer-substring 1 (buffer-size)))
! 	(error
! 	 ;; Assume no `cygpath' program available.
! 	 ;; Hack /cygdrive/x/ or /x/ or (obsolete) //x/ to x:/
! 	 (when (string-match "\\`\\(/cygdrive\\|/\\)?/./" file)
! 	   (if (match-string 1)		; /cygdrive/x/ or //x/ -> /x/
! 	       (setq file (substring file (match-end 1))))
! 	   (aset file 0 (aref file 1))	; /x/ -> xx/
! 	   (aset file 1 ?:))		; xx/ -> x:/
! 	 file))
!     file))
  
  \f
  ;;; User options:
--- 486,513 ----
  
  (defun woman-Cyg-to-Win (file)
    "Convert an absolute filename FILE from Cygwin to Windows form."
!   ;; MANPATH_MAP conses are not converted since they presumably map
!   ;; Cygwin to Cygwin form.
!   (if (consp file)
!       file
!     ;; Code taken from w32-symlinks.el
!     (if (eq (aref file 0) ?/)
! 	;; Try to use Cygwin mount table via `cygpath.exe'.
! 	(condition-case nil
! 	    (with-temp-buffer
! 	      ;; cygpath -m file
! 	      (call-process "cygpath" nil t nil "-m" file)
! 	      (buffer-substring 1 (buffer-size)))
! 	  (error
! 	   ;; Assume no `cygpath' program available.
! 	   ;; Hack /cygdrive/x/ or /x/ or (obsolete) //x/ to x:/
! 	   (when (string-match "\\`\\(/cygdrive\\|/\\)?/./" file)
! 	     (if (match-string 1)		; /cygdrive/x/ or //x/ -> /x/
! 		 (setq file (substring file (match-end 1))))
! 	     (aset file 0 (aref file 1))	; /x/ -> xx/
! 	     (aset file 1 ?:))		; xx/ -> x:/
! 	   file))
!       file)))
  
  \f
  ;;; User options:
***************
*** 547,557 ****
  	(mapcar 'woman-Cyg-to-Win path)
        path))
    "*List of dirs to search and/or files to try for man config file.
! A trailing separator (`/' for UNIX etc.) on directories is optional,
! and the filename is used if a directory specified is the first to
! contain the strings \"man\" and \".conf\" (in that order).
! If MANPATH is not set but a config file is found then it is parsed
! instead to provide a default value for `woman-manpath'."
    :type '(repeat string)
    :group 'woman-interface)
  
--- 551,562 ----
  	(mapcar 'woman-Cyg-to-Win path)
        path))
    "*List of dirs to search and/or files to try for man config file.
! A trailing separator (`/' for UNIX etc.) on directories is
! optional, and the filename is used if a directory specified is
! the first to start with \"man\" and has an extension starting
! with \".conf\".  If MANPATH is not set but a config file is found
! then it is parsed instead to provide a default value for
! `woman-manpath'."
    :type '(repeat string)
    :group 'woman-interface)
  
***************
*** 564,570 ****
  or
    MANDATORY_MANPATH  /usr/man
  or
!   OPTIONAL_MANPATH  /usr/man"
    ;; Functionality suggested by Charles Curley.
    (let ((path woman-man.conf-path)
  	file manpath)
--- 569,577 ----
  or
    MANDATORY_MANPATH  /usr/man
  or
!   OPTIONAL_MANPATH  /usr/man
! or
!   MANPATH_MAP /opt/bin /opt/man"
    ;; Functionality suggested by Charles Curley.
    (let ((path woman-man.conf-path)
  	file manpath)
***************
*** 576,582 ****
  		  (or (not (file-directory-p file))
  		      (and
  		       (setq file
! 			     (directory-files file t "man.*\\.conf" t))
  		       (file-readable-p (setq file (car file)))))
  		  ;; Parse the file -- if no MANPATH data ignore it:
  		  (with-temp-buffer
--- 583,589 ----
  		  (or (not (file-directory-p file))
  		      (and
  		       (setq file
! 			     (directory-files file t "\\`man.*\\.conf[a-z]*\\'" t))
  		       (file-readable-p (setq file (car file)))))
  		  ;; Parse the file -- if no MANPATH data ignore it:
  		  (with-temp-buffer
***************
*** 584,591 ****
  		    (while (re-search-forward
  			    ;; `\(?: ... \)' is a "shy group"
  			    "\
! ^[ \t]*\\(?:MANDATORY_\\|OPTIONAL_\\)?MANPATH[ \t]+\\(\\S-+\\)" nil t)
! 		      (setq manpath (cons (match-string 1) manpath)))
  		    manpath))
  		 ))
        (setq path (cdr path)))
--- 591,603 ----
  		    (while (re-search-forward
  			    ;; `\(?: ... \)' is a "shy group"
  			    "\
! ^[ \t]*\\(?:\\(?:MANDATORY_\\|OPTIONAL_\\)?MANPATH[ \t]+\\(\\S-+\\)\\|\
! MANPATH_MAP[ \t]+\\(\\S-+\\)[ \t]+\\(\\S-+\\)\\)" nil t)
! 		      (add-to-list 'manpath
! 				   (if (match-beginning 1)
! 				       (match-string 1) 
! 				     (cons (match-string 2)
! 					   (match-string 3)))))
  		    manpath))
  		 ))
        (setq path (cdr path)))
***************
*** 600,605 ****
--- 612,622 ----
  selected by the value of `woman-manpath-man-regexp'.  Non-directory
  and unreadable files are ignored.
  
+ Elements can also be a cons cell indicating a mapping from PATH
+ to manual trees: if such an element's car is equal to a path
+ element of the environment variable PATH, the cdr of the cons
+ cell is included in the directory tree search.
+ 
  If not set then the environment variable MANPATH is used.  If no such
  environment variable is found, the default list is determined by
  consulting the man configuration file if found, which is determined by
***************
*** 618,624 ****
  
  The MANPATH environment variable may be set using DOS semi-colon-
  separated or UN*X/Cygwin colon-separated syntax (but not mixed)."
!   :type '(repeat string)
    :group 'woman-interface)
  
  (defcustom woman-manpath-man-regexp "[Mm][Aa][Nn]"
--- 635,641 ----
  
  The MANPATH environment variable may be set using DOS semi-colon-
  separated or UN*X/Cygwin colon-separated syntax (but not mixed)."
!   :type '(repeat (choice string (cons string string)))
    :group 'woman-interface)
  
  (defcustom woman-manpath-man-regexp "[Mm][Aa][Nn]"
***************
*** 1159,1165 ****
  Called both to generate and to check the cache!"
    ;; Must use substituted paths because values of env vars may change!
    (list woman-cache-level
! 	(mapcar 'substitute-in-file-name woman-manpath)
  	(mapcar 'substitute-in-file-name woman-path)))
  
  (defun woman-read-directory-cache ()
--- 1176,1189 ----
  Called both to generate and to check the cache!"
    ;; Must use substituted paths because values of env vars may change!
    (list woman-cache-level
! 	(let (lst path)
! 	  (dolist (dir woman-manpath (nreverse lst))
! 	    (when (consp dir)
! 	      (unless path
! 		(setq path
! 		      (split-string (getenv "PATH") path-separator t)))
! 	      (setq dir (and (member (car dir) path) (cdr dir))))
! 	    (when dir (add-to-list 'lst (substitute-in-file-name dir)))))
  	(mapcar 'substitute-in-file-name woman-path)))
  
  (defun woman-read-directory-cache ()
***************
*** 1320,1329 ****
    ;; Allow each path to be a single string or a list of strings:
    (if (not (listp woman-manpath)) (setq woman-manpath (list woman-manpath)))
    (if (not (listp woman-path)) (setq woman-path (list woman-path)))
!   (let (dir head dirs)
      (while woman-manpath
        (setq dir (car woman-manpath)
  	    woman-manpath (cdr woman-manpath))
        (if (and dir (woman-file-readable-p dir))
  	  ;; NB: `parse-colon-path' creates null elements for
  	  ;; redundant (semi-)colons and trailing `/'s!
--- 1344,1358 ----
    ;; Allow each path to be a single string or a list of strings:
    (if (not (listp woman-manpath)) (setq woman-manpath (list woman-manpath)))
    (if (not (listp woman-path)) (setq woman-path (list woman-path)))
!   (let (dir head dirs path)
      (while woman-manpath
        (setq dir (car woman-manpath)
  	    woman-manpath (cdr woman-manpath))
+       (when (consp dir)
+ 	(unless path
+ 	  (setq path (split-string (getenv "PATH") path-separator t)))
+ 	(setq dir (and (member (car dir) path)
+ 		       (cdr dir))))
        (if (and dir (woman-file-readable-p dir))
  	  ;; NB: `parse-colon-path' creates null elements for
  	  ;; redundant (semi-)colons and trailing `/'s!

[-- Attachment #3: Type: text/plain, Size: 52 bytes --]



-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  parent reply	other threads:[~2007-03-23 21:09 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-23 10:29 Fixes to let woman.el deal with MANPATH_MAP elements David Kastrup
2007-03-23 14:16 ` Eli Zaretskii
2007-03-23 18:34   ` David Kastrup
2007-03-23 20:03     ` David Kastrup
2007-03-23 20:12       ` Drew Adams
2007-03-23 20:25         ` David Kastrup
2007-03-23 21:09       ` David Kastrup [this message]
2007-03-23 18:00 ` Richard Stallman
2007-03-24 15:09   ` David Kastrup
2007-03-24 16:57     ` Eli Zaretskii
2007-03-24 17:07       ` David Kastrup
2007-03-24 17:39         ` Eli Zaretskii
2007-03-31 15:25   ` David Kastrup

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=858xdnekft.fsf@lola.goethe.zz \
    --to=dak@gnu.org \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.