[Top][All Lists]
[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))))))
- VC state, Stefan Monnier, 2008/04/06
- Re: VC state, Dan Nicolaescu, 2008/04/08
- Re: VC state, Stefan Monnier, 2008/04/08
- Re: VC state, Dan Nicolaescu, 2008/04/08
- Re: VC state, Nick Roberts, 2008/04/08
- Re: VC state, Dan Nicolaescu, 2008/04/09
- VC development [was Re: VC state], Nick Roberts, 2008/04/10
- Re: VC state, Nick Roberts, 2008/04/10