Merge pull request #4409 from iElectric/redmine

Add Redmine package and NixOS Service
This commit is contained in:
Domen Kožar 2014-10-07 13:41:46 +02:00
commit 1992bd1331
13 changed files with 1074 additions and 0 deletions

View file

@ -154,6 +154,7 @@
collectd = 144;
consul = 145;
mailpile = 146;
redmine = 147;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
@ -275,6 +276,7 @@
riemanndash = 138;
uhub = 142;
mailpile = 146;
redmine = 147;
# When adding a gid, make sure it doesn't match an existing uid. And don't use gids above 399!

View file

@ -174,6 +174,7 @@
./services/misc/nixos-manual.nix
./services/misc/nix-ssh-serve.nix
./services/misc/phd.nix
./services/misc/redmine.nix
./services/misc/rippled.nix
./services/misc/rogue.nix
./services/misc/siproxd.nix

View file

@ -0,0 +1,222 @@
{ config, lib, pkgs, ... }:
# TODO: support non-postgresql
with lib;
let
cfg = config.services.redmine;
ruby = pkgs.ruby;
rubyLibs = pkgs.rubyLibs;
databaseYml = ''
production:
adapter: postgresql
database: ${cfg.databaseName}
host: ${cfg.databaseHost}
password: ${cfg.databasePassword}
username: ${cfg.databaseUsername}
encoding: utf8
'';
configurationYml = ''
default:
# Absolute path to the directory where attachments are stored.
# The default is the 'files' directory in your Redmine instance.
# Your Redmine instance needs to have write permission on this
# directory.
# Examples:
# attachments_storage_path: /var/redmine/files
# attachments_storage_path: D:/redmine/files
attachments_storage_path: ${cfg.stateDir}/files
# Absolute path to the SCM commands errors (stderr) log file.
# The default is to log in the 'log' directory of your Redmine instance.
# Example:
# scm_stderr_log_file: /var/log/redmine_scm_stderr.log
scm_stderr_log_file: ${cfg.stateDir}/redmine_scm_stderr.log
${cfg.extraConfig}
'';
unpackTheme = unpack "theme";
unpackPlugin = unpack "plugin";
unpack = id: (name: source:
pkgs.stdenv.mkDerivation {
name = "redmine-${id}-${name}";
buildInputs = [ pkgs.unzip ];
buildCommand = ''
mkdir -p $out
cd $out
unpackFile ${source}
'';
});
in {
options = {
services.redmine = {
enable = mkOption {
type = types.bool;
default = false;
description = ''
Enable the redmine service.
'';
};
stateDir = mkOption {
type = types.str;
default = "/var/redmine";
description = "The state directory, logs and plugins are stored here";
};
extraConfig = mkOption {
type = types.str;
default = "";
description = "Extra configuration in configuration.yml";
};
themes = mkOption {
type = types.attrsOf types.path;
default = {};
description = "Set of themes";
};
plugins = mkOption {
type = types.attrsOf types.path;
default = {};
description = "Set of plugins";
};
#databaseType = mkOption {
# type = types.str;
# default = "postgresql";
# description = "Type of database";
#};
databaseHost = mkOption {
type = types.str;
default = "127.0.0.1";
description = "Database hostname";
};
databasePassword = mkOption {
type = types.str;
default = "";
description = "Database user password";
};
databaseName = mkOption {
type = types.str;
default = "redmine";
description = "Database name";
};
databaseUsername = mkOption {
type = types.str;
default = "redmine";
description = "Database user";
};
};
};
config = mkIf cfg.enable {
assertions = [
{ assertion = cfg.databasePassword != "";
message = "databasePassword must be set";
}
];
users.extraUsers = [
{ name = "redmine";
group = "redmine";
uid = config.ids.uids.redmine;
} ];
users.extraGroups = [
{ name = "redmine";
gid = config.ids.gids.redmine;
} ];
systemd.services.redmine = {
after = [ "network.target" "postgresql.service" ];
wantedBy = [ "multi-user.target" ];
environment.RAILS_ENV = "production";
environment.RAILS_ETC = "${cfg.stateDir}/config";
environment.RAILS_LOG = "${cfg.stateDir}/log";
environment.RAILS_VAR = "${cfg.stateDir}/var";
environment.RAILS_CACHE = "${cfg.stateDir}/cache";
environment.RAILS_PLUGINS = "${cfg.stateDir}/plugins";
environment.RAILS_PUBLIC = "${cfg.stateDir}/public";
environment.RAILS_TMP = "${cfg.stateDir}/tmp";
environment.SCHEMA = "${cfg.stateDir}/cache/schema.db";
environment.HOME = "${pkgs.redmine}/share/redmine";
environment.REDMINE_LANG = "en";
environment.GEM_HOME = "${pkgs.redmine}/share/redmine/vendor/bundle/ruby/1.9.1";
environment.GEM_PATH = "${rubyLibs.bundler}/lib/ruby/gems/1.9";
path = with pkgs; [
imagemagickBig
subversion
mercurial
cvs
config.services.postgresql.package
bazaar
gitAndTools.git
# once we build binaries for darc enable it
#darcs
];
preStart = ''
# TODO: use env vars
for i in plugins public/plugin_assets db files log config cache var/files tmp; do
mkdir -p ${cfg.stateDir}/$i
done
chown -R redmine:redmine ${cfg.stateDir}
chmod -R 755 ${cfg.stateDir}
rm -rf ${cfg.stateDir}/public/*
cp -R ${pkgs.redmine}/share/redmine/public/* ${cfg.stateDir}/public/
for theme in ${concatStringsSep " " (mapAttrsToList unpackTheme cfg.themes)}; do
ln -fs $theme/* ${cfg.stateDir}/public/themes/
done
rm -rf ${cfg.stateDir}/plugins/*
for plugin in ${concatStringsSep " " (mapAttrsToList unpackPlugin cfg.plugins)}; do
ln -fs $plugin/* ${cfg.stateDir}/plugins/''${plugin##*-redmine-plugin-}
done
ln -fs ${pkgs.writeText "database.yml" databaseYml} ${cfg.stateDir}/config/database.yml
ln -fs ${pkgs.writeText "configuration.yml" configurationYml} ${cfg.stateDir}/config/configuration.yml
if [ "${cfg.databaseHost}" = "127.0.0.1" ]; then
if ! test -e "${cfg.stateDir}/db-created"; then
psql postgres -c "CREATE ROLE redmine WITH LOGIN NOCREATEDB NOCREATEROLE NOCREATEUSER ENCRYPTED PASSWORD '${cfg.databasePassword}'"
${config.services.postgresql.package}/bin/createdb --owner redmine redmine || true
touch "${cfg.stateDir}/db-created"
fi
fi
cd ${pkgs.redmine}/share/redmine/
${ruby}/bin/rake db:migrate
${ruby}/bin/rake redmine:plugins:migrate
${ruby}/bin/rake redmine:load_default_data
${ruby}/bin/rake generate_secret_token
'';
serviceConfig = {
PermissionsStartOnly = true; # preStart must be run as root
Type = "simple";
User = "redmine";
Group = "redmine";
TimeoutSec = "300";
WorkingDirectory = "${pkgs.redmine}/share/redmine";
ExecStart="${ruby}/bin/ruby ${pkgs.redmine}/share/redmine/script/rails server webrick -e production -P ${cfg.stateDir}/redmine.pid";
};
};
};
}

View file

@ -0,0 +1,100 @@
Description: FHS through env vars
Forwarded: not-needed
Author: Jérémy Lal <kapouer@melix.org>
Last-Update: 2013-09-28
--- redmine.orig/app/models/attachment.rb
+++ redmine/app/models/attachment.rb
@@ -46,10 +46,10 @@ class Attachment < ActiveRecord::Base
"LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id"}
cattr_accessor :storage_path
- @@storage_path = Redmine::Configuration['attachments_storage_path'] || File.join(Rails.root, "files")
+ @@storage_path = Redmine::Configuration['attachments_storage_path'] || ENV['RAILS_VAR'] ? File.join(ENV['RAILS_VAR'], "files") : File.join(Rails.root, "files")
cattr_accessor :thumbnails_storage_path
- @@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails")
+ @@thumbnails_storage_path = ENV['RAILS_TMP'] ? File.join(ENV['RAILS_TMP'], "thumbnails") : File.join(Rails.root, "tmp", "thumbnails")
before_save :files_to_final_location
after_destroy :delete_from_disk
--- redmine.orig/lib/redmine/configuration.rb
+++ redmine/lib/redmine/configuration.rb
@@ -32,7 +32,7 @@ module Redmine
# * <tt>:file</tt>: the configuration file to load (default: config/configuration.yml)
# * <tt>:env</tt>: the environment to load the configuration for (default: Rails.env)
def load(options={})
- filename = options[:file] || File.join(Rails.root, 'config', 'configuration.yml')
+ filename = options[:file] || ENV['RAILS_ETC'] ? File.join(ENV['RAILS_ETC'], 'configuration.yml') : File.join(Rails.root, 'config', 'configuration.yml')
env = options[:env] || Rails.env
@config = @defaults.dup
@@ -103,7 +103,7 @@ module Redmine
end
def load_deprecated_email_configuration(env)
- deprecated_email_conf = File.join(Rails.root, 'config', 'email.yml')
+ deprecated_email_conf = ENV['RAILS_ETC'] ? File.join(ENV['RAILS_ETC'], 'email.yml') : File.join(Rails.root, 'config', 'email.yml')
if File.file?(deprecated_email_conf)
warn "Storing outgoing emails configuration in config/email.yml is deprecated. You should now store it in config/configuration.yml using the email_delivery setting."
@config.merge!({'email_delivery' => load_from_yaml(deprecated_email_conf, env)})
--- redmine.orig/lib/redmine/export/pdf.rb
+++ redmine/lib/redmine/export/pdf.rb
@@ -38,7 +38,7 @@ module Redmine
attr_accessor :footer_date
def initialize(lang, orientation='P')
- @@k_path_cache = Rails.root.join('tmp', 'pdf')
+ @@k_path_cache = ENV['RAILS_TMP'] ? File.join(ENV['RAILS_TMP'], 'pdf') : Rails.root.join('tmp', 'pdf')
FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache)
set_language_if_valid lang
pdf_encoding = l(:general_pdf_encoding).upcase
--- redmine.orig/config/application.rb
+++ redmine/config/application.rb
@@ -52,8 +63,21 @@ module RedmineApp
# Do not include all helpers
config.action_controller.include_all_helpers = false
+ # move tmp directory to RAILS_TMP
+ config.paths['tmp'] = ENV['RAILS_TMP']
+
config.session_store :cookie_store, :key => '_redmine_session'
+ # log path
+ config.paths['log'] = File.join(ENV['RAILS_LOG'], "#{Rails.env}.log") unless !ENV['RAILS_LOG']
+
+ config.paths['public'] = ENV['RAILS_PUBLIC'] unless !ENV['RAILS_PUBLIC']
+
+ config.cache_store = :file_store, File.join(ENV['RAILS_TMP'], "cache")
+
+ # Set Active Record's database.yml path
+ config.paths['config/database'] = File.join(ENV['RAILS_ETC'], 'database.yml') unless !ENV['RAILS_ETC']
+
if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb'))
instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb'))
end
--- redmine.orig/lib/plugins/rfpdf/lib/tcpdf.rb
+++ redmine/lib/plugins/rfpdf/lib/tcpdf.rb
@@ -89,10 +89,10 @@ class TCPDF
@@k_small_ratio = 2/3.0
cattr_accessor :k_path_cache
- @@k_path_cache = Rails.root.join('tmp')
+ @@k_path_cache = ENV['RAILS_TMP'] ? ENV['RAILS_TMP'] : Rails.root.join('tmp')
cattr_accessor :k_path_url_cache
- @@k_path_url_cache = Rails.root.join('tmp')
+ @@k_path_url_cache = ENV['RAILS_TMP'] ? ENV['RAILS_TMP'] : Rails.root.join('tmp')
attr_accessor :barcode
--- redmine.orig/lib/redmine/scm/adapters/abstract_adapter.rb
+++ redmine/lib/redmine/scm/adapters/abstract_adapter.rb
@@ -222,7 +222,7 @@ module Redmine
if @stderr_log_file.nil?
writable = false
path = Redmine::Configuration['scm_stderr_log_file'].presence
- path ||= Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
+ path ||= ENV['RAILS_LOG'] ? File.join(ENV['RAILS_LOG'], "#{Rails.env}.scm.stderr.log").to_s : Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
if File.exists?(path)
if File.file?(path) && File.writable?(path)
writable = true

View file

@ -0,0 +1,72 @@
Description: Externalize session config to yml in /etc
Forwarded: not-needed
Author: Jérémy Lal <kapouer@melix.org>
Last-Update: 2010-01-10
--- redmine.orig/lib/tasks/initializers.rake
+++ redmine/lib/tasks/initializers.rake
@@ -1,11 +1,12 @@
desc 'Generates a secret token for the application.'
+task :generate_secret_token do
-file 'config/initializers/secret_token.rb' do
- path = File.join(Rails.root, 'config', 'initializers', 'secret_token.rb')
- secret = SecureRandom.hex(40)
- File.open(path, 'w') do |f|
- f.write <<"EOF"
-# This file was generated by 'rake generate_secret_token', and should
+filename = ENV['YML_SESSION_FILENAME'] ? ENV['YML_SESSION_FILENAME'] : 'session.yml'
+path = File.join(ENV['RAILS_ETC'] ? ENV['RAILS_ETC'] : File.join(Rails.root, 'config'), filename)
+secret = SecureRandom.hex(40)
+File.open(path, 'w') do |f|
+ f.write <<"EOF"
+# This file was generated by 'rake generate_session_store',
# not be made visible to public.
# If you have a load-balancing Redmine cluster, you will need to use the
# same version of this file on each machine. And be sure to restart your
@@ -15,10 +18,18 @@ file 'config/initializers/secret_token.r
# change this key, all old sessions will become invalid! Make sure the
# secret is at least 30 characters and all random, no regular words or
# you'll be exposed to dictionary attacks.
-RedmineApp::Application.config.secret_token = '#{secret}'
+
+production:
+ key: _redmine_
+ secret: #{secret}
+
+development:
+ key: _redmine_
+ secret: #{secret}
+
+test:
+ key: _redmine_
+ secret: #{secret}
EOF
end
end
-
-desc 'Generates a secret token for the application.'
-task :generate_secret_token => ['config/initializers/secret_token.rb']
--- redmine.orig/config/application.rb
+++ redmine/config/application.rb
@@ -66,7 +66,20 @@ module RedmineApp
# move tmp directory to RAILS_TMP
config.paths['tmp'] = ENV['RAILS_TMP']
- config.session_store :cookie_store, :key => '_redmine_session'
+ # loads cookie based session session and secret keys
+ # this is needed here because initializers are loaded after plugins,
+ # and some plugins initialize ActionController which requires a secret to be set.
+ # crash if file not found
+ relativeUrlRoot = ENV['RAILS_RELATIVE_URL_ROOT']
+ filename = ENV['RAILS_ETC'] ? File.join(ENV['RAILS_ETC'], 'session.yml') : File.join(File.dirname(__FILE__), '..', 'session.yml')
+ if File.exists?(filename)
+ sessionconfig = YAML::load_file(filename)
+ config.session_store :cookie_store, :key => sessionconfig[Rails.env]['key'], :path => (relativeUrlRoot.blank?) ? '/' : relativeUrlRoot
+ config.secret_token = sessionconfig[Rails.env]['secret']
+ else
+ # temporary settings before session.yml is created
+ config.session_store :cookie_store, :key => '_redmine_session', :path => (relativeUrlRoot.blank?) ? '/' : relativeUrlRoot
+ end
# log path
config.paths['log'] = File.join(ENV['RAILS_LOG'], "#{Rails.env}.log") unless !ENV['RAILS_LOG']

View file

@ -0,0 +1,11 @@
--- redmine.orig/lib/redmine/plugin.rb
+++ redmine/lib/redmine/plugin.rb
@@ -47,7 +47,7 @@ module Redmine #:nodoc:
self.directory = File.join(Rails.root, 'plugins')
cattr_accessor :public_directory
- self.public_directory = File.join(Rails.root, 'public', 'plugin_assets')
+ self.public_directory = ENV['RAILS_TMP'] ? File.join(ENV['RAILS_TMP'], 'plugin_assets') : File.join(Rails.root, 'public', 'plugin_assets')
@registered_plugins = {}
class << self

View file

@ -0,0 +1,152 @@
GEM
remote: https://rubygems.org/
specs:
actionmailer (3.2.19)
actionpack (= 3.2.19)
mail (~> 2.5.4)
actionpack (3.2.19)
activemodel (= 3.2.19)
activesupport (= 3.2.19)
builder (~> 3.0.0)
erubis (~> 2.7.0)
journey (~> 1.0.4)
rack (~> 1.4.5)
rack-cache (~> 1.2)
rack-test (~> 0.6.1)
sprockets (~> 2.2.1)
activemodel (3.2.19)
activesupport (= 3.2.19)
builder (~> 3.0.0)
activerecord (3.2.19)
activemodel (= 3.2.19)
activesupport (= 3.2.19)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activeresource (3.2.19)
activemodel (= 3.2.19)
activesupport (= 3.2.19)
activesupport (3.2.19)
i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0)
arel (3.0.3)
awesome_nested_set (2.1.6)
activerecord (>= 3.0.0)
builder (3.0.0)
capybara (2.1.0)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
childprocess (0.5.5)
ffi (~> 1.0, >= 1.0.11)
coderay (1.1.0)
erubis (2.7.0)
fastercsv (1.5.5)
ffi (1.9.5)
hike (1.2.3)
i18n (0.6.11)
journey (1.0.4)
jquery-rails (2.0.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
json (1.8.1)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
metaclass (0.0.4)
mime-types (1.25.1)
mini_portile (0.6.0)
mocha (1.0.0)
metaclass (~> 0.0.1)
multi_json (1.10.1)
net-ldap (0.3.1)
nokogiri (1.6.3.1)
mini_portile (= 0.6.0)
pg (0.17.1)
polyglot (0.3.5)
rack (1.4.5)
rack-cache (1.2)
rack (>= 0.4)
rack-openid (1.4.2)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
rack-ssl (1.3.4)
rack
rack-test (0.6.2)
rack (>= 1.0)
rails (3.2.19)
actionmailer (= 3.2.19)
actionpack (= 3.2.19)
activerecord (= 3.2.19)
activeresource (= 3.2.19)
activesupport (= 3.2.19)
bundler (~> 1.0)
railties (= 3.2.19)
railties (3.2.19)
actionpack (= 3.2.19)
activesupport (= 3.2.19)
rack-ssl (~> 1.3.2)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0)
rake (10.1.1)
rdoc (3.12.2)
json (~> 1.4)
redcarpet (2.3.0)
rmagick (2.13.3)
ruby-openid (2.3.0)
rubyzip (1.1.6)
selenium-webdriver (2.43.0)
childprocess (~> 0.5)
multi_json (~> 1.0)
rubyzip (~> 1.0)
websocket (~> 1.0)
shoulda (3.3.2)
shoulda-context (~> 1.0.1)
shoulda-matchers (~> 1.4.1)
shoulda-context (1.0.2)
shoulda-matchers (1.4.1)
activesupport (>= 3.0.0)
sprockets (2.2.2)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
thor (0.19.1)
tilt (1.4.1)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.41)
websocket (1.2.1)
xpath (2.0.0)
nokogiri (~> 1.3)
yard (0.8.7.4)
PLATFORMS
ruby
DEPENDENCIES
activerecord-jdbc-adapter (~> 1.3.2)
activerecord-jdbcpostgresql-adapter
awesome_nested_set (= 2.1.6)
builder (= 3.0.0)
capybara (~> 2.1.0)
coderay (~> 1.1.0)
fastercsv (~> 1.5.0)
jquery-rails (~> 2.0.2)
mime-types
mocha (~> 1.0.0)
net-ldap (~> 0.3.1)
pg (>= 0.11.0)
rack-openid
rails (= 3.2.19)
rake (~> 10.1.1)
rdoc (>= 2.4.2)
redcarpet (~> 2.3.0)
rmagick (>= 2.0.0)
ruby-openid (~> 2.3.0)
selenium-webdriver
shoulda (~> 3.3.2)
yard

View file

@ -0,0 +1,332 @@
[
{
name = "actionmailer";
hash = "cd9f0b22f755b0adeae13cf949adaf63fa1c068c72d0a100572c6a11aecd3ba7";
url = "http://rubygems.org/downloads/actionmailer-3.2.19.gem";
version = "3.2.19";
}
{
name = "actionpack";
hash = "c58ca2342aff2062f4f478551ce46d81918ac93200bc62d099764d2cd7499fcd";
url = "http://rubygems.org/downloads/actionpack-3.2.19.gem";
version = "3.2.19";
}
{
name = "activemodel";
hash = "4ea3abf790eca9ee8228e9e2a465350e258294270a639b63f0e1dfad236fe70e";
url = "http://rubygems.org/downloads/activemodel-3.2.19.gem";
version = "3.2.19";
}
{
name = "activerecord";
hash = "052945ad510744aaa3e35a817a6f515a2316e7dd96df6460f75b36067bb60372";
url = "http://rubygems.org/downloads/activerecord-3.2.19.gem";
version = "3.2.19";
}
{
name = "activeresource";
hash = "8617d24537ca937cc67aac46aaa29782510d66136605426d0a23a3585a839daf";
url = "http://rubygems.org/downloads/activeresource-3.2.19.gem";
version = "3.2.19";
}
{
name = "activesupport";
hash = "2c837a59250da14b12a6b0cfb6774f0afae90aa749fd96ad4347344d8417ad3d";
url = "http://rubygems.org/downloads/activesupport-3.2.19.gem";
version = "3.2.19";
}
{
name = "arel";
hash = "c0006e2169deee3b8cc2d258296388822eeb2db59832450b9b7316e1387d0da4";
url = "http://rubygems.org/downloads/arel-3.0.3.gem";
version = "3.0.3";
}
{
name = "awesome_nested_set";
hash = "0dcd801aea5048f5ab907b62b4174b6763b191eaa4e1e11bb83f996f01349af8";
url = "http://rubygems.org/downloads/awesome_nested_set-2.1.6.gem";
version = "2.1.6";
}
{
name = "builder";
hash = "fbd3e15e5de02245f7d649b3415b2c2875cdc9a14dccde89aa30fc14a314618e";
url = "http://rubygems.org/downloads/builder-3.0.0.gem";
version = "3.0.0";
}
{
name = "capybara";
hash = "a9a19f8d6bb2dfcb1f05ea3e1727cb556d1cba0d234d1712b481e8d4f7bbb91e";
url = "http://rubygems.org/downloads/capybara-2.1.0.gem";
version = "2.1.0";
}
{
name = "childprocess";
hash = "9b583295a11932d2eeffa1e8f5b8fb2fb0064a2f0111ad98c3b752b94f80bf33";
url = "http://rubygems.org/downloads/childprocess-0.5.5.gem";
version = "0.5.5";
}
{
name = "coderay";
hash = "5a943c59e36f7ef9dd2677855735656413af02e3f302431e9c548aabe89f3c15";
url = "http://rubygems.org/downloads/coderay-1.1.0.gem";
version = "1.1.0";
}
{
name = "erubis";
hash = "63653f5174a7997f6f1d6f465fbe1494dcc4bdab1fb8e635f6216989fb1148ba";
url = "http://rubygems.org/downloads/erubis-2.7.0.gem";
version = "2.7.0";
}
{
name = "fastercsv";
hash = "d098199e62e4e10eec436a9ea9b8c189dacd5c06f2825f00d1e0f1c29fdbc3b5";
url = "http://rubygems.org/downloads/fastercsv-1.5.5.gem";
version = "1.5.5";
}
{
name = "ffi";
hash = "0d2ef90163eef8545689e8dfc27fb1245a2d82e3500d587de1e38290629e662f";
url = "http://rubygems.org/downloads/ffi-1.9.5.gem";
version = "1.9.5";
}
{
name = "hike";
hash = "154e2f2593845e5bcd8ed2ba3092600c55c6ad8c630722857de3fdaf334ccc44";
url = "http://rubygems.org/downloads/hike-1.2.3.gem";
version = "1.2.3";
}
{
name = "i18n";
hash = "b37dda25b30484f2674a851e24ae098a38564a61c976fa91a34bf8fceaa3923b";
url = "http://rubygems.org/downloads/i18n-0.6.11.gem";
version = "0.6.11";
}
{
name = "journey";
hash = "7454b8612530784000fbb17ea2df749a71b70702a0ac8ebef4a1e7f05aecc10f";
url = "http://rubygems.org/downloads/journey-1.0.4.gem";
version = "1.0.4";
}
{
name = "jquery-rails";
hash = "cc4eab342fb3b1fcbb2fc1c9a61b09ecd86d795b1f74d607994b0bc6fd5ef444";
url = "http://rubygems.org/downloads/jquery-rails-2.0.3.gem";
version = "2.0.3";
}
{
name = "json";
hash = "961bfbbfa9fda1e857e9c791e964e6664e0d43bf687b19669dfbc7cdbc5e0200";
url = "http://rubygems.org/downloads/json-1.8.1.gem";
version = "1.8.1";
}
{
name = "mail";
hash = "446585c38b062121252688dcc9cc70af1f470822e30db021bb97d185969e257c";
url = "http://rubygems.org/downloads/mail-2.5.4.gem";
version = "2.5.4";
}
{
name = "metaclass";
hash = "8569685c902108b1845be4e5794d646f2a8adcb0280d7651b600dab0844fe942";
url = "http://rubygems.org/downloads/metaclass-0.0.4.gem";
version = "0.0.4";
}
{
name = "mime-types";
hash = "88ef3c596481678710ffd4018fa40f1999b02d97babea39682ba7d5badd21f56";
url = "http://rubygems.org/downloads/mime-types-1.25.1.gem";
version = "1.25.1";
}
{
name = "mini_portile";
hash = "762b3e241362de24b2eb2bb1b98638399b931e9e51bece5f8e2df7611eb16c26";
url = "http://rubygems.org/downloads/mini_portile-0.6.0.gem";
version = "0.6.0";
}
{
name = "mocha";
hash = "788fd93c8009a7e0eebd155509953e5987f4681902aad666a294283baa09899a";
url = "http://rubygems.org/downloads/mocha-1.0.0.gem";
version = "1.0.0";
}
{
name = "multi_json";
hash = "2c98979877e87df0b338ebf5c86091b390f53d62c11a8232bd51ca007e0b82d2";
url = "http://rubygems.org/downloads/multi_json-1.10.1.gem";
version = "1.10.1";
}
{
name = "net-ldap";
hash = "953551665fb0d398740a72a26314c6d34bd70fa35419c96dc58351f17d9a5081";
url = "http://rubygems.org/downloads/net-ldap-0.3.1.gem";
version = "0.3.1";
}
{
name = "nokogiri";
hash = "91761a654439406b5bed71adf6092d49829e26332b4c0e7c8a23a2e628442585";
url = "http://rubygems.org/downloads/nokogiri-1.6.3.1.gem";
version = "1.6.3.1";
}
{
name = "pg";
hash = "e7933e8f7f184c28e820ed85ddfb3ad8a13933b2b2ab8656aa8f81cb0aa610a6";
url = "http://rubygems.org/downloads/pg-0.17.1.gem";
version = "0.17.1";
}
{
name = "polyglot";
hash = "59d66ef5e3c166431c39cb8b7c1d02af419051352f27912f6a43981b3def16af";
url = "http://rubygems.org/downloads/polyglot-0.3.5.gem";
version = "0.3.5";
}
{
name = "rack";
hash = "f7bf3faa8e09a2ff26475372de36a724e7470d6bdc33d189a0ec34b49605f308";
url = "http://rubygems.org/downloads/rack-1.4.5.gem";
version = "1.4.5";
}
{
name = "rack-cache";
hash = "02bfed05f8b3266db804f2fa445801636ca2c6d211a3137ec796f88af5756e1c";
url = "http://rubygems.org/downloads/rack-cache-1.2.gem";
version = "1.2";
}
{
name = "rack-openid";
hash = "8cd2305e738463a7da98791f9ac4df4cf3f6ed27908d982350430694ac2fe869";
url = "http://rubygems.org/downloads/rack-openid-1.4.2.gem";
version = "1.4.2";
}
{
name = "rack-ssl";
hash = "d703764fa2a0d44a2163d6add65be89f5dba4477d1959b90d3727682a9c37dcf";
url = "http://rubygems.org/downloads/rack-ssl-1.3.4.gem";
version = "1.3.4";
}
{
name = "rack-test";
hash = "7e920b6aac888e4a3846e5997fb1cbf456bdb5846322b58dc31697a54a38b306";
url = "http://rubygems.org/downloads/rack-test-0.6.2.gem";
version = "0.6.2";
}
{
name = "rails";
hash = "33b64cf78dfcf3206d961ce03e8fe6d260081da696e60da39d0b2a4a160fe22b";
url = "http://rubygems.org/downloads/rails-3.2.19.gem";
version = "3.2.19";
}
{
name = "railties";
hash = "c569009ee5c005190d208ac228087fdc094b10c6f0cf209f1d12c552b447cc10";
url = "http://rubygems.org/downloads/railties-3.2.19.gem";
version = "3.2.19";
}
{
name = "rake";
hash = "85e446590871dd3469c80dfe70a0296c20b76a9006af6b728c1f47d0b460412d";
url = "http://rubygems.org/downloads/rake-10.1.1.gem";
version = "10.1.1";
}
{
name = "rdoc";
hash = "a8e2b78f7e5ec4cc4716cd863975645f2f2377dc6db267a15e427e5fae2633ed";
url = "http://rubygems.org/downloads/rdoc-3.12.2.gem";
version = "3.12.2";
}
{
name = "redcarpet";
hash = "5c9bcc307fba97ff5a25eec74f08365c17e929d2a5c707db32d6fc99ec81f0b9";
url = "http://rubygems.org/downloads/redcarpet-2.3.0.gem";
version = "2.3.0";
}
{
name = "rmagick";
hash = "109f3b8be90afdea9abbdd2a79a955cd808b5cad65d937ed12676da22870d3b4";
url = "http://rubygems.org/downloads/rmagick-2.13.3.gem";
version = "2.13.3";
}
{
name = "ruby-openid";
hash = "f69ed004e95f7094e23bfd8bc9ebfb1dc88a7b46637252ca2907a1189870ea7b";
url = "http://rubygems.org/downloads/ruby-openid-2.3.0.gem";
version = "2.3.0";
}
{
name = "rubyzip";
hash = "a996435ee9698be6a09d3748f4d23ee15aaf45cbfef1749def165af6ea3c0a9e";
url = "http://rubygems.org/downloads/rubyzip-1.1.6.gem";
version = "1.1.6";
}
{
name = "selenium-webdriver";
hash = "09fe4374d1541cb45403ad1238c2d88129f3afb985218635af087a06c99a521a";
url = "http://rubygems.org/downloads/selenium-webdriver-2.43.0.gem";
version = "2.43.0";
}
{
name = "shoulda";
hash = "52e70b71cbfb7c01dace14e268a62d86c21ddd1e5ec0116c8b1e632d8e04e412";
url = "http://rubygems.org/downloads/shoulda-3.3.2.gem";
version = "3.3.2";
}
{
name = "shoulda-context";
hash = "ee5559aa13248c70fdec6868a3c144adf7438c904c59d1a76b04a002e5151de5";
url = "http://rubygems.org/downloads/shoulda-context-1.0.2.gem";
version = "1.0.2";
}
{
name = "shoulda-matchers";
hash = "c35693cbfa84213212dffbc2c87487427ef364927340151329a842f0a06086b9";
url = "http://rubygems.org/downloads/shoulda-matchers-1.4.1.gem";
version = "1.4.1";
}
{
name = "sprockets";
hash = "fae893b7e86e83c1936f6f2a64db3550510f86eabdd5fa9f0f23fb25d7e0cf96";
url = "http://rubygems.org/downloads/sprockets-2.2.2.gem";
version = "2.2.2";
}
{
name = "thor";
hash = "9ff834f031b5550c743bb8a3139317fefdae9cdebd02d60de376658f427fe522";
url = "http://rubygems.org/downloads/thor-0.19.1.gem";
version = "0.19.1";
}
{
name = "tilt";
hash = "39820562c4f5db45fe18de87ccc30a0e77a998bf5334b1d8c10a2f7dbc1f5903";
url = "http://rubygems.org/downloads/tilt-1.4.1.gem";
version = "1.4.1";
}
{
name = "treetop";
hash = "ffa68f201c0f62c26b0a1d13233d73194400596964696843f87ebb5d812f12ff";
url = "http://rubygems.org/downloads/treetop-1.4.15.gem";
version = "1.4.15";
}
{
name = "tzinfo";
hash = "381b22fd1744a35d0a0239f563f505773681e626e6d900063b14cb9b1b68e98c";
url = "http://rubygems.org/downloads/tzinfo-0.3.41.gem";
version = "0.3.41";
}
{
name = "websocket";
hash = "e626c8c3e8593735d900265fb1fc3439fd06b394069860177d8f40733b12ae9e";
url = "http://rubygems.org/downloads/websocket-1.2.1.gem";
version = "1.2.1";
}
{
name = "xpath";
hash = "9ca4a1cc88d9ab16c591468cce7b5d00ee06a8a76b841f8438970c7a44c86c12";
url = "http://rubygems.org/downloads/xpath-2.0.0.gem";
version = "2.0.0";
}
{
name = "yard";
hash = "e65a26f9b9dc6e2aa9b1d1d2e1a45bee3edf540a6a7e6c30fa6aa1df7f7a29b4";
url = "http://rubygems.org/downloads/yard-0.8.7.4.gem";
version = "0.8.7.4";
}
]

View file

@ -0,0 +1,6 @@
to regenerate Gemfile.nix and Gemfile.lock you need to
% nix-build bootstrap.nix
% cp result/Gemfile.nix ./
% cp result/Gemfile.lock ./

View file

@ -0,0 +1,45 @@
{ pkgs ? import <nixpkgs> {}
}:
with pkgs;
let
in stdenv.mkDerivation rec {
version = "2.5.2";
name = "redmine-${version}";
__noChroot = true;
src = fetchurl {
url = "http://www.redmine.org/releases/${name}.tar.gz";
sha256 = "0x0zwxyj4dwbk7l64s3lgny10mjf0ba8jwrbafsm4d72sncmacv0";
};
buildInputs = [
ruby rubyLibs.bundler libiconv libxslt libxml2 pkgconfig
libffi imagemagickBig postgresql which stdenv
];
installPhase = ''
unset http_proxy
unset ftp_proxy
cp -R . $out
cp ${./generate_nix_requirements.rb} $out/generate_nix_requirements.rb
cd $out
cat > config/database.yml <<EOF
production:
adapter: postgresql
EOF
bundle config --local build.nokogiri --use-system-libraries \
--with-iconv-dir=${libiconv} \
--with-xslt-dir=${libxslt} \
--with-xml2-dir=${libxml2} \
--with-pkg-config \
--with-pg-config=${postgresql}/bin/pg_config
bundle install --verbose --without development test rmagick --path /tmp/redmine-${version}
HOME="/tmp/redmine-${version}" ruby generate_nix_requirements.rb
rm -R /tmp/gems
'';
}

View file

@ -0,0 +1,73 @@
{ stdenv, fetchurl, ruby, rubyLibs, libiconv, libxslt, libxml2, pkgconfig, libffi, imagemagickBig, postgresql }:
let
gemspec = map (gem: fetchurl { url=gem.url; sha256=gem.hash; }) (import ./Gemfile.nix);
in stdenv.mkDerivation rec {
version = "2.5.2";
name = "redmine-${version}";
src = fetchurl {
url = "http://www.redmine.org/releases/${name}.tar.gz";
sha256 = "0x0zwxyj4dwbk7l64s3lgny10mjf0ba8jwrbafsm4d72sncmacv0";
};
# taken from redmine (2.5.1-2~bpo70+3) in debian wheezy-backports
# needed to separate run-time and build-time directories
patches = [
./2002_FHS_through_env_vars.patch
./2004_FHS_plugins_assets.patch
./2003_externalize_session_config.patch
];
postPatch = ''
substituteInPlace lib/redmine/plugin.rb --replace "File.join(Rails.root, 'plugins')" "ENV['RAILS_PLUGINS']"
substituteInPlace lib/redmine/plugin.rb --replace "File.join(Rails.root, 'plugins', id.to_s, 'db', 'migrate')" "File.join(ENV['RAILS_PLUGINS'], id.to_s, 'db', 'migrate')"
substituteInPlace config/routes.rb --replace '"plugins/*", Rails.root' 'ENV["RAILS_PLUGINS"] + "/*"'
'';
buildInputs = [
ruby rubyLibs.bundler libiconv libxslt libxml2 pkgconfig libffi
imagemagickBig postgresql
];
installPhase = ''
mkdir -p $out/share/redmine/
cp -R . $out/share/redmine/
cd $out/share/redmine
ln -s ${./Gemfile.lock} Gemfile.lock
export HOME=$(pwd)
cat > config/database.yml <<EOF
production:
adapter: postgresql
EOF
mkdir -p vendor/cache
${stdenv.lib.concatStrings (map (gem: "ln -s ${gem} vendor/cache/${gem.name};") gemspec)}
bundle config build.nokogiri \
--use-system-libraries \
--with-iconv-dir=${libiconv} \
--with-xslt-dir=${libxslt} \
--with-xml2-dir=${libxml2} \
--with-pkg-config \
--with-pg-config=${postgresql}/bin/pg_config
bundle install --verbose --local --deployment
# make sure we always load pg package
echo "gem \"pg\"" >> Gemfile
# make rails server happy
mkdir -p tmp/pids
# cleanup
rm config/database.yml
'';
meta = with stdenv.lib; {
homepage = http://www.redmine.org/;
platforms = platforms.linux;
maintainers = [ maintainers.garbas ];
license = licenses.gpl2;
};
}

View file

@ -0,0 +1,56 @@
#!/usr/bin/env ruby
require 'rubygems'
require 'bundler'
require 'fileutils'
require 'net/http'
require 'net/https'
require 'uri'
TMP_DIR = "/tmp/gems"
FileUtils.rm_rf(TMP_DIR) if File.exists?(TMP_DIR)
FileUtils.mkdir TMP_DIR
GEMSERVER = "http://rubygems.org"
# inspect Gemfile.lock
lockfile = Bundler::LockfileParser.new(Bundler.read_file("Gemfile.lock"))
to_mirror = {}
uri = URI(GEMSERVER)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
requirements = {}
lockfile.specs.each do |s|
possible_gem_name = "#{s.name}-#{s.version.to_s}.gem"
Dir.chdir TMP_DIR do
filename = `gem fetch #{s.name} -v #{s.version.to_s}`.split()[1]
hash = `sha256sum #{filename}.gem`
url = "#{GEMSERVER}/downloads/#{filename}.gem"
puts url
requirements[s.name] = { :version => s.version.to_s,
:hash => hash.split().first,
:url => url,}
end
end
filename = 'Gemfile.nix'
File.open(filename, 'w') do |file|
file.puts "["
requirements.each do |name, info|
file.puts "{"
file.puts ['name = ', '"', name, '";'].join('')
file.puts ['hash = ', '"', info[:hash], '";'].join('')
file.puts ['url = ', '"', info[:url], '";'].join('')
file.puts ['version = ', '"', info[:version], '";'].join('')
file.puts "}"
end
file.puts "]"
end

View file

@ -2083,6 +2083,8 @@ let
privateer = callPackage ../games/privateer { };
redmine = callPackage ../applications/version-management/redmine { };
rtmpdump = callPackage ../tools/video/rtmpdump { };
reaverwps = callPackage ../tools/networking/reaver-wps {};