@@ -13,7 +13,7 @@ use indicatif::{ProgressBar, ProgressIterator, ProgressStyle};
13
13
use crate :: {
14
14
admin:: dialoguer,
15
15
db,
16
- schema:: { crates, dependencies , versions} ,
16
+ schema:: { crates, versions} ,
17
17
} ;
18
18
19
19
#[ derive( clap:: Parser , Debug , Copy , Clone ) ]
@@ -56,9 +56,16 @@ pub fn run(opts: Opts) -> anyhow::Result<()> {
56
56
let result = conn. transaction ( |conn| -> anyhow:: Result < ( ) > {
57
57
for line in reader. lines ( ) {
58
58
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
+ }
62
69
}
63
70
Ok ( ( ) )
64
71
} ) ;
@@ -71,7 +78,10 @@ pub fn run(opts: Opts) -> anyhow::Result<()> {
71
78
Ok ( ( ) )
72
79
}
73
80
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 > {
75
85
let version_id: i32 = versions:: table
76
86
. inner_join ( crates:: table)
77
87
. filter ( crates:: name. eq ( & krate. name ) )
@@ -85,71 +95,17 @@ fn import_data(conn: &mut PgConnection, krate: &cargo_registry_index::Crate) ->
85
95
)
86
96
} ) ?;
87
97
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 ) , ) )
94
101
. filter ( versions:: id. eq ( version_id) )
95
- . filter ( versions:: checksum. is_null ( ) )
96
102
. filter ( versions:: links. is_null ( ) )
97
103
. execute ( conn)
98
104
. with_context ( || {
99
105
format ! (
100
- "Failed to update checksum/ links of {}#{} (id: {version_id})" ,
106
+ "Failed to update links of {}#{} (id: {version_id})" ,
101
107
krate. name, krate. vers
102
108
)
103
109
} ) ?;
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)
155
111
}
0 commit comments