(for Internet Explorer)
Base
Merged
Right
Left
NewBase
OldWork
NewWork
OldBase
SyncFilesX 内部
Patch&BackUp
OldTarget
NewTarget
Patch
BackUp
ModuleNew
TargetMerged
ModuleSync
TargetSync
path
synced_base
synced_path
base
CrossBefore フォルダーを作成する。
    CrossBefore フォルダーとは、
        Before から全部or一部を移動しただけのファイルが入ったフォルダーです。 内容は変更されていません。
        CrossBefore\1A、CrossBefore\2A は、1A のファイル構成に従います。
        CrossBefore\1B、CrossBefore\2B は、1B のファイル構成に従います。
        Natural Docs のタグが追加されたり、キーワードが修正されたりすることもあります。

    MakeCrossOld.vbs を実行。
        初回は、CrossByTool にできます。 そのコピーが、CrossBefore にできます。
        また、1A, 1B, 2A, 2B を、Before、BeforeNoTag にコピーします。
        SyncFilesX.vbs を CrossBefore にコピーして起動したとき、追加・削除のファイルは無いはずです。

        2回目は、CrossByToolNew にできます。
        diff  "CrossTool\*", "CrossToolNew\*" の差分を
        diff  "CrossTool\*", "CrossToolNew\*", "CrossBefore\*" へ反映させてください。

    diff  "Before\*", "CrossByToolNew\*"
        1A のファイル構成を変えていないときは、"Before\1A", "CrossBefore\1A" に差分は無いはずです。
        1B のファイル構成を変えていないときは、"Before\1B", "CrossBefore\1B" に差分は無いはずです。(後記)
            2回目の  MakeCrossOld.vbs で差分が追加されたときは、1A、1B が Before からコピーされていない
            可能性があります。

        __Moved_Sections.txt でエラーが出たとき(差分が出たとき)は、
            ● Before\*、1A、1B の中に、Natural Docs のタグを追加、または、編集する
            ● MakeCrossOld.vbs に改名を設定
        して、MakeCrossOld.vbs を再実行してください。 (●1A、1B は、未編集なら Before からコピーできます)
        CrossByToolNew\*\__Moved_Sections.txt で、ERROR NotFoundInBefore や ERROR NotRequestedFromNew
        になっているキーワードについては、全文検索して、状況と合うように同様の対処をします。
        たとえば、Function: Foo の場合、Function と Foo の両方が検索のキーになります。
        新規追加されたセクション(NotFoundInBefore エラー)は、もし余分だったら後で同期するときに分かるので、
        クロス処理(ここ)においては無視できますが、前回のファイルに Natural Docs のタグだけがないとき
        (grep で見つかるとき)は対処する必要があります。
        削除されたセクション(NotRequestedFromNew エラー)は、削除が正しいなら無視してよい。

        以上の問題がなくなったら、次へ。

        SyncFilesX.vbs で 1A、1B について、最新のファイル名や内部構成(内容以外)になるように、
        ファイル名を変更したり、テキスト セクションを移動したりします。 Natural Docs のキーワードやコードは
        変更しません。 ファイルのコミットはしません。
        確認したら、CrossBefore、CrossByTool、CrossByToolNew を削除し、一度だけ、MakeCrossOld.vbs を
        再実行します。

    diff  "Before\*", "CrossBefore\*"
        以下は、対処されているはずです。 そうでなければ、diff  "Before\*", "CrossByToolNew\*" へ戻る。
            "Before" にあるファイルの内容がすべて "CrossBefore" にあること。 失っていないこと。
            CrossByToolNew\*\__Moved_Sections.txt にリストアップされている内容が同じであること。
            diff  "Before", "CrossBefore" の右は、1つのセクションだけ CrossBefore からコピーした一時新規ファイル


2A, 2B を削除して代わりに CrossBefore\2A、CrossBefore\2B からコピーする。
    (元の 2A, 2B は、BeforeNoTag にあります)
    1A, 1B は CrossBefore\1A、CrossBefore\1B とすでに同じはずです。
    __Moved_Sections.txt は 2A, 2B に入れません。

● SyncFilesX で同期を実行。
    SyncFilesX を起動、または、再スキャンする。 ただし、起動直後に追加・削除のファイルがないはず。

