From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dan Nicolaescu Newsgroups: gmane.emacs.devel Subject: conflict state (was Re: VC state) Date: Tue, 08 Apr 2008 08:03:12 -0700 Message-ID: <200804081503.m38F3C3A019899@sallyv1.ics.uci.edu> References: <200804061740.m36Hemw8021394@sallyv1.ics.uci.edu> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1207667544 25255 80.91.229.12 (8 Apr 2008 15:12:24 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 8 Apr 2008 15:12:24 +0000 (UTC) Cc: emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Apr 08 17:12:55 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1JjFV4-0003BN-CP for ged-emacs-devel@m.gmane.org; Tue, 08 Apr 2008 17:12:42 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JjFUQ-0001Vu-Tw for ged-emacs-devel@m.gmane.org; Tue, 08 Apr 2008 11:12:02 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JjFNB-0003Gc-E7 for emacs-devel@gnu.org; Tue, 08 Apr 2008 11:04:33 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JjFNA-0003G9-QB for emacs-devel@gnu.org; Tue, 08 Apr 2008 11:04:33 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JjFNA-0003G4-Dr for emacs-devel@gnu.org; Tue, 08 Apr 2008 11:04:32 -0400 Original-Received: from sallyv1.ics.uci.edu ([128.195.1.109]) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_3DES_EDE_CBC_SHA1:24) (Exim 4.60) (envelope-from ) id 1JjFN9-0004jD-QK for emacs-devel@gnu.org; Tue, 08 Apr 2008 11:04:32 -0400 X-ICS-MailScanner-Watermark: 1208271794.14165@Bzk/r6SsZS3hAjFP/CPGGA Original-Received: from mothra.ics.uci.edu (mothra.ics.uci.edu [128.195.6.93]) by sallyv1.ics.uci.edu (8.13.7+Sun/8.13.7) with ESMTP id m38F3C3A019899; Tue, 8 Apr 2008 08:03:13 -0700 (PDT) In-Reply-To: (Stefan Monnier's message of "Mon, 07 Apr 2008 11:16:22 -0400") Original-Lines: 276 X-ICS-MailScanner: Found to be clean X-ICS-MailScanner-SpamCheck: not spam, SpamAssassin (score=-0.263, required 5, autolearn=disabled, ALL_TRUSTED -1.44, FM_MULTI_ODD2 1.10, TW_SV 0.08) X-ICS-MailScanner-From: dann@mothra.ics.uci.edu X-detected-kernel: by monty-python.gnu.org: Solaris 10 (beta) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:94708 Archived-At: Stefan Monnier writes: > > This has been in Todo for a while, displaying this stuff is trivial, VC > > needs just to provide the information. Someone just needs to sit down > > and figure out how it's supposed to work in VC... > > With some backends (E.g. Svn and Bzr), it would make a lot of sense to > make it a new vc-state, since you need to run `(svn|bzr) resolve' to > switch from that state to `edited' and you can't commit before. > > In other bakends, it's less clear. Maybe you should try to simply add > `conflict' as a new `vc-state' and see how it works out. This will > require checking all uses of `vc-state' to adjust them to the new state. A patch to implement the new conflict state is below. Can you please change the magic that runs the resolve command and turns on smerge-mode to use this state instead? Not sure what to do about the new `mark-resolved' backend function for CVS, it probably should be just a no-op, it should be easy to see once the smerge logic is in place. Index: vc-hooks.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/vc-hooks.el,v retrieving revision 1.234 diff -u -3 -p -r1.234 vc-hooks.el --- vc-hooks.el 1 Apr 2008 02:58:15 -0000 1.234 +++ vc-hooks.el 8 Apr 2008 06:29:00 -0000 @@ -517,6 +517,8 @@ For registered files, the value returned 'removed Scheduled to be deleted from the repository on next commit. + 'conflict The file contains conflicts as the result of a merge. + 'missing The file is not present in the file system, but the VC system still tracks it. @@ -775,10 +777,10 @@ Before doing that, check if there are an (eq (vc-checkout-model file) 'implicit) (vc-file-setprop file 'vc-state 'edited) (vc-mode-line file) - (if (featurep 'vc) - ;; If VC is not loaded, then there can't be - ;; any VC Dired buffer to synchronize. - (vc-dired-resynch-file file))))) + (when (featurep 'vc) + ;; If VC is not loaded, then there can't be + ;; any VC Dired buffer to synchronize. + (vc-dired-resynch-file file))))) (defvar vc-menu-entry '(menu-item "Version Control" vc-menu-map @@ -861,6 +863,9 @@ This function assumes that the file is r ((eq state 'added) (setq state-echo "Locally added file") (concat backend "@" rev)) + ((eq state 'conflict) + (setq state-echo "File contains conflicts after the last merge") + (concat backend "!!" rev)) ((eq state 'removed) (setq state-echo "File removed from the VC system") (concat backend "!" rev)) Index: vc.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/vc.el,v retrieving revision 1.573 diff -u -3 -p -r1.573 vc.el --- vc.el 6 Apr 2008 17:30:39 -0000 1.573 +++ vc.el 8 Apr 2008 06:29:04 -0000 @@ -362,6 +362,11 @@ ;; Modify the change comments associated with the files at the ;; given revision. This is optional, many backends do not support it. ;; +;; - mark-resolved (files) +;; +;; The the VCS that conflicts have been resolved. Not all systems +;; need to do this. +;; ;; HISTORY FUNCTIONS ;; ;; * print-log (files &optional buffer) @@ -1478,7 +1483,7 @@ Otherwise, throw an error." (defsubst vc-editable-p (file) "Return non-nil if FILE can be edited." (or (eq (vc-checkout-model file) 'implicit) - (memq (vc-state file) '(edited needs-merge)))) + (memq (vc-state file) '(edited needs-merge conflict)))) (defun vc-revert-buffer-internal (&optional arg no-confirm) "Revert buffer, keeping point and mark where user expects them. @@ -1667,6 +1672,9 @@ merge in the changes into your working c (read-string (format "%s revision to steal: " file)) (vc-working-revision file)) state))) + ;; conflict + ((eq state 'conflict) + (vc-mark-resolved files)) ;; needs-patch ((eq state 'needs-patch) (dolist (file files) @@ -1901,6 +1909,13 @@ After check-out, runs the normal hook `v (vc-resynch-buffer file t t) (run-hooks 'vc-checkout-hook)) +(defun vc-mark-resolved (files) + (with-vc-properties + files + (vc-call mark-resolved files) + ;; XXX: Is this TRTD? + `((vc-state . edited)))) + (defun vc-steal-lock (file rev owner) "Steal the lock on FILE." (let (file-description) @@ -2722,7 +2737,7 @@ specific headers." (propertize (format "%-20s" state) 'face (cond ((eq state 'up-to-date) 'font-lock-builtin-face) - ((eq state 'missing) 'font-lock-warning-face) + ((memq state '(missing conflict)) 'font-lock-warning-face) (t 'font-lock-variable-name-face)) 'mouse-face 'highlight) " " @@ -3898,6 +3913,10 @@ to provide the `find-revision' operation (with-current-buffer (find-file-noselect new) (vc-register))) +(defun vc-default-mark-resolved (backend files) + ;; XXX: For testing. + (error "Backend implements the conflict state, but it does not implement a `mark-resolved' function")) + (defalias 'vc-default-logentry-check 'ignore) (defalias 'vc-default-check-headers 'ignore) @@ -3909,11 +3928,11 @@ to provide the `find-revision' operation (defun vc-default-comment-history (backend file) "Return a string with all log entries stored in BACKEND for FILE." - (if (vc-find-backend-function backend 'print-log) - (with-current-buffer "*vc*" - (vc-call print-log (list file)) - (vc-call-backend backend 'wash-log) - (buffer-string)))) + (when (vc-find-backend-function backend 'print-log) + (with-current-buffer "*vc*" + (vc-call print-log (list file)) + (vc-call-backend backend 'wash-log) + (buffer-string)))) (defun vc-default-receive-file (backend file rev) "Let BACKEND receive FILE from another version control system." Index: vc-svn.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/vc-svn.el,v retrieving revision 1.75 diff -u -3 -p -r1.75 vc-svn.el --- vc-svn.el 31 Mar 2008 15:36:54 -0000 1.75 +++ vc-svn.el 8 Apr 2008 14:50:29 -0000 @@ -160,7 +160,7 @@ If you want to force an empty list of ar (defun vc-svn-after-dir-status (callback buffer) (let ((state-map '((?A . added) - (?C . edited) + (?C . conflict) (?D . removed) (?I . ignored) (?M . edited) @@ -327,12 +327,16 @@ The changes are between FIRST-VERSION an "-r" (if second-version (concat first-version ":" second-version) first-version)) - (vc-file-setprop file 'vc-state 'edited) (with-current-buffer (get-buffer "*vc*") (goto-char (point-min)) (if (looking-at "C ") - 1 ; signal conflict - 0))) ; signal success + (progn + (vc-file-setprop file 'vc-state 'conflict) + ;; signal conflict + 1) + ;; signal success + (vc-file-setprop file 'vc-state 'edited) + 0))) (defun vc-svn-merge-news (file) "Merge in any new changes made to FILE." @@ -376,7 +380,7 @@ The changes are between FIRST-VERSION an 0);; indicate success to the caller ;; Conflicts detected! (t - (vc-file-setprop file 'vc-state 'edited) + (vc-file-setprop file 'vc-state 'conflict) 1);; signal the error to the caller ) (pop-to-buffer "*vc*") @@ -621,7 +625,9 @@ information about FILENAME and return it (vc-file-setprop file 'vc-working-revision "0") (vc-file-setprop file 'vc-checkout-time 0) 'added) - ((memq status '(?M ?C)) + ((eq status ?C) + (vc-file-setprop file 'vc-state 'conflict)) + ((eq status '?M) (if (eq (char-after (match-beginning 1)) ?*) 'needs-merge 'edited)) Index: vc-cvs.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/vc-cvs.el,v retrieving revision 1.114 diff -u -3 -p -r1.114 vc-cvs.el --- vc-cvs.el 31 Mar 2008 15:36:55 -0000 1.114 +++ vc-cvs.el 8 Apr 2008 14:50:30 -0000 @@ -432,12 +432,16 @@ The changes are between FIRST-REVISION a "update" "-kk" (concat "-j" first-revision) (concat "-j" second-revision)) - (vc-file-setprop file 'vc-state 'edited) (with-current-buffer (get-buffer "*vc*") (goto-char (point-min)) (if (re-search-forward "conflicts during merge" nil t) - 1 ; signal error - 0))) ; signal success + (progn + (vc-file-setprop file 'vc-state 'conflict) + ;; signal error + 1) + (vc-file-setprop file 'vc-state 'edited) + ;; signal success + 0))) (defun vc-cvs-merge-news (file) "Merge in any new changes made to FILE." @@ -478,7 +482,7 @@ The changes are between FIRST-REVISION a 0);; indicate success to the caller ;; Conflicts detected! (t - (vc-file-setprop file 'vc-state 'edited) + (vc-file-setprop file 'vc-state 'conflict) 1);; signal the error to the caller ) (pop-to-buffer "*vc*") @@ -839,11 +843,11 @@ state." (if (not (re-search-forward "\\=[ \t]+Status: \\(.*\\)" nil t)) (setq status "Unknown") (setq status (match-string 1))) - (if (and full - (re-search-forward - "\\(RCS Version\\|RCS Revision\\|Repository revision\\):\ + (when (and full + (re-search-forward + "\\(RCS Version\\|RCS Revision\\|Repository revision\\):\ \[\t ]+\\([0-9.]+\\)" - nil t)) + nil t)) (vc-file-setprop file 'vc-latest-revision (match-string 2))) (vc-file-setprop file 'vc-state @@ -858,6 +862,7 @@ state." (if missing 'missing 'needs-patch)) ((string-match "Locally Added" status) 'added) ((string-match "Locally Removed" status) 'removed) + ((string-match "File had conflicts " status) 'conflict) (t 'edited)))))))) (defun vc-cvs-dir-state-heuristic (dir) @@ -922,6 +927,7 @@ state." (if missing 'missing 'needs-patch)) ((string-match "Locally Added" status-str) 'added) ((string-match "Locally Removed" status-str) 'removed) + ((string-match "File had conflicts " status-str) 'conflict) (t 'edited))) (unless (eq status 'up-to-date) (push (list file status) result))))))