REQ_(TOGGLE_LINENO, "Toggle line numbers"), \
REQ_(TOGGLE_REV_GRAPH, "Toggle revision graph visualization"), \
REQ_(STATUS_UPDATE, "Update file status"), \
- REQ_(EDIT, "Open in editor")
+ REQ_(EDIT, "Open in editor"), \
+ REQ_(CHERRY_PICK, "Cherry-pick commit to current branch")
/* User action requests. */
{ ':', REQ_PROMPT },
{ 'u', REQ_STATUS_UPDATE },
{ 'e', REQ_EDIT },
+ { 'C', REQ_CHERRY_PICK },
/* Using the ncurses SIGWINCH handler. */
{ KEY_RESIZE, REQ_SCREEN_RESIZE },
report("Nothing to edit");
break;
+ case REQ_CHERRY_PICK:
+ report("Nothing to cherry-pick");
+ break;
+
case REQ_ENTER:
report("Nothing to enter");
break;
- case REQ_NONE:
- doupdate();
- return TRUE;
case REQ_VIEW_CLOSE:
/* XXX: Mark closed views by letting view->parent point to the
return TRUE;
}
+static void
+cherry_pick_commit(struct commit *commit)
+{
+ char cmd[SIZEOF_STR];
+ char *cherry_pick = getenv("TIG_CHERRY_PICK");
+
+ if (!cherry_pick)
+ cherry_pick = "git cherry-pick";
+
+ if (string_format(cmd, "%s %s", cherry_pick, commit->id)) {
+ def_prog_mode(); /* save current tty modes */
+ endwin(); /* restore original tty modes */
+ system(cmd);
+ fprintf(stderr, "Press Enter to continue");
+ getc(stdin);
+ reset_prog_mode();
+ redraw_display();
+ }
+}
+
static enum request
main_request(struct view *view, enum request request, struct line *line)
{
if (request == REQ_ENTER)
open_view(view, REQ_VIEW_DIFF, flags);
+ else if (request == REQ_CHERRY_PICK)
+ cherry_pick_commit(line->data);
else
return request;