@@ -71,7 +71,7 @@ async fn update_mojang_metadata_json(
71
71
72
72
info ! ( "Acquiring remote Mojang metadata" ) ;
73
73
let remote_manifest = download:: mojang:: load_manifest ( ) . await ?;
74
- let remote_verions : HashMap < String , MojangVersionManifestVersion > = HashMap :: from_iter (
74
+ let remote_versions : HashMap < String , MojangVersionManifestVersion > = HashMap :: from_iter (
75
75
remote_manifest
76
76
. versions
77
77
. iter ( )
@@ -81,20 +81,50 @@ async fn update_mojang_metadata_json(
81
81
HashSet :: < String > :: from_iter ( remote_manifest. versions . iter ( ) . map ( |v| v. id . clone ( ) ) ) ;
82
82
83
83
let local_manifest_path = mojang_meta_dir. join ( "version_manifest_v2.json" ) ;
84
- let pending_ids: Vec < String > = if !local_manifest_path. is_file ( ) {
84
+ let pending_ids: Vec < ( String , bool ) > = if !local_manifest_path. is_file ( ) {
85
85
info ! ( "Local Mojang metadata does not exist, saving it" ) ;
86
86
let manifest_json = serde_json:: to_string_pretty ( & remote_manifest) ?;
87
87
std:: fs:: write ( & local_manifest_path, manifest_json) ?;
88
88
89
- remote_ids. into_iter ( ) . collect ( )
89
+ remote_ids. into_iter ( ) . map ( |id| ( id , true ) ) . collect ( )
90
90
} else {
91
91
let local_manifest = serde_json:: from_str :: < MojangVersionManifest > (
92
92
& std:: fs:: read_to_string ( & local_manifest_path) ?,
93
93
) ?;
94
+ let local_versions: HashMap < String , MojangVersionManifestVersion > = HashMap :: from_iter (
95
+ local_manifest
96
+ . versions
97
+ . iter ( )
98
+ . map ( |v| ( v. id . clone ( ) , v. clone ( ) ) ) ,
99
+ ) ;
94
100
let local_ids =
95
101
HashSet :: < String > :: from_iter ( local_manifest. versions . iter ( ) . map ( |v| v. id . clone ( ) ) ) ;
96
102
97
- remote_ids. difference ( & local_ids) . cloned ( ) . collect ( )
103
+ let mut diff: Vec < ( String , bool ) > = remote_ids
104
+ . difference ( & local_ids)
105
+ . cloned ( )
106
+ . map ( |id| ( id, false ) )
107
+ . collect ( ) ;
108
+ let mut out_of_date: Vec < ( String , bool ) > = local_ids
109
+ . iter ( )
110
+ . filter_map ( |id| {
111
+ let remote_version = remote_versions
112
+ . get ( id)
113
+ . expect ( "local version to exist remotely" ) ;
114
+ let local_version = local_versions
115
+ . get ( id)
116
+ . expect ( "local version to exist localy" ) ;
117
+ if remote_version. time > local_version. time {
118
+ Some ( id)
119
+ } else {
120
+ None
121
+ }
122
+ } )
123
+ . cloned ( )
124
+ . map ( |id| ( id, true ) )
125
+ . collect ( ) ;
126
+ diff. append ( & mut out_of_date) ;
127
+ diff
98
128
} ;
99
129
100
130
let versions_dir = mojang_meta_dir. join ( "versions" ) ;
@@ -108,11 +138,11 @@ async fn update_mojang_metadata_json(
108
138
}
109
139
110
140
let tasks = stream:: iter ( pending_ids)
111
- . map ( |version| {
112
- let v = remote_verions . get ( & version) . unwrap ( ) . clone ( ) ;
141
+ . map ( |( version, force_update ) | {
142
+ let v = remote_versions . get ( & version) . unwrap ( ) . clone ( ) ;
113
143
let dir = versions_dir. clone ( ) ;
114
144
tokio:: spawn ( async move {
115
- update_mojang_version_manifest_json ( & dir, & v)
145
+ update_mojang_version_manifest_json ( & dir, & v, force_update )
116
146
. await
117
147
. with_context ( || format ! ( "Failed to initialize Mojang version {}" , v. id) )
118
148
} )
@@ -229,12 +259,13 @@ async fn update_mojang_static_metadata_json(
229
259
pub async fn update_mojang_version_manifest_json (
230
260
versions_dir : & std:: path:: Path ,
231
261
version : & MojangVersionManifestVersion ,
262
+ force_update : bool ,
232
263
) -> Result < ( ) > {
233
264
let version_file = versions_dir. join ( format ! ( "{}.json" , & version. id) ) ;
234
- if !version_file. is_file ( ) {
265
+ if !version_file. is_file ( ) || force_update {
235
266
info ! (
236
- "Mojang metadata for version {} does not exist, downloading it " ,
237
- & version. id
267
+ "Updating Mojang metadata for version {} to timestamp {} " ,
268
+ & version. id, & version . time
238
269
) ;
239
270
let version_manifest = download:: mojang:: load_version_manifest ( & version. url )
240
271
. await
0 commit comments