Skip to content

Commit 5de2c34

Browse files
authored
More callback refactoring (#713) (#718)
This change: * Gets rid of the `.toC()` functions for Options objects, since they were redundant with the `populateXxxOptions()`. * Adds support for `errorTarget` to the `RemoteOptions`, since they are used in the same stack for some functions (like `Fetch()`). Now for those cases, the error returned by the callback will be preserved as-is. (cherry picked from commit 10c6747)
1 parent 2a14d90 commit 5de2c34

File tree

15 files changed

+431
-348
lines changed

15 files changed

+431
-348
lines changed

checkout.go

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,6 @@ func checkoutOptionsFromC(c *C.git_checkout_options) CheckoutOptions {
8787
return opts
8888
}
8989

90-
func (opts *CheckoutOptions) toC(errorTarget *error) *C.git_checkout_options {
91-
if opts == nil {
92-
return nil
93-
}
94-
return populateCheckoutOptions(&C.git_checkout_options{}, opts, errorTarget)
95-
}
96-
9790
type checkoutCallbackData struct {
9891
options *CheckoutOptions
9992
errorTarget *error
@@ -144,61 +137,61 @@ func checkoutProgressCallback(
144137
data.options.ProgressCallback(C.GoString(path), uint(completed_steps), uint(total_steps))
145138
}
146139

147-
// Convert the CheckoutOptions struct to the corresponding
148-
// C-struct. Returns a pointer to ptr, or nil if opts is nil, in order
149-
// to help with what to pass.
150-
func populateCheckoutOptions(ptr *C.git_checkout_options, opts *CheckoutOptions, errorTarget *error) *C.git_checkout_options {
140+
// populateCheckoutOptions populates the provided C-struct with the contents of
141+
// the provided CheckoutOptions struct. Returns copts, or nil if opts is nil,
142+
// in order to help with what to pass.
143+
func populateCheckoutOptions(copts *C.git_checkout_options, opts *CheckoutOptions, errorTarget *error) *C.git_checkout_options {
144+
C.git_checkout_init_options(copts, C.GIT_CHECKOUT_OPTIONS_VERSION)
151145
if opts == nil {
152146
return nil
153147
}
154148

155-
C.git_checkout_init_options(ptr, 1)
156-
ptr.checkout_strategy = C.uint(opts.Strategy)
157-
ptr.disable_filters = cbool(opts.DisableFilters)
158-
ptr.dir_mode = C.uint(opts.DirMode.Perm())
159-
ptr.file_mode = C.uint(opts.FileMode.Perm())
160-
ptr.notify_flags = C.uint(opts.NotifyFlags)
149+
copts.checkout_strategy = C.uint(opts.Strategy)
150+
copts.disable_filters = cbool(opts.DisableFilters)
151+
copts.dir_mode = C.uint(opts.DirMode.Perm())
152+
copts.file_mode = C.uint(opts.FileMode.Perm())
153+
copts.notify_flags = C.uint(opts.NotifyFlags)
161154
if opts.NotifyCallback != nil || opts.ProgressCallback != nil {
162-
C._go_git_populate_checkout_callbacks(ptr)
155+
C._go_git_populate_checkout_callbacks(copts)
163156
data := &checkoutCallbackData{
164157
options: opts,
165158
errorTarget: errorTarget,
166159
}
167160
payload := pointerHandles.Track(data)
168161
if opts.NotifyCallback != nil {
169-
ptr.notify_payload = payload
162+
copts.notify_payload = payload
170163
}
171164
if opts.ProgressCallback != nil {
172-
ptr.progress_payload = payload
165+
copts.progress_payload = payload
173166
}
174167
}
175168
if opts.TargetDirectory != "" {
176-
ptr.target_directory = C.CString(opts.TargetDirectory)
169+
copts.target_directory = C.CString(opts.TargetDirectory)
177170
}
178171
if len(opts.Paths) > 0 {
179-
ptr.paths.strings = makeCStringsFromStrings(opts.Paths)
180-
ptr.paths.count = C.size_t(len(opts.Paths))
172+
copts.paths.strings = makeCStringsFromStrings(opts.Paths)
173+
copts.paths.count = C.size_t(len(opts.Paths))
181174
}
182175

183176
if opts.Baseline != nil {
184-
ptr.baseline = opts.Baseline.cast_ptr
177+
copts.baseline = opts.Baseline.cast_ptr
185178
}
186179

187-
return ptr
180+
return copts
188181
}
189182

190-
func freeCheckoutOptions(ptr *C.git_checkout_options) {
191-
if ptr == nil {
183+
func freeCheckoutOptions(copts *C.git_checkout_options) {
184+
if copts == nil {
192185
return
193186
}
194-
C.free(unsafe.Pointer(ptr.target_directory))
195-
if ptr.paths.count > 0 {
196-
freeStrarray(&ptr.paths)
187+
C.free(unsafe.Pointer(copts.target_directory))
188+
if copts.paths.count > 0 {
189+
freeStrarray(&copts.paths)
197190
}
198-
if ptr.notify_payload != nil {
199-
pointerHandles.Untrack(ptr.notify_payload)
200-
} else if ptr.progress_payload != nil {
201-
pointerHandles.Untrack(ptr.progress_payload)
191+
if copts.notify_payload != nil {
192+
pointerHandles.Untrack(copts.notify_payload)
193+
} else if copts.progress_payload != nil {
194+
pointerHandles.Untrack(copts.progress_payload)
202195
}
203196
}
204197

@@ -209,7 +202,7 @@ func (v *Repository) CheckoutHead(opts *CheckoutOptions) error {
209202
defer runtime.UnlockOSThread()
210203

211204
var err error
212-
cOpts := opts.toC(&err)
205+
cOpts := populateCheckoutOptions(&C.git_checkout_options{}, opts, &err)
213206
defer freeCheckoutOptions(cOpts)
214207

215208
ret := C.git_checkout_head(v.ptr, cOpts)
@@ -238,7 +231,7 @@ func (v *Repository) CheckoutIndex(index *Index, opts *CheckoutOptions) error {
238231
defer runtime.UnlockOSThread()
239232

240233
var err error
241-
cOpts := opts.toC(&err)
234+
cOpts := populateCheckoutOptions(&C.git_checkout_options{}, opts, &err)
242235
defer freeCheckoutOptions(cOpts)
243236

244237
ret := C.git_checkout_index(v.ptr, iptr, cOpts)
@@ -258,7 +251,7 @@ func (v *Repository) CheckoutTree(tree *Tree, opts *CheckoutOptions) error {
258251
defer runtime.UnlockOSThread()
259252

260253
var err error
261-
cOpts := opts.toC(&err)
254+
cOpts := populateCheckoutOptions(&C.git_checkout_options{}, opts, &err)
262255
defer freeCheckoutOptions(cOpts)
263256

264257
ret := C.git_checkout_tree(v.ptr, tree.ptr, cOpts)

cherrypick.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,23 @@ func cherrypickOptionsFromC(c *C.git_cherrypick_options) CherrypickOptions {
2525
return opts
2626
}
2727

28-
func (opts *CherrypickOptions) toC(errorTarget *error) *C.git_cherrypick_options {
28+
func populateCherrypickOptions(copts *C.git_cherrypick_options, opts *CherrypickOptions, errorTarget *error) *C.git_cherrypick_options {
29+
C.git_cherrypick_init_options(copts, C.GIT_CHERRYPICK_OPTIONS_VERSION)
2930
if opts == nil {
3031
return nil
3132
}
32-
c := C.git_cherrypick_options{}
33-
c.version = C.uint(opts.Version)
34-
c.mainline = C.uint(opts.Mainline)
35-
c.merge_opts = *opts.MergeOpts.toC()
36-
c.checkout_opts = *opts.CheckoutOpts.toC(errorTarget)
37-
return &c
33+
copts.mainline = C.uint(opts.Mainline)
34+
populateMergeOptions(&copts.merge_opts, &opts.MergeOpts)
35+
populateCheckoutOptions(&copts.checkout_opts, &opts.CheckoutOpts, errorTarget)
36+
return copts
3837
}
3938

40-
func freeCherrypickOpts(ptr *C.git_cherrypick_options) {
41-
if ptr == nil {
39+
func freeCherrypickOpts(copts *C.git_cherrypick_options) {
40+
if copts == nil {
4241
return
4342
}
44-
freeMergeOptions(&ptr.merge_opts)
45-
freeCheckoutOptions(&ptr.checkout_opts)
43+
freeMergeOptions(&copts.merge_opts)
44+
freeCheckoutOptions(&copts.checkout_opts)
4645
}
4746

4847
func DefaultCherrypickOptions() (CherrypickOptions, error) {
@@ -64,7 +63,7 @@ func (v *Repository) Cherrypick(commit *Commit, opts CherrypickOptions) error {
6463
defer runtime.UnlockOSThread()
6564

6665
var err error
67-
cOpts := opts.toC(&err)
66+
cOpts := populateCherrypickOptions(&C.git_cherrypick_options{}, &opts, &err)
6867
defer freeCherrypickOpts(cOpts)
6968

7069
ret := C.git_cherrypick(v.ptr, commit.cast_ptr, cOpts)
@@ -83,7 +82,7 @@ func (r *Repository) CherrypickCommit(pick, our *Commit, opts CherrypickOptions)
8382
runtime.LockOSThread()
8483
defer runtime.UnlockOSThread()
8584

86-
cOpts := opts.MergeOpts.toC()
85+
cOpts := populateMergeOptions(&C.git_merge_options{}, &opts.MergeOpts)
8786
defer freeMergeOptions(cOpts)
8887

8988
var ptr *C.git_index

clone.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -94,39 +94,39 @@ type cloneCallbackData struct {
9494
errorTarget *error
9595
}
9696

97-
func populateCloneOptions(ptr *C.git_clone_options, opts *CloneOptions, errorTarget *error) *C.git_clone_options {
98-
C.git_clone_init_options(ptr, C.GIT_CLONE_OPTIONS_VERSION)
99-
97+
func populateCloneOptions(copts *C.git_clone_options, opts *CloneOptions, errorTarget *error) *C.git_clone_options {
98+
C.git_clone_init_options(copts, C.GIT_CLONE_OPTIONS_VERSION)
10099
if opts == nil {
101100
return nil
102101
}
103-
populateCheckoutOptions(&ptr.checkout_opts, opts.CheckoutOpts, errorTarget)
104-
populateFetchOptions(&ptr.fetch_opts, opts.FetchOptions)
105-
ptr.bare = cbool(opts.Bare)
102+
populateCheckoutOptions(&copts.checkout_opts, opts.CheckoutOpts, errorTarget)
103+
populateFetchOptions(&copts.fetch_opts, opts.FetchOptions, errorTarget)
104+
copts.bare = cbool(opts.Bare)
106105

107106
if opts.RemoteCreateCallback != nil {
108107
data := &cloneCallbackData{
109108
options: opts,
110109
errorTarget: errorTarget,
111110
}
112111
// Go v1.1 does not allow to assign a C function pointer
113-
C._go_git_populate_clone_callbacks(ptr)
114-
ptr.remote_cb_payload = pointerHandles.Track(data)
112+
C._go_git_populate_clone_callbacks(copts)
113+
copts.remote_cb_payload = pointerHandles.Track(data)
115114
}
116115

117-
return ptr
116+
return copts
118117
}
119118

120-
func freeCloneOptions(ptr *C.git_clone_options) {
121-
if ptr == nil {
119+
func freeCloneOptions(copts *C.git_clone_options) {
120+
if copts == nil {
122121
return
123122
}
124123

125-
freeCheckoutOptions(&ptr.checkout_opts)
124+
freeCheckoutOptions(&copts.checkout_opts)
125+
freeFetchOptions(&copts.fetch_opts)
126126

127-
if ptr.remote_cb_payload != nil {
128-
pointerHandles.Untrack(ptr.remote_cb_payload)
127+
if copts.remote_cb_payload != nil {
128+
pointerHandles.Untrack(copts.remote_cb_payload)
129129
}
130130

131-
C.free(unsafe.Pointer(ptr.checkout_branch))
131+
C.free(unsafe.Pointer(copts.checkout_branch))
132132
}

0 commit comments

Comments
 (0)