IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Vos Contributions VBScript Discussion :

Merge de branche sous Visual SourceSafe


Sujet :

Vos Contributions VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut Merge de branche sous Visual SourceSafe
    Après un premier message posté il y a plus d'un an ici
    Me voila de retour pour poster ici...

    Les librairies :
    • Le code source en vrac est devenu une librairie avec plein de fonctions...
    • Une librairie d'arbre a été développé, bien pratique pour afficher un arbre dans un navigateur IE.


    L'outils :
    Je travaille depuis des années avec Visual SourceSafe comme gestionnaire de source, c'est un outils pas très puissant mais très simple à utiliser.
    Le problème est le suivant : Lorsqu'un logiciel est livré et qu'une nouvelle version est développé, on fait un Share puis un Branch afin que jusqu'à la sortie de la version, l'historique de chaque fichier soit le même mais qu'ensuite, chacun vive sa vie propre.
    Le problème arrive ensuite lorsqu'on modifie un fichier dans la branche source et que l'on veut faire des reports dans la nouvelles branche... pour un fichier ça va mais pour une équipe et des développements importants ça devient vite fastidieux et source de buggs.

    Je n'ai trouvé à ce jour aucun outils pour faire ce report... sauf SourceSafe lui-même :
    • Une interface minable, pas intuitive où l'on a du mal à comprendre les différentes branches sources d'un fichier
    • Aucun historique des reports
    • Aucune détection des versions à merger
    • Il faut le faire, sur chaque fichier, un par un, projet par projet !


    Que fait ce script ?
    On choisi une base SourceSafe, un login, un mot de passe.
    Puis, on choisi une branche source et une branche destination où il faut merger les fichiers.
    Ensuite, le script analyse la branche destination afin de créer l'arborescence SourceSafe.
    Il analyse ensuite chaque fichier :
    • Il recherche alors l'ancètre commun entre le fichier dans la branche destination et la branche source.
    • Si une nouvelle version a été archivée dans la branche source depuis la branche, il faut alors fusionner ce fichier, il apparait alors en rouge.
    • Le logiciel détecte kdiff car il a besoin d'un logiciel de merge automatique qui sait faire du merge à 3 fichiers et résoudre les conflits graphiquement. Il faudra donc l'installer, c'est gratuit !
    • Lorsque l'on clic sur Merge, le logiciel ouvre KDiff et merge (qui peut être automatique s'il n'y a pas de conflit), l'icône passe alors jaune avec une check rouge (indiquant que le fichier est extrait).
    • Lorsque le fichier est mis en check in par le programmeur (non fait par le script) le logiciel écrit ces informations dans des fichiers lui permettant par la suite de ne pas considérer ce fichier comme devant être mergé.


    Quelques images...

    Login sur la base SourceSafe :
    Il faut choisir le chemin de la base SourceSafe, le login, le mot de passe.


    Choix de la branche :
    L'ouverture de noeuds est dynamique afin de ne pas descendre tout l'arbre de SourceSafe dans l'IHM


    Arbre de merge :
    2 fichiers rouges à merger, 1 fichier vert (à jour) qui est extrait, des fichiers verts à jour, non extrait par moi.
    0 / 2 => 0 fichiers fusionnés
    0 => Nombre de fichiers fusionnés
    2 => Nombre de fichier qu'il faut fusionner
    0 => Nombre de fichier fusionné et check-in (report de branche)


    Une fois mergé :
    Ici, il y a deux fichiers jaunes indiquant que le merge a été effectué :
    - Un avec une check bleu : il a été mergé puis check-in
    - Un avec une check rouge : il a été mergé mais pas encore archivé (check-in), le logiciel attend donc que l'utilisateur archive ce fichier.


    Pour le lancer : décompresser le zip
    SSMergeBranchs_2.2.zip (123Ko)

    Installer KDiff3 (utilisé que lors du merge)
    Double clic sur SSMergeBranchs_2.1.vbs

    Quelques informations :
    Le script génère et utilise quatre fichiers :
    • Merge_Branchs_Lasts.ini: situé à côté de srcsafe.ini dans le répertoire de SourceSafe, il permet de mémoriser quels sont les derniers reports faient sur chaque fichier, sur chaque branche fin de ne pas redemander toujours les mêmes merge, information que SourceSafe ne mémorise hélas pas.
    • Merge_Branchs_History.ini: situé à côté de srcsafe.ini dans le répertoire de SourceSafe, il permet de mémoriser quels reports ont déja été faient efin de constituer un historique. Pour cette version, ce fichier est généré mais pas exploité pour le moment. J'envisage d'ajouter une commande afin de remplir dans l'arbre, sur demande de l'utilisateur, affin d'afficher les historiques sur chaque fichier.
    • SSMergeBranchs_2.1.ini: Situé au même endroit que le script, il mémorise le chemin de la base SourceSafe, le login, le mot de passe (crypté)et les branches pour pas que l'on soit obliger de tout renseigner à chaque lancement.
    • CurrentMerging.ini: Situé au même endroit que le script, il mémorise quels sont les fichiers actuellement mergé et les réimporte lors du lancement du script. La version 2.0 n'est pas exploitable du fait de l'abscence de ce fichier. En effet il fallait ne pas quitter le script jusqu'au checkin des fichiers mergé pour qu'il puisse générer les fichiers (Merge_Branchs_Lasts.ini et Merge_Branchs_History..ini), or pour des reports massifs cela dure plusieurs jours, les reports sont faient dans beaucoup de branches différentes, il est impensable de lancer ce script sur 20000 fichiers simultanément et de le laisser ouvert 10 jours !


    Beaucoup d'autres choses à expliquer mais il est tard et je vais attendre des retours pour voir si ça intéresse du monde ou pas.

    [edit]
    25/03/2009 mise à jour version 2.2

  2. #2
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut
    J'en suis à la version 2.3 pour le moment...
    - Un répertoire SourceSafe contenant beaucoup de fichiers fait planter le script du à l'appel récursif sur les noeuds frêres. Corrigé en 2.3
    - Amélioration du peuplement de l'arbre, environ 2,5 fois plus rapide.

    Je livrerais quand il y aura vraiment des modifications significatives et que ça intéressera du monde.

  3. #3
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut


    on attends la suite

  4. #4
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut
    Pour le moment je suis en phase de report de branches intensive au travail, et j'utilise ce script que je développe chez moi...
    J'ai pas mal de pistes :
    - Limiter la profondeur des recherches de la branches destination : bien utile lorsque l'on ne veut merger que les fichiers d'un noeud sans toute l'arborescence.
    - L'ancètre commun est bien calculé en cas du 1er report, s'il y a un deuxième report, on devrait (je crois, faut que je réfléchisse) qu'on devrait prendre la version de la branche source qui a déja été reportée dans la branche cible en ancètre commun pour le merge (base), et non pas la première version commune aux deux branches.
    - Ne pas effacer les arbres de choix source / destination lorsqu'on retourne à ce choix, ça oblige à tout reconstruire !
    - Ne pas être obligé de choisir des branches de report lorsqu'on ne veut que voir les fichiers en cours de merge (import automatique)
    - Si la branche B a été contruite à partir de la branche A on peut faire des reports de A->B mais les reports de B->A ne fonctionnent pas, il ne trouve pas d'ancètre commun...
    - Dans le choix des branches, des clics trop rapides sur les noeuds alors qu'ils sont en constructions font planter le script.
    Si vous avez d'autres idées ?

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    ça m'a l'air bien sympatique.

    Je voudrais juste savoir si tu connais SVN, et tortoise SVN.
    La gestion de version avec un serveur SVN est plutot pas mal, et tortoise SVN est un outil pour windows assez pratique pour l'utiliser.

    C'est ce que j'ai au boulot.

  6. #6
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut
    Oui, je connais SVN - SubVersion. C'est très bien même si je ne l'ai utilisé que pour récupérer les derniers source ce CodeBlocks et pouvoir le recompiler.
    J'ai utilisé au travail Clearcase, c'est assez lourd mais très puissant aussi.
    Ces deux outils doivent savoir gérer correctement les branches et les reports de branche (pour ClearCase c'est sur en tout cas), ce n'est pas de base (en tout cas, pas bien fait) pour SourceSafe.

    En fait ce que je donne ici est un outils permettant à ceux qui utilisent SourceSafe de se simplifier la vie : pour moi, on utilise SourceSafe au travail et c'est pas un petit prestataire qui va révolutionner le service, alors je fais avec !

    Toutefois, dans ce script, j'utilise deux librairies qui peuvent être sympa à utiliser et que je développe en parallèle... (gestion des arbres + outils)

  7. #7
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Par défaut
    Cette nouvelle version est super. (en version fille en plus ;-) )
    Toutes les améliorations apportées sont très utiles pour moi. ^^

    Pour ma part j'aurais bien une petite idée d'amélioration...
    En effet, je n'ai pas encore trouvé comment brancher mes arbos dans VSS autrement qu'en sélectionnant le contenu de chaque répertoire et de faire brancher dans le menu (après les avoir partager).
    Crois tu que c'est possible d'intégrer cette fonction à ton script ?

    En tout cas, continue comme ça !


  8. #8
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut
    A Faire sous Source Safe....

    Imagine, tu as une branche V1
    $/V1

    Tu sélectionnes $/ Sous SourceSafe (tu sélectionnes ta branche d'arrivée)
    Dans le menu, tu choisis : SourceSafe / Partager
    -> Ouverture d'une boite : Partager avec $/
    Tu choisis la branches que tu veux partager, ici $/V1
    Et tu coches (TRES IMPORTANT) Créer une branche après le partage.
    -> Clic sur le bouton Partager
    Là, tu donnes le nouveau nom de V1 dans la branche destinationn, ici V2
    -> Tu coches Récursif pour que ça soit récursif (pas bête hien ?)
    Tu places un commentaire et Clic sur le bouton OK
    Le traitement est ensuite un peu long.... mais voila tu as branché en récursif sans tout faire un par un !!!

    Le pls déroutant, c'est qu'il FAUT D'ABORD CHOISIR LA BRANCHE DESTINATION et non choisir le dossier que tu veux partager/brancher...

    C'est mal fait et pas compréhensible mais une fois qu'on a un peu galérer, ça marche bien !

  9. #9
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Par défaut
    Excellent ! Ca marche !
    Et dire que j'utilise VSS depuis 3 ans...
    Merci ^^

  10. #10
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut
    J'utilise SS depuis 14 ans !!
    Vous avez pas besoin d'un presta expérimenté ?

  11. #11
    Membre confirmé

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Par défaut
    Attention : un bugg dans la dernière version !
    Dans Feneck91_Library
    If faut ajouter un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Sub WriteIniStringFromContent(strSection, strKeyName, ByVal strValue, ByRef strIniContents)
        Dim iPosSection, iPosEndSection
    
        ' Tagguer les retours chariot / Line Feed / Tab : uniquement si la valeur contient quelque chose
        If Not IsNull(strValue) Then
            strValue = ReplaceText(strValue, vbAliaLf,"<{LF}>",True,True)
            strValue = ReplaceText(strValue, vbCr,"<{CR}>",True,True)
        End If
    
        'Find section
        iPosSection = InStr(1, strIniContents, "[" & strSection & "]", vbTextCompare)
    
        If iPosSection>0 Then
            'Section exists. Find end of section
            iPosEndSection = InStr(iPosSection, strIniContents, vbCrLf & "[")
    
            'Is this last section?
            If iPosEndSection = 0 Then
                iPosEndSection = Len(strIniContents)+1
            End If
    
            Dim strOldsContents
            If Not IsNull(strKeyName) Then
                'Separate section contents
                Dim strNewsContents, strLine
                Dim strSearchKeyName, bFound
    
                bFound = False
                strOldsContents = Mid(strIniContents, iPosSection, iPosEndSection - iPosSection)
                strOldsContents = split(strOldsContents, vbCrLf)
    
                'Temp variable To find a Key
                strSearchKeyName = LCase(strKeyName & "=")
    
                'Enumerate section lines
                For Each strLine In strOldsContents
                    If LCase(Left(strLine, Len(strSearchKeyName))) = strSearchKeyName Then
                        bFound = True
                        ' Line found : remove it if strValue is Null
                        If Not IsNull(strValue) Then
                            strLine = strKeyName & "=" & strValue
                        Else
                            strLine = ""
                        End If
                    End If
                    If Len(strLine)>0 Then
                        strNewsContents = strNewsContents & strLine & vbCrLf
                    End If
                Next
    
                If Not bFound Then
                    If Not IsNull(strValue) Then
                        'key Not found - add it at the end of section
                        If Len(strNewsContents)>0 Then
                            If Right(strNewsContents, Len(vbCrlf)) <> vbCrLf And Len(strNewsContents)>0 Then
                                strNewsContents = strNewsContents & vbCrLf
                            End If
                        End If
                        strNewsContents = strNewsContents & strKeyName & "=" & strValue
                    End If
                End If
            Else
                ' Remove Section
                strOldsContents = ""
                If Left(Mid(strIniContents, iPosEndSection),Len(vbCrlf)) = vbCrlf Then
                    ' Remove space between 2 section, this one is destroyed
                    iPosEndSection = iPosEndSection + Len(vbCrlf)
                End If
            End If
    
            'Combine pre-section, new section And post-section data.
            strIniContents = Left(strIniContents, iPosSection-1) & strNewsContents & Mid(strIniContents, iPosEndSection)
        Else 'if PosSection>0 Then
            'Section Not found. Add section data at the end of file contents.
            If Len(strIniContents)>0 Then
                If Right(strIniContents, Len(vbCrlf)) <> vbCrLf And Len(strIniContents)>0 Then
                    strIniContents = strIniContents & vbCrLf
                End If
                If Not IsNull(strKeyName) Then
                    ' Let cariage return beetween section and keys of last section
                    strIniContents = strIniContents & vbCrLf
                End If
            End If
            If Not IsNull(strKeyName) Then
                strIniContents = strIniContents & "[" & strSection & "]" & vbCrLf
                If Not IsNull(strValue) Then
                    strIniContents = strIniContents & strKeyName & "=" & strValue & vbCrLf
                End If
            End If
        End If
    End Sub
    Ceci provoque l'arrêt du script après l'archivation du premier fichier.

    Je vous prépare une nouvelle version avec intégration des fichiers "Merge_Branchs_History.ini" et "Merge_Branchs_Lasts.ini" directement sous SourceSafe afin de les protéger de toute mauvaise manipulation.

    A bientot.

Discussions similaires

  1. [MSChart] creation de courbe sous visual C++
    Par gabriel knight dans le forum MFC
    Réponses: 5
    Dernier message: 18/09/2006, 14h32
  2. Impression sous visual c++
    Par zeze511 dans le forum MFC
    Réponses: 2
    Dernier message: 16/02/2004, 12h02
  3. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  4. Réponses: 3
    Dernier message: 28/01/2004, 10h46
  5. Deplacer un curseur dans un RichEdit sous visual c
    Par tweek dans le forum Windows
    Réponses: 7
    Dernier message: 14/01/2004, 00h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo