diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro
index 2f10f371..54bde0ca 100644
--- a/RedPandaIDE/RedPandaIDE.pro
+++ b/RedPandaIDE/RedPandaIDE.pro
@@ -101,6 +101,7 @@ SOURCES += \
vcs/gitremotedialog.cpp \
vcs/gitrepository.cpp \
vcs/gitresetdialog.cpp \
+ vcs/gituserconfigdialog.cpp \
vcs/gitutils.cpp \
widgets/aboutdialog.cpp \
widgets/bookmarkmodel.cpp \
@@ -243,6 +244,7 @@ HEADERS += \
vcs/gitremotedialog.h \
vcs/gitrepository.h \
vcs/gitresetdialog.h \
+ vcs/gituserconfigdialog.h \
vcs/gitutils.h \
widgets/aboutdialog.h \
widgets/bookmarkmodel.h \
@@ -347,6 +349,7 @@ FORMS += \
vcs/gitpushdialog.ui \
vcs/gitremotedialog.ui \
vcs/gitresetdialog.ui \
+ vcs/gituserconfigdialog.ui \
widgets/aboutdialog.ui \
widgets/choosethemedialog.ui \
widgets/cpudialog.ui \
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts
index 727263a3..3c675f8b 100644
--- a/RedPandaIDE/RedPandaIDE_zh_CN.ts
+++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts
@@ -3231,7 +3231,7 @@ Are you really want to continue?
- 对话框
+ 对话框
@@ -3378,7 +3378,7 @@ Are you really want to continue?
- 对话框
+ 对话框
@@ -3386,7 +3386,7 @@ Are you really want to continue?
- 对话框
+ 对话框
@@ -3404,9 +3404,9 @@ Are you really want to continue?
-
-
-
+
+
+
添加
@@ -3441,7 +3441,12 @@ Are you really want to continue?
关闭
-
+
+
+ 确定
+
+
+
更新
@@ -3520,6 +3525,39 @@ Are you really want to continue?
取消
+
+ GitUserConfigDialog
+
+
+
+ 填写用户信息
+
+
+
+
+ 用户邮箱
+
+
+
+
+ 确定
+
+
+
+
+ 取消
+
+
+
+
+ 用户姓名
+
+
+
+
+ Git需要下列信息进行提交:
+
+
InfoMessageBox
@@ -3702,18 +3740,18 @@ Are you really want to continue?
MainWindow
-
+
小熊猫C++
-
-
-
-
-
-
+
+
+
+
+
+
编译器
@@ -3732,8 +3770,8 @@ Are you really want to continue?
工具
-
+
运行
@@ -3745,25 +3783,25 @@ Are you really want to continue?
-
+
项目
-
+
监视
-
+
结构
-
+
文件
@@ -3773,10 +3811,10 @@ Are you really want to continue?
-
-
+
-
+
+
调试
@@ -3787,7 +3825,7 @@ Are you really want to continue?
-
+
调试主控台
@@ -3809,7 +3847,7 @@ Are you really want to continue?
-
+
查找
@@ -3834,7 +3872,7 @@ Are you really want to continue?
替换
-
+
关闭
@@ -3845,7 +3883,7 @@ Are you really want to continue?
-
+
代码
@@ -3863,72 +3901,72 @@ Are you really want to continue?
工具栏2
-
+
新建
-
+
Ctrl+N
-
+
打开...
-
+
Ctrl+O
-
+
保存
-
+
Ctrl+S
-
+
另存为...
-
+
另存为
-
+
全部保存
-
+
Ctrl+Shift+S
-
+
选项
-
-
+
-
-
+
+
+
编译
-
+
工具输出
@@ -3943,200 +3981,200 @@ Are you really want to continue?
Git
-
+
F9
-
+
F10
-
+
恢复
-
+
Ctrl+Z
-
+
重做
-
+
Ctrl+Y
-
+
剪切
-
+
Ctrl+X
-
-
-
-
+
+
+
+
复制
-
+
Ctrl+C
-
-
+
+
粘贴
-
+
Ctrl+V
-
-
-
+
+
+
选择全部
-
+
Ctrl+A
-
+
缩进
-
+
取消缩进
-
+
切换注释
-
+
Ctrl+/
-
+
全部收起
-
+
全部展开
-
+
使用ANSI编码
-
+
使用UTF-8编码
-
+
自动检测
-
+
转换为ANSI编码
-
+
转换为UTF-8编码
-
+
编译运行
-
+
F11
-
+
全部重编译
-
+
F12
-
+
停止执行
-
+
F6
-
+
F5
-
+
单步跳过
-
+
F7
-
+
单步进入
-
-
+
+
试题集
-
+
新建试题集
@@ -4155,14 +4193,14 @@ Are you really want to continue?
-
+
保存试题集
-
+
载入试题集
@@ -4184,21 +4222,21 @@ Are you really want to continue?
-
+
TODO
-
+
书签
-
-
+
+
试题
@@ -4273,499 +4311,514 @@ Are you really want to continue?
工具窗口
-
+
主工具栏
-
+
编译器配置集
-
+
新建源代码文件
-
+
Tab
-
+
Shift+Tab
-
+
F8
-
+
单步跳出
-
+
Ctrl+F8
-
+
执行到光标处
-
+
Ctrl+F5
-
+
继续执行
-
+
F4
-
+
添加监视
-
+
打开CPU信息窗口...
-
+
退出
-
+
查找...
-
+
Ctrl+F
-
+
在文件中查找...
-
+
Ctrl+Shift+F
-
+
替换
-
+
Ctrl+R
-
+
查找下一个
-
+
F3
-
+
查找前一个
-
+
Shift+F3
-
+
删除监视值
-
+
Remove All
删除全部监视值
-
+
修改监视值
-
+
对代码重新排版
-
+
Ctrl+Shift+A
-
+
前一次编辑位置
-
+
Ctrl+Alt+Left
-
+
后一次编辑位置
-
+
Ctrl+Alt+Right
-
+
Ctrl+W
-
+
全部关闭
-
+
Ctrl+Shift+W
-
+
最大化编辑器
-
+
Ctrl+F11
-
+
下一窗口
-
+
Ctrl+Tab
-
+
前一窗口
-
+
Ctrl+Shift+Tab
-
+
切换断点
-
+
Ctrl+F4
-
-
+
+
删除所有断点
-
+
设置断点条件...
-
+
跳转到声明处
-
+
跳转到定义处
-
+
查找符号的引用
-
+
打开所在的文件夹
-
+
Ctrl+B
-
+
打开命令行窗口
-
+
文件属性...
-
+
关闭项目
-
+
项目属性
-
+
新建项目...
-
+
新建项目文件
-
+
添加到项目...
-
+
从项目删除
-
+
查看Makefile
-
+
清理构建文件
-
+
在浏览器中打开
-
+
在终端中打开
-
+
关于
-
-
+
+
重命名符号
-
+
Shift+F6
-
+
打印...
-
+
Ctrl+P
-
-
+
+
导出为RTF
-
-
+
+
导出为HTML
-
+
移动到其他视图
-
+
Ctrl+M
-
+
C++参考手册
-
+
C参考手册
-
+
显示全部工具面板
-
+
Create Repository
创建Git仓库
-
+
提交(Commit)
-
+
撤销(Revert)
-
+
回滚(Reset)
-
+
添加文件
-
+
还原(Restore)
-
+
官方网站
-
+
分支切换(Switch)
-
+
合并(Merge)
-
+
Log
显示日志(Log)
-
+
远程仓库...
+
+
+
+ 取回(Fetch)
+
+
+
+
+ 拉取(Pull)
+
+
+
+
+ 推送(Push)
+
工具窗口栏
-
+
状态栏
-
+
Ctrl+Backspace
-
+
中断
-
+
删除到单词开头
-
+
Ctrl+Shift+B
-
+
删除到单词结尾
-
+
Ctrl+Shift+E
-
+
Add Class...
新建类...
-
+
New Header
新建头文件...
@@ -4775,47 +4828,47 @@ Are you really want to continue?
插入行
-
+
删除当前行
-
+
Ctrl+D
-
+
复制当前行
-
+
Ctrl+E
-
+
删除当前单词
-
+
Ctrl+Shift+D
-
+
删除到行尾
-
+
Ctrl+Del
-
+
删除到行首
@@ -4824,27 +4877,27 @@ Are you really want to continue?
C/C++参考
-
+
EGE图形库手册
-
+
添加书签
-
+
删除书签
-
+
修改书签说明
-
+
在文件视图中定位
@@ -4853,47 +4906,47 @@ Are you really want to continue?
打开文件夹
-
+
运行参数...
-
+
文件编码
-
+
文件历史
-
-
+
-
+
+
正在调试
-
-
+
-
+
+
正在运行
-
-
+
-
+
+
正在编译
@@ -4902,194 +4955,194 @@ Are you really want to continue?
行:%1 列:%2 已选择:%3 总行数:%4 总长度:%5
-
+
Line: %1 Col: %2 Selected: %3 Lines: %4 Length: %5
行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5
-
+
只读
-
+
插入
-
+
覆写
-
+
关闭项目
-
+
你确定要关闭'%1'吗?
-
-
+
+
确认
-
-
-
+
+
+
源文件尚未编译。
-
-
+
+
现在编译?
-
-
+
+
源文件比可执行程序新。
-
+
重新编译?
-
+
无编译器设置
-
+
没有配置编译器设置。
-
+
无法启动调试器
-
-
+
+
启用调试参数
-
-
+
+
当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题?
-
+
项目尚未构建
-
+
项目尚未构建。是否构建?
-
+
宿主程序不存在
-
+
动态链接库(DLL)需要一个宿主程序来运行。
-
+
但它不存在。
-
+
宿主程序不存在
-
+
宿主程序'%1'不存在。
-
+
重新编译?
-
-
+
+
保存上次打开信息失败
-
+
无法删除旧上次打开信息文件'%1'
-
+
无法保存上次打开信息文件'%1'
-
+
载入上次打开信息失败
-
+
无法载入上次打开信息文件'%1'
-
+
打开源代码文件
-
+
显示详细调试器日志
-
+
全部复制
-
-
-
+
+
+
清除
-
+
导出
-
+
插入代码段
-
-
+
+
试题集%1
@@ -5110,68 +5163,68 @@ Are you really want to continue?
或者选择使用其他的网络端口。
-
-
+
+
重新构建项目
-
-
+
+
项目已经被修改过,是否需要重新构建?
-
+
自动保存出错
-
+
自动保存"%1"到"%2"失败:%3
-
+
试题属性...
-
+
设置试题集名称
-
+
试题集名称:
-
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
@@ -5180,344 +5233,354 @@ Are you really want to continue?
在调试主控台中显示调试器输出
-
+
清除这次搜索
-
+
删除所有搜索
-
+
断点条件...
-
+
断点条件
-
+
输入当前断点的生效条件:
-
+
Remove all breakpoints
删除所有断点
-
+
删除当前断点
-
+
重命名文件
-
-
+
+
添加文件夹
-
+
新文件夹
-
+
文件夹:
-
+
重命名
-
+
删除文件夹
-
+
切换为普通视图
-
+
切换为自定义视图
-
+
按类型排序
-
+
按名称排序
-
+
显示继承的成员
-
+
跳转到声明处
-
+
跳转到定义处
-
-
-
+
+
+
新建文件夹
-
-
-
-
+
+
+
+
删除
-
+
在编辑器中打开
-
+
使用外部程序打开
-
+
在终端中打开
-
+
在Windows浏览器中打开
-
+
字符集
-
+
已自动保存%1个文件
-
+
设置答案源代码...
-
+
选择其他文件...
-
+
选择答案源代码文件
-
+
C/C++Source Files (*.c *.cpp *.cc *.cxx
C/C++源代码文件 (*.c *.cpp *.cc *.cxx)
-
+
你真的要删除%1吗?
-
+
你真的要删除%1个文件吗?
-
+
保存项目
-
+
项目'%1'有改动。
-
-
+
+
需要保存吗?
-
-
+
+
文件已发生变化
-
+
新建项目文件?
-
+
您是否要将新建的文件加入项目?
-
-
-
-
+
+
+
+
保存失败
-
+
改变项目编译器配置集
-
+
改变项目的编译器配置集会导致所有的自定义编译器选项被重置。
-
+
你真的想要做那些吗?
-
+
您真的要清除该文件的所有断点吗?
-
+
新建项目
-
+
关闭'%1'以打开新项目?
-
+
文件夹不存在
-
+
文件夹'%1'不存在。是否创建?
-
+
无法创建文件夹
-
+
创建文件夹'%1'失败。
-
+
-
+
文件夹%1不是空的。
-
+
你真的要删除它吗?
-
-
-
-
- 选择工作文件夹
+
+
+ 无法提交
-
-
+
+
+ Git需要用信息进行提交。
+
+
+
+
+
+
+ 选择工作文件夹
+
+
+
+
头文件已存在
-
-
+
+
头文件"%1"已存在!
-
+
源文件已存在!
-
+
源文件"%1"已存在!
-
+
无法提交!
-
+
下列文件处于冲突状态,请解决后重新添加和提交:
-
+
提交信息
-
+
提交信息:
-
+
提交失败
-
+
提交信息不能为空!
@@ -5526,239 +5589,239 @@ Are you really want to continue?
小熊猫Dev-C++项目文件 (*.dev)
-
+
新建项目失败
-
+
无法使用模板创建项目
-
+
删除文件
-
+
同时从硬盘上删除文件?
-
+
无标题
-
+
新的项目文件名
-
+
文件名:
-
+
文件已存在!
-
+
文件'%1'已经存在!
-
+
添加到项目
-
+
小熊猫C++项目文件(*.dev)
-
+
重命名出错
-
+
符号'%1'在系统头文件中定义,无法修改。
-
+
新名称
-
-
+
+
替换出错
-
+
无法打开文件'%1'进行替换!
-
+
内容和上次查找时不一致。
-
+
RTF格式文件 (*.rtf)
-
+
HTML文件 (*.html)
-
+
当前的试题集不是空的。
-
+
试题%1
-
-
+
+
试题集文件 (*.pbs)
-
+
载入失败
-
-
+
+
试题案例%1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
错误
-
+
项目历史
-
+
载入主题失败
-
-
+
+
清除历史
-
-
+
+
版本控制
-
+
磁盘文件'%1'已被修改。
-
+
是否重新读取它的内容?
-
+
磁盘文件'%1'已被删除。
-
+
是否保持它在小熊猫C++中打开的编辑窗口?
-
+
打开
-
+
编译失败
-
+
运行失败
-
-
+
+
确认转换
-
-
+
+
当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗?
-
+
新监视表达式
-
+
输入监视表达式
-
+
(%1/%2)正在解析文件"%3"
-
-
+
+
完成%1个文件的解析,用时%2秒
-
+
(每秒%1个文件)
@@ -6729,7 +6792,7 @@ Are you really want to continue?
QApplication
-
+
错误
@@ -6783,23 +6846,23 @@ Are you really want to continue?
-
-
+
+
错误
-
+
无法创建配置文件夹"%1"
-
+
无法写入配置文件夹"%1"
-
+
无法载入自动链接设置
@@ -7434,7 +7497,7 @@ Are you really want to continue?
无法解析试题集文件"%1":%2
-
+
<由Git自动生成>
@@ -7893,7 +7956,7 @@ Are you really want to continue?
自动链接
-
+
@@ -7969,15 +8032,15 @@ Are you really want to continue?
杂项
-
-
+
+
程序运行
-
+
试题集
diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp
index 07ddef7d..4b09bad5 100644
--- a/RedPandaIDE/mainwindow.cpp
+++ b/RedPandaIDE/mainwindow.cpp
@@ -45,6 +45,7 @@
#include "vcs/gitmergedialog.h"
#include "vcs/gitlogdialog.h"
#include "vcs/gitremotedialog.h"
+#include "vcs/gituserconfigdialog.h"
#include "widgets/infomessagebox.h"
#include
@@ -768,7 +769,8 @@ void MainWindow::onFileSaved(const QString &path, bool inProject)
if (!inProject) {
if ( (isCFile(path) || isHFile(path))
&& !mFileSystemModelIconProvider.VCSRepository()->isFileInRepository(path)) {
- mFileSystemModelIconProvider.VCSRepository()->add(extractRelativePath(mFileSystemModelIconProvider.VCSRepository()->folder(),path));
+ QString output;
+ mFileSystemModelIconProvider.VCSRepository()->add(extractRelativePath(mFileSystemModelIconProvider.VCSRepository()->folder(),path),output);
}
}
// qDebug()<<"update icon provider";
@@ -5458,8 +5460,10 @@ void MainWindow::on_actionAdd_to_project_triggered()
mProject->cppParser()->addFileToScan(filename);
QString branch;
if (pSettings->vcs().gitOk() && mProject->model()->iconProvider()->VCSRepository()->hasRepository(branch)) {
+ QString output;
mProject->model()->iconProvider()->VCSRepository()->add(
- extractRelativePath(mProject->folder(),filename)
+ extractRelativePath(mProject->folder(),filename),
+ output
);
}
}
@@ -5713,7 +5717,8 @@ void MainWindow::newProjectUnitFile()
editor->activate();
QString branch;
if (pSettings->vcs().gitOk() && mProject->model()->iconProvider()->VCSRepository()->hasRepository(branch)) {
- mProject->model()->iconProvider()->VCSRepository()->add(newFileName);
+ QString output;
+ mProject->model()->iconProvider()->VCSRepository()->add(newFileName,output);
mProject->model()->beginUpdate();
mProject->model()->endUpdate();
}
@@ -6719,10 +6724,11 @@ void MainWindow::on_actionGit_Create_Repository_triggered()
} else if (ui->projectView->isVisible() && mProject) {
GitManager vcsManager;
vcsManager.createRepository(mProject->folder());
- vcsManager.add(mProject->folder(), extractFileName(mProject->filename()));
- vcsManager.add(mProject->folder(), extractFileName(mProject->options().icon));
+ QString output;
+ vcsManager.add(mProject->folder(), extractFileName(mProject->filename()), output);
+ vcsManager.add(mProject->folder(), extractFileName(mProject->options().icon), output);
foreach (PProjectUnit pUnit, mProject->units()) {
- vcsManager.add(mProject->folder(),extractRelativePath(mProject->folder(),pUnit->fileName()));
+ vcsManager.add(mProject->folder(),extractRelativePath(mProject->folder(),pUnit->fileName()),output);
}
//update project view
mProject->addUnit(includeTrailingPathDelimiter(mProject->folder())+".gitignore", mProject->rootNode(), true);
@@ -6747,9 +6753,10 @@ void MainWindow::on_actionGit_Add_Files_triggered()
if (ui->treeFiles->isVisible()) {
GitManager vcsManager;
QModelIndexList indices = ui->treeFiles->selectionModel()->selectedRows();
+ QString output;
foreach (const QModelIndex index,indices) {
QFileInfo info = mFileSystemModel.fileInfo(index);
- vcsManager.add(info.absolutePath(),info.fileName());
+ vcsManager.add(info.absolutePath(),info.fileName(),output);
}
//update icons in files view
mFileSystemModelIconProvider.update();
@@ -6766,7 +6773,8 @@ void MainWindow::on_actionGit_Add_Files_triggered()
if (folderNode->unitIndex>=0) {
PProjectUnit unit = mProject->units()[folderNode->unitIndex];
QFileInfo info(unit->fileName());
- vcsManager.add(info.absolutePath(),info.fileName());
+ QString output;
+ vcsManager.add(info.absolutePath(),info.fileName(),output);
}
}
}
@@ -6811,16 +6819,32 @@ void MainWindow::on_actionGit_Commit_triggered()
);
return;
}
- vcsManager.commit(folder,message,true);
-
- //update project view
- if (mProject) {
- mProject->model()->beginUpdate();
- mProject->model()->endUpdate();
+ QString output;
+ QString userName = vcsManager.getUserName(folder);
+ QString userEmail = vcsManager.getUserEmail(folder);
+ if (userName.isEmpty() || userEmail.isEmpty()) {
+ GitUserConfigDialog dialog(folder);
+ if (dialog.exec()!=QDialog::Accepted) {
+ QMessageBox::critical(this,
+ tr("Can't Commit"),
+ tr("Git needs user info to commit."));
+ return;
+ }
+ }
+ if (vcsManager.commit(folder,message,true,output)) {
+ //update project view
+ if (mProject) {
+ mProject->model()->beginUpdate();
+ mProject->model()->endUpdate();
+ }
+ //update files view
+ mFileSystemModelIconProvider.update();
+ mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
+ }
+ if (!output.isEmpty()) {
+ InfoMessageBox infoBox;
+ infoBox.showMessage(output);
}
- //update files view
- mFileSystemModelIconProvider.update();
- mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
}
@@ -6835,16 +6859,22 @@ void MainWindow::on_actionGit_Restore_triggered()
if (folder.isEmpty())
return;
GitManager vcsManager;
- vcsManager.restore(folder,"");
+ QString output;
+ if (vcsManager.restore(folder,"",output)) {
- //update project view
- if (mProject) {
- mProject->model()->beginUpdate();
- mProject->model()->endUpdate();
+ //update project view
+ if (mProject) {
+ mProject->model()->beginUpdate();
+ mProject->model()->endUpdate();
+ }
+ //update files view
+ mFileSystemModelIconProvider.update();
+ mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
+ }
+ if (!output.isEmpty()) {
+ InfoMessageBox infoBox;
+ infoBox.showMessage(output);
}
- //update files view
- mFileSystemModelIconProvider.update();
- mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
}
diff --git a/RedPandaIDE/vcs/gitmanager.cpp b/RedPandaIDE/vcs/gitmanager.cpp
index 9aac1143..b7792d5a 100644
--- a/RedPandaIDE/vcs/gitmanager.cpp
+++ b/RedPandaIDE/vcs/gitmanager.cpp
@@ -29,7 +29,8 @@ void GitManager::createRepository(const QString &folder)
QDir dir(folder);
stringsToFile(contents,dir.filePath(".gitignore"));
- add(folder,".gitignore");
+ QString output;
+ add(folder,".gitignore",output);
}
bool GitManager::hasRepository(const QString &folder, QString& currentBranch)
@@ -93,32 +94,36 @@ bool GitManager::isFileChanged(const QFileInfo &fileInfo)
return output.trimmed() == fileInfo.fileName();
}
-void GitManager::add(const QString &folder, const QString &path)
+bool GitManager::add(const QString &folder, const QString &path, QString& output)
{
QStringList args;
args.append("add");
args.append(path);
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
-void GitManager::remove(const QString &folder, const QString &path)
+bool GitManager::remove(const QString &folder, const QString &path, QString& output)
{
QStringList args;
args.append("rm");
args.append(path);
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
-void GitManager::rename(const QString &folder, const QString &oldName, const QString &newName)
+bool GitManager::rename(const QString &folder, const QString &oldName,
+ const QString &newName, QString& output)
{
QStringList args;
args.append("mv");
args.append(oldName);
args.append(newName);
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
-void GitManager::restore(const QString &folder, const QString &path)
+bool GitManager::restore(const QString &folder, const QString &path, QString& output)
{
QStringList args;
args.append("restore");
@@ -126,7 +131,8 @@ void GitManager::restore(const QString &folder, const QString &path)
args.append(".");
else
args.append(path);
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
int GitManager::logCounts(const QString &folder, const QString &branch)
@@ -236,7 +242,7 @@ bool GitManager::removeRemote(const QString &folder, const QString &remoteName,
args.append(remoteName);
output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::renameRemote(const QString &folder, const QString &oldName, const QString &newName, QString &output)
@@ -248,7 +254,7 @@ bool GitManager::renameRemote(const QString &folder, const QString &oldName, con
args.append(newName);
output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::addRemote(const QString &folder, const QString &name, const QString &url, QString &output)
@@ -260,7 +266,7 @@ bool GitManager::addRemote(const QString &folder, const QString &name, const QSt
args.append(url);
output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::setRemoteURL(const QString &folder, const QString &name, const QString &newURL, QString &output)
@@ -272,7 +278,7 @@ bool GitManager::setRemoteURL(const QString &folder, const QString &name, const
args.append(newURL);
output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
QString GitManager::getRemoteURL(const QString &folder, const QString &name)
@@ -313,7 +319,7 @@ bool GitManager::setBranchUpstream(
args.append(QString("--set-upstream-to=%1/%2").arg(remoteName,branch));
args.append(branch);
output = runGit(folder,args).trimmed();
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::fetch(const QString &folder, QString &output)
@@ -321,7 +327,7 @@ bool GitManager::fetch(const QString &folder, QString &output)
QStringList args;
args.append("fetch");
output = runGit(folder,args).trimmed();
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::pull(const QString &folder, QString &output)
@@ -329,7 +335,7 @@ bool GitManager::pull(const QString &folder, QString &output)
QStringList args;
args.append("pull");
output = runGit(folder,args).trimmed();
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::push(const QString &folder, QString &output)
@@ -337,7 +343,7 @@ bool GitManager::push(const QString &folder, QString &output)
QStringList args;
args.append("push");
output = runGit(folder,args).trimmed();
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::push(const QString &folder, const QString &remoteName, const QString &branch, QString &output)
@@ -348,7 +354,58 @@ bool GitManager::push(const QString &folder, const QString &remoteName, const QS
args.append(remoteName);
args.append(branch);
output = runGit(folder,args).trimmed();
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
+}
+
+bool GitManager::removeConfig(const QString &folder, const QString &name, QString &output)
+{
+ QStringList args;
+ args.append("config");
+ args.append("--unset-all");
+ args.append(name);
+ output = runGit(folder,args);
+ return isSuccess(output);
+}
+
+bool GitManager::setConfig(const QString &folder, const QString &name, const QString &value, QString &output)
+{
+ removeConfig(folder,name,output);
+ QStringList args;
+ args.append("config");
+ args.append("--add");
+ args.append(name);
+ args.append(value);
+ output = runGit(folder,args);
+ return isSuccess(output);
+}
+
+bool GitManager::setUserName(const QString &folder, const QString &userName, QString &output)
+{
+ return setConfig(folder,"user.name",userName,output);
+}
+
+bool GitManager::setUserEmail(const QString &folder, const QString &userEmail, QString &output)
+{
+ return setConfig(folder,"user.email",userEmail,output);
+}
+
+QString GitManager::getConfig(const QString& folder, const QString &name)
+{
+ QStringList args;
+ args.append("config");
+ args.append("--get");
+ args.append(name);
+ return runGit(folder,args).trimmed();
+}
+
+QString GitManager::getUserName(const QString& folder)
+{
+ return getConfig(folder, "user.name");
+}
+
+QString GitManager::getUserEmail(const QString& folder)
+{
+ return getConfig(folder, "user.email");
}
QStringList GitManager::listBranches(const QString &folder, int ¤t)
@@ -393,7 +450,7 @@ bool GitManager::switchToBranch(const QString &folder, const QString &branch,
args.append("--no-track");
args.append(branch);
output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::merge(const QString &folder, const QString &commit, bool squash,
@@ -418,7 +475,7 @@ bool GitManager::merge(const QString &folder, const QString &commit, bool squash
}
args.append(commit);
output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
bool GitManager::continueMerge(const QString &folder)
@@ -427,7 +484,7 @@ bool GitManager::continueMerge(const QString &folder)
args.append("merge");
args.append("--continue");
QString output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ return isSuccess(output);
}
@@ -439,15 +496,30 @@ void GitManager::abortMerge(const QString &folder)
runGit(folder,args);
}
-void GitManager::clone(const QString &folder, const QString &url)
+bool GitManager::isSuccess(const QString &output)
+{
+ QStringList lst = textToLines(output);
+ if (!lst.isEmpty()) {
+ foreach (const QString& s, lst) {
+ QString last= s.trimmed();
+ if (last.startsWith("error:") || last.startsWith("fatal:"))
+ return false;
+ }
+ return true;
+ }
+ return true;
+}
+
+bool GitManager::clone(const QString &folder, const QString &url, QString& output)
{
QStringList args;
args.append("clone");
args.append(url);
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
-void GitManager::commit(const QString &folder, const QString &message, bool autoStage)
+bool GitManager::commit(const QString &folder, const QString &message, bool autoStage, QString& output)
{
QStringList args;
args.append("commit");
@@ -455,19 +527,21 @@ void GitManager::commit(const QString &folder, const QString &message, bool auto
args.append("-a");
args.append("-m");
args.append(message);
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
-void GitManager::revert(const QString &folder)
+bool GitManager::revert(const QString &folder, QString& output)
{
QStringList args;
args.append("revert");
- runGit(folder,args);
+ output = runGit(folder,args);
+ return isSuccess(output);
}
bool GitManager::reset(const QString &folder, const QString &commit,
GitResetStrategy strategy,
- QString& ouput)
+ QString& output)
{
//todo reset type
QStringList args;
@@ -490,8 +564,8 @@ bool GitManager::reset(const QString &folder, const QString &commit,
break;
}
args.append(commit);
- QString output = runGit(folder,args);
- return !output.startsWith("error") && !output.startsWith("fatal");
+ output = runGit(folder,args);
+ return isSuccess(output);
}
bool GitManager::isValid()
@@ -512,10 +586,16 @@ QString GitManager::runGit(const QString& workingFolder, const QStringList &args
args.join("\" \"")));
// qDebug()<<"---------";
// qDebug()<dirs().appDir());
+ env.insert("GIT_ASKPASS",includeTrailingPathDelimiter(pSettings->dirs().appDir())+"redpanda-win-git-askpass.exe");
QString output = runAndGetOutput(
fileInfo.absoluteFilePath(),
workingFolder,
- args);
+ args,
+ "",
+ false,
+ env);
output = escapeUTF8String(output.toUtf8());
// qDebug()<