←
▼
▲
未対応
4-way merge: left-base, left, right-base, right, merged result.
LeftBase
Left
LeftMerged
RightBase
Right
RightMerged
1
2
Left
4
5
1
AddLeft
2
Left
4
5
1
AddLeft
2
Left
4
<<<<<<< Add
AddRight
=======
>>>>>>> Delete
5
1
2
Right
4
5
1
2
Right
4
AddRight
5
1
<<<<<<< Add
AddLeft
=======
>>>>>>> Delete
2
Right
4
AddRight
5
参考
LeftBase と RightBase の2つのほぼ同じテキストがあるとき、双方での編集をもう片方に反映させる
マージです。 4-way merge は、一般的に使われている用語ではありません。
←
▼
▲
同期 (ファイル)
ここでの同期とは、コピーして2つになったファイルの片方が変更されたとき、もう片方に反映することです。
2つのファイルの差分が少ししかないときに、片方のファイルが変更されたとき、もう片方に反映することも
含みます。
←
▼
▲
をスクリプトで実行するときに使うクラス。
内部データ構造
ArrayClass< SyncFilesX_SetClass >
ArrayClass< SyncFilesX_FileClass >
.Files
.Sets
.BaseStepPath
.WorkStepPath
string
string
(src)
(src)
(src)
SyncFilesX_Class::OpenFileCUI
SyncFilesX_App
(src)
(src)
// セットとファイルを選択
(src)
(src)
→ SyncFilesMenuLib.vbs
ソース
テスト
→ T_SyncFilesX フォルダー
関連
.IsNextAutoCommit
boolean
.IsNextAutoMergeFromBase
boolean
SyncFilesX_Class::LoadScanListUp_Sub
// 比較リストの作成
SyncFilesX_Class::Merge を呼び出すと、SyncFilesX は、マージ モード(Me.IsMerged
= True)になります。
このモードでは、SyncFilesX_FileClass などのメンバー変数は、以下のリンク先のような
意味に変わります。
←
▼
▲
Sub SyncFilesX_Class::LoadScanListUpAll( SettingFilePath as string, XML_String as string )
SyncFilesX の設定をロードして、同期の状況を調べます。
【引数】
SettingFilePath
XML_String
設定ファイルのパス
設定内容(XML形式)
→ SyncFilesMenuLib.vbs
ソース
SettingFilePath 引数は、相対パスの基準として使われます。
←
▼
▲
Function SyncFilesX_Class::GetWritableFolders() as array of string
SyncFilesX を使う際に必要となる書き込み許可するパスの配列を返します。
【引数】
返り値
書き込み許可するパスの配列
→ SyncFilesMenuLib.vbs
ソース
でロードした設定の内容によって返り値は変わります。
←
▼
▲
Sub SyncFilesX_Class::Merge( in_MergeOption as ThreeWayMergeOptionClass )
3way マージを行います。
【引数】
in_MergeOption
をする ThreeWayMergeSet タグがあるときに呼び出すことができます。
参考
←
▼
▲
Function SyncFilesX_Class::GetIsAllSynchronized() as boolean
全てのファイルが同期済みかどうかを返します。
→ SyncFilesMenuLib.vbs
ソース
ファイルが追加された場合は、同期済みではないと判定します。
←
▼
▲
Function SyncFilesX_Class::GetIsAllBaseSynchronized() as boolean
全てのベースのファイルが同期済みかどうかを返します。
→ SyncFilesMenuLib.vbs
ソース
ワークのファイルが同期済みかどうかには影響しません。
←
▼
▲
Function SyncFilesX_Class::GetCountOfNotSynchronized() as integer
全てのファイルが同期済みではないセットの数を返します。
→ SyncFilesMenuLib.vbs
ソース
←
▼
▲
Function SyncFilesX_Class::OpenCUI() as array of string
同期をとる作業を行うユーザーインターフェースを開きます。
【引数】
返り値
"Exit" または "Rescan"
→ SyncFilesMenuLib.vbs
ソース
作業が終わると、本関数から返ります。
←
▼
▲
SyncFilesX を使うツールをテストの中に、コンフリクトした状態をユーザーが解決したケースのテスト
があるときは、SyncFilesX のファイルを選択するメニューで、SyncForTest と自動的に入力するように
すれば、テストをするときにユーザーの操作が必要なくなります。
→ T_SyncFilesX.vbs
参考
の T_SyncFilesX_Test
赤字は更新があったことを示します。
前回の同期で同じ内容になっていたとき、かつ、
ベースだけを更新したときは、
ワークの内容が、ベースの内容になります。
ワークだけを更新したときは、
なにもしません。(同期済みにはします)
ベースとワークの両方を更新したときは、
なにもしません。 (同じ内容の関係から、異なる内容の関係に変わります)(同期済みにはします)
前回の同期で異なる内容になっていたとき、かつ、
ベースを更新したときは(ワークを更新したかどうかに関わらず)、
更新した内容がワークと同じ内容なら
なにもしません。(同期済みにはします)
更新した内容がワークと異なる内容なら
ワークの内容が、ベースの内容+改行+ワークの内容になります。
ワークだけを更新したときは、
なにもしません。(同期済みにはします)
前回の同期後
ベース
ワーク
今回の同期前
今回の同期後
old
old
ワーク
ベース
ワーク
ベース
new
old
new base
old work
old work
old base
new
new
new work
new base
new base
new work
old
old
new base
new base
old work
new base
new work
new base
old work
new work
new base
old base
old work
old work
old work
old work
old work
old base
SyncForTest では、ワークがベースに合わせるように、ワークのみ自動的に変更し、ベースは変更
しません。
old
new
old
new
old
old
old work
old base
old base
old base
old base
old base
new work
old base
old work
old base
old base
new work
←
▼
▲
テスト
(src)
T_SyncFilesX_SyncVersionUp
<?xml version="1.0" encoding="Shift_JIS"?>
<SyncFilesX
xml:space="preserve"
restart_vbs = "${UpdaterRoot}\Updating 1.00 to 2.00.vbs"
clean_root = "${UpdaterRoot}">
<Variable name="${UpdaterRoot}" value="${USERPROFILE}\Desktop\T_SyncVersionUp_Updater"/>
<SynchronizingSet
base_name="アプリ ver1"
work_name="アプリ ver2"
synced_base = "${UpdaterRoot}\1 version 1"
synced_path = "${UpdaterRoot}\2 version 2"
base = "${UpdaterRoot}\3 back up"
path = "${UpdaterRoot}\4 updating">
<Folder path="."/>
<File base="move from.txt" path="move to.txt"/>
<File base="move modified from.txt" path="move modified to.txt"/>
<File base="move modified update from.txt" path="move modified update to.txt"/>
<File base="move update from.txt" path="move update to.txt"/>
<File path="update compatible.txt" same="Compatible"/>
<File path="update compatible modified.txt" same="Compatible"/>
</SynchronizingSet>
</SyncFilesX>
→ 1.00 to 2.00.xml
SyncFilesX をアプリケーションのバージョンアップをするインストーラーとして使うことができます。
ベース=旧版、ワーク=新版、同期済み(Old)=初期設定、同期前(New)=ユーザー設定(バージョン
アップ対象)、として使い、自動的にユーザー設定を更新できないときに、手動で編集できるようにします。
ただし、ユーザーとしては、すべて自動的に更新できることが望まれます。
下記の XML ファイルと、
の UpdateCUI メソッドを使います。
SyncFilesX_Class を使うスクリプトは、下記のテストを参考にしてください。
この XML の中で定義した
は、パスを指定する属性などで使用することが
できます。 具体的には、restart_vbs、clean_root、base_name、work_name、synced_base、synced_path、
base、path。
←
▼
▲
Sub SyncFilesX_Class::LoadRootPaths( SettingFilePath as string, XML_String as string )
SyncFilesX の設定をロードします。
【引数】
SettingFilePath
XML_String
設定ファイルのパス
設定内容(XML形式)
→ SyncFilesMenuLib.vbs
ソース
SettingFilePath 引数は、相対パスの基準として使われます。
←
▼
▲
Sub SyncFilesX_Class::UpdateCUI()
バージョンアップの作業を行うユーザーインターフェースを開きます。
→ SyncFilesMenuLib.vbs
ソース
作業が終わると、本関数から返ります。
←
▼
▲
Dim SyncFilesX_Class::CustomUpdateFunction
as Sub ( CustomUpdateFunctionParameter )
Dim SyncFilesX_Class::CustomUpdateFunctionParameter as Variant
手動で同期する作業が終了した後で実行する関数。
←
▼
▲
CustomRestartCodeForRestartVBS (SyncFilesX_Class)
CustomUpdateCodeForRestartVBS (SyncFilesX_Class)
Dim SyncFilesX_Class::CustomRestartCodeForRestartVBS as string
調整メニューとインストールを再度実行するスクリプトに埋め込むコード。
Dim SyncFilesX_Class::CustomUpdateCodeForRestartVBS as string
←
▼
▲
If IsSynchronizedFilesX( new_FilePathForFileInScript( "SyncFilesX.vbs" ) ) Then
Function IsSynchronizedFilesX( Path as string or FilePathClass ) as boolean
で同期が必要なファイルがすべて同期済みであるかどうかを返します。
【引数】
Path
返り値
関連
テスト
サンプル
ソース
T_SyncFilesX_CommandLine
の設定ファイルへのパス、または、
すべて同期済みであるかどうか
If IsSynchronizedFilesX( "SyncFilesX.xml" ) Then
→ SyncFilesMenuLib.vbs
→ T_SyncFilesX.vbs
←
▼
▲
ModuleAssort
プロジェクトのフォルダーから、各種モジュールのフォルダーへコピーします。
指定したプロジェクトの構成を Projects.xml に記録します。
各種モジュールのマスター フォルダーからコピーして、プロジェクトを復元します。
をスクリプトで実行するときに使うクラス。
ソース
→ SyncFilesMenuLib.vbs
パッチ形式になっているマスター モジュールを完全な形に変換します。
マスター モジュールをパッチ形式に変換します。
内部で
を使っています。
←
▼
▲
'// Set "Me.SynchronizeTargetGraph"
<SynchronizedWith> の出力
ModuleAssortClass::OpenSetting
Me_SetStatusOfSynchronizedWith
'// Set "target.SynchronizedWithArray"
ModuleAssortClass::Assort
(src)
(src)
(src)
ModuleAssortClass::OpenSetting
'// Set "Me.FileMaps" : "ModuleAssort_WorkingClass"
ModuleAssortClass::Assort
'// Copy files to "Reading-" folder
'// ワーキング フォルダーを比較して、同じフォルダーを削除する。
'// ワーキング フォルダーとコミットを比較して、同じフォルダーを削除する。
'// Rename "Reading-" folder to "Work-" folder
'// Save "_Modules.xml" file
Me_AddSynchronizedTag
(src)
BreadthFirstSearch
(src)
→ vbslib Prompt.vbs
ModuleAssort
←
▼
▲
Sub ModuleAssortClass::LoadProjectList( in_ProjectListPath as string )
Projects.xml ファイルをロードします。
【引数】
in_ProjectListPath
Projects.xml ファイルのパス
ソース
→ SyncFilesMenuLib.vbs
←
▼
▲
Sub ModuleAssortClass::CheckOut( in_ProjectName as string, in_RevisionName as string,
in_OutPath as string )
各種モジュール/ターゲット/リビジョン のフォルダーからコピーして、プロジェクトを復元します。
【引数】
in_ProjectName
in_RevisionName
コミットするプロジェクトの名前
コミットするプロジェクトのリビジョン名
in_OutPath
復元するプロジェクトを格納するフォルダーのパス
サンプル
Set sync = new ModuleAssortClass
sync.LoadProjectList "Projects.xml"
sync.CheckOut "Project_X", "01", "C:\TestProject"
ソース
→ SyncFilesMenuLib.vbs
←
▼
▲
Sub ModuleAssortClass::OpenSetting( in_SettingPath as string )
ファイルをロードします。
【引数】
in_SettingPath
ModuleAssort.moas ファイルのパス
ModuleAssort.moas
ソース
→ SyncFilesMenuLib.vbs
←
▼
▲
Sub ModuleAssortClass::Assort()
プロジェクトのフォルダーから、各種モジュール/ターゲット/リビジョン のフォルダーへコピーします。
→ ModuleAssort
参考
サンプル
Set sync = new ModuleAssortClass
sync.OpenSetting "ModuleAssort.moas"
sync.Assort
ソース
→ SyncFilesMenuLib.vbs
←
▼
▲
Sub ModuleAssortClass::Commit( in_ProjectName as string, in_RevisionName as string,
in_Comment as string )
指定したプロジェクトの構成を Projects.xml に記録することで、コミットします。
【引数】
in_ProjectName
in_RevisionName
コミットするプロジェクトの名前
コミットするプロジェクトのリビジョン名
in_Comment
リビジョンに関するコメント
コミットしたプロジェクトのリビジョンは、
できるようになります。
サンプル
Set sync = new ModuleAssortClass
sync.OpenSetting "ModuleAssort.moas"
sync.Commit "Project_X", "01", "コメント"
ModuleAssort.moas ファイル
に指定されていないファイルがあると、コミットしても元のプロジェクトが完全に
取り出せないことがあります。 そのため、コミットした後は、CheckOut して完全に取り出せることをチェック
してください。
ソース
→ SyncFilesMenuLib.vbs
←
▼
▲
Sub ModuleAssortClass::ExpandPatch( in_PatchMasterPath as string )
パッチ形式になっているマスター モジュールを完全な形に変換します。
【引数】
in_PatchMasterPath
パッチ形式になっているマスターフォルダーのパス
ソース
→ SyncFilesMenuLib.vbs
パッチ形式のフォルダーの名前は、ベースのターゲットがパッチと同じなら、
"(リビジョン名)-Patch-of-(ベースのリビジョン名)"、そうでなければ、
"(リビジョン名)-Patch-of-(ベースのターゲット名)-(ベースのリビジョン名)" である必要があります。
完全な形が入ったフォルダーの名前は、"(リビジョン名)-Full" になります。
←
▼
▲
Sub ModuleAssortClass::MakePatch( in_FullSetMasterPath as string, in_BaseMasterPath as string )
マスター モジュールをパッチ形式に変換します。
【引数】
in_FullSetMasterPath
パッチ形式に変換するマスターフォルダーのパス
パッチのベースとするマスターフォルダーのパス
in_BaseMasterPath
ソース
→ SyncFilesMenuLib.vbs
パッチ形式のフォルダーの名前は、ベースのターゲットがパッチと同じなら、
"(リビジョン名)-Patch-of-(ベースのリビジョン名)" になり、そうでなければ、
"(リビジョン名)-Patch-of-(ベースのターゲット名)-(ベースのリビジョン名)" になります。
←
▼
▲
複数のフォルダーにある複数のファイルの差分を調べて、Diff ツールやテキスト・エディターを
開くメニューを表示することで、手動でファイルの内容を同じにする作業を支援します。
.AddRootFolder
Function AddRootFolder( IndexNum, RootFolderPath )
.AddFile
.IsCompareTimeStamp
.IsCompareContents
.Compare
Sub Compare()
Sub AddFile( StepPath )
boolean
boolean
Sub OpenSyncMenu()
→ T_SyncFiles.vbs # main
テスト
→ SyncFilesMenuLib.vbs
.IsSameFolder
Function IsSameFolder( FolderAIndexNum, FolderBIndexNum )
サンプル・コード
Set menu = new SyncFilesMenu
menu.IsCompareTimeStamp = False
menu.Lead = "Comparing Base, Update1 and Update2"
menu.AddRootFolder 0, "Folder0"
menu.AddRootFolder 1, "Folder1"
menu.AddRootFolder 2, "Folder2"
menu.RootFolders(0).Label = "Base"
menu.RootFolders(1).Label = "FolderA"
menu.RootFolders(2).Label = "FolderB"
menu.AddFile "File1.txt"
menu.AddFile "File2.txt"
menu.AddFile "File3.txt"
menu.Compare
menu.OpenSyncMenu
データ構造
SyncFilesRoot<array>
.StepPath
.AbsPath
.Files( Key:StepPath )
SyncFilesFile<dic>
SyncFilesMenu
.RootFolders( Index:Num )
.IsSameBinary[ n ]
string
string
boolean
Comparing Base, Update1 and Update2
1. NotSame.txt : Base≠FolderA, Base≠FolderB, FolderA≠FolderB
2. NotSameNo0.txt : Base に存在しません, FolderA≠FolderB
3. Only0.txt : Base のみに存在します
4. SameAll.txt : 同じ内容
99. 戻る
ファイルの番号を入力してください >1
NotSame.txt
1. Diff ツールを開く
4. Base のファイルを開く
5. FolderA のファイルを開く
6. FolderB のファイルを開く
99. 戻る
操作の番号を入力してください >
サンプル画面
比較するファイルは、AddFile メソッドを使って1つ1つ指定してください。
(src)
(src)
(src)
(src)
(src)
.IsCallViaFile
boolean
CallViaFile を呼ぶメニュー 80 を追加するかどうか
.RootFolders(i).Label
ラベル。 i は、AddFile の FileNum
ファイルが同じかどうかは、ReadFile の返り値が同じかどうかで判定します。
親フォルダーの指定を、サブ・フォルダーに置き換える
関連
ソース
StepPath を配列にすると、それぞれのフォルダーで異なる
相対パスを設定できます。 その配列の要素数は、AddRootFolder
を呼び出した回数に一致させてください。
.AddFileWithLabel
Sub AddFileWithLabel( Label, StepPath )
Label 引数が追加された AddFile。
ファイルを選ぶメニューで、ファイル名の右に表示します。