BATOSAY Shell
Server IP : 170.10.162.208  /  Your IP : 216.73.216.181
Web Server : LiteSpeed
System : Linux altar19.supremepanel19.com 4.18.0-553.69.1.lve.el8.x86_64 #1 SMP Wed Aug 13 19:53:59 UTC 2025 x86_64
User : deltahospital ( 1806)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /tmp/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /tmp/phpCLOArg
(defalias 'svn-examine 'svn-status)
(autoload 'svn-status "psvn" "Examine the status of Subversion working copy in
directory DIR.")
;ELC
;;; Compiled
;;; in Emacs version 26.1
;;; with all optimizations.

;;; This file uses dynamic docstrings, first added in Emacs 19.29.

;;; This file does not contain utf-8 non-ASCII characters,
;;; and so can be loaded in Emacs versions earlier than 23.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defvar autoconf-font-lock-keywords '(("\\bdnl \\(.*\\)" 1 font-lock-comment-face t) ("\\$[0-9*#@]" . font-lock-variable-name-face) ("\\b\\(m4_\\)?\\(builtin\\|change\\(com\\|quote\\|word\\)\\|d\\(e\\(bug\\(file\\|mode\\)\\|cr\\|f\\(ine\\|n\\)\\)\\|iv\\(ert\\|num\\)\\|nl\\|umpdef\\)\\|e\\(rrprint\\|syscmd\\|val\\)\\|f\\(ile\\|ormat\\)\\|gnu\\|i\\(f\\(def\\|else\\)\\|n\\(c\\(lude\\|r\\)\\|d\\(ex\\|ir\\)\\)\\)\\|l\\(en\\|ine\\)\\|m\\(4\\(exit\\|wrap\\)\\|aketemp\\|kstemp\\)\\|p\\(atsubst\\|opdef\\|ushdef\\)\\|regexp\\|s\\(hift\\|include\\|ubstr\\|ys\\(cmd\\|val\\)\\)\\|tra\\(ceo\\(ff\\|n\\)\\|nslit\\)\\|un\\(d\\(efine\\|ivert\\)\\|ix\\)\\)\\b" . font-lock-keyword-face) ("^\\(\\(m4_\\)?define\\(_default\\)?\\|A._DEFUN\\|m4_defun\\(_once\\|_init\\)?\\)(\\[?\\([A-Za-z0-9_]+\\)" 5 font-lock-function-name-face) "default font-lock-keywords"))
#@36 syntax table used in autoconf mode
(defvar autoconf-mode-syntax-table nil (#$ . 1255))
(byte-code "\301 \302\303\304#\210\302\305\306#\210\302\307\310#\210\302\311\312#\210\302\313\314#\210\302\315\316#\210\302\317\320#\210\302\321\322#\210\302\323\324#\207" [autoconf-mode-syntax-table make-syntax-table modify-syntax-entry 34 "\"" 35 "<\n" 10 ">#" 40 "()" 41 ")(" 91 "(]" 93 ")[" 42 "." 95 "_"] 4)
(defvar autoconf-mode-map (byte-code "\301 \302\303\304#\210)\207" [map make-sparse-keymap define-key [(control c) (\;)] comment-region] 4))
#@107 Autoconf value for `add-log-current-defun-function'.
This tells add-log.el how to find the current macro.
(defalias 'autoconf-current-defun #[nil "\212\300\301\302\303#\205\304\224\304\225{)\207" [re-search-backward "^\\(m4_define\\(_default\\)?\\|m4_defun\\(_once\\|_init\\)?\\|A._DEFUN\\)(\\[*\\([A-Za-z0-9_]+\\)" nil t 4] 4 (#$ . 1816)])
#@78 A major-mode to edit Autoconf files like configure.ac.
\{autoconf-mode-map}

(defalias 'autoconf-mode #[nil "\306 \210\307!\210\310\301!\210\311\310\302!\210\312\310\303!\210\313\310\314!\210\315\316\317\f\320!\210\321\322!\207" [autoconf-mode-map add-log-current-defun-function comment-start parse-sexp-ignore-comments major-mode mode-name kill-all-local-variables use-local-map make-local-variable autoconf-current-defun "# " t font-lock-defaults autoconf-mode "Autoconf" (autoconf-font-lock-keywords nil) set-syntax-table run-hooks autoconf-mode-hook autoconf-mode-syntax-table] 2 (#$ . 2165) nil])
(provide 'autoconf-mode)
;;; autoconf-mode.el --- autoconf code editing commands for Emacs

;; Author: Martin Buchholz (martin@xemacs.org)
;; Maintainer: Martin Buchholz
;; Keywords: languages, faces, m4, configure

;; This file is part of Autoconf

;; Copyright (C) 2001, 2006, 2009-2012 Free Software Foundation, Inc.
;;
;; This program 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.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;; A major mode for editing autoconf input (like configure.in).
;; Derived from m4-mode.el by Andrew Csillag (drew@staff.prodigy.com)

;;; Your should add the following to your Emacs configuration file:

;;  (autoload 'autoconf-mode "autoconf-mode"
;;            "Major mode for editing autoconf files." t)
;;  (setq auto-mode-alist
;;        (cons '("\\.ac\\'\\|configure\\.in\\'" . autoconf-mode)
;;              auto-mode-alist))

;;; Code:

;;thank god for make-regexp.el!
(defvar autoconf-font-lock-keywords
  `(("\\bdnl \\(.*\\)"  1 font-lock-comment-face t)
    ("\\$[0-9*#@]" . font-lock-variable-name-face)
    ("\\b\\(m4_\\)?\\(builtin\\|change\\(com\\|quote\\|word\\)\\|d\\(e\\(bug\\(file\\|mode\\)\\|cr\\|f\\(ine\\|n\\)\\)\\|iv\\(ert\\|num\\)\\|nl\\|umpdef\\)\\|e\\(rrprint\\|syscmd\\|val\\)\\|f\\(ile\\|ormat\\)\\|gnu\\|i\\(f\\(def\\|else\\)\\|n\\(c\\(lude\\|r\\)\\|d\\(ex\\|ir\\)\\)\\)\\|l\\(en\\|ine\\)\\|m\\(4\\(exit\\|wrap\\)\\|aketemp\\|kstemp\\)\\|p\\(atsubst\\|opdef\\|ushdef\\)\\|regexp\\|s\\(hift\\|include\\|ubstr\\|ys\\(cmd\\|val\\)\\)\\|tra\\(ceo\\(ff\\|n\\)\\|nslit\\)\\|un\\(d\\(efine\\|ivert\\)\\|ix\\)\\)\\b" . font-lock-keyword-face)
    ("^\\(\\(m4_\\)?define\\(_default\\)?\\|A._DEFUN\\|m4_defun\\(_once\\|_init\\)?\\)(\\[?\\([A-Za-z0-9_]+\\)" 5 font-lock-function-name-face)
    "default font-lock-keywords")
)

(defvar autoconf-mode-syntax-table nil
  "syntax table used in autoconf mode")
(setq autoconf-mode-syntax-table (make-syntax-table))
(modify-syntax-entry ?\" "\""  autoconf-mode-syntax-table)
;;(modify-syntax-entry ?\' "\""  autoconf-mode-syntax-table)
(modify-syntax-entry ?#  "<\n" autoconf-mode-syntax-table)
(modify-syntax-entry ?\n ">#"  autoconf-mode-syntax-table)
(modify-syntax-entry ?\( "()"   autoconf-mode-syntax-table)
(modify-syntax-entry ?\) ")("   autoconf-mode-syntax-table)
(modify-syntax-entry ?\[ "(]"  autoconf-mode-syntax-table)
(modify-syntax-entry ?\] ")["  autoconf-mode-syntax-table)
(modify-syntax-entry ?*  "."   autoconf-mode-syntax-table)
(modify-syntax-entry ?_  "_"   autoconf-mode-syntax-table)

(defvar autoconf-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map '[(control c) (\;)] 'comment-region)
    map))

(defun autoconf-current-defun ()
  "Autoconf value for `add-log-current-defun-function'.
This tells add-log.el how to find the current macro."
  (save-excursion
    (if (re-search-backward "^\\(m4_define\\(_default\\)?\\|m4_defun\\(_once\\|_init\\)?\\|A._DEFUN\\)(\\[*\\([A-Za-z0-9_]+\\)" nil t)
	(buffer-substring (match-beginning 4)
			  (match-end 4))
      nil)))

;;;###autoload
(defun autoconf-mode ()
  "A major-mode to edit Autoconf files like configure.ac.
\\{autoconf-mode-map}
"
  (interactive)
  (kill-all-local-variables)
  (use-local-map autoconf-mode-map)

  (make-local-variable 'add-log-current-defun-function)
  (setq add-log-current-defun-function 'autoconf-current-defun)

  (make-local-variable 'comment-start)
  (setq comment-start "# ")
  (make-local-variable 'parse-sexp-ignore-comments)
  (setq parse-sexp-ignore-comments t)

  (make-local-variable	'font-lock-defaults)
  (setq major-mode 'autoconf-mode)
  (setq mode-name "Autoconf")
  (setq font-lock-defaults `(autoconf-font-lock-keywords nil))
  (set-syntax-table autoconf-mode-syntax-table)
  (run-hooks 'autoconf-mode-hook))

(provide 'autoconf-mode)

;;; autoconf-mode.el ends here
;;; autotest-mode.el --- autotest code editing commands for Emacs

;; Author: Akim Demaille (akim@freefriends.org)
;; Keywords: languages, faces, m4, Autotest

;; This file is part of Autoconf

;; Copyright (C) 2001, 2009-2012 Free Software Foundation, Inc.
;;
;; This program 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.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; A major mode for editing autotest input (like testsuite.at).
;; Derived from autoconf-mode.el, by Martin Buchholz (martin@xemacs.org).

;;; Your should add the following to your Emacs configuration file:

;;   (autoload 'autotest-mode "autotest-mode"
;;             "Major mode for editing autotest files." t)
;;   (setq auto-mode-alist
;;         (cons '("\\.at\\'" . autotest-mode) auto-mode-alist))

;;; Code:

(defvar autotest-font-lock-keywords
  `(("\\bdnl\\b\\(.*\\)"  1 font-lock-comment-face t)
    ("\\$[0-9*#@]" . font-lock-variable-name-face)
    ("^\\(m4_define\\|m4_defun\\)(\\[*\\([A-Za-z0-9_]+\\)" 2 font-lock-function-name-face)
    ("^AT_SETUP(\\[+\\([^]]+\\)" 1 font-lock-function-name-face)
    ("^AT_DATA(\\[+\\([^]]+\\)" 1 font-lock-variable-name-face)
    ("\\b\\(_?m4_[_a-z0-9]*\\|_?A[ST]_[_A-Z0-9]+\\)\\b" . font-lock-keyword-face)
    "default font-lock-keywords")
)

(defvar autotest-mode-syntax-table nil
  "syntax table used in autotest mode")
(setq autotest-mode-syntax-table (make-syntax-table))
(modify-syntax-entry ?\" "\""  autotest-mode-syntax-table)
;;(modify-syntax-entry ?\' "\""  autotest-mode-syntax-table)
(modify-syntax-entry ?#  "<\n" autotest-mode-syntax-table)
(modify-syntax-entry ?\n ">#"  autotest-mode-syntax-table)
(modify-syntax-entry ?\( "()"   autotest-mode-syntax-table)
(modify-syntax-entry ?\) ")("   autotest-mode-syntax-table)
(modify-syntax-entry ?\[ "(]"  autotest-mode-syntax-table)
(modify-syntax-entry ?\] ")["  autotest-mode-syntax-table)
(modify-syntax-entry ?*  "."   autotest-mode-syntax-table)
(modify-syntax-entry ?_  "_"   autotest-mode-syntax-table)

(defvar autotest-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map '[(control c) (\;)] 'comment-region)
    map))

(defun autotest-current-defun ()
  "Autotest value for `add-log-current-defun-function'.
This tells add-log.el how to find the current test group/macro."
  (save-excursion
    (if (re-search-backward "^\\(m4_define\\|m4_defun\\|AT_SETUP\\)(\\[+\\([^]]+\\)" nil t)
	(buffer-substring (match-beginning 2)
			  (match-end 2))
      nil)))

;;;###autoload
(defun autotest-mode ()
  "A major-mode to edit Autotest files like testsuite.at.
\\{autotest-mode-map}
"
  (interactive)
  (kill-all-local-variables)
  (use-local-map autotest-mode-map)

  (make-local-variable 'add-log-current-defun-function)
  (setq add-log-current-defun-function 'autotest-current-defun)

  (make-local-variable 'comment-start)
  (setq comment-start "# ")
  (make-local-variable 'parse-sexp-ignore-comments)
  (setq parse-sexp-ignore-comments t)

  (make-local-variable	'font-lock-defaults)
  (setq major-mode 'autotest-mode)
  (setq mode-name "Autotest")
  (setq font-lock-defaults `(autotest-font-lock-keywords nil))
  (set-syntax-table autotest-mode-syntax-table)
  (run-hooks 'autotest-mode-hook))

(provide 'autotest-mode)

;;; autotest-mode.el ends here
;ELC
;;; Compiled
;;; in Emacs version 26.1
;;; with all optimizations.

;;; This file uses dynamic docstrings, first added in Emacs 19.29.

;;; This file does not contain utf-8 non-ASCII characters,
;;; and so can be loaded in Emacs versions earlier than 23.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defvar autotest-font-lock-keywords '(("\\bdnl\\b\\(.*\\)" 1 font-lock-comment-face t) ("\\$[0-9*#@]" . font-lock-variable-name-face) ("^\\(m4_define\\|m4_defun\\)(\\[*\\([A-Za-z0-9_]+\\)" 2 font-lock-function-name-face) ("^AT_SETUP(\\[+\\([^]]+\\)" 1 font-lock-function-name-face) ("^AT_DATA(\\[+\\([^]]+\\)" 1 font-lock-variable-name-face) ("\\b\\(_?m4_[_a-z0-9]*\\|_?A[ST]_[_A-Z0-9]+\\)\\b" . font-lock-keyword-face) "default font-lock-keywords"))
#@36 syntax table used in autotest mode
(defvar autotest-mode-syntax-table nil (#$ . 859))
(byte-code "\301 \302\303\304#\210\302\305\306#\210\302\307\310#\210\302\311\312#\210\302\313\314#\210\302\315\316#\210\302\317\320#\210\302\321\322#\210\302\323\324#\207" [autotest-mode-syntax-table make-syntax-table modify-syntax-entry 34 "\"" 35 "<\n" 10 ">#" 40 "()" 41 ")(" 91 "(]" 93 ")[" 42 "." 95 "_"] 4)
(defvar autotest-mode-map (byte-code "\301 \302\303\304#\210)\207" [map make-sparse-keymap define-key [(control c) (\;)] comment-region] 4))
#@118 Autotest value for `add-log-current-defun-function'.
This tells add-log.el how to find the current test group/macro.
(defalias 'autotest-current-defun #[nil "\212\300\301\302\303#\205\304\224\304\225{)\207" [re-search-backward "^\\(m4_define\\|m4_defun\\|AT_SETUP\\)(\\[+\\([^]]+\\)" nil t 2] 4 (#$ . 1419)])
#@78 A major-mode to edit Autotest files like testsuite.at.
\{autotest-mode-map}

(defalias 'autotest-mode #[nil "\306 \210\307!\210\310\301!\210\311\310\302!\210\312\310\303!\210\313\310\314!\210\315\316\317\f\320!\210\321\322!\207" [autotest-mode-map add-log-current-defun-function comment-start parse-sexp-ignore-comments major-mode mode-name kill-all-local-variables use-local-map make-local-variable autotest-current-defun "# " t font-lock-defaults autotest-mode "Autotest" (autotest-font-lock-keywords nil) set-syntax-table run-hooks autotest-mode-hook autotest-mode-syntax-table] 2 (#$ . 1736) nil])
(provide 'autotest-mode)
;;; psvn.el --- Subversion interface for emacs
;; Copyright (C) 2002-2015 by Stefan Reichoer

;; Author: Stefan Reichoer <stefan@xsteve.at>
;; Note: This version is currently not under svn control
;; For the revision date see svn-psvn-revision below

;; psvn.el 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 2, or (at your option)
;; any later version.

;; psvn.el is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary

;; psvn.el is tested with GNU Emacs 21.3 on windows, debian linux,
;; freebsd5, red hat el4, ubuntu 11.10 with svn 1.6.12

;; psvn.el needs at least svn 1.1.0
;; if you upgrade to a higher version, you need to do a fresh checkout

;; psvn.el is an interface for the revision control tool subversion
;; (see http://subversion.tigris.org)
;; psvn.el provides a similar interface for subversion as pcl-cvs for cvs.
;; At the moment the following commands are implemented:
;;
;; M-x svn-status: run 'svn -status -v'
;; M-x svn-examine (like pcl-cvs cvs-examine) is alias for svn-status
;;
;; and show the result in the svn-status-buffer-name buffer (normally: *svn-status*).
;; If svn-status-verbose is set to nil, only "svn status" without "-v"
;; is run. Currently you have to toggle this variable manually.
;; This buffer uses svn-status mode in which the following keys are defined:
;; g     - svn-status-update:               run 'svn status -v'
;; M-s   - svn-status-update:               run 'svn status -v'
;; C-u g - svn-status-update:               run 'svn status -vu'
;; =     - svn-status-show-svn-diff         run 'svn diff'
;; l     - svn-status-show-svn-log          run 'svn log'
;; i     - svn-status-info                  run 'svn info'
;; r     - svn-status-revert                run 'svn revert'
;; X v   - svn-status-resolved              run 'svn resolved'
;; U     - svn-status-update-cmd            run 'svn update'
;; M-u   - svn-status-update-cmd            run 'svn update'
;; c     - svn-status-commit                run 'svn commit'
;; a     - svn-status-add-file              run 'svn add --non-recursive'
;; A     - svn-status-add-file-recursively  run 'svn add'
;; +     - svn-status-make-directory        run 'svn mkdir'
;; R     - svn-status-mv                    run 'svn mv'
;; C     - svn-status-cp                    run 'svn cp'
;; D     - svn-status-rm                    run 'svn rm'
;; M-c   - svn-status-cleanup               run 'svn cleanup'
;; k     - svn-status-lock                  run 'svn lock'
;; K     - svn-status-unlock                run 'svn unlock'
;; b     - svn-status-blame                 run 'svn blame'
;; X e   - svn-status-export                run 'svn export'
;; RET   - svn-status-find-file-or-examine-directory
;; ^     - svn-status-examine-parent
;; ~     - svn-status-get-specific-revision
;; E     - svn-status-ediff-with-revision
;; X X   - svn-status-resolve-conflicts
;; S g   - svn-status-grep-files
;; S s   - svn-status-search-files
;; s     - svn-status-show-process-buffer
;; h     - svn-status-pop-to-partner-buffer
;; e     - svn-status-toggle-edit-cmd-flag
;; ?     - svn-status-toggle-hide-unknown
;; _     - svn-status-toggle-hide-unmodified
;; z     - svn-status-toggle-hide-externals
;; m     - svn-status-set-user-mark
;; u     - svn-status-unset-user-mark
;; $     - svn-status-toggle-elide
;; w     - svn-status-copy-current-line-info
;; DEL   - svn-status-unset-user-mark-backwards
;; * !   - svn-status-unset-all-usermarks
;; * ?   - svn-status-mark-unknown
;; * A   - svn-status-mark-added
;; * M   - svn-status-mark-modified
;; * P   - svn-status-mark-modified-properties
;; * D   - svn-status-mark-deleted
;; * *   - svn-status-mark-changed
;; * .   - svn-status-mark-by-file-ext
;; * %   - svn-status-mark-filename-regexp
;; * s   - svn-status-store-usermarks
;; * l   - svn-status-load-usermarks
;; .     - svn-status-goto-root-or-return
;; f     - svn-status-find-file
;; o     - svn-status-find-file-other-window
;; C-o   - svn-status-find-file-other-window-noselect
;; v     - svn-status-view-file-other-window
;; I     - svn-status-parse-info
;; V     - svn-status-svnversion
;; P l   - svn-status-property-list
;; P s   - svn-status-property-set
;; P d   - svn-status-property-delete
;; P e   - svn-status-property-edit-one-entry
;; P i   - svn-status-property-ignore-file
;; P I   - svn-status-property-ignore-file-extension
;; P C-i - svn-status-property-edit-svn-ignore
;; P X e - svn-status-property-edit-svn-externals
;; P k   - svn-status-property-set-keyword-list
;; P K i - svn-status-property-set-keyword-id
;; P K d - svn-status-property-set-keyword-date
;; P y   - svn-status-property-set-eol-style
;; P x   - svn-status-property-set-executable
;; P m   - svn-status-property-set-mime-type
;; H     - svn-status-use-history
;; x     - svn-status-update-buffer
;; q     - svn-status-bury-buffer

;; C-x C-j - svn-status-dired-jump

;; The output in the buffer contains this header to ease reading
;; of svn output:
;;   FPH BASE CMTD Author   em File
;; F = Filemark
;; P = Property mark
;; H = History mark
;; BASE = local base revision
;; CMTD = last committed revision
;; Author = author of change
;; em = "**" or "(Update Available)" [see `svn-status-short-mod-flag-p']
;;      if file can be updated
;; File = path/filename
;;

;; To use psvn.el put the following line in your .emacs:
;; (require 'psvn)
;; Start the svn interface with M-x svn-status

;; The latest version of psvn.el can be found at:
;;   http://www.xsteve.at/prg/emacs/psvn.el

;; TODO:
;; * shortcut for svn propset svn:keywords "Date" psvn.el
;; * docstrings for the functions
;; * perhaps shortcuts for ranges, dates
;; * when editing the command line - offer help from the svn client
;; * finish svn-status-property-set
;; * Add repository browser
;; * Get rid of all byte-compiler warnings
;; * SVK working copy support
;; * multiple independent buffers in svn-status-mode
;; There are "TODO" comments in other parts of this file as well.

;; Overview over the implemented/not (yet) implemented svn sub-commands:
;; * add                       implemented
;; * blame                     implemented
;; * cat                       implemented
;; * checkout (co)             implemented
;; * cleanup                   implemented
;; * commit (ci)               implemented
;; * copy (cp)                 implemented
;; * delete (del, remove, rm)  implemented
;; * diff (di)                 implemented
;; * export                    implemented
;; * help (?, h)
;; * import                    used         (in svn-admin-create-trunk-directory)
;; * info                      implemented
;; * list (ls)                 implemented
;; * lock                      implemented
;; * log                       implemented
;; * merge
;; * mkdir                     implemented
;; * move (mv, rename, ren)    implemented
;; * propdel (pdel)            implemented
;; * propedit (pedit, pe)      not needed
;; * propget (pget, pg)        used         (in svn-status-property-edit)
;; * proplist (plist, pl)      implemented
;; * propset (pset, ps)        used         (in svn-prop-edit-do-it)
;; * resolved                  implemented
;; * revert                    implemented
;; * status (stat, st)         implemented
;; * switch (sw)
;; * unlock                    implemented
;; * update (up)               implemented

;; For the not yet implemented commands you should use the command line
;; svn client. If there are user requests for any missing commands I will
;; probably implement them.

;; There is also limited support for the web-based software project management and bug/issue tracking system trac
;; Trac ticket links can be enabled in the *svn-log* buffers when using the following:
;; (setq svn-log-link-handlers '(trac-ticket-short))

;; ---------------------------
;; Frequently asked questions:
;; ---------------------------

;; Q1: I need support for user names with blanks/spaces
;; A1: Add the user names to svn-user-names-including-blanks and set the
;;     svn-pre-parse-status-hook.
;;     The problem is, that the user names and the file names from the svn status
;;     output can both contain blanks. Blanks in file names are supported.
;;     the svn-user-names-including-blanks list is used to replace the spaces
;;     in the user names with - to overcome this problem

;; Q2: My svn-update command it taking a really long time. How can I
;;     see what's going on?
;; A2: In the *svn-status* buffer press "s".

;; Q3: How do I enter a username and password?
;; A3: In the *svn-status* buffer press "s", switch to the
;;     *svn-process* buffer and press enter. You will be prompted for
;;     username and password.

;; Q4: What does "?", "M", and "C" in the first column of the
;;     *svn-status* buffer mean?
;; A4: "?" means the file(s) is not under Subversion control
;;     "M" means you have a locally modified file
;;     "C" means there is a conflict
;;     "@$&#!" means someone is saying nasty things to you


;; Comments / suggestions and bug reports are welcome!

;; Development notes
;; -----------------

;; "svn-" is the package prefix used in psvn.el.  There are also longer
;; prefixes which clarify the code and help symbol completion, but they
;; are not intended to prevent name clashes with other packages.  All
;; interactive commands meant to be used only in a specific mode should
;; have names beginning with the name of that mode: for example,
;; "svn-status-add-file" in "svn-status-mode".  "psvn" should be used
;; only in names of files, customization groups, and features.  If SVK
;; support is ever added, it should use "svn-svk-" when no existing
;; prefix is applicable.

;; Many of the variables marked as `risky-local-variable' are probably
;; impossible to abuse, as the commands that read them are used only in
;; buffers that are not visiting any files.  Better safe than sorry.

;;; Code:

(defconst svn-psvn-revision "2015-07-20, 21:42:00" "The revision date of psvn.")


(require 'easymenu)

(eval-when-compile (require 'dired))
(eval-when-compile (require 'ediff-util))
(eval-when-compile (require 'ediff-wind))
(eval-when-compile (require 'vc-hooks))
(eval-when-compile (require 'elp))
(eval-when-compile (require 'pp))

(condition-case nil
    (progn
      (require 'diff-mode))
  (error nil))


;;; user setable variables
(defcustom svn-status-verbose t
  "*Add '-v' to svn status call.
This can be toggled with \\[svn-status-toggle-svn-verbose-flag]."
  :type 'boolean
  :group 'psvn)
(defcustom svn-log-edit-file-name "++svn-log++"
  "*Name of a saved log file.
This can be either absolute, or relative to the default directory
of the `svn-log-edit-buffer-name' buffer."
  :type 'file
  :group 'psvn)
(put 'svn-log-edit-file-name 'risky-local-variable t)
(defcustom svn-log-edit-insert-files-to-commit t
  "*Insert the filelist to commit in the *svn-log* buffer"
  :type 'boolean
  :group 'psvn)
(defcustom svn-log-edit-show-diff-for-commit nil
  "*Show the diff being committed when you run `svn-status-commit.'."
  :type 'boolean
  :group 'psvn)
(defcustom svn-log-edit-use-log-edit-mode
  (and (condition-case nil (require 'log-edit) (error nil)) t)
  "*Use log-edit-mode as base for svn-log-edit-mode
This variable takes effect only when psvn.el is being loaded."
  :type 'boolean
  :group 'psvn)
(defcustom svn-log-edit-paragraph-start
  "$\\|[ \t]*$\\|##.*$\\|\\*.*:.*$\\|[ \t]+(.+):.*$"
  "*Value used for `paragraph-start' in `svn-log-edit-buffer-name' buffer."
  :type 'regexp
  :group 'psvn)
(defcustom svn-log-edit-paragraph-separate "$\\|##.*$"
  "*Value used for `paragraph-separate' in `svn-log-edit-buffer-name' buffer."
  :type 'regexp
  :group 'psvn)
(defcustom svn-status-hide-unknown nil
  "*Hide unknown files in `svn-status-buffer-name' buffer.
This can be toggled with \\[svn-status-toggle-hide-unknown]."
  :type 'boolean
  :group 'psvn)
(defcustom svn-status-hide-unmodified nil
  "*Hide unmodified files in `svn-status-buffer-name' buffer.
This can be toggled with \\[svn-status-toggle-hide-unmodified]."
  :type 'boolean
  :group 'psvn)
(defcustom svn-status-hide-externals nil
  "*Hide external files in `svn-status-buffer-name' buffer.
This can be toggled with \\[svn-status-toggle-hide-externals]."
  :type 'boolean
  :group 'psvn)
(defcustom svn-status-sort-status-buffer t
  "*Whether to sort the `svn-status-buffer-name' buffer.

Setting this variable to nil speeds up \\[M-x svn-status], however the
listing may then become incorrect.

This can be toggled with \\[svn-status-toggle-sort-status-buffer]."
  :type 'boolean
  :group 'psvn)

(defcustom svn-status-ediff-delete-temporary-files nil
  "*Whether to delete temporary ediff files. If set to ask, ask the user"
  :type '(choice (const t)
                 (const nil)
                 (const ask))
  :group 'psvn)

(defcustom svn-status-changelog-style 'changelog
  "*The changelog style that is used for `svn-file-add-to-changelog'.
Possible values are:
 'changelog: use `add-change-log-entry-other-window'
 'svn-dev: use commit messages that are used by the svn developers
 a function: This function is called to add a new entry to the changelog file.
"
  :type '(set (const changelog)
              (const svn-dev))
  :group 'psvn)

(defcustom svn-status-unmark-files-after-list '(commit revert)
  "*List of operations after which all user marks will be removed.
Possible values are: commit, revert."
  :type '(set (const commit)
              (const revert))
  :group 'psvn)

(defcustom svn-status-preserve-window-configuration t
  "*Try to preserve the window configuration."
  :type 'boolean
  :group 'psvn)

(defcustom svn-status-auto-revert-buffers t
  "*Auto revert buffers that have changed on disk."
  :type 'boolean
  :group 'psvn)

(defcustom svn-status-fancy-file-state-in-modeline t
  "*Show a color dot in the modeline that describes the state of the current file."
  :type 'boolean
  :group 'psvn)

(defcustom svn-status-indentation 2
  "*Indenation per directory level in the `svn-status-buffer-name' buffer."
  :type 'integer
  :group 'psvn)

(defcustom svn-status-negate-meaning-of-arg-commands '()
  "*List of operations that should use a negated meaning of the prefix argument.
The supported functions are `svn-status' and `svn-status-set-user-mark'."
  :type '(set (function-item svn-status)
              (function-item svn-status-set-user-mark))
  :group 'psvn)

(defcustom svn-status-svn-executable "svn"
  "*The name of the svn executable.
This can be either absolute or looked up on `exec-path'."
  ;; Don't use (file :must-match t).  It doesn't know about `exec-path'.
  :type 'file
  :group 'psvn)
(put 'svn-status-svn-executable 'risky-local-variable t)

(defcustom svn-status-default-export-directory "~/" "*The default directory that is suggested svn export."
  :type 'file
  :group 'psvn)

(defcustom svn-status-svn-environment-var-list '("LC_MESSAGES=C" "LC_ALL=")
  "*A list of environment variables that should be set for that svn process.
Each element is either a string \"VARIABLE=VALUE\" which will be added to
the environment when svn is run, or just \"VARIABLE\" which causes that
variable to be entirely removed from the environment.

The default setting is '(\"LC_MESSAGES=C\" \"LC_ALL=\"). This ensures that the svn command
line client does not output localized strings. psvn.el relies on the english
messages."
  :type '(repeat string)
  :group 'psvn)
(put 'svn-status-svn-environment-var-list 'risky-local-variable t)

(defcustom svn-browse-url-function nil
  ;; If the user hasn't changed `svn-browse-url-function', then changing
  ;; `browse-url-browser-function' should affect psvn even after it has
  ;; been loaded.
  "Function to display a Subversion related WWW page in a browser.
So far, this is used only for \"trac\" issue tracker integration.
By default, this is nil, which means use `browse-url-browser-function'.
Any non-nil value overrides that variable, with the same syntax."
  ;; It would be nice to show the full list of browsers supported by
  ;; browse-url, but (custom-variable-type 'browse-url-browser-function)
  ;; returns just `function' if browse-url has not yet been loaded,
  ;; and there seems to be no easy way to autoload browse-url when
  ;; the custom-type of svn-browse-url-function is actually needed.
  ;; So I'll only offer enough choices to cover all supported types.
  :type `(choice (const :tag "Specified by `browse-url-browser-function'" nil)
                 (function :value browse-url-default-browser
                           ;; In XEmacs 21.4.17, the `function' widget matches
                           ;; all objects.  Constrain it here so that alists
                           ;; fall through to the next choice.  Accept either
                           ;; a symbol (fbound or not) or a lambda expression.
                           :match ,(lambda (widget value)
                                     (or (symbolp value) (functionp value))))
                 (svn-alist :tag "Regexp/function association list"
                            :key-type regexp :value-type function
                            :value (("." . browse-url-default-browser))))
  :link '(emacs-commentary-link "browse-url")
  :group 'psvn)
;; (put 'svn-browse-url-function 'risky-local-variable t)
;; already implied by "-function" suffix

(defcustom svn-log-edit-header
  "## Lines starting with '## ' will be removed from the log message.\n"
  "*Header content of the *svn-log* buffer"
  :type 'string
  :group 'psvn)

(defcustom svn-status-window-alist
  '((diff "*svn-diff*") (log "*svn-log*") (info t) (blame t) (proplist t) (update t))
  "An alist to specify which windows should be used for svn command outputs.
The following keys are supported: diff, log, info, blame, proplist, update.
The following values can be given:
nil       ... show in `svn-process-buffer-name' buffer
t         ... show in dedicated *svn-info* buffer
invisible ... don't show the buffer (eventually useful for update)
a string  ... show in a buffer named string"
  :type '(svn-alist
          :key-type symbol
          :value-type (group
                       (choice
                        (const :tag "Show in *svn-process* buffer" nil)
                        (const :tag "Show in dedicated *svn-info* buffer" t)
                        (const :tag "Don't show the output" invisible)
                        (string :tag "Show in a buffer named"))))
  :options '(diff log info blame proplist update)
  :group 'psvn)

(defcustom svn-status-short-mod-flag-p t
  "*Whether the mark for out of date files is short or long.

If this variable is is t, and a file is out of date (i.e., there is a newer
version in the repository than the working copy), then the file will
be marked by \"**\"

If this variable is nil, and the file is out of date then the longer phrase
\"(Update Available)\" is used.

In either case the mark gets the face
`svn-status-update-available-face', and will only be visible if
`\\[svn-status-update]' is run with a prefix argument"
  :type '(choice (const :tag "Short \"**\"" t)
                 (const :tag "Long \"(Update Available)\"" nil))
  :group 'psvn)

(defvar svn-status-debug-level 0 "The psvn.el debugging verbosity level.
The higher the number, the more debug messages are shown.

See `svn-status-message' for the meaning of values for that variable.")

(defvar svn-bookmark-list nil "A list of locations for a quick access via `svn-status-via-bookmark'")
;;(setq svn-bookmark-list '(("proj1" . "~/work/proj1")
;;                          ("doc1" . "~/docs/doc1")))

(defvar svn-status-buffer-name "*svn-status*" "Name for the svn status buffer")
(defvar svn-process-buffer-name " *svn-process*" "Name for the svn process buffer")
(defvar svn-log-edit-buffer-name "*svn-log-edit*" "Name for the svn log-edit buffer")

(defcustom svn-status-use-header-line
  (if (boundp 'header-line-format) t 'inline)
  "*Whether a header line should be used.
When t: Use the emacs header line
When 'inline: Insert the header line in the `svn-status-buffer-name' buffer
Otherwise: Don't display a header line"
  :type '(choice (const :tag "Show column titles as a header line" t)
                 (const :tag "Insert column titles as text in the buffer" inline)
                 (other :tag "No column titles" nil))
  :group 'psvn)

;;; default arguments to pass to svn commands
;; TODO: When customizing, an option menu or completion might be nice....
(defcustom svn-status-default-log-arguments '("-v")
  "*List of arguments to pass to svn log.
\(used in `svn-status-show-svn-log'; override these by giving prefixes\)."
  :type '(repeat string)
  :group 'psvn)
(put 'svn-status-default-log-arguments 'risky-local-variable t)

(defcustom svn-status-default-commit-arguments '()
  "*List of arguments to pass to svn commit.
If you don't like recursive commits, set this value to (\"-N\")
or mark the directory before committing it.
Do not put an empty string here, except as an argument of an option:
Subversion and the operating system may treat that as a file name
equivalent to \".\", so you would commit more than you intended."
  :type '(repeat string)
  :group 'psvn)
(put 'svn-status-default-commit-arguments 'risky-local-variable t)

(defcustom svn-status-default-diff-arguments '("-x" "--ignore-eol-style")
  "*A list of arguments that is passed to the svn diff command.
When the built in diff command is used,
the following options are available: --ignore-eol-style, --ignore-space-change,
--ignore-all-space, --ignore-eol-style.
The following setting ignores eol style changes and all white space changes:
'(\"-x\" \"--ignore-eol-style --ignore-all-space\")

If you'd like to suppress whitespace changes using the external diff command
use the following value:
'(\"--diff-cmd\" \"diff\" \"-x\" \"-wbBu\")

"
  :type '(repeat string)
  :group 'psvn)
(put 'svn-status-default-diff-arguments 'risky-local-variable t)

(defcustom svn-status-default-status-arguments '()
  "*A list of arguments that is passed to the svn status command.
The following options are available: --ignore-externals

"
  :type '(repeat string)
  :group 'psvn)
(put 'svn-status-default-status-arguments 'risky-local-variable t)

(defcustom svn-status-default-blame-arguments '("-x" "--ignore-eol-style")
  "*A list of arguments that is passed to the svn blame command.
See `svn-status-default-diff-arguments' for some examples."
  :type '(repeat string)
  :group 'psvn)

(put 'svn-status-default-blame-arguments 'risky-local-variable t)

(defvar svn-trac-project-root nil
  "Path for an eventual existing trac issue tracker.
This can be set with \\[svn-status-set-trac-project-root].")

(defvar svn-status-module-name nil
  "*A short name for the actual project.
This can be set with \\[svn-status-set-module-name].")

(defvar svn-status-branch-list nil
  "*A list of known branches for the actual project
This can be set with \\[svn-status-set-branch-list].

The list contains full repository paths or shortcuts starting with \#
\# at the beginning is replaced by the repository url.
\#1\# has the special meaning that all paths below the given directory
will be considered for interactive selections.

A useful setting might be: '\(\"\#trunk\" \"\#1\#tags\" \"\#1\#branches\")")

(defvar svn-status-load-state-before-svn-status t
  "*Whether to automatically restore state from ++psvn.state file before running svn-status.")

(defvar svn-log-link-handlers nil "A list of link handlers in *svn-log* buffers.
These link handlers must be registered via `svn-log-register-link-handler'")

;;; hooks
(defvar svn-status-mode-hook nil "Hook run when entering `svn-status-mode'.")
(defvar svn-log-edit-mode-hook nil "Hook run when entering `svn-log-edit-mode'.")
(defvar svn-log-edit-done-hook nil "Hook run after commiting files via svn.")
;; (put 'svn-log-edit-mode-hook 'risky-local-variable t)
;; (put 'svn-log-edit-done-hook 'risky-local-variable t)
;; already implied by "-hook" suffix

(defvar svn-post-process-svn-output-hook 'svn-fixup-tramp-output-maybe "Hook that can be used to preprocess the output from svn.
The function `svn-status-remove-control-M' can be useful for that hook")

(when (eq system-type 'windows-nt)
  (add-hook 'svn-post-process-svn-output-hook 'svn-status-remove-control-M))

(defvar svn-status-svn-process-coding-system (when (boundp 'locale-coding-system) locale-coding-system)
  "The coding system that is used for the svn command line client.
It is used in svn-run, if it is not nil.")

(defvar svn-status-svn-file-coding-system 'undecided-unix
  "The coding system that is used to save files that are loaded as
parameter or data files via the svn command line client.
It is used in the following functions: `svn-prop-edit-do-it', `svn-log-edit-done'.
You could set it to 'utf-8")

(defcustom svn-status-use-ido-completion
  (fboundp 'ido-completing-read)
  "*Use ido completion functionality."
  :type 'boolean
  :group 'psvn)

(defvar svn-status-completing-read-function
  (if svn-status-use-ido-completion 'ido-completing-read 'completing-read))

;;; experimental features
(defvar svn-status-track-user-input nil "Track user/password queries.
This feature is implemented via a process filter.
It is an experimental feature.")

(defvar svn-status-refresh-info nil "Whether `svn-status-update-buffer' should call `svn-status-parse-info'.")

;;; Customize group
(defgroup psvn nil
  "Subversion interface for Emacs."
  :group 'tools)

(defgroup psvn-faces nil
  "psvn faces."
  :group 'psvn)


(eval-and-compile
  (require 'cl)
  (defconst svn-xemacsp (featurep 'xemacs))
  (if svn-xemacsp
      (require 'overlay)
    (require 'overlay nil t)))

(defcustom svn-status-display-full-path nil
  "Specifies how the filenames look like in the listing.
If t, their full path name will be displayed, else only the filename."
  :type 'boolean
  :group 'psvn)

(defcustom svn-status-prefix-key [(control x) (meta s)]
  "Prefix key for the psvn commands in the global keymap."
  :type '(choice (const [(control x) ?v ?S])
                 (const [(super s)])
                 (const [(hyper s)])
                 (const [(control x) ?v])
                 (const [(control x) ?V])
                 (sexp))
  :group 'psvn
  :set  (lambda (var value)
          (if (boundp var)
              (global-unset-key (symbol-value var)))
          (set var value)
          (global-set-key (symbol-value var) 'svn-global-keymap)))

(defcustom svn-admin-default-create-directory "~/"
  "*The default directory that is suggested for `svn-admin-create'."
  :type 'string
  :group 'psvn)

(defvar svn-status-custom-hide-function nil
  "A function that receives a line-info and decides whether to hide that line.
See psvn.el for an example function.")
;; (put 'svn-status-custom-hide-function 'risky-local-variable t)
;; already implied by "-function" suffix


;; Use the normally used mode for files ending in .~HEAD~, .~BASE~, ...
(add-to-list 'auto-mode-alist '("\\.~?\\(HEAD\\|BASE\\|PREV\\)~?\\'" ignore t))

;;; internal variables
(defvar svn-status-directory-history nil "List of visited svn working directories.")
(defvar svn-process-cmd nil)
(defvar svn-status-info nil)
(defvar svn-status-filename-to-buffer-position-cache (make-hash-table :test 'equal :weakness t))
(defvar svn-status-base-info nil "The parsed result from the svn info command as a plist.")
(defvar svn-status-initial-window-configuration nil)
(defvar svn-status-default-column 23)
(defvar svn-status-default-revision-width 4)
(defvar svn-status-default-author-width 9)
(defvar svn-status-line-format " %c%c%c %4s %4s %-9s")
(defvar svn-start-of-file-list-line-number 0)
(defvar svn-status-files-to-commit nil
  "List of files to commit at `svn-log-edit-done'.
This is always set together with `svn-status-recursive-commit'.")
(defvar svn-status-recursive-commit nil
  "Non-nil if the next commit should be recursive.
This is always set together with `svn-status-files-to-commit'.")
(defvar svn-log-edit-update-log-entry nil
  "Revision number whose log entry is being edited.
This is nil if the log entry is for a new commit.")
(defvar svn-status-pre-commit-window-configuration nil)
(defvar svn-status-pre-propedit-window-configuration nil)
(defvar svn-status-head-revision nil)
(defvar svn-status-root-return-info nil)
(defvar svn-status-property-edit-must-match-flag nil)
(defvar svn-status-propedit-property-name nil "The property name for the actual svn propset command")
(defvar svn-status-propedit-file-list nil)
(defvar svn-status-mode-line-process "")
(defvar svn-status-mode-line-process-status "")
(defvar svn-status-mode-line-process-edit-flag "")
(defvar svn-status-edit-svn-command nil)
(defvar svn-status-update-previous-process-output nil)
(defvar svn-pre-run-asynch-recent-keys nil)
(defvar svn-pre-run-mode-line-process nil)
(defvar svn-arg-file-content nil)
(defvar svn-status-temp-dir
  (file-name-as-directory
   (expand-file-name
    (or
     (when (boundp 'temporary-file-directory) temporary-file-directory) ;emacs
     ;; XEmacs 21.4.17 can return "/tmp/kalle" from (temp-directory).
     ;; `file-name-as-directory' adds a slash so we can append a file name.
     (when (fboundp 'temp-directory) (temp-directory))
     "/tmp/"))) "The directory that is used to store temporary files for psvn.")
;; Because `temporary-file-directory' is not a risky local variable in
;; GNU Emacs 22.0.51, we don't mark `svn-status-temp-dir' as such either.
(defvar svn-temp-suffix (make-temp-name "."))
(put 'svn-temp-suffix 'risky-local-variable t)
(defvar svn-status-temp-file-to-remove nil)
(put 'svn-status-temp-file-to-remove 'risky-local-variable t)
(defvar svn-status-temp-arg-file (concat svn-status-temp-dir "svn.arg" svn-temp-suffix))
(put 'svn-status-temp-arg-file 'risky-local-variable t)
(defvar svn-status-options nil)
(defvar svn-status-remote)
(defvar svn-status-commit-rev-number nil)
(defvar svn-status-update-rev-number nil)
(defvar svn-status-operated-on-dot nil)
(defvar svn-status-last-commit-author nil)
(defvar svn-status-elided-list nil)
(defvar svn-status-last-output-buffer-name nil "The buffer name for the buffer that holds the output from the last executed svn command")
(defvar svn-status-pre-run-svn-buffer nil)
(defvar svn-status-update-list nil)
(defvar svn-transient-buffers)
(defvar svn-ediff-windows)
(defvar svn-ediff-result)
(defvar svn-status-last-diff-options nil)
(defvar svn-status-blame-file-name nil)
(defvar svn-status-blame-revision nil)
(defvar svn-admin-last-repository-dir nil "The last repository url for various operations.")
(defvar svn-last-cmd-ring (make-ring 30) "Ring that holds the last executed svn commands (for debugging purposes)")
(defvar svn-status-cached-version-string nil)
(defvar svn-client-version nil "The version number of the used svn client")
(defvar svn-status-get-line-information-for-file nil)
(defvar svn-status-base-dir-cache (make-hash-table :test 'equal :weakness nil))
(defvar svn-status-usermark-storage (make-hash-table :test 'equal :weakness nil))
(defvar svn-log-registered-link-handlers (make-hash-table :test 'eql :weakness nil))

(defvar svn-status-partner-buffer nil "The partner buffer for this svn related buffer")
(make-variable-buffer-local 'svn-status-partner-buffer)

;; Emacs 21 defines these in ediff-init.el but it seems more robust
;; to just declare the variables here than try to load that file.
;; It is Ediff's job to declare these as risky-local-variable if needed.
(defvar ediff-buffer-A)
(defvar ediff-buffer-B)
(defvar ediff-buffer-C)
(defvar ediff-quit-hook)

;; Ditto for log-edit.el.
(defvar log-edit-initial-files)
(defvar log-edit-callback)
(defvar log-edit-listfun)

;; Ediff does not use this variable in GNU Emacs 20.7, GNU Emacs 21.4,
;; nor XEmacs 21.4.17.  However, pcl-cvs (a.k.a. pcvs) does.
;; TODO: Check if this should be moved into the "svn-" namespace.
(defvar ediff-after-quit-destination-buffer)

;; That is an example for the svn-status-custom-hide-function:
;; Note: For many cases it is a better solution to ignore files or
;; file extensions via the svn-ignore properties (on P i, P I)
;; (setq svn-status-custom-hide-function 'svn-status-hide-pyc-files)
;; (defun svn-status-hide-pyc-files (info)
;;   "Hide all pyc files in the `svn-status-buffer-name' buffer."
;;   (let* ((fname (svn-status-line-info->filename-nondirectory info))
;;          (fname-len (length fname)))
;;     (and (> fname-len 4) (string= (substring fname (- fname-len 4)) ".pyc"))))

;;; faces
(defface svn-status-marked-face
  '((((type tty) (class color)) (:foreground "green" :weight light))
    (((class color) (background light)) (:foreground "green3"))
    (((class color) (background dark)) (:foreground "palegreen2"))
    (t (:weight bold)))
  "Face to highlight the mark for user marked files in svn status buffers."
  :group 'psvn-faces)

(defface svn-status-marked-popup-face
  '((((type tty) (class color)) (:foreground "green" :weight light))
    (((class color) (background light)) (:foreground "green3"))
    (((class color) (background dark)) (:foreground "palegreen2"))
    (t (:weight bold)))
  "Face to highlight the actual file, if a popup menu is activated."
  :group 'psvn-faces)

(defface svn-status-update-available-face
  '((((type tty) (class color)) (:foreground "magenta" :weight light))
    (((class color) (background light)) (:foreground "magenta"))
    (((class color) (background dark)) (:foreground "yellow"))
    (t (:weight bold)))
  "Face used to highlight the 'out of date' mark.
\(i.e., the mark used when there is a newer version in the repository
than the working copy.\)

See also `svn-status-short-mod-flag-p'."
  :group 'psvn-faces)

;based on cvs-filename-face
(defface svn-status-directory-face
  '((((type tty) (class color)) (:foreground "lightblue" :weight light))
    (((class color) (background light)) (:foreground "blue4"))
    (((class color) (background dark)) (:foreground "lightskyblue1"))
    (t (:weight bold)))
  "Face for directories in *svn-status* buffers.
See `svn-status--line-info->directory-p' for what counts as a directory."
  :group 'psvn-faces)

;based on font-lock-comment-face
(defface svn-status-filename-face
  '((((class color) (background light)) (:foreground "chocolate"))
    (((class color) (background dark)) (:foreground "beige")))
  "Face for non-directories in *svn-status* buffers.
See `svn-status--line-info->directory-p' for what counts as a directory."
  :group 'psvn-faces)

;not based on anything, may be horribly ugly!
(defface svn-status-symlink-face
  '((((class color) (background light)) (:foreground "cornflower blue"))
    (((class color) (background dark)) (:foreground "cyan")))
  "Face for symlinks in *svn-status* buffers.

This is the face given to the actual link (i.e., the versioned item),
the target of the link gets either `svn-status-filename-face' or
`svn-status-directory-face'."
  :group 'psvn-faces)

;based on font-lock-warning-face
(defface svn-status-locked-face
  '((t
     (:weight bold :foreground "Red")))
  "Face for the phrase \"[ LOCKED ]\" `svn-status-buffer-name' buffers."
  :group 'psvn-faces)

;based on vhdl-font-lock-directive-face
(defface svn-status-switched-face
  '((((class color)
      (background light))
     (:foreground "CadetBlue"))
    (((class color)
      (background dark))
     (:foreground "Aquamarine"))
    (t
     (:bold t :italic t)))
  "Face for the phrase \"(switched)\" non-directories in svn status buffers."
  :group 'psvn-faces)

(if svn-xemacsp
    (defface svn-status-blame-highlight-face
      '((((type tty) (class color)) (:foreground "green" :weight light))
        (((class color) (background light)) (:foreground "green3"))
        (((class color) (background dark)) (:foreground "palegreen2"))
        (t (:weight bold)))
      "Default face for highlighting a line in svn status blame mode."
      :group 'psvn-faces)
  (defface svn-status-blame-highlight-face
    '((t :inherit highlight))
    "Default face for highlighting a line in svn status blame mode."
    :group 'psvn-faces))

(if svn-xemacsp
    (defface svn-log-partner-highlight-face
      '((((type tty) (class color)) (:foreground "yellow" :weight light))
        (((class color) (background light)) (:foreground "gold"))
        (((class color) (background dark)) (:foreground "gold"))
        (t (:weight bold)))
      "Default face for highlighting the partner in svn log mode."
      :group 'psvn-faces)
  (defface svn-log-partner-highlight-face
  '((((class color) (background light))
     (:background "light goldenrod" :weight bold))
    (t (:weight bold)))
    "Default face for highlighting the partner in svn log mode."
    :group 'psvn-faces))

(defface svn-status-blame-rev-number-face
  '((((class color) (background light)) (:foreground "DarkGoldenrod"))
    (((class color) (background dark)) (:foreground "LightGoldenrod"))
    (t (:weight bold :slant italic)))
  "Face to highlight revision numbers in the svn-blame mode."
  :group 'psvn-faces)

(defvar svn-highlight t)
;; stolen from PCL-CVS
(defun svn-add-face (str face &optional keymap)
  "Return string STR decorated with the specified FACE.
If `svn-highlight' is nil then just return STR."
  (when svn-highlight
    ;; Do not use `list*'; cl.el might not have been loaded.  We could
    ;; put (require 'cl) at the top but let's try to manage without.
    (add-text-properties 0 (length str)
                         `(face ,face
                                mouse-face highlight)
;; 18.10.2004: the keymap parameter is not used (yet) in psvn.el
;;                           ,@(when keymap
;;                               `(mouse-face highlight
;;                                 local-map ,keymap)))
                         str))
  str)

(defun svn-status-maybe-add-face (condition text face)
  "If CONDITION then add FACE to TEXT.
Else return TEXT unchanged."
  (if condition
      (svn-add-face text face)
    text))

(defun svn-status-choose-face-to-add (condition text face1 face2)
  "If CONDITION then add FACE1 to TEXT, else add FACE2 to TEXT."
  (if condition
      (svn-add-face text face1)
    (svn-add-face text face2)))

(defun svn-status-maybe-add-string (condition string face)
  "If CONDITION then return STRING decorated with FACE.
Otherwise, return \"\"."
  (if condition
      (svn-add-face string face)
    ""))

;; compatibility
;; emacs 20
(defalias 'svn-point-at-eol
  (if (fboundp 'point-at-eol) 'point-at-eol 'line-end-position))
(defalias 'svn-point-at-bol
  (if (fboundp 'point-at-bol) 'point-at-bol 'line-beginning-position))
(defalias 'svn-read-directory-name
  (if (fboundp 'read-directory-name) 'read-directory-name 'read-file-name))

(eval-when-compile
  (if (not (fboundp 'gethash))
      (require 'cl-macs)))
(defalias 'svn-puthash (if (fboundp 'puthash) 'puthash 'cl-puthash))

;; emacs 21
(if (fboundp 'line-number-at-pos)
    (defalias 'svn-line-number-at-pos 'line-number-at-pos)
  (defun svn-line-number-at-pos (&optional pos)
    "Return (narrowed) buffer line number at position POS.
If POS is nil, use current buffer location."
    (let ((opoint (or pos (point))) start)
      (save-excursion
        (goto-char (point-min))
        (setq start (point))
        (goto-char opoint)
        (forward-line 0)
        (1+ (count-lines start (point)))))))

(defun svn-substring-no-properties (string &optional from to)
  (if (fboundp 'substring-no-properties)
      (substring-no-properties string from to)
    (substring string (or from 0) to)))

; xemacs
;; Evaluate the defsubst at compile time, so that the byte compiler
;; knows the definition and can inline calls.  It cannot detect the
;; defsubst automatically from within the if form.
(eval-and-compile
  (if (fboundp 'match-string-no-properties)
      (defalias 'svn-match-string-no-properties 'match-string-no-properties)
    (defsubst svn-match-string-no-properties (match)
      (buffer-substring-no-properties (match-beginning match) (match-end match)))))

; XEmacs doesn't have a function `help-buffer'
(eval-and-compile
  (if (fboundp 'help-buffer)
      (defalias 'svn-help-buffer 'help-buffer) ; FSF Emacs
    (defun svn-help-buffer ()
      (buffer-name (get-buffer-create (help-buffer-name "SVN")))))) ; XEmacs


;; XEmacs 21.4.17 does not have an `alist' widget.  Define a replacement.
;; To find out whether the `alist' widget exists, we cannot check just
;; (get 'alist 'widget-type), because GNU Emacs 21.4 defines it in
;; "wid-edit.el", which is not preloaded; it will be autoloaded when
;; `widget-create' is called.  Instead, we call `widgetp', which is
;; also autoloaded from "wid-edit.el".  XEmacs 21.4.17 does not have
;; `widgetp' either, so we check that first.
(if (and (fboundp 'widgetp) (widgetp 'alist))
    (define-widget 'svn-alist 'alist
      "An association list.
Use this instead of `alist', for XEmacs 21.4 compatibility.")
  (define-widget 'svn-alist 'list
    "An association list.
Use this instead of `alist', for XEmacs 21.4 compatibility."
    :convert-widget 'svn-alist-convert-widget
    :tag "Association List"
    :key-type 'sexp
    :value-type 'sexp)
  (defun svn-alist-convert-widget (widget)
    (let* ((value-type (widget-get widget :value-type))
           (option-widgets (loop for option in (widget-get widget :options)
                             collect `(cons :format "%v"
                                            (const :format "%t: %v\n"
                                                   :tag "Key"
                                                   ,option)
                                            ,value-type))))
      (widget-put widget :args
                  `(,@(when option-widgets
                        `((set :inline t :format "%v"
                               ,@option-widgets)))
                    (editable-list :inline t
                                   (cons :format "%v"
                                         ,(widget-get widget :key-type)
                                         ,value-type)))))
    widget))

;; process launch functions
(defvar svn-call-process-function (if (fboundp 'process-file) 'process-file 'call-process))
(defvar svn-start-process-function (if (fboundp 'start-file-process) 'start-file-process 'start-process))


;;; keymaps

(defvar svn-global-keymap nil "Global keymap for psvn.el.
To bind this to a different key, customize `svn-status-prefix-key'.")
(put 'svn-global-keymap 'risky-local-variable t)
(when (not svn-global-keymap)
  (setq svn-global-keymap (make-sparse-keymap))
  (define-key svn-global-keymap (kbd "v") 'svn-status-version)
  (define-key svn-global-keymap (kbd "s") 'svn-status-this-directory)
  (define-key svn-global-keymap (kbd "b") 'svn-status-via-bookmark)
  (define-key svn-global-keymap (kbd "h") 'svn-status-use-history)
  (define-key svn-global-keymap (kbd "u") 'svn-status-update-cmd)
  (define-key svn-global-keymap (kbd "=") 'svn-status-show-svn-diff)
  (define-key svn-global-keymap (kbd "f =") 'svn-file-show-svn-diff)
  (define-key svn-global-keymap (kbd "f e") 'svn-file-show-svn-ediff)
  (define-key svn-global-keymap (kbd "f l") 'svn-status-show-svn-log)
  (define-key svn-global-keymap (kbd "f b") 'svn-status-blame)
  (define-key svn-global-keymap (kbd "f a") 'svn-file-add-to-changelog)
  (define-key svn-global-keymap (kbd "f r") 'svn-file-revert)
  (define-key svn-global-keymap (kbd "c") 'svn-status-commit)
  (define-key svn-global-keymap (kbd "S") 'svn-status-switch-to-status-buffer)
  (define-key svn-global-keymap (kbd "o") 'svn-status-pop-to-status-buffer)
  (define-key svn-global-keymap (kbd "C-k") 'svn-process-kill))

(defvar svn-status-diff-mode-map ()
  "Keymap used in `svn-status-diff-mode' for additional commands that are not defined in diff-mode.")
(put 'svn-status-diff-mode-map 'risky-local-variable t) ;for Emacs 20.7

(when (not svn-status-diff-mode-map)
  (setq svn-status-diff-mode-map (copy-keymap diff-mode-shared-map))
  (define-key svn-status-diff-mode-map [?g] 'revert-buffer)
  (define-key svn-status-diff-mode-map [?s] 'svn-status-pop-to-status-buffer)
  (define-key svn-status-diff-mode-map [?c] 'svn-status-diff-pop-to-commit-buffer)
  (define-key svn-status-diff-mode-map [?w] 'svn-status-diff-save-current-defun-as-kill))

(defvar svn-global-trac-map ()
  "Subkeymap used in `svn-global-keymap' for trac issue tracker commands.")
(put 'svn-global-trac-map 'risky-local-variable t) ;for Emacs 20.7
(when (not svn-global-trac-map)
  (setq svn-global-trac-map (make-sparse-keymap))
  (define-key svn-global-trac-map (kbd "w") 'svn-trac-browse-wiki)
  (define-key svn-global-trac-map (kbd "t") 'svn-trac-browse-timeline)
  (define-key svn-global-trac-map (kbd "m") 'svn-trac-browse-roadmap)
  (define-key svn-global-trac-map (kbd "s") 'svn-trac-browse-source)
  (define-key svn-global-trac-map (kbd "r") 'svn-trac-browse-report)
  (define-key svn-global-trac-map (kbd "i") 'svn-trac-browse-ticket)
  (define-key svn-global-trac-map (kbd "c") 'svn-trac-browse-changeset)
  (define-key svn-global-keymap (kbd "t") svn-global-trac-map))

;; The setter of `svn-status-prefix-key' makes a binding in the global
;; map refer to the `svn-global-keymap' symbol, rather than directly
;; to the keymap.  Emacs then implicitly uses the symbol-function.
;; This has the advantage that `describe-bindings' (C-h b) can show
;; the name of the keymap and link to its documentation.
(defalias 'svn-global-keymap svn-global-keymap)
;; `defalias' of GNU Emacs 21.4 doesn't allow a docstring argument.
(put 'svn-global-keymap 'function-documentation
     '(documentation-property 'svn-global-keymap 'variable-documentation t))


;; named after SVN_WC_ADM_DIR_NAME in svn_wc.h
(defun svn-wc-adm-dir-name ()
  "Return the name of the \".svn\" subdirectory or equivalent."
  (if (and (eq system-type 'windows-nt)
           (getenv "SVN_ASP_DOT_NET_HACK"))
      "_svn"
    ".svn"))

(defun svn-log-edit-file-name (&optional curdir)
  "Get the name of the saved log edit file
If curdir, return `svn-log-edit-file-name'
Otherwise position svn-log-edit-file-name in the root directory of this working copy"
  (if curdir
      svn-log-edit-file-name
    (concat (svn-status-base-dir) svn-log-edit-file-name)))

(defun svn-status-message (level &rest args)
  "If LEVEL is lower than `svn-status-debug-level' print ARGS using `message'.

Guideline for numbers:
1 - error messages, 3 - non-serious error messages, 5 - messages for things
that take a long time, 7 - not very important messages on stuff, 9 - messages
inside loops."
  (if (<= level svn-status-debug-level)
      (apply 'message args)))

(defun svn-status-flatten-list (list)
  "Flatten any lists within ARGS, so that there are no sublists."
  (loop for item in list
        if (listp item) nconc (svn-status-flatten-list item)
        else collect item))

(defun svn-status-window-line-position (w)
  "Return the window line at point for window W, or nil if W is nil."
  (svn-status-message 3 "About to count lines; selected window is %s" (selected-window))
  (and w (count-lines (window-start w) (point))))

;;;###autoload
(defun svn-checkout (repos-url path)
  "Run svn checkout REPOS-URL PATH."
  (interactive (list (read-string "Checkout from repository Url: ")
                     (expand-file-name
                      (svn-read-directory-name "Checkout to directory: "))))
  (svn-run t t 'checkout "checkout" repos-url (expand-file-name path)))

;;;###autoload (defalias 'svn-examine 'svn-status)
(defalias 'svn-examine 'svn-status)

;;;###autoload
(defun svn-version-controlled-dir-p (dir)
  "Return t if DIR is part of a Subversion workarea."
  (= 0 (call-process svn-status-svn-executable nil nil nil "info" dir)))

;;;###autoload
(defun svn-status (dir &optional arg)
  "Examine the status of Subversion working copy in directory DIR.
If ARG is -, allow editing of the parameters. One could add -N to
run svn status non recursively to make it faster.
For every other non nil ARG pass the -u argument to `svn status', which
asks svn to connect to the repository and check to see if there are updates
there.

If DIR is not an SVN working copy, examine if there is CVS and run
`cvs-examine'. Otherwise ask if to run `dired'."
  (interactive (list (expand-file-name
                      (svn-read-directory-name "SVN status directory: "
                                              nil default-directory nil))
                     current-prefix-arg))
    (cond
     ((svn-version-controlled-dir-p (expand-file-name dir))
      (setq arg (svn-status-possibly-negate-meaning-of-arg arg 'svn-status))
      (svn-status-1 dir arg))
     ((and (file-directory-p (concat (file-name-as-directory dir) "CVS"))
           (fboundp 'cvs-examine))
      (cvs-examine dir nil))
     (t
      (when (y-or-n-p
             (format
              (concat
               "%s "
               "is not Subversion controlled (missing %s "
               "directory). "
               "Run dired instead? ")
              dir
              (svn-wc-adm-dir-name)))
        (dired dir)))))

(defvar svn-status-display-new-status-buffer nil)
(defun svn-status-1 (dir &optional arg)
  "Examine DIR. See `svn-status' for more information."
  (unless (file-directory-p dir)
    (error "%s is not a directory" dir))
  (setq dir (file-name-as-directory dir))
  (when svn-status-load-state-before-svn-status
    (unless (string= dir (car svn-status-directory-history))
      (let ((default-directory dir))    ;otherwise svn-status-base-dir looks in the wrong place
        (svn-status-load-state t))))
  (setq svn-status-directory-history (delete dir svn-status-directory-history))
  (add-to-list 'svn-status-directory-history dir)
  (if (string= (buffer-name) svn-status-buffer-name)
      (setq svn-status-display-new-status-buffer nil)
    (setq svn-status-display-new-status-buffer t)
    ;;(message "psvn: Saving initial window configuration")
    (setq svn-status-initial-window-configuration
          (current-window-configuration)))
  (let* ((cur-buf (current-buffer))
         (status-buf (get-buffer-create svn-status-buffer-name))
         (proc-buf (get-buffer-create svn-process-buffer-name))
         (want-edit (eq arg '-))
         (status-option (if want-edit
                            (if svn-status-verbose "-v" "")
                          (if svn-status-verbose
                              (if arg "-uv" "-v")
                            (if arg "-u" "")))))
    (save-excursion
      (set-buffer status-buf)
      (buffer-disable-undo)
      (setq default-directory dir)
      (set-buffer proc-buf)
      (setq default-directory dir
            svn-status-remote (when arg t))
      (if want-edit
          (let ((svn-status-edit-svn-command t))
            (svn-run t t 'status "status" svn-status-default-status-arguments status-option))
        (svn-run t t 'status "status" svn-status-default-status-arguments status-option)))))

(defun svn-status-this-directory (arg)
  "Run `svn-status' for the `default-directory'"
  (interactive "P")
  (svn-status default-directory arg))

(defun svn-status-use-history ()
  "Interactively select a different directory from `svn-status-directory-history'."
  (interactive)
  (let* ((in-status-buffer (eq major-mode 'svn-status-mode))
         (hist (if in-status-buffer (cdr svn-status-directory-history) svn-status-directory-history))
         (dir (funcall svn-status-completing-read-function "svn-status on directory: " hist))
         (svn-status-buffer (get-buffer svn-status-buffer-name))
         (svn-buffer-available (and svn-status-buffer
                                    (with-current-buffer svn-status-buffer-name (string= default-directory dir)))))
    (if (file-directory-p dir)
        (if svn-buffer-available
            (svn-status-switch-to-status-buffer)
          (unless svn-status-refresh-info
            (setq svn-status-refresh-info 'once))
          (svn-status dir))
      (error "%s is not a directory" dir))))

(defun svn-had-user-input-since-asynch-run ()
  (not (equal (recent-keys) svn-pre-run-asynch-recent-keys)))

(defun svn-expand-filename-for-remote-access (file-name)
  "Convert the given local part of a filename to a full file name to allow accessing remote files"
  ;; when running svn on a remote host: expand local file names to get full names to access the file on the remote host via emacs
  (if (and (fboundp 'file-remote-p) (file-remote-p default-directory))
      (concat (file-remote-p default-directory) file-name)
    file-name))

(defun svn-local-filename-for-remote-access (file-name)
  "Convert a full file name to a local file name that can be used for a local svn invocation."
  (if (and (fboundp 'file-remote-p) (file-remote-p file-name))
      (tramp-file-name-localname (tramp-dissect-file-name file-name))
    file-name))

(defun svn-process-environment ()
  "Construct the environment for the svn process.
It is a combination of `svn-status-svn-environment-var-list' and
the usual `process-environment'."
  ;; If there are duplicate elements in `process-environment', then GNU
  ;; Emacs 21.4 guarantees that the first one wins; but GNU Emacs 20.7
  ;; and XEmacs 21.4.17 don't document what happens.  We'll just remove
  ;; any duplicates ourselves, then.  This also gives us an opportunity
  ;; to handle the "VARIABLE" syntax that none of them supports.
  (loop with found = '()
        for elt in (append svn-status-svn-environment-var-list
                           process-environment)
        for has-value = (string-match "=" elt)
        for name = (substring elt 0 has-value)
        unless (member name found)
          do (push name found)
          and when has-value
            collect elt))

(defun svn-run (run-asynchron clear-process-buffer cmdtype &rest arglist)
  "Run svn with arguments ARGLIST.

If RUN-ASYNCHRON is t then run svn asynchronously.

If CLEAR-PROCESS-BUFFER is t then erase the contents of the
`svn-process-buffer-name' buffer before commencing.

CMDTYPE is a symbol such as 'mv, 'revert, or 'add, representing the
command to run.

ARGLIST is a list of arguments \(which must include the command name,
for example: '(\"revert\" \"file1\"\)
ARGLIST is flattened and any every nil value is discarded.

If the variable `svn-status-edit-svn-command' is non-nil then the user
can edit ARGLIST before running svn.

The hook svn-pre-run-hook allows to monitor/modify the ARGLIST."
  (setq arglist (svn-status-flatten-list arglist))
  (if (eq (process-status "svn") nil)
      (progn
        (when svn-status-edit-svn-command
          (setq arglist (append
                         (list (car arglist))
                         (split-string
                          (read-from-minibuffer
                           (format "svn %s flags: " (car arglist))
                           (mapconcat 'identity (cdr arglist) " ")))))
          (when (eq svn-status-edit-svn-command t)
            (svn-status-toggle-edit-cmd-flag t))
          (message "svn-run %s: %S" cmdtype arglist))
        (run-hooks 'svn-pre-run-hook)
        (unless (eq mode-line-process 'svn-status-mode-line-process)
          (setq svn-pre-run-mode-line-process mode-line-process)
          (setq mode-line-process 'svn-status-mode-line-process))
        (setq svn-status-pre-run-svn-buffer (current-buffer))
        (let* ((pre-run-buffer-default-directory default-directory)
               (proc-buf (get-buffer-create svn-process-buffer-name))
               (svn-exe svn-status-svn-executable)
               (svn-proc))
          (when (listp (car arglist))
            (setq arglist (car arglist)))
          (save-excursion
            (set-buffer proc-buf)
            (setq default-directory pre-run-buffer-default-directory)
            (setq buffer-read-only nil)
            (buffer-disable-undo)
            (fundamental-mode)
            (if clear-process-buffer
                (delete-region (point-min) (point-max))
              (goto-char (point-max)))
            (setq svn-process-cmd cmdtype)
            (setq svn-status-last-commit-author nil)
            (setq svn-status-mode-line-process-status (format " running %s" cmdtype))
            (svn-status-update-mode-line)
            (save-excursion (sit-for 0.1))
            (ring-insert svn-last-cmd-ring (list (current-time-string) arglist default-directory svn-arg-file-content))
            (setq svn-arg-file-content nil)
            (setq svn-process-handle-error-msg nil)
            (if run-asynchron
                (progn
                  ;;(message "running asynchron: %s %S" svn-exe arglist)
                  (setq svn-pre-run-asynch-recent-keys (recent-keys))
                  (let ((process-environment (svn-process-environment))
                        (process-connection-type nil))
                    ;; Communicate with the subprocess via pipes rather
                    ;; than via a pseudoterminal, so that if the svn+ssh
                    ;; scheme is being used, SSH will not ask for a
                    ;; passphrase via stdio; psvn.el is currently unable
                    ;; to answer such prompts.  Instead, SSH will run
                    ;; x11-ssh-askpass if possible.  If Emacs is being
                    ;; run on a TTY without $DISPLAY, this will fail; in
                    ;; such cases, the user should start ssh-agent and
                    ;; then run ssh-add explicitly.
                    (setq svn-proc (apply svn-start-process-function "svn" proc-buf svn-exe arglist)))
                  (when svn-status-svn-process-coding-system
                    (set-process-coding-system svn-proc svn-status-svn-process-coding-system
                                               svn-status-svn-process-coding-system))
                  (set-process-sentinel svn-proc 'svn-process-sentinel)
                  (when svn-status-track-user-input
                    (set-process-filter svn-proc 'svn-process-filter)))
              ;;(message "running synchron: %s %S" svn-exe arglist)
              (let ((process-environment (svn-process-environment)))
                ;; `call-process' ignores `process-connection-type' and
                ;; never opens a pseudoterminal.
                (apply svn-call-process-function svn-exe nil proc-buf nil arglist))
              (setq svn-status-last-output-buffer-name svn-process-buffer-name)
              (run-hooks 'svn-post-process-svn-output-hook)
              (setq svn-status-mode-line-process-status "")
              (svn-status-update-mode-line)
              (when svn-pre-run-mode-line-process
                (setq mode-line-process svn-pre-run-mode-line-process)
                (setq svn-pre-run-mode-line-process nil))))))
    (error "You can only run one svn process at once!")))

(defun svn-process-sentinel-fixup-path-seperators ()
    "Convert all path separators to UNIX style.
\(This is a no-op unless `system-type' is windows-nt\)"
  (when (eq system-type 'windows-nt)
      (save-excursion
        (goto-char (point-min))
        (while (search-forward "\\" nil t)
          (replace-match "/")))))

(defun svn-process-sentinel (process event)
  "Called after a svn process has finished."
  ;;(princ (format "Process: %s had the event `%s'" process event)))
  (let ((act-buf (current-buffer)))
    (when svn-pre-run-mode-line-process
      (with-current-buffer svn-status-pre-run-svn-buffer
        (setq mode-line-process svn-pre-run-mode-line-process))
      (setq svn-pre-run-mode-line-process nil))
    (set-buffer (process-buffer process))
    (setq svn-status-mode-line-process-status "")
    (svn-status-update-mode-line)
    (cond ((string= event "finished\n")
           (run-hooks 'svn-post-process-svn-output-hook)
           (cond ((eq svn-process-cmd 'status)
                  ;;(message "svn status finished")
                  (svn-process-sentinel-fixup-path-seperators)
                  (svn-parse-status-result)
                  (svn-status-apply-elide-list)
                  (when svn-status-update-previous-process-output
                    (set-buffer (process-buffer process))
                    (delete-region (point-min) (point-max))
                    (insert "Output from svn command:\n")
                    (insert svn-status-update-previous-process-output)
                    (goto-char (point-min))
                    (setq svn-status-update-previous-process-output nil))
                  (when svn-status-update-list
                    ;; (message "Using svn-status-update-list: %S" svn-status-update-list)
                    (save-excursion
                      (svn-status-update-with-command-list svn-status-update-list))
                    (setq svn-status-update-list nil))
                  (when svn-status-display-new-status-buffer
                    (set-window-configuration svn-status-initial-window-configuration)
                    (if (svn-had-user-input-since-asynch-run)
                        (message "svn status finished")
                      (switch-to-buffer svn-status-buffer-name))))
                 ((eq svn-process-cmd 'log)
                  (svn-status-show-process-output 'log t)
                  (pop-to-buffer svn-status-last-output-buffer-name)
                  (svn-log-view-mode)
                  (forward-line 2)
                  (unless (looking-at "Changed paths:")
                    (forward-line 1))
                  (font-lock-fontify-buffer)
                  (message "svn log finished"))
                 ((eq svn-process-cmd 'info)
                  (svn-status-show-process-output 'info t)
                  (message "svn info finished"))
                 ((eq svn-process-cmd 'ls)
                  (svn-status-show-process-output 'info t)
                  (message "svn ls finished"))
                 ((eq svn-process-cmd 'diff)
                  (svn-status-activate-diff-mode)
                  (message "svn diff finished"))
                 ((eq svn-process-cmd 'parse-info)
                  (svn-status-parse-info-result))
                 ((eq svn-process-cmd 'blame)
                  (svn-status-show-process-output 'blame t)
                  (when svn-status-pre-run-svn-buffer
                    (with-current-buffer svn-status-pre-run-svn-buffer
                      (unless (eq major-mode 'svn-status-mode)
                        (let ((src-line-number (svn-line-number-at-pos)))
                          (pop-to-buffer (get-buffer svn-status-last-output-buffer-name))
                          (goto-line src-line-number)))))
                  (with-current-buffer (get-buffer svn-status-last-output-buffer-name)
                    (svn-status-activate-blame-mode))
                  (message "svn blame finished"))
                 ((eq svn-process-cmd 'commit)
                  (svn-process-sentinel-fixup-path-seperators)
                  (svn-status-remove-temp-file-maybe)
                  (when (member 'commit svn-status-unmark-files-after-list)
                    (svn-status-unset-all-usermarks))
                  (svn-status-update-with-command-list (svn-status-parse-commit-output))
                  (svn-revert-some-buffers)
                  (run-hooks 'svn-log-edit-done-hook)
                  (setq svn-status-files-to-commit nil
                        svn-status-recursive-commit nil)
                  (if (null svn-status-commit-rev-number)
                      (message "No revision to commit.")
                    (message "svn: Committed revision %s." svn-status-commit-rev-number)))
                 ((eq svn-process-cmd 'update)
                  (svn-status-show-process-output 'update t)
                  (setq svn-status-update-list (svn-status-parse-update-output))
                  (svn-revert-some-buffers)
                  (svn-status-update)
                  (if (car svn-status-update-rev-number)
                      (message "svn: Updated to revision %s." (cadr svn-status-update-rev-number))
                    (message "svn: At revision %s." (cadr svn-status-update-rev-number))))
                 ((eq svn-process-cmd 'add)
                  (svn-status-update-with-command-list (svn-status-parse-ar-output))
                  (message "svn add finished"))
                 ((eq svn-process-cmd 'lock)
                  (svn-status-update)
                  (message "svn lock finished"))
                 ((eq svn-process-cmd 'unlock)
                  (svn-status-update)
                  (message "svn unlock finished"))
                 ((eq svn-process-cmd 'mkdir)
                  (svn-status-update)
                  (message "svn mkdir finished"))
                 ((eq svn-process-cmd 'revert)
                  (when (member 'revert svn-status-unmark-files-after-list)
                    (svn-status-unset-all-usermarks))
                  (svn-revert-some-buffers)
                  (svn-status-update)
                  (message "svn revert finished"))
                 ((eq svn-process-cmd 'resolved)
                  (svn-status-update)
                  (message "svn resolved finished"))
            

Batosay - 2023
IDNSEO Team