NAME

Text::Gitignore - Match .gitignore patterns

SYNOPSIS

use Text::Gitignore qw(match_gitignore build_gitignore_matcher);

my @matched_files = match_gitignore(['pattern1', 'pattern2/*'], @files);

# Precompile patterns
my $matcher = build_gitignore_matcher(['*.js']);

if ($matcher->('foo.js')) {

    # Matched
}

DESCRIPTION

Text::Gitignore matches .gitignore patterns. It combines Text::Glob and File::FnMatch functionality with several .gitignore-specific tweaks.

EXPORTED FUNCTIONS

match_gitignore

my @matched_files = match_gitignore(['pattern1', 'pattern2/*'], @files);

Returns matched paths (if any). Accepts a string (slurped file for example), or an array reference

build_gitignore_matcher

# Precompile patterns
my $matcher = build_gitignore_matcher(['*.js']);

if ($matcher->('foo.js')) {

    # Matched
}

Returns a code reference. The produced function accepts a single file as a first parameter and returns true when it was matched. In case no pattern is matched, it returns a false value with the following convention:

  • if the no-match reason is because of a negated pattern, then a false but defined value is returned (e.g. 0);

  • otherwise, if the no-match reason is that no direct pattern matched, then undef is returned.

The use of different false values is inspired to the wantarray() built-in function.

Example:

my $matcher  = build_gitignore_matcher(['f*', '!foo*', 'foobar']);
my $matched  = $matcher->('foobar');  # $matched set to true
my $ignored  = $matcher->('bar');     # $ignored set to undef
my $excluded = $matcher->('foolish'); # $excluded set to false but defined (e.g. 0)

LICENSE

Originally developed for https://kritika.io.

Copyright (C) Viacheslav Tykhanovskyi.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

CREDITS

Flavio Poletti

Eric A. Zarko

AUTHOR

Viacheslav Tykhanovskyi <viacheslav.t@gmail.com>