]> code.delx.au - gnu-emacs/blobdiff - lisp/net/tramp-fish.el
Add 2008 to copyright years.
[gnu-emacs] / lisp / net / tramp-fish.el
index 8c650b550e9e949d5a3146721d6db28cb078bedb..f6f455b18232a4c77d15c34d7b2de89758ea25a4 100644 (file)
@@ -1,7 +1,6 @@
-;;; -*- coding: iso-8859-1; -*-
 ;;; tramp-fish.el --- Tramp access functions for FISH protocol
 
-;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
 
 ;; Author: Michael Albinus <michael.albinus@gmx.de>
 ;; Keywords: comm, processes
@@ -10,8 +9,8 @@
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3 of the License, or
-;; (at your option) any later version.
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 (require 'tramp)
 (require 'tramp-cache)
-
-;; Pacify byte-compiler
-(eval-when-compile
-  (require 'cl)
-  (require 'custom))
-
-;; Avoid byte-compiler warnings if the byte-compiler supports this.
-;; Currently, XEmacs supports this.
-(eval-when-compile
-  (when (featurep 'xemacs)
-      (byte-compiler-options (warnings (- unused-vars)))))
-
-;; `directory-sep-char' is an obsolete variable in Emacs.  But it is
-;; used in XEmacs, so we set it here and there.  The following is needed
-;; to pacify Emacs byte-compiler.
-(eval-when-compile
-  (unless (boundp 'byte-compile-not-obsolete-var)
-    (defvar byte-compile-not-obsolete-var nil))
-  (setq byte-compile-not-obsolete-var 'directory-sep-char))
+(require 'tramp-compat)
 
 ;; Define FISH method ...
 (defcustom tramp-fish-method "fish"
@@ -327,10 +308,10 @@ pass to the OPERATION."
         v1 'file-error "Error with add-name-to-file %s" newname)))))
 
 (defun tramp-fish-handle-copy-file
-  (filename newname &optional ok-if-already-exists keep-date)
+  (filename newname &optional ok-if-already-exists keep-date preserve-uid-gid)
   "Like `copy-file' for Tramp files."
   (tramp-fish-do-copy-or-rename-file
-   'copy filename newname ok-if-already-exists keep-date))
+   'copy filename newname ok-if-already-exists keep-date preserve-uid-gid))
 
 (defun tramp-fish-handle-delete-directory (directory)
   "Like `delete-directory' for Tramp files."
@@ -365,8 +346,8 @@ pass to the OPERATION."
   ;; Unless NAME is absolute, concat DIR and NAME.
   (unless (file-name-absolute-p name)
     (setq name (concat (file-name-as-directory dir) name)))
-  ;; If NAME is not a tramp file, run the real handler
-  (if (or (tramp-completion-mode) (not (tramp-tramp-file-p name)))
+  ;; If NAME is not a Tramp file, run the real handler,
+  (if (or (tramp-completion-mode-p) (not (tramp-tramp-file-p name)))
       (tramp-drop-volume-letter
        (tramp-run-real-handler 'expand-file-name (list name nil)))
     ;; Dissect NAME.
@@ -387,7 +368,7 @@ pass to the OPERATION."
              (tramp-fish-send-command-and-check v "#PWD")
              (with-current-buffer (tramp-get-buffer v)
                (goto-char (point-min))
-               (buffer-substring (point) (tramp-line-end-position)))))
+               (buffer-substring (point) (tramp-compat-line-end-position)))))
          (setq localname (concat uname fname))))
       ;; There might be a double slash, for example when "~/"
       ;; expands to "/". Remove this.
@@ -400,7 +381,7 @@ pass to the OPERATION."
       ;; bound, because on Windows there would be problems with UNC
       ;; shares or Cygwin mounts.
       (tramp-let-maybe directory-sep-char ?/
-       (let ((default-directory (tramp-temporary-file-directory)))
+       (let ((default-directory (tramp-compat-temporary-file-directory)))
          (tramp-make-tramp-file-name
           method user host
           (tramp-drop-volume-letter
@@ -494,14 +475,14 @@ pass to the OPERATION."
       (tramp-error
        v 'file-error
        "Cannot make local copy of non-existing file `%s'" filename))
-    (let ((tmpfil (tramp-make-temp-file filename)))
-      (tramp-message v 4 "Fetching %s to tmp file %s..." filename tmpfil)
+    (let ((tmpfile (tramp-compat-make-temp-file filename)))
+      (tramp-message v 4 "Fetching %s to tmp file %s..." filename tmpfile)
       (when (tramp-fish-retrieve-data v)
        ;; Save file
        (with-current-buffer (tramp-get-buffer v)
-         (write-region (point-min) (point-max) tmpfil))
-       (tramp-message v 4 "Fetching %s to tmp file %s...done" filename tmpfil)
-       tmpfil))))
+         (write-region (point-min) (point-max) tmpfile))
+       (tramp-message v 4 "Fetching %s to tmp file %s...done" filename tmpfile)
+       tmpfile))))
 
 ;; This function should return "foo/" for directories and "bar" for
 ;; files.
@@ -743,7 +724,7 @@ target of the symlink differ."
     (if (zerop (process-file "which" nil t nil command))
        (progn
          (goto-char (point-min))
-         (buffer-substring (point-min) (tramp-line-end-position))))))
+         (buffer-substring (point-min) (tramp-compat-line-end-position))))))
 
 (defun tramp-fish-handle-process-file
   (program &optional infile destination display &rest args)
@@ -753,8 +734,8 @@ target of the symlink differ."
     (error "Implementation does not handle immediate return"))
 
   (with-parsed-tramp-file-name default-directory nil
-    (let ((temp-name-prefix (tramp-make-tramp-temp-file v))
-         command input output stderr outbuf tmpfil ret)
+    (let (command input tmpinput output tmpoutput stderr tmpstderr
+                 outbuf tmpfile ret)
       ;; Compute command.
       (setq command (mapconcat 'tramp-shell-quote-argument
                               (cons program args) " "))
@@ -766,15 +747,14 @@ target of the symlink differ."
            ;; INFILE is on the same remote host.
            (setq input (with-parsed-tramp-file-name infile nil localname))
          ;; INFILE must be copied to remote host.
-         (setq input (concat temp-name-prefix ".in"))
-         (copy-file
-          infile
-          (tramp-make-tramp-file-name method user host input)
-          t)))
+         (setq input (tramp-make-tramp-temp-file v)
+               tmpinput (tramp-make-tramp-file-name method user host input))
+         (copy-file infile tmpinput t)))
       (when input (setq command (format "%s <%s" command input)))
 
       ;; Determine output.
