[IDE-Tool] GitHelper

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

[IDE-Tool] GitHelper

Beitrag von GPI »

Leider unterstützt PB-IDE GIT nicht, aber man kann ihn eine einfache GIT-Unterstützung mitgeben

Streng genommen könnte man die GIT-Exe direkt als Tool eintragen, ich wollte aber ein paar Automatisierungen, bspw. das automatisch eine lokale Repo angelegt wird.

Erstmal, mehr infos zu Git:
https://svij.org/blog/2014/10/25/git-fu ... er-teil-1/

Damit das Tool arbeiten kann, muss natürlich GIT installiert werden
https://git-scm.com/downloads

Githelper ist nur mit Windows getestet, müsste aber mit kleinen Anpassungen auch unter Linux/Mac arbeiten.

Wenn das Tool zum ersten mal gestartet wird, wird eine INI erzeugt und geöffnet. Hier findet man unter [Global] die einzelnen Exe-Dateien (sollten auf Git, Git-GUI und Gitk zeigen. Zudem gibts ein ProjectRoot - das ist standardmäßig der Ordner, den man auch in PB angegeben hat. GitHelper geht davon aus, das jeder Ordner innerhalb ProjectRoot ein eigenes Projekt ist und in jeden dieser Ordner wird (bei Bedarf) ein Git-Repo eingerichtet. Kleine Besonderheit ist hier auch, das GitHelper immer alle Dateien und Unterordner eines Projekts erfasst und bei einen Commit automatisch auswählt.
Unter [Default .gitignore] ist die Muster-GitIgnore die in jeden Project-Ordner kopiert wird.
[Environment] wiederum enthält Enviroment-Variablen, die vor den starten von Git gesetzt werden. Standardmäßig ist nur eine Variable drin, damit anstelle des internen Editors-"Dos-Editors" (wo ich nicht mal schaffe, speichern noch ihn zu beenden) das Wordpad benutzt wird. Man sollte aber nicht PureBasic hier eintragen, weil GIT dann unter umständen wartet, bis der Editor beendet wird.

Jetzt muss man nur noch das Tool beim IDE einrichten, hier ist was ich so eingestellt hab:

Code: Alles auswählen

[Tool_6]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" COMMIT "--Compile&Run"
MenuItemName = GIT Compile&Run
Trigger = 3 ;before Compile&Run
HideFromMenu = 1
[Tool_7]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" COMMIT
MenuItemName = Git Commit
Trigger = 7; After execute creation
[Tool_8]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" GUI
MenuItemName = Git GUI
[Tool_9]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" ViewHistory
MenuItemName = Git View History
[Tool_10]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" ViewAllHistory
MenuItemName = Git View All History
[Tool_11]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" OpenLog
MenuItemName = Git OpenLog
[Tool_12]
Command = C:\Users\GPI\Documents\!PureBasic\!Tools\GitHelper.exe
Arguments = "%FILE" branch
MenuItemName = Git Branch
Bei Compile & Run wird automatisch ein Commit mit "--Compile&run" als Überschrift eingetragen. Bei AfterCreateExecute wird ein Commit ausgelöst und der Benutzer muss eine Überschrift eingeben. Der Eintrag taucht dann auch in Tools-Menü auf. Ansonsten kann man die Repo in GUI anschauen oder eine History anzeigen lassen.
GitHelper legt eine Log-Datei über alle von ihn ausgeführten Befehle an - diese kann mit den entsprechenden Eintrag auch angesehen werden.

Man könnte das Programm noch erweitern, das man Branches erstellen und wechseln könnte, aber mir reicht es, wenn ich das über das GUI/History erledigen kann. Gerade das Mergen kann recht komplex werden :) - genauso ist der Remote-Zugriff nicht drin, dafür gibts auch die GUI ;)

so hier der code:

Code: Alles auswählen

EnableExplicit

CompilerIf #PB_Compiler_OS=#PB_OS_Windows
  #DS="\"
  #editorPRG="notepad.exe"
  #gitPRG="git.exe"
  #gitguiPRG="git-gui.exe"
  #gitkPRG="gitk.exe"
CompilerElse
  #DS="/"
CompilerEndIf

#Title="GitHelper"
#GithelperINI="GitHelper.ini"
#GitLog=".gitlog.log" 
#GitBuildNoFile=".gitbuildno.pbi"
#DateFormat="[%dd.%mm.%yyyy %hh:%ii:%ss]"

Global GitPRG.s,GitGuiPRG.s,GitkPRG.s,ProjectRoot.s,DateFormat.s,DoLog,DoBuild
Global LastPRGOutput.s,active
Global Repo.s

Procedure.s SearchPath(file.s)
  Protected ENVpath.s=GetPathPart(ProgramFilename())+";"+GetEnvironmentVariable("PATH")
  Protected i,path.s
  Protected ret.s=""
  path=GetCurrentDirectory()
  Repeat
    If Right(path,1)<>#ds
      path+#ds
    EndIf
    If FileSize(path+file)<>-1
      ret=path+file
      Break
    EndIf
    i+1
    path=StringField(ENVpath,i,";")
  Until path=""
  
  ProcedureReturn ret
