oto/lib/oto/commands/git/git.dart
2025-11-22 10:46:33 +09:00

276 lines
8.9 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/oto/application.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));
Application.log(workspace);
var shell = StringBuffer(getCDPath(workspace));
var commands = data.commands;
for (var item in commands) {
shell.write(' $and git ${Command.getPathNormal(item)}');
}
var process =
await ProcessExecutor.start(shell, logHandler: Application.logWithType);
return await completeProcess(process, command);
}
}
//무시가가능한 에러 무시
class GitCommit extends Command {
@override
Future execute(DataCommand command) async {
var data = DataGitCommit.fromJson(getParam(command));
var shell = StringBuffer(getCDPath(workspace));
var addNewFile = data.addNewFile == null ? false : data.addNewFile!;
var message = data.message;
if (addNewFile) {
shell.write(' $and git add -A $and git commit -m "$message"');
} else {
shell.write(' $and git commit -am "$message"');
}
var process =
await ProcessExecutor.start(shell, logHandler: Application.logWithType);
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(' $and git push');
} else {
shell.write(' $and git switch -c ${data.branch!}');
shell.write(' $and git push origin ${data.branch!}');
}
var process =
await ProcessExecutor.start(shell, logHandler: Application.logWithType);
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(' $and git checkout origin/$branch');
shell.write(' $and git checkout -b $branch');
var process =
await ProcessExecutor.start(shell, logHandler: Application.logWithType);
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(' $and git checkout $branch');
if (data.executePull == null ? true : data.executePull!) {
shell.write(' $and git pull origin $branch');
}
process = await ProcessExecutor.start(shell,
logHandler: Application.logWithType);
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(' $and git rev-list --all HEAD --all --count');
var process = await ProcessExecutor.start(shell,
printStderr: false, logHandler: Application.logWithType);
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(' $and git fetch origin');
shell.write(' $and git rev-parse $target');
var process = await ProcessExecutor.start(shell,
printStderr: false, logHandler: Application.logWithType);
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(' $and git reset --hard');
shell.write(' $and git clean -${force}d');
var process = await ProcessExecutor.start(shell,
printStderr: false, logHandler: Application.logWithType);
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(' $and git stash push$includeUntracked$message');
var process = await ProcessExecutor.run(shell);
if (data.setSuccess != null) {
setProperty(
data.setSuccess!, process.stdout.toString().contains('Saved'));
}
return await complete(process.exitCode, 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(' $and git stash$apply');
process = await ProcessExecutor.start(shell,
printStderr: false, logHandler: Application.logWithType);
} else {
shell.write(' $and git stash list');
var result = await ProcessExecutor.run(shell);
var exist = false;
Application.log(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(' $and git stash$apply $id');
exist = true;
break;
}
}
}
}
if (exist) {
process = await ProcessExecutor.start(shell,
printStderr: false, logHandler: Application.logWithType);
} else {
return await complete(0, command);
}
}
return await completeProcess(process, command, passExitCodes: [1]);
}
}
//무시가가능한 에러 무시
class GitBranch extends Command {
@override
Future execute(DataCommand command) async {
var data = DataGitBranch.fromJson(getParam(command));
var shell = StringBuffer('cd ${data.path}');
shell.write(
' $and git for-each-ref --format=\'{"ref": "%(refname:short)", "sha": "%(objectname)", "date": "%(committerdate:iso8601)"}\' refs/remotes | jq -s . > branches.json');
var process =
await ProcessExecutor.start(shell, logHandler: Application.logWithType);
var file = File('${data.path}/branches.json');
var content = file.readAsStringSync();
final List<dynamic> decoded = jsonDecode(content);
final branches = decoded.map((e) => BranchInfo.fromJson(e)).toList();
var features = <String>[];
var releases = <String>[];
var fixedBranch = ['main', 'master', 'develop'];
var existBranch = [];
var excludeBranch = ['origin'];
var startDate = DateTime.now().subtract(Duration(days: data.startDay!));
for (var branch in branches) {
var branchName = branch.ref!.replaceFirst('origin/', '');
if (!excludeBranch.contains(branchName)) {
if (fixedBranch.contains(branchName)) {
existBranch.add(branchName);
} else if (DateTime.parse(branch.date!)
.toUtc()
.difference(startDate)
.inSeconds >
0) {
if (branchName.startsWith('release')) {
releases.add(branchName);
} else {
features.add(branchName);
}
}
}
}
existBranch.sort();
existBranch.addAll(releases);
existBranch.addAll(features);
setProperty(data.setBranches!, existBranch, showPrint: true);
return await completeProcess(process, command);
}
}