Version control: Projects can be put under version control. A new Git repository is created for the project if no parent Git repository is found.

[DEVELOPMENT ENVIRONMENT]
* NEW: Version control: Projects can be put under version control. A new Git repository is created for the project if no parent Git repository is found.
* BUG: Editor: The message label now moves if the editor is resized.
This commit is contained in:
gambas 2017-10-28 16:13:39 +02:00
parent d583aa9480
commit 0026917f12
9 changed files with 323 additions and 75 deletions

View File

@ -14,6 +14,10 @@ Private $hLabelTimer As Timer
Private $hObserver As Observer
Private $iLastLine As Integer = -1
Private $bLabelBottom As Boolean
Private $iLabelX As Integer
Private $iLabelY As Integer
Static Private $sFindPrefix As String
Static Private $aFind As Integer[]
@ -205,6 +209,30 @@ Public Sub Label_MouseDown()
End
Private Sub MoveMessageLabel()
Dim X As Integer
Dim Y As Integer
If Not $hLabel Then Return
If Not $hLabel.Visible Then Return
If $bLabelBottom Then
X = 0
Y = Container(Me.Proxy).ClientH - $hLabel.H
Else
X = $iLabelX
Y = $iLabelY
Endif
X = Me.ScreenX + X - $hLabel.Parent.ScreenX
Y = Me.ScreenY + Y - $hLabel.Parent.ScreenY
If (Y + $hLabel.H) > $hLabel.Parent.ClientH Then Y -= $hLabel.H + Me.LineHeight
$hLabel.Move(X, Y)
End
Public Sub ShowMessageLabel(sStr As String, Optional X As Integer, Y As Integer, iStyle As Integer)
@ -231,19 +259,19 @@ Public Sub ShowMessageLabel(sStr As String, Optional X As Integer, Y As Integer,
$hLabel.Background = Color.Merge(Me.Styles[iStyle].Color, Style.BackgroundOf(Me), 0.3)
$hLabel.Text = "&nbsp;&nbsp;" & Replace(Replace(sStr, "<p>", " "), "<br>", " ") & "&nbsp;&nbsp;"
If IsMissing(X) Then X = 0
If IsMissing(Y) Then Y = Container(Me.Proxy).ClientH - $hLabel.H
X = Me.ScreenX + X - $hLabel.Parent.ScreenX
Y = Me.ScreenY + Y - $hLabel.Parent.ScreenY
If (Y + $hLabel.H) > $hLabel.Parent.ClientH Then Y -= $hLabel.H + Me.LineHeight
$hLabel.Move(X, Y)
If IsMissing(X) And If IsMissing(Y) Then
$bLabelBottom = True
Else
$bLabelBottom = False
$iLabelX = X
$iLabelY = Y
Endif
$hLabel.Show
$hLabel.Raise
$hLabelTimer.Stop
$hLabelTimer.Start
MoveMessageLabel
$hLabelTimer.Restart
Me.SetFocus
End
@ -312,3 +340,9 @@ Public Sub FindStrings(sPrefix As String) As Integer[]
Return $aFind
End
Public Sub Editor_Arrange()
MoveMessageLabel
End

View File

@ -1291,6 +1291,7 @@ Public Sub OnProjectChange()
'Action["breakerr"].Value = Project.BreakOnError
OnRefreshComponents
UpdateRunButton
'UpdateTranslate
'RefreshInfo
'IF $bHidden THEN HideAll
@ -2837,15 +2838,18 @@ End
Public Sub OnVersionControlChange()
If Not VersionControl.Enabled Then
mnuVersionControl.Hide
Else
mnuVersionControl.Show
Action["version-control"].Visible = VersionControl.Enabled
If VersionControl.Enabled Then
mnuVersionControl.Text = ("Version control") & " (" & VersionControl.Name & ")"
btnVersionControl.Text = VersionControl.Name
UpdateBranchMenu
Endif
mnuVersionControlWith.Children.Clear
VersionControl.InitControlProjectMenu(mnuVersionControlWith)
mnuVersionControlWith.Visible = mnuVersionControlWith.Children.Count
End
Public Sub mnuVcBranchSet_Click()

View File

@ -178,8 +178,9 @@
}
}
{ mnuVersionControl Menu
Action = "version-control"
Text = ("Version control")
Picture = Picture["icon:/small/calendar"]
Picture = Picture["icon:/small/record"]
{ mnuVcCommit Menu
Action = "vc-commit"
Text = ("Commit") & "..."
@ -205,6 +206,10 @@
Text = ("Branch")
}
}
{ mnuVersionControlWith Menu
Text = ("Put under version control")
Picture = Picture["icon:/small/record"]
}
{ mnuPublish Menu
Action = "publish"
Text = ("Publish") & "..."
@ -1199,7 +1204,7 @@
Border = False
}
{ timSearchProject #Timer
#MoveScaled(21,8)
#MoveScaled(21,9)
Delay = 500
}
}
@ -1704,6 +1709,7 @@
}
{ Action version-control
Text = "Version control"
Shortcut = ""
Picture = "icon:/small/record"
}
}

