Skip to content

Commit 577db90

Browse files
committed
Modify the git-import tool to only import the links field
1 parent dd02d66 commit 577db90

File tree

2 files changed

+21
-65
lines changed

2 files changed

+21
-65
lines changed

script/import-database-dump.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ if [ -f "$TARBALL_PATH" ]; then
1515
echo "Skipping https://static.crates.io/db-dump.tar.gz download since it exists already "
1616
else
1717
echo "Downloading https://static.crates.io/db-dump.tar.gz to the 'tmp' folder"
18-
curl https://static.crates.io/db-dump.tar.gz --output $TARBALL_PATH
18+
curl https://static.crates.io/db-dump.tar.gz -L --output $TARBALL_PATH
1919
fi
2020

2121
if [ -d "$DUMP_PATH" ]; then

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)