diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-11-10 18:59:06 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-11-10 18:59:06 +0000 |
commit | 79c33bbc838fd837e516fd60569dbcf7917bd534 (patch) | |
tree | 20695e6f03f08925d6be3c96846668d979b4b3b3 /app/models/repository.rb | |
parent | f6b2be81b9cb09485a08e58fc73d9290fd544148 (diff) | |
download | redmine-79c33bbc838fd837e516fd60569dbcf7917bd534.tar.gz redmine-79c33bbc838fd837e516fd60569dbcf7917bd534.zip |
Maps repository users to Redmine users (#1383).
Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2006 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/repository.rb')
-rw-r--r-- | app/models/repository.rb | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb index 81e6647a2..0cae37d06 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -96,6 +96,45 @@ class Repository < ActiveRecord::Base self.changesets.each(&:scan_comment_for_issue_ids) end + # Returns an array of committers usernames and associated user_id + def committers + @committers ||= Changeset.connection.select_rows("SELECT DISTINCT committer, user_id FROM #{Changeset.table_name} WHERE repository_id = #{id}") + end + + # Maps committers username to a user ids + def committer_ids=(h) + if h.is_a?(Hash) + committers.each do |committer, user_id| + new_user_id = h[committer] + if new_user_id && (new_user_id.to_i != user_id.to_i) + new_user_id = (new_user_id.to_i > 0 ? new_user_id.to_i : nil) + Changeset.update_all("user_id = #{ new_user_id.nil? ? 'NULL' : new_user_id }", ["repository_id = ? AND committer = ?", id, committer]) + end + end + @committers = nil + true + else + false + end + end + + # Returns the Redmine User corresponding to the given +committer+ + # It will return nil if the committer is not yet mapped and if no User + # with the same username or email was found + def find_committer_user(committer) + if committer + c = changesets.find(:first, :conditions => {:committer => committer}, :include => :user) + if c && c.user + c.user + elsif committer.strip =~ /^([^<]+)(<(.*)>)?$/ + username, email = $1.strip, $3 + u = User.find_by_login(username) + u ||= User.find_by_mail(email) unless email.blank? + u + end + end + end + # fetch new changesets for all repositories # can be called periodically by an external script # eg. ruby script/runner "Repository.fetch_changesets" |