243 lines
8.0 KiB
Diff
243 lines
8.0 KiB
Diff
From ff4e9c3db5b42541494764ad921c80250733e84a Mon Sep 17 00:00:00 2001
|
|
From: Ray Donnelly <mingw.android@gmail.com>
|
|
Date: Mon, 23 Feb 2015 22:12:15 +0000
|
|
Subject: [PATCH 3/9] options: Fix ordering problems with --color
|
|
|
|
Moved around the logic of setting opts.color so that:
|
|
|
|
1. If the user explicitly requests or disables it, then
|
|
that is respected.
|
|
|
|
2. Automatic disabling of color doesn't happen for FIFOs
|
|
on Windows since mintty.exe console handles are pipes.
|
|
|
|
3. The old location of the isatty check meant that if the
|
|
user specified --color, then group would get set to 0,
|
|
color would be TRUE and the output would not show any
|
|
filenames at all.
|
|
|
|
4. Default color to TRUE if MSYSCON env. var = mintty.exe
|
|
---
|
|
src/options.c | 145 +++++++++++++++++++++++++++++++++++-----------------------
|
|
src/options.h | 10 ++++
|
|
2 files changed, 97 insertions(+), 58 deletions(-)
|
|
|
|
diff --git a/src/options.c b/src/options.c
|
|
index 83152c5..ca94126 100644
|
|
--- a/src/options.c
|
|
+++ b/src/options.c
|
|
@@ -146,8 +146,16 @@ void print_version(void) {
|
|
void init_options(void) {
|
|
memset(&opts, 0, sizeof(opts));
|
|
opts.casing = CASE_DEFAULT;
|
|
- opts.color = TRUE;
|
|
- opts.color_win_ansi = FALSE;
|
|
+ opts.color = COLOR_DEFAULT_TRUE;
|
|
+#ifdef _WIN32
|
|
+ const char* env_MSYSCON = getenv("MSYSCON");
|
|
+ opts.color_win_ansi = ((getenv("ANSICON") || getenv("CMDER_ROOT")
|
|
+ || (env_MSYSCON && !strcmp(env_MSYSCON, "mintty.exe"))))
|
|
+ ? COLOR_DEFAULT_TRUE : COLOR_DEFAULT_FALSE;
|
|
+#else
|
|
+ opts.color_win_ansi = COLOR_DEFAULT_FALSE;
|
|
+#endif
|
|
+
|
|
opts.max_matches_per_file = 0;
|
|
opts.max_search_depth = DEFAULT_MAX_SEARCH_DEPTH;
|
|
#if defined(__APPLE__) || defined(__MACH__)
|
|
@@ -241,11 +249,11 @@ void parse_options(int argc, char **argv, char **base_paths[], char **paths[]) {
|
|
{ "before", optional_argument, NULL, 'B' },
|
|
{ "break", no_argument, &opts.print_break, 1 },
|
|
{ "case-sensitive", no_argument, NULL, 's' },
|
|
- { "color", no_argument, &opts.color, 1 },
|
|
+ { "color", no_argument, &opts.color, COLOR_EXPLICIT_TRUE },
|
|
{ "color-line-number", required_argument, NULL, 0 },
|
|
{ "color-match", required_argument, NULL, 0 },
|
|
{ "color-path", required_argument, NULL, 0 },
|
|
- { "color-win-ansi", no_argument, &opts.color_win_ansi, TRUE },
|
|
+ { "color-win-ansi", no_argument, &opts.color_win_ansi, COLOR_EXPLICIT_TRUE },
|
|
{ "column", no_argument, &opts.column, 1 },
|
|
{ "context", optional_argument, NULL, 'C' },
|
|
{ "count", no_argument, NULL, 'c' },
|
|
@@ -279,8 +287,8 @@ void parse_options(int argc, char **argv, char **base_paths[], char **paths[]) {
|
|
{ "noaffinity", no_argument, &opts.use_thread_affinity, 0 },
|
|
{ "no-break", no_argument, &opts.print_break, 0 },
|
|
{ "nobreak", no_argument, &opts.print_break, 0 },
|
|
- { "no-color", no_argument, &opts.color, 0 },
|
|
- { "nocolor", no_argument, &opts.color, 0 },
|
|
+ { "no-color", no_argument, &opts.color, COLOR_EXPLICIT_FALSE },
|
|
+ { "nocolor", no_argument, &opts.color, COLOR_EXPLICIT_FALSE },
|
|
{ "no-filename", no_argument, NULL, 0 },
|
|
{ "nofilename", no_argument, NULL, 0 },
|
|
{ "no-follow", no_argument, &opts.follow_symlinks, 0 },
|
|
@@ -356,22 +364,6 @@ void parse_options(int argc, char **argv, char **base_paths[], char **paths[]) {
|
|
}
|
|
}
|
|
|
|
- /* If we're not outputting to a terminal. change output to:
|
|
- * turn off colors
|
|
- * print filenames on every line
|
|
- */
|
|
- if (!isatty(fileno(stdout)) && !is_cygpty(fileno(stdout))) {
|
|
- opts.color = 0;
|
|
- group = 0;
|
|
-
|
|
- /* Don't search the file that stdout is redirected to */
|
|
- rv = fstat(fileno(stdout), &statbuf);
|
|
- if (rv != 0) {
|
|
- die("Error fstat()ing stdout");
|
|
- }
|
|
- opts.stdout_inode = statbuf.st_ino;
|
|
- }
|
|
-
|
|
char *file_search_regex = NULL;
|
|
while ((ch = getopt_long(argc, argv, "A:aB:C:cDG:g:FfHhiLlm:nop:QRrSsvVtuUwW:z0", longopts, &opt_index)) != -1) {
|
|
switch (ch) {
|
|
@@ -727,42 +719,6 @@ void parse_options(int argc, char **argv, char **base_paths[], char **paths[]) {
|
|
opts.after = opts.context;
|
|
}
|
|
|
|
- if (opts.ackmate) {
|
|
- opts.color = 0;
|
|
- opts.print_break = 1;
|
|
- group = 1;
|
|
- opts.search_stream = 0;
|
|
- }
|
|
-
|
|
- if (opts.vimgrep) {
|
|
- opts.color = 0;
|
|
- opts.print_break = 0;
|
|
- group = 1;
|
|
- opts.search_stream = 0;
|
|
- opts.print_path = PATH_PRINT_NOTHING;
|
|
- }
|
|
-
|
|
- if (opts.parallel) {
|
|
- opts.search_stream = 0;
|
|
- }
|
|
-
|
|
- if (!(opts.print_path != PATH_PRINT_DEFAULT || opts.print_break == 0)) {
|
|
- if (group) {
|
|
- opts.print_break = 1;
|
|
- } else {
|
|
- opts.print_path = PATH_PRINT_DEFAULT_EACH_LINE;
|
|
- opts.print_break = 0;
|
|
- }
|
|
- }
|
|
-
|
|
- if (opts.search_stream) {
|
|
- opts.print_break = 0;
|
|
- opts.print_path = PATH_PRINT_NOTHING;
|
|
- if (opts.print_line_numbers != 2) {
|
|
- opts.print_line_numbers = 0;
|
|
- }
|
|
- }
|
|
-
|
|
if (accepts_query && argc > 0) {
|
|
if (!needs_query && strlen(argv[0]) == 0) {
|
|
// use default query
|
|
@@ -842,6 +798,79 @@ void parse_options(int argc, char **argv, char **base_paths[], char **paths[]) {
|
|
(*paths)[i] = NULL;
|
|
(*base_paths)[i] = NULL;
|
|
|
|
+ /* If we're not outputting to a terminal. change output to:
|
|
+ * turn off colors
|
|
+ * print filenames on every line
|
|
+ */
|
|
+ if (!isatty(fileno(stdout)) && !is_cygpty(fileno(stdout))) {
|
|
+ /* Don't search the file that stdout is redirected to */
|
|
+ rv = fstat(fileno(stdout), &statbuf);
|
|
+ if (rv != 0) {
|
|
+ die("Error fstat()ing stdout");
|
|
+ }
|
|
+ opts.stdout_inode = statbuf.st_ino;
|
|
+ /* Assume the user knows best */
|
|
+ if (opts.color != COLOR_EXPLICIT_TRUE) {
|
|
+ /* On Windows redirection to regular file *can* be detected via
|
|
+ statbuf.st_mode & S_IFREG (while statbuf.st_ino is always 0) */
|
|
+ if (statbuf.st_ino != 0
|
|
+ || statbuf.st_mode & S_IFREG
|
|
+ || statbuf.st_mode & S_IFIFO
|
|
+ ) {
|
|
+ opts.color = COLOR_DEFAULT_FALSE;
|
|
+ group = 0;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (opts.ackmate) {
|
|
+ opts.color = COLOR_EMULATION_FALSE;
|
|
+ opts.print_break = 1;
|
|
+ group = 1;
|
|
+ opts.search_stream = 0;
|
|
+ }
|
|
+
|
|
+ if (opts.vimgrep) {
|
|
+ opts.color = COLOR_EMULATION_FALSE;
|
|
+ opts.print_break = 0;
|
|
+ group = 1;
|
|
+ opts.search_stream = 0;
|
|
+ opts.print_path = PATH_PRINT_NOTHING;
|
|
+ }
|
|
+
|
|
+ if (opts.parallel) {
|
|
+ opts.search_stream = 0;
|
|
+ }
|
|
+
|
|
+ if (!(opts.print_path != PATH_PRINT_DEFAULT || opts.print_break == 0)) {
|
|
+ if (group) {
|
|
+ opts.print_break = 1;
|
|
+ } else {
|
|
+ opts.print_path = PATH_PRINT_DEFAULT_EACH_LINE;
|
|
+ opts.print_break = 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (opts.search_stream) {
|
|
+ opts.print_break = 0;
|
|
+ opts.print_path = PATH_PRINT_NOTHING;
|
|
+ if (opts.print_line_numbers != 2) {
|
|
+ opts.print_line_numbers = 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (opts.color == COLOR_DEFAULT_FALSE || opts.color == COLOR_EXPLICIT_FALSE ||
|
|
+ opts.color == COLOR_EMULATION_FALSE) {
|
|
+ opts.color = COLOR_FALSE;
|
|
+ } else {
|
|
+ opts.color = COLOR_TRUE;
|
|
+ }
|
|
+ if (opts.color_win_ansi == COLOR_DEFAULT_FALSE) {
|
|
+ opts.color_win_ansi = COLOR_FALSE;
|
|
+ } else {
|
|
+ opts.color_win_ansi = COLOR_TRUE;
|
|
+ }
|
|
+
|
|
#ifdef _WIN32
|
|
windows_use_ansi(opts.color_win_ansi);
|
|
#endif
|
|
diff --git a/src/options.h b/src/options.h
|
|
index db3e896..990ce6a 100644
|
|
--- a/src/options.h
|
|
+++ b/src/options.h
|
|
@@ -26,6 +26,16 @@ enum path_print_behavior {
|
|
PATH_PRINT_NOTHING
|
|
};
|
|
|
|
+enum color_behaviour {
|
|
+ COLOR_FALSE = 0,
|
|
+ COLOR_TRUE = 1,
|
|
+ COLOR_DEFAULT_FALSE,
|
|
+ COLOR_DEFAULT_TRUE,
|
|
+ COLOR_EXPLICIT_FALSE,
|
|
+ COLOR_EXPLICIT_TRUE,
|
|
+ COLOR_EMULATION_FALSE,
|
|
+};
|
|
+
|
|
typedef struct {
|
|
int ackmate;
|
|
pcre *ackmate_dir_filter;
|
|
--
|
|
2.12.1
|
|
|