-      (setq output (concat temp-name-prefix ".out"))
+      (setq output (tramp-make-tramp-temp-file v)
+           tmpoutput (tramp-make-tramp-file-name method user host output))
       (cond
        ;; Just a buffer
        ((bufferp destination)
@@ -800,7 +780,9 @@ target of the symlink differ."
                               (cadr destination) nil localname))
            ;; stderr must be copied to remote host.  The temporary
            ;; file must be deleted after execution.
-           (setq stderr (concat temp-name-prefix ".err"))))
+           (setq stderr (tramp-make-tramp-temp-file v)
+                 tmpstderr (tramp-make-tramp-file-name
+                            method user host stderr))))
         ;; stderr to be discarded
         ((null (cadr destination))
          (setq stderr "/dev/null"))))
@@ -809,9 +791,6 @@ target of the symlink differ."
        (setq outbuf (current-buffer))))
       (when stderr (setq command (format "%s 2>%s" command stderr)))
 
-      ;; If we have a temporary file, it must be removed after operation.
-      (when (and input (string-match temp-name-prefix input))
-       (setq command (format "%s; rm %s" command input)))
       ;; Goto working directory.
       (unless
          (tramp-fish-send-command-and-check
@@ -824,31 +803,31 @@ target of the symlink differ."
                       v (format
                          "#EXEC %s %s"
                          (tramp-shell-quote-argument command) output))
-               (error))
+               (error nil))
            ;; Check return code.
-           (setq tmpfil (file-local-copy
-                         (tramp-make-tramp-file-name method user host output)))
+           (setq tmpfile
+                 (file-local-copy
+                  (tramp-make-tramp-file-name method user host output)))
            (with-temp-buffer
-             (insert-file-contents tmpfil)
+             (insert-file-contents tmpfile)
              (goto-char (point-max))
              (forward-line -1)
              (looking-at "^###RESULT: \\([0-9]+\\)")
              (setq ret (string-to-number (match-string 1)))
              (delete-region (point) (point-max))
-             (write-region (point-min) (point-max) tmpfil))
+             (write-region (point-min) (point-max) tmpfile))
            ;; We should show the output anyway.
            (when outbuf
-             (with-current-buffer outbuf (insert-file-contents tmpfil))
-             (when display (display-buffer outbuf)))
-           ;; Remove output file.
-           (delete-file (tramp-make-tramp-file-name method user host output)))
+             (with-current-buffer outbuf (insert-file-contents tmpfile))
+             (when display (display-buffer outbuf))))
        ;; When the user did interrupt, we should do it also.
        (error (setq ret 1)))
-      (unless ret
-       ;; Provide error file.
-       (when (and stderr (string-match temp-name-prefix stderr))
-         (rename-file (tramp-make-tramp-file-name method user host stderr)
-                      (cadr destination) t)))
+
+      ;; Provide error file.
+      (when tmpstderr (rename-file tmpstderr (cadr destination) t))
+      ;; Cleanup.
+      (when tmpinput (delete-file tmpinput))
+      (when tmpoutput (delete-file tmpoutput))
       ;; Return exit status.
       ret)))
 
