-
Notifications
You must be signed in to change notification settings - Fork 1
/
GitRevision.cls
87 lines (73 loc) · 2.72 KB
/
GitRevision.cls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "ThisDocument"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Option Explicit
Const gitExecutable = "C:\Program Files (x86)\Git\bin\git.exe"
Const gitStatusParameters = "status --porcelain"
Const gitShowParameters = "log --oneline"
Const notVersionedString = "0"
' Run git to get documents version and store it to document variable "fileVersion"
' Only commited versions will be seen as revisioned
' notVersionedString will be used if document is not controlled by git
' or if document has changed after last commit
' Path to git executable is given in Const gitExecutable
Private Sub actualizeVersion()
Dim fileVersion As String
Dim FileName As String
Dim objShell As Object
Dim objExec As Object
Dim aVar As Variable
Dim index As Long
Dim status As String
index = 0
' if document variable "fileVersion" not exists, add it,
' set aVar to this document variable
For Each aVar In ActiveDocument.Variables
If aVar.Name = "fileVersion" Then
index = aVar.index
End If
Next aVar
If index = 0 Then
Set aVar = ActiveDocument.Variables.Add("fileVersion")
Else
Set aVar = ActiveDocument.Variables(index)
End If
If ActiveDocument.Path = "" Then
' document is not saved anywhere so even not versioned
fileVersion = notVersionedString
Else
' get status of file (no return if file is versioned and has not changed until last commit)
FileName = ActiveDocument.Path & "\" & ActiveDocument.Name
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec(gitExecutable & " " & gitStatusParameters & " " & FileName)
status = objExec.Stdout.ReadLine
If status <> "" Then
' file has been modified until last commit or is not versioned at all
fileVersion = notVersionedString
Else
' get revision from git
Set objExec = objShell.Exec(gitExecutable & " " & gitShowParameters & " " & FileName)
fileVersion = objExec.Stdout.ReadLine
If fileVersion = "" Then
fileVersion = notVersionedString
Else
fileVersion = Left(fileVersion, InStr(1, fileVersion, " "))
End If
End If
End If
aVar.Value = fileVersion
' update all fields of the document
ActiveDocument.Fields.Update
' trick to update fields in headline and footer
ActiveDocument.PrintPreview
ActiveDocument.ClosePrintPreview
End Sub
Private Sub Document_Open()
Call actualizeVersion
End Sub