Opening git commit works properly now

This commit is contained in:
Krzosa Karol
2024-08-08 08:01:49 +02:00
parent 080669b5e9
commit bfff188726
6 changed files with 41 additions and 19 deletions

View File

@@ -1106,6 +1106,18 @@ struct Scratch {
Scratch(Scratch &arena, Scratch &a2); Scratch(Scratch &arena, Scratch &a2);
}; };
struct RandomSeed {
uint64_t a;
};
inline uint64_t GetRandomU64(RandomSeed *state) {
uint64_t x = state->a;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
return state->a = x;
}
// //
// Implementation // Implementation
// //

View File

@@ -40,11 +40,13 @@ struct StdoutPollInfo {
}; };
struct Process { struct Process {
bool is_valid; bool is_valid;
String error_message; String error_message;
int exit_code; int exit_code;
char platform[6 * 8];
int64_t view_id; // text editor view int64_t view_id; // text editor view
char platform[6 * 8]; bool scroll_to_end;
}; };
Process CreateCommandLineProcess(String command_line, String working_dir); Process CreateCommandLineProcess(String command_line, String working_dir);

View File

@@ -28,6 +28,13 @@ String FieldString(lua_State *L, String name) {
return result; return result;
} }
RandomSeed UniqueBufferNameSeed = {13};
String GetUniqueBufferName(Allocator allocator, String working_dir, String prepend_name) {
uint64_t number = GetRandomU64(&UniqueBufferNameSeed);
String buffer_name = Format(allocator, "%.*s/%.*s%llu", FmtString(working_dir), FmtString(prepend_name), number);
return buffer_name;
}
void Open(String path) { void Open(String path) {
Scratch scratch; Scratch scratch;
@@ -60,15 +67,14 @@ void Open(String path) {
} else if (FieldString(LuaState, "kind") == "exec") { } else if (FieldString(LuaState, "kind") == "exec") {
String cmd = FieldString(LuaState, "cmd"); String cmd = FieldString(LuaState, "cmd");
String working_dir = FieldString(LuaState, "working_dir"); String working_dir = FieldString(LuaState, "working_dir");
String asd = "asd"; String buffer_name = GetUniqueBufferName(scratch, working_dir, "+CMD");
String buffer_name = Format(scratch, "%.*s/%.*s", FmtString(working_dir), FmtString(asd));
CheckpointBeforeGoto(); CheckpointBeforeGoto();
Window *window = GetWindow(GetLastActiveWindow()); Window *window = GetWindow(GetLastActiveWindow());
View *view = WindowOpenBufferView(window, buffer_name); View *view = WindowOpenBufferView(window, buffer_name);
Buffer *buffer = GetBuffer(view->active_buffer); Buffer *buffer = GetBuffer(view->active_buffer);
view->carets[0] = MakeCaret({}); view->carets[0] = MakeCaret({});
Exec(view->id, cmd, working_dir); Exec(view->id, false, cmd, working_dir);
SetActiveWindow(window->id); SetActiveWindow(window->id);
} else { } else {
ReportWarningf("Failed to match any of ApplyRules results!"); ReportWarningf("Failed to match any of ApplyRules results!");

View File

@@ -173,21 +173,23 @@ View *FindViewWithBufferName(String name) {
return NULL; return NULL;
} }
String GetCurrentBufferName() { Window *GetCurrentWindow() {
Window *window = GetWindow(ActiveWindow); Window *window = GetWindow(ActiveWindow);
if (window->is_title_bar) { if (window->is_title_bar) {
window = GetWindow(window->title_bar_window); window = GetWindow(window->title_bar_window);
} }
return window;
}
String GetCurrentBufferName() {
Window *window = GetCurrentWindow();
View *view = GetView(window->active_view); View *view = GetView(window->active_view);
Buffer *buffer = GetBuffer(view->active_buffer); Buffer *buffer = GetBuffer(view->active_buffer);
return buffer->name; return buffer->name;
} }
String GetCurrentBufferDir() { String GetCurrentBufferDir() {
Window *window = GetWindow(ActiveWindow); Window *window = GetCurrentWindow();
if (window->is_title_bar) {
window = GetWindow(window->title_bar_window);
}
View *view = GetView(window->active_view); View *view = GetView(window->active_view);
Buffer *buffer = GetBuffer(view->active_buffer); Buffer *buffer = GetBuffer(view->active_buffer);
String name = buffer->is_directory ? buffer->name : ChopLastSlash(buffer->name); String name = buffer->is_directory ? buffer->name : ChopLastSlash(buffer->name);

View File

@@ -1,15 +1,16 @@
Array<Process> ActiveProcesses = {}; Array<Process> ActiveProcesses = {};
void Exec(ViewID view, String cmd, String working_dir) { void Exec(ViewID view, bool scroll_to_end, String cmd, String working_dir) {
Process process = CreateCommandLineProcess(cmd, working_dir); Process process = CreateCommandLineProcess(cmd, working_dir);
process.view_id = view.id; process.view_id = view.id;
process.scroll_to_end = scroll_to_end;
if (process.is_valid) Add(&ActiveProcesses, process); if (process.is_valid) Add(&ActiveProcesses, process);
} }
void Exec(ViewID view, String16 cmd16, String working_dir) { void Exec(ViewID view, bool scroll_to_end, String16 cmd16, String working_dir) {
Scratch scratch; Scratch scratch;
String cmd = ToString(scratch, cmd16); String cmd = ToString(scratch, cmd16);
Exec(view, cmd, working_dir); Exec(view, scroll_to_end, cmd, working_dir);
} }
void UpdateProcesses() { void UpdateProcesses() {
@@ -21,7 +22,7 @@ void UpdateProcesses() {
StdoutPollInfo info = PollStdout(&it, buffer, buffer_size); StdoutPollInfo info = PollStdout(&it, buffer, buffer_size);
String string = {buffer, info.size_read}; String string = {buffer, info.size_read};
ViewID view_id = {it.view_id}; ViewID view_id = {it.view_id};
if (string.len) Command_Append(view_id, string, false); if (string.len) Command_Append(view_id, string, it.scroll_to_end);
bool exited = PollExitCode(&it); bool exited = PollExitCode(&it);
if (exited) remove_item = true; if (exited) remove_item = true;

View File

@@ -2,7 +2,6 @@
- kill process using command in window - kill process using command in window
- kill all processes on exit https://devblogs.microsoft.com/oldnewthing/20131209-00/?p=2433 - kill all processes on exit https://devblogs.microsoft.com/oldnewthing/20131209-00/?p=2433
- if exec is prepended with '!' symbol then run a shell command - if exec is prepended with '!' symbol then run a shell command
- Open git commit as part of "Open" in new buffer using git --no-pager show <hash>
- try using git grep for search for now, combine with fuzzy search buffer - try using git grep for search for now, combine with fuzzy search buffer
- Test stdin writing code - Test stdin writing code
- Implement shell interaction (last line should have a '$'' symbols, if you press enter it should send that line to stdin of a running shell) - Implement shell interaction (last line should have a '$'' symbols, if you press enter it should send that line to stdin of a running shell)