X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/1899507caece024f4d1022501435264bfe69b8a7..5976048600791033f3f9dc559fc2ee0d4e43bf1e:/tig.c diff --git a/tig.c b/tig.c index 982c1cc..c323cf8 100644 --- a/tig.c +++ b/tig.c @@ -417,45 +417,12 @@ parse_options(int argc, char *argv[]) } if (!isatty(STDIN_FILENO)) { - /** - * Pager mode - * ~~~~~~~~~~ - * If stdin is a pipe, any log or diff options will be ignored and the - * pager view will be opened loading data from stdin. The pager mode - * can be used for colorizing output from various git commands. - * - * Example on how to colorize the output of git-show(1): - * - * $ git show | tig - **/ opt_request = REQ_VIEW_PAGER; opt_pipe = stdin; } else if (i < argc) { size_t buf_size; - /** - * Git command options - * ~~~~~~~~~~~~~~~~~~~ - * All git command options specified on the command line will - * be passed to the given command and all will be shell quoted - * before they are passed to the shell. - * - * NOTE: If you specify options for the main view, you should - * not use the `--pretty` option as this option will be set - * automatically to the format expected by the main view. - * - * Example on how to open the log view and show both author and - * committer information: - * - * $ tig log --pretty=fuller - * - * See the <> section below - * for an introduction to revision options supported by the git - * commands. For details on specific git command options, refer - * to the man page of the command in question. - **/ - if (opt_request == REQ_VIEW_MAIN) /* XXX: This is vulnerable to the user overriding * options required for the main view parser. */ @@ -486,23 +453,6 @@ parse_options(int argc, char *argv[]) /** * ENVIRONMENT VARIABLES * --------------------- - * Several options related to the interface with git can be configured - * via environment options. - * - * Repository references - * ~~~~~~~~~~~~~~~~~~~~~ - * Commits that are referenced by tags and branch heads will be marked - * by the reference name surrounded by '[' and ']': - * - * 2006-03-26 19:42 Petr Baudis | [cogito-0.17.1] Cogito 0.17.1 - * - * If you want to filter out certain directories under `.git/refs/`, say - * `tmp` you can do it by setting the following variable: - * - * $ TIG_LS_REMOTE="git ls-remote . | sed /\/tmp\//d" tig - * - * Or set the variable permanently in your environment. - * * TIG_LS_REMOTE:: * Set command for retrieving all repository references. The command * should output data in the same format as git-ls-remote(1). @@ -512,20 +462,6 @@ parse_options(int argc, char *argv[]) "git ls-remote . 2>/dev/null" /** - * [[history-commands]] - * History commands - * ~~~~~~~~~~~~~~~~ - * It is possible to alter which commands are used for the different views. - * If for example you prefer commits in the main view to be sorted by date - * and only show 500 commits, use: - * - * $ TIG_MAIN_CMD="git log --date-order -n500 --pretty=raw %s" tig - * - * Or set the variable permanently in your environment. - * - * Notice, how `%s` is used to specify the commit reference. There can - * be a maximum of 5 `%s` ref specifications. - * * TIG_DIFF_CMD:: * The command used for the diff view. By default, git show is used * as a backend. @@ -562,55 +498,13 @@ parse_options(int argc, char *argv[]) /** * FILES * ----- - * '~/.tig':: - * User configuration file. See "<>" - * section for examples. + * '~/.tigrc':: + * User configuration file. See tigrc(5) for examples. * * '.git/config':: * Repository config file. Read on startup with the help of * git-repo-config(1). **/ -/** - * [[config-options]] - * User Configuration file - * ----------------------- - * You can permanently set an option by putting it in the `~/.tig` file. - * The file consists of a series of 'commands'. Each - * line of the file may contain only one command. - * - * The hash mark ('#'), or semi-colon (';') is used as a 'comment' character. - * All text after the comment character to the end of the line is ignored. - * You can use comments to annotate your initialization file. - * - * Some sample options: - * - * ========================================================================== - * # Diff colors - * color diff-header yellow default - * color diff-index blue default - * color diff-chunk magenta default - * # UI colors - * color title-blur white blue - * color title-focus white blue bold - * ========================================================================== - * - * [[color-options]] - * Color options - * ~~~~~~~~~~~~~ - * Color options control highlighting and the user interface styles. - * If your terminal supports color, these commands can be used to assign - * foreground/backgound combinations to certain areas. Optionally, an - * attribute can be given as the last parameter. The syntax is: - * - * [verse] - * .......................................................................... - * *color* 'area' 'fgcolor' 'bgcolor' '[attributes]' - * .......................................................................... - * - * Valid colors include: *white*, *black*, *green*, *magenta*, *blue*, *cyan*, - * *yellow*, *red*, *default*. Use *default* to refer to the default terminal - * colors. - **/ static struct int_map color_map[] = { #define COLOR_MAP(name) { #name, STRING_SIZE(#name), COLOR_##name } @@ -625,11 +519,6 @@ static struct int_map color_map[] = { COLOR_MAP(YELLOW), }; -/** - * Valid attributes include: *normal*, *blink*, *bold*, *dim*, *reverse*, *standout*, - * and *underline*. Note, not all attributes may be supported by the terminal. - **/ - static struct int_map attr_map[] = { #define ATTR_MAP(name) { #name, STRING_SIZE(#name), A_##name } ATTR_MAP(NORMAL), @@ -641,35 +530,11 @@ static struct int_map attr_map[] = { ATTR_MAP(UNDERLINE), }; -/** - * Valid area names are described below. Note, all names are case-insensitive, - * and you may use '-', '_', and '.' interchangeably. So "Diff-Header", - * "DIFF_HEADER", and "diff.header" are the same. - * - * -- - **/ #define LINE_INFO \ -/** - * Diff markup:: - * - * Options concerning diff start, chunks and lines added and deleted. - * - * *diff-header*, *diff-chunk*, *diff-add*, *diff-del* - **/ \ LINE(DIFF_HEADER, "diff --git ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(DIFF_CHUNK, "@@", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ LINE(DIFF_ADD, "+", COLOR_GREEN, COLOR_DEFAULT, 0), \ LINE(DIFF_DEL, "-", COLOR_RED, COLOR_DEFAULT, 0), \ -/** - * Enhanced git diff markup:: - * - * Extra diff information emitted by the git diff machinery, such as mode - * changes, rename detection, and similarity. - * - * *diff-oldmode*, *diff-newmode*, *diff-copy-from*, *diff-copy-to*, - * *diff-rename-from*, *diff-rename-to*, *diff-similarity* *diff-dissimilarity* - * *diff-tree*, *diff-index* - **/ \ LINE(DIFF_INDEX, "index ", COLOR_BLUE, COLOR_DEFAULT, 0), \ LINE(DIFF_OLDMODE, "old file mode ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(DIFF_NEWMODE, "new file mode ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ @@ -680,56 +545,18 @@ LINE(DIFF_RENAME_TO, "rename to", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(DIFF_SIMILARITY, "similarity ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(DIFF_DISSIMILARITY,"dissimilarity ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(DIFF_TREE, "diff-tree ", COLOR_BLUE, COLOR_DEFAULT, 0), \ -/** - * Pretty print commit headers:: - * - * Commit diffs and the revision logs are usually formatted using pretty - * printed headers , unless `--pretty=raw` was given. This includes lines, - * such as merge info, commit ID, and author and comitter date. - * - * *pp-author*, *pp-commit*, *pp-merge*, *pp-date*, *pp-adate*, *pp-cdate* - **/ \ LINE(PP_AUTHOR, "Author: ", COLOR_CYAN, COLOR_DEFAULT, 0), \ LINE(PP_COMMIT, "Commit: ", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ LINE(PP_MERGE, "Merge: ", COLOR_BLUE, COLOR_DEFAULT, 0), \ LINE(PP_DATE, "Date: ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(PP_ADATE, "AuthorDate: ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(PP_CDATE, "CommitDate: ", COLOR_YELLOW, COLOR_DEFAULT, 0), \ -/** - * Raw commit header:: - * - * Usually shown when `--pretty=raw` is given, however 'commit' is pretty - * much omnipresent. - * - * *commit*, *parent*, *tree*, *author*, *committer* - **/ \ LINE(COMMIT, "commit ", COLOR_GREEN, COLOR_DEFAULT, 0), \ LINE(PARENT, "parent ", COLOR_BLUE, COLOR_DEFAULT, 0), \ LINE(TREE, "tree ", COLOR_BLUE, COLOR_DEFAULT, 0), \ LINE(AUTHOR, "author ", COLOR_CYAN, COLOR_DEFAULT, 0), \ LINE(COMMITTER, "committer ", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ -/** - * Commit message:: - * - * For now only `Signed-off-by lines` are colorized. - * - * *signoff* - **/ \ LINE(SIGNOFF, " Signed-off-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \ -/** - * UI colors:: - * - * Colors for text not matching any of the above: *default* - * - * Status window colors: *status* - * - * Title window colors: *title-blur*, *title-focus* - * - * Cursor line colors: *cursor* - * - * Main view specific: *main-date*, *main-author*, *main-commit*, *main-delim*, - * *main-tag*, *main-ref* - **/ \ LINE(DEFAULT, "", COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL), \ LINE(CURSOR, "", COLOR_WHITE, COLOR_GREEN, A_BOLD), \ LINE(STATUS, "", COLOR_GREEN, COLOR_DEFAULT, 0), \ @@ -741,9 +568,6 @@ LINE(MAIN_COMMIT, "", COLOR_DEFAULT, COLOR_DEFAULT, 0), \ LINE(MAIN_DELIM, "", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ LINE(MAIN_TAG, "", COLOR_MAGENTA, COLOR_DEFAULT, A_BOLD), \ LINE(MAIN_REF, "", COLOR_CYAN, COLOR_DEFAULT, A_BOLD), \ -/** - * -- - **/ /* @@ -855,25 +679,13 @@ struct line { #define set_attribute(attr, name, namelen) \ set_from_int_map(attr_map, ARRAY_SIZE(attr_map), attr, name, namelen) +static int config_lineno; +static bool config_errors; +static char *config_msg; + static int -read_option(char *opt, int optlen, char *value, int valuelen) +set_option(char *opt, int optlen, char *value, int valuelen) { - optlen = strcspn(opt, "#;"); - if (optlen == 0) { - /* The whole line is a comment. */ - return OK; - - } else if (opt[optlen] != 0) { - /* Part of the option name is a comment, so the value part - * should be ignored. */ - valuelen = 0; - opt[optlen] = value[valuelen] = 0; - } else { - /* Else look for comment endings in the value. */ - valuelen = strcspn(value, "#;"); - value[valuelen] = 0; - } - /* Reads: "color" object fgcolor bgcolor [attr] */ if (!strcmp(opt, "color")) { struct line_info *info; @@ -881,23 +693,31 @@ read_option(char *opt, int optlen, char *value, int valuelen) value = chomp_string(value); valuelen = strcspn(value, " \t"); info = get_line_info(value, valuelen); - if (!info) + if (!info) { + config_msg = "Unknown color name"; return ERR; + } value = chomp_string(value + valuelen); valuelen = strcspn(value, " \t"); - if (set_color(&info->fg, value, valuelen) == ERR) + if (set_color(&info->fg, value, valuelen) == ERR) { + config_msg = "Unknown color"; return ERR; + } value = chomp_string(value + valuelen); valuelen = strcspn(value, " \t"); - if (set_color(&info->bg, value, valuelen) == ERR) + if (set_color(&info->bg, value, valuelen) == ERR) { + config_msg = "Unknown color"; return ERR; + } value = chomp_string(value + valuelen); if (*value && - set_attribute(&info->attr, value, strlen(value)) == ERR) + set_attribute(&info->attr, value, strlen(value)) == ERR) { + config_msg = "Unknown attribute"; return ERR; + } return OK; } @@ -906,14 +726,49 @@ read_option(char *opt, int optlen, char *value, int valuelen) } static int +read_option(char *opt, int optlen, char *value, int valuelen) +{ + config_lineno++; + config_msg = "Internal error"; + + optlen = strcspn(opt, "#;"); + if (optlen == 0) { + /* The whole line is a commend or empty. */ + return OK; + + } else if (opt[optlen] != 0) { + /* Part of the option name is a comment, so the value part + * should be ignored. */ + valuelen = 0; + opt[optlen] = value[valuelen] = 0; + } else { + /* Else look for comment endings in the value. */ + valuelen = strcspn(value, "#;"); + value[valuelen] = 0; + } + + if (set_option(opt, optlen, value, valuelen) == ERR) { + fprintf(stderr, "Error on line %d, near '%.*s' option: %s\n", + config_lineno, optlen, opt, config_msg); + config_errors = TRUE; + } + + /* Always keep going if errors are encountered. */ + return OK; +} + +static int load_options(void) { char *home = getenv("HOME"); char buf[1024]; FILE *file; + config_lineno = 0; + config_errors = FALSE; + if (!home || - snprintf(buf, sizeof(buf), "%s/.tig", home) >= sizeof(buf)) + snprintf(buf, sizeof(buf), "%s/.tigrc", home) >= sizeof(buf)) return ERR; /* It's ok that the file doesn't exist. */ @@ -921,27 +776,17 @@ load_options(void) if (!file) return OK; - return read_properties(file, " \t", read_option); + if (read_properties(file, " \t", read_option) == ERR || + config_errors == TRUE) + fprintf(stderr, "Errors while loading %s.\n", buf); + + return OK; } -/** +/* * The viewer - * ---------- - * The display consists of a status window on the last line of the screen and - * one or more views. The default is to only show one view at the time but it - * is possible to split both the main and log view to also show the commit - * diff. - * - * If you are in the log view and press 'Enter' when the current line is a - * commit line, such as: - * - * commit 4d55caff4cc89335192f3e566004b4ceef572521 - * - * You will split the view so that the log view is displayed in the top window - * and the diff view in the bottom window. You can switch between the two - * views by pressing 'Tab'. To maximize the log view again, simply press 'l'. - **/ + */ struct view; struct view_ops; @@ -955,18 +800,7 @@ static unsigned int current_view; #define displayed_views() (display[1] != NULL ? 2 : 1) -/** - * Current head and commit ID - * ~~~~~~~~~~~~~~~~~~~~~~~~~~ - * The viewer keeps track of both what head and commit ID you are currently - * viewing. The commit ID will follow the cursor line and change everytime time - * you highlight a different commit. Whenever you reopen the diff view it - * will be reloaded, if the commit ID changed. - * - * The head ID is used when opening the main and log view to indicate from - * what revision to show history. - **/ - +/* Current head and commit ID */ static char ref_commit[SIZEOF_REF] = "HEAD"; static char ref_head[SIZEOF_REF] = "HEAD"; @@ -1024,35 +858,6 @@ static struct view_ops main_ops; #define VIEW_(id, name, ops, ref) \ VIEW_STR(name, TIG_##id##_CMD, TIG_##id##_CMD, ref, ops) -/** - * Views - * ~~~~~ - * tig(1) presents various 'views' of a repository. Each view is based on output - * from an external command, most often 'git log', 'git diff', or 'git show'. - * - * The main view:: - * Is the default view, and it shows a one line summary of each commit - * in the chosen list of revisions. The summary includes commit date, - * author, and the first line of the log message. Additionally, any - * repository references, such as tags, will be shown. - * - * The log view:: - * Presents a more rich view of the revision log showing the whole log - * message and the diffstat. - * - * The diff view:: - * Shows either the diff of the current working tree, that is, what - * has changed since the last commit, or the commit diff complete - * with log message, diffstat and diff. - * - * The pager view:: - * Is used for displaying both input from stdin and output from git - * commands entered in the internal prompt. - * - * The help view:: - * Displays the information from the tig(1) man page. For the help view - * to work you need to have the tig(1) man page installed. - **/ static struct view views[] = { VIEW_(MAIN, "main", &main_ops, ref_head), @@ -1096,21 +901,6 @@ redraw_view(struct view *view) } -/** - * Title windows - * ~~~~~~~~~~~~~ - * Each view has a title window which shows the name of the view, current - * commit ID if available, and where the view is positioned: - * - * [main] c622eefaa485995320bc743431bae0d497b1d875 - commit 1 of 61 (1%) - * - * By default, the title of the current view is highlighted using bold font. - * For long loading views (taking over 3 seconds) the time since loading - * started will be appended: - * - * [main] 77d9e40fbcea3238015aea403e06f61542df9a31 - commit 1 of 779 (0%) 5s - **/ - static void update_view_title(struct view *view) { @@ -1621,9 +1411,9 @@ open_view(struct view *prev, enum request request, enum open_flags flags) } if (split) { - display[current_view + 1] = view; + display[1] = view; if (!backgrounded) - current_view++; + current_view = 1; } else { /* Maximize the current view. */ memset(display, 0, sizeof(display)); @@ -2162,11 +1952,9 @@ static struct view_ops main_ops = { }; -/** - * KEYS - * ---- - * Below the default key bindings are shown. - **/ +/* + * Keys + */ struct keymap { int alias; @@ -2174,74 +1962,21 @@ struct keymap { }; static struct keymap keymap[] = { - /** - * View switching - * ~~~~~~~~~~~~~~ - * m:: - * Switch to main view. - * d:: - * Switch to diff view. - * l:: - * Switch to log view. - * p:: - * Switch to pager view. - * h:: - * Show man page. - **/ + /* View switching */ { 'm', REQ_VIEW_MAIN }, { 'd', REQ_VIEW_DIFF }, { 'l', REQ_VIEW_LOG }, { 'p', REQ_VIEW_PAGER }, { 'h', REQ_VIEW_HELP }, - /** - * View manipulation - * ~~~~~~~~~~~~~~~~~ - * q:: - * Close view, if multiple views are open it will jump back to the - * previous view in the view stack. If it is the last open view it - * will quit. Use 'Q' to quit all views at once. - * Enter:: - * This key is "context sensitive" depending on what view you are - * currently in. When in log view on a commit line or in the main - * view, split the view and show the commit diff. In the diff view - * pressing Enter will simply scroll the view one line down. - * Tab:: - * Switch to next view. - * Up:: - * This key is "context sensitive" and will move the cursor one - * line up. However, uf you opened a diff view from the main view - * (split- or full-screen) it will change the cursor to point to - * the previous commit in the main view and update the diff view - * to display it. - * Down:: - * Similar to 'Up' but will move down. - **/ + /* View manipulation */ { 'q', REQ_VIEW_CLOSE }, { KEY_TAB, REQ_VIEW_NEXT }, { KEY_RETURN, REQ_ENTER }, { KEY_UP, REQ_PREVIOUS }, { KEY_DOWN, REQ_NEXT }, - /** - * Cursor navigation - * ~~~~~~~~~~~~~~~~~ - * j:: - * Move cursor one line up. - * k:: - * Move cursor one line down. - * PgUp:: - * b:: - * -:: - * Move cursor one page up. - * PgDown:: - * Space:: - * Move cursor one page down. - * Home:: - * Jump to first line. - * End:: - * Jump to last line. - **/ + /* Cursor navigation */ { 'k', REQ_MOVE_UP }, { 'j', REQ_MOVE_DOWN }, { KEY_HOME, REQ_MOVE_FIRST_LINE }, @@ -2252,44 +1987,13 @@ static struct keymap keymap[] = { { 'b', REQ_MOVE_PAGE_UP }, { '-', REQ_MOVE_PAGE_UP }, - /** - * Scrolling - * ~~~~~~~~~ - * Insert:: - * Scroll view one line up. - * Delete:: - * Scroll view one line down. - * w:: - * Scroll view one page up. - * s:: - * Scroll view one page down. - **/ + /* Scrolling */ { KEY_IC, REQ_SCROLL_LINE_UP }, { KEY_DC, REQ_SCROLL_LINE_DOWN }, { 'w', REQ_SCROLL_PAGE_UP }, { 's', REQ_SCROLL_PAGE_DOWN }, - /** - * Misc - * ~~~~ - * Q:: - * Quit. - * r:: - * Redraw screen. - * z:: - * Stop all background loading. This can be useful if you use - * tig(1) in a repository with a long history without limiting - * the revision log. - * v:: - * Show version. - * n:: - * Toggle line numbers on/off. - * ':':: - * Open prompt. This allows you to specify what git command - * to run. Example: - * - * :log -p - **/ + /* Misc */ { 'Q', REQ_QUIT }, { 'z', REQ_STOP_LOADING }, { 'v', REQ_SHOW_VERSION }, @@ -2723,8 +2427,7 @@ read_properties(FILE *pipe, const char *separators, valuelen = 0; } - if (namelen) - state = read_property(name, namelen, value, valuelen); + state = read_property(name, namelen, value, valuelen); } if (state != ERR && ferror(pipe)) @@ -2863,123 +2566,7 @@ main(int argc, char *argv[]) } /** - * [[refspec]] - * Revision specification - * ---------------------- - * This section describes various ways to specify what revisions to display - * or otherwise limit the view to. tig(1) does not itself parse the described - * revision options so refer to the relevant git man pages for futher - * information. Relevant man pages besides git-log(1) are git-diff(1) and - * git-rev-list(1). - * - * You can tune the interaction with git by making use of the options - * explained in this section. For example, by configuring the environment - * variables described in the <> - * section. - * - * Limit by path name - * ~~~~~~~~~~~~~~~~~~ - * If you are interested only in those revisions that made changes to a - * specific file (or even several files) list the files like this: - * - * $ tig log Makefile README - * - * To avoid ambiguity with repository references such as tag name, be sure - * to separate file names from other git options using "\--". So if you - * have a file named 'master' it will clash with the reference named - * 'master', and thus you will have to use: - * - * $ tig log -- master - * - * NOTE: For the main view, avoiding ambiguity will in some cases require - * you to specify two "\--" options. The first will make tig(1) stop - * option processing and the latter will be passed to git log. - * - * Limit by date or number - * ~~~~~~~~~~~~~~~~~~~~~~~ - * To speed up interaction with git, you can limit the amount of commits - * to show both for the log and main view. Either limit by date using - * e.g. `--since=1.month` or limit by the number of commits using `-n400`. - * - * If you are only interested in changed that happened between two dates - * you can use: - * - * $ tig -- --after="May 5th" --before="2006-05-16 15:44" - * - * NOTE: If you want to avoid having to quote dates containing spaces you - * can use "." instead, e.g. `--after=May.5th`. - * - * Limiting by commit ranges - * ~~~~~~~~~~~~~~~~~~~~~~~~~ - * Alternatively, commits can be limited to a specific range, such as - * "all commits between 'tag-1.0' and 'tag-2.0'". For example: - * - * $ tig log tag-1.0..tag-2.0 - * - * This way of commit limiting makes it trivial to only browse the commits - * which haven't been pushed to a remote branch. Assuming 'origin' is your - * upstream remote branch, using: - * - * $ tig log origin..HEAD - * - * will list what will be pushed to the remote branch. Optionally, the ending - * 'HEAD' can be left out since it is implied. - * - * Limiting by reachability - * ~~~~~~~~~~~~~~~~~~~~~~~~ - * Git interprets the range specifier "tag-1.0..tag-2.0" as - * "all commits reachable from 'tag-2.0' but not from 'tag-1.0'". - * Where reachability refers to what commits are ancestors (or part of the - * history) of the branch or tagged revision in question. - * - * If you prefer to specify which commit to preview in this way use the - * following: - * - * $ tig log tag-2.0 ^tag-1.0 - * - * You can think of '^' as a negation operator. Using this alternate syntax, - * it is possible to further prune commits by specifying multiple branch - * cut offs. - * - * Combining revisions specification - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Revisions options can to some degree be combined, which makes it possible - * to say "show at most 20 commits from within the last month that changed - * files under the Documentation/ directory." - * - * $ tig -- --since=1.month -n20 -- Documentation/ - * - * Examining all repository references - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * In some cases, it can be useful to query changes across all references - * in a repository. An example is to ask "did any line of development in - * this repository change a particular file within the last week". This - * can be accomplished using: - * - * $ tig -- --all --since=1.week -- Makefile - * - * BUGS - * ---- - * Known bugs and problems: - * - * - In it's current state tig is pretty much UTF-8 only. - * - * - If the screen width is very small the main view can draw - * outside the current view causing bad wrapping. Same goes - * for title and status windows. - * - * - The cursor can wrap-around on the last line and cause the - * window to scroll. - * - * - The prompt doesn't work while loading. - * - * TODO - * ---- - * Features that should be explored. - * - * - Searching. - * - * - Locale support. + * include::BUGS[] * * COPYRIGHT * --------- @@ -3000,4 +2587,8 @@ main(int argc, char *argv[]) * - gitk(1) * - qgit(1) * - gitview(1) + * + * Sites: + * + * include::SITES[] **/