int git_config_colorbool(const char *var, const char *value, int stdout_is_tty) { if (value) { if (!strcasecmp(value, "never")) return 0; if (!strcasecmp(value, "always")) return 1; if (!strcasecmp(value, "auto")) goto auto_color; } if (!var) return -1; /* Missing or explicit false to turn off colorization */ if (!git_config_bool(var, value)) return 0; /* any normal truth value defaults to 'auto' */ auto_color: if (stdout_is_tty < 0) stdout_is_tty = isatty(1); if (stdout_is_tty || (pager_in_use() && pager_use_color)) { char *term = getenv("TERM"); if (term && strcmp(term, "dumb")) return 1; } return 0; }
void setup_auto_pager(const char *cmd, int def) { if (use_pager != -1 || pager_in_use()) return; use_pager = check_pager_config(cmd); if (use_pager == -1) use_pager = def; commit_pager_choice(); }
static int check_auto_color(void) { if (color_stdout_is_tty < 0) color_stdout_is_tty = isatty(1); if (color_stdout_is_tty || (pager_in_use() && pager_use_color)) { if (!is_terminal_dumb()) return 1; } return 0; }
static int check_auto_color(void) { if (color_stdout_is_tty < 0) color_stdout_is_tty = isatty(1); if (color_stdout_is_tty || (pager_in_use() && pager_use_color)) { char *term = getenv("TERM"); if (term && strcmp(term, "dumb")) return 1; } return 0; }
int finalize_colopts(unsigned int *colopts, int stdout_is_tty) { if ((*colopts & COL_ENABLE_MASK) == COL_AUTO) { if (stdout_is_tty < 0) stdout_is_tty = isatty(1); *colopts &= ~COL_ENABLE_MASK; if (stdout_is_tty || pager_in_use()) *colopts |= COL_ENABLED; } return 0; }
static int parse_decoration_style(const char *var, const char *value) { switch (git_config_maybe_bool(var, value)) { case 1: return DECORATE_SHORT_REFS; case 0: return 0; default: break; } if (!strcmp(value, "full")) return DECORATE_FULL_REFS; else if (!strcmp(value, "short")) return DECORATE_SHORT_REFS; else if (!strcmp(value, "auto")) return (isatty(1) || pager_in_use()) ? DECORATE_SHORT_REFS : 0; return -1; }
void setup_pager(void) { const char *pager = git_pager(isatty(1)); if (!pager || pager_in_use()) return; /* * force computing the width of the terminal before we redirect * the standard output to the pager. */ (void) term_columns(); setenv("GIT_PAGER_IN_USE", "true", 1); /* spawn the pager */ pager_argv[0] = pager; pager_process.use_shell = 1; pager_process.argv = pager_argv; pager_process.in = -1; if (!getenv("LESS") || !getenv("LV")) { static const char *env[3]; int i = 0; if (!getenv("LESS")) env[i++] = "LESS=FRSX"; if (!getenv("LV")) env[i++] = "LV=-c"; env[i] = NULL; pager_process.env = env; } if (start_command(&pager_process)) return; /* original process continues, but writes to the pipe */ dup2(pager_process.in, 1); if (isatty(2)) dup2(pager_process.in, 2); close(pager_process.in); /* this makes sure that the parent terminates after the pager */ sigchain_push_common(wait_for_pager_signal); atexit(wait_for_pager); }
/* Colors are not included in return value */ static int __color_vfprintf(FILE *fp, const char *color, const char *fmt, va_list args) { int r = 0; /* * Auto-detect: */ if (perf_use_color_default < 0) { if (isatty(fileno(fp)) || pager_in_use()) perf_use_color_default = 1; else perf_use_color_default = 0; } if (perf_use_color_default && *color) fprintf(fp, "%s", color); r += vfprintf(fp, fmt, args); if (perf_use_color_default && *color) fprintf(fp, "%s", PERF_COLOR_RESET); return r; }
static int __color_vsnprintf(char *bf, size_t size, const char *color, const char *fmt, va_list args, const char *trail) { int r = 0; /* * Auto-detect: */ if (perf_use_color_default < 0) { if (isatty(1) || pager_in_use()) perf_use_color_default = 1; else perf_use_color_default = 0; } if (perf_use_color_default && *color) r += scnprintf(bf, size, "%s", color); r += vscnprintf(bf + r, size - r, fmt, args); if (perf_use_color_default && *color) r += scnprintf(bf + r, size - r, "%s", PERF_COLOR_RESET); if (trail) r += scnprintf(bf + r, size - r, "%s", trail); return r; }
int cmd_list(int argc, const char **argv) { int i; bool raw_dump = false; bool long_desc_flag = false; struct option list_options[] = { OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"), OPT_BOOLEAN('d', "desc", &desc_flag, "Print extra event descriptions. --no-desc to not print."), OPT_BOOLEAN('v', "long-desc", &long_desc_flag, "Print longer event descriptions."), OPT_BOOLEAN(0, "details", &details_flag, "Print information on the perf event names and expressions used internally by events."), OPT_INCR(0, "debug", &verbose, "Enable debugging output"), OPT_END() }; const char * const list_usage[] = { "perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|event_glob]", NULL }; set_option_flag(list_options, 0, "raw-dump", PARSE_OPT_HIDDEN); argc = parse_options(argc, argv, list_options, list_usage, PARSE_OPT_STOP_AT_NON_OPTION); setup_pager(); if (!raw_dump && pager_in_use()) printf("\nList of pre-defined events (to be used in -e):\n\n"); if (argc == 0) { print_events(NULL, raw_dump, !desc_flag, long_desc_flag, details_flag); return 0; } for (i = 0; i < argc; ++i) { char *sep, *s; if (strcmp(argv[i], "tracepoint") == 0) print_tracepoint_events(NULL, NULL, raw_dump); else if (strcmp(argv[i], "hw") == 0 || strcmp(argv[i], "hardware") == 0) print_symbol_events(NULL, PERF_TYPE_HARDWARE, event_symbols_hw, PERF_COUNT_HW_MAX, raw_dump); else if (strcmp(argv[i], "sw") == 0 || strcmp(argv[i], "software") == 0) print_symbol_events(NULL, PERF_TYPE_SOFTWARE, event_symbols_sw, PERF_COUNT_SW_MAX, raw_dump); else if (strcmp(argv[i], "cache") == 0 || strcmp(argv[i], "hwcache") == 0) print_hwcache_events(NULL, raw_dump); else if (strcmp(argv[i], "pmu") == 0) print_pmu_events(NULL, raw_dump, !desc_flag, long_desc_flag, details_flag); else if (strcmp(argv[i], "sdt") == 0) print_sdt_events(NULL, NULL, raw_dump); else if (strcmp(argv[i], "metric") == 0) metricgroup__print(true, false, NULL, raw_dump, details_flag); else if (strcmp(argv[i], "metricgroup") == 0) metricgroup__print(false, true, NULL, raw_dump, details_flag); else if ((sep = strchr(argv[i], ':')) != NULL) { int sep_idx; if (sep == NULL) { print_events(argv[i], raw_dump, !desc_flag, long_desc_flag, details_flag); continue; } sep_idx = sep - argv[i]; s = strdup(argv[i]); if (s == NULL) return -1; s[sep_idx] = '\0'; print_tracepoint_events(s, s + sep_idx + 1, raw_dump); print_sdt_events(s, s + sep_idx + 1, raw_dump); metricgroup__print(true, true, s, raw_dump, details_flag); free(s); } else { if (asprintf(&s, "*%s*", argv[i]) < 0) { printf("Critical: Not enough memory! Trying to continue...\n"); continue; } print_symbol_events(s, PERF_TYPE_HARDWARE, event_symbols_hw, PERF_COUNT_HW_MAX, raw_dump); print_symbol_events(s, PERF_TYPE_SOFTWARE, event_symbols_sw, PERF_COUNT_SW_MAX, raw_dump); print_hwcache_events(s, raw_dump); print_pmu_events(s, raw_dump, !desc_flag, long_desc_flag, details_flag); print_tracepoint_events(NULL, s, raw_dump); print_sdt_events(NULL, s, raw_dump); metricgroup__print(true, true, s, raw_dump, details_flag); free(s); } } return 0; }