Skip to content

Commit d70b645

Browse files
committed
Make all callbacks optional in libgit2-sys
Appease the nightly compiler's checks for undefinededness and reflect how this is actually what the typedef is in C, a nullable function pointer.
1 parent d34e49c commit d70b645

14 files changed

+247
-209
lines changed

libgit2-sys/lib.rs

+186-149
Large diffs are not rendered by default.

src/blob.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -124,19 +124,27 @@ impl<'repo> Drop for BlobWriter<'repo> {
124124
fn drop(&mut self) {
125125
// We need cleanup in case the stream has not been committed
126126
if self.need_cleanup {
127-
unsafe { ((*self.raw).free)(self.raw) }
127+
unsafe {
128+
if let Some(f) = (*self.raw).free {
129+
f(self.raw)
130+
}
131+
}
128132
}
129133
}
130134
}
131135

132136
impl<'repo> io::Write for BlobWriter<'repo> {
133137
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
134138
unsafe {
135-
let res = ((*self.raw).write)(self.raw, buf.as_ptr() as *const _, buf.len());
136-
if res < 0 {
137-
Err(io::Error::new(io::ErrorKind::Other, "Write error"))
139+
if let Some(f) = (*self.raw).write {
140+
let res = f(self.raw, buf.as_ptr() as *const _, buf.len());
141+
if res < 0 {
142+
Err(io::Error::new(io::ErrorKind::Other, "Write error"))
143+
} else {
144+
Ok(buf.len())
145+
}
138146
} else {
139-
Ok(buf.len())
147+
Err(io::Error::new(io::ErrorKind::Other, "no write callback"))
140148
}
141149
}
142150
}

src/build.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -589,13 +589,11 @@ impl<'cb> CheckoutBuilder<'cb> {
589589
opts.their_label = c.as_ptr();
590590
}
591591
if self.progress.is_some() {
592-
let f: raw::git_checkout_progress_cb = progress_cb;
593-
opts.progress_cb = Some(f);
592+
opts.progress_cb = Some(progress_cb);
594593
opts.progress_payload = self as *mut _ as *mut _;
595594
}
596595
if self.notify.is_some() {
597-
let f: raw::git_checkout_notify_cb = notify_cb;
598-
opts.notify_cb = Some(f);
596+
opts.notify_cb = Some(notify_cb);
599597
opts.notify_payload = self as *mut _ as *mut _;
600598
opts.notify_flags = self.notify_flags.bits() as c_uint;
601599
}

src/cred.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,11 @@ impl Binding for Cred {
179179
impl Drop for Cred {
180180
fn drop(&mut self) {
181181
if !self.raw.is_null() {
182-
unsafe { ((*self.raw).free)(self.raw) }
182+
unsafe {
183+
if let Some(f) = (*self.raw).free {
184+
f(self.raw)
185+
}
186+
}
183187
}
184188
}
185189
}

src/diff.rs

+10-13
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,9 @@ impl<'repo> Diff<'repo> {
164164
{
165165
let mut cb: &mut PrintCb<'_> = &mut cb;
166166
let ptr = &mut cb as *mut _;
167+
let print: raw::git_diff_line_cb = Some(print_cb);
167168
unsafe {
168-
try_call!(raw::git_diff_print(
169-
self.raw,
170-
format,
171-
print_cb,
172-
ptr as *mut _
173-
));
169+
try_call!(raw::git_diff_print(self.raw, format, print, ptr as *mut _));
174170
Ok(())
175171
}
176172
}
@@ -194,24 +190,25 @@ impl<'repo> Diff<'repo> {
194190
};
195191
let ptr = &mut cbs as *mut _;
196192
unsafe {
197-
let binary_cb_c = if cbs.binary.is_some() {
198-
Some(binary_cb_c as raw::git_diff_binary_cb)
193+
let binary_cb_c: raw::git_diff_binary_cb = if cbs.binary.is_some() {
194+
Some(binary_cb_c)
199195
} else {
200196
None
201197
};
202-
let hunk_cb_c = if cbs.hunk.is_some() {
203-
Some(hunk_cb_c as raw::git_diff_hunk_cb)
198+
let hunk_cb_c: raw::git_diff_hunk_cb = if cbs.hunk.is_some() {
199+
Some(hunk_cb_c)
204200
} else {
205201
None
206202
};
207-
let line_cb_c = if cbs.line.is_some() {
208-
Some(line_cb_c as raw::git_diff_line_cb)
203+
let line_cb_c: raw::git_diff_line_cb = if cbs.line.is_some() {
204+
Some(line_cb_c)
209205
} else {
210206
None
211207
};
208+
let file_cb: raw::git_diff_file_cb = Some(file_cb_c);
212209
try_call!(raw::git_diff_foreach(
213210
self.raw,
214-
file_cb_c,
211+
file_cb,
215212
binary_cb_c,
216213
hunk_cb_c,
217214
line_cb_c,

src/index.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ impl Index {
295295
let ptr = cb.as_mut();
296296
let callback = ptr
297297
.as_ref()
298-
.map(|_| index_matched_path_cb as raw::git_index_matched_path_cb);
298+
.map(|_| index_matched_path_cb as extern "C" fn(_, _, _) -> _);
299299
unsafe {
300300
try_call!(raw::git_index_add_all(
301301
self.raw,
@@ -473,7 +473,7 @@ impl Index {
473473
let ptr = cb.as_mut();
474474
let callback = ptr
475475
.as_ref()
476-
.map(|_| index_matched_path_cb as raw::git_index_matched_path_cb);
476+
.map(|_| index_matched_path_cb as extern "C" fn(_, _, _) -> _);
477477
unsafe {
478478
try_call!(raw::git_index_remove_all(
479479
self.raw,
@@ -511,7 +511,7 @@ impl Index {
511511
let ptr = cb.as_mut();
512512
let callback = ptr
513513
.as_ref()
514-
.map(|_| index_matched_path_cb as raw::git_index_matched_path_cb);
514+
.map(|_| index_matched_path_cb as extern "C" fn(_, _, _) -> _);
515515
unsafe {
516516
try_call!(raw::git_index_update_all(
517517
self.raw,

src/odb.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ impl<'repo> Odb<'repo> {
9898
let mut data = ForeachCbData {
9999
callback: &mut callback,
100100
};
101+
let cb: raw::git_odb_foreach_cb = Some(foreach_cb);
101102
try_call!(raw::git_odb_foreach(
102103
self.raw(),
103-
foreach_cb,
104+
cb,
104105
&mut data as *mut _ as *mut _
105106
));
106107
Ok(())
@@ -155,7 +156,7 @@ impl<'repo> Odb<'repo> {
155156
pub fn packwriter(&self) -> Result<OdbPackwriter<'_>, Error> {
156157
let mut out = ptr::null_mut();
157158
let progress = MaybeUninit::uninit();
158-
let progress_cb = write_pack_progress_cb;
159+
let progress_cb: raw::git_indexer_progress_cb = Some(write_pack_progress_cb);
159160
let progress_payload = Box::new(OdbPackwriterCb { cb: None });
160161
let progress_payload_ptr = Box::into_raw(progress_payload);
161162

src/packbuilder.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,11 @@ impl<'repo> PackBuilder<'repo> {
8989
{
9090
let mut cb = &mut cb as &mut ForEachCb<'_>;
9191
let ptr = &mut cb as *mut _;
92+
let foreach: raw::git_packbuilder_foreach_cb = Some(foreach_c);
9293
unsafe {
9394
try_call!(raw::git_packbuilder_foreach(
9495
self.raw,
95-
foreach_c,
96+
foreach,
9697
ptr as *mut _
9798
));
9899
}
@@ -112,7 +113,7 @@ impl<'repo> PackBuilder<'repo> {
112113
{
113114
let mut progress = Box::new(Box::new(progress) as Box<ProgressCb<'_>>);
114115
let ptr = &mut *progress as *mut _;
115-
let progress_c = Some(progress_c as raw::git_packbuilder_progress);
116+
let progress_c: raw::git_packbuilder_progress = Some(progress_c);
116117
unsafe {
117118
try_call!(raw::git_packbuilder_set_callbacks(
118119
self.raw,

src/patch.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ impl<'buffers> Patch<'buffers> {
206206
pub fn print(&mut self, mut line_cb: &mut LineCb<'_>) -> Result<(), Error> {
207207
let ptr = &mut line_cb as *mut _ as *mut c_void;
208208
unsafe {
209-
try_call!(raw::git_patch_print(self.raw, print_cb, ptr));
209+
let cb: raw::git_diff_line_cb = Some(print_cb);
210+
try_call!(raw::git_patch_print(self.raw, cb, ptr));
210211
Ok(())
211212
}
212213
}

src/remote_callbacks.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -174,24 +174,19 @@ impl<'a> Binding for RemoteCallbacks<'a> {
174174
0
175175
);
176176
if self.progress.is_some() {
177-
let f: raw::git_indexer_progress_cb = transfer_progress_cb;
178-
callbacks.transfer_progress = Some(f);
177+
callbacks.transfer_progress = Some(transfer_progress_cb);
179178
}
180179
if self.credentials.is_some() {
181-
let f: raw::git_cred_acquire_cb = credentials_cb;
182-
callbacks.credentials = Some(f);
180+
callbacks.credentials = Some(credentials_cb);
183181
}
184182
if self.sideband_progress.is_some() {
185-
let f: raw::git_transport_message_cb = sideband_progress_cb;
186-
callbacks.sideband_progress = Some(f);
183+
callbacks.sideband_progress = Some(sideband_progress_cb);
187184
}
188185
if self.certificate_check.is_some() {
189-
let f: raw::git_transport_certificate_check_cb = certificate_check_cb;
190-
callbacks.certificate_check = Some(f);
186+
callbacks.certificate_check = Some(certificate_check_cb);
191187
}
192188
if self.push_update_reference.is_some() {
193-
let f: extern "C" fn(_, _, _) -> c_int = push_update_reference_cb;
194-
callbacks.push_update_reference = Some(f);
189+
callbacks.push_update_reference = Some(push_update_reference_cb);
195190
}
196191
if self.update_tips.is_some() {
197192
let f: extern "C" fn(

src/repo.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -778,9 +778,10 @@ impl Repository {
778778
repo: self,
779779
ret: &mut ret,
780780
};
781+
let cb: raw::git_submodule_cb = Some(append);
781782
try_call!(raw::git_submodule_foreach(
782783
self.raw,
783-
append,
784+
cb,
784785
&mut data as *mut _ as *mut c_void
785786
));
786787
}
@@ -2426,9 +2427,10 @@ impl Repository {
24262427
let mut data = StashCbData {
24272428
callback: &mut callback,
24282429
};
2430+
let cb: raw::git_stash_cb = Some(stash_cb);
24292431
try_call!(raw::git_stash_foreach(
24302432
self.raw(),
2431-
stash_cb,
2433+
cb,
24322434
&mut data as *mut _ as *mut _
24332435
));
24342436
Ok(())

src/transport.rs

+8-11
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,8 @@ where
113113
});
114114
let prefix = CString::new(prefix)?;
115115
let datap = (&mut *data) as *mut TransportData as *mut c_void;
116-
try_call!(raw::git_transport_register(
117-
prefix,
118-
transport_factory,
119-
datap
120-
));
116+
let factory: raw::git_transport_cb = Some(transport_factory);
117+
try_call!(raw::git_transport_register(prefix, factory, datap));
121118
mem::forget(data);
122119
Ok(())
123120
}
@@ -141,9 +138,9 @@ impl Transport {
141138

142139
let mut raw = Box::new(RawSmartSubtransport {
143140
raw: raw::git_smart_subtransport {
144-
action: subtransport_action,
145-
close: subtransport_close,
146-
free: subtransport_free,
141+
action: Some(subtransport_action),
142+
close: Some(subtransport_close),
143+
free: Some(subtransport_free),
147144
},
148145
obj: Box::new(subtransport),
149146
});
@@ -257,9 +254,9 @@ extern "C" fn subtransport_action(
257254
*stream = mem::transmute(Box::new(RawSmartSubtransportStream {
258255
raw: raw::git_smart_subtransport_stream {
259256
subtransport: raw_transport,
260-
read: stream_read,
261-
write: stream_write,
262-
free: stream_free,
257+
read: Some(stream_read),
258+
write: Some(stream_write),
259+
free: Some(stream_free),
263260
},
264261
obj: obj,
265262
}));

src/tree.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl<'repo> Tree<'repo> {
132132
raw::git_tree_walk(
133133
self.raw(),
134134
mode.into(),
135-
treewalk_cb::<T>,
135+
Some(treewalk_cb::<T>),
136136
&mut data as *mut _ as *mut c_void,
137137
);
138138
Ok(())

src/treebuilder.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,9 @@ impl<'repo> TreeBuilder<'repo> {
9595
{
9696
let mut cb: &mut FilterCb<'_> = &mut filter;
9797
let ptr = &mut cb as *mut _;
98+
let cb: raw::git_treebuilder_filter_cb = Some(filter_cb);
9899
unsafe {
99-
try_call!(raw::git_treebuilder_filter(
100-
self.raw,
101-
filter_cb,
102-
ptr as *mut _
103-
));
100+
try_call!(raw::git_treebuilder_filter(self.raw, cb, ptr as *mut _));
104101
panic::check();
105102
}
106103
Ok(())

0 commit comments

Comments
 (0)