EndProcedure
Procedure CreateDefaultIni()    
  Protected pbConfig.s,pbSource.s
  Protected out
  pbConfig=GetEnvironmentVariable("PB_TOOL_Preferences")
  CompilerIf #PB_Compiler_OS=#PB_OS_Windows
    If pbconfig=""
      pbConfig=GetEnvironmentVariable("APPDATA")+"\PureBasic\PureBasic.prefs"
    EndIf
  CompilerEndIf
  
  pbSource=GetCurrentDirectory()
    
  If OpenPreferences(pbConfig)
    PreferenceGroup("Global")
    pbSource=ReadPreferenceString("SourceDirectory",pbSource)
    If ReadPreferenceInteger("MemorizeCursor",0)
      MessageRequester(#title,"I recommend to disable in PB IDE"+#LF$+"Preference > Editor > Memorize Cursor Position")
    EndIf
    ClosePreferences()
  EndIf
  
  out=CreateFile(#PB_Any,#GithelperINI)
  If out
    WriteStringN(out,"[Global]")
    WriteStringN(out,"git = "+SearchPath(#gitPRG))
    WriteStringN(out,"git-gui = "+SearchPath(#gitguiPRG))
    WriteStringN(out,"gitk = "+SearchPath(#gitkPRG))
    WriteStringN(out,"ProjectRoot = "+pbSource)
    WriteStringN(out,"DateFormat = "+#DateFormat)
    WriteStringN(out,"DoLog = 0")
    WriteStringN(out,"DoBuildNo = 0")
    WriteStringN(out,"")
    
    WriteStringN(out,"; https://git-scm.com/docs/gitignore")
    WriteStringN(out,"[Default .gitignore]")
    WriteStringN(out,"# Object files")
    WriteStringN(out,"*.o")
    WriteStringN(out,"*.ko")
    WriteStringN(out,"*.obj")
    WriteStringN(out,"*.elf")
    WriteStringN(out,"#")
    WriteStringN(out,"# Linker output")
    WriteStringN(out,"*.ilk")
    WriteStringN(out,"*.Map")
    WriteStringN(out,"*.exp")
    WriteStringN(out,"#")
    WriteStringN(out,"# Libraries")
    WriteStringN(out,"#*.lib")
    WriteStringN(out,"#*.a")
    WriteStringN(out,"#*.la")
    WriteStringN(out,"#*.lo")
    WriteStringN(out,"#")
    WriteStringN(out,"# Shared objects (inc. Windows DLLs)")
    WriteStringN(out,"#*.dll")
    WriteStringN(out,"#*.so")
    WriteStringN(out,"#*.so.*")
    WriteStringN(out,"#*.dylib")
    WriteStringN(out,"#")
    WriteStringN(out,"# Executables")
    WriteStringN(out,"*.exe")
    WriteStringN(out,"*.out")
    WriteStringN(out,"*.app")
    WriteStringN(out,"*.i*86")
    WriteStringN(out,"*.x86_64")
    WriteStringN(out,"*.hex")
    WriteStringN(out,"#")
    WriteStringN(out,"# Others")
    WriteStringN(out,"*.pre.pb")
    WriteStringN(out,"*.asm")
    WriteStringN(out,#GitLog)
    WriteStringN(out,".gitignore")
    WriteStringN(out,#GitBuildNoFile)
    
    WriteStringN(out,"")
    WriteStringN(out,"; https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables")
    WriteStringN(out,"[Environment]")
    WriteStringN(out,"GIT_EDITOR = "+#DQUOTE$+SearchPath(#editorPRG)+#DQUOTE$)
    WriteStringN(out,"GIT_AUTHOR_NAME = "+UserName())
    WriteStringN(out,"GIT_AUTHOR_EMAIL = pb@pb.pb")
    WriteStringN(out,"GIT_AUTHOR_DATE = "+Str(Date()))
    CloseFile(out)
  EndIf
EndProcedure

Global LogOut
Procedure CloseLog()
  If LogOut
    CloseFile(LogOut)
    LogOut=0
  EndIf
EndProcedure
Procedure OpenLog(wdir.s)
  CloseLog()
  If DoLog
    LogOut=OpenFile(#PB_Any,wdir+#GitLog,#PB_File_Append|#PB_File_SharedRead|#PB_File_SharedWrite|#PB_File_NoBuffering)
  EndIf  
EndProcedure
Procedure AddLog(txt.s)
  Debug txt
  If LogOut
    WriteStringN(LogOut,FormatDate(DateFormat,Date())+txt)    
  EndIf
EndProcedure

Procedure CreateGitIgnore(path.s)
  Protected out
  out=CreateFile(#PB_Any,path+".gitignore")
  If out
    
    If OpenPreferences(#GithelperINI)
      PreferenceGroup("Default .gitignore")
      
      If ExaminePreferenceKeys()
        While  NextPreferenceKey()
          WriteStringN(out,PreferenceKeyName())
        Wend
      EndIf
      ClosePreferences()
      
    EndIf
    CloseFile(out)
  EndIf
EndProcedure

Procedure.i RunPRG(prg.s,cmd.s,wdir.s)
  Protected prgid
  Protected output.s,exitcode
  
  OpenLog(wdir)
  
  LastPRGOutput=""
  
  prgid = RunProgram(prg, cmd, wdir, #PB_Program_Open | #PB_Program_Read|#PB_Program_Error|#PB_Program_Hide)
  AddLog("[RunProgram]"+prg+" "+cmd+" "+wdir)
  
  If prgid
    While ProgramRunning(prgid)
      If AvailableProgramOutput(prgid)
        Output=ReadProgramString(prgid) 
        AddLog("[Output]"+output)
        LastPRGOutput+output+#LF$
      EndIf
    Wend
    Repeat
      output=ReadProgramError(prgid)
      If output=""
        Break
      EndIf
      LastPRGOutput+output+#LF$
      AddLog("[Error]"+output)
    ForEver  
    exitcode=ProgramExitCode(prgid)
    AddLog("[ExitCode]"+exitcode)
    
    CloseProgram(prgid) ; Close the connection to the program
  EndIf
  
  CloseLog()
  ProcedureReturn exitcode
EndProcedure
Procedure.s GetDefaultBranch()
  Protected i,branch.s,ret.s
  
  If RunPRG(GitPRG,"branch -a --no-color",ProjectRoot+repo+#ds)=0
    i=0
    Repeat
      i+1
      branch=StringField(LastPRGOutput,i,#LF$)
      If branch="":Break:EndIf
      If Left(branch,1)="*"
        ret=Mid(branch,3)
        Break
      EndIf
    ForEver
  EndIf
  ProcedureReturn ret
EndProcedure
Procedure Commit(message.s)
  Protected check
  Protected no.q,add.s
  Protected ret=1
  
  If message=""
    check=#True
    message=InputRequester(#title,"Enter Commit Message for "+repo,"")
  EndIf
  
  If message<>""
    If RunPRG(GitPRG,"add --all",ProjectRoot+repo+#ds)=0
      
      If DoBuild
        OpenPreferences(ProjectRoot+repo+#ds+#GitBuildNoFile)
        no=ReadPreferenceQuad("#GitBuildNo",1)
        ;WritePreferenceQuad("#GitBuildNo",no)
        ClosePreferences()
        add="["+Str(no)+"] "
      EndIf  
      
      If RunPRG(GitPRG,"commit -m "+#DQUOTE$+add+message+#DQUOTE$,ProjectRoot+repo+#ds)=0
        ret=0
      ElseIf FindString(LastPRGOutput,"nothing to commit, working tree clean")
        If check=#False
          ret=0
        ElseIf MessageRequester(#title,"Commit fail:"+#LF$+#LF$+LastPRGOutput+#LF$+"Allow Empty?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
          ret= RunPRG(GitPRG,"commit --allow-empty -m "+#DQUOTE$+message+#DQUOTE$,ProjectRoot+repo+#ds)
        EndIf
      EndIf      
      
    EndIf
    
    If ret
      MessageRequester(#title,"Can't commit."+#LF$+LastPRGOutput)
    ElseIf DoBuild
      OpenPreferences(ProjectRoot+repo+#ds+#GitBuildNoFile)
      WritePreferenceQuad("#GitBuildNo",no+1)
      ClosePreferences()      
    EndIf
      
  EndIf
EndProcedure

Procedure Tag(tag.s)
  If tag=""
    tag=InputRequester(#title,"Enter Tag","")
  EndIf 
  If tag<>""
    If RunPRG(GitPRG,"tag "+#DQUOTE$+tag+#DQUOTE$,ProjectRoot+repo+#ds)
      
      If FindString(LastPRGOutput,"already exists")
        If MessageRequester(#title,"Can't add a Tag:"+#LF$+#LF$+LastPRGOutput+#LF$+"Replace Tag?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
          If RunPRG(GitPRG,"tag -f "+#DQUOTE$+tag+#DQUOTE$,ProjectRoot+repo+#ds)
            MessageRequester(#title,"Can't add a Tag."+#LF$+LastPRGOutput)
          EndIf
        EndIf
      Else
        
        MessageRequester(#title,"Can't add a Tag."+#LF$+LastPRGOutput)
      EndIf
      
    EndIf
  EndIf
EndProcedure


Enumeration menu
  #mNew
  #mCheckout
  #mDelete
  #mForceDelete
  #mExit
  #mMerge
  #mRename
  #mCommit
  #mContext
  #mRebase
  #mRebaseContinue
  #mRebaseAbort
  
  #mRefresh
    
  #mBranch
  #mGui
  #mViewHistory
  #mViewAllHistroy
  #mOpenLog
  #mTag
EndEnumeration

Procedure ShowFile(file.s)
  Protected IDE.s
  Protected ext.s
  Protected in,lineNb,line.s,res
  ide=GetEnvironmentVariable("PB_TOOL_IDE")
  
  CompilerIf #PB_Compiler_Debugger
    If ide=""
      If FileSize("C:\Program Files\PureBasic\PureBasic.exe")>0
        ide="C:\Program Files\PureBasic\PureBasic.exe"
        Debug "FALLBACK FIND IDE"
      EndIf
    EndIf
  CompilerEndIf
  
  If ide<>""
    ext=UCase(GetExtensionPart(file))
    If ext="PB" Or ext="PBI"
      in= ReadFile(#PB_Any,file,#PB_File_SharedRead|#PB_File_SharedWrite)
      
      If in
        While Not Eof(in)
          line=ReadString(in)
          lineNb+1
          If line = "======="
            res=lineNb
            Break
          EndIf          
        Wend
        CloseFile(in)
        
        
        If res
          RunProgram(ide,#DQUOTE$+file+#DQUOTE$+" /L "+Str(res),GetFilePart(ide))
        Else
          RunProgram(ide,#DQUOTE$+file+#DQUOTE$,GetFilePart(ide))
        EndIf
      EndIf
      
    Else
      RunProgram(file)
    EndIf
    
  Else
    RunProgram(file)
  EndIf
EndProcedure

Procedure SetBuildBranch(branch.s)
  Protected set.s
  If DoBuild
    OpenPreferences(ProjectRoot+repo+#ds+#GitBuildNoFile)
    set=ReadPreferenceString("#GitBranch","")
    If set<>#DQUOTE$+branch+#DQUOTE$
      WritePreferenceString("#GitBranch",#DQUOTE$+branch+#DQUOTE$)
    EndIf
    ClosePreferences()
  EndIf
EndProcedure


Procedure Branch_Switch(gBranch,gOutput,NewActive)
  Protected branch.s,state.i
  branch=GetGadgetItemText(gBranch,NewActive)
  If runprg(GitPRG,"checkout "+#DQUOTE$+branch+#DQUOTE$,ProjectRoot+repo+#ds)=0   
    
    state=GetGadgetItemState(gBranch,active)
    SetGadgetItemState(gBranch,active,state & ~#PB_ListIcon_Checked)
    active=NewActive
    state=GetGadgetItemState(gBranch,active)
    SetGadgetItemState(gBranch,active,state | #PB_ListIcon_Checked)
    SetBuildBranch(branch)
  Else
    MessageRequester(#Title,"Cant't switch to "+branch+#LF$+LastPRGOutput)
    state=GetGadgetItemState(gBranch,active)
    If state&#PB_ListIcon_Checked=0
      SetGadgetItemState(gBranch,active,state|#PB_ListIcon_Checked)
    EndIf
  EndIf
  
  SetGadgetText(gOutput,LastPRGOutput)
  
  ProcedureReturn active
EndProcedure
Procedure Branch_FillStatus(gStatus)
  Protected i,status.s
  ClearGadgetItems(gStatus)
  If RunPRG(GitPRG,"status -s",ProjectRoot+repo+#ds)=0
    i=0
    Repeat
      i+1
      status=StringField(LastPRGOutput,i,#LF$)
      If status=""
        If i=1
          AddGadgetItem(gStatus,-1,"-"+#LF$+"-"+#LF$)
        EndIf
        Break
      EndIf
      AddGadgetItem(gStatus,-1,
                    Left(status,1)+#LF$+
                    Mid(status,2,1)+#LF$+
                    Mid(status,4))
      SetGadgetItemColor(gStatus,i-1,#PB_Gadget_FrontColor,RGB(0,$70,0),0)
      SetGadgetItemColor(gStatus,i-1,#PB_Gadget_FrontColor,RGB($70,0,0),1)
    ForEver
   
  EndIf
EndProcedure

Procedure Branch_FillList(gBranch)
  Protected i,branch.s
  Protected info.s
  ClearGadgetItems(gBranch)
  If RunPRG(GitPRG,"branch -a --no-color",ProjectRoot+repo+#ds)=0
    i=0
    Repeat
      i+1
      info=StringField(LastPRGOutput,i,#LF$)
      branch=Mid(info,3)
      If branch="":Break:EndIf
      If Left(info,1)="*"
        active.i=i-1
        
        SetBuildBranch(branch)        
        
      EndIf
      AddGadgetItem(gBranch,-1,branch)
    ForEver
    
    SetGadgetState(gBranch,active)
    SetGadgetItemState(gBranch,active,#PB_ListIcon_Checked|#PB_ListIcon_Selected)
    SetActiveGadget(gBranch)
  EndIf
  ProcedureReturn active
EndProcedure
Procedure Branch_ShowMenu(win,gBranch,PM_Entry,PM_Empty,PM_Rebase)
  Protected state=GetGadgetState(gBranch)
  If Left(GetGadgetItemText(gBranch,0),20)="(no branch, rebasing"
    DisplayPopupMenu(PM_Rebase,WindowID(win))
  ElseIf state>=0
    DisableMenuItem(PM_Entry,#mDelete,Bool(state=active))
    DisableMenuItem(PM_Entry,#mForceDelete,Bool(state=active))
    DisableMenuItem(PM_Entry,#mMerge,Bool(state=active))
    DisableMenuItem(PM_Entry,#mCheckout,Bool(state=active))
    DisableMenuItem(PM_Entry,#mRebase,Bool(state=active))
    DisableMenuItem(PM_Entry,#mCommit,Bool(Not (state=active)))
    DisableMenuItem(PM_Entry,#mTag,Bool(Not (state=active)))
    SetMenuItemText(PM_Entry,#mNew,"New Branch from "+GetGadgetText(gBranch))
    SetMenuItemText(PM_Entry,#mViewHistory,GetGadgetText(gBranch))
    DisplayPopupMenu(PM_Entry,WindowID(win))
  Else
    DisplayPopupMenu(PM_Empty,WindowID(win))
  EndIf
EndProcedure
Procedure Branch_DoGit(gbranch,gOutput,Cmd.s,err.s)
  If RunPRG(GitPRG,cmd,ProjectRoot+repo+#ds)=0
    SetGadgetText(gOutput,LastPRGOutput)
    Branch_FillList(gBranch)
    ProcedureReturn #False
  Else
    SetGadgetText(gOutput,LastPRGOutput)
    MessageRequester(#Title,err+#LF$+LastPRGOutput)
    ProcedureReturn #True
  EndIf
EndProcedure

Procedure DoBranch()
  Protected Win
  Protected gBranch,gOutput,gHSplitter,gVSplitter,gStatus
  Protected i,branch.s,NewName.s,NewActive.i,file.s
  Protected event,state
  Protected PM_Empty
  Protected PM_Entry
  Protected PM_rebase
  Protected PM_status
  Protected w,h,sv,sh
  
  ;{ Create Popup menu
  PM_status=CreatePopupMenu(#PB_Any)
  MenuItem(#mRefresh,"Refresh")
  
  pm_rebase=CreatePopupMenu(#PB_Any)
  MenuItem(#mRebaseContinue,"Continue")
  MenuItem(#mRebaseAbort,"Abort")
    
  pm_empty=CreatePopupMenu(#PB_Any)
  MenuItem(#mNew,"New Branch")
  MenuItem(#mViewAllHistroy,"View History (All)")
  MenuItem(#mGui,"Open GUI")
  
  PM_Entry=CreatePopupMenu(#PB_Any)
  MenuItem(#mCheckout,"Checkout")
  MenuItem(#mNew,"New Branch from this")
  MenuItem(#mRename,"Rename")
  OpenSubMenu("Delete")
  MenuItem(#mDelete,"Confirm")
  OpenSubMenu("Force")
  MenuItem(#mForceDelete,"Confirm")
  CloseSubMenu()
  CloseSubMenu()
  OpenSubMenu("Merge")
  MenuItem(#mMerge,"Confirm")
  CloseSubMenu()
  OpenSubMenu("Rebase")
  MenuItem(#mRebase,"Confirm")
  CloseSubMenu()
  OpenSubMenu("View History")
  MenuItem(#mViewHistory,"")
  MenuItem(#mViewAllHistroy,"All")
  CloseSubMenu()
  MenuBar()
  MenuItem(#mCommit,"Commit")
  MenuItem(#mTag,"Tag")
  MenuItem(#mGui,"Open GUI")
  ;}
  
  OpenPreferences(#GithelperINI)
    PreferenceGroup("Window")
    w=ReadPreferenceInteger("width",400)
    h=ReadPreferenceInteger("height",300)
    sh=ReadPreferenceInteger("SplitterH",300-10-70)
    sv=ReadPreferenceInteger("SplitterV",(400-10)/2)
  ClosePreferences()  
  
  
  ;If RunPRG(GitPRG,"branch -a --no-color",ProjectRoot+repo+#ds)=0
    win=OpenWindow(#PB_Any,0,0,w,h,#Title+" - "+repo,#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_SizeGadget)
    If win
      
      AddKeyboardShortcut(win,#PB_Shortcut_Return,#mCheckout)
      AddKeyboardShortcut(win,#PB_Shortcut_Escape,#mExit)
      AddKeyboardShortcut(win,#PB_Shortcut_Apps,#mContext)
      AddKeyboardShortcut(win,#PB_Shortcut_F5,#mRefresh)
      
      gBranch=ListIconGadget(#PB_Any,0,0,W,h,"Branch",w-40,#PB_ListIcon_CheckBoxes|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
      
      gOutput=EditorGadget(#PB_Any,0,0,w,h,#PB_Editor_ReadOnly)
      
      gStatus=ListIconGadget(#PB_Any,0,0,w,h,"X",20,#PB_ListIcon_FullRowSelect)
      AddGadgetColumn(gStatus,1,"Y",20)
      AddGadgetColumn(gStatus,2,"File",40)
      
      gVSplitter=SplitterGadget(#PB_Any,5,5,w,h,gBranch,gStatus,#PB_Splitter_Vertical)
      
      
      gHSplitter=SplitterGadget(#PB_Any,
                                5,5,
                                WindowWidth(win)-10,WindowHeight(win)-10,
                                gVSplitter,gOutput,
                                #PB_Splitter_SecondFixed)
      
      SetGadgetState(gHSplitter,sh)
      SetGadgetState(gVSplitter,sv)
      
      
      ;active=Branch_FillList(gBranch)
      ;Branch_FillStatus(gStatus)
      
      SetGadgetColor(gOutput,#PB_Gadget_BackColor,RGB($e0,$e0,$e0))
      SetGadgetColor(goutput,#PB_Gadget_FrontColor,RGB($0,$0,$0))
      
      SetGadgetColor(gBranch,#PB_Gadget_BackColor,RGB($F0,$F0,$F0))
      SetGadgetColor(gBranch,#PB_Gadget_FrontColor,RGB($0,$0,$0))
      
      SetGadgetColor(gStatus,#PB_Gadget_BackColor,RGB($F0,$F0,$F0))
      SetGadgetColor(gStatus,#PB_Gadget_FrontColor,RGB($0,$0,$0))
            
      Repeat
        event=WaitWindowEvent()
        Select event
          Case #PB_Event_ActivateWindow
            Branch_FillList(gBranch)
            Branch_FillStatus(gStatus)
            
          Case #PB_Event_SizeWindow
            ResizeGadget(gHSplitter,
                         5,5,
                         WindowWidth(win)-10,WindowHeight(win)-10)
            
            
          Case #PB_Event_Menu ;{ Menu
            Select EventMenu()
              Case #mRefresh
                Branch_FillStatus(gStatus)
                
              Case #mContext
                Branch_ShowMenu(win,gBranch,PM_Entry,PM_Empty,PM_Rebase)
                
              Case #mViewAllHistroy
                RunProgram(GitkPRG,"--all",ProjectRoot+repo+#ds)
                
              Case #mViewHistory
                branch=GetGadgetText(gBranch)
                If branch
                  RunProgram(GitkPRG,#DQUOTE$+branch+#DQUOTE$,ProjectRoot+repo+#ds)
                Else
                  RunProgram(GitkPRG,"",ProjectRoot+repo+#ds)
                EndIf
                
              Case #mGui
                RunProgram(GitGuiPRG,"",ProjectRoot+repo+#ds)
                
              Case #mExit
                Break
                
              Case #mCheckout
                NewActive=GetGadgetState(gBranch)
                If NewActive<>active And NewActive>=0
                  active=Branch_Switch(gBranch,gOutput,NewActive)                    
                EndIf
                
              Case #mNew
                NewActive=GetGadgetState(gBranch)
                If NewActive>=0 And NewActive<>active
                  active=Branch_Switch(gBranch,gOutput,NewActive)
                EndIf
                If active=NewActive
                  branch=InputRequester(#title,"New Branch","")
                  If branch<>""
                    branch_DoGit(gBranch,gOutput,"checkout -b "+#DQUOTE$+branch+#DQUOTE$,"Can't create branch.")
                  EndIf
                EndIf
                
              Case #mRename
                branch=GetGadgetText(gBranch)
                If branch
                  NewName=InputRequester(#Title,"Rename branch "+branch,branch)
                  If NewName<>branch
                    Branch_DoGit(gBranch,gOutput,"branch -m "+#DQUOTE$+branch+#DQUOTE$+" "+#DQUOTE$+NewName+#DQUOTE$,"Can't rename branch.")
                  EndIf
                EndIf                
                
              Case #mForceDelete
                branch=GetGadgetText(gBranch)
                If branch<>""
                  Branch_DoGit(gBranch,gOutput,"branch -D "+#DQUOTE$+branch+#DQUOTE$,"Can't delete branch (force).")
                EndIf
                
              Case #mDelete
                branch=GetGadgetText(gBranch)
                If branch<>""
                  Branch_DoGit(gBranch,gOutput,"branch -d "+#DQUOTE$+branch+#DQUOTE$,"Can't delete branch.")
                EndIf
                
              Case #mMerge
                state=GetGadgetState(gbranch)
                If state<>active And state>=0
                  branch=GetGadgetText(gBranch)
                  Branch_DoGit(gBranch,gOutput,"merge "+#DQUOTE$+branch+#DQUOTE$,"Can't merge branch.")
                EndIf
                
              Case #mRebase
                branch=GetGadgetText(gBranch)
                If branch<>""
                  If Branch_DoGit(gBranch,gOutput,"rebase "+#DQUOTE$+branch+#DQUOTE$,"Can't rebase branch.")
                    active=Branch_FillList(gBranch)
                    Branch_FillStatus(gStatus)
                  EndIf
                EndIf  
                
              Case #mRebaseAbort
                Branch_DoGit(gBranch,gOutput,"rebase --abort","Can't abort rebase")
                Branch_FillStatus(gStatus)
                
              Case #mRebaseContinue
                If Branch_DoGit(gBranch,gOutput,"add --all","Can't add all.")=0
                  Branch_DoGit(gBranch,gOutput,"rebase --continue ","Can't continue rebase")
                  Branch_FillStatus(gStatus)
                EndIf
                
              Case #mTag
                If GetGadgetState(gBranch)=active
                  tag("")
                  SetGadgetText(gOutput,LastPRGOutput)
                EndIf
                
              Case #mCommit
                If GetGadgetState(gBranch)=active
                  Commit("")
                  SetGadgetText(gOutput,LastPRGOutput)
                  Branch_FillStatus(gStatus)
                EndIf
                
            EndSelect            
            ;}
                       
          Case #PB_Event_Gadget;{ Gadgets
            Select EventGadget()
              Case gStatus
                Select EventType()
                  Case #PB_EventType_RightClick
                    DisplayPopupMenu(PM_status,WindowID(win))
                    
                  Case #PB_EventType_LeftDoubleClick
                    state=GetGadgetState(gStatus)
                    If state>=0
                      file=GetGadgetItemText(gStatus,state,2)
                      If file<>""
                        ShowFile(ProjectRoot+repo+#ds+file)
                        ;runProgram(ProjectRoot+repo+#ds+file)
                      EndIf
                      
                    EndIf
                    
                EndSelect
                
                
              Case gVSplitter
                SetGadgetItemAttribute(gBranch,0,#PB_ListIcon_ColumnWidth,GadgetWidth(gBranch)-40,0)
                SetGadgetItemAttribute(gStatus,0,#PB_ListIcon_ColumnWidth,GadgetWidth(gStatus)-40-20-20,2)
                
              Case gBranch
                Select EventType()
                  Case #PB_EventType_RightClick
                    Branch_ShowMenu(win,gBranch,PM_Entry,PM_Empty,PM_Rebase)
                    
                  Case #PB_EventType_LeftDoubleClick
                    NewActive=GetGadgetState(gBranch)
                    If NewActive>=0 And NewActive<>active
                      active=Branch_Switch(gBranch,gOutput,NewActive)
                    EndIf
                    
                  Case #PB_EventType_Change
                    NewActive=Active
                    For i=0 To CountGadgetItems(gBranch)-1
                      state=GetGadgetItemState(gBranch,i)
                      If state&#PB_ListIcon_Checked And active<>i
                        NewActive=i
                        SetGadgetItemState(gBranch,i,state & ~#PB_ListIcon_Checked)
                      EndIf  
                    Next
                    If NewActive=active
                      state=GetGadgetItemState(gBranch,active)
                      If state&#PB_ListIcon_Checked=0
                        SetGadgetItemState(gBranch,active,state|#PB_ListIcon_Checked)
                      EndIf
                    Else
                      active=Branch_Switch(gBranch,gOutput,NewActive)
                    EndIf  
                EndSelect
            EndSelect
            ;}
            
        EndSelect
        
      Until event=#PB_Event_CloseWindow
      If WindowWidth(win)<>w Or WindowHeight(win)<>h Or GetGadgetState(gHSplitter)<>sh Or GetGadgetState(gVSplitter)<>sv
        OpenPreferences(#GithelperINI)
        PreferenceGroup("Window")
        WritePreferenceInteger("width",WindowWidth(win))
        WritePreferenceInteger("height",WindowHeight(win))
        WritePreferenceInteger("SplitterH",GetGadgetState(gHSplitter))
        WritePreferenceInteger("SplitterV",GetGadgetState(gVSplitter))
        ClosePreferences()  
      EndIf
          
      CloseWindow(win)
      
    EndIf
    
  ;EndIf  
EndProcedure

Procedure.s DoMenu()
  Protected win
  Protected pm_main
  Protected event
  Protected command.s

  pm_main=CreatePopupMenu(#PB_Any)
  MenuItem(#mCommit,"Commit")
  MenuItem(#mTag,"Tag")
  MenuItem(#mBranch,"Branch")
  MenuItem(#mGui,"Gui")
  OpenSubMenu("View History")
  MenuItem(#mViewHistory,GetDefaultBranch())
  MenuItem(#mViewAllHistroy,"All")
  CloseSubMenu()
  If DoLog
    MenuItem(#mOpenLog,"Open Log")
  EndIf  
  win=OpenWindow(#PB_Any,0,0,10,10,"dummy",#PB_Window_Invisible)
  If win
    While WindowEvent():Wend
    DisplayPopupMenu(pm_main,WindowID(win))
    Repeat
      event=WaitWindowEvent(1000)
      If event=0
        Break
      EndIf
      If event=#PB_Event_Menu 
        Select EventMenu()
          Case #mTag:command="TAG"            
          Case #mCommit:command="COMMIT"
          Case #mBranch:command="BRANCH"
          Case #mGUI:command="GUI"
          Case #mViewHistory:command="VIEWHISTORY"
          Case #mViewAllHistroy:Command="VIEWALLHISTORY"
          Case #mOpenLog:command="OPENLOG"
        EndSelect
        Break
      EndIf
    ForEver
    CloseWindow(win)
  EndIf
  ProcedureReturn command
EndProcedure

;- Create ini
If FileSize(#GithelperINI)<=0
  CreateDefaultIni()
  RunProgram(#GithelperINI,"",GetCurrentDirectory(),#PB_Program_Wait)  
EndIf

;- Read ini
If OpenPreferences(#GithelperINI)
  PreferenceGroup("Global")
  GitPRG=ReadPreferenceString("git","")
  GitGuiPRG=ReadPreferenceString("git-gui","")
  GitkPRG=ReadPreferenceString("gitk","")
  ProjectRoot=ReadPreferenceString("ProjectRoot","")
  DateFormat=ReadPreferenceString("DateFormat",#DateFormat)
  DoLog=ReadPreferenceInteger("DoLog",99)
  If DoLog=99
    DoLog=1
    WritePreferenceInteger("DoLog",dolog)
  EndIf
  DoBuild=ReadPreferenceInteger("DoBuildNo",99)
  If DoBuild=99
    DoBuild=0
    WritePreferenceInteger("DoBuildNo",DoBuild)
  EndIf
  
  PreferenceGroup("Environment")
  If ExaminePreferenceKeys()
    While  NextPreferenceKey() ; While a key exists
      SetEnvironmentVariable(PreferenceKeyName(),PreferenceKeyValue())
    Wend
  EndIf    
  ClosePreferences()
      
EndIf


;-Get Repo name
Define SourceFile.s
SourceFile=ProgramParameter()
If Left(SourceFile,Len(ProjectRoot))=ProjectRoot
  repo= Mid(SourceFile,Len(ProjectRoot)+1)
  repo=Left(repo,FindString(repo,#ds)-1)
EndIf
If repo=""
  Debug "no repo"
  End
EndIf  

;-Git already initalised?
If FileSize(ProjectRoot+repo+#ds+".git")<>-2
  CreateGitIgnore(ProjectRoot+repo+#ds)
  If RunPRG(GitPRG,"init",ProjectRoot+repo+#ds)<>0
    MessageRequester(#Title,"Can't initalize git, see log.")
    End
  Else
    commit("Initial Version")
    SetBuildBranch(GetDefaultBranch())
  EndIf
EndIf

;-Command
Define command.s=ProgramParameter() 
  
If UCase(command)="MENU"
  command=DoMenu()
EndIf

Select UCase(command)
  Case "COMMIT"
    commit(ProgramParameter())
  Case "GUI"
    RunProgram(GitGuiPRG,"",ProjectRoot+repo+#ds)
  Case "VIEWHISTORY"
    RunProgram(GitkPRG,GetDefaultBranch(),ProjectRoot+repo+#ds)
  Case "VIEWALLHISTORY"
    RunProgram(GitkPRG,"--all",ProjectRoot+repo+#ds)
  Case "OPENLOG"
    RunProgram(#GitLog)
  Case "BRANCH"
    DoBranch()
  Case "TAG"  
    tag(ProgramParameter())
  Case ""
    End
  Default
    MessageRequester(#Title,"Unkown command"+#LF$+command)
EndSelect

Zuletzt geändert von GPI am 31.05.2017 19:01, insgesamt 2-mal geändert.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [IDE-Tool] GitHelper

Beitrag von RSBasic »

Super Idee und danke für das Tool. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: [IDE-Tool] GitHelper

Beitrag von helpy »

Nette Idee!

Ich finde TortoiseGit auch recht gut.
Bin das bereits von TortoiseSVN und TortoiseHG gewohnt und mag die Bedienung ausgehend vom Windows Explorer lieber als jegliche IDE-Integration.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: [IDE-Tool] GitHelper

Beitrag von Sicro »

Gute Arbeit :)

Jedoch packt man in den seltensten Fällen alle Änderungen in einen Commit, sondern teilt sie sinnvoll in kleine Commits auf.
Dein Programm ist also überwiegend eher für einfaches Versionieren ausgelegt.
Es ist aber eine super Alternative zur in PB integrierten Sitzungsgeschichte-Funktion.

Ich arbeite aber lieber im Terminal mit Git. So habe ich maximale Flexibilität und maximalen Funktionsumfang. Dazu ein grafischen History-Viewer.

Vor längerer Zeit habe ich ebenfalls mal eine Git-Integration für PB angefangen, aber seit dem nicht mehr weiterentwickelt.
Vielleicht kannst du von dem Code ja was gebrauchen:

Code: Alles auswählen

Enumeration Dialog
  #Dialog_MainWindow
EndEnumeration

Runtime Enumeration Window
  #Window_Main
EndEnumeration

Runtime Enumeration Gadget
  #ComboBox_Branches
  #Button_CreateBranch
  #Button_RemoveBranch
  #Button_Status
  #Button_Log
  #Button_AddChanges
  #Button_Commit
  #ListView_LogList
EndEnumeration

DeclareModule GIT
  Declare.s Init(RepositoryPath$)
  Declare.s Config(RepositoryPath$, UserName$, UsereMail$)
  Declare.s Add(RepositoryPath$, File$)
  Declare.i ListStatus(RepositoryPath$, ListGadget)
  Declare.s Commit(RepositoryPath$, Message$)
  Declare.s CreateBranch(RepositoryPath$, BranchName$)
  Declare.i ListBranches(RepositoryPath$, ListGadget)
  Declare.s RemoveBranch(RepositoryPath$, BranchName$)
  Declare.s Checkout(RepositoryPath$, BranchName$)
  Declare.s Merge(RepositoryPath$, BranchName$)
  Declare.s ReBase(RepositoryPath$, BranchName$)
  Declare.i ListLog(RepositoryPath$, ListGadget)
EndDeclareModule
Module GIT
  Procedure ClearGadgetItems_Workaround(ListGadget)
    Protected CountOfItems, i
    
    CountOfItems = CountGadgetItems(ListGadget)
    For i = 0 To CountOfItems - 1
      RemoveGadgetItem(ListGadget, 0)
    Next
  EndProcedure
  
  Procedure.s Init(RepositoryPath$)
    Protected Program, Result$
    
    Program = RunProgram("git", "init", RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.s Config(RepositoryPath$, UserName$, UsereMail$)
    Protected Program, Result$
    
    Program = RunProgram("git", "config --local user.name " + #DQUOTE$ + UserName$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      Result$ + #CRLF$ + #CRLF$
      
      Program = RunProgram("git", "config --local user.email " + #DQUOTE$ + UsereMail$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
      If Program
        While ProgramRunning(Program)
          If AvailableProgramOutput(Program)
            Result$ + ReadProgramString(Program) + #CRLF$
          EndIf
        Wend
        CloseProgram(Program)
      EndIf
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.s Add(RepositoryPath$, Files$)
    Protected Program, Result$
    
    Program = RunProgram("git", "add " + Files$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.i ListStatus(RepositoryPath$, ListGadget)
    Protected Program, Result$
    
    ClearGadgetItems_Workaround(ListGadget)
    
    ; --procelain liefert eine einfachere Ausgabe, die besser verarbeitet werden kann
    Program = RunProgram("git", "status --porcelain", RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ = ReadProgramString(Program)
          
          Select Left(Result$, 3)
            Case "?? " ; Datei ist GIT noch nicht bekannt
              Result$ = "UnkownFile: " + Mid(Result$, 4)
            Case "M  " ; Modifizierte Datei ist zum Commit vorgemerkt
              Result$ = "ModifitedFileMarkedForCommit: " + Mid(Result$, 4)
            Case " M " ; Modifizierte Datei ist NICHT zum Commit vorgemerkt
              Result$ = "ModifitedFileNotMarkedForCommit: " + Mid(Result$, 4)
            Case "A  " ; Neue Datei ist zum Commit vorgemerkt
              Result$ = Mid(Result$, 4)
              Result$ = Trim(Result$, #DQUOTE$)
              Result$ = "NewFileMarkedForCommit: " + Result$
            Case " A " ; Neue Datei ist NICHT zum Commit vorgemerkt
              Result$ = Mid(Result$, 4)
              Result$ = Trim(Result$, #DQUOTE$)
              Result$ = "NewFileNotMarkedForCommit: " + Result$
            Case "D  " ; Gelöschte Datei ist zum Commit vorgemerkt
              Result$ = Mid(Result$, 4)
              Result$ = Trim(Result$, #DQUOTE$)
              Result$ = "DeletedFileMarkedForCommit: " + Result$
            Case " D " ; Gelöschte Datei ist NICHT zum Commit vorgemerkt
              Result$ = Mid(Result$, 4)
              Result$ = Trim(Result$, #DQUOTE$)
              Result$ = "DeletedFileNotMarkedForCommit: " + Result$
          EndSelect
          AddGadgetItem(ListGadget, -1, Result$)
        EndIf
      Wend
      CloseProgram(Program)
      
      If CountGadgetItems(ListGadget) = 0
        AddGadgetItem(ListGadget, -1, "No changes are exists")
      EndIf
      
      ProcedureReturn #True
    EndIf
  EndProcedure
  
  Procedure.s Commit(RepositoryPath$, Message$)
    Protected Program, Result$
    
    Program = RunProgram("git", "commit -m " + #DQUOTE$ + Message$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.s CreateBranch(RepositoryPath$, BranchName$)
    Protected Program, Result$
    
    Program = RunProgram("git", "branch " + #DQUOTE$ + BranchName$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.i ListBranches(RepositoryPath$, ListGadget)
    Protected Program, Result$, ActiveItem
    
    ClearGadgetItems_Workaround(ListGadget)
    
    Program = RunProgram("git", "branch", RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ = ReadProgramString(Program)
          Result$ = Trim(Result$)
          If Left(Result$, 1) = "*"
            ActiveItem = CountGadgetItems(ListGadget)
            Result$ = Mid(Result$, 3)
          EndIf
          AddGadgetItem(ListGadget, -1, Result$)
        EndIf
      Wend
      CloseProgram(Program)
      SetGadgetState(ListGadget, ActiveItem)
      
      ProcedureReturn #True
    EndIf
  EndProcedure
  
  Procedure.s RemoveBranch(RepositoryPath$, BranchName$)
    Protected Program, Result$
    
    Program = RunProgram("git", "branch -D " + BranchName$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.s Checkout(RepositoryPath$, BranchName$)
    Protected Program, Result$
    
    Program = RunProgram("git", "checkout " + #DQUOTE$ + BranchName$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.s Merge(RepositoryPath$, BranchName$)
    Protected Program, Result$
    
    Program = RunProgram("git", "merge " + #DQUOTE$ + BranchName$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.s ReBase(RepositoryPath$, BranchName$)
    Protected Program, Result$
    
    Program = RunProgram("git", "rebase " + #DQUOTE$ + BranchName$ + #DQUOTE$, RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ + ReadProgramString(Program) + #CRLF$
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn Result$
    EndIf
  EndProcedure
  
  Procedure.i ListLog(RepositoryPath$, ListGadget)
    Protected Program, Result$
    
    ClearGadgetItems_Workaround(ListGadget)
    
    Program = RunProgram("git", "log --graph --decorate --tags", RepositoryPath$, #PB_Program_Open | #PB_Program_Read)
    If Program
      While ProgramRunning(Program)
        If AvailableProgramOutput(Program)
          Result$ = ReadProgramString(Program)
          AddGadgetItem(ListGadget, -1, Result$)
        EndIf
      Wend
      CloseProgram(Program)
      
      ProcedureReturn #True
    EndIf
  EndProcedure
EndModule

Procedure OpenMainWindow()
  Protected XML$
  Protected XML
  
  XML$ = "<window id='#Window_Main' name='MainWindow' text='PB-GIT' flags='#PB_Window_ScreenCentered | #PB_Window_Invisible'>" +
         "  <vbox>" +
         "    <hbox>" +
         "      <combobox id='#ComboBox_Branches' width='200'/>" +
         "      <empty width='50'/>" +
         "      <button id='#Button_CreateBranch' text='Add branch'/>" +
         "      <button id='#Button_RemoveBranch' text='Remove branch'/>" +
         "      <button id='#Button_Status' text='Get status'/>" +
         "      <button id='#Button_Log' text='Get log'/>" +
         "      <button id='#Button_AddChanges' text='Add changes'/>" +
         "      <button id='#Button_Commit' text='Commit'/>" +
         "    </hbox>" +
         "    <frame text='Log'>" +
         "      <listview id='#ListView_LogList' width='600' height='600'/>" +
         "    </frame>" +
         "  </vbox>" +
         "</window>"
  
  XML = CatchXML(#PB_Any, @XML$, StringByteLength(XML$))
  If XML = 0 : ProcedureReturn #False : EndIf
  
  If XMLStatus(XML) <> #PB_XML_Success
    FreeXML(XML)
    ProcedureReturn #False
  EndIf
  
  If Not CreateDialog(#Dialog_MainWindow)
    FreeXML(XML)
    ProcedureReturn #False
  EndIf
  
  If Not OpenXMLDialog(#Dialog_MainWindow, XML, "MainWindow")
    FreeXML(XML)
    FreeDialog(#Dialog_MainWindow)
    ProcedureReturn #False
  EndIf
  
  HideWindow(#Window_Main, #False)
  
  ProcedureReturn #True
EndProcedure

Define RepositoryPath$ = "!!! SET YOUR REPOSITORY PATH HERE !!!"
Define Result$

If OpenMainWindow()
  GIT::ListBranches(RepositoryPath$, #ComboBox_Branches)
  GIT::ListLog(RepositoryPath$, #ListView_LogList)
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case #ComboBox_Branches
          If EventType() = #PB_EventType_Change And GetGadgetText(#ComboBox_Branches) <> ""
            GIT::Checkout(RepositoryPath$, LTrim(GetGadgetText(#ComboBox_Branches), "*"))
            GIT::ListBranches(RepositoryPath$, #ComboBox_Branches)
            GIT::ListLog(RepositoryPath$, #ListView_LogList)
          EndIf
        Case #Button_CreateBranch
          Result$ = InputRequester("Create branch", "Define the name of the new branch:", "")
          If Result$
            If GIT::CreateBranch(RepositoryPath$, Result$) = ""
              GIT::Checkout(RepositoryPath$, Result$)
              GIT::ListBranches(RepositoryPath$, #ComboBox_Branches)
              GIT::ListLog(RepositoryPath$, #ListView_LogList)
            Else
              MessageRequester("Create branch", Result$)
            EndIf
          EndIf
        Case #Button_RemoveBranch
          Result$ = InputRequester("Remove branch", "Enter the name of the branch which should be removed.", "")
          If Result$
            Result$ = GIT::RemoveBranch(RepositoryPath$, Result$)
            If Result$
              GIT::ListBranches(RepositoryPath$, #ComboBox_Branches)
              GIT::ListLog(RepositoryPath$, #ListView_LogList)
              MessageRequester("Remove branch", Result$)
            Else
              MessageRequester("Remove branch", "Branch can not be removed, because you are working in this branch or anything else!")
            EndIf
          EndIf
        Case #Button_Status
          GIT::ListStatus(RepositoryPath$, #ListView_LogList)
        Case #Button_Log
          GIT::ListLog(RepositoryPath$, #ListView_LogList)
        Case #Button_AddChanges
          Result$ = InputRequester("Add changes", "Enter the file names of the files which should be added." + #CRLF$ +
                                                  "Separate more files per blank space." + #CRLF$ +
                                                  "File names with blank space must be enclosed into double quotes.", "")
          If Result$
            Result$ = GIT::Add(RepositoryPath$, Result$)
            If Result$
              MessageRequester("Add changes", Result$)
            EndIf
          EndIf
        Case #Button_Commit
          Result$ = InputRequester("Commit", "Enter a message for the commit", "")
          If Result$
            Result$ = GIT::Commit(RepositoryPath$, Result$)
          EndIf
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [IDE-Tool] GitHelper

Beitrag von GPI »

Die Frage ist halt, was man haben will. Wenn man nur einzelne Dateien mit "Commit" sichern will, muss man sie ja zwangsweise einzeln auswählen. Und dann wirds halt mit der IDE-Integration kompliziert. Das ist eigentlich nur auf einer Ebene möglich, die ich nicht zur verfügung hab - da wo der Procedure-Browser ist. Ich denke für diese Genauigkeit sind wohl die üblichen GUIs deutlich besser geeignet.

Ich wollte halt eine Lösung, wo ich nicht weiter nachdenken muss und in Hintergrund weiter läuft.

Ich hab doch noch ein bischen erweitert. Es gibt jetzt ein "Branch"-Commando, wo ein Branch-Fenster mit Basisfunktionen (Checkout, Neu, Umbennen, Merge, Löschen, Commit auslösen) ausführen kann. Konflikte bei Merge muss man manuell lösen :)

Wenn man einen Commit auslösen will und es keine geänderten Dateien gibt, dann gibt es zwei kleine Änderungen:
* Wenn man die Message vorgegeben hat (nicht durch den User eingegeben wird), dann wird sie einfach unterdrückt.
* Wenn der User die eingegeben hat, dann wird man gefragt, ob man ein leeren Commit erzeugen will.

Sinn der Sache ist, das man ab und zu öfters f5 drückt, ohne was zu ändern (bspw. nur an einer Config-Datei rumgefummelt) und da stört die Fehlermeldung einfach.
Genauso wenn man direkt nach den Testen eine Exe erstellen will und dementsprechend kein Commit erzeugt werden kann. Aber man möchte halt doch gerne den Stand mit einen gescheiten Namen versehen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: [IDE-Tool] GitHelper

Beitrag von helpy »

Jeder findet seinen Weg, wie er am besten arbeiten kann ;-)

Das finde ich super und es ist auch berreichernd für mich, Einblick zu bekommen in andere Wege.
Danke für's teilen!
Windows 10
PB Last Final / (Sometimes testing Beta versions)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: [IDE-Tool] GitHelper

Beitrag von GPI »

So, mir war ein bischen langweilig und ich hab es ein ganzes Stück erweitert:

Neue "Befehle" für die Commandozeile:
Menu
Öffnet ein Popup-Menü mit den gängigen Einstellungen. Praktisch, wenn man nicht tausend Menüeinträge haben will.

Tag [tagname]
Erstellt ein Tag. Wenn der Tag schon vergeben ist, wird auch automatisch nachgefragt, ob man ihn überschreiben will.

--
Das Branch-Fenster wurde gewaltig überarbeitet. Neben den Branchs wird jetzt der Datei-Status angezeigt und unten drunter gibts ein Textgadget, der die letzte Meldung von GIT enthält.

Zudem kann man jetzt auch Merge und Rebase nutzen. Bei einen Konflikt kann in Dateistatus die Dateien mit Konflikt sehen und doppelklicken. Allerdings ist mir da ein Bug in der PB-IDE aufgefallen. Wenn sich eine Datei mit einer alten Version in IDE geöffnet ist und man in Githelp auf die Datei doppelklickt, dann wird die Datei in IDE *NICHT* aktualisiert!

Das Branchfenster kann man jetzt auch in der Größe ändern und die Gadget-Größe durch zwei Splitter anpassen.

In der GitHelper.ini gibts eine neue Option "DoBuildNo" - wenn die aktiviert wird, dann erstellt GitHelper eine ".gitbuildno.pbi", die einen "Commit"-Counter und den aktuell gültigen Branch als Konstanten für PB enthält. Zudem wird bei jeden Commit ein "[no]" hinzugefügt.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten