Skip to content

Commit 427d874

Browse files
committed
Add rust-version field to the index
1 parent 6342381 commit 427d874

File tree

12 files changed

+54
-0
lines changed

12 files changed

+54
-0
lines changed

cargo-registry-index/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ pub struct Crate {
125125
pub yanked: Option<bool>,
126126
#[serde(skip_serializing_if = "Option::is_none")]
127127
pub links: Option<String>,
128+
#[serde(skip_serializing_if = "Option::is_none")]
129+
pub rust_version: Option<String>,
128130
/// The schema version for this entry.
129131
///
130132
/// If this is None, it defaults to version 1. Entries with unknown
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE versions DROP COLUMN rust_version;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE versions ADD COLUMN rust_version VARCHAR;

src/controllers/krate/publish.rs

+3
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
114114
let name = new_crate.name;
115115
let vers = &*new_crate.vers;
116116
let links = new_crate.links;
117+
let rust_version = new_crate.rust_version.as_deref();
117118
let repo = new_crate.repository;
118119
let features = new_crate
119120
.features
@@ -201,6 +202,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
201202
user.id,
202203
hex_cksum.clone(),
203204
links.clone(),
205+
rust_version.map(String::as_str),
204206
)?
205207
.save(conn, &verified_email_address)?;
206208

@@ -269,6 +271,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
269271
deps: git_deps,
270272
yanked: Some(false),
271273
links,
274+
rust_version: rust_version.map(ToOwned::to_owned),
272275
v,
273276
};
274277
worker::add_crate(git_crate).enqueue(conn)?;

src/downloads_counter.rs

+1
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ mod tests {
459459
self.user.id,
460460
"0000000000000000000000000000000000000000000000000000000000000000".to_string(),
461461
None,
462+
None,
462463
)
463464
.expect("failed to create version")
464465
.save(conn, "ghost@example.com")

src/models/version.rs

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub struct Version {
2525
pub published_by: Option<i32>,
2626
pub checksum: String,
2727
pub links: Option<String>,
28+
pub rust_version: Option<String>,
2829
}
2930

3031
#[derive(Insertable, Debug)]
@@ -38,6 +39,7 @@ pub struct NewVersion {
3839
published_by: i32,
3940
checksum: String,
4041
links: Option<String>,
42+
rust_version: Option<String>,
4143
}
4244

4345
/// The highest version (semver order) and the most recently updated version.
@@ -139,6 +141,7 @@ impl NewVersion {
139141
published_by: i32,
140142
checksum: String,
141143
links: Option<String>,
144+
rust_version: Option<&str>,
142145
) -> AppResult<Self> {
143146
let features = serde_json::to_value(features)?;
144147

@@ -151,6 +154,7 @@ impl NewVersion {
151154
published_by,
152155
checksum,
153156
links,
157+
rust_version: rust_version.map(ToOwned::to_owned),
154158
};
155159

156160
new_version.validate_license(license_file)?;

src/schema.rs

+6
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,12 @@ diesel::table! {
966966
///
967967
/// (Automatically generated by Diesel.)
968968
links -> Nullable<Varchar>,
969+
/// The `rust_version` column of the `versions` table.
970+
///
971+
/// Its SQL type is `Nullable<Varchar>`.
972+
///
973+
/// (Automatically generated by Diesel.)
974+
rust_version -> Nullable<Varchar>,
969975
}
970976
}
971977

src/tests/builders/publish.rs

+1
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ impl PublishBuilder {
195195
license_file: self.license_file,
196196
repository: None,
197197
links: None,
198+
rust_version: None,
198199
};
199200

200201
(serde_json::to_string(&new_crate).unwrap(), self.tarball)

src/tests/builders/version.rs

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub struct VersionBuilder<'a> {
2020
yanked: bool,
2121
checksum: String,
2222
links: Option<String>,
23+
rust_version: Option<String>,
2324
}
2425

2526
impl<'a> VersionBuilder<'a> {
@@ -45,6 +46,7 @@ impl<'a> VersionBuilder<'a> {
4546
yanked: false,
4647
checksum: String::new(),
4748
links: None,
49+
rust_version: None,
4850
}
4951
}
5052

@@ -103,6 +105,7 @@ impl<'a> VersionBuilder<'a> {
103105
published_by,
104106
self.checksum,
105107
self.links,
108+
self.rust_version.as_deref(),
106109
)?
107110
.save(connection, "someone@example.com")?;
108111

src/views/krate_publish.rs

+30
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ pub struct EncodableCrateUpload {
3232
pub repository: Option<String>,
3333
#[serde(default)]
3434
pub links: Option<String>,
35+
#[serde(default)]
36+
pub rust_version: Option<EncodableRustVersion>,
3537
}
3638

3739
#[derive(PartialEq, Eq, Hash, Serialize, Debug, Deref)]
@@ -42,6 +44,8 @@ pub struct EncodableDependencyName(pub String);
4244
pub struct EncodableCrateVersion(pub semver::Version);
4345
#[derive(Debug, Deref)]
4446
pub struct EncodableCrateVersionReq(pub String);
47+
#[derive(Debug, Deref, Clone)]
48+
pub struct EncodableRustVersion(pub String);
4549
#[derive(Serialize, Debug, Deref, Default)]
4650
pub struct EncodableKeywordList(pub Vec<EncodableKeyword>);
4751
#[derive(Serialize, Debug, Deref)]
@@ -177,6 +181,23 @@ impl<'de> Deserialize<'de> for EncodableCrateVersionReq {
177181
}
178182
}
179183

184+
impl<'de> Deserialize<'de> for EncodableRustVersion {
185+
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<EncodableRustVersion, D::Error> {
186+
let s = String::deserialize(d)?;
187+
match semver::VersionReq::parse(&s) {
188+
// Exclude semver operators like `^` and pre-release identifiers
189+
Ok(_) if s.chars().all(|c| c.is_ascii_digit() || c == '.') => {
190+
Ok(EncodableRustVersion(s))
191+
}
192+
Ok(_) | Err(..) => {
193+
let value = de::Unexpected::Str(&s);
194+
let expected = "a valid rust-version";
195+
Err(de::Error::invalid_value(value, &expected))
196+
}
197+
}
198+
}
199+
}
200+
180201
impl<'de> Deserialize<'de> for EncodableKeywordList {
181202
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<EncodableKeywordList, D::Error> {
182203
let inner = <Vec<EncodableKeyword> as Deserialize<'de>>::deserialize(d)?;
@@ -224,6 +245,15 @@ impl Serialize for EncodableCrateVersionReq {
224245
}
225246
}
226247

248+
impl Serialize for EncodableRustVersion {
249+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
250+
where
251+
S: Serializer,
252+
{
253+
serializer.serialize_str(&(**self).to_string())
254+
}
255+
}
256+
227257
use diesel::pg::Pg;
228258
use diesel::serialize::{self, Output, ToSql};
229259
use diesel::sql_types::Text;

src/worker/dump_db/dump-db.toml

+1
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ crate_size = "public"
217217
published_by = "public"
218218
checksum = "public"
219219
links = "public"
220+
rust_version = "public"
220221

221222
[versions_published_by.columns]
222223
version_id = "private"

src/worker/update_downloads.rs

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ mod test {
114114
user_id,
115115
"0000000000000000000000000000000000000000000000000000000000000000".to_string(),
116116
None,
117+
None,
117118
)
118119
.unwrap();
119120
let version = version.save(conn, "someone@example.com").unwrap();

0 commit comments

Comments
 (0)