Commit 152c1c93d3f4f950c827a16175c3f439311e28c0

Stefan Sperling 2020-11-29T14:21:55

tog: make it possible to open a ref view from the tree view

diff --git a/tog/tog.1 b/tog/tog.1
index 10aa4fa..a6e5d2c 100644
--- a/tog/tog.1
+++ b/tog/tog.1
@@ -346,6 +346,13 @@ view for the currently selected file.
 Open a
 .Cm log
 view for the currently selected tree entry.
+.It Cm r
+Open a
+.Cm ref
+view listing all references in the repository.
+This can then be used to open a new
+.Cm tree
+view for arbitrary branches and tags.
 .It Cm Backspace
 Move back to the parent directory.
 .It Cm i
diff --git a/tog/tog.c b/tog/tog.c
index 7a8da01..8442a98 100644
--- a/tog/tog.c
+++ b/tog/tog.c
@@ -5358,7 +5358,7 @@ input_tree_view(struct tog_view **new_view, struct tog_view **dead_view,
 {
 	const struct got_error *err = NULL;
 	struct tog_tree_view_state *s = &view->state.tree;
-	struct tog_view *log_view;
+	struct tog_view *log_view, *ref_view;
 	int begin_x = 0, nscrolled;
 
 	switch (ch) {
@@ -5386,6 +5386,32 @@ input_tree_view(struct tog_view **new_view, struct tog_view **dead_view,
 		} else
 			*new_view = log_view;
 		break;
+	case 'r':
+		if (view_is_parent_view(view))
+			begin_x = view_split_begin_x(view->begin_x);
+		ref_view = view_open(view->nlines, view->ncols,
+		    view->begin_y, begin_x, TOG_VIEW_REF);
+		if (ref_view == NULL)
+			return got_error_from_errno("view_open");
+		err = open_ref_view(ref_view, s->repo);
+		if (err) {
+			view_close(ref_view);
+			return err;
+		}
+		if (view_is_parent_view(view)) {
+			err = view_close_child(view);
+			if (err)
+				return err;
+			err = view_set_child(view, ref_view);
+			if (err) {
+				view_close(ref_view);
+				break;
+			}
+			*focus_view = ref_view;
+			view->child_focussed = 1;
+		} else
+			*new_view = ref_view;
+		break;
 	case 'k':
 	case KEY_UP:
 		if (s->selected > 0) {