View File

@ -3,6 +3,7 @@
Create Static
Public Const Name As String = ""
Public Const LongName As String = ""
Public Const DoNotPush As Boolean = False
Public Sub AddFile((sPath) As String, Optional (bForce) As Boolean)
@ -88,3 +89,11 @@ End
Public Sub SetBranch((sBranch) As String)
End
Public Sub CanControlProject() As Boolean
End
Public Sub ControlProject() As Boolean
End

View File

@ -4,6 +4,7 @@ Inherits CVersionControl
Create Static
Public Const Name As String = "Git"
Public Const LongName As String = "Git"
Public Const DoNotPush As Boolean = True
Private $aConflict As String[] = ["DD", "AU", "UD", "UA", "DU", "AA", "UU"]
@ -11,22 +12,45 @@ Private $aConflict As String[] = ["DD", "AU", "UD", "UA", "DU", "AA", "UU"]
Private $bHasGit As Boolean
Private $bCheckGit As Boolean
Private $sRoot As String
Private $bCanControl As Boolean
Private $bCanInit As Boolean
Private Sub Init()
If $bCheckGit Then Return
$bHasGit = System.Exist("git")
$bCheckGit = True
End
Public Sub Check() As Boolean
Dim sResult As String
If Not $bCheckGit Then
$bHasGit = System.Exist("git")
$bCheckGit = True
Endif
Init()
If $bHasGit Then
sResult = VersionControl.Shell("cd " & Shell$(Project.Dir) & " && git rev-parse --show-toplevel")
If Process.LastValue = 0 Then
$sRoot = Trim(sResult)
Return True
sResult = VersionControl.Shell("cd " & Shell(Project.Dir) & " && git status --porcelain .project")
If Process.LastValue Then
$bCanInit = True
$bCanControl = False
Else
$bCanInit = False
$bCanControl = sResult Begins "??"
If Not $bCanControl Then
sResult = VersionControl.Shell("cd " & Shell$(Project.Dir) & " && git rev-parse --show-toplevel")
If Process.LastValue = 0 Then
$sRoot = Trim(sResult)
Return True
Endif
Endif
Endif
Endif
End
@ -205,7 +229,8 @@ Public Sub Commit(sChange As String, bDoNotPush As Boolean) As Boolean
Dim aEnv As String[]
File.Save(sFile, sChange)
VersionControl.Run(["git", "commit", "-F", sFile, Project.Dir], False, False, VersionControl.LANG_ENV)
'VersionControl.Run(["git", "commit", "-F", sFile, Project.Dir], False, False, VersionControl.LANG_ENV)
VersionControl.Shell("cd " & Shell(Project.Dir) & " && git commit -F " & Shell$(sFile) & " .", Project.Dir)
If Process.LastValue Then Return True
If Not bDoNotPush Then
@ -280,3 +305,28 @@ Public Sub UpdatePath(sPath As String, Optional sPath2 As String)
End
Public Sub CanControlProject() As Boolean
Return $bCanControl Or $bCanInit
End
Public Sub ControlProject() As Boolean
If Not CanControlProject() Then Return True
If $bCanInit Then
If Message.Warning(("A new Git repository will be created for this project."), ("OK"), ("Cancel")) = 2 Then Return
VersionControl.Shell("cd " & Shell(Project.Dir) & " && git init && git add .")
If Process.LastValue Then Return True
Else
VersionControl.Shell("cd " & Shell(Project.Dir) & " && git add .")
Endif
End

View File

