2010-03-05 18 views
7

Tôi đang sử dụng Mercurial (đặc biệt là TortoiseHg trên Windows) để thực hiện kiểm soát phiên bản mã VBA. Bất kỳ ai đã thử điều này biết rằng VBA thay đổi trường hợp của mọi biến trong suốt một dự án bất cứ khi nào bất kỳ tuyên bố nào của biến đó được thay đổi ở bất kỳ đâu trong dự án (bất kể phạm vi). Nó làm cho phiên bản kiểm soát một cơn ác mộng.Khác biệt về phân biệt chữ hoa chữ thường trong Mercurial

Tôi muốn bỏ qua các thay đổi về trường hợp trong mã nguồn của tôi khi thực hiện các khác biệt. cách dễ nhất để làm điều này là gì? (một số tùy chọn cho diff mà tôi đang thiếu, một tiện ích khác bên ngoài, cái gì khác?)

LƯU Ý: Tôi không nói về việc xử lý 'tên tập tin phân biệt chữ hoa chữ thường' (vâng, tôi đang nói chuyện với bạn Google. ..)

+0

Chúng tôi gặp lại bạn của mình! Bạn đã bao giờ tìm thấy một giải pháp, hoặc có lẽ một VCS có thể làm các trường hợp không phân biệt chữ hoa chữ thường? – RubberDuck

+1

@RubberDuck: Bạn đã truyền cảm hứng cho tôi để cuối cùng đăng cách tiếp cận mà tôi đã sử dụng trong vài năm qua. Tôi đã không giải quyết được vấn đề hoàn toàn, nhưng tôi đã loại bỏ phần lớn nỗi đau. Về cơ bản, tôi bỏ qua các tập tin mà những thay đổi duy nhất là để vỏ. Nếu tệp có các thay đổi hợp pháp, tôi vẫn bị kẹt khi thấy các thay đổi của trường hợp, nhưng nó (rất nhiều) tốt hơn là không có gì. – mwolfe02

Trả lời

7

Bạn có thể làm điều đó khi phân biệt mức tiêu thụ trên màn hình bằng cách sử dụng ExtDiff Extension.

[extensions] 
    hgext.extdiff = 

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

Sau đó, bạn sẽ chạy hg mydiff từ dòng lệnh. Điều đó, tất nhiên, yêu cầu bạn có một nhị phân khác được cài đặt có thể là của gnu hoặc khác. Tuy nhiên, điều đó sẽ không hữu ích như bạn có thể thích bởi vì nội bộ, tất nhiên, Mercurial không thể bỏ qua trường hợp - nó lấy hàm băm mật mã của nội dung tập tin, và chúng không cho phép dùng phòng lung . Vì vậy, nếu bạn thiết lập thiết lập này, bạn sẽ thực hiện hg mydiff và không thấy thay đổi, sau đó thực hiện hg commit và xem các thay đổi trên toàn bộ địa điểm.

Vì vậy, bạn có thể thực hiện công việc này trên màn hình, nhưng về cơ bản không.

Một tùy chọn sẽ là tìm một trình dọn dẹp mã cơ bản trực quan, tương tự như indent cho các ngôn ngữ giống như C, giúp bình thường hóa trường hợp biến và chạy trong móc cam kết. Sau đó, ít nhất tất cả các mã đi vào kiểm soát nguồn sẽ được nhất quán và bạn có thể khác nhau trên các phiên bản chính xác.

+0

Âm thanh như một số loại trình dọn dẹp mã sẽ là lựa chọn duy nhất của tôi. Cảm ơn bạn đã giúp đỡ. – mwolfe02

2

Nếu bạn đồng ý với mã của mình trong tất cả các trường hợp thấp hơn, giả sử bạn có thể sử dụng số encode/decode hooks cho việc này. Nó sẽ làm việc như thế này:

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

này sẽ mã hóa nội dung tập tin trong trường hợp thấp hơn bất cứ khi nào bạn một cam kết. Các khác biệt cũng được tính toán dựa trên phiên bản được mã hóa (kho lưu trữ) của các tệp.

Xem xét một tập tin có chứa

hello 

Thay đổi nó trong bản sao làm việc của bạn để

Hello World 

sẽ cung cấp cho một diff của

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

Chú ý cách thủ đô "H" và "W" đã bị bỏ qua.

Tôi thực sự không biết gì về mã VBA, vì vậy tôi không chắc chắn 100% giải pháp này phù hợp với bạn. Nhưng tôi hy vọng nó có thể là một điểm khởi đầu.

Một hạn chế là bạn cần phải đặt quy tắc mã hóa này cho tất cả các kho lưu trữ của mình. Tiện ích mở rộng reposettings có thể giúp bạn tại đây.

+0

Điều đó sẽ không thực sự hiệu quả với tôi trong trường hợp này, nhưng đó là một mẹo tuyệt vời mà tôi sẽ cố nhớ cho tương lai. Cảm ơn đã giúp đỡ. – mwolfe02

2

Đây là giải pháp tôi đã giải quyết. Nó là xa lý tưởng, nhưng tốt hơn so với các lựa chọn thay thế khác tôi đã xem xét.

Tôi tạo ra một kịch bản Autohotkey nào sau đây:

  • trở lại trạng file MS Access trong một kho lưu trữ với những thay đổi phát hiện (để .orig files)
  • đọc trong file .orig (một với thay đổi)
  • đọc trong file hiện có (đã có trong kho)
  • chuyển đổi nội dung của cả tập tin để giảm trường hợp
  • so sánh nội dung chữ thường của các tập tin
  • nếu các tệp vẫn khác nhau, tệp .orig được khôi phục để có thể được cam kết lưu trữ
  • nếu các tệp này giống nhau (nghĩa là chúng chỉ khác nhau trong trường hợp tệp .orig bị xóa vì chúng tôi không 't quan tâm đến những thay đổi đó)

Đối với các tệp có thay đổi thực tế mà chúng tôi quan tâm, tôi vẫn thấy các thay đổi về trường hợp được thực hiện. Nếu điều đó dẫn đến nhiều tiếng ồn, tôi mở tệp trong công cụ so sánh cho phép so sánh phân biệt chữ hoa chữ thường (ví dụ: kdiff).

Nó không phải là một giải pháp hoàn hảo, nhưng nó loại bỏ khoảng 90% sự thất vọng đối với tôi.

Đây là tập lệnh của tôi. Lưu ý rằng tập lệnh bao gồm một tập lệnh Autohotkey khác, ConsoleApp.ahk, cung cấp chức năng có tên là ConsoleApp_RunWait(). Đây là một tập lệnh của bên thứ 3 không còn hoạt động tốt với AHK 64 bit nữa, vì vậy tôi không bao gồm nó như là một phần của câu trả lời của tôi. Bất kỳ hàm AHK nào thực hiện một dòng lệnh và trả về kết quả đầu ra dưới dạng một chuỗi sẽ đủ.

; 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 
} 
+0

Cảm ơn bạn đã xác nhận rằng đây là phương pháp hữu ích. Tôi đã nghĩ về một cái gì đó tương tự. – RubberDuck

Các vấn đề liên quan