7
votes

Diffs de cas insensible au Mercurial

J'utilise mercurial (spécifiquement tortoisehg sous Windows) pour faire le contrôle de la version du code VBA. Toute personne qui a essayé ceci sait que VBA change le cas de chaque variable dans un projet chaque fois qu'une déclaration de cette variable est modifiée n'importe où dans le projet (quelle que soit la portée). Il fait que la version contrôle un cauchemar.

Je voudrais ignorer les changements de cas dans mon code source lors de la réalisation de diffs . Quelle est la manière la plus simple de faire ça? (une certaine option pour DIFF qui me manque, une utilité diffère diff, autre chose?)

Remarque: Je ne parle pas de traiter des "noms de fichiers insensibles de casse" (oui, je vous parle de google ...)


2 commentaires

Nous nous retrouvons à nouveau mon ami! Avez-vous déjà trouvé une solution ou peut-être un VCS qui peut faire des différences insensibles?


@Rubberduck: Vous m'avez inspiré de publier enfin l'approche que j'utilise depuis plusieurs années. Je n'ai pas résolu le problème complètement, mais j'ai dépouillé une grande douleur. Fondamentalement, j'ignore les fichiers où les seuls changements sont au boîtier. Si le fichier a des changements légitimes, je suis toujours bloqué pour voir aussi les changements de cas, mais c'est (beaucoup) mieux que rien.


3 Réponses :


7
votes

Vous pouvez le faire lors de la diffecture de votre consommation à l'écran à l'aide de extension extDiff . < Pré> xxx

alors vous exécutez hg myDIFF de la ligne de commande. Que, bien sûr, vous exige que vous ayez un DIFF binaire installé, qu'il s'agisse de GNU ou d'un autre.

Cependant, cela ne sera pas aussi utile que vous le souhaitez, bien sûr, bien sûr, mercurial ne peut pas ignorer l'affaire - Il s'agit du hachage cryptographique du contenu du fichier et ceux ne permettent pas de wiggle room. Donc, si vous obtenez cette configuration, vous ferez HG myDIFF , et voir aucune modification, puis faire hg commit et voir les modifications partout à la place.

Pour que vous puissiez faire ce travail à l'écran, mais pas fondamentalement.

Une option serait de trouver un nettoyeur de code de base visual, similaire à indent pour c- Comme les langages, cela normalise la caisse variable et exécuter cela dans un crochet de validation mercurial. Ensuite, au moins tout le code entrant dans le contrôle de la source sera cohérent et vous pouvez differser avec précision des révisions.


1 commentaires

Cela ressemble à une sorte de nettoyant de code sera ma seule option. Merci de votre aide.



2
votes

Si vous êtes d'accord avec votre code dans toutes les minuscules, disons, alors vous pouvez utiliser le codé / décodage crochets pour cela. Cela fonctionnerait comme ceci: xxx

Ceci sera coder le contenu du fichier en minuscule chaque fois que vous faites un commit. Les diffs sont également calculés sur la base de la version codée (référentiel) des fichiers.

considérer un fichier contenant xxx

changer dans votre copie de travail à xxx

donnera un diff de xxx

remarque comment la capitale "H" et "W" a été ignorée .

Je ne sais pas vraiment rien sur le code VBA, je ne suis donc pas sûr à 100% de cette solution pour vous. Mais j'espère que cela peut être un point de départ.

Un inconvénient est que vous devez définir cette règle de codage pour tous vos référentiels. Reposettings extension peut vous aider ici.


1 commentaires

Cela ne fonctionnerait pas vraiment pour moi dans ce cas, mais c'est un excellent conseil que je vais essayer de me souvenir de l'avenir. Merci pour l'aide.



2
votes

Voici la solution que j'ai installée. C'est loin d'être idéal, mais mieux que les autres alternatives que j'ai envisagées.

J'ai créé un script Autohotkey qui suit: p>

  • revertit les fichiers d'accès MS dans un référentiel avec des modifications détectées (fichiers .orig) li>
  • se lit dans le fichier .orig (celui avec les modifications) li>
  • se lit dans le fichier existant (celui déjà dans le référentiel) li>
  • convertit le texte des deux fichiers en minuscule li>
  • compare le contenu des fichiers minuscules des fichiers li>
  • Si les fichiers diffèrent toujours, le fichier .orig est restauré afin que cela puisse être attaché au référentiel li>
  • Si les fichiers sont les mêmes (c'est-à-dire qu'ils ne diffèrent que dans le cas où le fichier .orig est supprimé car nous ne nous soucions pas de ces changements) li> ul>

    pour les fichiers qui ont des changements réels que nous nous soucions, je vois toujours les changements de cas qui ont été apportés. Si cela entraîne beaucoup de bruit, j'ouvre le fichier dans un outil de comparaison qui permet à la casse-insensitante se compare (par exemple, KDiff). P>

    Ce n'est pas une solution parfaite, mais elle supprime environ 90% de la Frustration pour moi. P>

    Voici mon script. Notez que le script comprend un autre script Autohotkey, ConsoleAppaT.ahk, qui fournit une fonction nommée, consoleApp_Runwait () code>. Ceci est un script tiers qui ne fonctionne plus très bien avec 64 bits AHK, alors je ne comprends pas cela dans le cadre de ma réponse. Toute fonction AHK qui exécute une ligne de commande et renvoie la sortie en tant que chaîne suffira. P>

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


1 commentaires

Merci d'avoir confirmé qu'il s'agit d'une approche utile. Je pensais à quelque chose de similaire.