(for Internet Explorer)
← ▼ ▲
↑
ThreeWayMerge は、
ThreeWayMerge の拡張自動マージ
Add : 追加したケース
Both
<<<<<<< Base.txt
=======
Both
>>>>>>> Right.txt
→ diff3 の詳細なサンプル
参考
diff3 -A の出力
自動マージ後
Left と Right の両方で同じ内容を追加したものは、
そのまま残す。
同じ内容であるということは、チェック済みの可能性が高い。
<<<<<<< Left.txt
LLL
||||||| Base.txt
=======
RRR
>>>>>>> Right.txt
LLL
RRR
Left と Right の両方で異なる内容を追加したものは、
それぞれを残す。
それぞれが別の目的で追加した可能性が高い。
Both
LLL
Both
RRR
<<<<<<< Left.txt
Both
LLL
||||||| Base.txt
=======
Both
RRR
>>>>>>> Right.txt
Left と Right の両方で異なる内容を追加したものは、
それぞれを残す。
それぞれが別の目的で追加した可能性が高い。
同じ内容がある部分は、初期化関数など、それぞれで必要な
ケースがある。
Both
Modify : 変更したケース
自動マージ後
diff3 -A の出力
<<<<<<< Base.txt
Before
=======
Both
>>>>>>> Right.txt
Left と Right の両方で同じ内容に変更したものは、
そのまま残す。
同じ内容であるということは、チェック済みの可能性が高い。
<<<<<<< Left.txt
Both
LLL
||||||| Base.txt
Before1
Before2
=======
Both
RRR
>>>>>>> Right.txt
（コンフリクト エラー、カッコ付きのまま残す）
Left と Right の両方で異なる内容に変更したものは、
コンフリクト エラーにする。 （手動で直す）
部分的に同じでも、変更した内容が誤っている可能性が高い。
Delete : 削除したケース
diff3 -A の出力
自動マージ後
<<<<<<< Base.txt
Both
=======
>>>>>>> Right.txt
（無くす）
同じ個所を削除したものは、
そのまま削除する。
同じ箇所の削除であるということは、チェック済みの可能性が高い。
<<<<<<< Left.txt
||||||| Base.txt
Both
LLL
=======
LLL
>>>>>>> Right.txt
（コンフリクト エラー、カッコ付きのまま残す）
異なる範囲を削除したものは、
コンフリクト エラーにする。 （手動で直すか、特定の内容で置き換える）
削除した範囲が誤っている可能性が高い。
<<<<<<< Left.txt
UniqueLineKeyword A
||||||| Base.txt
=======
UniqueLineKeyword A
UniqueLineKeyword B
>>>>>>> Right.txt
UniqueLineKeyword A
UniqueLineKeyword B
Left と Right の両方で異なる内容を追加したものは、
２つ目以降の同じ内容の行を追加しない。
例： #include
ただし、差分があった前後にもユニーク ライン キーワードがあり、
それらの行に、追加した内容と同じ内容の行があれば、一切追加しない。
<<<<<<< Left.txt
LLL
||||||| Base.txt
Before
=======
RRR
>>>>>>> Right.txt
Left と Right の両方で異なる内容に変更したものは、
コンフリクト エラーにする。 （手動で直すか、特定の内容で置き換える）
変更した内容が誤っている可能性が高い。
（コンフリクト エラー、カッコ付きのまま残す）
<<<<<<< Left.txt
SingletonKeyword L
||||||| Base.txt
SingletonKeyword B
=======
SingletonKeyword R
>>>>>>> Right.txt
（要設定）がある内容を、
SingletonKeyword R
Left と Right の両方で異なる内容に変更したものは、
右を残す。
ただし、マージ後に統合した内容に変えたほうが良い。
パッチをあてたほう（右）が特徴を表しているため。
例： プロジェクト名など、１つしか設定できない設定
シングルトン キーワード
ユニーク ライン キーワード
（要設定）がある内容を、
ユニーク ライン キーワード
シングルトン キーワード
や
などを設定すると、より多くの
ケースで自動的にマージを行うことができます。
<< ThreeWayMerge
ThreeWayMergeOptionClass
::IsAutoMergeEx = False の場合は、diff3 -E と同じ
マージを行います。 True に設定した場合は、内部で diff3 -A を使って詳細な差分を調べ、より多くのケースで
自動的にマージを行い、コンフリクトするケースを減らします。
→ ThreeWayMergeOptionClass
::UniqueLineKeywords
::SingletonKeywords
→ ThreeWayMergeOptionClass
設定
設定
Diffutils の diff3
行うようにすることができます。
がコンフリクトとするケースでも、その一部のケースで、自動的にマージを
→ マージ設定ファイル
ReplaceTemplate.xml
や
← ▼ ▲
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
←
↓