同期したら、1A, 1B を Masters に入れます。 .moas にSynchronized タグの追加が必要なら追加します。

● CrossBefore\* も Masters に入れます。 * は、1A, 1B, 2A, 2B です。
    CrossBefore と BeforeNoTag に差分がなければ、入れる必要はありません。
    Masters 内のフォルダー名は、同期前のリビジョン番号+_xfor_+今回できた最新のリビジョン番号。 _Tmp は外す。
    *_xfor_* フォルダーは、上記 CrossBefore フォルダーのバックアップです。
    1A の例:02_xfor_03、 1B の例: 01_xfor_03。 すでにあるときは、同じ内容のはずです。
    CrossBefore にできている __Moved_Sections.txt も Masters に入れます。
SyncFilesX
CrossBack
Before
CrossTool
CrossToolNew
現在作業中の SyncFilesX に、<Folder path="."/> がないと、新規または削除が表示されない
ことがあるので注意してください。
1A
1B
2B
2A
… SyncFilsX 開始時の 1A〜2B
… Back からファイルの移動だけ行った結果。 マージ開始時の 1A〜2B
… Back からファイルの移動だけを自動的に行った結果(前回)
… Back からファイルの移動だけを自動的に行った結果(今回)
… 4way マージ
前回同期したときのファイルと新しいファイルの中で、一部のコードが別のファイルに移動していたりしたときは、
その移動だけを行った中間リビジョンを作成しなければ、前回との差分を知ることができません。
中間リビジョンを作成して同期する方法を示します。
環境A, B とも、同期する関数AがファイルAに、同期する関数BがファイルBにあるとき、
環境Aでは関数CがファイルAに、環境Bでは関数CがファイルBに存在すると、同期が
難しくなります。 なぜなら、ファイルの対応関係が1対1ではなくなるからです。 その場合、
ファイルCを新規に作成するなど、ファイルを分けてください。
(関数Cが環境Aで存在し、環境Bで存在しないときは、ファイルの対応関係が1対1になる
ので難しくありません。)
環境A
環境B
ファイルA
ファイルB
関数A
関数C
関数B
関数B
関数C
関数A
ファイルB
ファイルA
環境Aでは関数CがライブラリーAに存在、環境Bでは関数CがライブラリーBに存在する
場合は、管理が難しくなることが予想されます。 ライブラリーCを新規に作成するか、
統合的なライブラリーに含めるとよいでしょう。
ベースとなる環境から、複数のモジュールを追加する場合、SyncFilesX を使うとよいでしょう。
環境Aをアプリケーション環境(統合)、環境Bを個別環境(ベース以外の単体)とすることが
よくあります。 この構造の場合、片方向の参照関係となり、環境Aをリリースするときだけ
SyncFilesX を使って同期を取ればよくなります。
環境A
環境B
ModuleA
ModuleB
ModuleC
ModuleC
両方向の参照関係がある状態でもリリースするときだけ同期を取ればよくするには、
SyncFilesX のメイン・スクリプトを相互に作成します。 更新する環境だけで更新された
内容は、同期する必要はありません。
ModuleB
ModuleC
ModuleA
ModuleC
環境B
環境A
アプリケーション環境(統合)が、ベースとなる環境から、1つのモジュールだけを追加する
場合は、SyncFilesX を使わなくとも、一般的なパッチをあてるだけで構いません。
ベースを更新する場合は、パッチをあてたときにエラーにならないようにパッチを調整します。
追加モジュールを更新する場合は、更新されたパッチをあてます。
ModuleA
ベース
ModuleB
+
パッチ
統合
<File path="Source.c" base="sub\OldSource.c"/>
ただし、ファイルの場所の移動や改名があるときは、一般的なパッチではベースとなるファイル
の内容が更新されたときにモジュールに反映されなくなるので、SyncFilesX も併用すると
よいでしょう。
つまり、パッチからエラーが出なくなった後で、SyncFilesX を使って確認します。
単体テストを実行するスクリプトです。
ダブルクリックすると、
が開きます。
3ウェイ マージ(3方向マージ)をします。
番号またはコマンド >ThreeWayMerge
-------------------------------------------------------------------------------
3ウェイ マージ(3方向マージ)をします。
ベースにするファイル >C:\Base.txt
更新したベースにするファイル(左側) >C:\Left.txt
更新したベースにするファイル(右側) >C:\Right.txt
マージした結果の出力先ファイル(★上書きします) >C:\_Merged.txt

