Skip to content

Commit 10dc6f5

Browse files
authored
Merge pull request #550 from jyn514/one-default-target
Remove duplicate default target (redux)
2 parents b7035e3 + bcd7f14 commit 10dc6f5

File tree

10 files changed

+174
-52
lines changed

10 files changed

+174
-52
lines changed

src/db/add_package.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ pub(crate) fn add_package_into_database(conn: &Connection,
2929
metadata_pkg: &MetadataPackage,
3030
source_dir: &Path,
3131
res: &BuildResult,
32+
default_target: &str,
3233
source_files: Option<Json>,
3334
doc_targets: Vec<String>,
34-
default_target: &Option<String>,
3535
cratesio_data: &CratesIoData,
3636
has_docs: bool,
3737
has_examples: bool)

src/db/migrate.rs

+13
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,19 @@ fn migrate_inner(version: Option<Version>, conn: &Connection, apply_mode: ApplyM
280280
// downgrade query
281281
"ALTER TABLE sandbox_overrides ALTER COLUMN max_memory_bytes TYPE INTEGER;"
282282
),
283+
migration!(
284+
context,
285+
// version
286+
8,
287+
// description
288+
"Make default_target non-nullable",
289+
// upgrade query
290+
"UPDATE releases SET default_target = 'x86_64-unknown-linux-gnu' WHERE default_target IS NULL;
291+
ALTER TABLE releases ALTER COLUMN default_target SET NOT NULL",
292+
// downgrade query
293+
"ALTER TABLE releases ALTER COLUMN default_target DROP NOT NULL;
294+
ALTER TABLE releases ALTER COLUMN default_target DROP DEFAULT",
295+
),
283296
];
284297

