Skip to content

Commit 2e58c24

Browse files
authored
Modify the git-import tool to only import the links field (#6330)
1 parent ca6b8af commit 2e58c24

File tree

1 file changed

+20
-64
lines changed

1 file changed

+20
-64
lines changed

src/admin/git_import.rs

Lines changed: 20 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use indicatif::{ProgressBar, ProgressIterator, ProgressStyle};
1313
use crate::{
1414
admin::dialoguer,
1515
db,
16-
schema::{crates, dependencies, versions},
16+
schema::{crates, versions},
1717
};
1818

1919
#[derive(clap::Parser, Debug, Copy, Clone)]
@@ -56,9 +56,16 @@ pub fn run(opts: Opts) -> anyhow::Result<()> {
5656
let result = conn.transaction(|conn| -> anyhow::Result<()> {
5757
for line in reader.lines() {
5858
let krate: cargo_registry_index::Crate = serde_json::from_str(&line?)?;
59-
import_data(conn, &krate).with_context(|| {
60-
format!("Failed to update crate {}#{}", krate.name, krate.vers)
61-
})?
59+
if krate.links.is_some() {
60+
let rows = import_data(conn, &krate).with_context(|| {
61+
format!("Failed to update crate {}#{}", krate.name, krate.vers)
62+
})?;
63+
if rows > 0 {
64+
pb.suspend(|| {
65+
println!("edited {rows} rows for {}#{}", krate.name, krate.vers)
66+
});
67+
}
68+
}
6269
}
6370
Ok(())
6471
});
@@ -71,7 +78,10 @@ pub fn run(opts: Opts) -> anyhow::Result<()> {
7178
Ok(())
7279
}
7380

74-
fn import_data(conn: &mut PgConnection, krate: &cargo_registry_index::Crate) -> anyhow::Result<()> {
81+
fn import_data(
82+
conn: &mut PgConnection,
83+
krate: &cargo_registry_index::Crate,
84+
) -> anyhow::Result<usize> {
7585
let version_id: i32 = versions::table
7686
.inner_join(crates::table)
7787
.filter(crates::name.eq(&krate.name))
@@ -85,71 +95,17 @@ fn import_data(conn: &mut PgConnection, krate: &cargo_registry_index::Crate) ->
8595
)
8696
})?;
8797

88-
// Update the `checksum` and `links` fields.
89-
diesel::update(versions::table)
90-
.set((
91-
versions::checksum.eq(&krate.cksum),
92-
versions::links.eq(&krate.links),
93-
))
98+
// Update `links` fields.
99+
let rows = diesel::update(versions::table)
100+
.set((versions::links.eq(&krate.links),))
94101
.filter(versions::id.eq(version_id))
95-
.filter(versions::checksum.is_null())
96102
.filter(versions::links.is_null())
97103
.execute(conn)
98104
.with_context(|| {
99105
format!(
100-
"Failed to update checksum/links of {}#{} (id: {version_id})",
106+
"Failed to update links of {}#{} (id: {version_id})",
101107
krate.name, krate.vers
102108
)
103109
})?;
104-
105-
// Check if any of this crate's dependencies have a missing explicit_name.
106-
if krate.deps.iter().any(|d| d.package.is_some())
107-
&& dependencies::table
108-
.filter(dependencies::version_id.eq(version_id))
109-
.filter(dependencies::explicit_name.is_not_null())
110-
.count()
111-
.get_result::<i64>(conn)?
112-
== 0
113-
{
114-
for dep in &krate.deps {
115-
if let Some(package) = &dep.package {
116-
// This is a little tricky because there can be two identical deps in the
117-
// database. The only difference in git is the field we're trying to
118-
// fill (explicit_name). Using `first` here & filtering out existing `explicit_name`
119-
// entries ensure that we assign one explicit_name to each dep.
120-
121-
let id: i32 = dependencies::table
122-
.inner_join(crates::table)
123-
.filter(dependencies::explicit_name.is_null())
124-
.filter(dependencies::version_id.eq(version_id))
125-
.filter(dependencies::req.eq(&dep.req))
126-
.filter(dependencies::features.eq(&dep.features))
127-
.filter(dependencies::optional.eq(&dep.optional))
128-
.filter(dependencies::default_features.eq(&dep.default_features))
129-
.filter(dependencies::target.is_not_distinct_from(&dep.target))
130-
.filter(dependencies::kind.eq(dep.kind.map(|k| k as i32).unwrap_or_default()))
131-
.filter(crates::name.eq(package))
132-
.select(dependencies::id)
133-
.first(conn)
134-
.with_context(|| {
135-
format!(
136-
"{}#{}: Failed to find matching dependency: {} {}",
137-
krate.name, krate.vers, package, dep.req
138-
)
139-
})?;
140-
141-
diesel::update(dependencies::table)
142-
.set(dependencies::explicit_name.eq(&dep.name))
143-
.filter(dependencies::id.eq(id))
144-
.execute(conn)
145-
.with_context(|| {
146-
format!(
147-
"Failed to update `explicit_name` of dependency {id} to {}",
148-
dep.name
149-
)
150-
})?;
151-
}
152-
}
153-
}
154-
Ok(())
110+
Ok(rows)
155111
}

0 commit comments

Comments
 (0)