Enter のみ:マージの設定ファイルを使わない。
マージの設定ファイル >
ThreeWayMerge
C:\Base.txt
C:\Left.txt
C:\Right.txt
C:\_Merged.txt
<?xml version="1.0" encoding="Shift_JIS"?>
<ThreeWayMerge>

<ThreeWayMergeSet
    left_name ="左"
    right_name="右"
    base_path ="00_Base"
    left_path ="01_Left"
    right_path="02_Right"
    merged_path="03_Merged">

<Folder  base_path="."  left_path="."  right_path="."  merged_path="."/>

</ThreeWayMergeSet>

<BreakStepNum></BreakStepNum>

<IsAutoMergeEx>True</IsAutoMergeEx>
<IsOutEach>True</IsOutEach>
<SingletonKeywords>Single</SingletonKeywords>
<SingletonKeywords>#include</SingletonKeywords>
<UniqueLineKeywords>Unique</UniqueLineKeywords>

<ReplaceTemplate  before="#Before"  after="#After"/>

<Text id="Before"><![CDATA[
/* Function: ${FunctionName} */
]]></Text>

<Text id="After"><![CDATA[
/* Func: ${FunctionName} */
]]></Text>

</ThreeWayMerge>
サンプル
その他のタグ名は、
関連
(src)
番号またはコマンド >ThreeWayMerge
-------------------------------------------------------------------------------
3ウェイ マージ(3方向マージ)をします。

Setting オプションで、設定ファイルを入力します。 例:/Setting:C:\Merge.xml
ベースにするファイル >/Setting:Files\Merge\MergeSetting.xml
に ThreeWayMergeSet タグがあれば、比較するフォルダーを毎回入力
しなくても済むようになります。
ThreeWayMerge
/Setting:Files\Merge\MergeSetting.xml
ThreeWayMergeSet タグには、比較するフォルダーのパスを指定します。
が使えます。 属性名は、base_path、left_path、right_path、merged_path で
には、自動的にマージした後で置き換えるテキストを設定します。
のメンバー変数名と同じです。(一部除く)
下記のように ThreeWayMergeSet タグを設定をすれば、00_Base フォルダーをベース、
01_Left フォルダーをある人の更新、02_Right フォルダーを別の人の更新、という3つの
フォルダーをマージした 03_Merged フォルダーを作成し、そのマージ結果を確認することが
できます。
を使って、変数を使うこともできます。
それぞれ名前が異なるファイルをマージできます。
のタグも使えます。
ThreeWayMerge_sth
ThreeWayMerge
SyncFilesX_Class::Merge
SyncFilesX_Class::OpenCUI
(src)
(src)
設定ファイルに <ThreeWayMergeSet> があるとき:
それ以外のとき:
CopyFilesToLeafPathDictionary
ThreeWayMerge
(src)
ThreeWayMerge_autoMergeExSub
ThreeWayMerge_replaceByMergeTmplateSub
'// AutoMerge for "bracket_A" set
'// AutoMerge for "bracket_B" set
ReplaceTemplateClass::RunReplace
(上記)
// コンフリクトを自動解決する
関連
更新するパッチをターゲットにあてます
古いパッチを新しいターゲットにあてます
base_path,
left_path,
right_path,
merged_path
は、すべて
同じ値でも
それぞれ
指定が必要
です。
左は旧パッチ、右は新ベース
手動で 3ウェイ マージをします。
XML ファイルを Diff ツールで比較できるように、空白やタブを同じように整形します。
番号またはコマンド >ToRegularXML
-------------------------------------------------------------------------------
整形する XML ファイルのパス >
ToRegularXML
サンプル
<ROOT>

<A/>

</ROOT>
<ROOT>
    <A/>
