[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/