Compare commits
19 Commits
a2aadf56f9
...
main
Author | SHA1 | Date | |
---|---|---|---|
f7b816bd48 | |||
fc18c30eaa | |||
d71b435d31 | |||
a948550932 | |||
7cc314e34c | |||
f4c8e58d55 | |||
e78cad78f0 | |||
ac6de83e76 | |||
03bdf767b5 | |||
339f4f5f40 | |||
1464995bc8 | |||
86512b2d5a | |||
d66e2a88a6 | |||
7af2af85d6 | |||
9d98f76bed | |||
1c4fb5137e | |||
6efa8ecf5c | |||
f7dbb284ca | |||
63b453b573 |
BIN
GitCompanion.ico
Normal file
BIN
GitCompanion.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.0 KiB |
BIN
GitCompanion.png
Normal file
BIN
GitCompanion.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
@@ -227,6 +227,14 @@ Enumeration
|
|||||||
#GdtBtnPull
|
#GdtBtnPull
|
||||||
#GdtBtnPush
|
#GdtBtnPush
|
||||||
|
|
||||||
|
#GdtLblRemoteStatus ; Label pour "Status :"
|
||||||
|
#GdtTxtRemoteStatus ; Texte du status (À jour, 3 en retard, etc.)
|
||||||
|
#GdtLblLastFetch ; Label pour "Dernière sync :"
|
||||||
|
#GdtTxtLastFetch ; Texte de la dernière synchronisation
|
||||||
|
#GdtLblAction ; Label pour "Action :"
|
||||||
|
#GdtTxtAction ; Texte de l'action recommandée
|
||||||
|
#GdtBtnCheckRemote
|
||||||
|
|
||||||
; Liste + actions locales directement en dessous
|
; Liste + actions locales directement en dessous
|
||||||
#GdtBtnRestore
|
#GdtBtnRestore
|
||||||
#GdtBtnRename
|
#GdtBtnRename
|
||||||
@@ -404,7 +412,22 @@ Structure listFilesGit
|
|||||||
importance.i
|
importance.i
|
||||||
EndStructure
|
EndStructure
|
||||||
|
|
||||||
|
; Structure pour stocker les infos remote
|
||||||
|
Structure RemoteStatusInfo
|
||||||
|
hasRemote.b ; Remote configuré
|
||||||
|
isUpToDate.b ; À jour ou pas
|
||||||
|
ahead.i ; Commits en avance
|
||||||
|
behind.i ; Commits en retard
|
||||||
|
lastFetch.s ; Timestamp du dernier fetch
|
||||||
|
remoteUrl.s ; URL du remote
|
||||||
|
remoteBranch.s ; Branche remote
|
||||||
|
localBranch.s ; Branche locale
|
||||||
|
status.s ; Description textuelle du statut
|
||||||
|
needsAction.s ; Action recommandée
|
||||||
|
EndStructure
|
||||||
|
|
||||||
Structure GitStatus
|
Structure GitStatus
|
||||||
|
|
||||||
branchInfo.GitBranchInfo
|
branchInfo.GitBranchInfo
|
||||||
List files.GitFileEntry()
|
List files.GitFileEntry()
|
||||||
EndStructure
|
EndStructure
|
||||||
@@ -429,6 +452,7 @@ Structure main
|
|||||||
info.info
|
info.info
|
||||||
GitCall.RunProgramCall
|
GitCall.RunProgramCall
|
||||||
GitStatus.GitStatus
|
GitStatus.GitStatus
|
||||||
|
remoteStatus.RemoteStatusInfo ; Variable globale pour stocker le status
|
||||||
currentPath.s
|
currentPath.s
|
||||||
CurrentBranch.s
|
CurrentBranch.s
|
||||||
List GitHistory.GitCommitRow()
|
List GitHistory.GitCommitRow()
|
||||||
@@ -717,6 +741,148 @@ EndProcedure
|
|||||||
; ? = non suivi (Untracked) - uniquement en position Y
|
; ? = non suivi (Untracked) - uniquement en position Y
|
||||||
; ! = ignoré (Ignored) - uniquement en position Y
|
; ! = ignoré (Ignored) - uniquement en position Y
|
||||||
;-status
|
;-status
|
||||||
|
|
||||||
|
; =============================================================================
|
||||||
|
; Fonction pour récupérer le status remote
|
||||||
|
; =============================================================================
|
||||||
|
Procedure.i GetRemoteStatusInfo()
|
||||||
|
; Récupère les informations de status du remote
|
||||||
|
; Met à jour la structure globale remoteStatus
|
||||||
|
; Retourne : 1=succès, 0=échec
|
||||||
|
|
||||||
|
; Reset de la structure
|
||||||
|
main\remoteStatus\hasRemote = #False
|
||||||
|
main\remoteStatus\isUpToDate = #False
|
||||||
|
main\remoteStatus\ahead = 0
|
||||||
|
main\remoteStatus\behind = 0
|
||||||
|
main\remoteStatus\status = "Vérification..."
|
||||||
|
main\remoteStatus\needsAction = ""
|
||||||
|
|
||||||
|
; Vérifier que Git est dispo et repo initialisé
|
||||||
|
If Not main\info\isGit Or Not main\info\isInit
|
||||||
|
main\remoteStatus\status = "Repo non initialisé"
|
||||||
|
ProcedureReturn #False
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Récupérer la branche courante
|
||||||
|
main\GitCall\args = "branch --show-current"
|
||||||
|
If RunExe(@main\GitCall) = 0
|
||||||
|
main\remoteStatus\localBranch = _SupTrim(main\GitCall\output)
|
||||||
|
Else
|
||||||
|
main\remoteStatus\localBranch = "unknown"
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Vérifier qu'il y a un remote
|
||||||
|
main\GitCall\args = "remote get-url origin"
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
main\remoteStatus\status = "Aucun remote configuré"
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
main\remoteStatus\hasRemote = #True
|
||||||
|
main\remoteStatus\remoteUrl = _SupTrim(main\GitCall\output)
|
||||||
|
main\remoteStatus\remoteBranch = "origin/" + main\remoteStatus\localBranch
|
||||||
|
|
||||||
|
; Fetch silencieux pour avoir les dernières infos
|
||||||
|
main\GitCall\args = "fetch origin --quiet"
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
main\remoteStatus\status = "Erreur réseau"
|
||||||
|
main\remoteStatus\needsAction = "Vérifiez la connexion"
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Timestamp du fetch
|
||||||
|
main\remoteStatus\lastFetch = FormatDate("%dd/%mm/%yyyy %hh:%ii", Date())
|
||||||
|
|
||||||
|
; Vérifier si la branche remote existe
|
||||||
|
main\GitCall\args = "rev-parse --verify " + main\remoteStatus\remoteBranch
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
main\remoteStatus\status = "Branche remote inexistante"
|
||||||
|
main\remoteStatus\needsAction = "Push pour créer"
|
||||||
|
ProcedureReturn 1
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Comparer local vs remote
|
||||||
|
main\GitCall\args = "rev-list --left-right --count " + main\remoteStatus\localBranch + "..." + main\remoteStatus\remoteBranch
|
||||||
|
If RunExe(@main\GitCall) = 0
|
||||||
|
Protected counts.s = _SupTrim(main\GitCall\output)
|
||||||
|
main\remoteStatus\ahead = Val(StringField(counts, 1, #TAB$))
|
||||||
|
main\remoteStatus\behind = Val(StringField(counts, 2, #TAB$))
|
||||||
|
|
||||||
|
; Construire le status et les actions
|
||||||
|
If main\remoteStatus\ahead = 0 And main\remoteStatus\behind = 0
|
||||||
|
main\remoteStatus\isUpToDate = #True
|
||||||
|
main\remoteStatus\status = "À jour"
|
||||||
|
main\remoteStatus\needsAction = ""
|
||||||
|
|
||||||
|
ElseIf main\remoteStatus\ahead > 0 And main\remoteStatus\behind = 0
|
||||||
|
main\remoteStatus\status = Str(main\remoteStatus\ahead) + " en avance"
|
||||||
|
main\remoteStatus\needsAction = "Push recommandé"
|
||||||
|
|
||||||
|
ElseIf main\remoteStatus\ahead = 0 And main\remoteStatus\behind > 0
|
||||||
|
main\remoteStatus\status = Str(main\remoteStatus\behind) + " en retard"
|
||||||
|
main\remoteStatus\needsAction = "Pull nécessaire"
|
||||||
|
|
||||||
|
Else
|
||||||
|
main\remoteStatus\status = Str(main\remoteStatus\ahead) + " en avance, " + Str(main\remoteStatus\behind) + " en retard"
|
||||||
|
main\remoteStatus\needsAction = "Branches divergées"
|
||||||
|
EndIf
|
||||||
|
Else
|
||||||
|
main\remoteStatus\status = "Erreur comparaison"
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn 1
|
||||||
|
EndProcedure
|
||||||
|
; =============================================================================
|
||||||
|
; Fonction pour mettre à jour l'affichage dans la GUI
|
||||||
|
; =============================================================================
|
||||||
|
Procedure UpdateRemoteStatusDisplay()
|
||||||
|
; Met à jour les gadgets d'affichage du status
|
||||||
|
|
||||||
|
If main\remoteStatus\hasRemote
|
||||||
|
; Couleur selon le statut
|
||||||
|
Protected statusText.s = main\remoteStatus\status
|
||||||
|
Protected color.i = RGB(60, 60, 60) ; Gris par défaut
|
||||||
|
|
||||||
|
If main\remoteStatus\isUpToDate
|
||||||
|
color = RGB(0, 128, 0) ; Vert pour "à jour"
|
||||||
|
ElseIf main\remoteStatus\behind > 0
|
||||||
|
color = RGB(255, 140, 0) ; Orange pour "en retard"
|
||||||
|
ElseIf main\remoteStatus\ahead > 0
|
||||||
|
color = RGB(0, 100, 200) ; Bleu pour "en avance"
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
SetGadgetText(#GdtTxtRemoteStatus, statusText)
|
||||||
|
; Note: SetGadgetColor() nécessite que le gadget supporte les couleurs
|
||||||
|
|
||||||
|
; Action recommandée dans un gadget séparé
|
||||||
|
If main\remoteStatus\needsAction <> ""
|
||||||
|
SetGadgetText(#GdtTxtAction, main\remoteStatus\needsAction)
|
||||||
|
Else
|
||||||
|
SetGadgetText(#GdtTxtAction, "Aucune action nécessaire")
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Dernière synchronisation
|
||||||
|
If main\remoteStatus\lastFetch <> ""
|
||||||
|
SetGadgetText(#GdtTxtLastFetch, main\remoteStatus\lastFetch)
|
||||||
|
Else
|
||||||
|
SetGadgetText(#GdtTxtLastFetch, "Jamais")
|
||||||
|
EndIf
|
||||||
|
Else
|
||||||
|
SetGadgetText(#GdtTxtRemoteStatus, "Pas de remote")
|
||||||
|
SetGadgetText(#GdtTxtAction, "-")
|
||||||
|
SetGadgetText(#GdtTxtLastFetch, "-")
|
||||||
|
EndIf
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure CheckRemoteThread(null)
|
||||||
|
; Thread pour vérifier le status remote en arrière-plan
|
||||||
|
GetRemoteStatusInfo()
|
||||||
|
UpdateRemoteStatusDisplay()
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
|
||||||
Procedure.s ExtractField(line.s, position.l)
|
Procedure.s ExtractField(line.s, position.l)
|
||||||
; Extrait un champ à une position donnée (séparé par espaces)
|
; Extrait un champ à une position donnée (séparé par espaces)
|
||||||
Protected count.l = CountString(line, " ")
|
Protected count.l = CountString(line, " ")
|
||||||
@@ -1301,6 +1467,205 @@ Procedure ReadGitIgnorefile()
|
|||||||
EndIf
|
EndIf
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
; =============================================================================
|
||||||
|
;-Fonction de vérification du statut remote
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
Procedure.i CheckRemoteStatus(remoteName.s = "origin", showDialog.b = #True)
|
||||||
|
; Vérifie le statut du remote et affiche les informations
|
||||||
|
; Retourne : 0=erreur, 1=à jour, 2=pull nécessaire, 3=push nécessaire, 4=divergé
|
||||||
|
|
||||||
|
Protected result.i = 0
|
||||||
|
Protected currentBranch.s, remoteBranch.s, ahead.i = 0, behind.i = 0
|
||||||
|
Protected info.s, needAction.s, title.s
|
||||||
|
|
||||||
|
; Vérifier que Git est disponible et que c'est un repo
|
||||||
|
If Not main\info\isGit Or Not main\info\isInit
|
||||||
|
If showDialog
|
||||||
|
MessageRequester("Remote Status", "Git non détecté ou dépôt non initialisé.", #PB_MessageRequester_Warning)
|
||||||
|
EndIf
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Vérifier qu'il y a un remote configuré
|
||||||
|
main\GitCall\args = "remote get-url " + remoteName
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
If showDialog
|
||||||
|
MessageRequester("Remote Status", "Aucun remote '" + remoteName + "' configuré.", #PB_MessageRequester_Info)
|
||||||
|
EndIf
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
Protected remoteUrl.s = _SupTrim(main\GitCall\output)
|
||||||
|
|
||||||
|
; Récupérer la branche courante
|
||||||
|
main\GitCall\args = "branch --show-current"
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
If showDialog
|
||||||
|
MessageRequester("Remote Status", "Impossible de déterminer la branche courante.", #PB_MessageRequester_Error)
|
||||||
|
EndIf
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
currentBranch = _SupTrim(main\GitCall\output)
|
||||||
|
If currentBranch = ""
|
||||||
|
currentBranch = "HEAD détaché"
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Récupérer les informations du remote (fetch)
|
||||||
|
main\GitCall\args = "fetch " + remoteName
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
If showDialog
|
||||||
|
MessageRequester("Remote Status",
|
||||||
|
"Erreur lors de la récupération des informations du remote :" + #LF$ +
|
||||||
|
main\GitCall\errors, #PB_MessageRequester_Error)
|
||||||
|
EndIf
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Construire le nom de la branche remote
|
||||||
|
remoteBranch = remoteName + "/" + currentBranch
|
||||||
|
|
||||||
|
; Vérifier si la branche remote existe
|
||||||
|
main\GitCall\args = "rev-parse --verify " + remoteBranch
|
||||||
|
If RunExe(@main\GitCall) <> 0
|
||||||
|
; La branche remote n'existe pas
|
||||||
|
info = "Remote : " + remoteUrl + #LF$ + #LF$ +
|
||||||
|
"Branche locale : " + currentBranch + #LF$ +
|
||||||
|
"Branche remote : n'existe pas" + #LF$ + #LF$ +
|
||||||
|
"La branche locale n'a pas d'équivalent sur le remote."
|
||||||
|
|
||||||
|
needAction = "Action recommandée : PUSH pour créer la branche sur le remote"
|
||||||
|
title = "Remote Status - Push recommandé"
|
||||||
|
result = 3
|
||||||
|
Else
|
||||||
|
; Comparer les branches locale et remote
|
||||||
|
main\GitCall\args = "rev-list --left-right --count " + currentBranch + "..." + remoteBranch
|
||||||
|
If RunExe(@main\GitCall) = 0
|
||||||
|
Protected counts.s = _SupTrim(main\GitCall\output)
|
||||||
|
ahead = Val(StringField(counts, 1, #TAB$))
|
||||||
|
behind = Val(StringField(counts, 2, #TAB$))
|
||||||
|
|
||||||
|
; Construire le message d'information
|
||||||
|
info = "Remote : " + remoteUrl + #LF$ + #LF$ +
|
||||||
|
"Branche locale : " + currentBranch + #LF$ +
|
||||||
|
"Branche remote : " + remoteBranch + #LF$ + #LF$ +
|
||||||
|
"Commits en avance : " + Str(ahead) + #LF$ +
|
||||||
|
"Commits en retard : " + Str(behind)
|
||||||
|
|
||||||
|
; Déterminer l'action nécessaire
|
||||||
|
If ahead = 0 And behind = 0
|
||||||
|
needAction = "Statut : À JOUR - Aucune action nécessaire"
|
||||||
|
title = "Remote Status - À jour"
|
||||||
|
result = 1
|
||||||
|
ElseIf ahead > 0 And behind = 0
|
||||||
|
needAction = "Action recommandée : PUSH pour envoyer vos " + Str(ahead) + " commit(s)"
|
||||||
|
title = "Remote Status - Push recommandé"
|
||||||
|
result = 3
|
||||||
|
ElseIf ahead = 0 And behind > 0
|
||||||
|
needAction = "Action recommandée : PULL pour récupérer " + Str(behind) + " commit(s)"
|
||||||
|
title = "Remote Status - Pull nécessaire"
|
||||||
|
result = 2
|
||||||
|
Else
|
||||||
|
needAction = "ATTENTION : Branches divergées" + #LF$ +
|
||||||
|
"Action recommandée : PULL puis résolution des conflits éventuels"
|
||||||
|
title = "Remote Status - Branches divergées"
|
||||||
|
result = 4
|
||||||
|
EndIf
|
||||||
|
Else
|
||||||
|
info = "Erreur lors de la comparaison des branches"
|
||||||
|
needAction = "Vérifiez manuellement l'état du dépôt"
|
||||||
|
title = "Remote Status - Erreur"
|
||||||
|
result = 0
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Afficher le dialog si demandé
|
||||||
|
If showDialog
|
||||||
|
Protected fullMessage.s = info + #LF$ + #LF$ + needAction
|
||||||
|
|
||||||
|
; Choisir l'icône selon le résultat
|
||||||
|
Protected flags.i
|
||||||
|
Select result
|
||||||
|
Case 1 : flags = #PB_MessageRequester_Info
|
||||||
|
Case 2 : flags = #PB_MessageRequester_Info
|
||||||
|
Case 3 : flags = #PB_MessageRequester_Info
|
||||||
|
Case 4 : flags = #PB_MessageRequester_Warning
|
||||||
|
Default : flags = #PB_MessageRequester_Error
|
||||||
|
EndSelect
|
||||||
|
|
||||||
|
MessageRequester(title, fullMessage, flags)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Debug pour développement
|
||||||
|
If #EnableDebug
|
||||||
|
Debug "[CheckRemoteStatus] Result: " + Str(result) + " (ahead:" + Str(ahead) + ", behind:" + Str(behind) + ")"
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn result
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
; Fonction helper pour mettre à jour automatiquement les informations
|
||||||
|
Procedure.i UpdateRemoteInfo()
|
||||||
|
; Met à jour les informations du remote et retourne le statut
|
||||||
|
; Cette fonction peut être appelée périodiquement ou sur demande
|
||||||
|
|
||||||
|
Protected status.i = CheckRemoteStatus("origin", #False)
|
||||||
|
|
||||||
|
; Mettre à jour l'interface selon le statut
|
||||||
|
Select status
|
||||||
|
Case 1 ; À jour
|
||||||
|
; Peut changer la couleur du bouton Pull/Push ou ajouter une icône
|
||||||
|
|
||||||
|
Case 2 ; Pull nécessaire
|
||||||
|
; Peut mettre en évidence le bouton Pull
|
||||||
|
|
||||||
|
Case 3 ; Push nécessaire
|
||||||
|
; Peut mettre en évidence le bouton Push
|
||||||
|
|
||||||
|
Case 4 ; Divergé
|
||||||
|
; Peut afficher un avertissement
|
||||||
|
|
||||||
|
EndSelect
|
||||||
|
|
||||||
|
ProcedureReturn status
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
; =============================================================================
|
||||||
|
; Informations supplémentaires intéressantes à ajouter
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
Procedure.s GetAdditionalRemoteInfo()
|
||||||
|
; Récupère des infos bonus intéressantes
|
||||||
|
Protected info.s = ""
|
||||||
|
|
||||||
|
If main\remoteStatus\hasRemote
|
||||||
|
; Dernier commit sur la branche remote
|
||||||
|
main\GitCall\args = "log " + main\remoteStatus\remoteBranch + " -1 --pretty=format:" + Chr(34) + "%h - %an, %ar: %s" + Chr(34)
|
||||||
|
If RunExe(@main\GitCall) = 0
|
||||||
|
info + "Dernier commit remote : " + _SupTrim(main\GitCall\output) + #LF$
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Taille du repo remote (approximative via objets)
|
||||||
|
main\GitCall\args = "count-objects -v"
|
||||||
|
If RunExe(@main\GitCall) = 0
|
||||||
|
Protected sizeKb.s = StringField(main\GitCall\output, 1, #LF$)
|
||||||
|
If FindString(sizeKb, "size-pack")
|
||||||
|
sizeKb = StringField(sizeKb, 2, " ")
|
||||||
|
info + "Taille du dépôt : " + Str(Val(sizeKb) / 1024) + " MB" + #LF$
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Nombre total de commits
|
||||||
|
main\GitCall\args = "rev-list --count HEAD"
|
||||||
|
If RunExe(@main\GitCall) = 0
|
||||||
|
info + "Commits totaux : " + _SupTrim(main\GitCall\output) + #LF$
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn info
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
;-Suite
|
;-Suite
|
||||||
|
|
||||||
@@ -1438,7 +1803,7 @@ Procedure.i SmartPull(remoteName.s = "origin", branchName.s = "")
|
|||||||
ProcedureReturn 0
|
ProcedureReturn 0
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
;TEXT XPS
|
; TEST TITAN
|
||||||
|
|
||||||
; Fonction pour remplacer votre DoPull() actuelle
|
; Fonction pour remplacer votre DoPull() actuelle
|
||||||
Procedure DoSmartPull()
|
Procedure DoSmartPull()
|
||||||
@@ -1976,7 +2341,7 @@ Procedure RefreshFileList(null.i)
|
|||||||
;DoLsFilesByType("O")
|
;DoLsFilesByType("O")
|
||||||
;DoLsFilesByType("I")
|
;DoLsFilesByType("I")
|
||||||
;DoStatus()
|
;DoStatus()
|
||||||
|
CheckRemoteStatus()
|
||||||
GetGitStatus()
|
GetGitStatus()
|
||||||
|
|
||||||
ForEach main\listFilesGit()
|
ForEach main\listFilesGit()
|
||||||
@@ -2100,7 +2465,7 @@ Procedure InitGadget()
|
|||||||
; Le bouton "Enregistrer" actif si au moins un champ non vide
|
; Le bouton "Enregistrer" actif si au moins un champ non vide
|
||||||
DisableGadget(#GdtBtnSaveCfg, Bool(userName$ = "" And userEmail$ = ""))
|
DisableGadget(#GdtBtnSaveCfg, Bool(userName$ = "" And userEmail$ = ""))
|
||||||
|
|
||||||
|
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
Macro RightGadget(GDT)
|
Macro RightGadget(GDT)
|
||||||
@@ -2134,10 +2499,9 @@ Procedure OpenGUI()
|
|||||||
End
|
End
|
||||||
EndIf
|
EndIf
|
||||||
; --- Dimensions générales ---
|
; --- Dimensions générales ---
|
||||||
#WinW = 950
|
#WinW = 1280
|
||||||
#WinH = 720 ; plus haut pour la zone d’aide
|
#WinH = 720 ; plus haut pour la zone d’aide
|
||||||
#PanelW = 920
|
#PanelW = 920
|
||||||
#PanelH = 500
|
|
||||||
#InPad = 10 ; marge interne au Panel
|
#InPad = 10 ; marge interne au Panel
|
||||||
#InFrmY=30
|
#InFrmY=30
|
||||||
#InMargin = 10 ; espace vertical entre frames
|
#InMargin = 10 ; espace vertical entre frames
|
||||||
@@ -2146,14 +2510,14 @@ Procedure OpenGUI()
|
|||||||
#BtnW = 95
|
#BtnW = 95
|
||||||
|
|
||||||
If OpenWindow(#WinMain, 0, 0, #WinW, #WinH, "Git helpmate", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
|
If OpenWindow(#WinMain, 0, 0, #WinW, #WinH, "Git helpmate", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
|
||||||
|
Protected PanelH.l=WindowHeight(#WinMain)- 2*#InPad
|
||||||
PanelGadget(#GdtPnl, #InPad,#InPad, #PanelW, #PanelH)
|
PanelGadget(#GdtPnl, #InPad,#InPad, #PanelW, PanelH)
|
||||||
|
|
||||||
; ============================================================
|
; ============================================================
|
||||||
; Onglet 1 : Dépôt
|
; Onglet 1 : Dépôt
|
||||||
; ============================================================
|
; ============================================================
|
||||||
AddGadgetItem(#gdtPnl, -1, T("#gdtPnl-Repo","Dépôt"))
|
AddGadgetItem(#gdtPnl, -1, T("#gdtPnl-Repo","Dépôt"))
|
||||||
Protected PanelH.l=WindowHeight(#WinMain)- 2*#InPad
|
|
||||||
|
|
||||||
; ---- Cadre "Dépôt local" ----
|
; ---- Cadre "Dépôt local" ----
|
||||||
Protected Width.l=#PanelW - #InPad*2
|
Protected Width.l=#PanelW - #InPad*2
|
||||||
@@ -2167,7 +2531,7 @@ Procedure OpenGUI()
|
|||||||
CloseGadgetList()
|
CloseGadgetList()
|
||||||
; ---- Cadre "Distant" ----
|
; ---- Cadre "Distant" ----
|
||||||
Define yRemote = DownGadget(#GdtFrmLocal)+ #InPad
|
Define yRemote = DownGadget(#GdtFrmLocal)+ #InPad
|
||||||
FrameGadget(#GdtFrmRemote, #InPad, yRemote, #PanelW - 2*#InPad, #InFrmY+#BtnH*2+#InMargin*2, T("GdtFrmRemote","Distant (remote / branche)"),#PB_Frame_Container)
|
FrameGadget(#GdtFrmRemote, #InPad, yRemote, #PanelW - 2*#InPad, #InFrmY+#BtnH*4+#InMargin*4, T("GdtFrmRemote","Distant (remote / branche)"),#PB_Frame_Container)
|
||||||
TextGadget(#GdtLblRemote, #InPad , #InFrmY, 60, #BtnH, T("GdtLblRemote","Remote :"))
|
TextGadget(#GdtLblRemote, #InPad , #InFrmY, 60, #BtnH, T("GdtLblRemote","Remote :"))
|
||||||
StringGadget(#GdtFieldRemote, RightGadget(#GdtLblRemote)+#InMargin, #InFrmY, 420, #BtnH, "")
|
StringGadget(#GdtFieldRemote, RightGadget(#GdtLblRemote)+#InMargin, #InFrmY, 420, #BtnH, "")
|
||||||
TextGadget(#GdtLblBranch, RightGadget(#GdtFieldRemote)+ #InMargin, #InFrmY, 70, #BtnH, T("GdtLblBranch","Branche :"))
|
TextGadget(#GdtLblBranch, RightGadget(#GdtFieldRemote)+ #InMargin, #InFrmY, 70, #BtnH, T("GdtLblBranch","Branche :"))
|
||||||
@@ -2176,12 +2540,23 @@ Procedure OpenGUI()
|
|||||||
ButtonGadget(#GdtBtnClone, #InPad,DownGadget(#GdtLblRemote)+#InMargin, #BtnW,#BtnH, T("GdtBtnClone","Clone"))
|
ButtonGadget(#GdtBtnClone, #InPad,DownGadget(#GdtLblRemote)+#InMargin, #BtnW,#BtnH, T("GdtBtnClone","Clone"))
|
||||||
ButtonGadget(#GdtBtnPull, RightGadget(#GdtBtnClone)+#InPad,GadgetY(#GdtBtnClone), #BtnW, #BtnH, T("GdtBtnPull","Pull"))
|
ButtonGadget(#GdtBtnPull, RightGadget(#GdtBtnClone)+#InPad,GadgetY(#GdtBtnClone), #BtnW, #BtnH, T("GdtBtnPull","Pull"))
|
||||||
ButtonGadget(#GdtBtnPush, RightGadget(#GdtBtnPull)+#InPad,GadgetY(#GdtBtnClone), #BtnW, #BtnH, T("GdtBtnPush","Push"))
|
ButtonGadget(#GdtBtnPush, RightGadget(#GdtBtnPull)+#InPad,GadgetY(#GdtBtnClone), #BtnW, #BtnH, T("GdtBtnPush","Push"))
|
||||||
|
|
||||||
|
; Informations de status (sous les boutons Clone/Pull/Push)
|
||||||
|
Define yStatus = DownGadget(#GdtBtnClone)+#InMargin ; Sous les boutons
|
||||||
|
TextGadget(#GdtLblRemoteStatus, #InPad , yStatus, 60, #BtnH, "Status :")
|
||||||
|
TextGadget(#GdtTxtRemoteStatus, RightGadget(#GdtLblRemoteStatus), yStatus, 200, #BtnH, "Vérification...", #PB_Text_Border)
|
||||||
|
TextGadget(#GdtLblLastFetch, #InPad + 285, yStatus, 80, #BtnH, "Dernière sync :")
|
||||||
|
TextGadget(#GdtTxtLastFetch, #InPad + 370, yStatus, 120, #BtnH, "-", #PB_Text_Border)
|
||||||
|
ButtonGadget(#GdtBtnCheckRemote, #InPad + 500, yStatus - 2, 80, #BtnH, "Vérifier")
|
||||||
|
TextGadget(#GdtLblAction, #InPad, DownGadget(#GdtLblRemoteStatus)+#InMargin, 50, 20, "Action :")
|
||||||
|
TextGadget(#GdtTxtAction, RightGadget(#GdtLblAction), GadgetY(#GdtLblAction), 300, 20, "-", #PB_Text_Border)
|
||||||
CloseGadgetList()
|
CloseGadgetList()
|
||||||
|
|
||||||
; ---- Cadre "Fichiers & modifications" ----
|
; ---- Cadre "Fichiers & modifications" ----
|
||||||
Define yFiles = DownGadget(#GdtFrmRemote)+ #InPad
|
Define yFiles = DownGadget(#GdtFrmRemote)+ #InPad
|
||||||
Define hFiles = #PanelH - yFiles - #InPad
|
Define hFiles = PanelH - yFiles - #InPad
|
||||||
FrameGadget(#GdtFrmFiles, #InPad, yFiles, #PanelW - 2*#InPad, hFiles, T("GdtFrmFiles","Fichiers & modifications"),#PB_Frame_Container)
|
FrameGadget(#GdtFrmFiles, #InPad, yFiles, #PanelW - 2*#InPad, hFiles, T("GdtFrmFiles","Fichiers & modifications"),#PB_Frame_Container)
|
||||||
ListIconGadget(#GdtListStatus, #InPad, #InFrmY, GadgetWidth(#GdtFrmFiles)-2*#InPad, 120, T("GdtListStatus-Path","Path"), 300, #PB_ListIcon_CheckBoxes | #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect |#PB_ListIcon_AlwaysShowSelection)
|
ListIconGadget(#GdtListStatus, #InPad, #InFrmY, GadgetWidth(#GdtFrmFiles)-2*#InPad, hFiles-#BtnH*2-#InMargin*4-#InFrmY, T("GdtListStatus-Path","Path"), 300, #PB_ListIcon_CheckBoxes | #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect |#PB_ListIcon_AlwaysShowSelection)
|
||||||
AddGadgetColumn(#GdtListStatus, 1, T("GdtListStatus-Status","Status"), 50)
|
AddGadgetColumn(#GdtListStatus, 1, T("GdtListStatus-Status","Status"), 50)
|
||||||
AddGadgetColumn(#GdtListStatus, 2, T("GdtListStatus-Desc","Description"), 300)
|
AddGadgetColumn(#GdtListStatus, 2, T("GdtListStatus-Desc","Description"), 300)
|
||||||
|
|
||||||
@@ -2193,7 +2568,7 @@ Procedure OpenGUI()
|
|||||||
ButtonGadget(#GdtBtnIgnore, #InPad + 370, yLocalActions, 110, #BtnH, T("GdtBtnIgnore","Ignorer"))
|
ButtonGadget(#GdtBtnIgnore, #InPad + 370, yLocalActions, 110, #BtnH, T("GdtBtnIgnore","Ignorer"))
|
||||||
|
|
||||||
; Message de commit
|
; Message de commit
|
||||||
Define yMsg = yLocalActions + #BtnH + 10
|
Define yMsg = DownGadget(#GdtBtnRestore)+#InMargin
|
||||||
TextGadget(#GdtLblMessage, #InPad + 10, yMsg + 4, 80, 22, T("GdtLblMessage","Message :"))
|
TextGadget(#GdtLblMessage, #InPad + 10, yMsg + 4, 80, 22, T("GdtLblMessage","Message :"))
|
||||||
StringGadget(#GdtFieldMessage, #InPad + 95, yMsg, #PanelW - 2*#InPad - 95 - 110, #BtnH, "")
|
StringGadget(#GdtFieldMessage, #InPad + 95, yMsg, #PanelW - 2*#InPad - 95 - 110, #BtnH, "")
|
||||||
ButtonGadget(#GdtBtnCommit, #PanelW - #InPad - 100, yMsg - 2, 100, #BtnH, T("GdtBtnCommit","Commit"))
|
ButtonGadget(#GdtBtnCommit, #PanelW - #InPad - 100, yMsg - 2, 100, #BtnH, T("GdtBtnCommit","Commit"))
|
||||||
@@ -2209,7 +2584,7 @@ Procedure OpenGUI()
|
|||||||
ListIconGadget(#GdtListHistory,
|
ListIconGadget(#GdtListHistory,
|
||||||
#InPad, #InPad,
|
#InPad, #InPad,
|
||||||
#PanelW - 2*#InPad,
|
#PanelW - 2*#InPad,
|
||||||
#PanelH - 2*#InPad - #BtnH - 10 - 150 - 10,
|
PanelH - 2*#InPad - #BtnH - 10 - 150 - 10,
|
||||||
T("GdtListHistory-Header","Header"), 220, #PB_ListIcon_FullRowSelect)
|
T("GdtListHistory-Header","Header"), 220, #PB_ListIcon_FullRowSelect)
|
||||||
AddGadgetColumn(#GdtListHistory, 1, T("GdtListHistory-Date","Date"), 150)
|
AddGadgetColumn(#GdtListHistory, 1, T("GdtListHistory-Date","Date"), 150)
|
||||||
AddGadgetColumn(#GdtListHistory, 2, T("GdtListHistory-Author","Auteur"), 180)
|
AddGadgetColumn(#GdtListHistory, 2, T("GdtListHistory-Author","Auteur"), 180)
|
||||||
@@ -2220,14 +2595,14 @@ Procedure OpenGUI()
|
|||||||
; Bouton Restore This Commit (sous la liste)
|
; Bouton Restore This Commit (sous la liste)
|
||||||
ButtonGadget(#GdtBtnRestoreCommit,
|
ButtonGadget(#GdtBtnRestoreCommit,
|
||||||
#InPad,
|
#InPad,
|
||||||
#PanelH - #InPad - #BtnH - 150 - 10,
|
PanelH - #InPad - #BtnH - 150 - 10,
|
||||||
180, #BtnH,
|
180, #BtnH,
|
||||||
T("GdtBtnRestoreCommit","Restore This Commit"))
|
T("GdtBtnRestoreCommit","Restore This Commit"))
|
||||||
|
|
||||||
; Zone d’info du commit (Editor, lecture seule)
|
; Zone d’info du commit (Editor, lecture seule)
|
||||||
EditorGadget(#GdtTxtCommitInfo,
|
EditorGadget(#GdtTxtCommitInfo,
|
||||||
#InPad,
|
#InPad,
|
||||||
#PanelH - #InPad - 150,
|
PanelH - #InPad - 150,
|
||||||
#PanelW - 2*#InPad,
|
#PanelW - 2*#InPad,
|
||||||
150,
|
150,
|
||||||
#PB_Editor_ReadOnly)
|
#PB_Editor_ReadOnly)
|
||||||
@@ -2236,14 +2611,14 @@ Procedure OpenGUI()
|
|||||||
; Onglet 3 : .gitignore file
|
; Onglet 3 : .gitignore file
|
||||||
; ============================================================
|
; ============================================================
|
||||||
AddGadgetItem(#gdtPnl, -1, T("#gdtPnl-gitignore",".gitignore file"))
|
AddGadgetItem(#gdtPnl, -1, T("#gdtPnl-gitignore",".gitignore file"))
|
||||||
EditorGadget(#GdtTxtGitIgnore,#InPad, #InPad,#PanelW - 2*#InPad,#PanelH - 4*#InPad-#BtnH)
|
EditorGadget(#GdtTxtGitIgnore,#InPad, #InPad,#PanelW - 2*#InPad,PanelH - 4*#InPad-#BtnH)
|
||||||
ButtonGadget(#GdtBtnSaveGitIgnore,#InPad,GadgetY(#GdtTxtGitIgnore)+GadgetHeight(#GdtTxtGitIgnore)+#InPad,100,#BtnH,T("GdtBtnSaveGitIgnore","Save File"))
|
ButtonGadget(#GdtBtnSaveGitIgnore,#InPad,GadgetY(#GdtTxtGitIgnore)+GadgetHeight(#GdtTxtGitIgnore)+#InPad,100,#BtnH,T("GdtBtnSaveGitIgnore","Save File"))
|
||||||
; ============================================================
|
; ============================================================
|
||||||
; Onglet 4 : Config
|
; Onglet 4 : Config
|
||||||
; ============================================================
|
; ============================================================
|
||||||
AddGadgetItem(#gdtPnl, -1, T("#gdtPnl-Config","Config"))
|
AddGadgetItem(#gdtPnl, -1, T("#gdtPnl-Config","Config"))
|
||||||
|
|
||||||
FrameGadget(#GdtFrmConfig, #InPad, #InPad, #PanelW - 2*#InPad, 170, T("GdtFrmConfig","Configuration Git"))
|
FrameGadget(#GdtFrmConfig, #InPad, #InPad, #PanelW - 2*#InPad, 170, T("GdtFrmConfig","Configuration Git"),#PB_Frame_Container)
|
||||||
TextGadget(#GdtLblUserName, #InPad + 10, #InPad + 35, 90, 22, "user.name")
|
TextGadget(#GdtLblUserName, #InPad + 10, #InPad + 35, 90, 22, "user.name")
|
||||||
StringGadget(#GdtFieldUserName, #InPad + 110, #InPad + 33, #PanelW - 2*#InPad - 120, #BtnH, "")
|
StringGadget(#GdtFieldUserName, #InPad + 110, #InPad + 33, #PanelW - 2*#InPad - 120, #BtnH, "")
|
||||||
TextGadget(#GdtLblUserEmail, #InPad + 10, #InPad + 70, 90, 22, "user.email")
|
TextGadget(#GdtLblUserEmail, #InPad + 10, #InPad + 70, 90, 22, "user.email")
|
||||||
@@ -2261,26 +2636,22 @@ Procedure OpenGUI()
|
|||||||
CloseGadgetList()
|
CloseGadgetList()
|
||||||
|
|
||||||
; ============================================================
|
; ============================================================
|
||||||
; Aide à droite du Panel (sans splitter)
|
; HELP
|
||||||
; ============================================================
|
; ============================================================
|
||||||
; On garde #PanelW / #PanelH tels quels
|
|
||||||
|
|
||||||
Define helpGap = 10 ; espace entre panel et aide
|
Define helpX = #InPad*2 + #PanelW ; à droite du panel
|
||||||
Define helpX = #InPad + #PanelW + helpGap ; à droite du panel
|
|
||||||
Define helpY = #InPad
|
Define helpY = #InPad
|
||||||
Define helpW = WindowWidth(#WinMain)-GadgetWidth(#gdtPnl)- #InPad*4 ; reste de largeur jusqu'à la marge droite
|
Define helpW = WindowWidth(#WinMain)-GadgetWidth(#gdtPnl)- #InPad*4 ; reste de largeur jusqu'à la marge droite
|
||||||
Define helpH = #PanelH ; même hauteur que le panel
|
Define helpH = GadgetHeight(#gdtPnl) ; même hauteur que le panel
|
||||||
|
|
||||||
; (Optionnel) borne minimale si besoin
|
|
||||||
If helpW < 100 : helpW = 100 : EndIf
|
|
||||||
|
|
||||||
|
|
||||||
; Soit en direct :
|
; Soit en direct :
|
||||||
WebViewGadget(#GdtHelp, helpX, helpY, helpW, helpH)
|
WebViewGadget(#GdtHelp, helpX, helpY, helpW, helpH)
|
||||||
|
|
||||||
; — ou, si tu veux un cadre :
|
; — ou, si tu veux un cadre :
|
||||||
; FrameGadget(#GdtFrmHelp, helpX, helpY, helpW, helpH, T("GdtFrmHelp","Aide"))
|
FrameGadget(#GdtFrmHelp, helpX, helpY, helpW, helpH, T("GdtFrmHelp","Aide"),#PB_Frame_Container)
|
||||||
; WebViewGadget(#GdtHelp, helpX + 10, helpY + 25, helpW - 20, helpH - 35)
|
WebViewGadget(#GdtHelp, helpX + #InMargin, helpY + #InFrmY, helpW - #InMargin*2, helpH - #InMargin-#InFrmY)
|
||||||
|
CloseGadgetList()
|
||||||
|
|
||||||
SetGadgetText(#GgtFieldRepo,main\GitCall\workdir)
|
SetGadgetText(#GgtFieldRepo,main\GitCall\workdir)
|
||||||
CreateThread(@RefreshFileList(),0)
|
CreateThread(@RefreshFileList(),0)
|
||||||
@@ -2338,10 +2709,16 @@ Procedure OpenGUI()
|
|||||||
CreateThread(@RefreshFileList(),0)
|
CreateThread(@RefreshFileList(),0)
|
||||||
EndIf
|
EndIf
|
||||||
Case #GdtFieldRemote
|
Case #GdtFieldRemote
|
||||||
;If EventType()=#PB_EventType_LostFocus
|
If EventType()=#PB_EventType_LostFocus
|
||||||
; AddRemoteRepo(GetGadgetText(#GdtFieldRemote),"origin")
|
; AddRemoteRepo(GetGadgetText(#GdtFieldRemote),"origin")
|
||||||
; EndIf
|
CreateThread(@CheckRemoteThread(), 0)
|
||||||
|
EndIf
|
||||||
|
Case #GdtBtnCheckRemote
|
||||||
|
Debug "Click>#GdtBtnCheckRemote"
|
||||||
|
DisableGadget(#GdtBtnCheckRemote, #True)
|
||||||
|
SetGadgetText(#GdtTxtRemoteStatus, "Vérification...")
|
||||||
|
CreateThread(@CheckRemoteThread(), 0)
|
||||||
|
DisableGadget(#GdtBtnCheckRemote, #False)
|
||||||
Case #GdtBtnClone
|
Case #GdtBtnClone
|
||||||
Debug "Click>#GdtBtnClone"
|
Debug "Click>#GdtBtnClone"
|
||||||
DoClone()
|
DoClone()
|
||||||
@@ -2350,7 +2727,7 @@ Procedure OpenGUI()
|
|||||||
DoPush()
|
DoPush()
|
||||||
Case #GdtBtnPull
|
Case #GdtBtnPull
|
||||||
Debug "Click>#GdtBtnPull"
|
Debug "Click>#GdtBtnPull"
|
||||||
DoPull()
|
SmartPull()
|
||||||
Case #GdtListStatus
|
Case #GdtListStatus
|
||||||
Debug "Click>#GdtListStatus"
|
Debug "Click>#GdtListStatus"
|
||||||
Case #GdtBtnIgnore
|
Case #GdtBtnIgnore
|
||||||
@@ -2401,9 +2778,9 @@ OpenGUI()
|
|||||||
|
|
||||||
|
|
||||||
; IDE Options = PureBasic 6.21 (Windows - x64)
|
; IDE Options = PureBasic 6.21 (Windows - x64)
|
||||||
; CursorPosition = 1440
|
; CursorPosition = 537
|
||||||
; FirstLine = 1415
|
; FirstLine = 537
|
||||||
; Folding = ----------
|
; Folding = -----------
|
||||||
; Optimizer
|
; Optimizer
|
||||||
; EnableThread
|
; EnableThread
|
||||||
; EnableXP
|
; EnableXP
|
Reference in New Issue
Block a user