@ -4,12 +4,14 @@ Inherits CVersionControl
Create Static
Public Const Name As String = "Svn"
Public Const LongName As String = "Subversion"
Private $sRealDir As String
Private $bHasSVN As Boolean
Private $bCheckSVN As Boolean
Private $sSvnVersion As String
Private $bSvn17 As Boolean
Private $bCanControl As Boolean
Private Sub SvnPath$(sPath As String) As String
@ -19,17 +21,12 @@ Private Sub SvnPath$(sPath As String) As String
End
Public Sub Check() As Boolean
Private Sub Init()
Dim sResult As String
If $bCheckSVN Then Return
Shell "readlink -f " & Shell$(Project.Dir) To $sRealDir
$sRealDir = Trim($sRealDir)
If Not $bCheckSVN Then
$bHasSVN = System.Exist("svn")
$bCheckSVN = True
Endif
$bHasSVN = System.Exist("svn")
$bCheckSVN = True
If $bHasSVN Then
@ -39,11 +36,44 @@ Public Sub Check() As Boolean
$bSvn17 = Comp($sSvnVersion, "1.7", gb.Natural) >= 0
Endif
Endif
End
Public Sub Check() As Boolean
Dim sResult As String
Dim sDir As String
Shell "readlink -f " & Shell$(Project.Dir) To $sRealDir
$sRealDir = Trim($sRealDir)
Init()
If $bHasSVN Then
$bCanControl = False
If $bSvn17 Then
sResult = VersionControl.Shell("svn status " & Shell$(SvnPath$($sRealDir) &/ ".project") & " 2>&1")
If Process.LastValue = 0 And If sResult Not Like "svn:*W155007*:*" And If sResult Not Like "svn:*W155010*:*" Then Return True
Else
Return Exist($sRealDir &/ ".svn")
If Exist($sRealDir &/ ".svn") Then Return True
Endif
If $bSvn17 Then
sDir = $sRealDir
Do
sDir = File.Dir(sDir)
If Exist(sDir &/ ".svn") Then
$bCanControl = True
Break
Endif
If sDir = "/" Then Break
Loop
Else
$bCanControl = Exist($sRealDir &/ "../.svn")
Endif
Endif
@ -330,3 +360,15 @@ Public Sub UpdatePath(sPath As String, Optional sPath2 As String)
End
Public Sub CanControlProject() As Boolean
Return $bCanControl
End
Public Sub ControlProject() As Boolean
If Not $bCanControl Then Return True
If VersionControl.Run(["svn", "add", "--parents", SvnPath$($sRealDir)]) Then Return True
End

View File

@ -1,20 +1,47 @@
' Gambas class file
Public Sub Run() As Boolean
Static Private $sText As String
Static Private $sDetail As String
Return Not Me.ShowModal()
Public Sub Run(sText As String, sDetail As String)
$sText = sText
$sDetail = Trim(sDetail)
Me.ShowModal()
End
Public Sub btnOK_Click()
Me.Close(TRUE)
End
Public Sub btnCancel_Click()
Me.Close
End
Public Sub Form_Open()
Dim DS, W, H As Integer
lblError.Text = $sText
If $sDetail Then
Project.SetEditorFont(lblDetail)
lblDetail.Text = $sDetail
DS = Desktop.Scale
lblDetail.Padding = DS
With lblDetail.Font
W = .TextWidth($sDetail)
H = .TextHeight($sDetail)
End With
Else
lblDetail.Hide
Endif
Me.Resize(Max(lblDetail.X + W + DS * 4, 48 * DS), lblDetail.Y + H + DS * 8)
End

View File

