(for Internet Explorer)
← ▼ ▲
↑
FourWayMerge
未対応
→ version control - Git 4-way merge - Stack Overflow (Web)
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 の２つのほぼ同じテキストがあるとき、双方での編集をもう片方に反映させる
マージです。 4-way merge は、一般的に使われている用語ではありません。
← ▼ ▲
同期 （ファイル）
→ SyncFilesX_Class (SyncFilesX コマンドのクラス)
→ IsSynchronizedFilesX
→ SyncFilesMenu
ここでの同期とは、コピーして２つになったファイルの片方が変更されたとき、もう片方に反映することです。
２つのファイルの差分が少ししかないときに、片方のファイルが変更されたとき、もう片方に反映することも
含みます。
→ PatchAndBackUpDictionaryClass
→ ModuleAssortClass (ModuleAssort コマンドのクラス)
← ▼ ▲
SyncFilesX_Class (SyncFilesX ソース)
SyncFilesX
をスクリプトで実行するときに使うクラス。
内部データ構造
ArrayClass< SyncFilesX_SetClass >
ArrayClass< SyncFilesX_FileClass >
.Files
.Sets
SyncFilesX_Class
.BaseStepPath
.WorkStepPath
string
string
(src)
(src)
(src)
コールツリー
SyncFilesX_Class::OpenFileCUI
SyncFilesX_Class::OpenCUI
SyncFilesX_Class::LoadScanListUpAll
SyncFilesX_App
(src)
(src)
// セットとファイルを選択
(src)
(src)
→ SyncFilesMenuLib.vbs
ソース
テスト
→ T_SyncFilesX フォルダー
→ SyncFilesX を使うツールをテストするには (SyncForTest)
関連
.IsNextAutoCommit
boolean
.IsNextAutoMergeFromBase
boolean
SyncFilesX_Class::LoadScanListUp_Sub
// 比較リストの作成
SyncFilesX_Class::Merge を呼び出すと、SyncFilesX は、マージ モード（Me.IsMerged
= True）になります。
このモードでは、SyncFilesX_FileClass などのメンバー変数は、以下のリンク先のような
意味に変わります。
→ SyncFilesX を内部で使うツールとの比較
マージ モード
← ▼ ▲
LoadScanListUpAll (SyncFilesX_Class)
Sub SyncFilesX_Class::LoadScanListUpAll( SettingFilePath as string, XML_String as string )
SyncFilesX の設定をロードして、同期の状況を調べます。
【引数】
SettingFilePath
XML_String
設定ファイルのパス
設定内容（XML形式）
→ SyncFilesMenuLib.vbs
ソース
SettingFilePath 引数は、相対パスの基準として使われます。
<< SyncFilesX_Class
← ▼ ▲
GetWritableFolders (SyncFilesX_Class)
Function SyncFilesX_Class::GetWritableFolders() as array of string
SyncFilesX を使う際に必要となる書き込み許可するパスの配列を返します。
【引数】
返り値
書き込み許可するパスの配列
→ SyncFilesMenuLib.vbs
ソース
<< SyncFilesX_Class
LoadScanListUpAll
でロードした設定の内容によって返り値は変わります。
← ▼ ▲
Merge (SyncFilesX_Class)
Sub SyncFilesX_Class::Merge( in_MergeOption as ThreeWayMergeOptionClass )
3way マージを行います。
【引数】
in_MergeOption
→ ThreeWayMergeOptionClass
フォルダーの 3ウェイ マージ
をする ThreeWayMergeSet タグがあるときに呼び出すことができます。
→ マージ モード (SyncFilesX_Class)
参考
← ▼ ▲
GetIsAllSynchronized (SyncFilesX_Class)
<< SyncFilesX_Class
Function SyncFilesX_Class::GetIsAllSynchronized() as boolean
全てのファイルが同期済みかどうかを返します。
→ SyncFilesMenuLib.vbs
ソース
ファイルが追加された場合は、同期済みではないと判定します。
← ▼ ▲
GetIsAllBaseSynchronized (SyncFilesX_Class)
<< SyncFilesX_Class
Function SyncFilesX_Class::GetIsAllBaseSynchronized() as boolean
全てのベースのファイルが同期済みかどうかを返します。
→ SyncFilesMenuLib.vbs
ソース
ワークのファイルが同期済みかどうかには影響しません。
← ▼ ▲
GetCountOfNotSynchronized (SyncFilesX_Class)
<< SyncFilesX_Class
Function SyncFilesX_Class::GetCountOfNotSynchronized() as integer
全てのファイルが同期済みではないセットの数を返します。
→ SyncFilesMenuLib.vbs
ソース
← ▼ ▲
OpenCUI (SyncFilesX_Class)
Function SyncFilesX_Class::OpenCUI() as array of string
同期をとる作業を行うユーザーインターフェースを開きます。
【引数】
返り値
"Exit" または "Rescan"
→ SyncFilesMenuLib.vbs
ソース
<< SyncFilesX_Class
作業が終わると、本関数から返ります。
← ▼ ▲
SyncFilesX を使うツールをテストするには (SyncForTest)
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
← ▼ ▲
バージョンアップ インストーラーとしての SyncFilesX
テスト
(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 ファイルと、
SyncFilesX_Class
の UpdateCUI メソッドを使います。
SyncFilesX_Class を使うスクリプトは、下記のテストを参考にしてください。
<< SyncFilesX_Class
この XML の中で定義した
<Variable> タグによる変数
は、パスを指定する属性などで使用することが
できます。 具体的には、restart_vbs、clean_root、base_name、work_name、synced_base、synced_path、
base、path。
← ▼ ▲
LoadRootPaths (SyncFilesX_Class)
Sub SyncFilesX_Class::LoadRootPaths( SettingFilePath as string, XML_String as string )
SyncFilesX の設定をロードします。
【引数】
SettingFilePath
XML_String
設定ファイルのパス
設定内容（XML形式）
→ SyncFilesMenuLib.vbs
ソース
SettingFilePath 引数は、相対パスの基準として使われます。
<< SyncFilesX_Class
← ▼ ▲
UpdateCUI (SyncFilesX_Class)
Sub SyncFilesX_Class::UpdateCUI()
バージョンアップの作業を行うユーザーインターフェースを開きます。
→ SyncFilesMenuLib.vbs
ソース
作業が終わると、本関数から返ります。
<< バージョンアップ インストーラー
← ▼ ▲
CustomUpdateFunction (SyncFilesX_Class)
CustomUpdateFunctionParameter (SyncFilesX_Class)
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
← ▼ ▲
IsSynchronizedFilesX
If IsSynchronizedFilesX( new_FilePathForFileInScript( "SyncFilesX.vbs" ) ) Then
Function IsSynchronizedFilesX( Path as string or FilePathClass ) as boolean
で同期が必要なファイルがすべて同期済みであるかどうかを返します。
【引数】
Path
返り値
関連
テスト
サンプル
ソース
T_SyncFilesX_CommandLine
SyncFilesX
の設定ファイルへのパス、または、
FilePathClass
すべて同期済みであるかどうか
If IsSynchronizedFilesX( "SyncFilesX.xml" ) Then
→ SyncFilesMenuLib.vbs
→ T_SyncFilesX.vbs
→ SyncFilesX
SyncFilesX
← ▼ ▲
ModuleAssortClass
ModuleAssort
→ Assort
→ Commit
→ CheckOut
プロジェクトのフォルダーから、各種モジュールのフォルダーへコピーします。
指定したプロジェクトの構成を Projects.xml に記録します。
各種モジュールのマスター フォルダーからコピーして、プロジェクトを復元します。
をスクリプトで実行するときに使うクラス。
ソース
→ SyncFilesMenuLib.vbs
→ MakePatch
→ ExpandPatch
パッチ形式になっているマスター モジュールを完全な形に変換します。
マスター モジュールをパッチ形式に変換します。
→ コールツリー
内部で
を使っています。
g_FileHashCache
← ▼ ▲
コールツリー
'// 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
← ▼ ▲
LoadProjectList (ModuleAssortClass)
Sub ModuleAssortClass::LoadProjectList( in_ProjectListPath as string )
Projects.xml ファイルをロードします。
【引数】
in_ProjectListPath
Projects.xml ファイルのパス
<< ModuleAssortClass
ソース
→ SyncFilesMenuLib.vbs
← ▼ ▲
CheckOut (ModuleAssortClass)
<< ModuleAssortClass
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
← ▼ ▲
OpenSetting (ModuleAssortClass)
Sub ModuleAssortClass::OpenSetting( in_SettingPath as string )
ファイルをロードします。
【引数】
in_SettingPath
ModuleAssort.moas ファイルのパス
ModuleAssort.moas
<< ModuleAssortClass
ソース
→ SyncFilesMenuLib.vbs
← ▼ ▲
Assort (ModuleAssortClass)
Sub ModuleAssortClass::Assort()
プロジェクトのフォルダーから、各種モジュール/ターゲット/リビジョン のフォルダーへコピーします。
<< ModuleAssortClass
→ ModuleAssort
参考
サンプル
Set sync = new ModuleAssortClass
sync.OpenSetting "ModuleAssort.moas"
sync.Assort
ソース
→ SyncFilesMenuLib.vbs
← ▼ ▲
Commit (ModuleAssortClass)
Sub ModuleAssortClass::Commit( in_ProjectName as string, in_RevisionName as string,
in_Comment as string )
指定したプロジェクトの構成を Projects.xml に記録することで、コミットします。
【引数】
in_ProjectName
in_RevisionName
コミットするプロジェクトの名前
コミットするプロジェクトのリビジョン名
in_Comment
リビジョンに関するコメント
コミットしたプロジェクトのリビジョンは、
CheckOut
できるようになります。
サンプル
Set sync = new ModuleAssortClass
sync.OpenSetting "ModuleAssort.moas"
sync.Commit "Project_X", "01", "コメント"
ModuleAssort.moas ファイル
に指定されていないファイルがあると、コミットしても元のプロジェクトが完全に
取り出せないことがあります。 そのため、コミットした後は、CheckOut して完全に取り出せることをチェック
してください。
<< ModuleAssortClass
ソース
→ SyncFilesMenuLib.vbs
← ▼ ▲
ExpandPatch (ModuleAssortClass)
Sub ModuleAssortClass::ExpandPatch( in_PatchMasterPath as string )
パッチ形式になっているマスター モジュールを完全な形に変換します。
【引数】
in_PatchMasterPath
パッチ形式になっているマスターフォルダーのパス
<< ModuleAssortClass
ソース
→ SyncFilesMenuLib.vbs
パッチ形式のフォルダーの名前は、ベースのターゲットがパッチと同じなら、
"（リビジョン名）-Patch-of-（ベースのリビジョン名）"、そうでなければ、
"（リビジョン名）-Patch-of-（ベースのターゲット名）-（ベースのリビジョン名）" である必要があります。
完全な形が入ったフォルダーの名前は、"（リビジョン名）-Full" になります。
← ▼ ▲
MakePatch (ModuleAssortClass)
<< ModuleAssortClass
Sub ModuleAssortClass::MakePatch( in_FullSetMasterPath as string, in_BaseMasterPath as string )
マスター モジュールをパッチ形式に変換します。
【引数】
in_FullSetMasterPath
パッチ形式に変換するマスターフォルダーのパス
パッチのベースとするマスターフォルダーのパス
in_BaseMasterPath
ソース
→ SyncFilesMenuLib.vbs
パッチ形式のフォルダーの名前は、ベースのターゲットがパッチと同じなら、
"（リビジョン名）-Patch-of-（ベースのリビジョン名）" になり、そうでなければ、
"（リビジョン名）-Patch-of-（ベースのターゲット名）-（ベースのリビジョン名）" になります。
← ▼ ▲
SyncFilesMenu
複数のフォルダーにある複数のファイルの差分を調べて、Diff ツールやテキスト・エディターを
開くメニューを表示することで、手動でファイルの内容を同じにする作業を支援します。
.AddRootFolder
Function AddRootFolder( IndexNum, RootFolderPath )
.AddFile
.IsCompareTimeStamp
.IsCompareContents
.Compare
Sub Compare()
Sub AddFile( StepPath )
boolean
boolean
Sub OpenSyncMenu()
.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 メソッドを使って１つ１つ指定してください。
(src)
(src)
(src)
(src)
(src)
.IsCallViaFile
boolean
CallViaFile を呼ぶメニュー 80 を追加するかどうか
.RootFolders(i).Label
ラベル。 i は、AddFile の FileNum
ファイルが同じかどうかは、ReadFile の返り値が同じかどうかで判定します。
.SetParentFolderProxyName
親フォルダーの指定を、サブ・フォルダーに置き換える
関連
→ SyncFilesX
ソース
StepPath を配列にすると、それぞれのフォルダーで異なる
相対パスを設定できます。 その配列の要素数は、AddRootFolder
を呼び出した回数に一致させてください。
.AddFileWithLabel
Sub AddFileWithLabel( Label, StepPath )
Label 引数が追加された AddFile。
ファイルを選ぶメニューで、ファイル名の右に表示します。
←
↓