File: Util.pm

package info (click to toggle)
libcode-tidyall-perl 0.78~ds-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,048 kB
  • sloc: perl: 5,061; lisp: 47; sh: 4; makefile: 2
file content (128 lines) | stat: -rw-r--r-- 2,479 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package Code::TidyAll::Git::Util;

use strict;
use warnings;

use File::pushd qw(pushd);
use IPC::System::Simple qw(capturex);
use List::SomeUtils qw(uniq);
use Path::Tiny qw(path);

use Exporter qw(import);

our $VERSION = '0.78';

our @EXPORT_OK = qw(git_files_to_commit git_modified_files);

sub git_files_to_commit {
    my ($dir) = @_;
    return _relevant_files_from_status( $dir, 1 );
}

sub git_modified_files {
    my ($dir) = @_;
    return _relevant_files_from_status( $dir, 0 );
}

sub _relevant_files_from_status {
    my ( $dir, $index_only ) = @_;

    $dir = path($dir);
    my $pushed = pushd( $dir->absolute );
    my $status = capturex(qw( git status --porcelain -z -uno ));

    return unless $status;

    return map { $dir->child($_) } _parse_status( $status, $index_only );
}

sub _parse_status {
    my ( $status, $index_only ) = @_;

    local $_ = $status;

    # There can't possibly be more records than nuls plus one, so we use this
    # as an upper bound on passes.
    my $times = tr/\0/\0/;

    my @files;

    for my $i ( 0 .. $times ) {
        last if /\G\Z/gc;

        /\G(..) /g;
        my $mode = $1;

        /\G([^\0]+)\0/g;
        my $name = $1;

        # on renames, parse but throw away the "renamed from" filename
        if ( $mode =~ /[CR]/ ) {
            /\G([^\0]+)\0/g;
        }

        # deletions and renames don't cause tidying
        next unless $mode =~ /[MA]/;
        next if $index_only && $mode =~ /^ /;

        push @files, $name;
    }

    return @files;
}

1;

# ABSTRACT: Utilities for the git hook classes

__END__

=pod

=encoding UTF-8

=head1 NAME

Code::TidyAll::Git::Util - Utilities for the git hook classes

=head1 VERSION

version 0.78

=head1 SUPPORT

Bugs may be submitted at
L<https://github.com/houseabsolute/perl-code-tidyall/issues>.

I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.

=head1 SOURCE

The source code repository for Code-TidyAll can be found at
L<https://github.com/houseabsolute/perl-code-tidyall>.

=head1 AUTHORS

=over 4

=item *

Jonathan Swartz <swartz@pobox.com>

=item *

Dave Rolsky <autarch@urth.org>

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 - 2020 by Jonathan Swartz.

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

The full text of the license can be found in the F<LICENSE> file included with
this distribution.

=cut