</ROOT>
参考
→ save (IXMLDOMDocument)
ソース
→ vbslib Prompt.vbs
番号またはコマンド >Translate
英訳します。
翻訳ファイル (*.trans) のパス、または、フォルダーのパス >C:\folder\sample.trans
次のファイルを上書きします。
sample.txt
続行するには Enter キーを押してください . . .
C:\folder\sample.trans
Translate
翻訳ファイルの記述に従って、テキストファイルを、英訳します。
サンプル
→ Samples\Translate フォルダー
関連
すべて英訳されるか調べる
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<BaseFolder>SubFolder</BaseFolder>
<File>sample1.txt</File>
<File>sample2.c</File>
<T><JP>日本語</JP><EN>Japanese</EN></T>
<T><JP>英語</JP><EN>English</EN></T>
</Translate>
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<File>sample.txt</File>
<T><JP>日本語</JP><EN>Japanese</EN></T>
<T><JP>英語</JP>
   <EN>English</EN></T>
</Translate>
サンプル
sample.txt の翻訳前
日本語から英語に変換します。
sample.txt の翻訳後
JapaneseからEnglishに変換します。
JapaneseToEnglish.trans (翻訳ファイル)
スクリプト
Translate  "sample.trans", "JP", "EN"
スクリプト
Translate  "JapaneseToEnglish.trans", "EN", "JP"
英語 から 日本語 へ
sample1.txt の翻訳後
English から Japanese へ
sample1.txt の翻訳前
sample2.c の翻訳前
sample2.c の翻訳後
French から 日本語 へ
French から Japanese へ
File タグに指定したファイルを翻訳します。
File タグは、T タグの後に置くこともできます。
<JP> 〜 </JP> の間と、<EN> 〜 </EN> の間は、複数行にしないでください。
補足
翻訳前の単語が長い単語から置き換えが行われます。 これにより、翻訳ファイルに指定する
順番によって結果が変わる可能性が少なくなります。
BaseFolder は、File タグに指定した相対パス
のベース・フォルダーのパスです。
省略時は、.trans ファイルが入っている
フォルダーのパスになります。
BaseFolder は、
の in_out_Config.BaseFolderPath が指定されると、
無視されます。
→ T_Translate.vbs # [T_Translate1]
テスト
ソース
→ vbslib Prompt.vbs
フォルダー全体に英語以外が無いか調べる
あるファイルに1つでも日本語が残っていると、エラーとなり、残りのファイルは翻訳
しません。 フォルダーの中のすべてのファイルに対して、残っている日本語を
一覧するときは、
をお使いください。
<T><JP>英語</JP>
   <EN>English</EN>
   <Line>16</Line>
   <File>sample.txt</File>
</T>
を通すと、翻訳するファイル名と行番号が追記され、行番号の順番でソートされます。
→ T_Translate.vbs # [T_Translate1]
テスト
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<File>MultiLine.txt</File>

<T><JP  cut_indent="yes"  indent="1*&#9;"><![CDATA[
// メイン
// 関数
]]></JP><EN  cut_indent="yes"  indent="1*&#9;"><![CDATA[
// Main
// Function
]]></EN></T>

<T><JP  cut_indent="yes"  indent="4*&#32;"><![CDATA[
    // サブ
    // 関数
]]></JP><EN  cut_indent="yes"  indent="4*&#32;"><![CDATA[
    // Sub
    // Function
]]></EN></T>

</Translate>
JapaneseToEnglish.trans (翻訳ファイル)
スクリプト
Translate  "JapaneseToEnglish.trans", "EN", "JP"
int  main()
{
    // Main
    // Function
}

int  sub()
{
    // Sub
    // Function
}
MultiLine.txt の翻訳後
int  main()
{
    // メイン
    // 関数
}

int  sub()
{
    // サブ
    // 関数
}
MultiLine.txt の翻訳前
複数行の置き換えをするときは、cut_indent="yes" と、
indent="…" を XML タグに付けてください。
cut_indent 属性により、XML タグの直後の改行と
すべての行のインデントが翻訳テキストの指定から
外れます。 indent 属性により、すべての行のインデ
ントが翻訳テキストの指定に追加されます(置き換わります)。
翻訳するファイルの文字コードセットを指定するときは、File タグの charset 属性に指定します。
<File charset="utf-8">sample.txt</File>
<Translate  skip_not_english_error="yes">
英語以外が残っていてもエラーにしないようにするには、次のようにします。
翻訳前のテキストを単純な単語にしてから、翻訳後のテキストを編集することで、cut_indent や
indent の効果をいろいろ試すことができます。
置き換える対象のテキストの改行コードは、CR+LF に設定してください。
翻訳ファイルの情報に従って、テキストファイルがすべて翻訳できているかどうかチェックします。
参考
番号またはコマンド >TranslateTest
英訳のテストをします。
★翻訳ファイル (*.trans) は上書きされます。
翻訳ファイル (*.trans) のパス、または、フォルダーのパス >C:\folder\sample.trans

