[carton] 296/472: Implemented carton update
Lucas Kanashiro
kanashiro-guest at moszumanska.debian.org
Fri Jul 24 00:38:57 UTC 2015
This is an automated email from the git hooks/post-receive script.
kanashiro-guest pushed a commit to branch master
in repository carton.
commit 75affd3150e3745d9ff325de23bcade90da98bce
Author: Tatsuhiko Miyagawa <miyagawa at bulknews.net>
Date: Wed Jun 5 18:58:48 2013 +0900
Implemented carton update
---
lib/Carton/Builder.pm | 13 ++++++++++++-
lib/Carton/CLI.pm | 33 ++++++++++++++++++++++++---------
xt/cli/update.t | 41 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 77 insertions(+), 10 deletions(-)
diff --git a/lib/Carton/Builder.pm b/lib/Carton/Builder.pm
index 0157da1..e71c557 100644
--- a/lib/Carton/Builder.pm
+++ b/lib/Carton/Builder.pm
@@ -47,7 +47,6 @@ sub install {
$self->run_cpanm(
"-L", $path,
(map { ("--mirror", $_->url) } $self->effective_mirrors),
- "--skip-satisfied",
( $self->index ? ("--mirror-index", $self->index) : () ),
( $self->cascade ? "--cascade-search" : () ),
( $self->custom_mirror ? "--mirror-only" : () ),
@@ -57,6 +56,18 @@ sub install {
) or die "Installing modules failed\n";
}
+sub update {
+ my($self, $path, @modules) = @_;
+
+ $self->run_cpanm(
+ "-L", $path,
+ (map { ("--mirror", $_->url) } $self->effective_mirrors),
+ ( $self->custom_mirror ? "--mirror-only" : () ),
+ "--save-dists", "$path/cache",
+ @modules
+ ) or die "Updating modules failed\n";
+}
+
sub run_cpanm {
my($self, @args) = @_;
local $ENV{PERL_CPANM_OPT};
diff --git a/lib/Carton/CLI.pm b/lib/Carton/CLI.pm
index cf3d147..e91aec4 100644
--- a/lib/Carton/CLI.pm
+++ b/lib/Carton/CLI.pm
@@ -316,19 +316,34 @@ sub cmd_check {
}
sub cmd_update {
- # "cleanly" update distributions in extlib
- die <<EOF;
-carton update is not implemented yet.
+ my($self, @args) = @_;
+
+ my $cpanfile = Module::CPANfile->load($self->find_cpanfile);
+ my $prereqs = $cpanfile->prereqs;
-The command is supposed to update all the dependencies to the latest
-version as if you don't have the current local environment doesn't
-exist.
+ my $reqs = CPAN::Meta::Requirements->new;
+ $reqs->add_requirements($prereqs->requirements_for($_, 'requires'))
+ for qw( configure build runtime test develop );
+
+ @args = grep { $_ ne 'perl' } $reqs->required_modules unless @args;
+
+ my $lock = $self->find_lock
+ or $self->error("Can't find carton.lock: Run `carton install` to build the lock file.\n");
-For now, you can remove the local environment and re-run carton install
-to get the similar functionality.
+ my @modules;
+ for my $module (@args) {
+ my $dist = $lock->find_or_core($module)
+ or $self->error("Could not find module $module.\n");
+ next if $dist->is_core;
+ push @modules, "$module~" . $reqs->requirements_for_module($module);
+ }
-EOF
+ my $builder = Carton::Builder->new(
+ mirror => $self->mirror,
+ );
+ $builder->update($self->install_path, @modules);
+ Carton::Lock->build_from_local($self->install_path, $prereqs)->write($self->lock_file);
}
sub cmd_exec {
diff --git a/xt/cli/update.t b/xt/cli/update.t
new file mode 100644
index 0000000..60617d9
--- /dev/null
+++ b/xt/cli/update.t
@@ -0,0 +1,41 @@
+use strict;
+use Test::More;
+use xt::CLI;
+
+{
+ my $app = cli();
+
+ $app->dir->child("cpanfile")->spew(<<EOF);
+requires 'Try::Tiny', '== 0.09';
+EOF
+
+ $app->run("install");
+ $app->run("list");
+ like $app->stdout, qr/Try-Tiny-0\.09/;
+
+ $app->dir->child("cpanfile")->spew(<<EOF);
+requires 'Try::Tiny', '>= 0.09, <= 0.12';
+EOF
+
+ $app->run("install");
+ $app->run("check");
+ like $app->stdout, qr/are satisfied/;
+
+ $app->run("list");
+ like $app->stdout, qr/Try-Tiny-0\.09/;
+
+ $app->run("update", "XYZ");
+ like $app->stderr, qr/Could not find module XYZ/;
+
+ $app->run("update", "Try::Tiny");
+ like $app->stderr, qr/installed Try-Tiny-0\.12.*upgraded from 0\.09/;
+
+ $app->run("check");
+ like $app->stdout, qr/are satisfied/;
+
+ $app->run("list");
+ like $app->stdout, qr/Try-Tiny-0\.12/;
+}
+
+done_testing;
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/carton.git
More information about the Pkg-perl-cvs-commits
mailing list