Skip to content

Commit

Permalink
msstore (uwp) - install dependencies first
Browse files Browse the repository at this point in the history
  • Loading branch information
melo936 committed Jun 3, 2024
1 parent 0891319 commit 7992edb
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 33 deletions.
13 changes: 12 additions & 1 deletion lib/commands/ms_store_command.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'package:args/command_runner.dart';
import 'package:process_run/shell_run.dart';
import 'package:revitool/services/msstore_service.dart';

class MSStoreCommand extends Command<String> {
Expand Down Expand Up @@ -66,7 +67,17 @@ class MSStoreCommand extends Command<String> {
stdout.writeln('$tag Installing $id...');
final installResult = await _msStoreService.installPackages(id, ring);

if (installResult.isEmpty || installResult.first.exitCode != 0) {
bool areResultsZero = true;
for (final e in installResult) {
if (e.exitCode != 0) {
stderr.writeln(e.errText);
stdout.writeln(e.outText);
areResultsZero = false;
break;
}
}

if (installResult.isEmpty || !areResultsZero) {
stderr.writeln('$tag Failed to install $id');
exit(1);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/screens/pages/ms_store_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ class _MSStorePageState extends State<MSStorePage>
dismissWithEsc: false,
builder: (context) => DownloadWidget(
items: downloadList,
productId: productId,
productId: productId.trim(),
cleanUpAfterInstall: cleanUp,
ring: _selectedRing,
),
Expand Down
52 changes: 42 additions & 10 deletions lib/services/msstore_service.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import 'dart:io';
import 'package:collection/collection.dart';
import 'package:dio/dio.dart';
import 'package:process_run/cmd_run.dart';
import 'package:process_run/shell_run.dart';
import 'package:revitool/services/network_service.dart';
import '../models/ms_store/non_uwp_response.dart';
import '../models/ms_store/search_response.dart';
import '../models/ms_store/packages_info.dart';
import 'package:xml/xml.dart' as xml;
import '../utils.dart';
import 'package:path/path.dart' as p;
import 'package:revitool/models/ms_store/non_uwp_response.dart';
import 'package:revitool/models/ms_store/search_response.dart';
import 'package:revitool/models/ms_store/packages_info.dart';
import 'package:revitool/utils.dart';

class MSStoreService {
static final _storeFolder =
Expand Down Expand Up @@ -41,6 +41,15 @@ class MSStoreService {
},
);

static const _dependencies = [
"Microsoft.VCLibs",
"Microsoft.NET",
"Microsoft.UI",
"Microsoft.WinJS",
];
static bool isDependency(String name) =>
_dependencies.any((e) => name.startsWith(RegExp(e)));

static final _regex = RegExp(r'"WuCategoryId":"([^"]+)"');
static final _namePattern = RegExp(r'^[^_]+', multiLine: true);

Expand Down Expand Up @@ -381,8 +390,10 @@ class MSStoreService {
final result = <Response>[];

for (final item in _packages) {
final downloadPath =
isDependency(item.name!) ? "$path\\Dependencies" : path;
final response = await _networkService.downloadFile(
item.uri!, "$path\\${item.name}.${item.extension}");
item.uri!, "$downloadPath\\${item.name}.${item.extension}");

result.add(response);
}
Expand All @@ -398,10 +409,31 @@ class MSStoreService {
Future<List<ProcessResult>> _installUWPPackages(
String id, String ring) async {
final path = "$_storeFolder\\$id\\$ring";
return await run(
'start /min /high /wait powershell -NoP -Ep Unrestricted -NonInteractive -Command "@(Get-ChildItem -Path $path -File -Recurse -Force) | ForEach-Object { Add-AppxPackage -ForceApplicationShutdown -Path \$_.FullName }"',
verbose: true,
runInShell: true,
final dir = Directory(path).listSync();
final results = <ProcessResult>[];

if (dir.isNotEmpty) {
for (final d in dir) {
if (d is File) {
results.add(await _addAppxProcess(d.path));
}
if (d is Directory) {
final deps = Directory("$path\\Dependencies").listSync();
for (final file in deps) {
if (file is File) {
results.add(await _addAppxProcess(file.path));
}
}
}
}
}
return results;
}

Future<ProcessResult> _addAppxProcess(String path) async {
return await Process.run(
"powershell",
["Add-AppxPackage -Path $path -ForceApplicationShutdown"],
);
}

Expand Down
45 changes: 24 additions & 21 deletions lib/widgets/download_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,27 @@ class _DownloadWidgetState extends State<DownloadWidget> {
directory.deleteSync(recursive: true);
}

_streams = widget.items
.map((item) => _dio.download(
item.uri!,
'$path\\${item.name}.${item.extension}',
cancelToken: CancelToken(),
onReceiveProgress: (received, total) {
if (total != -1) {
final index = widget.items.indexOf(item);
_progressList[index].value =
((received / total) * 100).floorToDouble();
if (received == total) {
_completedDownloadsCount++;
_downloadCompletionController.add(_completedDownloadsCount);
}
}
},
).asStream())
.toList();
_streams = widget.items.map((item) {
final downloadPath = MSStoreService.isDependency(item.name!)
? "$path\\Dependencies"
: path;
return _dio.download(
item.uri!,
'$downloadPath\\${item.name}.${item.extension}',
cancelToken: CancelToken(),
onReceiveProgress: (received, total) {
if (total != -1) {
final index = widget.items.indexOf(item);
_progressList[index].value =
((received / total) * 100).floorToDouble();
if (received == total) {
_completedDownloadsCount++;
_downloadCompletionController.add(_completedDownloadsCount);
}
}
},
).asStream();
}).toList();
_progressList =
List.generate(widget.items.length, (_) => ValueNotifier<double>(0));
}
Expand Down Expand Up @@ -133,9 +136,9 @@ class _DownloadWidgetState extends State<DownloadWidget> {

await showInstallProcess(context, processResult);

if (widget.cleanUpAfterInstall) {
await _ms.cleanUpDownloads();
}
// if (widget.cleanUpAfterInstall) {
// await _ms.cleanUpDownloads();
// }
},
),
Button(
Expand Down

0 comments on commit 7992edb

Please sign in to comment.