diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 000000000..6581c8031 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,9 @@ += Redmine Gitosis + +A Redmine plugin which manages your gitosis configuration based on your projects and memberships in Redmine. Includes Public Key management views (extracted from http://plan.io). + +This plugin is provided as is and experimental. It works great in production for http://plan.io, but we don't guarantee it will work for you. + +== Copyright & License + +Copyright (c) 2009-2010 Jan Schulz-Hofen, ROCKET RENTALS GmbH (http://www.rocket-rentals.de). MIT License. diff --git a/app/controllers/gitosis_public_keys_controller.rb b/app/controllers/gitosis_public_keys_controller.rb new file mode 100644 index 000000000..29d3b41e8 --- /dev/null +++ b/app/controllers/gitosis_public_keys_controller.rb @@ -0,0 +1,74 @@ +class GitosisPublicKeysController < ApplicationController + + before_filter :require_login + before_filter :set_user_variable + before_filter :find_gitosis_public_key, :except => [:index, :new, :create] + + def index + @status = if (session[:gitosis_public_key_filter_status]=params[:status]).nil? + GitosisPublicKey::STATUS_ACTIVE + elsif params[:status].blank? + nil + else + params[:status].to_i + end + c = ARCondition.new(@status ? ["active=?", @status] : nil) + + @gitosis_public_keys = @user.gitosis_public_keys.all(:order => 'active DESC, created_at DESC', :conditions => c.conditions) + respond_to do |format| + format.html # index.html.erb + format.json { render :json => @gitosis_public_keys } + end + end + + def edit + end + + def update + if @gitosis_public_key.update_attributes(params[:public_key]) + flash[:notice] = l(:notice_public_key_updated) + redirect_to url_for(:action => 'index', :status => session[:gitosis_public_key_filter_status]) + else + render :action => 'edit' + end + end + + def new + @gitosis_public_key = GitosisPublicKey.new(:user => @user) + end + + def create + @gitosis_public_key = GitosisPublicKey.new(params[:public_key].merge(:user => @user)) + if @gitosis_public_key.save + flash[:notice] = l(:notice_public_key_added) + redirect_to url_for(:action => 'index', :status => session[:gitosis_public_key_filter_status]) + else + render :action => 'new' + end + end + + def show + respond_to do |format| + format.html # show.html.erb + format.json { render :json => @gitosis_public_key } + end + end + + protected + + def set_user_variable + @user = User.current + end + + def find_gitosis_public_key + key = GitosisPublicKey.find_by_id(params[:id]) + if key and key.user == @user + @gitosis_public_key = key + elsif key + render_403 + else + render_404 + end + end + +end \ No newline at end of file diff --git a/app/helpers/gitosis_public_keys_helper.rb b/app/helpers/gitosis_public_keys_helper.rb new file mode 100644 index 000000000..1bc4bf035 --- /dev/null +++ b/app/helpers/gitosis_public_keys_helper.rb @@ -0,0 +1,9 @@ +module GitosisPublicKeysHelper + def gitosis_public_keys_status_options_for_select(user, selected) + key_count_by_active = user.gitosis_public_keys.count(:group => 'active').to_hash + options_for_select([[l(:label_all), nil], + ["#{l(:status_active)} (#{key_count_by_active[true].to_i})", GitosisPublicKey::STATUS_ACTIVE], + ["#{l(:status_locked)} (#{key_count_by_active[false].to_i})", GitosisPublicKey::STATUS_LOCKED]], selected) + end + +end \ No newline at end of file diff --git a/app/models/gitosis_observer.rb b/app/models/gitosis_observer.rb new file mode 100644 index 000000000..b87e07d4c --- /dev/null +++ b/app/models/gitosis_observer.rb @@ -0,0 +1,29 @@ +class GitosisObserver < ActiveRecord::Observer + observe :project, :user, :gitosis_public_key, :member, :role, :repository + + + def before_create(object) + if object.is_a?(Project) + repo = Repository::Git.new + repo.url = repo.root_url = File.join(Gitosis::GITOSIS_BASE_PATH,"#{object.identifier}.git") + object.repository = repo + end + end + + def after_save(object) ; update_repositories(object) ; end + def after_destroy(object) ; update_repositories(object) ; end + + protected + + def update_repositories(object) + case object + when Project: Gitosis::update_repositories(object) + when Repository: Gitosis::update_repositories(object.project) + when User: Gitosis::update_repositories(object.projects) + when GitosisPublicKey: Gitosis::update_repositories(object.user.projects) + when Member: Gitosis::update_repositories(object.project) + when Role: Gitosis::update_repositories(object.members.map(&:project).uniq.compact) + end + end + +end \ No newline at end of file diff --git a/app/models/gitosis_public_key.rb b/app/models/gitosis_public_key.rb new file mode 100644 index 000000000..6506c3e4c --- /dev/null +++ b/app/models/gitosis_public_key.rb @@ -0,0 +1,32 @@ +class GitosisPublicKey < ActiveRecord::Base + + STATUS_ACTIVE = 1 + STATUS_LOCKED = 0 + + belongs_to :user + validates_uniqueness_of :title, :scope => :user_id + validates_uniqueness_of :identifier, :score => :user_id + validates_presence_of :title, :key, :identifier + + named_scope :active, {:conditions => {:active => GitosisPublicKey::STATUS_ACTIVE}} + named_scope :inactive, {:conditions => {:active => GitosisPublicKey::STATUS_LOCKED}} + + validate :has_not_been_changed + + before_validation :set_identifier + + def has_not_been_changed + unless new_record? + %w(identifier key user_id).each do |attribute| + errors.add(attribute, 'may not be changed') unless changes[attribute].blank? + end + end + end + + def set_identifier + self.identifier ||= "#{self.user.login.underscore}-#{self.title.underscore}-#{self.id}".gsub(/[^0-9a-zA-Z-_]/,'_') + end + + def to_s ; title ; end + +end diff --git a/app/views/gitosis_public_keys/_form.html.erb b/app/views/gitosis_public_keys/_form.html.erb new file mode 100644 index 000000000..e4d4f643e --- /dev/null +++ b/app/views/gitosis_public_keys/_form.html.erb @@ -0,0 +1,9 @@ +
+

<%= f.text_field :title, :required => true %>

+

<%= f.text_area :key, :required => true, :disabled => !@gitosis_public_key.new_record?, :style => 'width:99%;height:140px;' %> + <% if !@gitosis_public_key.new_record?%> +
<%= l(:label_key_cannot_be_changed_please_create_new_key) %> + <% end %> +

+

<%= f.check_box :active %>

+
diff --git a/app/views/gitosis_public_keys/edit.html.erb b/app/views/gitosis_public_keys/edit.html.erb new file mode 100644 index 000000000..79ce225a6 --- /dev/null +++ b/app/views/gitosis_public_keys/edit.html.erb @@ -0,0 +1,17 @@ +

<%= link_to l(:label_public_keys), public_keys_path %> » <%= h @gitosis_public_key %>

+ +<%= error_messages_for :gitosis_public_key %> + +<% form_for :public_key, @gitosis_public_key, :url => { :action => "update" }, :html => { :method => :put}, + :builder => TabularFormBuilder, + :lang => current_language do |f| %> + + <%= render :partial => 'form', :locals => { :f => f } %> + <%= submit_tag l(:button_save) %> +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'my/sidebar' %> +<% end %> + +<% html_title(l(:label_public_keys)) -%> diff --git a/app/views/gitosis_public_keys/index.html.erb b/app/views/gitosis_public_keys/index.html.erb new file mode 100644 index 000000000..238c1b2f7 --- /dev/null +++ b/app/views/gitosis_public_keys/index.html.erb @@ -0,0 +1,38 @@ +

<%= link_to l(:label_my_account), :controller => 'my', :action => 'account' %> » <%=l(:label_public_keys)%>

+ +<% form_tag({}, :method => :get) do %> +
<%= l(:label_filter_plural) %> + +<%= select_tag 'status', gitosis_public_keys_status_options_for_select(@user, @status), :class => "small", :onchange => "this.form.submit(); return false;" %> +<%= submit_tag l(:button_apply), :class => "small", :name => nil %> +
+<% end %> +  + + +<% if @gitosis_public_keys.any? %> + + + + + + + + + <% @gitosis_public_keys.each do |key| %> + + + + + + + <% end %> +
<%= l(:field_name) %><%= l(:field_created_on) %><%= l(:field_active) %>
<%= link_to h(key), :action => 'edit', :id => key %><%= format_time(key.created_at) %><%= image_tag('true.png') if key.active? %> + <%= link_to l(key.active? ? :button_lock : :button_unlock), public_key_path(key, :public_key => {:active => key.active? ? GitosisPublicKey::STATUS_LOCKED : GitosisPublicKey::STATUS_ACTIVE}), :method => :put, :class => "icon #{key.active? ? 'icon-lock' : 'icon-unlock'}" %> +
+ +<% end %> + +

<%= link_to l(:label_enumeration_new), { :action => 'new'} %>

+ +<% html_title(l(:label_public_keys)) -%> diff --git a/app/views/gitosis_public_keys/new.html.erb b/app/views/gitosis_public_keys/new.html.erb new file mode 100644 index 000000000..da9dbb744 --- /dev/null +++ b/app/views/gitosis_public_keys/new.html.erb @@ -0,0 +1,17 @@ +

<%= link_to l(:label_public_keys), public_keys_path %> » <%=l(:label_public_key_new)%>

+ +<%= error_messages_for :gitosis_public_key %> + +<% form_for :public_key, @gitosis_public_key, :url => { :action => "create" }, + :builder => TabularFormBuilder, + :lang => current_language do |f| %> + + <%= render :partial => 'form', :locals => { :f => f } %> + <%= submit_tag l(:button_create) %> +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'my/sidebar' %> +<% end %> + +<% html_title(l(:label_public_keys)) -%> diff --git a/app/views/repositories/git_instructions.html.erb b/app/views/repositories/git_instructions.html.erb new file mode 100644 index 000000000..14eadcaf4 --- /dev/null +++ b/app/views/repositories/git_instructions.html.erb @@ -0,0 +1,3 @@ +

<%= l(:label_repository)%>

+<%# This can be used to display basic git setup instructions, like on github... %> +<% html_title(l(:label_repository)) -%> diff --git a/config/locales/bg.yml b/config/locales/bg.yml new file mode 100644 index 000000000..d39aa3289 --- /dev/null +++ b/config/locales/bg.yml @@ -0,0 +1,13 @@ +'bg': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/bs.yml b/config/locales/bs.yml new file mode 100644 index 000000000..38b90e9fd --- /dev/null +++ b/config/locales/bs.yml @@ -0,0 +1,13 @@ +'bs': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/ca.yml b/config/locales/ca.yml new file mode 100644 index 000000000..f5f51221f --- /dev/null +++ b/config/locales/ca.yml @@ -0,0 +1,13 @@ +'ca': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/cs.yml b/config/locales/cs.yml new file mode 100644 index 000000000..6aaf673e3 --- /dev/null +++ b/config/locales/cs.yml @@ -0,0 +1,13 @@ +'cs': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/da.yml b/config/locales/da.yml new file mode 100644 index 000000000..3b04263df --- /dev/null +++ b/config/locales/da.yml @@ -0,0 +1,13 @@ +'da': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/de.yml b/config/locales/de.yml new file mode 100644 index 000000000..aa25bbbe9 --- /dev/null +++ b/config/locales/de.yml @@ -0,0 +1,15 @@ +'de': + label_public_keys: Öffentliche Schlüssel + label_public_key_new: Neuer öffentlicher Schlüssel + field_key: Schlüssel + notice_public_key_updated: Öffentlicher Schlüssel wurde erfolgreich aktualisiert. + notice_public_key_added: Öffentlicher Schlüssel wurde erfolgreich hinzugefügt. + + label_key_cannot_be_changed_please_create_new_key: 'Der Schlüssel kann nicht mehr verändert werden. Sie können jedoch diesen Schlüssel deaktivieren und einen neuen anlegen.' + + activerecord: + errors: + messages: + 'may not be changed': "darf nicht verändert werden" + + diff --git a/config/locales/el.yml b/config/locales/el.yml new file mode 100644 index 000000000..fa15dd641 --- /dev/null +++ b/config/locales/el.yml @@ -0,0 +1,13 @@ +'el': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..0258072b1 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,13 @@ +en: + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/es.yml b/config/locales/es.yml new file mode 100644 index 000000000..4a95d0151 --- /dev/null +++ b/config/locales/es.yml @@ -0,0 +1,13 @@ +'es': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/fi.yml b/config/locales/fi.yml new file mode 100644 index 000000000..dacb7cf9b --- /dev/null +++ b/config/locales/fi.yml @@ -0,0 +1,13 @@ +'fi': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/fr.yml b/config/locales/fr.yml new file mode 100644 index 000000000..3523f1a27 --- /dev/null +++ b/config/locales/fr.yml @@ -0,0 +1,13 @@ +'fr': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/gl.yml b/config/locales/gl.yml new file mode 100644 index 000000000..e6e8047b0 --- /dev/null +++ b/config/locales/gl.yml @@ -0,0 +1,13 @@ +'gl': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/he.yml b/config/locales/he.yml new file mode 100644 index 000000000..9d62b5eb4 --- /dev/null +++ b/config/locales/he.yml @@ -0,0 +1,13 @@ +'he': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/hu.yml b/config/locales/hu.yml new file mode 100644 index 000000000..9b5598262 --- /dev/null +++ b/config/locales/hu.yml @@ -0,0 +1,13 @@ +'hu': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/id.yml b/config/locales/id.yml new file mode 100644 index 000000000..910ca351d --- /dev/null +++ b/config/locales/id.yml @@ -0,0 +1,13 @@ +'id': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/it.yml b/config/locales/it.yml new file mode 100644 index 000000000..dab4cd452 --- /dev/null +++ b/config/locales/it.yml @@ -0,0 +1,13 @@ +'it': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/ja.yml b/config/locales/ja.yml new file mode 100644 index 000000000..ac3fddba0 --- /dev/null +++ b/config/locales/ja.yml @@ -0,0 +1,13 @@ +'ja': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/ko.yml b/config/locales/ko.yml new file mode 100644 index 000000000..54bb18ead --- /dev/null +++ b/config/locales/ko.yml @@ -0,0 +1,13 @@ +'ko': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/lt.yml b/config/locales/lt.yml new file mode 100644 index 000000000..a9a0fd7cf --- /dev/null +++ b/config/locales/lt.yml @@ -0,0 +1,13 @@ +'lt': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/nl.yml b/config/locales/nl.yml new file mode 100644 index 000000000..237aee533 --- /dev/null +++ b/config/locales/nl.yml @@ -0,0 +1,13 @@ +'nl': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/no.yml b/config/locales/no.yml new file mode 100644 index 000000000..0a0699ba8 --- /dev/null +++ b/config/locales/no.yml @@ -0,0 +1,13 @@ +'no': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/pl.yml b/config/locales/pl.yml new file mode 100644 index 000000000..5efe68dd5 --- /dev/null +++ b/config/locales/pl.yml @@ -0,0 +1,13 @@ +'pl': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml new file mode 100644 index 000000000..ae2538d44 --- /dev/null +++ b/config/locales/pt-BR.yml @@ -0,0 +1,13 @@ +'pt-BR': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/pt.yml b/config/locales/pt.yml new file mode 100644 index 000000000..2afda7e9d --- /dev/null +++ b/config/locales/pt.yml @@ -0,0 +1,13 @@ +'pt': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/ro.yml b/config/locales/ro.yml new file mode 100644 index 000000000..c9ef90e5d --- /dev/null +++ b/config/locales/ro.yml @@ -0,0 +1,13 @@ +'ro': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/ru.yml b/config/locales/ru.yml new file mode 100644 index 000000000..5d5bd7640 --- /dev/null +++ b/config/locales/ru.yml @@ -0,0 +1,13 @@ +'ru': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/sk.yml b/config/locales/sk.yml new file mode 100644 index 000000000..b3c5db0dc --- /dev/null +++ b/config/locales/sk.yml @@ -0,0 +1,13 @@ +'sk': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/sl.yml b/config/locales/sl.yml new file mode 100644 index 000000000..b8de0fda0 --- /dev/null +++ b/config/locales/sl.yml @@ -0,0 +1,13 @@ +'sl': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/sr.yml b/config/locales/sr.yml new file mode 100644 index 000000000..cef938053 --- /dev/null +++ b/config/locales/sr.yml @@ -0,0 +1,13 @@ +'sr': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/sv.yml b/config/locales/sv.yml new file mode 100644 index 000000000..fd8fd64c9 --- /dev/null +++ b/config/locales/sv.yml @@ -0,0 +1,13 @@ +'sv': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/th.yml b/config/locales/th.yml new file mode 100644 index 000000000..5be9fcc16 --- /dev/null +++ b/config/locales/th.yml @@ -0,0 +1,13 @@ +'th': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/tr.yml b/config/locales/tr.yml new file mode 100644 index 000000000..d2198a0ab --- /dev/null +++ b/config/locales/tr.yml @@ -0,0 +1,13 @@ +'tr': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/uk.yml b/config/locales/uk.yml new file mode 100644 index 000000000..a8a6d33ad --- /dev/null +++ b/config/locales/uk.yml @@ -0,0 +1,13 @@ +'uk': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/vi.yml b/config/locales/vi.yml new file mode 100644 index 000000000..ccf959028 --- /dev/null +++ b/config/locales/vi.yml @@ -0,0 +1,13 @@ +'vi': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml new file mode 100644 index 000000000..501af2be8 --- /dev/null +++ b/config/locales/zh-TW.yml @@ -0,0 +1,13 @@ +'zh-TW': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/locales/zh.yml b/config/locales/zh.yml new file mode 100644 index 000000000..448bd506c --- /dev/null +++ b/config/locales/zh.yml @@ -0,0 +1,13 @@ +'zh': + label_public_keys: Public keys + label_public_key_new: New public key + field_key: Key + notice_public_key_updated: Public key was successfully updated. + notice_public_key_added: Public key was successfully added. + + label_key_cannot_be_changed_please_create_new_key: 'The key cannot be altered anymore. However, you can deactivate it and create a new one.' + + activerecord: + errors: + messages: + 'may not be changed': 'may not be changed' diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..cf699f11b --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +ActionController::Routing::Routes.draw do |map| + map.resources :public_keys, :controller => 'gitosis_public_keys', :path_prefix => 'my' +end \ No newline at end of file diff --git a/db/migrate/20091119162427_create_gitosis_public_keys.rb b/db/migrate/20091119162427_create_gitosis_public_keys.rb new file mode 100644 index 000000000..b8f345634 --- /dev/null +++ b/db/migrate/20091119162427_create_gitosis_public_keys.rb @@ -0,0 +1,17 @@ +class CreateGitosisPublicKeys < ActiveRecord::Migration + def self.up + create_table :gitosis_public_keys do |t| + t.column :title, :string + t.column :identifier, :string + t.column :key, :text + t.column :active, :boolean, :default => true + t.references :user + t.timestamps + + end + end + + def self.down + drop_table :gitosis_public_keys + end +end diff --git a/extra/ssh/private_key b/extra/ssh/private_key new file mode 100644 index 000000000..2e301a575 --- /dev/null +++ b/extra/ssh/private_key @@ -0,0 +1 @@ +# PLACE YOUR SSH PRIVATE KEY FOR GITOSIS CONFIGURATION HERE \ No newline at end of file diff --git a/extra/ssh_with_identity_file.sh b/extra/ssh_with_identity_file.sh new file mode 100755 index 000000000..590346b8e --- /dev/null +++ b/extra/ssh_with_identity_file.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exec ssh -i `dirname $0`/ssh/private_key "$@" \ No newline at end of file diff --git a/init.rb b/init.rb new file mode 100644 index 000000000..d030ccff2 --- /dev/null +++ b/init.rb @@ -0,0 +1,24 @@ +require 'redmine' +require 'user' + +require_dependency 'gitosis' +require_dependency 'gitosis/patches/repositories_controller_patch' +require_dependency 'gitosis/patches/repositories_helper_patch' + +Redmine::Plugin.register :redmine_gitosis do + name 'Redmine Gitosis plugin' + author 'Jan Schulz-Hofen' + description 'Enables Redmine to update a gitosis server.' + version '0.0.1' +end + +# initialize hook +class GitosisPublicKeyHook < Redmine::Hook::ViewListener + render_on :view_my_account_contextual, :inline => "| <%= link_to(l(:label_public_keys), public_keys_path) %>" +end + +# initialize association from user -> public keys +User.send(:has_many, :gitosis_public_keys, :dependent => :destroy) + +# initialize observer +ActiveRecord::Base.observers = ActiveRecord::Base.observers << GitosisObserver diff --git a/lib/gitosis.rb b/lib/gitosis.rb new file mode 100644 index 000000000..3d311d654 --- /dev/null +++ b/lib/gitosis.rb @@ -0,0 +1,79 @@ +require 'lockfile' +require 'inifile' +require 'net/ssh' + +module Gitosis + # server config + GITOSIS_URI = 'git@plan.io:/gitosis-admin.git' + GITOSIS_BASE_PATH = '/opt/gitosis/repositories/' + + # commands + ENV['GIT_SSH'] = SSH_WITH_IDENTITY_FILE = File.join(RAILS_ROOT, 'vendor/plugins/redmine_gitosis/extra/ssh_with_identity_file.sh') + + def self.destroy_repository(project) + path = File.join(GITOSIS_BASE_PATH, "#{project.identifier}.git") + `rm -Rf #{path}` + end + + def self.update_repositories(projects) + projects = (projects.is_a?(Array) ? projects : [projects]) + + Lockfile(File.join(Dir.tmpdir,'gitosis_lock'), :retries => 2, :sleep_inc=> 10) do + + # HANDLE GIT + + # create tmp dir + local_dir = File.join(Dir.tmpdir,"redmine-gitosis-#{Time.now.to_i}") + + Dir.mkdir local_dir + + # clone repo + `git clone #{GITOSIS_URI} #{local_dir}/gitosis` + + changed = false + + projects.select{|p| p.repository.is_a?(Repository::Git)}.each do |project| + # fetch users + users = project.member_principals.map(&:user).compact.uniq + write_users = users.select{ |user| user.allowed_to?( :commit_access, project ) } + read_users = users.select{ |user| user.allowed_to?( :view_changesets, project ) } + + # write key files + users.map{|u| u.gitosis_public_keys.active}.flatten.compact.uniq.each do |key| + File.open(File.join(local_dir, 'gitosis/keydir',"#{key.identifier}.pub"), 'w') {|f| f.write(key.key.gsub(/\n/,'')) } + end + + # delete inactives + users.map{|u| u.gitosis_public_keys.inactive}.flatten.compact.uniq.each do |key| + File.unlink(File.join(local_dir, 'gitosis/keydir',"#{key.identifier}.pub")) rescue nil + end + + # write config file + conf = IniFile.new(File.join(local_dir,'gitosis','gitosis.conf')) + original = conf.clone + name = "#{project.identifier}" + + conf["group #{name}"]['writable'] = name + conf["group #{name}"]['members'] = write_users.map{|u| u.gitosis_public_keys.active}.flatten.map{ |key| "#{key.identifier}" }.join(' ') + unless conf.eql?(original) + conf.write + changed = true + end + end + + if changed + # add, commit, push, and remove local tmp dir + `cd #{File.join(local_dir,'gitosis')} ; git add keydir/* gitosis.conf` + `cd #{File.join(local_dir,'gitosis')} ; git commit -a -m 'updated by Redmine Gitosis'` + `cd #{File.join(local_dir,'gitosis')} ; git push` + end + + # remove local copy + `rm -Rf #{local_dir}` + + end + + + end + +end diff --git a/lib/gitosis/patches/repositories_controller_patch.rb b/lib/gitosis/patches/repositories_controller_patch.rb new file mode 100644 index 000000000..f181b5c84 --- /dev/null +++ b/lib/gitosis/patches/repositories_controller_patch.rb @@ -0,0 +1,31 @@ +require_dependency 'repositories_controller' +module Gitosis + module Patches + module RepositoriesControllerPatch + + def show_with_git_instructions + if @repository.is_a?(Repository::Git) and @repository.entries(@path, @rev).blank? + render :action => 'git_instructions' + else + show_without_git_instructions + end + end + + def edit_with_scm_settings + params[:repository] ||= {} + params[:repository][:url] = File.join(Gitosis::GITOSIS_BASE_PATH,"#{@project.identifier}.git") if params[:repository_scm] == 'Git' + edit_without_scm_settings + end + + def self.included(base) + base.class_eval do + unloadable + end + base.send(:alias_method_chain, :show, :git_instructions) + base.send(:alias_method_chain, :edit, :scm_settings) + end + + end + end +end +RepositoriesController.send(:include, Gitosis::Patches::RepositoriesControllerPatch) unless RepositoriesController.include?(Gitosis::Patches::RepositoriesControllerPatch) diff --git a/lib/gitosis/patches/repositories_helper_patch.rb b/lib/gitosis/patches/repositories_helper_patch.rb new file mode 100644 index 000000000..8c7dd89a3 --- /dev/null +++ b/lib/gitosis/patches/repositories_helper_patch.rb @@ -0,0 +1,17 @@ +require_dependency 'repositories_helper' +module Gitosis + module Patches + module RepositoriesHelperPatch + def git_field_tags_with_disabled_configuration(form, repository) ; '' ; end + + def self.included(base) + base.class_eval do + unloadable + end + base.send(:alias_method_chain, :git_field_tags, :disabled_configuration) + end + + end + end +end +RepositoriesHelper.send(:include, Gitosis::Patches::RepositoriesHelperPatch) unless RepositoriesHelper.include?(Gitosis::Patches::RepositoriesHelperPatch) \ No newline at end of file diff --git a/test/fixtures/gitosis_public_keys.yml b/test/fixtures/gitosis_public_keys.yml new file mode 100644 index 000000000..ca9e62f2d --- /dev/null +++ b/test/fixtures/gitosis_public_keys.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +one: + id: 1 + title: MyString + key: MyText +two: + id: 2 + title: MyString + key: MyText diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 000000000..bd1ed0c5d --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,5 @@ +# Load the normal Rails helper +require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper') + +# Ensure that we are using the temporary fixture path +Engines::Testing.set_fixture_path diff --git a/test/unit/gitosis_public_key_test.rb b/test/unit/gitosis_public_key_test.rb new file mode 100644 index 000000000..8b3e6bf00 --- /dev/null +++ b/test/unit/gitosis_public_key_test.rb @@ -0,0 +1,10 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class GitosisPublicKeyTest < ActiveSupport::TestCase + fixtures :gitosis_public_keys + + # Replace this with your real tests. + def test_truth + assert true + end +end