@@ -856,7 +835,7 @@ target of the symlink differ."
 ;; Internal file name functions
 
 (defun tramp-fish-do-copy-or-rename-file
-  (op filename newname &optional ok-if-already-exists keep-date)
+  (op filename newname &optional ok-if-already-exists keep-date preserve-uid-gid)
   "Copy or rename a remote file.
 OP must be `copy' or `rename' and indicates the operation to
 perform.  FILENAME specifies the file to copy or rename, NEWNAME
@@ -890,7 +869,7 @@ file names."
           ;; directly.
           ((tramp-equal-remote filename newname)
            (tramp-fish-do-copy-or-rename-file-directly
-            op filename newname keep-date))
+            op filename newname keep-date preserve-uid-gid))
           ;; No shortcut was possible.  So we copy the
           ;; file first.  If the operation was `rename', we go
           ;; back and delete the original file (if the copy was
@@ -920,12 +899,13 @@ file names."
          (tramp-flush-file-property v (file-name-directory localname)))))))
 
 (defun tramp-fish-do-copy-or-rename-file-directly
-  (op filename newname keep-date)
+  (op filename newname keep-date preserve-uid-gid)
   "Invokes `COPY' or `RENAME' on the remote system.
 OP must be one of `copy' or `rename', indicating `cp' or `mv',
 respectively.  VEC specifies the connection.  LOCALNAME1 and
 LOCALNAME2 specify the two arguments of `cp' or `mv'.  If
-KEEP-DATE is non-nil, preserve the time stamp when copying."
+KEEP-DATE is non-nil, preserve the time stamp when copying.
+PRESERVE-UID-GID is completely ignored."
   (with-parsed-tramp-file-name filename v1
     (with-parsed-tramp-file-name newname v2
       (tramp-fish-send-command
@@ -936,7 +916,7 @@ KEEP-DATE is non-nil, preserve the time stamp when copying."
               (tramp-shell-quote-argument v2-localname)))))
   ;; KEEP-DATE handling.
   (when (and keep-date (functionp 'set-file-times))
-    (apply 'set-file-times (list newname (nth 5 (file-attributes filename)))))
+    (set-file-times newname (nth 5 (file-attributes filename))))
   ;; Set the mode.
   (set-file-modes newname (file-modes filename)))
 
@@ -962,7 +942,7 @@ SIZE MODE WEIRD INODE DEVICE)."
        ;; Read number of entries
        (goto-char (point-min))
        (condition-case nil
-           (unless (integerp (setq num (read (current-buffer)))) (error))
+           (unless (integerp (setq num (read (current-buffer)))) (error nil))
          (error (return nil)))
        (forward-line)
        (delete-region (point-min) (point))
@@ -970,7 +950,7 @@ SIZE MODE WEIRD INODE DEVICE)."
        ;; Read return code
        (goto-char (point-min))
        (condition-case nil
-           (unless (looking-at tramp-fish-continue-prompt-regexp) (error))
+           (unless (looking-at tramp-fish-continue-prompt-regexp) (error nil))
          (error (return nil)))
        (forward-line)
        (delete-region (point-min) (point))
@@ -987,7 +967,7 @@ SIZE MODE WEIRD INODE DEVICE)."
        ;; Read return code
        (goto-char (point-min))
        (condition-case nil
-           (unless (looking-at tramp-fish-ok-prompt-regexp) (error))
+           (unless (looking-at tramp-fish-ok-prompt-regexp) (error nil))
          (error (tramp-error
                  vec 'file-error
                  "`%s' does not return a valid Lisp expression: `%s'"
@@ -1072,7 +1052,7 @@ Returns the size of the data."
        ;; Read filesize
        (goto-char (point-min))
        (condition-case nil
-           (unless (integerp (setq size (read (current-buffer)))) (error))
+           (unless (integerp (setq size (read (current-buffer)))) (error nil))
          (error (return nil)))
        (forward-line)
        (delete-region (point-min) (point))
@@ -1080,7 +1060,7 @@ Returns the size of the data."
        ;; Read return code
        (goto-char (point-min))
        (condition-case nil
-           (unless (looking-at tramp-fish-continue-prompt-regexp) (error))
+           (unless (looking-at tramp-fish-continue-prompt-regexp) (error nil))
          (error (return nil)))
        (forward-line)
        (delete-region (point-min) (point))
@@ -1096,7 +1076,7 @@ Returns the size of the data."
        ;; Read return code
        (goto-char (+ (point-min) size))
        (condition-case nil
-           (unless (looking-at tramp-fish-ok-prompt-regexp) (error))
+           (unless (looking-at tramp-fish-ok-prompt-regexp) (error nil))
          (error (return nil)))
        (delete-region (+ (point-min) size) (point-max))
        size))))
@@ -1133,7 +1113,8 @@ connection if a previous connection has died for some reason."
             (coding-system-for-read 'binary)
             (coding-system-for-write 'binary)
             ;; This must be done in order to avoid our file name handler.
-            (p (let ((default-directory (tramp-temporary-file-directory)))
+            (p (let ((default-directory
+                       (tramp-compat-temporary-file-directory)))
                  (start-process
                   (or (tramp-get-connection-property vec "process-name" nil)
                       (tramp-buffer-name vec))