Skip to content

Commit f9b29e6

Browse files
committed
bug: warn when a release tag name does not match the expected version pattern
1 parent a6e93f8 commit f9b29e6

File tree

2 files changed

+71
-14
lines changed

2 files changed

+71
-14
lines changed

postgresql_archive/src/archive.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::io::{copy, BufReader, Cursor};
1616
use std::path::Path;
1717
use std::str::FromStr;
1818
use tar::Archive;
19-
use tracing::{debug, info};
19+
use tracing::{debug, info, warn};
2020

2121
const GITHUB_API_VERSION_HEADER: &str = "X-GitHub-Api-Version";
2222
const GITHUB_API_VERSION: &str = "2022-11-28";
@@ -98,7 +98,14 @@ async fn get_release(version: &Version) -> Result<Release> {
9898
}
9999

100100
for release in response_releases {
101-
let release_version = Version::from_str(&release.tag_name)?;
101+
let release_version = match Version::from_str(&release.tag_name) {
102+
Ok(release_version) => release_version,
103+
Err(_) => {
104+
warn!("Failed to parse release version {}", release.tag_name);
105+
continue;
106+
}
107+
};
108+
102109
if version.matches(&release_version) {
103110
match &result {
104111
Some(result_release) => {

postgresql_archive/src/version.rs

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
use crate::error::ArchiveError::InvalidVersion;
55
use crate::error::{ArchiveError, Result};
6+
use serde::{Deserialize, Serialize};
67
use std::fmt;
78
use std::str::FromStr;
89

@@ -124,6 +125,25 @@ impl FromStr for Version {
124125
}
125126
}
126127

128+
impl<'de> Deserialize<'de> for Version {
129+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
130+
where
131+
D: serde::Deserializer<'de>,
132+
{
133+
let version = String::deserialize(deserializer)?;
134+
Version::from_str(&version).map_err(serde::de::Error::custom)
135+
}
136+
}
137+
138+
impl Serialize for Version {
139+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
140+
where
141+
S: serde::Serializer,
142+
{
143+
self.to_string().serialize(serializer)
144+
}
145+
}
146+
127147
#[cfg(test)]
128148
mod tests {
129149
use super::*;
@@ -134,7 +154,7 @@ mod tests {
134154
//
135155

136156
#[test]
137-
fn matches_all() {
157+
fn test_matches_all() {
138158
assert!(&Version::new(1, None, None).matches(&Version::new(1, None, None)));
139159
assert!(!&Version::new(1, None, None).matches(&Version::new(2, None, None)));
140160

@@ -156,23 +176,23 @@ mod tests {
156176
//
157177

158178
#[test]
159-
fn version_display() -> Result<()> {
179+
fn test_version_display() -> Result<()> {
160180
let version_str = "1.2.3";
161181
let version = Version::from_str(version_str)?;
162182
assert_eq!(version_str, version.to_string());
163183
Ok(())
164184
}
165185

166186
#[test]
167-
fn version_display_major() -> Result<()> {
187+
fn test_version_display_major() -> Result<()> {
168188
let version_str = "1";
169189
let version = Version::from_str(version_str)?;
170190
assert_eq!(version_str, version.to_string());
171191
Ok(())
172192
}
173193

174194
#[test]
175-
fn version_display_major_minor() -> Result<()> {
195+
fn test_version_display_major_minor() -> Result<()> {
176196
let version_str = "1.2";
177197
let version = Version::from_str(version_str)?;
178198
assert_eq!(version_str, version.to_string());
@@ -184,7 +204,7 @@ mod tests {
184204
//
185205

186206
#[test]
187-
fn version_from_str() -> Result<()> {
207+
fn test_version_from_str() -> Result<()> {
188208
let version = Version::from_str("1.2.3")?;
189209
assert_eq!(version.major, 1u64);
190210
assert_eq!(version.minor, Some(2));
@@ -193,7 +213,7 @@ mod tests {
193213
}
194214

195215
#[test]
196-
fn version_from_str_major() -> Result<()> {
216+
fn test_version_from_str_major() -> Result<()> {
197217
let version = Version::from_str("1")?;
198218
assert_eq!(version.major, 1);
199219
assert_eq!(version.minor, None);
@@ -202,7 +222,7 @@ mod tests {
202222
}
203223

204224
#[test]
205-
fn version_from_str_major_minor() -> Result<()> {
225+
fn test_version_from_str_major_minor() -> Result<()> {
206226
let version = Version::from_str("1.2")?;
207227
assert_eq!(version.major, 1);
208228
assert_eq!(version.minor, Some(2));
@@ -211,27 +231,57 @@ mod tests {
211231
}
212232

213233
#[test]
214-
fn version_from_str_error_missing_major() {
234+
fn test_version_from_str_error_missing_major() {
215235
assert!(Version::from_str("").is_err());
216236
}
217237

218238
#[test]
219-
fn version_from_str_error_invalid_major() {
239+
fn test_version_from_str_error_invalid_major() {
220240
assert!(Version::from_str("a").is_err());
221241
}
222242

223243
#[test]
224-
fn version_from_str_error_invalid_minor() {
244+
fn test_version_from_str_error_invalid_minor() {
225245
assert!(Version::from_str("1.a").is_err());
226246
}
227247

228248
#[test]
229-
fn version_from_str_error_invalid_release() {
249+
fn test_version_from_str_error_invalid_release() {
230250
assert!(Version::from_str("1.2.a").is_err());
231251
}
232252

233253
#[test]
234-
fn version_from_str_error_too_many_parts() {
254+
fn test_version_from_str_error_too_many_parts() {
235255
assert!(Version::from_str("1.2.3.4").is_err());
236256
}
257+
258+
//
259+
// Deserialize tests
260+
//
261+
262+
#[test]
263+
fn test_version_deserialize() -> anyhow::Result<()> {
264+
let version = serde_json::from_str::<Version>("\"1.2.3\"")?;
265+
assert_eq!(version.major, 1u64);
266+
assert_eq!(version.minor, Some(2));
267+
assert_eq!(version.release, Some(3));
268+
Ok(())
269+
}
270+
271+
#[test]
272+
fn test_version_deserialize_parse_error() {
273+
assert!(serde_json::from_str::<Version>("\"foo\"").is_err())
274+
}
275+
276+
//
277+
// Serialize tests
278+
//
279+
280+
#[test]
281+
fn test_version_serialize() -> anyhow::Result<()> {
282+
let version = Version::new(1, Some(2), Some(3));
283+
let version_str = serde_json::to_string(&version)?;
284+
assert_eq!(version_str, "\"1.2.3\"");
285+
Ok(())
286+
}
237287
}

0 commit comments

Comments
 (0)