186 lines
5.7 KiB
Dart
186 lines
5.7 KiB
Dart
import 'package:oto_cli/oto/commands/command.dart';
|
|
import 'package:oto_cli/oto/data/command_data.dart';
|
|
import 'package:dart_framework/platform/process.dart';
|
|
|
|
class Git extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGit.fromJson(getParam(command));
|
|
print(workspace);
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
var commands = data.commands;
|
|
for (var item in commands) {
|
|
shell.write(' && git ${Command.getPathNormal(item)}');
|
|
}
|
|
|
|
var process = await ProcessExecutor.start(shell);
|
|
return await completeProcess(process, command);
|
|
}
|
|
}
|
|
|
|
//무시가가능한 에러 무시
|
|
class GitPush extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitPush.fromJson(getParam(command));
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
if (data.branch == null) {
|
|
shell.write(' && git push');
|
|
} else {
|
|
shell.write(' && git push origin ${data.branch!}');
|
|
}
|
|
|
|
var process = await ProcessExecutor.start(shell);
|
|
return await completeProcess(process, command,
|
|
passExitCodes: [1 /*Everything up-to-date*/]);
|
|
}
|
|
}
|
|
|
|
//로컬에 체크아웃이 없을시 체크아웃하고, 체크아웃이 있을시 이동, 원할시 pull수행
|
|
class GitCheckout extends Git {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitCheckout.fromJson(getParam(command));
|
|
var branch = data.branch;
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
shell.write(' && git checkout origin/$branch');
|
|
shell.write(' && git checkout -b $branch');
|
|
|
|
var process = await ProcessExecutor.start(shell);
|
|
var exitCode = await process.process.exitCode;
|
|
var ignores = [128 /*Already exists*/];
|
|
if (ignores.contains(exitCode)) {
|
|
exitCode = 0;
|
|
}
|
|
|
|
if (exitCode == 0) {
|
|
shell = StringBuffer(getCDPath(workspace));
|
|
shell.write(' && git checkout $branch');
|
|
|
|
if (data.executePull == null ? true : data.executePull!) {
|
|
shell.write(' && git pull origin $branch');
|
|
}
|
|
|
|
process = await ProcessExecutor.start(shell);
|
|
exitCode = await process.process.exitCode;
|
|
}
|
|
|
|
return await completeProcess(process, command);
|
|
}
|
|
}
|
|
|
|
//Git commit에 대한 count 값을 리턴 해준다
|
|
class GitCount extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitCount.fromJson(getParam(command));
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
shell.write(' && git rev-list --all HEAD --all --count');
|
|
var process = await ProcessExecutor.start(shell, printStderr: false);
|
|
var number = int.parse(process.stdoutArr.last);
|
|
await setProperty(data.setValue, number);
|
|
|
|
return await completeProcess(process, command);
|
|
}
|
|
}
|
|
|
|
//git의 리비전에 대해 돌려준다
|
|
class GitRev extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitRev.fromJson(getParam(command));
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
var target = data.branch ?? 'HEAD';
|
|
shell.write(' && git fetch origin');
|
|
shell.write(' && git rev-parse $target');
|
|
var process = await ProcessExecutor.start(shell, printStderr: false);
|
|
var hash = process.stdoutArr.last;
|
|
await setProperty(data.setValue, hash);
|
|
|
|
return await completeProcess(process, command);
|
|
}
|
|
}
|
|
|
|
//git 초기화
|
|
class GitReset extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitReset.fromJson(getParam(command));
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
var force = data.force! ? 'f' : '';
|
|
shell.write(' && git reset --hard');
|
|
shell.write(' && git clean -${force}d');
|
|
var process = await ProcessExecutor.start(shell, printStderr: false);
|
|
|
|
return await completeProcess(process, command);
|
|
}
|
|
}
|
|
|
|
//git stash push
|
|
class GitStashPush extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitStashPush.fromJson(getParam(command));
|
|
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
var includeUntracked = data.includeUntracked == null
|
|
? " -u"
|
|
: (data.includeUntracked! ? " -u" : "");
|
|
var message = data.message == null ? "" : " -m '${data.message}'";
|
|
shell.write(' && git stash push$includeUntracked$message');
|
|
var process = await ProcessExecutor.start(shell, printStderr: false);
|
|
|
|
return await completeProcess(process, command);
|
|
}
|
|
}
|
|
|
|
//git stash apply
|
|
class GitStashApply extends Command {
|
|
@override
|
|
Future execute(DataCommand command) async {
|
|
var data = DataGitStashApply.fromJson(getParam(command));
|
|
|
|
ProcessData process;
|
|
var shell = StringBuffer(getCDPath(workspace));
|
|
var apply =
|
|
data.delete == null ? " pop" : (data.delete! ? " pop" : " apply");
|
|
if (data.message == null) {
|
|
shell.write(' && git stash$apply');
|
|
process = await ProcessExecutor.start(shell, printStderr: false);
|
|
} else {
|
|
shell.write(' && git stash list');
|
|
var result = await ProcessExecutor.run(shell);
|
|
var exist = false;
|
|
print(result.stdout);
|
|
shell = StringBuffer(getCDPath(workspace));
|
|
if (result.exitCode == 0) {
|
|
var arr = result.stdout.toString().split('\n');
|
|
for (var line in arr) {
|
|
var lineArr = line.split(': On ');
|
|
if (lineArr.length > 1) {
|
|
var id = lineArr[0];
|
|
var content = lineArr[1];
|
|
if (content.contains(data.message!)) {
|
|
shell.write(' && git stash$apply $id');
|
|
exist = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (exist) {
|
|
process = await ProcessExecutor.start(shell, printStderr: false);
|
|
} else {
|
|
return await complete(0, command);
|
|
}
|
|
}
|
|
return await completeProcess(process, command, passExitCodes: [1]);
|
|
}
|
|
}
|