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

[mhc:00534] Re: mhc-cvs.el



土屋です。


>> On Thu, 20 Apr 2000 13:27:37 +0900
>> 「土」== tsuchiya@xxxxxxxxxxxxxxxxxxxxxxx (TSUCHIYA Masatoshi) said as follows:

土> で、cvs add および cvs remove は、完全なオフライン環境でも、いつでも実
土> 行可能なはずだと考えていたのですが、これが間違いなのでしょうか?

白井> こちらの問題です。環境は昨日も書きましたけど、Win95 + NotePC +
白井> cvs-1.10.5 です。 offline 状態で (server を隠すこともないけど)

土> うーん。そうだったんですか…。こいつは困りましたね。CVS による管理の魅
土> 力があっというまになくなってしまいました。

この問題に関して、とりあえずオフライン状態時には cvs add / remove を行
わず、オンライン状態になった後で cvs add / remove を行うように変更して
みました。

## [mhc:00529] のパッチを適用した後にあてるようになっています。

Index: mhc-cvs.el
===================================================================
RCS file: /home/tsuchiya/CVS/projects/mhc/mhc-cvs.el,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- mhc-cvs.el	2000/04/20 09:25:01	1.6
+++ mhc-cvs.el	2000/04/24 14:36:08	1.7
@@ -34,6 +34,7 @@
 ;; ケジュールファイルを CVS を通して管理するようになる。
 
 ;;; Definition
+(eval-when-compile (require 'cl))
 (provide 'mhc-cvs)
 (put 'mhc-cvs 'open   'mhc-cvs/open)
 (put 'mhc-cvs 'close  'mhc-cvs/close)
@@ -89,22 +90,65 @@
 
 (defun mhc-cvs/sync ()
   "リモートのスケジュールファイルとローカルのスケジュールファイルの同期を取る関数"
+  (mhc-cvs/delay-add-and-remove (mhc-summary-folder-to-path mhc-base-folder))
   (mhc-cvs/update)
   t) ; return value
 
+(defun mhc-cvs/delay-add-and-remove (dir)
+  (dolist (entry (directory-files dir nil nil t))
+    (cond
+     ;; オフライン状態の時に追加されたファイルを実際に追加する
+     ((string-match "^\\.mhc-cvs-added-" entry)
+      (mhc-cvs/add (expand-file-name (substring entry (match-end 0)) dir))
+      (mhc-misc-touch-directory dir))
+     ;; オフライン状態の時に削除されたファイルを実際に削除する
+     ((string-match "^\\.mhc-cvs-removed-" entry)
+      (mhc-cvs/remove (expand-file-name (substring entry (match-end 0)) dir))
+      (mhc-misc-touch-directory dir))
+     ;; . で始まるファイルは無視する
+     ((string-match "^\\." entry) t)
+     ;; CVS の作業用のディレクトリは無視する
+     ((string= "CVS" entry) t)
+     ;; ディレクトリを再帰的に処理する
+     ((file-directory-p (expand-file-name entry dir))
+      (mhc-cvs/delay-add-and-remove (expand-file-name entry dir))))))
+
+(defun mhc-cvs/get-added-flag-file-name (filename)
+  (expand-file-name (format ".mhc-cvs-added-%s"
+			    (file-name-nondirectory filename))
+		    (file-name-directory filename)))
+
+(defun mhc-cvs/get-removed-file-name (filename)
+  (expand-file-name (format ".mhc-cvs-removed-%s"
+			    (file-name-nondirectory filename))
+		    (file-name-directory filename)))
+
 (defun mhc-cvs/add (filename &optional offline)
   "ファイルを追加する関数"
-  (and (= 0 (mhc-cvs/backend "add" filename)) (mhc-cvs/modify filename offline)))
+  (let ((added (mhc-cvs/get-added-flag-file-name filename))
+	(removed (mhc-cvs/get-removed-file-name filename)))
+    (if (file-exists-p removed) (delete-file removed))
+    (if offline
+	(not (make-symbolic-link filename added t))
+      (if (file-exists-p added) (delete-file added))
+      (and (= 0 (mhc-cvs/backend "add" filename))
+	   (mhc-cvs/modify filename)))))
 
+(defun mhc-cvs/remove (filename &optional offline)
+  "ファイルを削除する関数"
+  (let ((added (mhc-cvs/get-added-flag-file-name filename))
+	(removed (mhc-cvs/get-removed-file-name filename)))
+    (if (file-exists-p added) (delete-file added))
+    (if offline
+	(not (rename-file filename removed t))
+      (if (file-exists-p removed) (delete-file removed))
+      (if (file-exists-p filename) (delete-file filename))
+      (and (= 0 (mhc-cvs/backend "remove" filename))
+	   (mhc-cvs/modify filename)))))
+
 (defun mhc-cvs/modify (filename &optional offline)
   "ファイルを変更する関数"
   (or offline (= 0 (mhc-cvs/backend "commit" "-m" "" filename))))
-
-(defun mhc-cvs/remove (filename &optional offline)
-  "ファイルを削除する関数"
-  (delete-file filename)
-  (and (= 0 (mhc-cvs/backend "remove" filename))
-       (mhc-cvs/modify filename offline)))
 
 
 ;;; CVS Backend Function
オフライン状態のままで、ファイル名の同じスケジュールを追加したり、削除
したりすると、その間の履歴が失われてしまいますので、運用で注意してくだ
さい。cvs commit せずに変更しているわけなので、その間の履歴が失われる
のは当然と言えば当然なのですが…。


-- 
土屋 雅稔  ( TSUCHIYA Masatoshi )
    http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/