Remove unused parameter from two TUI functions
[deliverable/binutils-gdb.git] / gdb / tui / tui-data.h
CommitLineData
f377b406 1/* TUI data manipulation routines.
55fb0713 2
42a4f53d 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
55fb0713 4
f377b406
SC
5 Contributed by Hewlett-Packard Company.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
f377b406 21
1a5c2598
TT
22#ifndef TUI_TUI_DATA_H
23#define TUI_TUI_DATA_H
c906108c 24
6a83354a
AC
25#include "tui/tui.h" /* For enum tui_win_type. */
26#include "gdb_curses.h" /* For WINDOW. */
b73dd877 27#include "observable.h"
6a83354a
AC
28
29/* This is a point definition. */
30struct tui_point
31{
32 int x, y;
33};
2a5127c4 34
1cc6d956 35/* Generic window information. */
2a8854a7
AC
36struct tui_gen_win_info
37{
fb54fa76
TT
38protected:
39
ab313b35
TT
40 explicit tui_gen_win_info (enum tui_win_type t)
41 : type (t)
42 {
43 }
44
fb54fa76
TT
45public:
46
f936bca2 47 virtual ~tui_gen_win_info ();
ab313b35 48
5b81daba
TT
49 /* Call to refresh this window. */
50 virtual void refresh_window ();
51
48a3bd16
TT
52 /* Make this window visible or invisible. */
53 virtual void make_visible (bool visible);
54
152f3f4b
TT
55 /* Return the name of this type of window. */
56 virtual const char *name () const
57 {
58 return "";
59 }
60
d6ba6a11
TT
61 /* Reset this window. WIN_TYPE must match the existing type of this
62 window (it is only passed for self-test purposes). The other
63 parameters are used to set the window's size and position. */
64 void reset (enum tui_win_type win_type,
65 int height, int width,
66 int origin_x, int origin_y);
67
ab313b35
TT
68 /* Window handle. */
69 WINDOW *handle = nullptr;
70 /* Type of window. */
71 enum tui_win_type type;
72 /* Window width. */
73 int width = 0;
74 /* Window height. */
75 int height = 0;
76 /* Origin of window. */
77 struct tui_point origin = {0, 0};
ab313b35
TT
78 /* Viewport height. */
79 int viewport_height = 0;
80 /* Index of last visible line. */
81 int last_visible_line = 0;
82 /* Whether the window is visible or not. */
83 bool is_visible = false;
84 /* Window title to display. */
85 char *title = nullptr;
2a8854a7 86};
2a5127c4 87
17374de4
TT
88/* Whether or not a window should be drawn with a box. */
89enum tui_box
90{
91 DONT_BOX_WINDOW = 0,
92 BOX_WINDOW
93};
94
1cc6d956 95/* Constant definitions. */
08ef48c5
MS
96#define DEFAULT_TAB_LEN 8
97#define NO_SRC_STRING "[ No Source Available ]"
98#define NO_DISASSEM_STRING "[ No Assembly Available ]"
99#define NO_REGS_STRING "[ Register Values Unavailable ]"
100#define NO_DATA_STRING "[ No Data Values Displayed ]"
101#define MAX_CONTENT_COUNT 100
6dce28e4
AB
102#define SRC_NAME "src"
103#define CMD_NAME "cmd"
104#define DATA_NAME "regs"
105#define DISASSEM_NAME "asm"
08ef48c5
MS
106#define TUI_NULL_STR ""
107#define DEFAULT_HISTORY_COUNT 25
08ef48c5
MS
108#define HILITE TRUE
109#define NO_HILITE FALSE
110#define WITH_LOCATOR TRUE
111#define NO_LOCATOR FALSE
08ef48c5
MS
112#define UNDEFINED_ITEM -1
113#define MIN_WIN_HEIGHT 3
114#define MIN_CMD_WIN_HEIGHT 3
c906108c 115
50265402 116/* Strings to display in the TUI status line. */
08ef48c5 117#define PROC_PREFIX "In: "
9f2850ba 118#define LINE_PREFIX "L"
08ef48c5
MS
119#define PC_PREFIX "PC: "
120#define SINGLE_KEY "(SingleKey)"
50265402 121
1cc6d956
MS
122/* Minimum/Maximum length of some fields displayed in the TUI status
123 line. */
124#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line
125 numbers. */
50265402
SC
126#define MIN_PROC_WIDTH 12
127#define MAX_TARGET_WIDTH 10
9f2850ba 128#define MAX_PID_WIDTH 19
c906108c 129
1cc6d956 130/* The kinds of layouts available. */
2a8854a7
AC
131enum tui_layout_type
132{
133 SRC_COMMAND,
134 DISASSEM_COMMAND,
135 SRC_DISASSEM_COMMAND,
136 SRC_DATA_COMMAND,
137 DISASSEM_DATA_COMMAND,
138 UNDEFINED_LAYOUT
139};
c906108c 140
52059ffd
TT
141enum tui_line_or_address_kind
142{
143 LOA_LINE,
144 LOA_ADDRESS
145};
146
1cc6d956 147/* Structure describing source line or line address. */
362c05fe 148struct tui_line_or_address
2a8854a7 149{
52059ffd 150 enum tui_line_or_address_kind loa;
362c05fe
AS
151 union
152 {
153 int line_no;
154 CORE_ADDR addr;
155 } u;
2a8854a7 156};
c906108c 157
1cc6d956 158/* Current Layout definition. */
2a8854a7
AC
159struct tui_layout_def
160{
6d012f14 161 enum tui_win_type display_mode;
2a8854a7 162};
c906108c 163
0598af48
TT
164/* Flags to tell what kind of breakpoint is at current line. */
165enum tui_bp_flag
166{
167 TUI_BP_ENABLED = 0x01,
168 TUI_BP_DISABLED = 0x02,
169 TUI_BP_HIT = 0x04,
170 TUI_BP_CONDITIONAL = 0x08,
171 TUI_BP_HARDWARE = 0x10
172};
173
174DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
175
1cc6d956 176/* Elements in the Source/Disassembly Window. */
2a8854a7
AC
177struct tui_source_element
178{
53e7cdba
TT
179 tui_source_element ()
180 {
181 line_or_addr.loa = LOA_LINE;
182 line_or_addr.u.line_no = 0;
183 }
184
185 ~tui_source_element ()
186 {
187 xfree (line);
188 }
189
190 char *line = nullptr;
362c05fe 191 struct tui_line_or_address line_or_addr;
53e7cdba 192 bool is_exec_point = false;
0598af48 193 tui_bp_flags break_mode = 0;
2a8854a7 194};
c906108c
SS
195
196
2d42f9a8
JB
197#ifdef PATH_MAX
198# define MAX_LOCATOR_ELEMENT_LEN PATH_MAX
199#else
200# define MAX_LOCATOR_ELEMENT_LEN 1024
201#endif
c906108c 202
00b2bad4
SC
203/* Position of breakpoint markers in the exec info string. */
204#define TUI_BP_HIT_POS 0
205#define TUI_BP_BREAK_POS 1
206#define TUI_EXEC_POS 2
207#define TUI_EXECINFO_SIZE 4
208
2a8854a7 209typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
c906108c 210
489e9d8b
TT
211/* Execution info window class. */
212
213struct tui_exec_info_window : public tui_gen_win_info
214{
215 tui_exec_info_window ()
216 : tui_gen_win_info (EXEC_INFO_WIN)
217 {
218 }
219
220 ~tui_exec_info_window () override
221 {
222 xfree (m_content);
223 }
224
225 /* Get or allocate contents. */
226 tui_exec_info_content *maybe_allocate_content (int n_elements);
227
228 /* Return the contents. */
229 const tui_exec_info_content *get_content () const
230 {
231 return m_content;
232 }
233
234private:
235
236 tui_exec_info_content *m_content = nullptr;
237};
238
3add462f
TT
239/* Locator window class. */
240
241struct tui_locator_window : public tui_gen_win_info
242{
243 tui_locator_window ()
244 : tui_gen_win_info (LOCATOR_WIN)
245 {
246 full_name[0] = 0;
247 proc_name[0] = 0;
248 }
249
250 char full_name[MAX_LOCATOR_ELEMENT_LEN];
251 char proc_name[MAX_LOCATOR_ELEMENT_LEN];
252 int line_no = 0;
253 CORE_ADDR addr = 0;
254 /* Architecture associated with code at this location. */
255 struct gdbarch *gdbarch = nullptr;
256};
257
41bcff7f
TT
258/* A data item window. */
259
260struct tui_data_item_window : public tui_gen_win_info
261{
262 tui_data_item_window ()
263 : tui_gen_win_info (DATA_ITEM_WIN)
264 {
265 }
266
267 ~tui_data_item_window () override;
268
269 const char *name = nullptr;
270 /* The register number, or data display number. */
271 int item_no = UNDEFINED_ITEM;
41bcff7f
TT
272 void *value = nullptr;
273 bool highlight = false;
274 char *content = nullptr;
275};
276
1cc6d956 277/* This defines information about each logical window. */
cb2ce893 278struct tui_win_info : public tui_gen_win_info
2a8854a7 279{
33b906ab 280protected:
e7e11af4 281
33b906ab 282 explicit tui_win_info (enum tui_win_type type);
6792b55e
TT
283 DISABLE_COPY_AND_ASSIGN (tui_win_info);
284
13446e05
TT
285 /* Scroll the contents vertically. This is only called via
286 forward_scroll and backward_scroll. */
c3bd716f 287 virtual void do_scroll_vertical (int num_to_scroll) = 0;
13446e05
TT
288
289 /* Scroll the contents horizontally. This is only called via
290 left_scroll and right_scroll. */
c3bd716f 291 virtual void do_scroll_horizontal (int num_to_scroll) = 0;
13446e05 292
5fcee43a
TT
293 /* Called after make_visible_with_new_height sets the new height.
294 Should update the window. */
295 virtual void do_make_visible_with_new_height () = 0;
296
33b906ab
TT
297public:
298
f936bca2
TT
299 ~tui_win_info () override
300 {
301 }
33b906ab 302
8761a91b
TT
303 /* Clear the pertinent detail in the window. */
304 virtual void clear_detail () = 0;
305
44f0e208
TT
306 /* Return true if this window has the locator. */
307 virtual bool has_locator () const
308 {
309 return false;
310 }
311
2042b506
TT
312 /* Refresh this window and any associated windows. */
313 virtual void refresh ();
314
1825f487
TT
315 /* Called after all the TUI windows are refreshed, to let this
316 window have a chance to update itself further. */
317 virtual void refresh_all ()
318 {
319 }
320
3f02ce1e
TT
321 /* Called after a TUI window is given a new height; this updates any
322 related auxiliary windows. */
323 virtual void set_new_height (int height)
324 {
325 }
326
8903bd8a
TT
327 /* Compute the maximum height of this window. */
328 virtual int max_height () const;
329
d83f1fe6
TT
330 /* Called after the tab width has been changed. */
331 virtual void update_tab_width ()
332 {
333 }
334
5fcee43a
TT
335 /* Make the window visible after the height has been changed. */
336 void make_visible_with_new_height ();
337
214a5cbe
TT
338 /* Set whether this window is highglighted. */
339 void set_highlight (bool highlight)
340 {
341 is_highlighted = highlight;
342 }
343
13446e05
TT
344 /* Methods to scroll the contents of this window. Note that they
345 are named with "_scroll" coming at the end because the more
346 obvious "scroll_forward" is defined as a macro in term.h. */
347 void forward_scroll (int num_to_scroll);
348 void backward_scroll (int num_to_scroll);
349 void left_scroll (int num_to_scroll);
350 void right_scroll (int num_to_scroll);
351
06210ce4
TT
352 /* Return true if this window can be scrolled, false otherwise. */
353 virtual bool can_scroll () const
354 {
355 return true;
356 }
357
33b906ab 358 /* Can this window ever be highlighted? */
d6ba6a11 359 bool can_highlight = true;
33b906ab
TT
360
361 /* Is this window highlighted? */
214a5cbe 362 bool is_highlighted = false;
33b906ab
TT
363};
364
5cf82909
TT
365/* The base class for all source-like windows, namely the source and
366 disassembly windows. */
367
368struct tui_source_window_base : public tui_win_info
33b906ab 369{
5cf82909
TT
370protected:
371 explicit tui_source_window_base (enum tui_win_type type);
372 ~tui_source_window_base () override;
373 DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
374
c3bd716f 375 void do_scroll_horizontal (int num_to_scroll) override;
5fcee43a 376 void do_make_visible_with_new_height () override;
13446e05 377
5cf82909 378public:
8761a91b
TT
379
380 void clear_detail () override;
44f0e208
TT
381
382 /* Return true if this window has the locator. */
e6e41501
TT
383 bool has_locator () const override
384 {
385 return m_has_locator;
386 }
387
56122977 388 void make_visible (bool visible) override;
2042b506 389 void refresh () override;
1825f487 390 void refresh_all () override;
cda37efb 391
ad54d15b
TT
392 /* Refill the source window's source cache and update it. If this
393 is a disassembly window, then just update it. */
394 void refill ();
395
396 /* Set the location of the execution point. */
397 void set_is_exec_point_at (struct tui_line_or_address l);
398
3f02ce1e
TT
399 void set_new_height (int height) override;
400
d83f1fe6
TT
401 void update_tab_width () override;
402
c2cd8994
TT
403 /* Return true if the location LOC corresponds to the line number
404 LINE_NO in this source window; false otherwise. */
405 virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0;
406
a38da35d
TT
407 /* Can it be used, or is it already used? */
408 bool content_in_use = false;
e6e41501
TT
409 /* Does the locator belong to this window? */
410 bool m_has_locator = false;
411 /* Execution information window. */
489e9d8b 412 struct tui_exec_info_window *execution_info = nullptr;
e6e41501
TT
413 /* Used for horizontal scroll. */
414 int horizontal_offset = 0;
415 struct tui_line_or_address start_line_or_addr;
416
417 /* It is the resolved form as returned by symtab_to_fullname. */
418 char *fullname = nullptr;
419
420 /* Architecture associated with code at this location. */
421 struct gdbarch *gdbarch = nullptr;
53e7cdba
TT
422
423 std::vector<tui_source_element> content;
33b906ab
TT
424};
425
5cf82909
TT
426/* A TUI source window. */
427
428struct tui_source_window : public tui_source_window_base
429{
b73dd877
TT
430 tui_source_window ();
431 ~tui_source_window ();
5cf82909
TT
432
433 DISABLE_COPY_AND_ASSIGN (tui_source_window);
13446e05 434
152f3f4b
TT
435 const char *name () const override
436 {
437 return SRC_NAME;
438 }
439
c2cd8994
TT
440 bool location_matches_p (struct bp_location *loc, int line_no) override;
441
a38da35d
TT
442 bool showing_source_p (const char *filename) const;
443
13446e05
TT
444protected:
445
c3bd716f 446 void do_scroll_vertical (int num_to_scroll) override;
b73dd877
TT
447
448private:
449
450 void style_changed ();
451
452 /* A token used to register and unregister an observer. */
453 gdb::observers::token m_observable;
5cf82909
TT
454};
455
456/* A TUI disassembly window. */
457
458struct tui_disasm_window : public tui_source_window_base
459{
460 tui_disasm_window ()
461 : tui_source_window_base (DISASSEM_WIN)
462 {
463 }
464
465 DISABLE_COPY_AND_ASSIGN (tui_disasm_window);
13446e05 466
152f3f4b
TT
467 const char *name () const override
468 {
469 return DISASSEM_NAME;
470 }
471
c2cd8994
TT
472 bool location_matches_p (struct bp_location *loc, int line_no) override;
473
13446e05
TT
474protected:
475
c3bd716f 476 void do_scroll_vertical (int num_to_scroll) override;
5cf82909
TT
477};
478
33b906ab
TT
479struct tui_data_window : public tui_win_info
480{
63901aec
TT
481 tui_data_window ()
482 : tui_win_info (DATA_WIN)
483 {
484 }
485
33b906ab 486 DISABLE_COPY_AND_ASSIGN (tui_data_window);
8761a91b
TT
487
488 void clear_detail () override;
1825f487 489 void refresh_all () override;
13446e05 490
3f02ce1e
TT
491 void set_new_height (int height) override;
492
5b81daba
TT
493 void refresh_window () override;
494
152f3f4b
TT
495 const char *name () const override
496 {
497 return DATA_NAME;
498 }
499
21e1c91e
TT
500 /* Windows that are used to display registers. */
501 std::vector<std::unique_ptr<tui_data_item_window>> regs_content;
63901aec
TT
502 int regs_column_count = 0;
503 /* Should regs be displayed at all? */
504 bool display_regs = false;
505 struct reggroup *current_group = nullptr;
238eb706 506
0b5ec218
TT
507 /* Answer the number of the last line in the regs display. If there
508 are no registers (-1) is returned. */
509 int last_regs_line_no () const;
510
3b23c5f2
TT
511 /* Answer the line number that the register element at element_no is
512 on. If element_no is greater than the number of register
513 elements there are, -1 is returned. */
514 int line_from_reg_element_no (int element_no) const;
515
baff0c28
TT
516 /* Answer the index of the first element in line_no. If line_no is
517 past the register area (-1) is returned. */
518 int first_reg_element_no_inline (int line_no) const;
519
50daf268
TT
520 /* Displays the data that is in the data window's content. It does
521 not set the content. */
522 void display_all_data ();
523
b4094625
TT
524 /* Delete all the item windows in the data window. This is usually
525 done when the data window is scrolled. */
526 void delete_data_content_windows ();
527
f76d8b19
TT
528 void erase_data_content (const char *prompt);
529
517e9505
TT
530 /* Display the registers in the content from 'start_element_no'
531 until the end of the register content or the end of the display
532 height. No checking for displaying past the end of the registers
533 is done here. */
534 void display_registers_from (int start_element_no);
535
536 /* Display the registers starting at line line_no in the data
537 window. Answers the line number that the display actually
538 started from. If nothing is displayed (-1) is returned. */
539 int display_registers_from_line (int line_no);
540
13446e05
TT
541protected:
542
c3bd716f
TT
543 void do_scroll_vertical (int num_to_scroll) override;
544 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
545 {
546 }
5fcee43a 547 void do_make_visible_with_new_height () override;
eaf9738b
TT
548
549 /* Return the index of the first element displayed. If none are
550 displayed, then return -1. */
551 int first_data_item_displayed ();
aca2dd16
TT
552
553 /* Display the registers in the content from 'start_element_no' on
554 'start_line_no' until the end of the register content or the end
555 of the display height. This function checks that we won't
556 display off the end of the register display. */
557 void display_reg_element_at_line (int start_element_no, int start_line_no);
33b906ab
TT
558};
559
560struct tui_cmd_window : public tui_win_info
561{
63901aec
TT
562 tui_cmd_window ()
563 : tui_win_info (CMD_WIN)
564 {
d6ba6a11 565 can_highlight = false;
63901aec
TT
566 }
567
33b906ab 568 DISABLE_COPY_AND_ASSIGN (tui_cmd_window);
8761a91b
TT
569
570 void clear_detail () override;
13446e05 571
56122977 572 void make_visible (bool visible) override
cda37efb
TT
573 {
574 }
575
8903bd8a
TT
576 int max_height () const override;
577
5b81daba
TT
578 void refresh_window () override
579 {
580 }
581
152f3f4b
TT
582 const char *name () const override
583 {
584 return CMD_NAME;
585 }
586
06210ce4
TT
587 bool can_scroll () const override
588 {
589 return false;
590 }
591
63901aec 592 int start_line = 0;
81491aa0 593
13446e05
TT
594protected:
595
c3bd716f 596 void do_scroll_vertical (int num_to_scroll) override
13446e05
TT
597 {
598 }
599
c3bd716f 600 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
601 {
602 }
5fcee43a
TT
603
604 void do_make_visible_with_new_height () override;
2a8854a7 605};
c906108c 606
6658b1bf 607extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
608
609
1cc6d956 610/* Global Data. */
7fa29be9 611extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 612
a38da35d 613#define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN])
e6e41501 614#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 615#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 616#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 617
1ce3e844
TT
618/* An iterator that iterates over all windows. */
619
620class tui_window_iterator
621{
622public:
623
624 typedef tui_window_iterator self_type;
625 typedef struct tui_win_info *value_type;
626 typedef struct tui_win_info *&reference;
627 typedef struct tui_win_info **pointer;
628 typedef std::forward_iterator_tag iterator_category;
629 typedef int difference_type;
630
631 explicit tui_window_iterator (enum tui_win_type type)
632 : m_type (type)
633 {
634 advance ();
635 }
636
637 tui_window_iterator ()
638 : m_type (MAX_MAJOR_WINDOWS)
639 {
640 }
641
642 bool operator!= (const self_type &other) const
643 {
644 return m_type != other.m_type;
645 }
646
647 value_type operator* () const
648 {
649 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
650 return tui_win_list[m_type];
651 }
652
653 self_type &operator++ ()
654 {
655 ++m_type;
656 advance ();
657 return *this;
658 }
659
660private:
661
662 void advance ()
663 {
664 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
665 ++m_type;
666 }
667
668 int m_type;
669};
670
671/* A range adapter for iterating over TUI windows. */
672
673struct all_tui_windows
674{
675 tui_window_iterator begin () const
676 {
677 return tui_window_iterator (SRC_WIN);
678 }
679
680 tui_window_iterator end () const
681 {
682 return tui_window_iterator ();
683 }
684};
685
686
1cc6d956 687/* Data Manipulation Functions. */
dd1abb8c 688extern void tui_initialize_static_data (void);
a121b7c1 689extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7
AC
690extern enum tui_layout_type tui_current_layout (void);
691extern void tui_set_current_layout_to (enum tui_layout_type);
dd1abb8c
AC
692extern int tui_term_height (void);
693extern void tui_set_term_height_to (int);
694extern int tui_term_width (void);
695extern void tui_set_term_width_to (int);
3add462f 696extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 697extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
698extern void tui_clear_source_windows (void);
699extern void tui_clear_source_windows_detail (void);
ad54d15b 700extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
701extern struct tui_win_info *tui_win_with_focus (void);
702extern void tui_set_win_with_focus (struct tui_win_info *);
5b6fe301 703extern struct tui_layout_def *tui_layout_def (void);
dd1abb8c
AC
704extern int tui_win_resized (void);
705extern void tui_set_win_resized_to (int);
706
707extern struct tui_win_info *tui_next_win (struct tui_win_info *);
708extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
709
7806cea7
TT
710extern unsigned int tui_tab_width;
711
1a5c2598 712#endif /* TUI_TUI_DATA_H */
This page took 2.011964 seconds and 4 git commands to generate.