aboutsummaryrefslogtreecommitdiffstats
path: root/perl-extras/bin/add_module.pl
blob: 0cf3b0cfd3fee038e952725cb92ec932e494eff6 (plain)
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
#!/usr/bin/env perl

use strict;
use warnings;

use IPC::Run3;
use LWP::Simple;
use YAML;
use File::Slurp;

my $cpan_meta_db_base = "http://cpanmetadb.appspot.com/v1.0/package";
my $cpan_mirror_base  = "http://search.cpan.org/CPAN/authors/id";
my $root_dir          = "/home/evdb/fixmystreet/perl-extras";
my $dist_list         = "$root_dir/install_order.txt";
my $dist_dir          = "$root_dir/distributions";
my $local_lib_dir     = "local-lib5";
my $fake_mirror       = "$root_dir/fake_mirror";
my $cpanm_cmd         = "perl $root_dir/cpanm --reinstall -L $local_lib_dir";

# my $cpanm_cmd =
#   "perl $dist_dir/cpanm --mirror $fake_mirror --mirror-only -L $local_lib_dir";

my $module = $ARGV[0] || die "Usage: $0 Dist::To::Add";

# try to install the distribution using cpanm
my $out = '';
my $cmd = "$cpanm_cmd $module";
print "  running '$cmd'\n";
run3( $cmd, undef, \$out, \$out )
  || die "Error running '$cmd'";

warn $out;

my @fetched_urls =
  map { s{.*(http://\S+).*}{$1}; $_ }
  grep { m{^Fetching http://search.cpan.org} }
  split /\n/, $out;

my @installed =
  grep { $_ }
  map { m{^Successfully (?:re)?installed (\S+).*} ? $1 : undef }
  split /\n/, $out;

use Data::Dumper;
local $Data::Dumper::Sortkeys = 1;
warn Dumper( { fetched => \@fetched_urls, installed => \@installed } );

foreach my $dist (@installed) {
    my ($url) = grep { m{/$dist\.} } @fetched_urls;
    my ($filename) = $url =~ m{([^/]+)$};

    print "  getting $filename from $url\n";

    is_success( getstore( $url, "$dist_dir/$filename" ) )
      || die "Error saving $url to $dist_dir/$filename";
    write_file( $dist_list, { append => 1 }, "$filename\n" );
}

# #
# # load list of modules at start and write it back at the end
# my %installed = ();
# my %looked_at = ();
#
# sub add_filename_to_list {
#     my $module = shift;
#     print "Adding '$module' to '$dist_list'\n";
#     append( $dist_list, "$module\n" );
#     getc;
# }
#
# # add_module('App::cpanminus');
# add_module($module_to_add);
#
# sub add_module {
#     my $module = shift;
#     print "--- $module ---\n";
#     return 1 if $installed{$module} || $looked_at{$module}++;
#
#     # get the distribution this module is in
#     my $yaml = get("$cpan_meta_db_base/$module")
#       || die "Can't get details from $cpan_meta_db_base/$module";
#     my $dist_info = Load($yaml);
#     my $distfile  = $dist_info->{distfile}
#       || die("Can't get distfile from returned YAML for $module");
#
#     # fetch the distribution from cpan
#     my ($filename) = $distfile =~ m{/([^/]*)$};
#     unless ( -e "$dist_dir/$filename" ) {
#         my $dist_url = "$cpan_mirror_base/$distfile";
#         print "  fetching '$dist_url' to '$dist_dir/$filename'\n";
#         is_success( getstore( $dist_url, "$dist_dir/$filename" ) )
#           || die "Could not fetch $dist_url";
#     }
#
#     # try to install the distribution using cpanm
#     my $out = '';
#     my $cmd = "$cpanm_cmd $dist_dir/$filename";
#     print "  running '$cmd'\n";
#     run3( $cmd, undef, \$out, \$out ) || die "Error running '$cmd'";
#
#     warn "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n";
#     warn $out;
#     warn "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
#
#     my @missing_modules =
#       map { s{^.*\s(\S+)$}{$1}; $_ }
#       grep { m/Couldn\'t find module or a distribution/ }
#       split /\n/, $out;
#
#     if ( scalar @missing_modules ) {
#         print "  missing: ", join( ', ', @missing_modules ), "\n";
#         add_module($_) for @missing_modules;
#         add_module($module);
#     }
#     elsif ( $out =~ m{Successfully installed } ) {
#
#         # add ourselves to the done lists
#         print "  Success with '$filename'\n";
#         $installed{$module}++;
#         add_filename_to_list($filename);
#     }
#     else {
#         die "No success and no missing modules for $module";
#     }
#
# }
#
# #