ultimatepp/uppsrc/urepo/Console.cpp
cxl 6ec31865a7 Win32: Support for bin git
git-svn-id: svn://ultimatepp.org/upp/trunk@15577 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2020-12-10 21:27:30 +00:00

104 lines
No EOL
2.5 KiB
C++

#include "urepo.h"
namespace Upp {
UrepoConsole::UrepoConsole()
{
CtrlLayoutExit(*this, "System Console");
list.NoHeader().NoGrid().NoCursor().AddColumn();
font = Courier(Ctrl::VertLayoutZoom(12));
list.SetLineCy(font.Info().GetHeight());
exit.Hide();
cancel.Hide();
cancel << [=] { canceled = true; };
}
void UrepoConsole::AddResult(const String& out)
{
Vector<String> h = Split(out, CharFilterCrLf);
for(int i = 0; i < h.GetCount(); i++) {
String s = " " + h[i];
list.Add(AttrText(s).SetFont(font), s);
}
list.GoEnd();
}
void UrepoConsole::Log(const Value& s, Color ink)
{
list.Add(AttrText(s).SetFont(font).NormalInk(ink), s);
}
int UrepoConsole::System(const char *cmd, Event<One<AProcess>&, const char *> start_process)
{
if(!IsOpen())
Open();
list.Add(AttrText(cmd).SetFont(font().Bold()).Ink(SLtBlue()));
int ii = list.GetCount();
One<AProcess> ap;
start_process(ap, cmd);
if(!ap) {
list.Add(AttrText("Failed to start the executable").SetFont(font().Bold()).Ink(SLtRed()));
return -1;
}
AProcess& p = *ap;
String out;
canceled = false;
cancel.Show();
while(p.IsRunning() && IsOpen()) {
String h = p.Get();
out.Cat(h);
int lf = out.ReverseFind('\n');
if(lf >= 0) {
AddResult(out.Mid(0, lf + 1));
out = out.Mid(lf + 1);
}
ProcessEvents();
Sleep(h.GetCount() == 0); // p.Wait would be much better here!
if(canceled)
break;
}
cancel.Hide();
out.Cat(p.Get());
AddResult(out);
ProcessEvents();
int code = canceled ? -1 : p.GetExitCode();
if(code)
while(ii < list.GetCount()) {
list.Set(ii, 0, AttrText((String)list.Get(ii, 1)).SetFont(font).Ink(SLtRed()));
ii++;
}
return code;
}
int UrepoConsole::System(const char *cmd)
{
return System(cmd, [&](One<AProcess>& ap, const char *cmd) {
LocalProcess& p = ap.Create<LocalProcess>();
if(!p.Start(cmd))
ap.Clear();
});
}
int UrepoConsole::CheckSystem(const char *s)
{
int exitcode = System(s);
if(exitcode) {
if(exitcode < 0)
AddResult("Error running " + String(s));
else
AddResult("exitcode = " + FormatInt(exitcode));
}
return exitcode;
}
int UrepoConsole::Git(const char *dir, const char *command)
{
String h = GetCurrentDirectory();
SetCurrentDirectory(dir);
list.Add(AttrText(String("cd ") + dir).SetFont(font().Bold().Italic()).Ink(SLtBlue()));
int code = CheckSystem(String() << "git " << command);
SetCurrentDirectory(h);
return code;
}
};