@@ -19,15 +19,15 @@ pub enum InstallerType {
19
19
/// Download and install an update
20
20
pub fn download_and_install_update ( download_url : & str ) -> Result < ( ) > {
21
21
println ! ( "{}" , "Downloading update..." . bright_blue( ) ) ;
22
-
22
+
23
23
// Determine installer type from URL
24
24
let installer_type = determine_installer_type ( download_url) ?;
25
-
25
+
26
26
// Download the installer
27
27
let temp_file = download_installer ( download_url) ?;
28
-
28
+
29
29
println ! ( "{}" , "Installing update..." . bright_green( ) ) ;
30
-
30
+
31
31
// Install based on platform
32
32
match installer_type {
33
33
InstallerType :: WindowsMsi => install_windows_msi ( & temp_file) ,
@@ -36,13 +36,16 @@ pub fn download_and_install_update(download_url: &str) -> Result<()> {
36
36
InstallerType :: LinuxRpm => install_linux_rpm ( & temp_file) ,
37
37
InstallerType :: LinuxAppImage => install_linux_appimage ( & temp_file) ,
38
38
} ?;
39
-
39
+
40
40
// Clean up temp file
41
41
let _ = std:: fs:: remove_file ( & temp_file) ;
42
-
42
+
43
43
println ! ( "{}" , "✓ Update installed successfully!" . green( ) . bold( ) ) ;
44
- println ! ( "{}" , "Please restart your terminal to use the new version." . yellow( ) ) ;
45
-
44
+ println ! (
45
+ "{}" ,
46
+ "Please restart your terminal to use the new version." . yellow( )
47
+ ) ;
48
+
46
49
Ok ( ( ) )
47
50
}
48
51
@@ -74,34 +77,34 @@ fn download_installer(url: &str) -> Result<std::path::PathBuf> {
74
77
. map_err ( |e| DigstoreError :: NetworkError {
75
78
reason : format ! ( "Failed to create HTTP client: {}" , e) ,
76
79
} ) ?;
77
-
80
+
78
81
let response = client
79
82
. get ( url)
80
83
. send ( )
81
84
. map_err ( |e| DigstoreError :: NetworkError {
82
85
reason : format ! ( "Failed to download installer: {}" , e) ,
83
86
} ) ?;
84
-
87
+
85
88
if !response. status ( ) . is_success ( ) {
86
89
return Err ( DigstoreError :: NetworkError {
87
90
reason : format ! ( "Download failed with status: {}" , response. status( ) ) ,
88
91
} ) ;
89
92
}
90
-
93
+
91
94
// Create temp file
92
95
let temp_dir = std:: env:: temp_dir ( ) ;
93
96
let filename = url. split ( '/' ) . last ( ) . unwrap_or ( "digstore-installer" ) ;
94
97
let temp_file = temp_dir. join ( filename) ;
95
-
98
+
96
99
// Write downloaded content
97
100
let content = response. bytes ( ) . map_err ( |e| DigstoreError :: NetworkError {
98
101
reason : format ! ( "Failed to read download content: {}" , e) ,
99
102
} ) ?;
100
-
103
+
101
104
std:: fs:: write ( & temp_file, content) ?;
102
-
105
+
103
106
println ! ( " {} Downloaded to: {}" , "✓" . green( ) , temp_file. display( ) ) ;
104
-
107
+
105
108
Ok ( temp_file)
106
109
}
107
110
@@ -113,14 +116,14 @@ fn install_windows_msi(msi_path: &Path) -> Result<()> {
113
116
. map_err ( |e| DigstoreError :: ConfigurationError {
114
117
reason : format ! ( "Failed to run msiexec: {}" , e) ,
115
118
} ) ?;
116
-
119
+
117
120
if !output. status . success ( ) {
118
121
let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
119
122
return Err ( DigstoreError :: ConfigurationError {
120
123
reason : format ! ( "MSI installation failed: {}" , stderr) ,
121
124
} ) ;
122
125
}
123
-
126
+
124
127
Ok ( ( ) )
125
128
}
126
129
@@ -133,13 +136,13 @@ fn install_macos_dmg(dmg_path: &Path) -> Result<()> {
133
136
. map_err ( |e| DigstoreError :: ConfigurationError {
134
137
reason : format ! ( "Failed to mount DMG: {}" , e) ,
135
138
} ) ?;
136
-
139
+
137
140
if !mount_output. status . success ( ) {
138
141
return Err ( DigstoreError :: ConfigurationError {
139
142
reason : "Failed to mount DMG" . to_string ( ) ,
140
143
} ) ;
141
144
}
142
-
145
+
143
146
// Extract mount point from output
144
147
let mount_info = String :: from_utf8_lossy ( & mount_output. stdout ) ;
145
148
let mount_point = mount_info
@@ -149,30 +152,30 @@ fn install_macos_dmg(dmg_path: &Path) -> Result<()> {
149
152
. ok_or_else ( || DigstoreError :: ConfigurationError {
150
153
reason : "Failed to determine mount point" . to_string ( ) ,
151
154
} ) ?;
152
-
155
+
153
156
// Copy app to Applications
154
157
let app_name = "Digstore Min.app" ;
155
158
let source = format ! ( "{}/{}" , mount_point, app_name) ;
156
159
let destination = format ! ( "/Applications/{}" , app_name) ;
157
-
160
+
158
161
let copy_output = Command :: new ( "cp" )
159
162
. args ( & [ "-r" , & source, & destination] )
160
163
. output ( )
161
164
. map_err ( |e| DigstoreError :: ConfigurationError {
162
165
reason : format ! ( "Failed to copy app: {}" , e) ,
163
166
} ) ?;
164
-
167
+
165
168
// Unmount DMG
166
169
let _ = Command :: new ( "hdiutil" )
167
170
. args ( & [ "detach" , mount_point] )
168
171
. output ( ) ;
169
-
172
+
170
173
if !copy_output. status . success ( ) {
171
174
return Err ( DigstoreError :: ConfigurationError {
172
175
reason : "Failed to install app to Applications folder" . to_string ( ) ,
173
176
} ) ;
174
177
}
175
-
178
+
176
179
Ok ( ( ) )
177
180
}
178
181
@@ -184,14 +187,14 @@ fn install_linux_deb(deb_path: &Path) -> Result<()> {
184
187
. map_err ( |e| DigstoreError :: ConfigurationError {
185
188
reason : format ! ( "Failed to run dpkg: {}" , e) ,
186
189
} ) ?;
187
-
190
+
188
191
if !output. status . success ( ) {
189
192
let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
190
193
return Err ( DigstoreError :: ConfigurationError {
191
194
reason : format ! ( "DEB installation failed: {}" , stderr) ,
192
195
} ) ;
193
196
}
194
-
197
+
195
198
Ok ( ( ) )
196
199
}
197
200
@@ -203,14 +206,14 @@ fn install_linux_rpm(rpm_path: &Path) -> Result<()> {
203
206
. map_err ( |e| DigstoreError :: ConfigurationError {
204
207
reason : format ! ( "Failed to run rpm: {}" , e) ,
205
208
} ) ?;
206
-
209
+
207
210
if !output. status . success ( ) {
208
211
let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
209
212
return Err ( DigstoreError :: ConfigurationError {
210
213
reason : format ! ( "RPM installation failed: {}" , stderr) ,
211
214
} ) ;
212
215
}
213
-
216
+
214
217
Ok ( ( ) )
215
218
}
216
219
@@ -223,28 +226,32 @@ fn install_linux_appimage(appimage_path: &Path) -> Result<()> {
223
226
. map_err ( |e| DigstoreError :: ConfigurationError {
224
227
reason : format ! ( "Failed to make AppImage executable: {}" , e) ,
225
228
} ) ?;
226
-
229
+
227
230
if !chmod_output. status . success ( ) {
228
231
return Err ( DigstoreError :: ConfigurationError {
229
232
reason : "Failed to make AppImage executable" . to_string ( ) ,
230
233
} ) ;
231
234
}
232
-
235
+
233
236
// Copy to /usr/local/bin (requires sudo)
234
237
let copy_output = Command :: new ( "sudo" )
235
- . args ( & [ "cp" , appimage_path. to_str ( ) . unwrap ( ) , "/usr/local/bin/digstore" ] )
238
+ . args ( & [
239
+ "cp" ,
240
+ appimage_path. to_str ( ) . unwrap ( ) ,
241
+ "/usr/local/bin/digstore" ,
242
+ ] )
236
243
. output ( )
237
244
. map_err ( |e| DigstoreError :: ConfigurationError {
238
245
reason : format ! ( "Failed to install AppImage: {}" , e) ,
239
246
} ) ?;
240
-
247
+
241
248
if !copy_output. status . success ( ) {
242
249
let stderr = String :: from_utf8_lossy ( & copy_output. stderr ) ;
243
250
return Err ( DigstoreError :: ConfigurationError {
244
251
reason : format ! ( "AppImage installation failed: {}" , stderr) ,
245
252
} ) ;
246
253
}
247
-
254
+
248
255
Ok ( ( ) )
249
256
}
250
257
@@ -260,14 +267,14 @@ fn find_platform_download_url(assets: &[GitHubAsset]) -> Option<String> {
260
267
} else {
261
268
vec ! [ ]
262
269
} ;
263
-
270
+
264
271
for pattern in platform_patterns {
265
272
for asset in assets {
266
273
if asset. name . contains ( pattern) {
267
274
return Some ( asset. browser_download_url . clone ( ) ) ;
268
275
}
269
276
}
270
277
}
271
-
278
+
272
279
None
273
280
}
0 commit comments