Enter のみ : 出力しませんが、翻訳後に日本語が残っていないことをチェックします
出力フォルダーのパス(★上書きされます)>
<WARNING msg="Not English character exists" line_num="3"/>
<WARNING msg="Not English character exists" line_num="4"/>
C:\folder\sample.trans
TranslateTest
を使って、*.trans ファイルの拡張子と関連付けすると、
*.trans ファイルをダブルクリックするだけですべて翻訳できているかどうかのチェックが
できるようになります。
参考
TranslateTest の関数
フォルダー全体に英語以外が無いか調べる
翻訳する関数
翻訳するコマンド、翻訳ファイルの説明
→ vbslib Prompt.vbs
ソース
翻訳ファイルの内容は上書きされるため注意してください。
翻訳するファイル名と行番号が追記され、行番号の順番でソートされます。
*.lines ファイルをダブルクリックしたときに、
が起動するようにします。
関連
→ vbslib Prompt.vbs
ソース
*.lines ファイルをダブルクリックしても、
が起動しないようにします。
→ vbslib Prompt.vbs
ソース
番号またはコマンド >TwoWayMerge
-------------------------------------------------------------------------------
2ウェイ マージ(2方向マージ)をします。
比較するファイル(左側) >C:\Left.txt
比較するファイル(右側) >C:\Right.txt
マージした結果の出力先ファイル(★上書きします) >C:\_Merged.txt
2ウェイ マージ(2方向マージ)をします。
TwoWayMerge
C:\Left.txt
→ vbslib Prompt.vbs
ソース
→ ToolsLib.vbs
C:\Right.txt
C:\_Merged.txt
関連
zip ファイルの中のルートに1つのフォルダーだけがあるときは、そのフォルダー
の中を展開します。
すでに zip ファイルと同じ名前のフォルダーがあったときは、これまであった
フォルダーを *_old に改名し、同じ名前のフォルダーに展開します。
すでに *_old フォルダーもあったときは、*_old2 フォルダーに改名します。
関連
zip 形式の圧縮ファイルを展開します。
→ T_Zip.vbs # [T_unzip_sth]
テスト
番号またはコマンド >unzip
-------------------------------------------------------------
zip ファイルを展開します。
zip ファイルと同じ名前のフォルダーを作成し、その中に展開します。
zip ファイルのパス >C:\sample1.zip
"sample1_old" に改名しました。: "C:\sample1"
展開しました。
zip ファイルと同じ名前のフォルダーができ、その中に展開します。
unzip
C:\sample1.zip
関連
→ ModuleAssort
パッチ(新モジュールのフォルダーと旧モジュールのフォルダー)があるときに、
プロジェクト フォルダーの中にある旧モジュール(の一部を変更したもの)を新モジュール
(の一部を変更したもの)に置き換える、作業フォルダーをデスクトップの _UpdateModule に
作成して、モジュールを更新する作業を 3ウェイ マージを使って支援します。
番号またはコマンド >UpdateModule
-------------------------------------------------------------------------------
プロジェクト フォルダーの中にある、古いリビジョンのモジュールを、新しいリビジョ
ンに置き換えます。 作業フォルダーをデスクトップの _UpdateModule に作成します。

New :新モジュールが入ったフォルダーのパス >C:\patch
Old :旧モジュールが入ったフォルダーのパス >C:\back_up
Target:旧モジュールが入ったプロジェクト フォルダーのパス >C:\Target

Enter のみ:マージの設定ファイルを使わない。
マージの設定ファイル >

同期するファイルの一覧:
  中央の記号の意味: [=]同じ [!]異なる [ ]両方不在
  左右の記号の意味: [*]変更 [+]追加 [-]削除 [.]不変 [ ]不在
  左はベース、右はワーク

