—#!/usr/bin/perl
# Created on: 2014-01-10 09:11:44
# Create by: dev
# $Id$
# $Revision$, $HeadURL$, $Date$
# $Revision$, $Source$, $Date$
use
strict;
use
warnings;
use
version;
use
Carp;
use
Getopt::Long;
use
Pod::Usage;
use
Path::Tiny;
use
App::watchdo;
our
$VERSION
= version->new(
'0.1.1'
);
my
(
$name
) =
$PROGRAM_NAME
=~ m{^.*/(.*?)$}mxs;
my
%option
= (
sleep
=> 1,
verbose
=> 0,
man
=> 0,
help
=> 0,
VERSION
=> 0,
);
if
( !
@ARGV
) {
pod2usage(
-verbose
=> 1 );
}
main();
exit
0;
sub
main {
Getopt::Long::Configure(
'bundling'
);
GetOptions(
\
%option
,
'first|f!'
,
'watch|w=s@'
,
'dir|d=s@'
,
'git|g'
,
'exclude|e=s@'
,
'sleep|s=i'
,
'pass_files|pass-files|p!'
,
'test|t!'
,
'verbose|v+'
,
'man'
,
'help'
,
'version'
,
) or pod2usage(2);
if
(
$option
{
'version'
} ) {
"$name Version = $VERSION\n"
;
exit
1;
}
elsif
(
$option
{
'man'
} ) {
pod2usage(
-verbose
=> 2 );
}
elsif
(
$option
{
'help'
} ) {
pod2usage(
-verbose
=> 1 );
}
elsif
( !
$option
{watch} && !
$option
{git} ) {
warn
"You must specify files to watch!\n"
;
pod2usage(
-verbose
=> 1 );
}
elsif
( !
@ARGV
) {
warn
"Showing files when they change\n"
;
}
# do stuff here
my
$watch
= App::watchdo->new(
dirs
=>
$option
{dir} || [],
files
=>
$option
{watch} || [],
git
=>
$option
{git},
exclude
=>
$option
{exclude} || [],
wait
=>
$option
{
sleep
},
run
=> \
&run
,
);
run()
if
$option
{first};
$watch
->watch();
return
;
}
sub
run {
my
@changed
=
@_
;
my
@cmd
= (
@ARGV
,
$option
{pass_files} ?
map
{
$_
->path }
@changed
: () );
warn
"Files changed!\n"
if
$option
{verbose};
if
( !
@ARGV
) {
join
"\n"
,
@cmd
;
"\n"
;
}
else
{
if
(
$option
{test} ||
$option
{verbose} ) {
warn
join
' '
,
@cmd
;
}
if
( !
$option
{test} ) {
system
@cmd
;
}
}
}
__DATA__
=head1 NAME
watch-do - Run a command when watched files change
=head1 VERSION
This documentation refers to watch-do version 0.1.1
=head1 SYNOPSIS
watch-do -w file1 [-w file2 ...] [(-e|--exclude) regexp] [-f|--first] [(-s|--sleep) seconds] [--] [cmd]
watch-do (-g|--git) [(-e|--exclude) regexp] [-f|--first] [(-s|--sleep) seconds] [--] [cmd]
watch-do --help
watch-do --man
watch-do --version
OPTIONS:
cmd Command to run when watched file(s) change. If not
supplied this will just show the changed files.
-w --watch[=]file File or Directory to be watched for changes
-g --git Use git to find what to watch (i.e. monitor git status to
see files have changed and add them to the watch)
-e --exclude[=]regexp
Exclude changes in files that match is regeular expression
You can specify multiple times for more regexps.
-f --first Execute the cmd on the first run as well as when files
change.
-s --sleep[=]int Time in seconds to sleep between checking for changes
(Default 1s)
-t --test Only test that the script would be executed on file
changes, will warn with the execution of the command.
--no-test Turn off testing (Default)
-v --verbose Show more detailed option
--version Prints the version information
--help Prints this help information
--man Prints the full documentation for watch-do
=head1 DESCRIPTION
C<watch-do> watches for file changes and runs a supplied command or prints
those files that have changed.
=head1 SUBROUTINES/METHODS
=head1 DIAGNOSTICS
=head1 CONFIGURATION AND ENVIRONMENT
=head1 DEPENDENCIES
=head1 INCOMPATIBILITIES
=head1 BUGS AND LIMITATIONS
There are no known bugs in this module.
Please report problems to Ivan Wills (ivan.wills@gmail.com).
Patches are welcome.
=head1 AUTHOR
Ivan Wills - (ivan.wills@gmail.com)
=head1 LICENSE AND COPYRIGHT
Copyright (c) 2014 Ivan Wills (14 Mullion Close, Hornsby Heights, NSW Australia 2077).
All rights reserved.
This module is free software; you can redistribute it and/or modify it under
the same terms as Perl itself. See L<perlartistic>. This program is
distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
=cut