# HG changeset patch
# User Chris Cannam
# Date 1292504656 0
# Node ID fb3d7118d65ffac12af2b55d782cf47d4fd37310
# Parent d357e6b0b8e36b7e17f6436059f0cdc3596a71a6# Parent 7366fb57fce9a86d3749ebc8a453898738770c8b
Merge from branch "luisf"
diff -r 7366fb57fce9 -r fb3d7118d65f app/controllers/application_controller.rb
--- a/app/controllers/application_controller.rb Thu Dec 16 13:02:04 2010 +0000
+++ b/app/controllers/application_controller.rb Thu Dec 16 13:04:16 2010 +0000
@@ -314,7 +314,7 @@
if api_request?
logger.error "Form authenticity token is missing or is invalid. API calls must include a proper Content-type header (text/xml or text/json)."
end
- render_error "Invalid form authenticity token."
+ render_error "Invalid form authenticity token. Perhaps your session has timed out; try reloading the form and entering your details again."
end
def render_feed(items, options={})
diff -r 7366fb57fce9 -r fb3d7118d65f app/helpers/repositories_helper.rb
--- a/app/helpers/repositories_helper.rb Thu Dec 16 13:02:04 2010 +0000
+++ b/app/helpers/repositories_helper.rb Thu Dec 16 13:04:16 2010 +0000
@@ -181,7 +181,8 @@
end
def mercurial_field_tags(form, repository)
- content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+ content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => true))
+# (repository && !repository.root_url.blank?)))
end
def git_field_tags(form, repository)
diff -r 7366fb57fce9 -r fb3d7118d65f app/views/account/register.rhtml
--- a/app/views/account/register.rhtml Thu Dec 16 13:02:04 2010 +0000
+++ b/app/views/account/register.rhtml Thu Dec 16 13:04:16 2010 +0000
@@ -38,7 +38,6 @@
<%= ssamr_user_detail.text_area :description, :rows => 3, :cols => 40, :required => true, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'ssamr_user_details_description' %>
-
<%=l(:text_user_ssamr_description_info)%>
<% end %>
diff -r 7366fb57fce9 -r fb3d7118d65f app/views/projects/settings/_repository.rhtml
--- a/app/views/projects/settings/_repository.rhtml Thu Dec 16 13:02:04 2010 +0000
+++ b/app/views/projects/settings/_repository.rhtml Thu Dec 16 13:04:16 2010 +0000
@@ -6,6 +6,9 @@
<%= error_messages_for 'repository' %>
+<% if !@repository || !@repository.url %>
+
- The repository for a project will normally be set up automatically within a few minutes of the project being created.
+<% end %>
<%= label_tag('repository_scm', l(:label_scm)) %><%= scm_select_tag(@repository) %>
<%= repository_field_tags(f, @repository) if @repository %>
diff -r 7366fb57fce9 -r fb3d7118d65f app/views/repositories/_dir_list_content.rhtml
--- a/app/views/repositories/_dir_list_content.rhtml Thu Dec 16 13:02:04 2010 +0000
+++ b/app/views/repositories/_dir_list_content.rhtml Thu Dec 16 13:04:16 2010 +0000
@@ -16,7 +16,7 @@
:class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(entry.name)}")%>
<%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %> |
-<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
+<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier.to_s) if entry.lastrev && entry.lastrev.identifier %>
<%= link_to_revision(changeset, @project) if changeset %> |
<%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev && entry.lastrev.time %> |
<%= changeset.nil? ? h(entry.lastrev.author.to_s.split('<').first) : changeset.author if entry.lastrev %> |
diff -r 7366fb57fce9 -r fb3d7118d65f config/locales/en-GB.yml
--- a/config/locales/en-GB.yml Thu Dec 16 13:02:04 2010 +0000
+++ b/config/locales/en-GB.yml Thu Dec 16 13:04:16 2010 +0000
@@ -203,8 +203,8 @@
field_description: Description
field_summary: Summary
field_is_required: Required
- field_firstname: Firstname
- field_lastname: Lastname
+ field_firstname: First name
+ field_lastname: Last name
field_mail: Email
field_filename: File
field_filesize: Size
@@ -412,7 +412,7 @@
label_tipoftheday: Tip of the day
label_notifications: Important Message
- label_ssamr_description: Description
+ label_ssamr_description: Research description
label_ssamr_details: Other Details
label_user: User
@@ -467,7 +467,7 @@
label_register: Register
label_login_with_open_id_option: or login with OpenID
label_password_lost: Lost password
- label_home: Home
+ label_home: Welcome!
label_my_page: My page
label_my_account: My account
label_my_projects: My projects
@@ -840,6 +840,8 @@
text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.
This will be used in all project-related URLs, and as the repository name. Once saved, the identifier can not be changed.'
text_project_name_info: "This will be the name of your project throughout this site.
You can change your project's name at any time, in the project's settings."
text_project_visibility_info: "If your project is not public, it will only be visible to users that you have added as project members."
+ text_user_ssamr_description_info: 'Please describe your current research or development interests, within the fields of audio and music.
This information is publicly visible in your profile and you can edit it at any time.'
+ text_issue_parent_issue_info: 'If this is a subtask, please insert its parent task number or write the main task name.'
text_caracters_maximum: "{{count}} characters maximum."
text_caracters_minimum: "Must be at least {{count}} characters long."
text_length_between: "Length between {{min}} and {{max}} characters."
diff -r 7366fb57fce9 -r fb3d7118d65f config/locales/en.yml
--- a/config/locales/en.yml Thu Dec 16 13:02:04 2010 +0000
+++ b/config/locales/en.yml Thu Dec 16 13:04:16 2010 +0000
@@ -207,8 +207,8 @@
field_description: Description
field_summary: Summary
field_is_required: Required
- field_firstname: Firstname
- field_lastname: Lastname
+ field_firstname: First name
+ field_lastname: Last name
field_mail: Email
field_filename: File
field_filesize: Size
@@ -303,7 +303,7 @@
setting_tipoftheday_text: Tip of the Day
setting_notifications_text: Notifications
- label_ssamr_description: Description
+ label_ssamr_description: Research description
setting_app_title: Application title
setting_app_subtitle: Application subtitle
setting_welcome_text: Welcome text
@@ -483,7 +483,7 @@
label_register: Register
label_login_with_open_id_option: or login with OpenID
label_password_lost: Lost password
- label_home: Home
+ label_home: Welcome!
label_my_page: My page
label_my_account: My account
label_my_projects: My projects
@@ -869,7 +869,7 @@
text_project_name_info: "This will be the name of your project throughout this site.
You can change your project's name at any time, in the project's settings."
text_project_visibility_info: "If your project is not public, it will only be visible to users that you have added as project members."
text_project_homepage_info: 'Link to an external project page.'
- text_user_ssamr_description_info: 'Description of your interests and experience as a Researcher/Developer in the field of Audio and Music.'
+ text_user_ssamr_description_info: 'Please describe your current research or development interests, within the fields of audio and music.
This information is publicly visible in your profile and you can edit it at any time.'
text_issue_parent_issue_info: 'If this is a subtask, please insert its parent task number or write the main task name.'
text_caracters_maximum: "{{count}} characters maximum."
text_caracters_minimum: "Must be at least {{count}} characters long."
diff -r 7366fb57fce9 -r fb3d7118d65f extra/svn/reposman-soundsoftware.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/svn/reposman-soundsoftware.rb Thu Dec 16 13:04:16 2010 +0000
@@ -0,0 +1,350 @@
+#!/usr/bin/env ruby
+
+# == Synopsis
+#
+# reposman: manages your repositories with Redmine
+#
+# == Usage
+#
+# reposman [OPTIONS...] -s [DIR] -r [HOST]
+#
+# Examples:
+# reposman --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion
+# reposman -s /var/git -r redmine.example.net -u http://svn.example.net --scm git
+#
+# == Arguments (mandatory)
+#
+# -s, --svn-dir=DIR use DIR as base directory for svn repositories
+# -r, --redmine-host=HOST assume Redmine is hosted on HOST. Examples:
+# -r redmine.example.net
+# -r http://redmine.example.net
+# -r https://example.net/redmine
+# -k, --key=KEY use KEY as the Redmine API key
+#
+# == Options
+#
+# -o, --owner=OWNER owner of the repository. using the rails login
+# allow user to browse the repository within
+# Redmine even for private project. If you want to
+# share repositories through Redmine.pm, you need
+# to use the apache owner.
+# -g, --group=GROUP group of the repository. (default: root)
+# --scm=SCM the kind of SCM repository you want to create (and
+# register) in Redmine (default: Subversion).
+# reposman is able to create Git and Subversion
+# repositories. For all other kind, you must specify
+# a --command option
+# -u, --url=URL the base url Redmine will use to access your
+# repositories. This option is used to automatically
+# register the repositories in Redmine. The project
+# identifier will be appended to this url. Examples:
+# -u https://example.net/svn
+# -u file:///var/svn/
+# if this option isn't set, reposman will register
+# the repositories with local file paths in Redmine
+# -c, --command=COMMAND use this command instead of "svnadmin create" to
+# create a repository. This option can be used to
+# create repositories other than subversion and git
+# kind.
+# This command override the default creation for git
+# and subversion.
+# --http-user=USER User for HTTP Basic authentication with Redmine WS
+# --http-pass=PASSWORD Password for Basic authentication with Redmine WS
+# -t, --test only show what should be done
+# -h, --help show help and exit
+# -v, --verbose verbose
+# -V, --version print version and exit
+# -q, --quiet no log
+#
+# == References
+#
+# You can find more information on the redmine's wiki : http://www.redmine.org/wiki/redmine/HowTos
+
+
+require 'getoptlong'
+require 'rdoc/usage'
+require 'find'
+require 'etc'
+
+Version = "1.3"
+SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
+
+opts = GetoptLong.new(
+ ['--svn-dir', '-s', GetoptLong::REQUIRED_ARGUMENT],
+ ['--redmine-host', '-r', GetoptLong::REQUIRED_ARGUMENT],
+ ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
+ ['--owner', '-o', GetoptLong::REQUIRED_ARGUMENT],
+ ['--group', '-g', GetoptLong::REQUIRED_ARGUMENT],
+ ['--url', '-u', GetoptLong::REQUIRED_ARGUMENT],
+ ['--command' , '-c', GetoptLong::REQUIRED_ARGUMENT],
+ ['--scm', GetoptLong::REQUIRED_ARGUMENT],
+ ['--http-user', GetoptLong::REQUIRED_ARGUMENT],
+ ['--http-pass', GetoptLong::REQUIRED_ARGUMENT],
+ ['--test', '-t', GetoptLong::NO_ARGUMENT],
+ ['--verbose', '-v', GetoptLong::NO_ARGUMENT],
+ ['--version', '-V', GetoptLong::NO_ARGUMENT],
+ ['--help' , '-h', GetoptLong::NO_ARGUMENT],
+ ['--quiet' , '-q', GetoptLong::NO_ARGUMENT]
+ )
+
+$verbose = 0
+$quiet = false
+$redmine_host = ''
+$repos_base = ''
+$http_user = ''
+$http_pass = ''
+$svn_owner = 'root'
+$svn_group = 'root'
+$use_groupid = true
+$svn_url = false
+$test = false
+$scm = 'Subversion'
+
+def log(text, options={})
+ level = options[:level] || 0
+ puts text unless $quiet or level > $verbose
+ exit 1 if options[:exit]
+end
+
+def system_or_raise(command)
+ raise "\"#{command}\" failed" unless system command
+end
+
+module SCM
+
+ module Subversion
+ def self.create(path)
+ system_or_raise "svnadmin create #{path}"
+ end
+ end
+
+ module Git
+ def self.create(path)
+ Dir.mkdir path
+ Dir.chdir(path) do
+ system_or_raise "git --bare init --shared"
+ system_or_raise "git update-server-info"
+ end
+ end
+ end
+
+end
+
+begin
+ opts.each do |opt, arg|
+ case opt
+ when '--svn-dir'; $repos_base = arg.dup
+ when '--redmine-host'; $redmine_host = arg.dup
+ when '--key'; $api_key = arg.dup
+ when '--owner'; $svn_owner = arg.dup; $use_groupid = false;
+ when '--group'; $svn_group = arg.dup; $use_groupid = false;
+ when '--url'; $svn_url = arg.dup
+ when '--scm'; $scm = arg.dup.capitalize; log("Invalid SCM: #{$scm}", :exit => true) unless SUPPORTED_SCM.include?($scm)
+ when '--http-user'; $http_user = arg.dup
+ when '--http-pass'; $http_pass = arg.dup
+ when '--command'; $command = arg.dup
+ when '--verbose'; $verbose += 1
+ when '--test'; $test = true
+ when '--version'; puts Version; exit
+ when '--help'; RDoc::usage
+ when '--quiet'; $quiet = true
+ end
+ end
+rescue
+ exit 1
+end
+
+if $test
+ log("running in test mode")
+end
+
+# Make sure command is overridden if SCM vendor is not handled internally (for the moment Subversion and Git)
+if $command.nil?
+ begin
+ scm_module = SCM.const_get($scm)
+ rescue
+ log("Please use --command option to specify how to create a #{$scm} repository.", :exit => true)
+ end
+end
+
+$svn_url += "/" if $svn_url and not $svn_url.match(/\/$/)
+
+if ($redmine_host.empty? or $repos_base.empty?)
+ RDoc::usage
+end
+
+unless File.directory?($repos_base)
+ log("directory '#{$repos_base}' doesn't exists", :exit => true)
+end
+
+begin
+ require 'active_resource'
+rescue LoadError
+ log("This script requires activeresource.\nRun 'gem install activeresource' to install it.", :exit => true)
+end
+
+class Project < ActiveResource::Base
+ self.headers["User-agent"] = "Redmine repository manager/#{Version}"
+end
+
+log("querying Redmine for projects...", :level => 1);
+
+$redmine_host.gsub!(/^/, "http://") unless $redmine_host.match("^https?://")
+$redmine_host.gsub!(/\/$/, '')
+
+Project.site = "#{$redmine_host}/sys";
+Project.user = $http_user;
+Project.password = $http_pass;
+
+begin
+ # Get all active projects that have the Repository module enabled
+ projects = Project.find(:all, :params => {:key => $api_key})
+rescue => e
+ log("Unable to connect to #{Project.site}: #{e}", :exit => true)
+end
+
+if projects.nil?
+ log('no project found, perhaps you forgot to "Enable WS for repository management"', :exit => true)
+end
+
+log("retrieved #{projects.size} projects", :level => 1)
+
+def set_owner_and_rights(project, repos_path, &block)
+ if RUBY_PLATFORM =~ /mswin/
+ yield if block_given?
+ else
+ uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : Etc.getgrnam($svn_group).gid)
+ right = project.is_public ? 02775 : 02770
+ yield if block_given?
+ Find.find(repos_path) do |f|
+ File.chmod right, f
+ File.chown uid, gid, f
+ end
+ end
+end
+
+def other_read_right?(file)
+ (File.stat(file).mode & 0007).zero? ? false : true
+end
+
+def owner_name(file)
+ mswin? ?
+ $svn_owner :
+ Etc.getpwuid( File.stat(file).uid ).name
+end
+
+def mswin?
+ (RUBY_PLATFORM =~ /(:?mswin|mingw)/) || (RUBY_PLATFORM == 'java' && (ENV['OS'] || ENV['os']) =~ /windows/i)
+end
+
+projects.each do |project|
+ log("treating project #{project.name}", :level => 1)
+
+ if project.identifier.empty?
+ log("\tno identifier for project #{project.name}")
+ next
+ elsif not project.identifier.match(/^[a-z0-9\-]+$/)
+ log("\tinvalid identifier for project #{project.name} : #{project.identifier}");
+ next;
+ end
+
+ repos_path = File.join($repos_base, project.identifier).gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR)
+
+ create_repos = false
+
+ # Logic required for SoundSoftware.ac.uk repositories:
+ #
+ # * If the project has a repository path declared already,
+ # - if it's a local path,
+ # - if it does not exist
+ # - if it has the right root
+ # - create it
+ # - else
+ # - leave alone (remote repository)
+ # * else
+ # - create repository with same name as project
+ # - set to project
+
+ if project.respond_to?(:repository)
+
+ repos_url = project.repository.url;
+ log("\texisting url for project #{project.identifier} is #{repos_url}");
+
+ if repos_url.match(/^file:\//) || repos_url.match(/^\//)
+
+ repos_url = repos_url.gsub(/^file:\/*/, "/");
+ log("\tthis is a local file path, at #{repos_url}");
+
+ if repos_url.slice(0, $repos_base.length) != $repos_base
+ log("\tit is in the wrong place: replacing it");
+ # leave repos_path set to our original suggestion
+ create_repos = true
+ else
+ if !File.directory?(repos_url)
+ log("\tit doesn't exist; we should create it");
+ repos_path = repos_url
+ create_repos = true
+ else
+ log("\tit exists and is in the right place");
+ end
+ end
+ else
+ log("\tthis is a remote path, leaving alone");
+ end
+ else
+ log("\tproject #{project.identifier} has no repository registered")
+# if File.directory?(repos_path)
+# log("\trepository path #{repos_path} already exists, not creating")
+# else
+ create_repos = true
+# end
+ end
+
+ if create_repos
+
+ registration_url = repos_path
+ if $svn_url
+ registration_url = "#{$svn_url}#{project.identifier}"
+ end
+
+ if $test
+ log("\tproposal: create repository #{repos_path}")
+ log("\tproposal: register repository #{repos_path} in Redmine with vendor #{$scm}, url #{registration_url}")
+ next
+ end
+
+# No -- we need "other" users to be able to read it. Access control
+# is not handled through Unix user id anyway
+# project.is_public ? File.umask(0002) : File.umask(0007)
+ File.umask(0002)
+
+ log("\taction: create repository #{repos_path}")
+
+ begin
+ if !File.directory?(repos_path)
+ set_owner_and_rights(project, repos_path) do
+ if scm_module.nil?
+ log("\trunning command: #{$command} #{repos_path}")
+ system_or_raise "#{$command} #{repos_path}"
+ else
+ scm_module.create(repos_path)
+ end
+ end
+ end
+ rescue => e
+ log("\tunable to create #{repos_path} : #{e}\n")
+ next
+ end
+
+ begin
+ log("\taction: register repository #{repos_path} in Redmine with vendor #{$scm}, url #{registration_url}");
+ project.post(:repository, :vendor => $scm, :repository => {:url => "#{registration_url}"}, :key => $api_key)
+ rescue => e
+ log("\trepository #{repos_path} not registered in Redmine: #{e.message}");
+ end
+
+ log("\trepository #{repos_path} created");
+ end
+
+end
+
diff -r 7366fb57fce9 -r fb3d7118d65f lib/redmine/info.rb
--- a/lib/redmine/info.rb Thu Dec 16 13:02:04 2010 +0000
+++ b/lib/redmine/info.rb Thu Dec 16 13:04:16 2010 +0000
@@ -3,7 +3,7 @@
class << self
def app_name; 'Redmine' end
def url; 'http://www.redmine.org/' end
- def help_url; 'http://www.redmine.org/guide' end
+ def help_url; '/projects/soundsoftware-site/wiki/Help' end
def versioned_name; "#{app_name} #{Redmine::VERSION}" end
# Creates the url string to a specific Redmine issue
diff -r 7366fb57fce9 -r fb3d7118d65f vendor/plugins/redmine_checkout/db/migrate/20100808185600_change_protocol_storage_from_hash_to_array.rb
--- a/vendor/plugins/redmine_checkout/db/migrate/20100808185600_change_protocol_storage_from_hash_to_array.rb Thu Dec 16 13:02:04 2010 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100808185600_change_protocol_storage_from_hash_to_array.rb Thu Dec 16 13:04:16 2010 +0000
@@ -15,6 +15,7 @@
def self.up
## First migrate the individual repositories
Repository.all.each do |r|
+ next unless r.checkout_settings
next unless r.checkout_settings['checkout_protocols'].is_a? Hash
r.checkout_settings['checkout_protocols'] = r.checkout_settings['checkout_protocols'].sort{|(ak,av),(bk,bv)|ak<=>bk}.collect{|id,protocol| protocol}
r.save!
@@ -54,4 +55,4 @@
raise ActiveRecord::IrreversibleMigration.new "Sorry, there is no down migration yet. If you really need one, please create an issue on http://dev.holgerjust.de/projects/redmine-checkout"
end
-end
\ No newline at end of file
+end