summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d79f157)
raw | patch | inline | side by side (parent: d79f157)
author | Jonas Fonseca <fonseca@diku.dk> | |
Thu, 3 Apr 2008 14:41:09 +0000 (16:41 +0200) | ||
committer | Jonas Fonseca <fonseca@diku.dk> | |
Thu, 3 Apr 2008 17:33:30 +0000 (19:33 +0200) |
Consolidate stage reloading for the edit, refresh, and update requests.
It works by first reloading the status view after which the stage view
is closed or reloaded depending on whether the status information of the
stage view still is valid.
It works by first reloading the status view after which the stage view
is closed or reloaded depending on whether the status information of the
stage view still is valid.
tig.c | patch | blob | history |
index b723587396642303b5c04370ad10e288277f1b0e..8fec47dbb31dc47684d970fd5080236d2756ac88 100644 (file)
--- a/tig.c
+++ b/tig.c
OPEN_SPLIT = 1, /* Split current view. */
OPEN_BACKGROUNDED = 2, /* Backgrounded. */
OPEN_RELOAD = 4, /* Reload view even if it is the current. */
+ OPEN_NOMAXIMIZE = 8, /* Do not maximize the current view. */
};
static void
bool backgrounded = !!(flags & OPEN_BACKGROUNDED);
bool split = !!(flags & OPEN_SPLIT);
bool reload = !!(flags & OPEN_RELOAD);
+ bool nomaximize = !!(flags & OPEN_NOMAXIMIZE);
struct view *view = VIEW(request);
int nviews = displayed_views();
struct view *base_view = display[0];
display[1] = view;
if (!backgrounded)
current_view = 1;
- } else {
+ } else if (!nomaximize) {
/* Maximize the current view. */
memset(display, 0, sizeof(display));
current_view = 0;
return REQ_NONE;
}
+static bool
+status_exists(struct status *status, enum line_type type)
+{
+ struct view *view = VIEW(REQ_VIEW_STATUS);
+ struct line *line;
+
+ for (line = view->line; line < view->line + view->lines; line++) {
+ struct status *pos = line->data;
+
+ if (line->type == type && pos &&
+ !strcmp(status->new.name, pos->new.name))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static FILE *
status_update_prepare(enum line_type type)
return TRUE;
}
-static void
+static bool
stage_update(struct view *view, struct line *line)
{
if (!opt_no_head && stage_line_type != LINE_STAT_UNTRACKED &&
(line->type == LINE_DIFF_CHUNK || !stage_status.status)) {
if (!stage_update_chunk(view, line)) {
report("Failed to apply chunk");
- return;
+ return FALSE;
}
} else if (!status_update_file(&stage_status, stage_line_type)) {
report("Failed to update file");
- return;
+ return FALSE;
}
- open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD);
-
- view = VIEW(REQ_VIEW_STATUS);
- if (view_is_displayed(view))
- status_enter(view, &view->line[view->lineno]);
+ return TRUE;
}
static enum request
open_editor(stage_status.status != '?', stage_status.new.name);
break;
+ case REQ_REFRESH:
+ /* Reload everything ... */
+ break;
+
case REQ_VIEW_BLAME:
if (stage_status.new.name[0]) {
string_copy(opt_file, stage_status.new.name);
return request;
case REQ_ENTER:
- pager_request(view, request, line);
- break;
+ return pager_request(view, request, line);
default:
return request;
}
+ open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD | OPEN_NOMAXIMIZE);
+
+ /* Check whether the staged entry still exists, and close the
+ * stage view if it doesn't. */
+ if (!status_exists(&stage_status, stage_line_type))
+ return REQ_VIEW_CLOSE;
+
+ if (stage_line_type == LINE_STAT_UNTRACKED)
+ opt_pipe = fopen(stage_status.new.name, "r");
+ else
+ string_copy(opt_cmd, view->cmd);
+ open_view(view, REQ_VIEW_STAGE, OPEN_RELOAD | OPEN_NOMAXIMIZE);
+
return REQ_NONE;
}