Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .vscode/cli.code-snippets
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
"import \"dart:async\";",
"",
"import \"package:args/command_runner.dart\";",
"import \"package:discloud/cli/disposable.dart\";",
"import \"package:discloud/extensions/command.dart\";",
"",
"class ${1:${TM_FILENAME_BASE/(^\\w)/${1:/upcase}/}}Command extends Command<void> {",
"class ${1:${TM_FILENAME_BASE/(^\\w)/${1:/upcase}/}}Command extends Command<void> with Disposable {",
"\t${1:${TM_FILENAME_BASE/(^\\w)/${1:/upcase}/}}Command() {$4}",
"",
"\t@override",
Expand All @@ -30,6 +31,9 @@
"",
"\t@override",
"\tFuture<void> run() async {$0}",
"",
"\t@override",
"\tFuture<void> dispose() async {$5}",
"}",
""
]
Expand Down
9 changes: 9 additions & 0 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,15 @@ Usage: discloud user locale [arguments]
-l, --locale=<en-US> (mandatory)
```

### wait

```sh
Wait N seconds

Usage: discloud wait [arguments]
-h, --help Print this usage information.
```

### zip

```sh
Expand Down
6 changes: 4 additions & 2 deletions lib/cli/disposable.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
abstract class Disposable {
void dispose();
import "dart:async";

abstract mixin class Disposable {
FutureOr<void> dispose();
}
19 changes: 19 additions & 0 deletions lib/cli/runner.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import "dart:io";

import "package:args/args.dart";
import "package:args/command_runner.dart";
import "package:discloud/commands/commands.dart";
import "package:discloud/commands/team.dart";
import "package:discloud/commands/wait.dart";
import "package:discloud/version.dart";

class CliCommandRunner extends CommandRunner<void> {
Expand Down Expand Up @@ -31,6 +33,23 @@ class CliCommandRunner extends CommandRunner<void> {
addCommand(LoginCommand());
addCommand(TeamCommand());
addCommand(UserCommand());
addCommand(WaitCommand());
addCommand(ZipCommand());
}

Command<void>? getCommand(ArgResults topLevelResults) {
var argResults = topLevelResults.command;
var commands = super.commands;
Command<void>? command;

while (argResults != null) {
command = commands[argResults.name];
if (command == null) break;

commands = command.subcommands;
argResults = argResults.command;
}

return command;
}
}
28 changes: 20 additions & 8 deletions lib/commands/app/backup.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@ import "dart:async";
import "dart:io";

import "package:args/command_runner.dart";
import "package:discloud/cli/disposable.dart";
import "package:discloud/cli/spin/ispin.dart";
import "package:discloud/extensions/command.dart";
import "package:discloud/extensions/file.dart";
import "package:discloud/utils/download.dart";
import "package:discloud/utils/messages.dart";
import "package:discloud/utils/progress.dart";
import "package:discloud/utils/speed_monitor.dart";

const _pSep = "/";

class AppBackupCommand extends Command<void> {
class AppBackupCommand extends Command<void> with Disposable {
AppBackupCommand() {
argParser
..addOption("app", mandatory: true, valueHelp: "all")
Expand All @@ -33,6 +35,10 @@ class AppBackupCommand extends Command<void> {
@override
final aliases = const ["bkp"];

HttpClient? _client;
File? _file;
SpeedMonitor? _monitor;

@override
Future<void> run() async {
final appId = argResults!.option("app");
Expand Down Expand Up @@ -66,7 +72,7 @@ class AppBackupCommand extends Command<void> {
}

Future<void> _handleMulti(List list, ISpin spinner) async {
final client = HttpClient();
final client = _client = .new();
final dir = argResults?.option("dir") ?? ".";

for (final data in list) {
Expand All @@ -84,8 +90,6 @@ class AppBackupCommand extends Command<void> {

await _download(dir: dir, spinner: spinner, uri: uri, client: client);
}

client.close();
}

Future<void> _download({
Expand All @@ -96,9 +100,9 @@ class AppBackupCommand extends Command<void> {
}) async {
final filename = uri.pathSegments.last;
final filepath = "$dir$_pSep$filename";
final File file = .new(filepath);
final file = _file = .new(filepath);

final monitor = SpeedMonitor();
final monitor = _monitor = .new();

try {
spinner.start("Downloading...");
Expand All @@ -118,12 +122,20 @@ class AppBackupCommand extends Command<void> {
},
);

// no delete on dispose
_file = null;

spinner.success(filepath);
} catch (e, s) {
spinner.fail(resolveResponseMessage(e));
context.printer.debug(s);
} finally {
monitor.dispose();
}
}

@override
Future<void> dispose() async {
_client?.close();
await _file?.safeDelete();
_monitor?.dispose();
}
}
63 changes: 34 additions & 29 deletions lib/commands/app/commit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import "dart:async";
import "dart:io";

import "package:args/command_runner.dart";
import "package:discloud/cli/disposable.dart";
import "package:discloud/extensions/command.dart";
import "package:discloud/extensions/file.dart";
import "package:discloud/services/discloud/constants.dart";
Expand All @@ -12,7 +13,7 @@ import "package:discloud/utils/zip.dart";
import "package:discloud_config/discloud_config.dart";
import "package:path/path.dart" hide context;

class AppCommitCommand extends Command<void> {
class AppCommitCommand extends Command<void> with Disposable {
AppCommitCommand() {
argParser
..addOption(
Expand All @@ -31,6 +32,9 @@ class AppCommitCommand extends Command<void> {
@override
final aliases = const ["c"];

File? _file;
SpeedMonitor? _monitor;

@override
Future<void> run() async {
final directory = context.workspaceFolder;
Expand All @@ -46,7 +50,7 @@ class AppCommitCommand extends Command<void> {

final zipath = joinAll([directory.path, "${basename(directory.path)}.zip"]);

final File file = .new(zipath);
final file = _file = .new(zipath);

await zip(
directory: directory,
Expand All @@ -61,33 +65,28 @@ class AppCommitCommand extends Command<void> {
final fileStat = await file.stat();
final total = fileStat.size;

final monitor = SpeedMonitor();

try {
spinner.start("Committing...");

final response = await context.api.putMultipart(
"/app/$appId/commit",
file: file,
onUploadProgress: (processed) {
spinner.text = formatProgressMessage(
speed: monitor.add(processed),
prefixText: "Committing:",
direction: .up,
processed: processed,
total: total,
);
},
onUploadDone: () {
spinner.start("Processing...");
},
);

spinner.success(resolveResponseMessage(response));
} finally {
await file.safeDelete();
monitor.dispose();
}
final monitor = _monitor = .new();

spinner.start("Committing...");

final response = await context.api.putMultipart(
"/app/$appId/commit",
file: file,
onUploadProgress: (processed) {
spinner.text = formatProgressMessage(
speed: monitor.add(processed),
prefixText: "Committing:",
direction: .up,
processed: processed,
total: total,
);
},
onUploadDone: () {
spinner.start("Processing...");
},
);

spinner.success(resolveResponseMessage(response));
}

Future<String?> _getDiscloudConfigAppId(Directory directory) async {
Expand All @@ -97,4 +96,10 @@ class AppCommitCommand extends Command<void> {

return config.appId;
}

@override
Future<void> dispose() async {
await _file?.safeDelete();
_monitor?.dispose();
}
}
63 changes: 34 additions & 29 deletions lib/commands/app/upload.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import "dart:io";

import "package:args/command_runner.dart";
import "package:discloud/cli/disposable.dart";
import "package:discloud/extensions/command.dart";
import "package:discloud/extensions/file.dart";
import "package:discloud/services/discloud/constants.dart";
Expand All @@ -11,7 +12,7 @@ import "package:discloud/utils/zip.dart";
import "package:discloud_config/discloud_config.dart";
import "package:path/path.dart" hide context;

class AppUploadCommand extends Command<void> {
class AppUploadCommand extends Command<void> with Disposable {
AppUploadCommand() {
argParser.addMultiOption("glob", abbr: "g", defaultsTo: const ["**"]);
}
Expand All @@ -25,6 +26,9 @@ class AppUploadCommand extends Command<void> {
@override
final aliases = const ["up"];

File? _file;
SpeedMonitor? _monitor;

@override
Future<void> run() async {
final directory = context.workspaceFolder;
Expand All @@ -41,7 +45,7 @@ class AppUploadCommand extends Command<void> {

final zipath = joinAll([directory.path, "${basename(directory.path)}.zip"]);

final File file = .new(zipath);
final file = _file = .new(zipath);

await zip(
directory: directory,
Expand All @@ -56,32 +60,33 @@ class AppUploadCommand extends Command<void> {
final fileStat = await file.stat();
final total = fileStat.size;

final monitor = SpeedMonitor();

try {
spinner.start("Uploading...");

final response = await context.api.postMultipart(
"/upload",
file: file,
onUploadProgress: (processed) {
spinner.text = formatProgressMessage(
speed: monitor.add(processed),
prefixText: "Uploading:",
direction: .up,
processed: processed,
total: total,
);
},
onUploadDone: () {
spinner.start("Processing...");
},
);

spinner.success(resolveResponseMessage(response));
} finally {
await file.safeDelete();
monitor.dispose();
}
final monitor = _monitor = .new();

spinner.start("Uploading...");

final response = await context.api.postMultipart(
"/upload",
file: file,
onUploadProgress: (processed) {
spinner.text = formatProgressMessage(
speed: monitor.add(processed),
prefixText: "Uploading:",
direction: .up,
processed: processed,
total: total,
);
},
onUploadDone: () {
spinner.start("Processing...");
},
);

spinner.success(resolveResponseMessage(response));
}

@override
Future<void> dispose() async {
await _file?.safeDelete();
_monitor?.dispose();
}
}
Loading