all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Lars Hansen <larsh@math.ku.dk>
Cc: emacs-devel@gnu.org
Subject: Re: file-relative-name and remote files
Date: Thu, 27 Feb 2003 21:03:44 +0100	[thread overview]
Message-ID: <3E5E6F20.6030905@math.ku.dk> (raw)

I suggest the following implementation of file-relative-name.
It does not require a new file handler operation, it detects
remote files in the same way as file-remote-p do. Please see
the doc string for further explanation.

(defun file-relative-name (filename &optional directory separate-trees)
  "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 SEPARATE-TREES is non-nil and FILENAME and DIRECTORY lie on different
machines or on different drives (DOS/Windows), it returns FILENAME on
expanded form."
  (save-match-data
    (setq
      directory
      (file-name-as-directory (expand-file-name (or directory 
default-directory))))
    (setq filename (expand-file-name filename))
    (let ((hf (find-file-name-handler filename 'file-local-copy))
          (hd (find-file-name-handler directory 'file-local-copy)))
      (when (and hf (not (get hf 'file-remote-p))) (setq hf nil))
      (when (and hd (not (get hd 'file-remote-p))) (setq hd nil))
      (if
        (and
          separate-trees
          ;; Conditions for separate trees
          (or
            ;; Test for different drives on DOS/Windows
            (and
              (memq system-type '(ms-dos cygwin windows-nt))
              (not (string-equal (substring filename  0 2) (substring 
directory 0 2))))
            ;; Test for different remote file handlers
            (not (eq hf hd))
            ;; Test for different remote file system identification
            (and
              hf
              (let ((re (car (rassq hf file-name-handler-alist))))
                (not
                  (equal
                    (and
                      (string-match re filename)
                      (substring filename 0 (match-end 0)))
                    (and
                      (string-match re directory)
                      (substring directory 0 (match-end 0)))))))))
        filename
        (unless (eq (aref filename 0) ?/) (setq filename (concat "/" 
filename)))
        (unless (eq (aref directory 0) ?/) (setq directory (concat "/" 
directory)))
        (let (
          (ancestor ".")
          (filename-dir (file-name-as-directory filename)))
          (while
            (and
              (not (string-match (concat "^" (regexp-quote directory)) 
filename-dir))
              (not (string-match (concat "^" (regexp-quote directory)) 
filename)))
            (setq
              directory (file-name-directory (substring directory 0 -1))
              ancestor (if (equal ancestor ".") ".." (concat "../" 
ancestor))))
          ;; Now ancestor is empty, or .., or ../.., etc.
          (if (string-match (concat "^" (regexp-quote directory)) filename)
            ;; We matched within FILENAME's directory part.
            ;; Add the rest of FILENAME onto ANCESTOR.
            (let ((rest (substring filename (match-end 0))))
              (if (and (equal ancestor ".") (not (equal rest "")))
                ;; But don't bother with ANCESTOR if it would give us `./'.
                rest
                (concat (file-name-as-directory ancestor) rest)))
            ;; We matched FILENAME's directory equivalent.
            ancestor))))))

             reply	other threads:[~2003-02-27 20:03 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-02-27 20:03 Lars Hansen [this message]
2003-03-01  2:25 ` file-relative-name and remote files Richard Stallman
2003-03-24 11:43 ` Kai Großjohann
2003-03-25  0:52   ` Richard Stallman
     [not found] <E18xZCF-0008JB-04@monty-python.gnu.org>
2003-03-25 12:22 ` Lars Hansen
2003-03-25 14:46   ` Kai Großjohann
     [not found] <E18xQiP-00067n-01@monty-python.gnu.org>
2003-03-24 12:58 ` Lars Hansen
2003-03-24 18:24   ` Kai Großjohann
     [not found] <E18t79a-00069E-04@monty-python.gnu.org>
2003-03-14 20:40 ` Lars Hansen
     [not found] <E18sn8p-0003dO-01@monty-python.gnu.org>
2003-03-12  7:20 ` Lars Hansen
2003-03-12 11:53   ` Kai Großjohann
     [not found] <E18s4BL-0000Xi-00@monty-python.gnu.org>
2003-03-11 10:05 ` Lars Hansen
2003-03-11 10:34   ` Lars Hansen
2003-03-11 15:08   ` Kai Großjohann
     [not found] <E18rhhr-0005Oc-03@monty-python.gnu.org>
2003-03-08 20:05 ` Lars Hansen
2003-03-09 13:36   ` Kai Großjohann
     [not found] <E18rQiV-0004PA-00@monty-python.gnu.org>
2003-03-08  8:38 ` Lars Hansen
2003-03-08  8:46 ` Lars Hansen
2003-03-08 14:41   ` Kai Großjohann
     [not found] <E18nLzM-0001k5-01@monty-python.gnu.org>
2003-02-24 21:24 ` Lars Hansen
2003-02-24 21:36   ` Stefan Monnier
2003-02-24 21:52     ` Lars Hansen
2003-02-25 16:57   ` Richard Stallman
2003-02-26  9:41     ` Lars Hansen
2003-02-26 23:24       ` Richard Stallman
2003-02-27 14:22         ` Lars Hansen
2003-03-01  2:25           ` Richard Stallman
2003-03-03 10:22             ` Lars Hansen
2003-03-07 20:57             ` Kai Großjohann
2003-03-17  4:52               ` Richard Stallman
2003-03-21 14:20                 ` Kai Großjohann
2003-03-24  2:05                   ` Richard Stallman
2003-03-07 21:02           ` Kai Großjohann
2003-03-09 19:25             ` Richard Stallman
2003-02-27 17:02         ` Kai Großjohann
2003-02-27 17:05         ` Kai Großjohann
2003-02-27 17:37           ` Andreas Schwab
2003-02-28 14:53             ` Kai Großjohann
2003-02-28 15:43               ` Andreas Schwab
2003-02-28 16:27                 ` Miles Bader
2003-02-28 18:35                   ` Stefan Monnier
2003-02-28 21:32                     ` Andreas Schwab
2003-03-01 13:00                     ` Kai Großjohann
2003-03-02 15:06                       ` Richard Stallman
  -- strict thread matches above, loose matches on Subject: below --
2003-02-23 15:42 Lars Hansen
2003-02-23 16:41 ` Kai Großjohann
2003-02-23 18:30 ` Stefan Monnier
2003-02-23 20:42   ` Lars Hansen
2003-02-26  9:46     ` Richard Stallman
2003-02-23 10:36 Lars Hansen
2003-02-23 11:03 ` Kai Großjohann
2003-02-24 16:38   ` Richard Stallman
2003-02-28 18:33 ` Kai Großjohann

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=3E5E6F20.6030905@math.ku.dk \
    --to=larsh@math.ku.dk \
    --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.