App-migrate
view release on metacpan or search on metacpan
t/example.t view on Meta::CPAN
use strict;
use POSIX qw(locale_h); BEGIN { setlocale(LC_MESSAGES,'en_US.UTF-8') } # avoid UTF-8 in $!
use Test::More;
use Test::Exception;
use Test::Output qw( :all );
use Path::Tiny qw( path tempdir tempfile );
use App::migrate;
plan skip_all => 'pgrep not installed' if !grep {-x "$_/pgrep"} split /:/, $ENV{PATH};
my $migrate = App::migrate->new;
my $file = tempfile('migrate.XXXXXX');
my $proj = tempdir('migrate.project.XXXXXX');
my $guard = bless {};
sub DESTROY { chdir q{/} }
chdir $proj or die "chdir($proj): $!";
my (@backup, @restore);
$migrate->on(BACKUP => sub { push @backup, shift->{version} });
$migrate->on(RESTORE => sub { push @restore, shift->{version} });
$migrate->on(error => sub { diag 'on ERROR was called' });
ok $migrate, 'new';
# Make sure example from documentation actually works
$file->spew_utf8(<<'MIGRATE');
VERSION 0.0.0
# To upgrade from 0.0.0 to 0.1.0 we need to create new empty file and
# empty directory.
upgrade touch empty_file
downgrade rm empty_file
upgrade mkdir empty_dir
downgrade rmdir empty_dir
VERSION 0.1.0
# To upgrade from 0.1.0 to 0.2.0 we need to drop old database. This
# change can't be undone, so only way to downgrade from 0.2.0 is to
# restore 0.1.0 from backup.
upgrade rm useless.db
RESTORE
VERSION 0.2.0
# To upgrade from 0.2.0 to 1.0.0 we need to run several commands,
# and after downgrading we need to kill some background service.
before_upgrade
patch -E <0.2.0.patch >/dev/null
rm -f *.orig
chmod +x some_daemon
downgrade
patch -E -R <0.2.0.patch >/dev/null
rm -f *.orig
upgrade
./some_daemon &
after_downgrade
pkill -9 -x -f '/bin/sh ./some_daemon'
VERSION 1.0.0
# Let's define some lazy helpers:
DEFINE2 only_upgrade
upgrade
downgrade true
( run in 1.118 second using v1.01-cache-2.11-cpan-ceb78f64989 )