Skip to content

Commit c9b5f81

Browse files
authored
Merge pull request #1043 from ehuss/callback-errors
Consistently use the error message from a callback error.
2 parents 324f421 + 18bfc89 commit c9b5f81

File tree

3 files changed

+18
-25
lines changed

3 files changed

+18
-25
lines changed

src/error.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use libc::c_int;
22
use std::env::JoinPathsError;
33
use std::error;
4-
use std::ffi::{CStr, NulError};
4+
use std::ffi::{CStr, CString, NulError};
55
use std::fmt;
66
use std::str;
77

@@ -350,6 +350,17 @@ impl Error {
350350
pub fn message(&self) -> &str {
351351
&self.message
352352
}
353+
354+
/// A low-level convenience to call [`raw::git_error_set_str`] with the
355+
/// information from this error.
356+
///
357+
/// Returns the [`Error::raw_code`] value of this error, which is often
358+
/// needed from a C callback.
359+
pub(crate) unsafe fn raw_set_git_error(&self) -> raw::git_error_code {
360+
let s = CString::new(self.message()).unwrap();
361+
raw::git_error_set_str(self.class() as c_int, s.as_ptr());
362+
self.raw_code()
363+
}
353364
}
354365

355366
impl error::Error for Error {}

src/remote_callbacks.rs

+5-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use libc::{c_char, c_int, c_uint, c_void, size_t};
2-
use std::ffi::{CStr, CString};
2+
use std::ffi::CStr;
33
use std::mem;
44
use std::ptr;
55
use std::slice;
@@ -330,11 +330,7 @@ extern "C" fn credentials_cb(
330330

331331
let cred_type = CredentialType::from_bits_truncate(allowed_types as u32);
332332

333-
callback(url, username_from_url, cred_type).map_err(|e| {
334-
let s = CString::new(e.to_string()).unwrap();
335-
raw::git_error_set_str(e.class() as c_int, s.as_ptr());
336-
e.raw_code() as c_int
337-
})
333+
callback(url, username_from_url, cred_type).map_err(|e| e.raw_set_git_error())
338334
});
339335
match ok {
340336
Some(Ok(cred)) => {
@@ -433,13 +429,7 @@ extern "C" fn certificate_check_cb(
433429
match ok {
434430
Some(Ok(CertificateCheckStatus::CertificateOk)) => 0,
435431
Some(Ok(CertificateCheckStatus::CertificatePassthrough)) => raw::GIT_PASSTHROUGH as c_int,
436-
Some(Err(e)) => {
437-
let s = CString::new(e.message()).unwrap();
438-
unsafe {
439-
raw::git_error_set_str(e.class() as c_int, s.as_ptr());
440-
}
441-
e.raw_code() as c_int
442-
}
432+
Some(Err(e)) => unsafe { e.raw_set_git_error() },
443433
None => {
444434
// Panic. The *should* get resumed by some future call to check().
445435
-1
@@ -466,7 +456,7 @@ extern "C" fn push_update_reference_cb(
466456
};
467457
match callback(refname, status) {
468458
Ok(()) => 0,
469-
Err(e) => e.raw_code(),
459+
Err(e) => e.raw_set_git_error(),
470460
}
471461
})
472462
.unwrap_or(-1)
@@ -529,7 +519,7 @@ extern "C" fn push_negotiation_cb(
529519
let updates = slice::from_raw_parts(updates as *mut PushUpdate<'_>, len);
530520
match callback(updates) {
531521
Ok(()) => 0,
532-
Err(e) => e.raw_code(),
522+
Err(e) => e.raw_set_git_error(),
533523
}
534524
})
535525
.unwrap_or(-1)

src/transport.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,7 @@ extern "C" fn subtransport_action(
259259
if generate_stream {
260260
let obj = match transport.obj.action(url, action) {
261261
Ok(s) => s,
262-
Err(e) => {
263-
set_err(&e);
264-
return e.raw_code() as c_int;
265-
}
262+
Err(e) => return e.raw_set_git_error(),
266263
};
267264
*stream = mem::transmute(Box::new(RawSmartSubtransportStream {
268265
raw: raw::git_smart_subtransport_stream {
@@ -363,11 +360,6 @@ unsafe fn set_err_io(e: &io::Error) {
363360
raw::git_error_set_str(raw::GIT_ERROR_NET as c_int, s.as_ptr());
364361
}
365362

366-
unsafe fn set_err(e: &Error) {
367-
let s = CString::new(e.message()).unwrap();
368-
raw::git_error_set_str(e.raw_class() as c_int, s.as_ptr());
369-
}
370-
371363
// callback used by smart transports to free a `SmartSubtransportStream`
372364
// object.
373365
extern "C" fn stream_free(stream: *mut raw::git_smart_subtransport_stream) {

0 commit comments

Comments
 (0)