Commit 2d6562a5 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

(file-relative-name): Expand both args before

checking for device mismatch.

(file-relative-name): Handle differing drive letters on Microsoft systems.
parent f2b7eb26
......@@ -1864,16 +1864,28 @@ If the value is nil, don't make a backup."
(car (cdr (file-attributes filename))))
(defun file-relative-name (filename &optional directory)
"Convert FILENAME to be relative to DIRECTORY (default: default-directory)."
"Convert FILENAME to be relative to DIRECTORY (default: default-directory).
This function returns a relative file name which is equivalent to FILENAME
when used with that default directory as the default.
If this is impossible (which can happen on MSDOS and Windows
when the file name and directory use different drive names)
then it returns FILENAME."
(setq filename (expand-file-name filename)
directory (file-name-as-directory
(expand-file-name (or directory default-directory))))
(let ((ancestor ""))
(while (not (string-match (concat "^" (regexp-quote directory)) filename))
(setq directory (file-name-directory (substring directory 0 -1))
ancestor (concat "../" ancestor)))
(concat ancestor (substring filename (match-end 0))))))
(setq fname (expand-file-name filename)
directory (file-name-as-directory
(expand-file-name (or directory default-directory))))
;; On Microsoft OSes, if FILENAME and DIRECTORY have different
;; drive names, they can't be relative, so return the absolute name.
(if (and (or (eq system-type 'ms-dos)
(eq system-type 'windows-nt))
(not (string-equal (substring fname 0 2)
(substring directory 0 2))))
(let ((ancestor ""))
(while (not (string-match (concat "^" (regexp-quote directory)) fname))
(setq directory (file-name-directory (substring directory 0 -1))
ancestor (concat "../" ancestor)))
(concat ancestor (substring fname (match-end 0)))))))
(defun save-buffer (&optional args)
"Save current buffer in visited file if modified. Versions described below.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment