Skip to content

Commit c046b19

Browse files
authored
Merge pull request #914 from Hyask/master
Bind git_submodule_repo_init
2 parents 3aa9013 + 865bf8b commit c046b19

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

libgit2-sys/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -2569,6 +2569,11 @@ extern "C" {
25692569
pub fn git_submodule_ignore(submodule: *mut git_submodule) -> git_submodule_ignore_t;
25702570
pub fn git_submodule_index_id(submodule: *mut git_submodule) -> *const git_oid;
25712571
pub fn git_submodule_init(submodule: *mut git_submodule, overwrite: c_int) -> c_int;
2572+
pub fn git_submodule_repo_init(
2573+
repo: *mut *mut git_repository,
2574+
submodule: *const git_submodule,
2575+
use_gitlink: c_int,
2576+
) -> c_int;
25722577
pub fn git_submodule_location(status: *mut c_uint, submodule: *mut git_submodule) -> c_int;
25732578
pub fn git_submodule_lookup(
25742579
out: *mut *mut git_submodule,

src/submodule.rs

+59-2
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ impl<'repo> Submodule<'repo> {
139139
Ok(())
140140
}
141141

142+
/// Set up the subrepository for a submodule in preparation for clone.
143+
///
144+
/// This function can be called to init and set up a submodule repository
145+
/// from a submodule in preparation to clone it from its remote.
146+
147+
/// use_gitlink: Should the workdir contain a gitlink to the repo in
148+
/// .git/modules vs. repo directly in workdir.
149+
pub fn repo_init(&mut self, use_gitlink: bool) -> Result<Repository, Error> {
150+
unsafe {
151+
let mut raw_repo = ptr::null_mut();
152+
try_call!(raw::git_submodule_repo_init(
153+
&mut raw_repo,
154+
self.raw,
155+
use_gitlink
156+
));
157+
Ok(Binding::from_raw(raw_repo))
158+
}
159+
}
160+
142161
/// Open the repository for a submodule.
143162
///
144163
/// This will only work if the submodule is checked out into the working
@@ -399,16 +418,54 @@ mod tests {
399418
let (_td, parent) = crate::test::repo_init();
400419

401420
let url1 = Url::from_file_path(&repo1.workdir().unwrap()).unwrap();
402-
let url3 = Url::from_file_path(&repo2.workdir().unwrap()).unwrap();
421+
let url2 = Url::from_file_path(&repo2.workdir().unwrap()).unwrap();
403422
let mut s1 = parent
404423
.submodule(&url1.to_string(), Path::new("bar"), true)
405424
.unwrap();
406425
let mut s2 = parent
407-
.submodule(&url3.to_string(), Path::new("bar2"), true)
426+
.submodule(&url2.to_string(), Path::new("bar2"), true)
408427
.unwrap();
409428
// -----------------------------------
410429

411430
t!(s1.clone(Some(&mut SubmoduleUpdateOptions::default())));
412431
t!(s2.clone(None));
413432
}
433+
434+
#[test]
435+
fn repo_init_submodule() {
436+
// -----------------------------------
437+
// Same as `clone_submodule()`
438+
let (_td, child) = crate::test::repo_init();
439+
let (_td, parent) = crate::test::repo_init();
440+
441+
let url_child = Url::from_file_path(&child.workdir().unwrap()).unwrap();
442+
let url_parent = Url::from_file_path(&parent.workdir().unwrap()).unwrap();
443+
let mut sub = parent
444+
.submodule(&url_child.to_string(), Path::new("bar"), true)
445+
.unwrap();
446+
447+
// -----------------------------------
448+
// Let's commit the submodule for later clone
449+
t!(sub.clone(None));
450+
t!(sub.add_to_index(true));
451+
t!(sub.add_finalize());
452+
453+
crate::test::commit(&parent);
454+
455+
// Clone the parent to init its submodules
456+
let td = TempDir::new().unwrap();
457+
let new_parent = Repository::clone(&url_parent.to_string(), &td).unwrap();
458+
459+
let mut submodules = new_parent.submodules().unwrap();
460+
let child = submodules.first_mut().unwrap();
461+
462+
// First init child
463+
t!(child.init(false));
464+
assert_eq!(child.url().unwrap(), url_child.as_str());
465+
466+
// open() is not possible before initializing the repo
467+
assert!(child.open().is_err());
468+
t!(child.repo_init(true));
469+
assert!(child.open().is_ok());
470+
}
414471
}

0 commit comments

Comments
 (0)