7

Mercurial (特に Windows では TortoiseHg) を使用して、VBA コードのバージョン管理を行っています。これを試したことのある人なら誰でも、プロジェクト内のどこかでその変数の宣言が変更されるたびに (スコープに関係なく)、VBA がプロジェクト全体のすべての変数の大文字と小文字を変更することを知っています。バージョン管理が悪夢になります。

diff を実行するときに、ソース コードの大文字と小文字の変更を無視したいと思います。これを行う最も簡単な方法は何ですか? (欠落している diff のオプション、外部の diff ユーティリティ、その他の何か?)

注: 「大文字と小文字を区別しないファイル名」の処理について話しているのではありません (はい、Google と話しているのです...)

4

3 に答える 3

7

ExtDiff Extensionを使用して、画面上での消費を比較するときに、これを行うことができます。

  [extensions]
  hgext.extdiff =

  [extdiff]
  # add new command that runs GNU diff(1) in case-insensitive mode
  cmd.mydiff = diff
  opts.mydiff = -i

hg mydiff次に、コマンド ラインから実行します。もちろん、それにはgnuのものであろうと他のものであろうと、差分バイナリがインストールされている必要があります。

ただし、内部的にはもちろん、Mercurial は大文字と小文字の区別を無視できないため、これはあまり役に立ちません。ファイル コンテンツの暗号化ハッシュを取得しており、それらはゆらぎの余地がありません。したがって、この設定を行うhg mydiffと、変更は見られませんが、実行するhg commitとあらゆる場所で変更が見られます。

したがって、これを画面上で機能させることはできますが、基本的にはできません。

indent1 つのオプションは、C ライクな言語と同様に、変数の大文字と小文字を正規化し、me​​rcurial コミット フックで実行するビジュアル ベーシック コード クリーナーを見つけることです。そうすれば、少なくともソース管理に入るすべてのコードが一貫し、リビジョン間で正確に差分をとることができます。

于 2010-03-05T22:50:46.727 に答える
2

これが私が解決した解決策です。理想とはほど遠いですが、私が検討した他の選択肢よりも優れています。

次のことを行う Autohotkey スクリプトを作成しました。

  • 変更が検出されたリポジトリ内の MS Access ファイルを元に戻します (.orig ファイルに)
  • .orig ファイル (変更のあるファイル) を読み込みます
  • 既存のファイル (リポジトリに既に存在するファイル) を読み込みます
  • 両方のファイルのテキストを小文字に変換します
  • ファイルの小文字の内容を比較します
  • ファイルが依然として異なる場合は、.orig ファイルが復元されるため、リポジトリにコミットできます。
  • ファイルが同じ場合 (つまり、大文字と小文字のみが異なります。.orig ファイルは削除されます。これらの変更は気にしないためです)。

私たちが関心を持っている実際の変更を含むファイルについては、大文字と小文字の変更も行われています。その結果、多くのノイズが発生する場合は、大文字と小文字を区別しない比較が可能な比較ツール (kdiff など) でファイルを開きます。

これは完全な解決策ではありませんが、私にとってはフラストレーションの約 90% が解消されます。

これが私のスクリプトです。このスクリプトには、別の Autohotkey スクリプト ConsoleApp.ahk が含まれていることに注意してくださいConsoleApp_RunWait()。これは、64 ビット AHK ではうまく機能しなくなったサードパーティのスクリプトであるため、回答には含めません。コマンドラインを実行し、出力を文字列として返す AHK 関数で十分です。

; This script checks an MS Access source directory and reverts all files whose only modifications are to the 
; case of the characters within the file.

#Include %A_ScriptDir%\ConsoleApp.ahk
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; Allow for custom path to hg (support for moving to TortoiseHg 2.0)
IniRead hg, %A_ScriptDir%\LocalSettings\Settings.cfg, TortoiseHg, hg_path, hg

if 0 < 1  ; The left side of a non-expression if-statement is always the name of a variable.
{
    MsgBox Usage:`n`HgIgnoreCase DirectoryWithFilesToScrub
    ExitApp
}

SrcDir = %1%
StringReplace SrcDir, SrcDir, ", , All

StringRight test, SrcDir, 1 ; add trailing slash if necessary
ifnotequal test, \
    SrcDir = %SrcDir%\

RestoreOriginals(SrcDir)
RevertCaseChangeModifiedFiles(SrcDir)

RevertCaseChangeModifiedFiles(SrcDir) {
global hg
    includes =  -I "*.form" -I "*.bas" -I "*.report" -I "*.table"
    cmdline = %hg% revert --all %includes%

    ;Don't revert items that have been removed completely
    Loop 3
    {
        Result := ConsoleApp_RunWait(hg . " status -nrd " . includes, SrcDir)
        If (Result)
            Break
    }
    Loop parse, Result, `n, `r
    {
        if (A_LoopField)
            cmdline = %cmdline% -X "%A_LoopField%"
    }
    Result =
    ;msgbox %cmdline%
    ;revert all modified forms, reports, and code modules
    Loop 3
    {

        Result := ConsoleApp_RunWait(cmdline, SrcDir)
        If (Result)
            Break
    }
    ;MsgBox %Result%

    Loop parse, Result, `n, `r
    {
        StringLeft FileStatus, A_LoopField, 9
        If (FileStatus = "reverting")
        {
            StringMid FName, A_LoopField, 11
            FullPath = %SrcDir%%FName%
            ToolTip Checking %FullPath%
            RestoreIfNotEqual(FullPath, FullPath . ".orig")
        }
    }
    ToolTip
}

RestoreIfNotEqual(FName, FNameOrig) {
    FileRead File1, %FName%
    FileRead File2, %FNameOrig%

    StringLower File1, File1
    StringLower File2, File2
    ;MsgBox %FName%`n%FNameOrig%
    If (File1 = File2)
        FileDelete %FNameOrig%
    Else
        FileMove %FNameOrig%, %FName%, 1
}

RestoreOriginals(SrcDir) {
    Loop %SrcDir%*.orig
    {
        ;MsgBox %A_LoopFileLongPath%`n%NewName%
        NewName := SubStr(A_LoopFileLongPath, 1, -5)
        FileMove %A_LoopFileLongPath%, %NewName%, 1
    }
    while FileExist(SrcDir . "*.orig")
        Sleep 10
}
于 2015-10-13T14:57:12.257 に答える
2

たとえば、コードをすべて小文字にしても問題ない場合は、これにエンコード/デコード フックを使用できます。次のように機能します。

[encode]
*.vba = tr A-Z a-z

これにより、コミットを行うたびにファイルの内容が小文字でエンコードされます。差分は、ファイルのエンコードされた (リポジトリ) バージョンに基づいて計算されます。

を含むファイルを検討してください

hello

作業コピーでそれを変更します

Hello World

の差分を与える

% hg diff
diff --git a/a.txt b/a.txt
--- a/a.txt
+++ b/a.txt
@@ -1,1 +1,1 @@
-hello
+hello world

大文字の「H」と「W」が無視されていることに注意してください。

私は VBA コードについて何も知らないので、この解決策がうまくいくとは限りません。しかし、それが出発点になることを願っています。

1 つの欠点は、すべてのリポジトリに対してこのエンコード ルールを設定する必要があることです。ここではreposettings拡張機能が役立ちます。

于 2010-03-06T22:15:49.820 に答える