Skip to content

Commit 18bfc89

Browse files
committed
Consistently use the error message from a callback error.
1 parent 04427a3 commit 18bfc89

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;
@@ -312,11 +312,7 @@ extern "C" fn credentials_cb(
312312

313313
let cred_type = CredentialType::from_bits_truncate(allowed_types as u32);
314314

315-
callback(url, username_from_url, cred_type).map_err(|e| {
316-
let s = CString::new(e.to_string()).unwrap();
317-
raw::git_error_set_str(e.class() as c_int, s.as_ptr());
318-
e.raw_code() as c_int
319-
})
315+
callback(url, username_from_url, cred_type).map_err(|e| e.raw_set_git_error())
320316
});
321317
match ok {
322318
Some(Ok(cred)) => {
@@ -415,13 +411,7 @@ extern "C" fn certificate_check_cb(
415411
match ok {
416412
Some(Ok(CertificateCheckStatus::CertificateOk)) => 0,
417413
Some(Ok(CertificateCheckStatus::CertificatePassthrough)) => raw::GIT_PASSTHROUGH as c_int,
418-
Some(Err(e)) => {
419-
let s = CString::new(e.message()).unwrap();
420-
unsafe {
421-
raw::git_error_set_str(e.class() as c_int, s.as_ptr());
422-
}
423-
e.raw_code() as c_int
424-
}
414+
Some(Err(e)) => unsafe { e.raw_set_git_error() },
425415
None => {
426416
// Panic. The *should* get resumed by some future call to check().
427417
-1
@@ -448,7 +438,7 @@ extern "C" fn push_update_reference_cb(
448438
};
449439
match callback(refname, status) {
450440
Ok(()) => 0,
451-
Err(e) => e.raw_code(),
441+
Err(e) => e.raw_set_git_error(),
452442
}
453443
})
454444
.unwrap_or(-1)
@@ -511,7 +501,7 @@ extern "C" fn push_negotiation_cb(
511501
let updates = slice::from_raw_parts(updates as *mut PushUpdate<'_>, len);
512502
match callback(updates) {
513503
Ok(()) => 0,
514-
Err(e) => e.raw_code(),
504+
Err(e) => e.raw_set_git_error(),
515505
}
516506
})
517507
.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)