-------------------------------------------------------------------------------
前回コミット時のベース: "2B_ModuleSynchronized"
前回コミット時のワーク: "1B_TargetSynchronized"
-------------------------------------------------------------------------------
■ベース(Module): "2A_ModuleNew"
■ワーク(Target): "1A_TargetMerged"
1. .=. Image.bmp
2. *!. Source.c

91. 再スキャンする [Rescan]
92. ルート・フォルダーを開く
99. 終了
番号 >2
-------------------------------------------------------------------------------
ベース:C:\2A_ModuleNew\Source.c"
ワーク:C:\1A_TargetMerged\Source.c"

次のメニューの 1.で開く2つのファイルを手動で同期したら、コミットしてください。
-------------------------------------------------------------------------------
★ベース(Module): Source.c (*変更)
★ワーク(Target): Source.c (.不変)

1. Diff で開く:同期するファイル (*異なる) [ ベース / ワーク ]
2. Diff で開く:前回コミット時の同期内容 (=同じ) [ ベース / ワーク ]
4. Diff で開く:ベース (*変更) [ 前回コミット時 / 現在 ]
5. Diff で開く:ワーク (.不変) [ 前回コミット時 / 現在 ]
44.Diff で開く:[ 前回コミット時のベース / ベース / ワーク ]
55.Diff で開く:[ ベース / ワーク / 前回コミット時のワーク ]
6. ファイルまたはフォルダーを開く
8. 同期をコミットする
9. 戻る
番号 >

同期が完了したら、その内容をプロジェクトに反映させてください。
同期済み:"C:\1A_TargetMerged"
Targetプロジェクト:"C:\Target"
UpdateModule
C:\Target
C:\patch
C:\back_up
参考
→ vbslib Prompt.vbs
ソース
テスト
→ T_ModuleAssort.vbs
T_UpdateModule_sth
プロジェクト フォルダーは、複数のモジュールからなるフォルダーという意味で、特別な構成をした
フォルダーではなく、普通のフォルダーです。 UpdateModule では、置き換える対象となる
モジュールを持っているプロジェクト フォルダーのことをターゲットと呼んでいます。
新旧モジュールからパッチをあてます
3ウェイ マージ
新旧の比較、プロジェクトとモジュールの比較
モジュール/ターゲット/リビジョンに分類
3ウェイ マージの Base, Left, Right は、UpdateModule の 4. Old (2B), 1. New (2A), 5. Target (1B)
です。 3ウェイ マージにおける、それぞれの差分と、上記メニュー(SyncFilesX のメニュー)との
対応は、次の通りです。 なお、可能な限り自動的にマージを行って 2. Merged(1A) を作成して
Menu-2 の差分が Menu-1 の差分と同じ、または、Menu-4 の差分が Menu-5 の差分と同じなら
一般にマージ完了です。 差分が少ないほうのペアで調整するとよいでしょう。
新モジュールが共通の旧モジュールからブランチしたものでも、それをマージするのであれば、
UpdateModule コマンドが使えます。
古いパッチを新しいターゲットにあてることもできますが、新旧の関係とベース/ワークの
関係が逆に表示されます。
「ベース」と表示されているものは、モジュール単体です。
「ワーク」と表示されているものは、ターゲット プロジェクトです。
「6. ファイルまたはフォルダーを開く」 で選ぶファイルの意味は、次のとおりです。
表示
UpdateModule コマンドでの意味
1. ベース
2. ワーク
4. 前回コミット時のベース
5. 前回コミット時のワーク
新モジュール単体 [New, 2A]
ターゲット(マージ後) [Merged, 1A]
コミット前は、旧モジュール単体 [Old, 2B]
コミット後は、新モジュール単体
コミット前は、ターゲット(マージ前) [Target, 1B]
コミット後は、ターゲット(マージ後)
いますが、2. Merged(1A) に
のコンフリクトのタグが付くこともあります。
4. Old (2B)
5. Target (1B)
1. New (2A)
2. Merged(1A)
Menu-1
Menu-4
Menu-5
Menu-2
4_Old (2B)
5_Target (1B)
1_New (2A)
2_Merged(1A)
Menu-1
Menu-4
Menu-5
Menu-2