about summary refs log tree commit diff
path: root/pkgs/applications/version-management
diff options
context:
space:
mode:
authorDomen Kožar <domen@dev.si>2014-10-07 10:52:45 +0200
committerDomen Kožar <domen@dev.si>2014-10-07 10:54:22 +0200
commit8f27aedb46bbf91ce2cba3b43e016511b1a422a9 (patch)
tree184c4ef750b14c17625fa11bd2823785ee47fb81 /pkgs/applications/version-management
parente42f5edb7c5cfd617ae81207e6c4b0fd3bb52e72 (diff)
downloadnixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.tar
nixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.tar.gz
nixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.tar.bz2
nixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.tar.lz
nixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.tar.xz
nixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.tar.zst
nixlib-8f27aedb46bbf91ce2cba3b43e016511b1a422a9.zip
add redmine package
Diffstat (limited to 'pkgs/applications/version-management')
-rw-r--r--pkgs/applications/version-management/redmine/2002_FHS_through_env_vars.patch100
-rw-r--r--pkgs/applications/version-management/redmine/2003_externalize_session_config.patch72
-rw-r--r--pkgs/applications/version-management/redmine/2004_FHS_plugins_assets.patch11
-rw-r--r--pkgs/applications/version-management/redmine/Gemfile.lock152
-rw-r--r--pkgs/applications/version-management/redmine/Gemfile.nix332
-rw-r--r--pkgs/applications/version-management/redmine/README6
-rw-r--r--pkgs/applications/version-management/redmine/bootstrap.nix45
-rw-r--r--pkgs/applications/version-management/redmine/default.nix73
-rw-r--r--pkgs/applications/version-management/redmine/generate_nix_requirements.rb56
9 files changed, 847 insertions, 0 deletions
diff --git a/pkgs/applications/version-management/redmine/2002_FHS_through_env_vars.patch b/pkgs/applications/version-management/redmine/2002_FHS_through_env_vars.patch
new file mode 100644
index 000000000000..889b8c930e73
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/2002_FHS_through_env_vars.patch
@@ -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
diff --git a/pkgs/applications/version-management/redmine/2003_externalize_session_config.patch b/pkgs/applications/version-management/redmine/2003_externalize_session_config.patch
new file mode 100644
index 000000000000..39af8e02e556
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/2003_externalize_session_config.patch
@@ -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']
diff --git a/pkgs/applications/version-management/redmine/2004_FHS_plugins_assets.patch b/pkgs/applications/version-management/redmine/2004_FHS_plugins_assets.patch
new file mode 100644
index 000000000000..d9a6844a6a35
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/2004_FHS_plugins_assets.patch
@@ -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
diff --git a/pkgs/applications/version-management/redmine/Gemfile.lock b/pkgs/applications/version-management/redmine/Gemfile.lock
new file mode 100644
index 000000000000..7d83583c019d
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/Gemfile.lock
@@ -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
diff --git a/pkgs/applications/version-management/redmine/Gemfile.nix b/pkgs/applications/version-management/redmine/Gemfile.nix
new file mode 100644
index 000000000000..a7339097b146
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/Gemfile.nix
@@ -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";
+}
+]
diff --git a/pkgs/applications/version-management/redmine/README b/pkgs/applications/version-management/redmine/README
new file mode 100644
index 000000000000..1cc4772568a4
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/README
@@ -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 ./
+
diff --git a/pkgs/applications/version-management/redmine/bootstrap.nix b/pkgs/applications/version-management/redmine/bootstrap.nix
new file mode 100644
index 000000000000..4b4359603c9b
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/bootstrap.nix
@@ -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
+  '';
+}
diff --git a/pkgs/applications/version-management/redmine/default.nix b/pkgs/applications/version-management/redmine/default.nix
new file mode 100644
index 000000000000..4655a16671ee
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/default.nix
@@ -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;
+  };
+}
diff --git a/pkgs/applications/version-management/redmine/generate_nix_requirements.rb b/pkgs/applications/version-management/redmine/generate_nix_requirements.rb
new file mode 100644
index 000000000000..ed47d52c9c1b
--- /dev/null
+++ b/pkgs/applications/version-management/redmine/generate_nix_requirements.rb
@@ -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