build_helper/
stage0_parser.rs

1use std::collections::BTreeMap;
2
3#[derive(Default, Clone)]
4pub struct Stage0 {
5    pub compiler: VersionMetadata,
6    pub rustfmt: Option<VersionMetadata>,
7    pub config: Stage0Config,
8    pub checksums_sha256: BTreeMap<String, String>,
9}
10
11#[derive(Default, Clone)]
12pub struct VersionMetadata {
13    pub date: String,
14    pub version: String,
15}
16
17#[derive(Default, Clone)]
18pub struct Stage0Config {
19    pub dist_server: String,
20    pub artifacts_server: String,
21    pub artifacts_with_llvm_assertions_server: String,
22    pub git_merge_commit_email: String,
23    pub git_repository: String,
24    pub nightly_branch: String,
25}
26
27pub fn parse_stage0_file() -> Stage0 {
28    let stage0_content = include_str!("../../stage0");
29
30    let mut stage0 = Stage0::default();
31    for line in stage0_content.lines() {
32        let line = line.trim();
33
34        if line.is_empty() {
35            continue;
36        }
37
38        // Ignore comments
39        if line.starts_with('#') {
40            continue;
41        }
42
43        let (key, value) = line.split_once('=').unwrap();
44
45        match key {
46            "dist_server" => stage0.config.dist_server = value.to_owned(),
47            "artifacts_server" => stage0.config.artifacts_server = value.to_owned(),
48            "artifacts_with_llvm_assertions_server" => {
49                stage0.config.artifacts_with_llvm_assertions_server = value.to_owned()
50            }
51            "git_merge_commit_email" => stage0.config.git_merge_commit_email = value.to_owned(),
52            "git_repository" => stage0.config.git_repository = value.to_owned(),
53            "nightly_branch" => stage0.config.nightly_branch = value.to_owned(),
54
55            "compiler_date" => stage0.compiler.date = value.to_owned(),
56            "compiler_version" => stage0.compiler.version = value.to_owned(),
57
58            "rustfmt_date" => {
59                stage0.rustfmt.get_or_insert(VersionMetadata::default()).date = value.to_owned();
60            }
61            "rustfmt_version" => {
62                stage0.rustfmt.get_or_insert(VersionMetadata::default()).version = value.to_owned();
63            }
64
65            dist if dist.starts_with("dist") => {
66                stage0.checksums_sha256.insert(key.to_owned(), value.to_owned());
67            }
68
69            unsupported => {
70                println!("'{unsupported}' field is not supported.");
71            }
72        }
73    }
74
75    stage0
76}