Add support for fixed width line number display (fixes #544)
As per the discussion on #544, this is my initial attempt at adding support for fixed width line numbers. Please review and let me know if things can be improved upon.

A few thoughts I had as I worked on this:

- Rust's `format!` macro currently has no way of providing a custom padding character as a parameter. You have to provide it directly in the format string itself. (As per [this](https://doc.rust-lang.org/std/fmt/#syntax), only the width can be provided as a parameter.)
- This meant that adding support for format strings as suggested in the issue discussion proved to be difficult. Right now, the argument only accepts a number. It seems that we'll have to write a custom code for left padding or rely on a library to achieve this. I'm open to suggestions on this one.
- Should we handle possible combinations of CLI args? In the long help message for `line-number-width`, I've mentioned that it has no effect if `--no-line-number` is enabled, which is very obvious. Should I handle any other cases specific to this newly introduced argument to ensure nothing breaks?

Thanks in advance!
It would be nice to be able to see the indentation level of searched text line up. One way to do this would be to have fixed width line numbers in search results. This could be accomplished through an option flag and left-padding with either spaces or zeroes when the flag is active.

As this is primarily of interest for matches within a file, only the matches within a file need be considered for how wide the line numbers should be. Alternatively, one could have a pre-determined width (i.e. 6) and overflow larger line numbers.

Implemented, this could look either like this:
```
$ rg needle --fixed-width-line-numbers
haystack.txt:
 12:    needle {
144:      needle {

silo.txt:
  16:  } needle {
 256:    } // needle 1
 512:    } // needle 2
1024:  } // needles

warehouse.txt:
   1234:  - needle ( 5 boxes )
1234567:  - needle ( 20 boxes ) 
```

Or like this:
```
$ rg needle --fixed-width-line-numbers
haystack.txt:
    12:    needle {
   144:      needle {

silo.txt:
    16:  } needle {
   256:    } // needle 1
   512:    } // needle 2
  1024:  } // needles

warehouse.txt:
  1234:  - needle (5 boxes)
1234567:  - needle (20 boxes)
```
Fixed width line numbers
diff --git a/complete/_rg b/complete/_rg
index cd5b5ac6b..93ab4ae84 100644
--- a/complete/_rg
+++ b/complete/_rg
@@ -45,6 +45,7 @@ _rg() {
     '--ignore-file=[specify additional ignore file]:file:_files'
     '(-v --invert-match)'{-v,--invert-match}'[invert matching]'
     '(-n -N --line-number --no-line-number)'{-n,--line-number}'[show line numbers]'
+    '(-N --no-line-number)--line-number-width=[specify width of displayed line number]:number of columns'
     '(-w -x --line-regexp --word-regexp)'{-x,--line-regexp}'[only show matches surrounded by line boundaries]'
     '(-M --max-columns)'{-M+,--max-columns=}'[specify max length of lines to print]:number of bytes'
     '(-m --max-count)'{-m+,--max-count=}'[specify max number of matches per file]:number of matches'
diff --git a/doc/rg.1 b/doc/rg.1
index 2ed14b393..c91cbc5c0 100644
--- a/doc/rg.1
+++ b/doc/rg.1
@@ -335,6 +335,14 @@ Follow symlinks.
 .RS
 .RE
 .TP
+.B \-\-line\-number\-width \f[I]NUM\f[]
+Specify a width for the displayed line number.
+If number of digits in the line number is less than this number, it is
+left padded with spaces.
+Note: This setting has no effect if \-\-no\-line\-number is enabled.
+.RS
+.RE
+.TP
 .B \-M, \-\-max\-columns \f[I]NUM\f[]
 Don\[aq]t print lines longer than this limit in bytes.
 Longer lines are omitted, and only the number of matches in that line is
diff --git a/doc/rg.1.md b/doc/rg.1.md
index 36c912c64..bbc0207ed 100644
--- a/doc/rg.1.md
+++ b/doc/rg.1.md
@@ -222,6 +222,12 @@ Project home page: https://github.com/BurntSushi/ripgrep
 -L, --follow
 : Follow symlinks.
 
+--line-number-width *NUM*
+: Specify a width for the displayed line number. If number of digits
+  in the line number is less than this number, it is left padded with
+  spaces. Note: This setting has no effect if --no-line-number is
+  enabled.
+
 -M, --max-columns *NUM*
 : Don't print lines longer than this limit in bytes. Longer lines are omitted,
   and only the number of matches in that line is printed.
diff --git a/src/app.rs b/src/app.rs
index 996396340..a9ceae892 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -102,6 +102,9 @@ pub fn app() -> App<'static, 'static> {
              .value_name("GLOB"))
         .arg(flag("ignore-case").short("i"))
         .arg(flag("line-number").short("n"))
+        .arg(flag("line-number-width")
+             .value_name("NUM").takes_value(true)
+             .validator(validate_line_number_width))
         .arg(flag("no-line-number").short("N").overrides_with("line-number"))
         .arg(flag("quiet").short("q"))
         .arg(flag("type").short("t")
@@ -318,6 +321,11 @@ lazy_static! {
              "Show line numbers.",
              "Show line numbers (1-based). This is enabled by default when \
               searching in a tty.");
+        doc!(h, "line-number-width",
+             "Left pad line numbers upto NUM width.",
+             "Left pad line numbers upto NUM width. Space is used as \
+              the default padding character. This has no effect if \
+              --no-line-number is enabled.");
         doc!(h, "no-line-number",
              "Suppress line numbers.",
              "Suppress line numbers. This is enabled by default when NOT \
@@ -572,6 +580,15 @@ lazy_static! {
     };
 }
 
+fn validate_line_number_width(s: String) -> Result<(), String> {
+    if s.starts_with("0") {
+        Err(String::from("Custom padding characters are currently not supported. \
+        Please enter only a numeric value."))
+    } else {
+        validate_number(s)
+    }
+}
+
 fn validate_number(s: String) -> Result<(), String> {
     s.parse::<usize>().map(|_|()).map_err(|err| err.to_string())
 }
diff --git a/src/args.rs b/src/args.rs
index 106762c40..f2c9de443 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -54,6 +54,7 @@ pub struct Args {
     invert_match: bool,
     line_number: bool,
     line_per_match: bool,
+    line_number_width: Option<usize>,
     max_columns: Option<usize>,
     max_count: Option<u64>,
     max_filesize: Option<u64>,
@@ -144,7 +145,8 @@ impl Args {
             .only_matching(self.only_matching)
             .path_separator(self.path_separator)
             .with_filename(self.with_filename)
-            .max_columns(self.max_columns);
+            .max_columns(self.max_columns)
+            .line_number_width(self.line_number_width);
         if let Some(ref rep) = self.replace {
             p = p.replace(rep.clone());
         }
@@ -336,6 +338,7 @@ impl<'a> ArgMatches<'a> {
             ignore_files: self.ignore_files(),
             invert_match: self.is_present("invert-match"),
             line_number: line_number,
+            line_number_width: try!(self.usize_of("line-number-width")),
             line_per_match: self.is_present("vimgrep"),
             max_columns: try!(self.usize_of("max-columns")),
             max_count: try!(self.usize_of("max-count")).map(|max| max as u64),
diff --git a/src/printer.rs b/src/printer.rs
index 37680f9b9..2fb4ed60d 100644
--- a/src/printer.rs
+++ b/src/printer.rs
@@ -98,7 +98,11 @@ pub struct Printer<W> {
     /// The separator to use for file paths. If empty, this is ignored.
     path_separator: Option<u8>,
     /// Restrict lines to this many columns.
-    max_columns: Option<usize>
+    max_columns: Option<usize>,
+    /// Width of line number displayed. If the number of digits in the
+    /// line number is less than this, it is left padded with
+    /// spaces.
+    line_number_width: Option<usize>
 }
 
 impl<W: WriteColor> Printer<W> {
@@ -120,6 +124,7 @@ impl<W: WriteColor> Printer<W> {
             colors: ColorSpecs::default(),
             path_separator: None,
             max_columns: None,
+            line_number_width: None
         }
     }
 
@@ -208,6 +213,12 @@ impl<W: WriteColor> Printer<W> {
         self
     }
 
+    /// Configure the width of the displayed line number
+    pub fn line_number_width(mut self, line_number_width: Option<usize>) -> Printer<W> {
+        self.line_number_width = line_number_width;
+        self
+    }
+
     /// Returns true if and only if something has been printed.
     pub fn has_printed(&self) -> bool {
         self.has_printed
@@ -457,7 +468,11 @@ impl<W: WriteColor> Printer<W> {
     }
 
     fn line_number(&mut self, n: u64, sep: u8) {
-        self.write_colored(n.to_string().as_bytes(), |colors| colors.line());
+        let mut line_number = n.to_string();
+        if let Some(width) = self.line_number_width {
+            line_number = format!("{:>width$}", line_number, width = width);
+        }
+        self.write_colored(line_number.as_bytes(), |colors| colors.line());
         self.separator(&[sep]);
     }
 

diff --git a/tests/tests.rs b/tests/tests.rs
index 395514b26..9f5a15e1e 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -103,6 +103,22 @@ sherlock!(line_numbers, |wd: WorkDir, mut cmd: Command| {
     assert_eq!(lines, expected);
 });
 
+sherlock!(line_number_width, |wd: WorkDir, mut cmd: Command| {
+    cmd.arg("-n");
+    cmd.arg("--line-number-width").arg("2");
+    let lines: String = wd.stdout(&mut cmd);
+    let expected = " 1:For the Doctor Watsons of this world, as opposed to the Sherlock
+ 3:be, to a very large extent, the result of luck. Sherlock Holmes
+";
+    assert_eq!(lines, expected);
+});
+
+sherlock!(line_number_width_padding_character_error, |wd: WorkDir, mut cmd: Command| {
+    cmd.arg("-n");
+    cmd.arg("--line-number-width").arg("02");
+    wd.assert_non_empty_stderr(&mut cmd);
+});
+
 sherlock!(columns, |wd: WorkDir, mut cmd: Command| {
     cmd.arg("--column");
     let lines: String = wd.stdout(&mut cmd);

{"line_number_width": {"run": "NONE", "test": "FAIL", "fix": "PASS"}}
{"printer::tests::spec_errors": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::peeker_one_at_a_time": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_451_only_matching_as_in_issue": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::files_without_matches": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_599": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_506_word_boundaries_not_parenthesized": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "inverted_line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_utf16_bom": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_451_only_matching": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "with_heading": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_two2": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_two1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::invert_match_count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_three1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::peeker_three": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_137": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_16": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_utf16be": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_50": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_nl": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "printer::tests::merge": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "after_context_line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_7": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "literal": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "printer::tests::specs": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_two3": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_nul": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_invert_one1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_362_exceeds_regex_size_limit": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_693_context_option_in_contextless_mode": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_49": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_nothing_simple": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_229": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_1_unknown_encoding": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "before_context": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "binary_search_mmap": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_two5": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "word": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "replace": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_utf16le": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_three1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_two2": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "columns": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "quiet": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "line": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_109_case_sensitive_part2": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::previous_lines_short": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_87": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_utf8": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_korean": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::invert_match_line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::previous_lines_empty": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "replace_named_groups": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ignore_ripgrep_parent_no_stop": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::peeker_four": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_nothing_hex0": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "binary_nosearch": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::basic_search": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_two4": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_131": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_carriage": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "max_filesize_suffix_overflow": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "with_filename": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_big5_hkscs": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ignore_ripgrep": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "line_number_width_padding_character_error": {"run": "NONE", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_two_max_count_two": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_156": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_eucjp": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_chinese": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_109_case_sensitive_part1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "after_context": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::invert_match_line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_228": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_utf16_basic": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::peeker_empty": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::files_without_matches": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_after_context_two1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_tab": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_263_sort_files": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "binary_search_no_mmap": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ignore_hidden": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_one1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ignore_generic": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::binary_text": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "type_list": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_sjis": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "symlink_nofollow": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "before_context_line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::files_with_matches": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "replace_with_only_matching": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::max_count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_one1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::invert_match_max_count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::binary_text": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_65": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "replace_groups": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "with_heading_default": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_invert_one2": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::peeker_two": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "file_type_clear": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::invert_match": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_1_replacement_encoding": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_gbk": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_256_j1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::files_with_matches": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::invert_match_count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_latin1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_483_non_matching_exit_code": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_simple_auto": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::previous_lines": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_nothing_hex2": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_362_dfa_size_limit": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_568_leading_hyphen_option_arguments": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "case_insensitive": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::invert_match": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::binary": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::binary": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "max_filesize_parse_error_length": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ignore_git": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "feature_159_zero_max": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_210": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_invert_one1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "single_file": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_invert_one_max_count_two": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_buffer::tests::invert_match_max_count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "context": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ignore_git_parent": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::peeker_one": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "decoder::tests::trans_utf16_incomplete": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_428_unrecognized_style": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "max_filesize_parse_error_suffix": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_493": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "context_line_numbers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "regression_99": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::max_count": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_two1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "inverted": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unescape::tests::unescape_nothing_hex1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::basic_search1": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::after_context_two3": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "search_stream::tests::before_context_invert_one2": {"run": "PASS", "test": "PASS", "fix": "PASS"}}
{"line_number_width": {"run": "NONE", "test": "FAIL", "fix": "PASS"}}
{"passed_count": 146, "failed_count": 74, "skipped_count": 0, "passed_tests": ["printer::tests::spec_errors", "decoder::tests::peeker_one_at_a_time", "regression_451_only_matching_as_in_issue", "search_buffer::tests::files_without_matches", "regression_599", "regression_506_word_boundaries_not_parenthesized", "inverted_line_numbers", "decoder::tests::trans_utf16_bom", "regression_451_only_matching", "with_heading", "search_stream::tests::after_context_two2", "search_buffer::tests::line_numbers", "search_stream::tests::before_context_two1", "search_stream::tests::invert_match_count", "search_stream::tests::before_context_three1", "decoder::tests::peeker_three", "line_numbers", "regression_137", "regression_16", "decoder::tests::trans_simple_utf16be", "regression_50", "unescape::tests::unescape_nl", "printer::tests::merge", "after_context_line_numbers", "feature_7", "search_buffer::tests::count", "literal", "printer::tests::specs", "search_stream::tests::before_context_two3", "unescape::tests::unescape_nul", "search_stream::tests::before_context_invert_one1", "feature_362_exceeds_regex_size_limit", "regression_693_context_option_in_contextless_mode", "regression_49", "unescape::tests::unescape_nothing_simple", "regression_229", "feature_1_unknown_encoding", "before_context", "binary_search_mmap", "search_stream::tests::before_context_two5", "word", "replace", "decoder::tests::trans_simple_utf16le", "search_stream::tests::after_context_three1", "search_stream::tests::before_context_two2", "columns", "quiet", "line", "feature_109_case_sensitive_part2", "search_stream::tests::previous_lines_short", "regression_87", "decoder::tests::trans_simple_utf8", "decoder::tests::trans_simple_korean", "search_stream::tests::invert_match_line_numbers", "search_stream::tests::previous_lines_empty", "replace_named_groups", "ignore_ripgrep_parent_no_stop", "decoder::tests::peeker_four", "unescape::tests::unescape_nothing_hex0", "binary_nosearch", "search_buffer::tests::basic_search", "search_stream::tests::before_context_two4", "regression_131", "unescape::tests::unescape_carriage", "max_filesize_suffix_overflow", "with_filename", "decoder::tests::trans_simple_big5_hkscs", "ignore_ripgrep", "search_stream::tests::after_context_two_max_count_two", "regression_156", "decoder::tests::trans_simple_eucjp", "decoder::tests::trans_simple_chinese", "feature_109_case_sensitive_part1", "after_context", "search_buffer::tests::invert_match_line_numbers", "regression_228", "decoder::tests::trans_utf16_basic", "decoder::tests::peeker_empty", "search_stream::tests::files_without_matches", "search_stream::tests::before_after_context_two1", "unescape::tests::unescape_tab", "feature_263_sort_files", "binary_search_no_mmap", "ignore_hidden", "search_stream::tests::before_context_one1", "ignore_generic", "search_buffer::tests::binary_text", "type_list", "decoder::tests::trans_simple_sjis", "symlink_nofollow", "before_context_line_numbers", "search_stream::tests::files_with_matches", "replace_with_only_matching", "search_buffer::tests::max_count", "search_stream::tests::after_context_one1", "search_stream::tests::invert_match_max_count", "search_stream::tests::binary_text", "regression_65", "replace_groups", "with_heading_default", "search_stream::tests::after_context_invert_one2", "decoder::tests::peeker_two", "file_type_clear", "search_stream::tests::invert_match", "feature_1_replacement_encoding", "decoder::tests::trans_simple_gbk", "regression_256_j1", "search_buffer::tests::files_with_matches", "search_buffer::tests::invert_match_count", "decoder::tests::trans_simple_latin1", "regression_483_non_matching_exit_code", "decoder::tests::trans_simple_auto", "search_stream::tests::previous_lines", "unescape::tests::unescape_nothing_hex2", "feature_362_dfa_size_limit", "regression_568_leading_hyphen_option_arguments", "case_insensitive", "search_buffer::tests::invert_match", "search_buffer::tests::binary", "search_stream::tests::binary", "max_filesize_parse_error_length", "ignore_git", "feature_159_zero_max", "search_stream::tests::count", "regression_210", "search_stream::tests::after_context_invert_one1", "single_file", "search_stream::tests::after_context_invert_one_max_count_two", "search_buffer::tests::invert_match_max_count", "search_stream::tests::line_numbers", "context", "ignore_git_parent", "decoder::tests::peeker_one", "decoder::tests::trans_utf16_incomplete", "regression_428_unrecognized_style", "max_filesize_parse_error_suffix", "regression_493", "context_line_numbers", "regression_99", "search_stream::tests::max_count", "search_stream::tests::after_context_two1", "inverted", "unescape::tests::unescape_nothing_hex1", "search_stream::tests::basic_search1", "search_stream::tests::after_context_two3", "search_stream::tests::before_context_invert_one2"], "failed_tests": ["regression_270", "feature_1_sjis", "feature_7_dash", "regression_391", "feature_89_files_without_matches", "feature_129_context", "regression_184", "feature_70_smart_case", "regression_199", "regression_67", "regression_30", "count", "feature_45_precedence_internal", "ignore_git_parent_stop", "file_type_add_compose", "regression_90", "regression_251", "regression_428_color_context_path", "feature_159_works", "feature_129_matches", "feature_34_only_matching", "file_types_all", "feature_1_utf16_auto", "regression_105_part2", "regression_105_part1", "max_filesize_parse_m_suffix", "unrestricted3", "feature_45_precedence_with_others", "regression_25", "feature_419_zero_as_shortcut_for_null", "unrestricted1", "regression_256", "feature_275_pathsep", "feature_129_replace", "regression_128", "regression_405", "symlink_follow", "regression_279", "feature_89_files", "regression_483_matching_no_stdout", "file_types_negate_all", "regression_64", "no_ignore", "files_without_matches", "feature_34_only_matching_line_column", "feature_243_column_line", "regression_93", "unrestricted2", "files_with_matches", "file_types", "max_filesize_parse_k_suffix", "no_ignore_hidden", "feature_68_no_ignore_vcs", "feature_1_eucjp", "dir", "vimgrep", "feature_89_files_with_matches", "feature_109_max_depth", "feature_89_count", "regression_206", "feature_89_match", "file_types_negate", "feature_20_no_filename", "glob", "max_filesize_parse_no_suffix", "files", "feature_45_relative_cwd", "glob_negate", "file_type_add", "iglob", "regression_127", "no_parent_ignore_git", "feature_1_utf16_explicit", "csglob"], "skipped_tests": []}
{"passed_count": 147, "failed_count": 75, "skipped_count": 0, "passed_tests": ["printer::tests::spec_errors", "decoder::tests::peeker_one_at_a_time", "regression_451_only_matching_as_in_issue", "search_buffer::tests::files_without_matches", "regression_599", "regression_506_word_boundaries_not_parenthesized", "inverted_line_numbers", "decoder::tests::trans_utf16_bom", "regression_451_only_matching", "with_heading", "search_stream::tests::after_context_two2", "search_buffer::tests::line_numbers", "search_stream::tests::before_context_two1", "search_stream::tests::invert_match_count", "search_stream::tests::before_context_three1", "decoder::tests::peeker_three", "line_numbers", "regression_137", "regression_16", "decoder::tests::trans_simple_utf16be", "regression_50", "unescape::tests::unescape_nl", "printer::tests::merge", "after_context_line_numbers", "feature_7", "search_buffer::tests::count", "literal", "printer::tests::specs", "search_stream::tests::before_context_two3", "unescape::tests::unescape_nul", "search_stream::tests::before_context_invert_one1", "feature_362_exceeds_regex_size_limit", "regression_693_context_option_in_contextless_mode", "regression_49", "unescape::tests::unescape_nothing_simple", "regression_229", "feature_1_unknown_encoding", "before_context", "binary_search_mmap", "search_stream::tests::before_context_two5", "word", "replace", "decoder::tests::trans_simple_utf16le", "search_stream::tests::after_context_three1", "search_stream::tests::before_context_two2", "columns", "quiet", "line", "feature_109_case_sensitive_part2", "search_stream::tests::previous_lines_short", "regression_87", "decoder::tests::trans_simple_utf8", "decoder::tests::trans_simple_korean", "search_stream::tests::invert_match_line_numbers", "search_stream::tests::previous_lines_empty", "replace_named_groups", "ignore_ripgrep_parent_no_stop", "decoder::tests::peeker_four", "unescape::tests::unescape_nothing_hex0", "binary_nosearch", "search_buffer::tests::basic_search", "search_stream::tests::before_context_two4", "regression_131", "unescape::tests::unescape_carriage", "max_filesize_suffix_overflow", "with_filename", "decoder::tests::trans_simple_big5_hkscs", "ignore_ripgrep", "line_number_width_padding_character_error", "search_stream::tests::after_context_two_max_count_two", "regression_156", "decoder::tests::trans_simple_eucjp", "decoder::tests::trans_simple_chinese", "feature_109_case_sensitive_part1", "after_context", "search_buffer::tests::invert_match_line_numbers", "regression_228", "decoder::tests::trans_utf16_basic", "decoder::tests::peeker_empty", "search_stream::tests::files_without_matches", "search_stream::tests::before_after_context_two1", "unescape::tests::unescape_tab", "feature_263_sort_files", "binary_search_no_mmap", "ignore_hidden", "search_stream::tests::before_context_one1", "ignore_generic", "search_buffer::tests::binary_text", "type_list", "decoder::tests::trans_simple_sjis", "symlink_nofollow", "before_context_line_numbers", "search_stream::tests::files_with_matches", "replace_with_only_matching", "search_buffer::tests::max_count", "search_stream::tests::after_context_one1", "search_stream::tests::invert_match_max_count", "search_stream::tests::binary_text", "regression_65", "replace_groups", "with_heading_default", "search_stream::tests::after_context_invert_one2", "decoder::tests::peeker_two", "file_type_clear", "search_stream::tests::invert_match", "feature_1_replacement_encoding", "decoder::tests::trans_simple_gbk", "regression_256_j1", "search_buffer::tests::files_with_matches", "search_buffer::tests::invert_match_count", "decoder::tests::trans_simple_latin1", "regression_483_non_matching_exit_code", "decoder::tests::trans_simple_auto", "unescape::tests::unescape_nothing_hex2", "search_stream::tests::previous_lines", "feature_362_dfa_size_limit", "regression_568_leading_hyphen_option_arguments", "case_insensitive", "search_buffer::tests::invert_match", "search_buffer::tests::binary", "search_stream::tests::binary", "max_filesize_parse_error_length", "ignore_git", "feature_159_zero_max", "search_stream::tests::count", "regression_210", "search_stream::tests::after_context_invert_one1", "single_file", "search_stream::tests::after_context_invert_one_max_count_two", "search_buffer::tests::invert_match_max_count", "search_stream::tests::line_numbers", "context", "ignore_git_parent", "decoder::tests::peeker_one", "decoder::tests::trans_utf16_incomplete", "regression_428_unrecognized_style", "max_filesize_parse_error_suffix", "regression_493", "context_line_numbers", "regression_99", "search_stream::tests::max_count", "search_stream::tests::after_context_two1", "inverted", "unescape::tests::unescape_nothing_hex1", "search_stream::tests::basic_search1", "search_stream::tests::after_context_two3", "search_stream::tests::before_context_invert_one2"], "failed_tests": ["regression_270", "feature_1_sjis", "feature_7_dash", "regression_391", "feature_89_files_without_matches", "feature_129_context", "feature_70_smart_case", "regression_184", "regression_199", "regression_67", "regression_30", "count", "file_type_add_compose", "ignore_git_parent_stop", "feature_45_precedence_internal", "regression_428_color_context_path", "regression_251", "regression_90", "feature_159_works", "feature_34_only_matching", "feature_129_matches", "feature_1_utf16_auto", "regression_105_part2", "file_types_all", "regression_105_part1", "unrestricted3", "feature_45_precedence_with_others", "regression_25", "feature_419_zero_as_shortcut_for_null", "regression_256", "unrestricted1", "feature_275_pathsep", "line_number_width", "regression_128", "feature_129_replace", "regression_405", "symlink_follow", "regression_279", "feature_89_files", "regression_483_matching_no_stdout", "file_types_negate_all", "regression_64", "no_ignore", "files_without_matches", "feature_34_only_matching_line_column", "feature_243_column_line", "regression_93", "csglob", "unrestricted2", "files_with_matches", "file_types", "max_filesize_parse_k_suffix", "no_ignore_hidden", "feature_68_no_ignore_vcs", "feature_1_eucjp", "dir", "vimgrep", "feature_89_files_with_matches", "feature_89_count", "feature_109_max_depth", "regression_206", "feature_89_match", "file_types_negate", "glob", "feature_20_no_filename", "files", "max_filesize_parse_no_suffix", "feature_45_relative_cwd", "file_type_add", "glob_negate", "iglob", "regression_127", "no_parent_ignore_git", "feature_1_utf16_explicit", "max_filesize_parse_m_suffix"], "skipped_tests": []}
{"passed_count": 148, "failed_count": 74, "skipped_count": 0, "passed_tests": ["printer::tests::spec_errors", "decoder::tests::peeker_one_at_a_time", "regression_451_only_matching_as_in_issue", "search_buffer::tests::files_without_matches", "regression_599", "regression_506_word_boundaries_not_parenthesized", "inverted_line_numbers", "decoder::tests::trans_utf16_bom", "regression_451_only_matching", "with_heading", "search_stream::tests::after_context_two2", "search_stream::tests::before_context_two1", "search_buffer::tests::line_numbers", "search_stream::tests::invert_match_count", "search_stream::tests::before_context_three1", "decoder::tests::peeker_three", "line_numbers", "regression_137", "regression_16", "decoder::tests::trans_simple_utf16be", "regression_50", "unescape::tests::unescape_nl", "printer::tests::merge", "after_context_line_numbers", "feature_7", "search_buffer::tests::count", "literal", "printer::tests::specs", "search_stream::tests::before_context_two3", "unescape::tests::unescape_nul", "search_stream::tests::before_context_invert_one1", "feature_362_exceeds_regex_size_limit", "regression_693_context_option_in_contextless_mode", "regression_49", "unescape::tests::unescape_nothing_simple", "regression_229", "feature_1_unknown_encoding", "binary_search_mmap", "before_context", "search_stream::tests::before_context_two5", "word", "replace", "decoder::tests::trans_simple_utf16le", "search_stream::tests::after_context_three1", "search_stream::tests::before_context_two2", "columns", "quiet", "line", "feature_109_case_sensitive_part2", "search_stream::tests::previous_lines_short", "regression_87", "decoder::tests::trans_simple_utf8", "decoder::tests::trans_simple_korean", "search_stream::tests::invert_match_line_numbers", "search_stream::tests::previous_lines_empty", "replace_named_groups", "ignore_ripgrep_parent_no_stop", "decoder::tests::peeker_four", "unescape::tests::unescape_nothing_hex0", "binary_nosearch", "search_buffer::tests::basic_search", "search_stream::tests::before_context_two4", "regression_131", "unescape::tests::unescape_carriage", "max_filesize_suffix_overflow", "with_filename", "decoder::tests::trans_simple_big5_hkscs", "ignore_ripgrep", "line_number_width_padding_character_error", "search_stream::tests::after_context_two_max_count_two", "regression_156", "decoder::tests::trans_simple_eucjp", "decoder::tests::trans_simple_chinese", "feature_109_case_sensitive_part1", "after_context", "search_buffer::tests::invert_match_line_numbers", "regression_228", "decoder::tests::trans_utf16_basic", "decoder::tests::peeker_empty", "search_stream::tests::files_without_matches", "search_stream::tests::before_after_context_two1", "unescape::tests::unescape_tab", "feature_263_sort_files", "binary_search_no_mmap", "ignore_hidden", "search_stream::tests::before_context_one1", "ignore_generic", "search_buffer::tests::binary_text", "type_list", "decoder::tests::trans_simple_sjis", "symlink_nofollow", "before_context_line_numbers", "search_stream::tests::files_with_matches", "replace_with_only_matching", "search_stream::tests::after_context_one1", "search_buffer::tests::max_count", "search_stream::tests::invert_match_max_count", "search_stream::tests::binary_text", "regression_65", "replace_groups", "with_heading_default", "search_stream::tests::after_context_invert_one2", "decoder::tests::peeker_two", "file_type_clear", "search_stream::tests::invert_match", "feature_1_replacement_encoding", "decoder::tests::trans_simple_gbk", "regression_256_j1", "search_buffer::tests::files_with_matches", "search_buffer::tests::invert_match_count", "decoder::tests::trans_simple_latin1", "regression_483_non_matching_exit_code", "decoder::tests::trans_simple_auto", "search_stream::tests::previous_lines", "unescape::tests::unescape_nothing_hex2", "feature_362_dfa_size_limit", "regression_568_leading_hyphen_option_arguments", "case_insensitive", "search_buffer::tests::invert_match", "search_buffer::tests::binary", "search_stream::tests::binary", "max_filesize_parse_error_length", "ignore_git", "line_number_width", "feature_159_zero_max", "search_stream::tests::count", "regression_210", "search_stream::tests::after_context_invert_one1", "single_file", "search_stream::tests::after_context_invert_one_max_count_two", "search_buffer::tests::invert_match_max_count", "search_stream::tests::line_numbers", "context", "ignore_git_parent", "decoder::tests::peeker_one", "decoder::tests::trans_utf16_incomplete", "regression_428_unrecognized_style", "max_filesize_parse_error_suffix", "regression_493", "context_line_numbers", "regression_99", "search_stream::tests::max_count", "search_stream::tests::after_context_two1", "inverted", "unescape::tests::unescape_nothing_hex1", "search_stream::tests::basic_search1", "search_stream::tests::after_context_two3", "search_stream::tests::before_context_invert_one2"], "failed_tests": ["regression_270", "feature_1_sjis", "feature_7_dash", "regression_391", "feature_89_files_without_matches", "feature_129_context", "regression_184", "feature_70_smart_case", "regression_199", "regression_67", "regression_30", "count", "file_type_add_compose", "ignore_git_parent_stop", "feature_45_precedence_internal", "regression_428_color_context_path", "regression_251", "regression_90", "regression_105_part2", "feature_34_only_matching", "feature_159_works", "feature_1_utf16_auto", "file_types_all", "feature_129_matches", "regression_105_part1", "unrestricted3", "feature_45_precedence_with_others", "regression_25", "feature_419_zero_as_shortcut_for_null", "regression_256", "unrestricted1", "feature_275_pathsep", "feature_129_replace", "regression_128", "regression_405", "symlink_follow", "regression_279", "feature_89_files", "regression_483_matching_no_stdout", "file_types_negate_all", "regression_64", "no_ignore", "files_without_matches", "feature_34_only_matching_line_column", "feature_243_column_line", "regression_93", "csglob", "unrestricted2", "files_with_matches", "file_types", "max_filesize_parse_k_suffix", "no_ignore_hidden", "feature_68_no_ignore_vcs", "feature_1_eucjp", "dir", "vimgrep", "feature_89_files_with_matches", "feature_109_max_depth", "feature_89_count", "regression_206", "feature_89_match", "file_types_negate", "glob", "feature_20_no_filename", "files", "feature_45_relative_cwd", "max_filesize_parse_no_suffix", "glob_negate", "file_type_add", "iglob", "regression_127", "no_parent_ignore_git", "feature_1_utf16_explicit", "max_filesize_parse_m_suffix"], "skipped_tests": []}