Skip to content

Commit c184687

Browse files
authored
Merge pull request #65 from l4l/registry-key
Allow to pass registry ssh key
2 parents 22e3b97 + bd25fcf commit c184687

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

src/crates/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use failure::Error;
77
use log::info;
88
use std::path::Path;
99

10+
pub use registry::AlternativeRegistry;
11+
1012
trait CrateTrait: std::fmt::Display {
1113
fn fetch(&self, workspace: &Workspace) -> Result<(), Error>;
1214
fn purge_from_cache(&self, workspace: &Workspace) -> Result<(), Error>;
@@ -24,9 +26,9 @@ pub struct Crate(CrateType);
2426

2527
impl Crate {
2628
/// Load a crate from specified registry.
27-
pub fn registry(registry_index: &str, name: &str, version: &str) -> Self {
29+
pub fn registry(registry: AlternativeRegistry, name: &str, version: &str) -> Self {
2830
Crate(CrateType::Registry(registry::RegistryCrate::new(
29-
registry::Registry::Alternative(registry::AlternativeRegistry::new(registry_index)),
31+
registry::Registry::Alternative(registry),
3032
name,
3133
version,
3234
)))

src/crates/registry.rs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,26 @@ use tar::Archive;
1010

1111
static CRATES_ROOT: &str = "https://static.crates.io/crates";
1212

13-
pub(crate) struct AlternativeRegistry {
13+
/// A type for alternative registry as described in rust-lang/rfcs#2141
14+
pub struct AlternativeRegistry {
1415
registry_index: String,
16+
key: Option<String>,
1517
}
1618

1719
impl AlternativeRegistry {
18-
pub(crate) fn new(registry_index: impl Into<String>) -> AlternativeRegistry {
20+
/// Registry for specified registry index
21+
pub fn new(registry_index: impl Into<String>) -> AlternativeRegistry {
1922
AlternativeRegistry {
2023
registry_index: registry_index.into(),
24+
key: None,
2125
}
2226
}
2327

28+
/// Specify private ssh key for registry authentication.
29+
pub fn authenticate_with_ssh_key(&mut self, key: String) {
30+
self.key = Some(key);
31+
}
32+
2433
fn index(&self) -> &str {
2534
self.registry_index.as_str()
2635
}
@@ -92,7 +101,27 @@ impl RegistryCrate {
92101
.join(alt.index_folder());
93102
if !index_path.exists() {
94103
let url = alt.index();
95-
git2::Repository::clone(url, index_path.clone())
104+
let mut fo = git2::FetchOptions::new();
105+
if let Some(key) = alt.key.as_deref() {
106+
fo.remote_callbacks({
107+
let mut callbacks = git2::RemoteCallbacks::new();
108+
callbacks.credentials(
109+
move |_url, username_from_url, _allowed_types| {
110+
git2::Cred::ssh_key_from_memory(
111+
username_from_url.unwrap(),
112+
None,
113+
key,
114+
None,
115+
)
116+
},
117+
);
118+
callbacks
119+
});
120+
}
121+
122+
git2::build::RepoBuilder::new()
123+
.fetch_options(fo)
124+
.clone(url, &index_path)
96125
.with_context(|_| format!("unable to update_index at {}", url))?;
97126
info!("cloned registry index");
98127
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ mod utils;
3737
mod workspace;
3838

3939
pub use crate::build::{Build, BuildBuilder, BuildDirectory};
40-
pub use crate::crates::Crate;
40+
pub use crate::crates::{AlternativeRegistry, Crate};
4141
pub use crate::prepare::PrepareError;
4242
pub use crate::toolchain::Toolchain;
4343
pub use crate::workspace::{Workspace, WorkspaceBuilder};

tests/integration/crates_alt.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use failure::Error;
2-
use rustwide::Crate;
2+
use rustwide::{AlternativeRegistry, Crate};
33

44
const INDEX_URL: &str = "https://github.com/rust-lang/staging.crates.io-index";
55

66
#[test]
77
fn test_fetch() -> Result<(), Error> {
88
let workspace = crate::utils::init_workspace()?;
99

10-
let krate = Crate::registry(INDEX_URL, "foo", "0.4.0");
10+
let alt = AlternativeRegistry::new(INDEX_URL);
11+
let krate = Crate::registry(alt, "foo", "0.4.0");
1112
krate.fetch(&workspace)?;
1213

1314
Ok(())

0 commit comments

Comments
 (0)