File Coverage

blib/lib/Module/Install/Repository.pm
Criterion Covered Total %
statement 11 50 22.0
branch 0 38 0.0
condition 0 3 0.0
subroutine 4 7 57.1
pod 0 1 0.0
total 15 99 15.1


line stmt bran cond sub pod time code
1             package Module::Install::Repository;
2              
3 1     1   110704 use strict;
  1         4  
  1         31  
4 1     1   16 use 5.005;
  1         3  
5 1     1   4 use vars qw($VERSION);
  1         22  
  1         80  
6             $VERSION = '0.08';
7              
8 1     1   4 use base qw(Module::Install::Base);
  1         2  
  1         562  
9              
10             sub _execute {
11 0     0     my ($command) = @_;
12 0           `$command`;
13             }
14              
15             sub auto_set_repository {
16 0     0 0   my $self = shift;
17              
18 0 0         return unless $Module::Install::AUTHOR;
19              
20 0           my $repo = _find_repo(\&_execute);
21 0 0         if ($repo) {
22 0           $self->repository($repo);
23             } else {
24 0           warn "Cannot determine repository URL\n";
25             }
26             }
27              
28             sub _find_repo {
29 0     0     my ($execute) = @_;
30              
31 0 0         if (-e ".git") {
    0          
    0          
    0          
    0          
32 0           foreach my $name (qw(origin github)) {
33 0           my $git_output = $execute->("git remote show -n $name");
34 0 0 0       if ($git_output =~ /Tracked remote branch/ && $git_output =~ /URL: (.*)$/m) {
35             # XXX Make it public clone URL, but this only works with github
36 0           my $git_url = $1;
37 0           $git_url =~ s![\w\-]+\@([^:]+):!git://$1/!;
38 0           return $git_url;
39             }
40             }
41              
42 0 0         if ($execute->('git svn info') =~ /URL: (.*)$/m) {
43 0           return $1;
44             }
45             } elsif (-e ".svn") {
46 0 0         if (`svn info` =~ /URL: (.*)$/m) {
47 0           return $1;
48             }
49             } elsif (-e "_darcs") {
50             # defaultrepo is better, but that is more likely to be ssh, not http
51 0 0         if (my $query_repo = `darcs query repo`) {
52 0 0         if ($query_repo =~ m!Default Remote: (http://.+)!) {
53 0           return $1;
54             }
55             }
56              
57 0 0         open my $handle, '<', '_darcs/prefs/repos' or return;
58 0           while (<$handle>) {
59 0           chomp;
60 0 0         return $_ if m!^http://!;
61             }
62             } elsif (-e ".hg") {
63 0 0         if ($execute->('hg paths') =~ /default = (.*)$/m) {
64 0           my $mercurial_url = $1;
65 0           $mercurial_url =~ s!^ssh://hg\@(bitbucket\.org/)!https://$1!;
66 0           return $mercurial_url;
67             }
68             } elsif (-e "$ENV{HOME}/.svk") {
69             # Is there an explicit way to check if it's an svk checkout?
70 0 0         my $svk_info = `svk info` or return;
71             SVK_INFO: {
72 0 0         if ($svk_info =~ /Mirrored From: (.*), Rev\./) {
  0            
73 0           return $1;
74             }
75              
76 0 0         if ($svk_info =~ m!Merged From: (/mirror/.*), Rev\.!) {
77 0 0         $svk_info = `svk info /$1` or return;
78 0           redo SVK_INFO;
79             }
80             }
81              
82 0           return;
83             }
84             }
85              
86             1;
87             __END__