emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

conflict state (was Re: VC state)


From: Dan Nicolaescu
Subject: conflict state (was Re: VC state)
Date: Tue, 08 Apr 2008 08:03:12 -0700

Stefan Monnier <address@hidden> 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))))))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]