Skip to content

Commit 62b8f70

Browse files
authored
Merge pull request #460 from jyn514/build-local
Build local packages
2 parents 0ce1731 + c4d8d5d commit 62b8f70

File tree

6 files changed

+52
-13
lines changed

6 files changed

+52
-13
lines changed

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ docker-compose run web build crate <CRATE_NAME> <CRATE_VERSION>
105105
# Builds every crate and adds them into database
106106
# (beware: this may take months to finish)
107107
docker-compose run web build world
108+
109+
# Builds a local package you have at <SOURCE> and adds it to the database.
110+
# The package does not have to be on crates.io.
111+
# The package must be on the local filesystem, git urls are not allowed.
112+
docker-compose run -v "$(realpath <SOURCE>)":/build web build crate --local /build
108113
```
109114

110115

src/bin/cratesfyi.rs

+16-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ extern crate rustwide;
99

1010

1111
use std::env;
12-
use std::path::PathBuf;
12+
use std::path::{Path, PathBuf};
1313

1414
use clap::{Arg, App, SubCommand};
1515
use cratesfyi::{DocBuilder, RustwideBuilder, DocBuilderOptions, db};
@@ -53,12 +53,18 @@ pub fn main() {
5353
.about("Builds documentation for a crate")
5454
.arg(Arg::with_name("CRATE_NAME")
5555
.index(1)
56-
.required(true)
56+
.required_unless("LOCAL")
57+
.requires("CRATE_VERSION")
5758
.help("Crate name"))
5859
.arg(Arg::with_name("CRATE_VERSION")
5960
.index(2)
60-
.required(true)
61-
.help("Version of crate")))
61+
.help("Version of crate"))
62+
.arg(Arg::with_name("LOCAL")
63+
.short("-l")
64+
.long("--local")
65+
.takes_value(true)
66+
.conflicts_with_all(&["CRATE_NAME", "CRATE_VERSION"])
67+
.help("Build a crate at a specific path")))
6268
.subcommand(SubCommand::with_name("add-essential-files")
6369
.about("Adds essential files for rustc"))
6470
.subcommand(SubCommand::with_name("lock").about("Locks cratesfyi daemon to stop \
@@ -155,10 +161,12 @@ pub fn main() {
155161
docbuilder.save_cache().expect("Failed to save cache");
156162
} else if let Some(matches) = matches.subcommand_matches("crate") {
157163
docbuilder.load_cache().expect("Failed to load cache");
158-
let mut builder = RustwideBuilder::init().unwrap();
159-
builder.build_package(&mut docbuilder, matches.value_of("CRATE_NAME").unwrap(),
160-
matches.value_of("CRATE_VERSION").unwrap())
161-
.expect("Building documentation failed");
164+
let mut builder = RustwideBuilder::init().expect("failed to initialize rustwide");
165+
match matches.value_of("LOCAL") {
166+
Some(path) => builder.build_local_package(&mut docbuilder, Path::new(path)),
167+
None => builder.build_package(&mut docbuilder,
168+
matches.value_of("CRATE_NAME").unwrap(), matches.value_of("CRATE_VERSION").unwrap(), None),
169+
}.expect("Building documentation failed");
162170
docbuilder.save_cache().expect("Failed to save cache");
163171
} else if let Some(_) = matches.subcommand_matches("add-essential-files") {
164172
let mut builder = RustwideBuilder::init().unwrap();

src/db/add_package.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ fn read_rust_doc(file_path: &Path) -> Result<Option<String>> {
288288
/// Get release_time, yanked and downloads from crates.io
289289
fn get_release_time_yanked_downloads(
290290
pkg: &MetadataPackage,
291-
) -> Result<(Option<time::Timespec>, Option<bool>, Option<i32>)> {
291+
) -> Result<(time::Timespec, bool, i32)> {
292292
let url = format!("https://crates.io/api/v1/crates/{}/versions", pkg.name);
293293
// FIXME: There is probably better way to do this
294294
// and so many unwraps...
@@ -332,7 +332,7 @@ fn get_release_time_yanked_downloads(
332332
}
333333
}
334334

335-
Ok((release_time, yanked, downloads))
335+
Ok((release_time.unwrap_or(time::get_time()), yanked.unwrap_or(false), downloads.unwrap_or(0)))
336336
}
337337

338338

src/db/migrate.rs

+10
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,16 @@ pub fn migrate(version: Option<Version>) -> CratesfyiResult<()> {
193193
// downgrade query
194194
"DROP TABLE sandbox_overrides;"
195195
),
196+
migration!(
197+
4,
198+
"Make more fields not null",
199+
"ALTER TABLE releases ALTER COLUMN release_time SET NOT NULL,
200+
ALTER COLUMN yanked SET NOT NULL,
201+
ALTER COLUMN downloads SET NOT NULL",
202+
"ALTER TABLE releases ALTER COLUMN release_time DROP NOT NULL,
203+
ALTER COLUMN yanked DROP NOT NULL,
204+
ALTER COLUMN downloads DROP NOT NULL"
205+
)
196206
];
197207

198208
for migration in migrations {

src/docbuilder/queue.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl DocBuilder {
5959
let name: String = query.get(0).get(1);
6060
let version: String = query.get(0).get(2);
6161

62-
match builder.build_package(self, &name, &version) {
62+
match builder.build_package(self, &name, &version, None) {
6363
Ok(_) => {
6464
let _ = conn.execute("DELETE FROM queue WHERE id = $1", &[&id]);
6565
::web::metrics::TOTAL_BUILDS.inc();

src/docbuilder/rustwide_builder.rs

+18-2
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ impl RustwideBuilder {
204204
crates_from_path(
205205
&doc_builder.options().crates_io_index_path.clone(),
206206
&mut |name, version| {
207-
match self.build_package(doc_builder, name, version) {
207+
match self.build_package(doc_builder, name, version, None) {
208208
Ok(status) => {
209209
count += 1;
210210
if status && count % 10 == 0 {
@@ -218,11 +218,23 @@ impl RustwideBuilder {
218218
)
219219
}
220220

221+
pub fn build_local_package(
222+
&mut self,
223+
doc_builder: &mut DocBuilder,
224+
path: &Path,
225+
) -> Result<bool> {
226+
self.update_toolchain()?;
227+
let metadata = CargoMetadata::load(&self.workspace, &self.toolchain, path)?;
228+
let package = metadata.root();
229+
self.build_package(doc_builder, &package.name, &package.version, Some(path))
230+
}
231+
221232
pub fn build_package(
222233
&mut self,
223234
doc_builder: &mut DocBuilder,
224235
name: &str,
225236
version: &str,
237+
local: Option<&Path>,
226238
) -> Result<bool> {
227239
if !doc_builder.should_build(name, version) {
228240
return Ok(false);
@@ -238,7 +250,11 @@ impl RustwideBuilder {
238250
let mut build_dir = self.workspace.build_dir(&format!("{}-{}", name, version));
239251
build_dir.purge()?;
240252

241-
let krate = Crate::crates_io(name, version);
253+
let krate = if let Some(path) = local {
254+
Crate::local(path)
255+
} else {
256+
Crate::crates_io(name, version)
257+
};
242258
krate.fetch(&self.workspace)?;
243259

244260
let sandbox = SandboxBuilder::new()

0 commit comments

Comments
 (0)