also require gcc when we have buildflags
[puppet_rubygems.git] / manifests / gem.pp
1 # Installs gems that are slightly broken
2 # As a name it expects the name of the gem.
3 # If you want to want to install a certain version
4 # you have to append the version to the gem name:
5 #
6 #    install a version of mime-types:
7 #       rubygems::gem{'mime-types': }
8 #
9 #    install version 0.0.4 of ruby-net-ldap:
10 #       rubygems::gem{'ruby-net-ldap-0.0.4': }
11 #
12 #    uninstall polygot gem (until no such gem is anymore installed):
13 #       rubygems::gem{'polygot': ensure => absent }
14 #
15 #    uninstall ruby-net-ldap version 0.0.3
16 #       rubygems::gem{'ruby-net-ldap-0.0.3': ensure => absent }
17 #
18 # You can also set your own buildlfags, which will then install
19 # the gem in question by the gem command.
20 #
21 # You can also enforce to use the gem command to manage the gem
22 # by setting provider to `exec`.
23 #
24 define rubygems::gem(
25   $ensure = 'present',
26   $source = 'absent',
27   $provider = 'default',
28   $buildflags = 'absent',
29   $requiresgcc = false
30 ) {
31   require ::rubygems
32   if $requiresgcc or ($buildflags != 'absent') {
33     require ::gcc
34   }
35
36   if $name =~ /\-(\d|\.)+$/ {
37     $real_name = regsubst($name,'^(.*)-(\d|\.)+$','\1')
38     $gem_version = regsubst($name,'^(.*)-(\d+(\d|\.)+)$','\2')
39   } else {
40     $real_name = $name
41   }
42
43   if $source != 'absent' {
44     if $ensure != 'absent' {
45       require rubygems::gem::cachedir
46       exec{"get-gem-$name":
47         command => "/usr/bin/wget -O ${rubygems::gem::cachedir::dir}/$name.gem $source",
48         creates => "${rubygems::gem::cachedir::dir}/$name.gem",
49       }
50     } else {
51       file{"${rubygems::gem::cachedir::dir}/$name.gem":
52         ensure => 'absent';
53       }
54     }
55   }
56
57   if ($buildflags != 'absent') or ($provider == 'exec') {
58     if $gem_version {
59         $gem_version_str = "-v ${gem_version}"
60         $gem_version_check_str = $gem_version
61     } else {
62         $gem_version_check_str = '.*'
63     }
64
65     if $ensure == 'present' {
66         $gem_cmd = 'install'
67     } else {
68         $gem_cmd = 'uninstall -x'
69     }
70
71     if $buildflags != 'absent' {
72       $buildflags_str = "-- --build-flags ${buildflags}"
73     } else {
74       $buildflags_str = ''
75     }
76
77     exec{"manage_gem_${name}":
78         command => "gem ${gem_cmd} ${real_name} ${gem_version_str} ${buildflags_str}",
79     }
80
81     $gem_cmd_check_str = "gem list | egrep -q '^${real_name} \\(${gem_version_check_str}\\)\$'"
82     if $ensure == 'present' {
83         Exec["manage_gem_${name}"]{
84            unless => $gem_cmd_check_str
85         }
86     } else {
87         Exec["manage_gem_${name}"]{
88            onlyif => $gem_cmd_check_str
89         }
90     }
91   } else {
92     package{"$real_name":
93       ensure => $ensure ? {
94         'absent' => $ensure,
95         default => $gem_version ? {
96           undef => $ensure,
97           default => $gem_version
98         }
99       },
100       provider => gem,
101     }
102     if $source != 'absent' {
103       Package["$name"]{
104         source => "${rubygems::gem::cachedir::dir}/$name.gem"
105       }
106     }
107   }
108 }