Skip to content

Instantly share code, notes, and snippets.

@rodrigolive
Last active December 14, 2015 05:49
Show Gist options
  • Save rodrigolive/5037908 to your computer and use it in GitHub Desktop.
Save rodrigolive/5037908 to your computer and use it in GitHub Desktop.
gitt, a git status on steroids
#!/usr/bin/env perl
use v5.14;
use Path::Class;
use Class::Date qw(date now);
use Getopt::Mini var => 'opts' ;
my %mods ;
my $k = 0;
#use YAML;
%ARGV = %opts;
#Getopt::Mini::getopt_validate( t => { isa=>'Num' } );
sub pushit {
my ( $type, $letter, $file ) = @_;
my $f = file($file);
my $s = $f->stat;
my $mdate = $s ? $s->[9] : '';
my $size = $s ? $s->[7] : '';
my $d = $s ? Class::Date->new($mdate) : '-------------------';
$mods{ ( $mdate . '.' . $k++ ) } = { f => "$f", d => $d, t => $type, s => $letter, size=>$size };
}
sub report {
my $type = shift;
my $now = now();
my $day = 60*60*24;
my @files = sort { $a->{d} <=> $b->{d} } grep { $type eq $_->{t} } map { $mods{$_} } keys %mods;
if( @files ) {
for( @files ) {
# set size
$_->{size} < 1024 ? $_->{size_b} = 'B'
: $_->{size} < 1024*1024 ? do { $_->{size} /= 1024; $_->{size_b} ='KB' }
: do { $_->{size} /= 1024*1024; $_->{size_b}='MB' };
# change date to word
my $dname = sprintf '%20s', do {
given( $_->{d} ) {
when( $_ >= $now - '1D' ) { my $t=$now-$_;
$t<60?'seconds':$t<3600?int($t/60).' minutes ago':int($t/3600).' hours ago' }
when( $_ >= $now - '2D' ) { 'yesterday' }
when( $_ >= ($now - '30D') ) { int(($now - $_)/$day) . ' days ago' }
default { $_ }
}
};
# print
say( sprintf( ' %-70s %s %4d %-2s %s', $_->{f}, $dname // $_->{d}, $_->{size}, $_->{size_b}, $_->{s} ) )
}
} else {
say ' (clean)';
}
}
for (`git status -s $opts{''}`) {
if (/^([A-Z])([A-Z])?\s*(\S.+)$/) {
warn "ADDS: $_" if $opts{v};
pushit( 'adds', $1, $3 );
pushit( 'mods', $2, $3 ) if $2;
} elsif (/^ ([A-Z])\s*(\S.+)$/) {
warn "MODS: $_" if $opts{v};
pushit( 'mods', $1, $2 );
} elsif (/^\?\?\s*(\S.+)$/) {
pushit( 'untracked', '', $1 );
} else {
warn "Unindentified: $_";
}
}
say 'Index:';
report('adds');
say;
say 'Mods:';
report('mods');
if (exists $opts{a}) {
say;
say 'Untraked:';
report('untracked');
}
say;
my @branch = `git branch`;
print 'Branch: ' . substr ''.[grep /^\*/, @branch]->[0],2 unless $?;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment