38422
|
1 ;;; pcvs-parse.el --- the CVS output parser
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
2
|
45998
124e2db60fc7
(cvs-parse-table): Handle `nothing known about' with more care.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
3 ;; Copyright (C) 1991,92,93,94,95,96,97,98,99,2000,2002
|
124e2db60fc7
(cvs-parse-table): Handle `nothing known about' with more care.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
4 ;; Free Software Foundation, Inc.
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
5
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
6 ;; Author: Stefan Monnier <monnier@cs.yale.edu>
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
7 ;; Keywords: pcl-cvs
|
47210
|
8 ;; Revision: $Id: pcvs-parse.el,v 1.12 2002/06/24 22:49:06 monnier Exp $
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
9
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
10 ;; This file is part of GNU Emacs.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
11
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
13 ;; it under the terms of the GNU General Public License as published by
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
14 ;; the Free Software Foundation; either version 2, or (at your option)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
15 ;; any later version.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
16
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
17 ;; GNU Emacs is distributed in the hope that it will be useful,
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
20 ;; GNU General Public License for more details.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
21
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
22 ;; You should have received a copy of the GNU General Public License
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
25 ;; Boston, MA 02111-1307, USA.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
26
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
27 ;;; Commentary:
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
28
|
36612
|
29 ;;; Bugs:
|
|
30
|
|
31 ;; - when merging a modified file, if the merge says that the file already
|
|
32 ;; contained in the changes, it marks the file as `up-to-date' although
|
|
33 ;; it might still contain further changes.
|
|
34 ;; Example: merging a zero-change commit.
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
35
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
36 ;;; Code:
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
37
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
38 (eval-when-compile (require 'cl))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
39
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
40 (require 'pcvs-util)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
41 (require 'pcvs-info)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
42
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
43 ;; imported from pcvs.el
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
44 (defvar cvs-execute-single-dir)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
45
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
46 ;; parse vars
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
47
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
48 (defcustom cvs-update-prog-output-skip-regexp "$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
49 "*A regexp that matches the end of the output from all cvs update programs.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
50 That is, output from any programs that are run by CVS (by the flag -u
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
51 in the `modules' file - see cvs(5)) when `cvs update' is performed should
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
52 terminate with a line that this regexp matches. It is enough that
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
53 some part of the line is matched.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
54
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
55 The default (a single $) fits programs without output."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
56 :group 'pcl-cvs
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
57 :type '(regexp :value "$"))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
58
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
59 (defcustom cvs-parse-ignored-messages
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
60 '("Executing ssh-askpass to query the password.*$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
61 ".*Remote host denied X11 forwarding.*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
62 "*A list of regexps matching messages that should be ignored by the parser.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
63 Each regexp should match a whole set of lines and should hence be terminated
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
64 by `$'."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
65 :group 'pcl-cvs
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
66 :type '(repeat regexp))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
67
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
68 ;; a few more defvars just to shut up the compiler
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
69 (defvar cvs-start)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
70 (defvar cvs-current-dir)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
71 (defvar cvs-current-subdir)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
72 (defvar dont-change-disc)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
73
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
74 ;;;; The parser
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
75
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
76 (defconst cvs-parse-known-commands
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
77 '("status" "add" "commit" "update" "remove" "checkout" "ci")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
78 "List of CVS commands whose output is understood by the parser.")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
79
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
80 (defun cvs-parse-buffer (parse-spec dont-change-disc &optional subdir)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
81 "Parse current buffer according to PARSE-SPEC.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
82 PARSE-SPEC is a function of no argument advancing the point and returning
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
83 either a fileinfo or t (if the matched text should be ignored) or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
84 nil if it didn't match anything.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
85 DONT-CHANGE-DISC just indicates whether the command was changing the disc
|
37337
|
86 or not (useful to tell the difference between `cvs-examine' and `cvs-update'
|
|
87 output.
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
88 The path names should be interpreted as relative to SUBDIR (defaults
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
89 to the `default-directory').
|
37337
|
90 Return a list of collected entries, or t if an error occurred."
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
91 (goto-char (point-min))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
92 (let ((fileinfos ())
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
93 (cvs-current-dir "")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
94 (case-fold-search nil)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
95 (cvs-current-subdir (or subdir "")))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
96 (while (not (or (eobp) (eq fileinfos t)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
97 (let ((ret (cvs-parse-run-table parse-spec)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
98 (cond
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
99 ;; it matched a known information message
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
100 ((cvs-fileinfo-p ret) (push ret fileinfos))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
101 ;; it didn't match anything at all (impossible)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
102 ((and (consp ret) (cvs-fileinfo-p (car ret)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
103 (setq fileinfos (append ret fileinfos)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
104 ((null ret) (setq fileinfos t))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
105 ;; it matched something that should be ignored
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
106 (t nil))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
107 (nreverse fileinfos)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
108
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
109
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
110 ;; All those parsing macros/functions should return a success indicator
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
111 (defsubst cvs-parse-msg () (buffer-substring cvs-start (1- (point))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
112
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
113 ;;(defsubst COLLECT (exp) (push exp *result*))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
114 ;;(defsubst PROG (e) t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
115 ;;(defmacro SEQ (&rest seqs) (cons 'and seqs))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
116
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
117 (defmacro cvs-match (re &rest matches)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
118 "Try to match RE and extract submatches.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
119 If RE matches, advance the point until the line after the match and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
120 then assign the variables as specified in MATCHES (via `setq')."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
121 (cons 'cvs-do-match
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
122 (cons re (mapcar (lambda (match)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
123 `(cons ',(first match) ,(second match)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
124 matches))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
125
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
126 (defun cvs-do-match (re &rest matches)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
127 "Internal function for the `cvs-match' macro.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
128 Match RE and if successful, execute MATCHES."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
129 ;; Is it a match?
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
130 (when (looking-at re)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
131 (goto-char (match-end 0))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
132 ;; Skip the newline (unless we already are at the end of the buffer).
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
133 (when (and (eolp) (< (point) (point-max))) (forward-char))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
134 ;; assign the matches
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
135 (dolist (match matches t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
136 (let ((val (cdr match)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
137 (set (car match) (if (integerp val) (match-string val) val))))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
138
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
139 (defmacro cvs-or (&rest alts)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
140 "Try each one of the ALTS alternatives until one matches."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
141 `(let ((-cvs-parse-point (point)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
142 ,(cons 'or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
143 (mapcar (lambda (es)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
144 `(or ,es (ignore (goto-char -cvs-parse-point))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
145 alts))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
146 (def-edebug-spec cvs-or t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
147
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
148 ;; This is how parser tables should be executed
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
149 (defun cvs-parse-run-table (parse-spec)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
150 "Run PARSE-SPEC and provide sensible default behavior."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
151 (unless (bolp) (forward-line 1)) ;this should never be needed
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
152 (let ((cvs-start (point)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
153 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
154 (funcall parse-spec)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
155
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
156 (dolist (re cvs-parse-ignored-messages)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
157 (when (cvs-match re) (return t)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
158
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
159 ;; This is a parse error. Create a message-type fileinfo.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
160 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
161 (cvs-match ".*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
162 (cvs-create-fileinfo 'MESSAGE cvs-current-dir " "
|
37337
|
163 ;; (concat " Unknown msg: '"
|
|
164 (cvs-parse-msg) ;; "'")
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
165 :subtype 'ERROR)))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
166
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
167
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
168 (defun cvs-parsed-fileinfo (type path &optional directory &rest keys)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
169 "Create a fileinfo.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
170 TYPE can either be a type symbol or a cons of the form (TYPE . SUBTYPE).
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
171 PATH is the filename.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
172 DIRECTORY influences the way PATH is interpreted:
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
173 - if it's a string, it denotes the directory in which PATH (which should then be
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
174 a plain file name with no directory component) resides.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
175 - if it's nil, the PATH should not be trusted: if it has a directory
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
176 component, use it, else, assume it is relative to the current directory.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
177 - else, the PATH should be trusted to be relative to the root
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
178 directory (i.e. if there is no directory component, it means the file
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
179 is inside the main directory).
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
180 The remaining KEYS are passed directly to `cvs-create-fileinfo'."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
181 (let ((dir directory)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
182 (file path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
183 ;; only trust the directory if it's a string
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
184 (unless (stringp directory)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
185 ;; else, if the directory is true, the path should be trusted
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
186 (setq dir (or (file-name-directory path) (if directory "")))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
187 (setq file (file-name-nondirectory path)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
188
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
189 (let ((type (if (consp type) (car type) type))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
190 (subtype (if (consp type) (cdr type))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
191 (when dir (setq cvs-current-dir dir))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
192 (apply 'cvs-create-fileinfo type
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
193 (concat cvs-current-subdir (or dir cvs-current-dir))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
194 file (cvs-parse-msg) :subtype subtype keys))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
195
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
196 ;;;; CVS Process Parser Tables:
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
197 ;;;;
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
198 ;;;; The table for status and update could actually be merged since they
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
199 ;;;; don't conflict. But they don't overlap much either.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
200
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
201 (defun cvs-parse-table ()
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
202 "Table of message objects for `cvs-parse-process'."
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
203 (let (c file dir path type base-rev subtype)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
204 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
205
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
206 (cvs-parse-status)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
207 (cvs-parse-merge)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
208 (cvs-parse-commit)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
209
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
210 ;; this is not necessary because the fileinfo merging will remove
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
211 ;; such duplicate info and luckily the second info is the one we want.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
212 ;; (and (cvs-match "M \\(.*\\)$" (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
213 ;; (cvs-parse-merge path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
214
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
215 ;; Normal file state indicator.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
216 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
217 (cvs-match "\\([MARCUPNJ?]\\) \\(.*\\)$" (c 1) (path 2))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
218 ;; M: The file is modified by the user, and untouched in the repository.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
219 ;; A: The file is "cvs add"ed, but not "cvs ci"ed.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
220 ;; R: The file is "cvs remove"ed, but not "cvs ci"ed.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
221 ;; C: Conflict
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
222 ;; U: The file is copied from the repository.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
223 ;; P: The file was patched from the repository.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
224 ;; ?: Unknown file.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
225 (let ((code (aref c 0)))
|
29565
|
226 (cvs-parsed-fileinfo
|
|
227 (case code
|
|
228 (?M 'MODIFIED)
|
|
229 (?A 'ADDED)
|
|
230 (?R 'REMOVED)
|
|
231 (?? 'UNKNOWN)
|
|
232 (?C
|
|
233 (if (not dont-change-disc) 'CONFLICT
|
|
234 ;; This is ambiguous. We should look for conflict markers in the
|
|
235 ;; file to decide between CONFLICT and NEED-MERGE. With CVS-1.10
|
|
236 ;; servers, this should not be necessary, because they return
|
|
237 ;; a complete merge output.
|
|
238 (with-temp-buffer
|
|
239 (insert-file-contents path)
|
|
240 (goto-char (point-min))
|
|
241 (if (re-search-forward "^<<<<<<< " nil t)
|
|
242 'CONFLICT 'NEED-MERGE))))
|
|
243 (?J 'NEED-MERGE) ;not supported by standard CVS
|
|
244 ((?U ?P)
|
|
245 (if dont-change-disc 'NEED-UPDATE
|
|
246 (cons 'UP-TO-DATE (if (eq code ?U) 'UPDATED 'PATCHED)))))
|
|
247 path 'trust)))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
248
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
249 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
250 (cvs-match "pcl-cvs: descending directory \\(.*\\)$" (dir 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
251 (setq cvs-current-subdir dir))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
252
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
253 ;; A special cvs message
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
254 (and
|
43974
|
255 (let ((case-fold-search t))
|
|
256 (cvs-match "cvs[.a-z]* [a-z]+: "))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
257 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
258
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
259 ;; CVS is descending a subdirectory
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
260 ;; (status says `examining' while update says `updating')
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
261 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
262 (cvs-match "\\(Examining\\|Updating\\) \\(.*\\)$" (dir 2))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
263 (let ((dir (if (string= "." dir) "" (file-name-as-directory dir))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
264 (cvs-parsed-fileinfo 'DIRCHANGE "." dir)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
265
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
266 ;; [-n update] A new (or pruned) directory appeared but isn't traversed
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
267 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
268 (cvs-match "New directory `\\(.*\\)' -- ignored$" (dir 1))
|
47210
|
269 ;; (cvs-parsed-fileinfo 'MESSAGE " " (file-name-as-directory dir))
|
|
270 (cvs-parsed-fileinfo '(NEED-UPDATE . NEW-DIR) dir))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
271
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
272 ;; File removed, since it is removed (by third party) in repository.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
273 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
274 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
275 (cvs-match "warning: \\(.*\\) is not (any longer) pertinent$" (file 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
276 (cvs-match "\\(.*\\) is no longer in the repository$" (file 1)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
277 (cvs-parsed-fileinfo 'DEAD file))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
278
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
279 ;; [add]
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
280 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
281 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
282 (cvs-match "scheduling file `\\(.*\\)' for addition.*$" (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
283 (cvs-match "re-adding file \\(.*\\) (in place of .*)$" (path 1)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
284 (cvs-parsed-fileinfo 'ADDED path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
285
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
286 ;; [add] this will also show up as a `U <file>'
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
287 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
288 (cvs-match "\\(.*\\), version \\(.*\\), resurrected$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
289 (path 1) (base-rev 2))
|
47210
|
290 ;; FIXME: resurrection only brings back the original version,
|
|
291 ;; not the latest on the branch, so `up-to-date' is not always
|
|
292 ;; what we want.
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
293 (cvs-parsed-fileinfo '(UP-TO-DATE . RESURRECTED) path nil
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
294 :base-rev base-rev))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
295
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
296 ;; [remove]
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
297 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
298 (cvs-match "removed `\\(.*\\)'$" (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
299 (cvs-parsed-fileinfo 'DEAD path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
300
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
301 ;; [remove,merge]
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
302 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
303 (cvs-match "scheduling `\\(.*\\)' for removal$" (file 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
304 (cvs-parsed-fileinfo 'REMOVED file))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
305
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
306 ;; [update] File removed by you, but not cvs rm'd
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
307 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
308 (cvs-match "warning: \\(.*\\) was lost$" (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
309 (cvs-match (concat "U " (regexp-quote path) "$"))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
310 (cvs-parsed-fileinfo (if dont-change-disc
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
311 'MISSING
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
312 '(UP-TO-DATE . UPDATED))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
313 path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
314
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
315 ;; Mode conflicts (rather than contents)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
316 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
317 (cvs-match "conflict: ")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
318 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
319 (cvs-match "removed \\(.*\\) was modified by second party$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
320 (path 1) (subtype 'REMOVED))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
321 (cvs-match "\\(.*\\) created independently by second party$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
322 (path 1) (subtype 'ADDED))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
323 (cvs-match "\\(.*\\) is modified but no longer in the repository$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
324 (path 1) (subtype 'MODIFIED)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
325 (cvs-match (concat "C " (regexp-quote path)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
326 (cvs-parsed-fileinfo (cons 'CONFLICT subtype) path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
327
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
328 ;; Messages that should be shown to the user
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
329 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
330 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
331 (cvs-match "move away \\(.*\\); it is in the way$" (file 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
332 (cvs-match "warning: new-born \\(.*\\) has disappeared$" (file 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
333 (cvs-match "sticky tag .* for file `\\(.*\\)' is not a branch$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
334 (file 1)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
335 (cvs-parsed-fileinfo 'MESSAGE file))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
336
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
337 ;; File unknown.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
338 (and (cvs-match "use `.+ add' to create an entry for \\(.*\\)$" (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
339 (cvs-parsed-fileinfo 'UNKNOWN path))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
340
|
28256
|
341 ;; [commit]
|
|
342 (and (cvs-match "Up-to-date check failed for `\\(.+\\)'$" (file 1))
|
|
343 (cvs-parsed-fileinfo 'NEED-MERGE file))
|
|
344
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
345 ;; We use cvs-execute-multi-dir but cvs can't handle it
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
346 ;; Probably because the cvs-client can but the cvs-server can't
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
347 (and (cvs-match ".* files with '?/'? in their name.*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
348 (not cvs-execute-single-dir)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
349 (setq cvs-execute-single-dir t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
350 (cvs-create-fileinfo
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
351 'MESSAGE "" " "
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
352 "*** Add (setq cvs-execute-single-dir t) to your .emacs ***
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
353 See the FAQ file or the variable's documentation for more info."))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
354
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
355 ;; Cvs waits for a lock. Ignored: already handled by the process filter
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
356 (cvs-match "\\[..:..:..\\] \\(waiting for\\|obtained\\) .*lock in .*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
357 ;; File you removed still exists. Ignore (will be noted as removed).
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
358 (cvs-match ".* should be removed and is still there$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
359 ;; just a note
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
360 (cvs-match "use '.+ commit' to \\sw+ th\\sw+ files? permanently$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
361 ;; [add,status] followed by a more complete status description anyway
|
45998
124e2db60fc7
(cvs-parse-table): Handle `nothing known about' with more care.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
362 (and (cvs-match "nothing known about \\(.*\\)$" (path 1))
|
124e2db60fc7
(cvs-parse-table): Handle `nothing known about' with more care.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
363 (cvs-parsed-fileinfo 'DEAD path 'trust))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
364 ;; [update] problem with patch
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
365 (cvs-match "checksum failure after patch to .*; will refetch$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
366 (cvs-match "refetching unpatchable files$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
367 ;; [commit]
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
368 (cvs-match "Rebuilding administrative file database$")
|
36612
|
369 ;; ???
|
|
370 (cvs-match "--> Using per-directory sticky tag `.*'")
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
371
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
372 ;; CVS is running a *info program.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
373 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
374 (cvs-match "Executing.*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
375 ;; Skip by any output the program may generate to stdout.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
376 ;; Note that pcl-cvs will get seriously confused if the
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
377 ;; program prints anything to stderr.
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
378 (re-search-forward cvs-update-prog-output-skip-regexp))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
379
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
380 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
381 (cvs-match "cvs[.ex]* \\[[a-z]+ aborted\\]:.*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
382 (cvs-parsed-fileinfo 'MESSAGE ""))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
383
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
384 ;; sadly you can't do much with these since the path is in the repository
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
385 (cvs-match "Directory .* added to the repository$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
386 )))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
387
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
388
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
389 (defun cvs-parse-merge ()
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
390 (let (path base-rev head-rev handled type)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
391 ;; A merge (maybe with a conflict).
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
392 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
393 (cvs-match "RCS file: .*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
394 ;; Squirrel away info about the files that were retrieved for merging
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
395 (cvs-match "retrieving revision \\([0-9.]+\\)$" (base-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
396 (cvs-match "retrieving revision \\([0-9.]+\\)$" (head-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
397 (cvs-match "Merging differences between [0-9.]+ and [0-9.]+ into \\(.*\\)$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
398 (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
399
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
400 ;; eat up potential conflict warnings
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
401 (cvs-or (cvs-match "\\(rcs\\)?merge:?\\( warning\\)?: \\(overlaps\\|conflicts\\) \\(or other problems \\)?during merge$" (type 'CONFLICT)) t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
402 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
403 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
404 (cvs-match "cvs[.ex]* [a-z]+: ")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
405 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
406 (cvs-match "conflicts found in \\(.*\\)$" (path 1) (type 'CONFLICT))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
407 (cvs-match "could not merge .*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
408 (cvs-match "restoring \\(.*\\) from backup file .*$" (path 1))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
409 t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
410
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
411 ;; Is it a succesful merge?
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
412 ;; Figure out result of merging (ie, was there a conflict?)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
413 (let ((qfile (regexp-quote path)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
414 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
415 ;; Conflict
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
416 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
417 (cvs-match (concat "C \\(.*" qfile "\\)$") (path 1) (type 'CONFLICT))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
418 ;; C might be followed by a "suprious" U for non-mergeable files
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
419 (cvs-or (cvs-match (concat "U \\(.*" qfile "\\)$")) t))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
420 ;; Successful merge
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
421 (cvs-match (concat "M \\(.*" qfile "\\)$") (path 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
422 ;; The file already contained the modifications
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
423 (cvs-match (concat "^\\(.*" qfile
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
424 "\\) already contains the differences between .*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
425 (path 1) (type '(UP-TO-DATE . MERGED)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
426 t)
|
36612
|
427 ;; FIXME: PATH might not be set yet. Sometimes the only path
|
|
428 ;; information is in `RCS file: ...' (yuck!!).
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
429 (cvs-parsed-fileinfo (if dont-change-disc 'NEED-MERGE
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
430 (or type '(MODIFIED . MERGED))) path nil
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
431 :merge (cons base-rev head-rev))))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
432
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
433 (defun cvs-parse-status ()
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
434 (let (nofile path base-rev head-rev type)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
435 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
436 (cvs-match
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
437 "===================================================================$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
438 (cvs-match "File: \\(no file \\)?\\(.*[^ \t]\\)[ \t]+Status: "
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
439 (nofile 1) (path 2))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
440 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
441 (cvs-match "Needs \\(Checkout\\|Patch\\)$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
442 (type (if nofile 'MISSING 'NEED-UPDATE)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
443 (cvs-match "Up-to-date$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
444 (type (if nofile '(UP-TO-DATE . REMOVED) 'UP-TO-DATE)))
|
43974
|
445 (cvs-match "File had conflicts on merge$" (type 'MODIFIED))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
446 (cvs-match ".*[Cc]onflict.*$" (type 'CONFLICT))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
447 (cvs-match "Locally Added$" (type 'ADDED))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
448 (cvs-match "Locally Removed$" (type 'REMOVED))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
449 (cvs-match "Locally Modified$" (type 'MODIFIED))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
450 (cvs-match "Needs Merge$" (type 'NEED-MERGE))
|
47210
|
451 (cvs-match "Entry Invalid" (type '(NEED-MERGE . REMOVED)))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
452 (cvs-match "Unknown$" (type 'UNKNOWN)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
453 (cvs-match "$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
454 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
455 (cvs-match " *Version:[ \t]*\\([0-9.]+\\).*$" (base-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
456 ;; NOTE: there's no date on the end of the following for server mode...
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
457 (cvs-match " *Working revision:[ \t]*-?\\([0-9.]+\\).*$" (base-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
458 ;; Let's not get all worked up if the format changes a bit
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
459 (cvs-match " *Working revision:.*$"))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
460 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
461 (cvs-match " *RCS Version:[ \t]*\\([0-9.]+\\)[ \t]*.*$" (head-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
462 (cvs-match " *Repository revision:[ \t]*\\([0-9.]+\\)[ \t]*\\(.*\\)$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
463 (head-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
464 (cvs-match " *Repository revision:.*"))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
465 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
466 (and;;sometimes those fields are missing
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
467 (cvs-match " *Sticky Tag:[ \t]*\\(.*\\)$") ; FIXME: use it
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
468 (cvs-match " *Sticky Date:[ \t]*\\(.*\\)$") ; FIXME: use it
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
469 (cvs-match " *Sticky Options:[ \t]*\\(.*\\)$")) ; FIXME: use it
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
470 t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
471 (cvs-match "$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
472 ;; ignore the tags-listing in the case of `status -v'
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
473 (cvs-or (cvs-match " *Existing Tags:\n\\(\t.*\n\\)*$") t)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
474 (cvs-parsed-fileinfo type path nil
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
475 :base-rev base-rev
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
476 :head-rev head-rev))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
477
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
478 (defun cvs-parse-commit ()
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
479 (let (path base-rev subtype)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
480 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
481
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
482 (and
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
483 (cvs-match "\\(Checking in\\|Removing\\) \\(.*\\);$" (path 2))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
484 (cvs-match ".*,v <-- .*$")
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
485 (cvs-or
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
486 ;; deletion
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
487 (cvs-match "new revision: delete; previous revision: \\([0-9.]*\\)$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
488 (subtype 'REMOVED) (base-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
489 ;; addition
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
490 (cvs-match "initial revision: \\([0-9.]*\\)$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
491 (subtype 'ADDED) (base-rev 1))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
492 ;; update
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
493 (cvs-match "new revision: \\([0-9.]*\\); previous revision: .*$"
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
494 (subtype 'COMMITTED) (base-rev 1)))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
495 (cvs-match "done$")
|
39391
|
496 (progn
|
|
497 ;; Try to remove the temp files used by VC.
|
39419
0c69deb41e8a
(cvs-parse-commit): Expand the file name before passing it to VC.
Stefan Monnier <monnier@iro.umontreal.ca>
diff
changeset
|
498 (vc-delete-automatic-version-backups (expand-file-name path))
|
39391
|
499 ;; it's important here not to rely on the default directory management
|
|
500 ;; because `cvs commit' might begin by a series of Examining messages
|
|
501 ;; so the processing of the actual checkin messages might begin with
|
|
502 ;; a `current-dir' set to something different from ""
|
|
503 (cvs-parsed-fileinfo (cons 'UP-TO-DATE subtype) path 'trust
|
|
504 :base-rev base-rev)))
|
28088
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
505
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
506 ;; useless message added before the actual addition: ignored
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
507 (cvs-match "RCS file: .*\ndone$"))))
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
508
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
509
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
510 (provide 'pcvs-parse)
|
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
511
|
38422
|
512 ;;; pcvs-parse.el ends here
|