@ -1,27 +1,41 @@
# Gambas Form File 3.0
{ FVersionError Form
MoveScaled(0,0,64,64)
{ Form Form
MoveScaled(0,0,59,64)
Resizable = False
Arrangement = Arrange.Vertical
Spacing = True
Margin = True
{ HBox1 HBox
MoveScaled(1,59,62,4)
Spacing = True
{ Panel1 Panel
MoveScaled(4,0,4,4)
{ HBox2 HBox
MoveScaled(1,1,54,8)
Spacing = True
{ PictureBox1 PictureBox
MoveScaled(0,0,8,8)
Picture = Picture["icon:/huge/error"]
Stretch = True
}
{ lblError Label
MoveScaled(11,1,37,7)
Expand = True
}
}
{ lblDetail Label
MoveScaled(1,11,54,17)
Expand = True
Border = Border.Plain
}
{ btnOK Button
MoveScaled(29,0,16,4)
Text = ("OK")
Default = True
}
{ btnCancel Button
MoveScaled(46,0,16,4)
Text = ("Cancel")
Cancel = True
{ HBox1 HBox
MoveScaled(1,59,57,4)
Spacing = True
{ Panel1 Panel
MoveScaled(4,0,4,4)
Expand = True
}
{ btnOK Button
MoveScaled(40,0,16,4)
Text = ("OK")
Default = True
Cancel = True
}
}
}
}

View File

@ -19,6 +19,8 @@ Private $bAuth As Boolean
Private $sUser As String
Private $sPassword As String
Private $sLastResult As String
'Public (User) As String
'Public Password As String
'Public UseTerminal As Boolean
@ -71,7 +73,10 @@ Public Sub Shell(sCmd As String, Optional bSilent As Boolean, Optional aEnv As S
If Not bSilent Then Insert(sCmd & "\n")
Shell sCmd With aEnv To sResult
If Process.LastValue Then Insert(sResult)
If Process.LastValue Then
$sLastResult = sResult
Insert(sResult)
Endif
Return sResult
End
@ -88,6 +93,7 @@ Public Sub Run(aCmd As String[], Optional bIdent As Boolean, Optional bOutput As
$sOutput = ""
$bOutput = bOutput
$dOutput = Now
$sLastResult = ""
' If bIdent Then
' 'aCmd.Add("--non-interactive")
@ -129,6 +135,7 @@ End
Public Sub Process_Error(({Error}) As String)
$sLastResult &= {Error}
Insert({Error})
End
@ -302,7 +309,7 @@ Public Sub Commit(sChange As String, bDoNotPush As Boolean) As Boolean
Dec Application.Busy
If bRes Then
Message.Error(("The project could not be committed."))
FVersionError.Run(("The project could not be committed."), $sLastResult)
Endif
Return bRes
@ -320,7 +327,7 @@ Public Sub Update()
Dec Application.Busy
If bErr Then
Message.Error(("Unable to update project from repository."))
FVersionError.Run(("Unable to update project from repository."), $sLastResult)
Else
Message.Info(("Project has been updated from repository successfully."))
Endif
@ -350,7 +357,7 @@ End
Public Sub CheckoutSVN(sPath As String, sDir As String, hEditor As TextEditor)
$hEditor = hEditor
CVersionControlSubversion.checkout(sPath, sDir)
CVersionControlSubversion.Checkout(sPath, sDir)
$hEditor = Null
End
@ -417,16 +424,42 @@ Public Sub CanControlProject() As Boolean
End
Public Sub ControlProject()
Public Sub ControlProject(sType As String)
' If CanControlProject() Then
' Project.CleanUp
' Try Kill Project.Dir &/ ".settings"
' Run(["svn", "add", "--parents", SvnPath$($sRealDir)])
' Project.Config.Save
' Refresh
' Project.Refresh
' Endif
Dim hVC As CVersionControl
Dim bErr As Boolean
Select Case sType
Case CVersionControlSubversion.Name
hVC = CVersionControlSubversion
Case CVersionControlGit.Name
hVC = CVersionControlGit
Default
Return
End Select
If Not hVC.CanControlProject() Then Return
If Message.Question(Subst(("Do you really want to put this project under version control with &1?"), hVC.LongName), ("Yes"), ("No")) = 2 Then Return
Project.CleanUp
Try Kill Project.Dir &/ ".settings"
bErr = hVC.ControlProject()
Project.Config.Save
If Not bErr Then
Refresh
Project.Refresh
FVersionControl.Run()
Else
FVersionError.Run(("The project could not be put under version control."), $sLastResult)
Endif
End
@ -510,7 +543,36 @@ Public Sub SetBranch(sBranch As String)
Dec Application.Busy
If sCurrent <> sBranch Then
Message.Error(Subst(("Unable to switch to branch `&1`."), sBranch))
FVersionError.Run(Subst(("Unable to switch to branch `&1`."), sBranch), $sLastResult)
Endif
End
Public Sub InitControlProjectMenu(hParent As Menu)
Dim hMenu As Menu
Dim hVC As CVersionControl
hVC = CVersionControlSubversion
GoSub CHECK_CONTROL
hVC = CVersionControlGit
GoSub CHECK_CONTROL
Return
CHECK_CONTROL:
If hVC.CanControlProject() Then
hMenu = New Menu(hParent) As "ControlProject"
hMenu.Text = Subst(("With &1"), hVC.LongName)
hMenu.Tag = hVC.Name
Endif
Return
End
Public Sub ControlProject_Click()
ControlProject(Last.Tag)
End