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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
package git
/*
#include <git2.h>
#include <git2/errors.h>
*/
import "C"
import (
"runtime"
)
type Status int
const (
StatusCurrent Status = C.GIT_STATUS_CURRENT
StatusIndexNew = C.GIT_STATUS_INDEX_NEW
StatusIndexModified = C.GIT_STATUS_INDEX_MODIFIED
StatusIndexDeleted = C.GIT_STATUS_INDEX_DELETED
StatusIndexRenamed = C.GIT_STATUS_INDEX_RENAMED
StatusIndexTypeChange = C.GIT_STATUS_INDEX_TYPECHANGE
StatusWtNew = C.GIT_STATUS_WT_NEW
StatusWtModified = C.GIT_STATUS_WT_NEW
StatusWtDeleted = C.GIT_STATUS_WT_DELETED
StatusWtTypeChange = C.GIT_STATUS_WT_TYPECHANGE
StatusWtRenamed = C.GIT_STATUS_WT_RENAMED
StatusIgnored = C.GIT_STATUS_IGNORED
)
type StatusEntry struct {
Status Status
HeadToIndex DiffDelta
IndexToWorkdir DiffDelta
}
func statusEntryFromC(statusEntry *C.git_status_entry) StatusEntry {
return StatusEntry {
Status: Status(statusEntry.status),
HeadToIndex: diffDeltaFromC(statusEntry.head_to_index),
IndexToWorkdir: diffDeltaFromC(statusEntry.index_to_workdir),
}
}
type StatusList struct {
ptr *C.git_status_list
}
func newStatusListFromC(ptr *C.git_status_list) *StatusList {
if ptr == nil {
return nil
}
statusList := &StatusList{
ptr: ptr,
}
runtime.SetFinalizer(statusList, (*StatusList).Free)
return statusList
}
func (statusList *StatusList) Free() error {
if statusList.ptr == nil {
return ErrInvalid
}
runtime.SetFinalizer(statusList, nil)
C.git_status_list_free(statusList.ptr)
statusList.ptr = nil
return nil
}
func (statusList *StatusList) ByIndex(index int) (StatusEntry, error) {
if statusList.ptr == nil {
return StatusEntry{}, ErrInvalid
}
ptr := C.git_status_byindex(statusList.ptr, C.size_t(index))
return statusEntryFromC(ptr), nil
}
func (statusList *StatusList) EntryCount() (int, error) {
if statusList.ptr == nil {
return -1, ErrInvalid
}
return int(C.git_status_list_entrycount(statusList.ptr)), nil
}
const (
StatusOptIncludeUntracked = C.GIT_STATUS_OPT_INCLUDE_UNTRACKED
StatusOptIncludeIgnored = C.GIT_STATUS_OPT_INCLUDE_IGNORED
StatusOptIncludeUnmodified = C.GIT_STATUS_OPT_INCLUDE_UNMODIFIED
StatusOptExcludeSubmodules = C.GIT_STATUS_OPT_EXCLUDE_SUBMODULES
StatusOptRecurseUntrackedDirs = C.GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS
StatusOptDisablePathspecMatch = C.GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH
StatusOptRecurseIgnoredDirs = C.GIT_STATUS_OPT_RECURSE_IGNORED_DIRS
StatusOptRenamesHeadToIndex = C.GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX
StatusOptRenamesIndexToWorkdir = C.GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR
StatusOptSortCaseSensitively = C.GIT_STATUS_OPT_SORT_CASE_SENSITIVELY
StatusOptSortCaseInsensitively = C.GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY
StatusOptRenamesFromRewrites = C.GIT_STATUS_OPT_RENAMES_FROM_REWRITES
StatusOptNoRefresh = C.GIT_STATUS_OPT_NO_REFRESH
StatusOptUpdateIndex = C.GIT_STATUS_OPT_UPDATE_INDEX
)
type StatusShow int
const (
StatusShowIndexAndWorkdir StatusShow = C.GIT_STATUS_SHOW_INDEX_AND_WORKDIR
StatusShowIndexOnly = C.GIT_STATUS_SHOW_INDEX_ONLY
StatusShowWorkdirOnly = C.GIT_STATUS_SHOW_WORKDIR_ONLY
)
type StatusOptions struct {
Version int
Show StatusShow
Flags int
Pathspec []string
}
func (opts *StatusOptions) toC() *C.git_status_options {
if opts == nil {
return nil
}
cpathspec := C.git_strarray{}
if opts.Pathspec != nil {
cpathspec.count = C.size_t(len(opts.Pathspec))
cpathspec.strings = makeCStringsFromStrings(opts.Pathspec)
defer freeStrarray(&cpathspec)
}
copts := &C.git_status_options{
version: C.GIT_STATUS_OPTIONS_VERSION,
show: C.git_status_show_t(opts.Show),
flags: C.uint(opts.Flags),
pathspec: cpathspec,
}
return copts
}
func (v *Repository) StatusList(opts *StatusOptions) (*StatusList, error) {
var ptr *C.git_status_list
var copts *C.git_status_options
if opts != nil {
copts = opts.toC()
} else {
copts = &C.git_status_options{}
ret := C.git_status_init_options(copts, C.GIT_STATUS_OPTIONS_VERSION)
if ret < 0 {
return nil, MakeGitError(ret)
}
}
ret := C.git_status_list_new(&ptr, v.ptr, copts)
if ret < 0 {
return nil, MakeGitError(ret)
}
return newStatusListFromC(ptr), nil
}
|