285298
for migration in migrations {

src/docbuilder/rustwide_builder.rs

+42-39
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,19 @@ use std::path::Path;
1818
use utils::{copy_doc_dir, parse_rustc_version, CargoMetadata};
1919
use Metadata;
2020

21-
static USER_AGENT: &str = "docs.rs builder (https://github.com/rust-lang/docs.rs)";
22-
static DEFAULT_RUSTWIDE_WORKSPACE: &str = ".rustwide";
21+
const USER_AGENT: &str = "docs.rs builder (https://github.com/rust-lang/docs.rs)";
22+
const DEFAULT_RUSTWIDE_WORKSPACE: &str = ".rustwide";
2323

24-
static TARGETS: &[&str] = &[
24+
const DEFAULT_TARGET: &str = "x86_64-unknown-linux-gnu";
25+
const TARGETS: &[&str] = &[
2526
"i686-pc-windows-msvc",
2627
"i686-unknown-linux-gnu",
2728
"x86_64-apple-darwin",
2829
"x86_64-pc-windows-msvc",
2930
"x86_64-unknown-linux-gnu",
3031
];
3132

32-
static ESSENTIAL_FILES_VERSIONED: &[&str] = &[
33+
const ESSENTIAL_FILES_VERSIONED: &[&str] = &[
3334
"brush.svg",
3435
"wheel.svg",
3536
"down-arrow.svg",
@@ -46,7 +47,7 @@ static ESSENTIAL_FILES_VERSIONED: &[&str] = &[
4647
"noscript.css",
4748
"rust-logo.png",
4849
];
49-
static ESSENTIAL_FILES_UNVERSIONED: &[&str] = &[
50+
const ESSENTIAL_FILES_UNVERSIONED: &[&str] = &[
5051
"FiraSans-Medium.woff",
5152
"FiraSans-Regular.woff",
5253
"SourceCodePro-Regular.woff",
@@ -56,8 +57,8 @@ static ESSENTIAL_FILES_UNVERSIONED: &[&str] = &[
5657
"SourceSerifPro-It.ttf.woff",
5758
];
5859

59-
static DUMMY_CRATE_NAME: &str = "acme-client";
60-
static DUMMY_CRATE_VERSION: &str = "0.0.0";
60+
const DUMMY_CRATE_NAME: &str = "acme-client";
61+
const DUMMY_CRATE_VERSION: &str = "0.0.0";
6162

6263
pub struct RustwideBuilder {
6364
workspace: Workspace,
@@ -189,7 +190,7 @@ impl RustwideBuilder {
189190
}
190191

191192
info!("copying essential files for {}", self.rustc_version);
192-
let source = build.host_target_dir().join(&res.target).join("doc");
193+
let source = build.host_target_dir().join("doc");
193194
let dest = ::tempdir::TempDir::new("essential-files")?;
194195

195196
let files = ESSENTIAL_FILES_VERSIONED
@@ -303,7 +304,7 @@ impl RustwideBuilder {
303304
.build(&self.toolchain, &krate, sandbox)
304305
.run(|build| {
305306
let mut files_list = None;
306-
let (mut has_docs, mut in_target) = (false, false);
307+
let mut has_docs = false;
307308
let mut successful_targets = Vec::new();
308309

309310
// Do an initial build and then copy the sources in the database
@@ -319,20 +320,7 @@ impl RustwideBuilder {
319320

320321
if let Some(name) = res.cargo_metadata.root().library_name() {
321322
let host_target = build.host_target_dir();
322-
if host_target
323-
.join(&res.target)
324-
.join("doc")
325-
.join(&name)
326-
.is_dir()
327-
{
328-
has_docs = true;
329-
in_target = true;
330-
// hack for proc-macro documentation:
331-
// it really should be in target/$target/doc,
332-
// but rustdoc has a bug and puts it in target/doc
333-
} else if host_target.join("doc").join(name).is_dir() {
334-
has_docs = true;
335-
}
323+
has_docs = host_target.join("doc").join(name).is_dir();
336324
}
337325
}
338326

@@ -341,22 +329,24 @@ impl RustwideBuilder {
341329
self.copy_docs(
342330
&build.host_target_dir(),
343331
local_storage.path(),
344-
if in_target { &res.target } else { "" },
332+
"",
345333
true,
346334
)?;
347335

348-
if in_target {
349-
// Then build the documentation for all the targets
350-
for target in TARGETS {
351-
debug!("building package {} {} for {}", name, version, target);
352-
self.build_target(
353-
target,
354-
&build,
355-
&limits,
356-
&local_storage.path(),
357-
&mut successful_targets,
358-
)?;
336+
successful_targets.push(res.target.clone());
337+
// Then build the documentation for all the targets
338+
for target in TARGETS {
339+
if *target == res.target {
340+
continue;
359341
}
342+
debug!("building package {} {} for {}", name, version, &target);
343+
self.build_target(
344+
&target,
345+
&build,
346+
&limits,
347+
&local_storage.path(),
348+
&mut successful_targets,
349+
)?;
360350
}
361351
self.upload_docs(&conn, name, version, local_storage.path())?;
362352
}
@@ -374,9 +364,9 @@ impl RustwideBuilder {
374364
res.cargo_metadata.root(),
375365
&build.host_source_dir(),
376366
&res.result,
367+
&res.target,
377368
files_list,
378369
successful_targets,
379-
&res.default_target,
380370
&CratesIoData::get_from_network(res.cargo_metadata.root())?,
381371
has_docs,
382372
has_examples,
@@ -425,6 +415,7 @@ impl RustwideBuilder {
425415
let cargo_metadata =
426416
CargoMetadata::load(&self.workspace, &self.toolchain, &build.host_source_dir())?;
427417

418+
let is_default_target = target.is_none();
428419
let target = target.or_else(|| metadata.default_target.as_ref().map(|s| s.as_str()));
429420

430421
let mut rustdoc_flags: Vec<String> = vec![
@@ -484,6 +475,20 @@ impl RustwideBuilder {
484475
.run()
485476
.is_ok()
486477
});
478+
// If we're passed a default_target which requires a cross-compile,
479+
// cargo will put the output in `target/<target>/doc`.
480+
// However, if this is the default build, we don't want it there,
481+
// we want it in `target/doc`.
482+
if let Some(explicit_target) = target {
483+
if is_default_target {
484+
// mv target/$explicit_target/doc target/doc
485+
let target_dir = build.host_target_dir();
486+
let old_dir = target_dir.join(explicit_target).join("doc");
487+
let new_dir = target_dir.join("doc");
488+
debug!("rename {} to {}", old_dir.display(), new_dir.display());
489+
std::fs::rename(old_dir, new_dir)?;
490+
}
491+
}
487492

488493
Ok(FullBuildResult {
489494
result: BuildResult {
@@ -493,8 +498,7 @@ impl RustwideBuilder {
493498
successful,
494499
},
495500
cargo_metadata,
496-
target: target.unwrap_or_default().to_string(),
497-
default_target: metadata.default_target.clone(),
501+
target: target.unwrap_or(DEFAULT_TARGET).to_string(),
498502
})
499503
}
500504

@@ -542,7 +546,6 @@ impl RustwideBuilder {
542546
struct FullBuildResult {
543547
result: BuildResult,
544548
target: String,
545-
default_target: Option<String>,
546549
cargo_metadata: CargoMetadata,
547550
}
548551

src/test/fakes.rs

+17-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub(crate) struct FakeRelease<'a> {
1414
/// name, content
1515
rustdoc_files: Vec<(&'a str, &'a [u8])>,
1616
doc_targets: Vec<String>,
17-
default_target: Option<String>,
17+
default_target: Option<&'a str>,
1818
cratesio_data: CratesIoData,
1919
has_docs: bool,
2020
has_examples: bool,
@@ -67,6 +67,7 @@ impl<'a> FakeRelease<'a> {
6767
pub(crate) fn name(mut self, new: &str) -> Self {
6868
self.package.name = new.into();
6969
self.package.id = format!("{}-id", new);
70+
self.package.targets[0].name = new.into();
7071
self
7172
}
7273

@@ -90,16 +91,28 @@ impl<'a> FakeRelease<'a> {
9091
self
9192
}
9293

94+
pub(crate) fn default_target(mut self, target: &'a str) -> Self {
95+
self.default_target = Some(target);
96+
self
97+
}
98+
9399
pub(crate) fn create(self) -> Result<i32, Error> {
100+
use std::fs;
101+
use std::path::Path;
102+
94103
let tempdir = tempdir::TempDir::new("docs.rs-fake")?;
95104

96105
let upload_files = |prefix: &str, files: &[(&str, &[u8])]| {
97106
let path_prefix = tempdir.path().join(prefix);
98-
std::fs::create_dir(&path_prefix)?;
107+
fs::create_dir(&path_prefix)?;
99108

100109
for (path, data) in files {
110+
// allow `src/main.rs`
111+
if let Some(parent) = Path::new(path).parent() {
112+
fs::create_dir_all(path_prefix.join(parent))?;
113+
}
101114
let file = path_prefix.join(&path);
102-
std::fs::write(file, data)?;
115+
fs::write(file, data)?;
103116
}
104117

105118
let prefix = format!("{}/{}/{}", prefix, self.package.name, self.package.version);
@@ -116,9 +129,9 @@ impl<'a> FakeRelease<'a> {
116129
&self.package,
117130
tempdir.path(),
118131
&self.build_result,
132+
self.default_target.unwrap_or("x86_64-unknown-linux-gnu"),
119133
Some(source_meta),
120134
self.doc_targets,
121-
&self.default_target,
122135
&self.cratesio_data,
123136
self.has_docs,
124137
self.has_examples,

src/test/mod.rs

+14
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ pub(crate) fn assert_success(path: &str, web: &TestFrontend) -> Result<(), Error
3737
Ok(())
3838
}
3939

40+
/// Make sure that a URL redirects to a specific page
41+
pub(crate) fn assert_redirect(path: &str, expected_target: &str, web: &TestFrontend) -> Result<(), Error> {
42+
let response = web.get(path).send()?;
43+
let status = response.status();
44+
// Reqwest follows redirects
45+
assert!(status.is_success(), "failed to GET {}: {}", path, status);
46+
47+
let redirect_target = response.url().path();
48+
assert!(redirect_target == expected_target,
49+
"{}: expected redirect to {}, got redirect to {}",
50+
path, expected_target, redirect_target);
51+
Ok(())
52+
}
53+
4054
pub(crate) struct TestEnvironment {
4155
db: OnceCell<TestDatabase>,
4256
frontend: OnceCell<TestFrontend>,

src/web/crate_details.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub struct CrateDetails {
4343
github_stars: Option<i32>,
4444
github_forks: Option<i32>,
4545
github_issues: Option<i32>,
46-
metadata: MetaData,
46+
pub metadata: MetaData,
4747
is_library: bool,
4848
doc_targets: Option<Json>,
4949
license: Option<String>,
@@ -138,7 +138,8 @@ impl CrateDetails {
138138
releases.is_library,
139139
releases.doc_targets,
140140
releases.license,
141-
releases.documentation_url
141+
releases.documentation_url,
142+
releases.default_target
142143
FROM releases
143144
INNER JOIN crates ON releases.crate_id = crates.id
144145
WHERE crates.name = $1 AND releases.version = $2;";
@@ -178,6 +179,7 @@ impl CrateDetails {
178179
description: rows.get(0).get(4),
179180
rustdoc_status: rows.get(0).get(11),
180181
target_name: rows.get(0).get(16),
182+
default_target: rows.get(0).get(25),
181183
};
182184

183185
let mut crate_details = CrateDetails {

src/web/mod.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ pub struct MetaData {
458458
pub description: Option<String>,
459459
pub target_name: Option<String>,
460460
pub rustdoc_status: bool,
461+
pub default_target: String,
461462
}
462463

463464

@@ -467,7 +468,8 @@ impl MetaData {
467468
releases.version,
468469
releases.description,
469470
releases.target_name,
470-
releases.rustdoc_status
471+
releases.rustdoc_status,
472+
releases.default_target
471473
FROM releases
472474
INNER JOIN crates ON crates.id = releases.crate_id
473475
WHERE crates.name = $1 AND releases.version = $2",
@@ -480,6 +482,7 @@ impl MetaData {
480482
description: row.get(2),
481483
target_name: row.get(3),
482484
rustdoc_status: row.get(4),
485+
default_target: row.get(5),
483486
});
484487
}
485488

@@ -496,6 +499,7 @@ impl ToJson for MetaData {
496499
m.insert("description".to_owned(), self.description.to_json());
497500
m.insert("target_name".to_owned(), self.target_name.to_json());
498501
m.insert("rustdoc_status".to_owned(), self.rustdoc_status.to_json());
502+
m.insert("default_target".to_owned(), self.default_target.to_json());
499503
m.to_json()
500504
}
501505
}

0 commit comments

Comments
 (0)