dernière version
This commit is contained in:
188
PBIDE-GitTool.pb
188
PBIDE-GitTool.pb
@@ -87,6 +87,17 @@ CompilerEndIf
|
|||||||
#GOutCopy = 402
|
#GOutCopy = 402
|
||||||
#GOutClose = 403
|
#GOutClose = 403
|
||||||
|
|
||||||
|
; --- Bouton "Restaurer fichier…" dans la fenêtre principale ---
|
||||||
|
#GRestoreFile = 36
|
||||||
|
|
||||||
|
; --- Fenêtre de restauration d’un fichier vers un commit ---
|
||||||
|
#WRestore = 500
|
||||||
|
#GRestList = 501
|
||||||
|
#GRestOK = 502
|
||||||
|
#GRestCancel = 503
|
||||||
|
#GRestInfo = 504
|
||||||
|
|
||||||
|
|
||||||
; ====== Structures ======
|
; ====== Structures ======
|
||||||
Structure GitCall
|
Structure GitCall
|
||||||
args.s
|
args.s
|
||||||
@@ -135,6 +146,8 @@ Declare.i UpdateGuide(repoDir$, List rows.FileRow(), branch$, remote$)
|
|||||||
Declare.s GetLocalConfig(repoDir$, key$)
|
Declare.s GetLocalConfig(repoDir$, key$)
|
||||||
Declare.i IsGitRepo(dir$)
|
Declare.i IsGitRepo(dir$)
|
||||||
Declare.i UpdateGuide(repoDir$, List rows.FileRow(), branch$, remote$)
|
Declare.i UpdateGuide(repoDir$, List rows.FileRow(), branch$, remote$)
|
||||||
|
Declare.i OpenRestoreFileWindow(repoDir$, List rows.FileRow())
|
||||||
|
Declare.i RestoreFileFromCommit(repoDir$, file$, commit$)
|
||||||
|
|
||||||
; ====== Utils ======
|
; ====== Utils ======
|
||||||
Procedure.s TrimNewlines(text$)
|
Procedure.s TrimNewlines(text$)
|
||||||
@@ -901,6 +914,139 @@ Procedure.i IsGitRepo(dir$)
|
|||||||
ProcedureReturn isRepo
|
ProcedureReturn isRepo
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
; Restaure un fichier à l’état d’un commit précis
|
||||||
|
; - Essaye 'git restore --source <commit> -- <file>'
|
||||||
|
; - Fallback 'git checkout <commit> -- <file>' (pour Git anciens)
|
||||||
|
Procedure.i RestoreFileFromCommit(repoDir$, file$, commit$)
|
||||||
|
Protected gc.GitCall
|
||||||
|
gc\workdir = repoDir$
|
||||||
|
gc\args = "restore --source " + Chr(34) + commit$ + Chr(34) + " -- " + Chr(34) + file$ + Chr(34)
|
||||||
|
|
||||||
|
If #EnableDebug
|
||||||
|
Debug "[RestoreFile] " + gc\args + " (wd=" + repoDir$ + ")"
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
If RunGit(@gc) = 0
|
||||||
|
MessageRequester("Restaurer", "Le fichier a été restauré depuis le commit " + commit$ + ".", #PB_MessageRequester_Info)
|
||||||
|
ProcedureReturn 1
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Fallback pour compatibilité
|
||||||
|
gc\args = "checkout " + Chr(34) + commit$ + Chr(34) + " -- " + Chr(34) + file$ + Chr(34)
|
||||||
|
If RunGit(@gc) = 0
|
||||||
|
MessageRequester("Restaurer", "Le fichier a été restauré (fallback checkout) depuis " + commit$ + ".", #PB_MessageRequester_Info)
|
||||||
|
ProcedureReturn 1
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
MessageRequester("Restaurer", "Échec : " + #LF$ + TrimNewlines(gc\errors), #PB_MessageRequester_Error)
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
; Ouvre une fenêtre listant les commits du fichier sélectionné,
|
||||||
|
; puis restaure le fichier vers le commit choisi.
|
||||||
|
Procedure.i OpenRestoreFileWindow(repoDir$, List rows.FileRow())
|
||||||
|
Protected idx.i = GetGadgetState(#GListStatus)
|
||||||
|
If idx < 0
|
||||||
|
MessageRequester("Restaurer", "Sélectionnez d'abord un fichier dans la liste.", #PB_MessageRequester_Info)
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Récupère le chemin du fichier choisi dans rows()
|
||||||
|
Protected j.i = 0, target$
|
||||||
|
ForEach rows()
|
||||||
|
If j = idx
|
||||||
|
target$ = rows()\file
|
||||||
|
Break
|
||||||
|
EndIf
|
||||||
|
j + 1
|
||||||
|
Next
|
||||||
|
|
||||||
|
If target$ = ""
|
||||||
|
MessageRequester("Restaurer", "Aucun fichier sélectionné.", #PB_MessageRequester_Info)
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Récupère l’historique des commits de ce fichier (50 derniers)
|
||||||
|
Protected gc.GitCall, out$, line$, n.i, i.i
|
||||||
|
gc\workdir = repoDir$
|
||||||
|
gc\args = "log --date=short --pretty=format:%h%x09%ad%x09%s -n 50 -- " + Chr(34) + target$ + Chr(34)
|
||||||
|
|
||||||
|
If RunGit(@gc) <> 0
|
||||||
|
MessageRequester("Restaurer", "Échec du log : " + #LF$ + TrimNewlines(gc\errors), #PB_MessageRequester_Error)
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
out$ = gc\output
|
||||||
|
If Trim(out$) = ""
|
||||||
|
MessageRequester("Restaurer", "Aucun commit trouvé pour ce fichier.", #PB_MessageRequester_Info)
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Prépare une liste parallèle des hash pour retrouver le commit sélectionné
|
||||||
|
NewList hashes.s()
|
||||||
|
|
||||||
|
; Fenêtre de sélection
|
||||||
|
If OpenWindow(#WRestore, 0, 0, 760, 420, "Restaurer : " + target$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
|
||||||
|
TextGadget(#GRestInfo, 10, 10, 740, 22, "Choisissez le commit vers lequel restaurer le fichier.")
|
||||||
|
ListIconGadget(#GRestList, 10, 40, 740, 330, "Commit", 100, #PB_ListIcon_FullRowSelect)
|
||||||
|
AddGadgetColumn(#GRestList, 1, "Date", 90)
|
||||||
|
AddGadgetColumn(#GRestList, 2, "Message", 520)
|
||||||
|
ButtonGadget(#GRestOK, 540, 380, 100, 28, "Restaurer")
|
||||||
|
ButtonGadget(#GRestCancel, 650, 380, 100, 28, "Annuler")
|
||||||
|
|
||||||
|
; Remplit la liste
|
||||||
|
n = CountString(out$, #LF$) + 1
|
||||||
|
For i = 1 To n
|
||||||
|
line$ = StringField(out$, i, #LF$)
|
||||||
|
If Trim(line$) <> ""
|
||||||
|
; Format: %h<TAB>%ad<TAB>%s
|
||||||
|
Protected h$ = StringField(line$, 1, #TAB$)
|
||||||
|
Protected d$ = StringField(line$, 2, #TAB$)
|
||||||
|
Protected s$ = StringField(line$, 3, #TAB$)
|
||||||
|
AddGadgetItem(#GRestList, -1, h$ + #LF$ + d$ + #LF$ + s$)
|
||||||
|
AddElement(hashes()) : hashes() = h$
|
||||||
|
EndIf
|
||||||
|
Next
|
||||||
|
|
||||||
|
; Boucle fenêtre
|
||||||
|
Repeat
|
||||||
|
Protected ev.i = WaitWindowEvent()
|
||||||
|
If ev = #PB_Event_Gadget
|
||||||
|
Select EventGadget()
|
||||||
|
Case #GRestOK
|
||||||
|
idx = GetGadgetState(#GRestList)
|
||||||
|
If idx < 0
|
||||||
|
MessageRequester("Restaurer", "Sélectionnez un commit.", #PB_MessageRequester_Warning)
|
||||||
|
Else
|
||||||
|
; Récupère le hash à l’index idx
|
||||||
|
j = 0
|
||||||
|
Protected chosen$
|
||||||
|
ForEach hashes()
|
||||||
|
If j = idx : chosen$ = hashes() : Break : EndIf
|
||||||
|
j + 1
|
||||||
|
Next
|
||||||
|
If chosen$ <> ""
|
||||||
|
If RestoreFileFromCommit(repoDir$, target$, chosen$)
|
||||||
|
CloseWindow(#WRestore)
|
||||||
|
ProcedureReturn 1
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
Case #GRestCancel
|
||||||
|
CloseWindow(#WRestore)
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndSelect
|
||||||
|
EndIf
|
||||||
|
Until ev = #PB_Event_CloseWindow
|
||||||
|
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn 0
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; Met à jour le panneau "Guide" avec un pas-à-pas adapté
|
; Met à jour le panneau "Guide" avec un pas-à-pas adapté
|
||||||
; - Inclut l’étape “Init repo” si le dossier n’est pas encore un dépôt
|
; - Inclut l’étape “Init repo” si le dossier n’est pas encore un dépôt
|
||||||
@@ -1005,14 +1151,15 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
Protected remote$ = "", branch$ = ""
|
Protected remote$ = "", branch$ = ""
|
||||||
LoadPrefs(prefsPath$, remote$, branch$)
|
LoadPrefs(prefsPath$, remote$, branch$)
|
||||||
|
|
||||||
If OpenWindow(#GWindow, 0, 0, 820, 640, "PBIDE-GitTool — Git (mode simplifié)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
|
; On élargit légèrement pour caser le nouveau bouton
|
||||||
|
If OpenWindow(#GWindow, 0, 0, 900, 640, "PBIDE-GitTool — Git (mode simplifié)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
|
||||||
TextGadget(#GLabelRepo, 10, 12, 60, 22, "Dépôt :")
|
TextGadget(#GLabelRepo, 10, 12, 60, 22, "Dépôt :")
|
||||||
StringGadget(#GStringRepo, 80, 10, 620, 24, repoDir$)
|
StringGadget(#GStringRepo, 80, 10, 720, 24, repoDir$)
|
||||||
ButtonGadget(#GButtonBrowse, 710, 10, 100, 24, "Parcourir…")
|
ButtonGadget(#GButtonBrowse, 810, 10, 80, 24, "Parcourir…")
|
||||||
|
|
||||||
; Liste avec cases à cocher
|
; Liste avec cases à cocher
|
||||||
ListIconGadget(#GListStatus, 10, 46, 800, 300, "Statut", 180, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
|
ListIconGadget(#GListStatus, 10, 46, 880, 300, "Statut", 180, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
|
||||||
AddGadgetColumn(#GListStatus, 1, "Fichier", 600)
|
AddGadgetColumn(#GListStatus, 1, "Fichier", 680)
|
||||||
|
|
||||||
; Ligne actions liste
|
; Ligne actions liste
|
||||||
ButtonGadget(#GRefresh, 10, 352, 90, 26, "Rafraîchir")
|
ButtonGadget(#GRefresh, 10, 352, 90, 26, "Rafraîchir")
|
||||||
@@ -1021,8 +1168,8 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
ButtonGadget(#GExclude, 310, 352, 90, 26, "Exclure")
|
ButtonGadget(#GExclude, 310, 352, 90, 26, "Exclure")
|
||||||
ButtonGadget(#GIncludeAll, 410, 352, 110, 26, "Tout inclure")
|
ButtonGadget(#GIncludeAll, 410, 352, 110, 26, "Tout inclure")
|
||||||
ButtonGadget(#GExcludeAll, 530, 352, 110, 26, "Tout exclure")
|
ButtonGadget(#GExcludeAll, 530, 352, 110, 26, "Tout exclure")
|
||||||
ButtonGadget(#GDiff, 650, 352, 70, 26, "Diff…")
|
ButtonGadget(#GDiff, 650, 352, 80, 26, "Diff…")
|
||||||
ButtonGadget(#GAdvanced, 730, 352, 80, 26, "Avancé…")
|
ButtonGadget(#GRestoreFile,740, 352, 150, 26, "Restaurer fichier…")
|
||||||
|
|
||||||
; Zone commit / push
|
; Zone commit / push
|
||||||
TextGadget(#GLabelMsg, 10, 388, 100, 22, "Message :")
|
TextGadget(#GLabelMsg, 10, 388, 100, 22, "Message :")
|
||||||
@@ -1035,6 +1182,7 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
TextGadget(#GLabelBranch, 350, 418, 60, 22, "Branche :")
|
TextGadget(#GLabelBranch, 350, 418, 60, 22, "Branche :")
|
||||||
ComboBoxGadget(#GComboBranch, 410, 416, 170, 24)
|
ComboBoxGadget(#GComboBranch, 410, 416, 170, 24)
|
||||||
ButtonGadget(#GSavePrefs, 590, 416, 220, 24, "Sauver défauts")
|
ButtonGadget(#GSavePrefs, 590, 416, 220, 24, "Sauver défauts")
|
||||||
|
ButtonGadget(#GAdvanced, 820, 416, 70, 24, "Avancé…")
|
||||||
|
|
||||||
ButtonGadget(#GCommit, 10, 450, 120, 30, "Add + Commit")
|
ButtonGadget(#GCommit, 10, 450, 120, 30, "Add + Commit")
|
||||||
ButtonGadget(#GPush, 140, 450, 120, 30, "Push")
|
ButtonGadget(#GPush, 140, 450, 120, 30, "Push")
|
||||||
@@ -1043,14 +1191,12 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
ButtonGadget(#GMakeIgnore, 580, 450, 230, 30, "Créer .gitignore (recommandé)")
|
ButtonGadget(#GMakeIgnore, 580, 450, 230, 30, "Créer .gitignore (recommandé)")
|
||||||
|
|
||||||
; Panneau Guide
|
; Panneau Guide
|
||||||
EditorGadget(#GGuide, 10, 490, 800, 140)
|
EditorGadget(#GGuide, 10, 490, 880, 140)
|
||||||
;DisableGadget(#GGuide, 1)
|
DisableGadget(#GGuide, 1)
|
||||||
|
|
||||||
; Infobulles
|
; Infobulles utiles
|
||||||
GadgetToolTip(#GListStatus, "Cochez pour inclure un fichier dans le prochain commit. Double-cliquez pour sélectionner, bouton 'Diff…' pour le détail.")
|
GadgetToolTip(#GRestoreFile, "Restaurer le fichier sélectionné à un commit précis (historique).")
|
||||||
GadgetToolTip(#GDiff, "Afficher les différences du fichier sélectionné.")
|
GadgetToolTip(#GDiff, "Afficher les différences du fichier sélectionné.")
|
||||||
GadgetToolTip(#GConfig, "Configurer user.name et user.email localement pour ce dépôt.")
|
|
||||||
GadgetToolTip(#GMakeIgnore, "Créer un .gitignore avec des règles recommandées pour PureBasic.")
|
|
||||||
|
|
||||||
; Branches
|
; Branches
|
||||||
NewList branchItems.s()
|
NewList branchItems.s()
|
||||||
@@ -1071,6 +1217,7 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
Select ev
|
Select ev
|
||||||
Case #PB_Event_Gadget
|
Case #PB_Event_Gadget
|
||||||
Select EventGadget()
|
Select EventGadget()
|
||||||
|
|
||||||
Case #GButtonBrowse
|
Case #GButtonBrowse
|
||||||
Protected newDir$ = PathRequester("Choisir le répertoire du dépôt", repoDir$)
|
Protected newDir$ = PathRequester("Choisir le répertoire du dépôt", repoDir$)
|
||||||
If newDir$ <> ""
|
If newDir$ <> ""
|
||||||
@@ -1133,6 +1280,16 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
repoDir$ = GetGadgetText(#GStringRepo)
|
repoDir$ = GetGadgetText(#GStringRepo)
|
||||||
OpenDiffWindow(repoDir$, rows())
|
OpenDiffWindow(repoDir$, rows())
|
||||||
|
|
||||||
|
Case #GRestoreFile
|
||||||
|
repoDir$ = GetGadgetText(#GStringRepo)
|
||||||
|
If OpenRestoreFileWindow(repoDir$, rows())
|
||||||
|
; Après restauration : rafraîchir l’état
|
||||||
|
ClearList(rows())
|
||||||
|
LoadStatusRows(repoDir$, rows())
|
||||||
|
FillStatusList(rows())
|
||||||
|
UpdateGuide(repoDir$, rows(), GetGadgetText(#GComboBranch), GetGadgetText(#GStringRemote))
|
||||||
|
EndIf
|
||||||
|
|
||||||
Case #GAdvanced
|
Case #GAdvanced
|
||||||
repoDir$ = GetGadgetText(#GStringRepo)
|
repoDir$ = GetGadgetText(#GStringRepo)
|
||||||
OpenAdvancedWindow(repoDir$)
|
OpenAdvancedWindow(repoDir$)
|
||||||
@@ -1160,7 +1317,6 @@ Procedure.i OpenGUI(initialDir$, prefsPath$)
|
|||||||
Case #GMakeIgnore
|
Case #GMakeIgnore
|
||||||
repoDir$ = GetGadgetText(#GStringRepo)
|
repoDir$ = GetGadgetText(#GStringRepo)
|
||||||
If MakeDefaultGitignore(repoDir$)
|
If MakeDefaultGitignore(repoDir$)
|
||||||
; optionnel : refresh
|
|
||||||
ClearList(rows())
|
ClearList(rows())
|
||||||
LoadStatusRows(repoDir$, rows())
|
LoadStatusRows(repoDir$, rows())
|
||||||
FillStatusList(rows())
|
FillStatusList(rows())
|
||||||
@@ -1412,8 +1568,8 @@ Else
|
|||||||
EndIf
|
EndIf
|
||||||
|
|
||||||
; IDE Options = PureBasic 6.21 (Windows - x64)
|
; IDE Options = PureBasic 6.21 (Windows - x64)
|
||||||
; CursorPosition = 212
|
; CursorPosition = 1370
|
||||||
; FirstLine = 181
|
; FirstLine = 1329
|
||||||
; Folding = -------
|
; Folding = -------
|
||||||
; EnableXP
|
; EnableXP
|
||||||
; DPIAware
|
; DPIAware
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user