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.
OPEN_SPLIT = 1, /* Split current view. */
OPEN_BACKGROUNDED = 2, /* Backgrounded. */
OPEN_RELOAD = 4, /* Reload view even if it is the current. */
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. */
bool backgrounded = !!(flags & OPEN_BACKGROUNDED);
bool split = !!(flags & OPEN_SPLIT);
bool reload = !!(flags & OPEN_RELOAD);
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];
struct view *view = VIEW(request);
int nviews = displayed_views();
struct view *base_view = display[0];
display[1] = view;
if (!backgrounded)
current_view = 1;
display[1] = view;
if (!backgrounded)
current_view = 1;
+ } else if (!nomaximize) {
/* Maximize the current view. */
memset(display, 0, sizeof(display));
current_view = 0;
/* Maximize the current view. */
memset(display, 0, sizeof(display));
current_view = 0;
+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)
static FILE *
status_update_prepare(enum line_type type)
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");
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");
}
} else if (!status_update_file(&stage_status, stage_line_type)) {
report("Failed to update file");
}
} else if (!status_update_file(&stage_status, stage_line_type)) {
report("Failed to update file");
- 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]);
open_editor(stage_status.status != '?', stage_status.new.name);
break;
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);
case REQ_VIEW_BLAME:
if (stage_status.new.name[0]) {
string_copy(opt_file, stage_status.new.name);
return request;
case REQ_ENTER:
return request;
case REQ_ENTER:
- pager_request(view, request, line);
- break;
+ return pager_request(view, request, line);
default:
return request;
}
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);
+