From 611b22baa57cd1cd698d9ee566a22ba46b00cd96 Mon Sep 17 00:00:00 2001 From: Pavel Chipiga Date: Tue, 17 Jul 2012 11:02:56 +0300 Subject: [PATCH 1/4] Update gems, fix conflicts. Raise 404 error instead of redirect. Refactor git controllers. Refactor git methods, move to modules. Cleanup git helpers, refactor and remove unused variables from views, refactor git templates. Refactor project load. Refactor git routes and links, refactor constraints. Fix branches with slashes and dots. Apply github linguist and libmagic for binary file detection. Other refactor and code cleanup. Fix specs and deprecations. Refs #263 --- Gemfile | 24 +- Gemfile.lock | 138 ++++++----- app/controllers/application_controller.rb | 5 + .../projects/build_lists_controller.rb | 3 +- .../projects/comments_controller.rb | 2 +- .../projects/commit_subscribes_controller.rb | 2 +- .../projects/git/base_controller.rb | 33 +-- .../projects/git/blobs_controller.rb | 46 +--- .../projects/git/commits_controller.rb | 29 +-- .../projects/git/trees_controller.rb | 33 +-- .../projects/projects_controller.rb | 6 +- app/helpers/git_helper.rb | 43 ++-- app/models/activity_feed_observer.rb | 4 +- app/models/build_list.rb | 2 +- app/models/build_list/filter.rb | 14 +- app/models/comment.rb | 2 +- app/models/git/repository.rb | 130 ---------- app/models/project.rb | 228 +++--------------- app/views/projects/base/_repo_block.html.haml | 4 +- app/views/projects/base/_submenu.html.haml | 6 +- app/views/projects/build_lists/new.html.haml | 5 +- .../projects/git/blobs/_editor.html.haml | 2 +- .../git/blobs/_render_as_binary.html.haml | 8 + .../git/blobs/_render_as_image.html.haml | 8 + .../git/blobs/_render_as_text.html.haml | 6 + app/views/projects/git/blobs/_show.html.haml | 34 +-- app/views/projects/git/blobs/_top.html.haml | 10 +- app/views/projects/git/blobs/blame.html.haml | 3 +- .../git/commits/_commit_diff.html.haml | 2 +- .../projects/git/commits/index.html.haml | 2 +- app/views/projects/projects/_form.html.haml | 2 +- config/routes.rb | 63 ++--- db/schema.rb | 99 ++++---- doc/README_FOR_APP | 4 + lib/ext/git/grit.rb | 76 ++++-- lib/ext/rails/constraint.rb | 49 ++++ lib/ext/rails/constraints.rb | 18 -- lib/ext/rails/middleware.rb | 18 ++ lib/ext/rosa/constraints.rb | 42 ++++ lib/modules/models/git.rb | 187 ++++++++++++++ lib/modules/models/owner.rb | 11 +- lib/modules/models/wiki.rb | 39 +++ lib/tasks/add_branch.rake | 2 +- .../platforms/mass_builds_controller_spec.rb | 8 +- .../platforms/repositories_controller_spec.rb | 4 +- .../projects/build_lists_controller_spec.rb | 20 +- .../comments_controller_for_commit_spec.rb | 4 +- .../projects/git/git_trees_controller_spec.rb | 10 +- .../users/profile_controller_spec.rb | 2 +- spec/factories/platforms.rb | 2 +- spec/models/comment_for_commit_spec.rb | 4 +- spec/routing/projects_routing_spec.rb.rb | 1 + spec/spec_helper.rb | 4 +- 53 files changed, 746 insertions(+), 757 deletions(-) delete mode 100644 app/models/git/repository.rb create mode 100644 app/views/projects/git/blobs/_render_as_binary.html.haml create mode 100644 app/views/projects/git/blobs/_render_as_image.html.haml create mode 100644 app/views/projects/git/blobs/_render_as_text.html.haml create mode 100644 lib/ext/rails/constraint.rb delete mode 100644 lib/ext/rails/constraints.rb create mode 100644 lib/ext/rails/middleware.rb create mode 100644 lib/ext/rosa/constraints.rb create mode 100644 lib/modules/models/git.rb create mode 100644 lib/modules/models/wiki.rb diff --git a/Gemfile b/Gemfile index 7ed9a93a3..01a5c745a 100644 --- a/Gemfile +++ b/Gemfile @@ -2,19 +2,19 @@ source 'http://rubygems.org' gem 'rails', '3.2.6' #, :git => 'git://github.com/rails/rails.git' -gem 'pg', '~> 0.13.2' +gem 'pg', '~> 0.14.0' # gem 'silent-postgres', :git => 'git://github.com/dolzenko/silent-postgres.git' #'~> 0.1.1' gem 'redhillonrails_core', :git => 'git://github.com/chipiga/redhillonrails_core.git', :branch => 'rails31' # '~> 2.0.0.pre' # deprecated # gem 'schema_plus', '~> 0.2.1' # buggy shit! -gem 'devise', '~> 2.0.4' -gem 'omniauth', '~> 1.0.3' +gem 'devise', '~> 2.1.2' +gem 'omniauth', '~> 1.1.0' gem 'omniauth-openid', '~> 1.0.1' -gem 'cancan', '~> 1.6.7' +gem 'cancan', '1.6.7' # 1.6.8 fail specs with strange error gem 'ancestry', '~> 1.3.0' -gem 'paperclip', '~> 3.0.4' -gem 'resque', '~> 1.20.0' +gem 'paperclip', '~> 3.1.3' +gem 'resque', '~> 1.21.0' gem 'resque-status', '~> 0.3.3' gem 'resque_mailer', '~> 2.1.0' gem 'perform_later', '~> 1.3.0' # should be after resque_mailer @@ -26,6 +26,8 @@ gem 'state_machine' gem 'grack', :git => 'git://github.com/rdblue/grack.git', :require => 'git_http' gem "grit", :git => 'git://github.com/warpc/grit.git' #, :path => '~/Sites/code/grit' gem 'charlock_holmes', '~> 0.6.8' #, :git => 'git://github.com/brianmario/charlock_holmes.git', :branch => 'bundle-icu' +# gem 'ruby-filemagic', '~> 0.4.2', :require => 'filemagic/ext' +gem 'github-linguist', '~> 2.0.1', :require => 'linguist' gem 'diff-display', '~> 0.0.1' # Wiki @@ -39,7 +41,7 @@ gem 'wikicloth' gem 'unicorn', '~> 4.3.1', :platforms => [:mri, :rbx] gem 'trinidad', '~> 1.0.2', :platforms => :jruby -gem 'newrelic_rpm', '~> 3.3.5', :platforms => [:mri, :rbx] +gem 'newrelic_rpm', '~> 3.4.0.1', :platforms => [:mri, :rbx] gem 'whenever', '~> 0.7.3', :require => false gem 'jbuilder', '~> 0.4.0' @@ -54,14 +56,14 @@ gem 'rails-backbone', '~> 0.7.2' group :assets do gem 'sass-rails', '~> 3.2.5' gem 'coffee-rails', '~> 3.2.2' - gem 'compass-rails', '~> 1.0.2' + gem 'compass-rails', '~> 1.0.3' gem 'uglifier', '~> 1.2.4' gem 'therubyracer', '~> 0.10.1', :platforms => [:mri, :rbx] gem 'therubyrhino', '~> 1.73.1', :platforms => :jruby end group :production do - gem "airbrake", '~> 3.1.1' + gem "airbrake", '~> 3.1.2' gem 'bluepill', '~> 0.0.60', :require => false end @@ -78,8 +80,8 @@ group :development do end group :test do - gem 'rspec-rails', '~> 2.10.1', :group => 'development' - gem 'factory_girl_rails', '~> 3.4.0' + gem 'rspec-rails', '~> 2.11.0', :group => 'development' + gem 'factory_girl_rails', '~> 3.5.0' gem 'rr', '~> 1.0.4' gem 'shoulda' end diff --git a/Gemfile.lock b/Gemfile.lock index 15dc97662..5d9e2545f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -52,7 +52,7 @@ GEM activesupport (3.2.6) i18n (~> 0.6) multi_json (~> 1.0) - airbrake (3.1.1) + airbrake (3.1.2) activesupport builder albino (1.3.3) @@ -88,33 +88,40 @@ GEM coffee-script-source execjs coffee-script-source (1.3.3) - compass (0.12.1) + compass (0.12.2) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) - compass-rails (1.0.2) - compass (>= 0.12.0, < 0.14) + compass-rails (1.0.3) + compass (>= 0.12.2, < 0.14) creole (0.4.2) daemons (1.1.6) - devise (2.0.4) + devise (2.1.2) bcrypt-ruby (~> 3.0) - orm_adapter (~> 0.0.3) + orm_adapter (~> 0.1) railties (~> 3.1) - warden (~> 1.1.1) + warden (~> 1.2.1) diff-display (0.0.1) diff-lcs (1.1.3) ejs (1.0.0) erubis (2.7.0) + escape_utils (0.2.4) eventmachine (0.12.10) execjs (1.4.0) multi_json (~> 1.0) expression_parser (0.9.0) - factory_girl (3.4.0) + factory_girl (3.5.0) activesupport (>= 3.0.0) - factory_girl_rails (3.4.0) - factory_girl (~> 3.4.0) + factory_girl_rails (3.5.0) + factory_girl (~> 3.5.0) railties (>= 3.0.0) + ffi (1.0.11) fssm (0.2.9) + github-linguist (2.0.1) + charlock_holmes (~> 0.6.6) + escape_utils (~> 0.2.3) + mime-types (~> 1.18) + pygments.rb (~> 0.2.13) github-markup (0.7.2) gollum (1.3.1) albino (~> 1.3.2) @@ -132,14 +139,14 @@ GEM haml (~> 3.0) railties (~> 3.0) hashie (1.2.0) - highline (1.6.12) + highline (1.6.13) hike (1.2.1) - hirb (0.6.2) + hirb (0.7.0) i18n (0.6.0) jbuilder (0.4.0) activesupport (>= 3.0.0) blankslate (>= 2.1.2.4) - journey (1.0.3) + journey (1.0.4) jquery-rails (2.0.2) railties (>= 3.2.0, < 5.0) thor (~> 0.14) @@ -152,18 +159,18 @@ GEM i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) - mailcatcher (0.5.6) + mailcatcher (0.5.7.2) activesupport (~> 3.0) eventmachine (~> 0.12) haml (~> 3.1) mail (~> 2.3) sinatra (~> 1.2) - skinny (~> 0.2) + skinny (~> 0.2, >= 0.2.1) sqlite3 (~> 1.3) thin (~> 1.2) meta-tags (1.2.6) actionpack - mime-types (1.18) + mime-types (1.19) multi_json (1.3.6) mustache (0.99.4) net-scp (1.0.4) @@ -173,16 +180,16 @@ GEM net-ssh (2.5.2) net-ssh-gateway (1.1.0) net-ssh (>= 1.99.1) - newrelic_rpm (3.3.5) - nokogiri (1.5.4) - omniauth (1.0.3) + newrelic_rpm (3.4.0.1) + nokogiri (1.5.5) + omniauth (1.1.0) hashie (~> 1.2) rack omniauth-openid (1.0.1) omniauth (~> 1.0) rack-openid (~> 1.3.1) - orm_adapter (0.0.7) - paperclip (3.0.4) + orm_adapter (0.4.0) + paperclip (3.1.3) activemodel (>= 3.0.0) activerecord (>= 3.0.0) activesupport (>= 3.0.0) @@ -192,9 +199,11 @@ GEM rails (~> 3.0) redis resque - pg (0.13.2) + pg (0.14.0) polyglot (0.3.3) posix-spawn (0.3.6) + pygments.rb (0.2.13) + rubypython (~> 0.5.3) rack (1.4.1) rack-cache (1.2) rack (>= 0.4) @@ -230,21 +239,21 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) - raindrops (0.9.0) + raindrops (0.10.0) rake (0.9.2.2) rdiscount (1.6.8) rdoc (3.12) json (~> 1.4) redcarpet (1.17.2) - redis (2.2.2) - redis-namespace (1.0.3) - redis (< 3.0.0) + redis (3.0.1) + redis-namespace (1.2.0) + redis (~> 3.0.0) redisk (0.2.2) redis (>= 0.1.1) redis-namespace (>= 0.1.0) - resque (1.20.0) + resque (1.21.0) multi_json (~> 1.0) - redis-namespace (~> 1.0.2) + redis-namespace (~> 1.0) sinatra (>= 0.9.2) vegas (~> 0.1.2) resque-status (0.3.3) @@ -254,46 +263,50 @@ GEM resque_mailer (2.1.0) actionmailer (~> 3.0) rr (1.0.4) - rspec (2.10.0) - rspec-core (~> 2.10.0) - rspec-expectations (~> 2.10.0) - rspec-mocks (~> 2.10.0) - rspec-core (2.10.1) - rspec-expectations (2.10.0) + rspec (2.11.0) + rspec-core (~> 2.11.0) + rspec-expectations (~> 2.11.0) + rspec-mocks (~> 2.11.0) + rspec-core (2.11.0) + rspec-expectations (2.11.1) diff-lcs (~> 1.1.3) - rspec-mocks (2.10.1) - rspec-rails (2.10.1) + rspec-mocks (2.11.1) + rspec-rails (2.11.0) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec (~> 2.10.0) + rspec (~> 2.11.0) ruby-haml-js (0.0.3) execjs sprockets (>= 2.0.0) - ruby-openid (2.1.8) + ruby-openid (2.2.0) + rubypython (0.5.3) + blankslate (>= 2.1.2.3) + ffi (~> 1.0.7) russian (0.6.0) i18n (>= 0.5.0) - rvm-capistrano (1.2.2) + rvm-capistrano (1.2.3) capistrano (>= 2.0.0) sanitize (2.0.3) nokogiri (>= 1.4.4, < 1.6) - sass (3.1.19) + sass (3.1.20) sass-rails (3.2.5) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) shotgun (0.9) rack (>= 1.0) - shoulda (3.0.1) - shoulda-context (~> 1.0.0) - shoulda-matchers (~> 1.0.0) + shoulda (3.1.0) + shoulda-context (~> 1.0) + shoulda-matchers (~> 1.2) shoulda-context (1.0.0) - shoulda-matchers (1.0.0) + shoulda-matchers (1.2.0) + activesupport (>= 3.0.0) sinatra (1.3.2) rack (~> 1.3, >= 1.3.6) rack-protection (~> 1.2) tilt (~> 1.3, >= 1.3.3) - skinny (0.2.0) + skinny (0.2.1) eventmachine (~> 0.12) thin (~> 1.2) sprockets (2.1.3) @@ -302,22 +315,22 @@ GEM tilt (~> 1.1, != 1.3.0) sqlite3 (1.3.6) state_machine (1.1.2) - systemu (2.5.1) + systemu (2.5.2) therubyracer (0.10.1) libv8 (~> 3.3.10) - thin (1.3.1) + thin (1.4.1) daemons (>= 1.0.9) eventmachine (>= 0.12.6) rack (>= 1.0.0) - thor (0.15.2) + thor (0.15.4) tilt (1.3.3) treetop (1.4.10) polyglot polyglot (>= 0.3.1) tzinfo (0.3.33) - uglifier (1.2.4) + uglifier (1.2.6) execjs (>= 0.3.0) - multi_json (>= 1.0.2) + multi_json (~> 1.3) unicorn (4.3.1) kgio (~> 2.6) rack @@ -326,7 +339,7 @@ GEM macaddr (~> 1.0) vegas (0.1.11) rack (>= 1.0.0) - warden (1.1.1) + warden (1.2.1) rack (>= 1.0) whenever (0.7.3) activesupport (>= 2.3.4) @@ -341,20 +354,21 @@ PLATFORMS DEPENDENCIES RedCloth - airbrake (~> 3.1.1) + airbrake (~> 3.1.2) ancestry (~> 1.3.0) bluepill (~> 0.0.60) - cancan (~> 1.6.7) + cancan (= 1.6.7) cape capistrano capistrano_colors charlock_holmes (~> 0.6.8) coffee-rails (~> 3.2.2) - compass-rails (~> 1.0.2) + compass-rails (~> 1.0.3) creole - devise (~> 2.0.4) + devise (~> 2.1.2) diff-display (~> 0.0.1) - factory_girl_rails (~> 3.4.0) + factory_girl_rails (~> 3.5.0) + github-linguist (~> 2.0.1) gollum (= 1.3.1) grack! grit! @@ -365,12 +379,12 @@ DEPENDENCIES jquery-rails (~> 2.0.2) mailcatcher meta-tags (~> 1.2.5) - newrelic_rpm (~> 3.3.5) - omniauth (~> 1.0.3) + newrelic_rpm (~> 3.4.0.1) + omniauth (~> 1.1.0) omniauth-openid (~> 1.0.1) - paperclip (~> 3.0.4) + paperclip (~> 3.1.3) perform_later (~> 1.3.0) - pg (~> 0.13.2) + pg (~> 0.14.0) rails (= 3.2.6) rails-backbone (~> 0.7.2) rails3-generators @@ -378,11 +392,11 @@ DEPENDENCIES rdiscount redcarpet (= 1.17.2) redhillonrails_core! - resque (~> 1.20.0) + resque (~> 1.21.0) resque-status (~> 0.3.3) resque_mailer (~> 2.1.0) rr (~> 1.0.4) - rspec-rails (~> 2.10.1) + rspec-rails (~> 2.11.0) ruby-haml-js (~> 0.0.3) russian (~> 0.6.0) rvm-capistrano diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 642ee629b..b191227aa 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -17,6 +17,7 @@ class ApplicationController < ActionController::Base rescue_from CanCan::AccessDenied do |exception| redirect_to forbidden_url, :alert => t("flash.exception_message") end + rescue_from Grit::NoSuchPathError, :with => :not_found protected @@ -53,4 +54,8 @@ class ApplicationController < ActionController::Base "application" end end + + def not_found + raise ActionController::RoutingError.new('Not Found') + end end diff --git a/app/controllers/projects/build_lists_controller.rb b/app/controllers/projects/build_lists_controller.rb index cb5115741..eea85eb9c 100644 --- a/app/controllers/projects/build_lists_controller.rb +++ b/app/controllers/projects/build_lists_controller.rb @@ -46,7 +46,7 @@ class Projects::BuildListsController < Projects::BaseController Arch.where(:id => params[:arches]).each do |arch| Platform.main.where(:id => params[:build_for_platforms]).each do |build_for_platform| @build_list = @project.build_lists.build(params[:build_list]) - @build_list.commit_hash = @project.git_repository.commits(@build_list.project_version.match(/^latest_(.+)/).to_a.last || @build_list.project_version).first.id if @build_list.project_version + @build_list.commit_hash = @project.repo.commits(@build_list.project_version.match(/^latest_(.+)/).to_a.last || @build_list.project_version).first.id if @build_list.project_version @build_list.build_for_platform = build_for_platform; @build_list.arch = arch; @build_list.user = current_user @build_list.include_repos = @build_list.include_repos.select {|ir| @build_list.build_for_platform.repository_ids.include? ir.to_i} @build_list.priority = current_user.build_priority # User builds more priority than mass rebuild with zero priority @@ -98,7 +98,6 @@ class Projects::BuildListsController < Projects::BaseController else @build_list.fail_publish end - render :nothing => true, :status => 200 end diff --git a/app/controllers/projects/comments_controller.rb b/app/controllers/projects/comments_controller.rb index 371365eb9..3b36c3456 100644 --- a/app/controllers/projects/comments_controller.rb +++ b/app/controllers/projects/comments_controller.rb @@ -41,7 +41,7 @@ class Projects::CommentsController < Projects::BaseController def find_commentable @commentable = params[:issue_id].present? && @project.issues.find_by_serial_id(params[:issue_id]) || - params[:commit_id].present? && @project.git_repository.commit(params[:commit_id]) + params[:commit_id].present? && @project.repo.commit(params[:commit_id]) end def find_or_build_comment diff --git a/app/controllers/projects/commit_subscribes_controller.rb b/app/controllers/projects/commit_subscribes_controller.rb index de5b2ac6e..b7dbc31c7 100644 --- a/app/controllers/projects/commit_subscribes_controller.rb +++ b/app/controllers/projects/commit_subscribes_controller.rb @@ -25,7 +25,7 @@ class Projects::CommitSubscribesController < Projects::BaseController protected def find_commit - @commit = @project.git_repository.commit(params[:commit_id]) + @commit = @project.repo.commit(params[:commit_id]) @options = {:project_id => @project.id, :subscribeable_id => @commit.id.hex, :subscribeable_type => @commit.class.name, :user_id => current_user.id} end end diff --git a/app/controllers/projects/git/base_controller.rb b/app/controllers/projects/git/base_controller.rb index 37168d764..a77c39ffd 100644 --- a/app/controllers/projects/git/base_controller.rb +++ b/app/controllers/projects/git/base_controller.rb @@ -4,36 +4,19 @@ class Projects::Git::BaseController < Projects::BaseController skip_before_filter :authenticate_user!, :only => [:show, :index, :blame, :raw, :archive] if APP_CONFIG['anonymous_access'] load_and_authorize_resource :project - before_filter :find_git_repository - before_filter :find_tags - before_filter :find_branches - before_filter :set_treeish - before_filter :set_current_tag - before_filter :set_current_branch + before_filter :set_treeish_and_path + before_filter :set_branch_and_tree protected - def find_git_repository - @git_repository = @project.git_repository - end - - def find_tags - @tags = @git_repository.tags - end - - def find_branches - @branches = @git_repository.branches - end - - def set_treeish + def set_treeish_and_path @treeish = params[:treeish].presence || @project.default_branch + @path = params[:path] end - def set_current_tag - @current_tag = @tags.select{|t| t.name == @treeish }.first - end - - def set_current_branch - @current_branch = @branches.select{|b| b.name == @treeish }.first + def set_branch_and_tree + @branch = @project.repo.branches.detect{|b| b.name == @treeish} + @tree = @project.repo.tree(@treeish) + # raise Grit::NoSuchPathError if @tree.blobs.blank? end end diff --git a/app/controllers/projects/git/blobs_controller.rb b/app/controllers/projects/git/blobs_controller.rb index b8abb0799..96dc586dc 100644 --- a/app/controllers/projects/git/blobs_controller.rb +++ b/app/controllers/projects/git/blobs_controller.rb @@ -1,34 +1,17 @@ # -*- encoding : utf-8 -*- class Projects::Git::BlobsController < Projects::Git::BaseController - before_filter :find_tree - before_filter :find_branch - before_filter :set_path_blob + before_filter :set_blob + before_filter lambda {authorize! :write, @project}, :only => [:edit, :update] def show - redirect_to project_path(@project) and return unless @blob.present? - if params[:raw] - response.headers['Cache-Control'] = "public, max-age=#{12.hours.to_i}" - response.headers['Content-Type'] = @blob.mime_type - response.headers['Content-Disposition'] = 'inline' - render(:text => @blob.data) and return - end end def edit - redirect_to project_path(@project) and return unless @blob.present? - authorize! :write, @project end def update - redirect_to project_path(@project) and return unless @blob.present? - authorize! :write, @project - # Here might be callbacks for notification purposes: - # @git_repository.after_update_file do |repo, sha| - # end - - res = @git_repository.update_file(params[:path], params[:content].gsub("\r", ''), - :message => params[:message].gsub("\r", ''), :actor => current_user, :head => @treeish) - if res + if @project.update_file(params[:path], params[:content].gsub("\r", ''), + :message => params[:message].gsub("\r", ''), :actor => current_user, :head => @treeish) flash[:notice] = t("flash.blob.successfully_updated", :name => params[:path]) else flash[:notice] = t("flash.blob.updating_error", :name => params[:path]) @@ -37,28 +20,17 @@ class Projects::Git::BlobsController < Projects::Git::BaseController end def blame - @blame = Grit::Blob.blame(@git_repository.repo, @commit.id, @path) + @blame = Grit::Blob.blame(@project.repo, @commit.id, @path) end def raw - redirect_to project_path(@project) and return unless @blob.present? - headers["Content-Disposition"] = %[attachment;filename="#{@blob.name}"] - render :text => @blob.data, :content_type => @blob.mime_type + send_data @blob.data, :type => @blob.content_type, :disposition => @blob.disposition end protected - def find_branch - @branch = @project.branch(@treeish) - end - - def set_path_blob - @path = params[:path] - @blob = @tree / @path - @commit = @git_repository.log(@treeish, @path, :max_count => 1).first - end - - def find_tree - @tree = @git_repository.tree(@treeish) + def set_blob + @blob = @tree / @path or raise Grit::NoSuchPathError + @commit = @project.repo.log(@treeish, @path, :max_count => 1).first end end diff --git a/app/controllers/projects/git/commits_controller.rb b/app/controllers/projects/git/commits_controller.rb index cf9a20021..31816996c 100644 --- a/app/controllers/projects/git/commits_controller.rb +++ b/app/controllers/projects/git/commits_controller.rb @@ -1,42 +1,19 @@ # -*- encoding : utf-8 -*- class Projects::Git::CommitsController < Projects::Git::BaseController - helper_method :split_commits_by_date - def index - @branch_name = params[:treeish] || @project.default_branch - @branch = @project.branch(@branch_name) - @path = params[:path] - if @path.present? - @commits = @git_repository.repo.log(@branch_name, @path) - @render_paginate = false + @commits = @project.repo.log(@treeish, @path) else - @commits, @page, @last_page = @git_repository.paginate_commits(@branch_name, :page => params[:page]) - @render_paginate = true + @commits, @page, @last_page = @project.paginate_commits(@treeish, :page => params[:page]) end end def show - @commit = @git_repository.commit(params[:id]) # @git_repository.commits(params[:id]).first - + @commit = @project.repo.commit(params[:id]) respond_to do |format| format.html format.diff { render :text => (@commit.diffs.map(&:diff).join("\n") rescue ''), :content_type => "text/plain" } format.patch { render :text => (@commit.to_patch rescue ''), :content_type => "text/plain" } end end - - protected - - def split_commits_by_date(commits) - res = commits.sort{|x, y| y.authored_date <=> x.authored_date}.inject({}) do |h, commit| - dt = commit.authored_date - h[dt.year] ||= {} - h[dt.year][dt.month] ||= {} - h[dt.year][dt.month][dt.day] ||= [] - h[dt.year][dt.month][dt.day] << commit - h - end - return res - end end diff --git a/app/controllers/projects/git/trees_controller.rb b/app/controllers/projects/git/trees_controller.rb index 9655ffd4b..45dae2aa1 100644 --- a/app/controllers/projects/git/trees_controller.rb +++ b/app/controllers/projects/git/trees_controller.rb @@ -1,32 +1,21 @@ # -*- encoding : utf-8 -*- class Projects::Git::TreesController < Projects::Git::BaseController + before_filter lambda{redirect_to @project if params[:treeish] == @project.default_branch and params[:path].blank?}, :only => 'show' + def show - redirect_to project_path(@project) and return if params[:treeish] == @project.default_branch and params[:path].blank? - - @path = params[:path] - @tree = @git_repository.tree(@treeish) - @branch = @project.branch(@treeish) - -# @commit = @git_repository.commits(@treeish, 1).first -# Raises Grit::Git::GitTimeout - @commit = @branch.present? ? @branch.commit() : @git_repository.log(@treeish, @path, :max_count => 1).first - render "empty" and return unless @commit - - @tree = @tree / @path if @path + @tree = @tree / @path if @path.present? + @commit = @branch.present? ? @branch.commit() : @project.repo.log(@treeish, @path, :max_count => 1).first + render 'empty' unless @commit end def archive - treeish = params[:treeish].presence || @project.default_branch - format = params[:format] || 'tar' - commit = @project.git_repository.log(treeish, nil, :max_count => 1).first - if !commit or !['tar', 'zip'].include?(format) - raise ActiveRecord::RecordNotFound#("Couldn't send Project archive with id=#{@project.id}, treeish=#{treeish} and format=#{format}") - end - name = "#{@project.owner.uname}-#{@project.name}#{@project.tags.include?(treeish) ? "-#{treeish}" : ''}-#{commit.id[0..19]}" - fullname = "#{name}.#{format == 'tar' ? 'tar.gz' : 'zip'}" + @commit = @project.repo.log(@treeish, nil, :max_count => 1).first + raise Grit::NoSuchPathError unless @commit + name = "#{@project.owner.uname}-#{@project.name}#{@project.repo.tags.include?(@treeish) ? "-#{@treeish}" : ''}-#{@commit.id[0..19]}" + fullname = "#{name}.#{params[:format] == 'tar' ? 'tar.gz' : 'zip'}" file = Tempfile.new fullname, 'tmp' - system("cd #{@project.path}; git archive --format=#{format} --prefix=#{name}/ #{treeish} #{format == 'tar' ? ' | gzip -9' : ''} > #{file.path}") + system("cd #{@project.path}; git archive --format=#{params[:format]} --prefix=#{name}/ #{@treeish} #{params[:format] == 'tar' ? ' | gzip -9' : ''} > #{file.path}") file.close - send_file file.path, :disposition => 'attachment', :type => "application/#{format == 'tar' ? 'x-tar-gz' : 'zip'}", :filename => fullname + send_file file.path, :disposition => 'attachment', :type => "application/#{params[:format] == 'tar' ? 'x-tar-gz' : 'zip'}", :filename => fullname end end diff --git a/app/controllers/projects/projects_controller.rb b/app/controllers/projects/projects_controller.rb index b948f5d7c..845d89ccb 100644 --- a/app/controllers/projects/projects_controller.rb +++ b/app/controllers/projects/projects_controller.rb @@ -1,11 +1,7 @@ # -*- encoding : utf-8 -*- class Projects::ProjectsController < Projects::BaseController before_filter :authenticate_user! - load_and_authorize_resource - # TODO WTF ? fork, update, sections not authorize - before_filter do |controller| - authorize! params[:action].to_sym, @project if params[:action] != 'index' - end + load_and_authorize_resource :id_param => :project_name # to force member actions load def index @projects = Project.accessible_by(current_ability, :membered) diff --git a/app/helpers/git_helper.rb b/app/helpers/git_helper.rb index 78af65bda..f3ea0bdc6 100644 --- a/app/helpers/git_helper.rb +++ b/app/helpers/git_helper.rb @@ -4,7 +4,7 @@ module GitHelper def render_path # TODO: Looks ugly, rewrite with clear mind. if @path.present? - if @treeish == "master" + if @treeish == @project.default_branch res = "#{link_to @project.name, tree_path(@project)} / " else res = "#{link_to @project.name, tree_path(@project, @treeish)} / " @@ -36,22 +36,6 @@ module GitHelper res.html_safe end - def render_blob(blob) - blob.data.split("\n").collect do |line| - content_tag :div, line.present? ? h(line) : tag(:br) - end.join.html_safe - end - - def choose_render_way(blob) - case - when blob.mime_type.match(/image/); :image - when blob.binary?; :binary - else - @text = @blob.data.split("\n") - :text - end - end - def iterate_path(path, &block) path.split(File::SEPARATOR).inject('') do |a, e| if e != '.' and e != '..' @@ -71,10 +55,29 @@ module GitHelper current = url_for(p).split('?', 2).first res = [] - res << [I18n.t('layout.git.repositories.commits'), [truncate(params[:treeish], :length => 20)]] unless (project.branches + project.tags).map(&:name).include?(params[:treeish] || project.default_branch) - res << [I18n.t('layout.git.repositories.branches'), project.branches.map{|b| [truncate(b.name, :length => 20), url_for(p.merge :treeish => b.name).split('?', 2).first]}] - res << [I18n.t('layout.git.repositories.tags'), project.tags.map{|t| [truncate(t.name, :length => 20), url_for(p.merge :treeish => t.name).split('?', 2).first]}] + res << [I18n.t('layout.git.repositories.commits'), [truncate(params[:treeish], :length => 20)]] unless (project.repo.branches + project.repo.tags).map(&:name).include?(params[:treeish] || project.default_branch) + res << [I18n.t('layout.git.repositories.branches'), project.repo.branches.map{|b| [truncate(b.name, :length => 20), url_for(p.merge :treeish => b.name).split('?', 2).first]}] + res << [I18n.t('layout.git.repositories.tags'), project.repo.tags.map{|t| [truncate(t.name, :length => 20), url_for(p.merge :treeish => t.name).split('?', 2).first]}] grouped_options_for_select(res, current) end + + def versions_for_group_select(project) + [ + ['Branches', project.repo.branches.map{|b| "latest_#{b.name}"}], + ['Tags', project.repo.tags.map(&:name)] + ] + end + + def split_commits_by_date(commits) + commits.sort{|x, y| y.authored_date <=> x.authored_date}.inject({}) do |h, commit| + dt = commit.authored_date + h[dt.year] ||= {} + h[dt.year][dt.month] ||= {} + h[dt.year][dt.month][dt.day] ||= [] + h[dt.year][dt.month][dt.day] << commit + h + end + end end + diff --git a/app/models/activity_feed_observer.rb b/app/models/activity_feed_observer.rb index 94a12fbc2..a62366f1f 100644 --- a/app/models/activity_feed_observer.rb +++ b/app/models/activity_feed_observer.rb @@ -74,7 +74,7 @@ class ActivityFeedObserver < ActiveRecord::Observer change_type = record.change_type branch_name = record.refname.split('/').last - last_commits = record.project.git_repository.repo.log(branch_name, nil).first(3) + last_commits = record.project.repo.log(branch_name, nil).first(3) first_commiter = User.find_by_email(last_commits[0].author.email) unless last_commits.blank? last_commits = last_commits.collect do |commit| #:author => 'author' [commit.sha, commit.message] @@ -87,7 +87,7 @@ class ActivityFeedObserver < ActiveRecord::Observer else kind = 'git_new_push_notification' options = {:project_id => record.project.id, :project_name => record.project.name, :last_commits => last_commits, :branch_name => branch_name, - :change_type => change_type, :user_email => record.project.git_repository.repo.log(branch_name, nil).first.author.email, + :change_type => change_type, :user_email => record.project.repo.repo.log(branch_name, nil).first.author.email, :project_owner => record.project.owner.uname} options.merge!({:user_id => first_commiter.id, :user_name => first_commiter.name}) if first_commiter end diff --git a/app/models/build_list.rb b/app/models/build_list.rb index a3f0b416b..3df87673d 100644 --- a/app/models/build_list.rb +++ b/app/models/build_list.rb @@ -189,7 +189,7 @@ class BuildList < ActiveRecord::Base # TODO: remove 'return' after deployment ABF kernel 2.0 return if pkg.nil? # For old client that does not sends data about packages self.package_version = "#{pkg.platform.name}-#{pkg.version}-#{pkg.release}" - system("cd #{self.project.git_repository.path} && git tag #{self.package_version} #{self.commit_hash}") # TODO REDO through grit + system("cd #{self.project.repo.path} && git tag #{self.package_version} #{self.commit_hash}") # TODO REDO through grit save end diff --git a/app/models/build_list/filter.rb b/app/models/build_list/filter.rb index b6095fc71..7de174460 100644 --- a/app/models/build_list/filter.rb +++ b/app/models/build_list/filter.rb @@ -20,15 +20,7 @@ class BuildList::Filter build_lists = build_lists.scoped_to_is_circle(@options[:is_circle]) if @options[:is_circle].present? build_lists = build_lists.scoped_to_project_name(@options[:project_name]) if @options[:project_name] build_lists = build_lists.by_mass_build(@options[:mass_build_id]) if @options[:mass_build_id] - -# TODO [BuildList#created_at filters] Uncomment here and in build_lists/_filter.html.haml to return filters -# -# if @options[:created_at_start] || @options[:created_at_end] -# build_lists = build_lists.for_creation_date_period(@options[:created_at_start], @options[:created_at_end]) -# end - if @options[:updated_at_start] || @options[:updated_at_end] - build_lists = build_lists.for_notified_date_period(@options[:updated_at_start], @options[:updated_at_end]) - end + build_lists = build_lists.for_notified_date_period(@options[:updated_at_start], @options[:updated_at_end]) if @options[:updated_at_start] || @options[:updated_at_end] end build_lists @@ -49,8 +41,6 @@ class BuildList::Filter @options = HashWithIndifferentAccess.new(options.reverse_merge({ :ownership => nil, :status => nil, - :created_at_start => nil, - :created_at_end => nil, :updated_at_start => nil, :updated_at_end => nil, :arch_id => nil, @@ -64,8 +54,6 @@ class BuildList::Filter @options[:ownership] = @options[:ownership].presence || (@project || !@user ? 'index' : 'owned') @options[:status] = @options[:status].present? ? @options[:status].to_i : nil - @options[:created_at_start] = build_date_from_params(:created_at_start, @options) - @options[:created_at_end] = build_date_from_params(:created_at_end, @options) @options[:updated_at_start] = build_date_from_params(:updated_at_start, @options) @options[:updated_at_end] = build_date_from_params(:updated_at_end, @options) @options[:project_version] = @options[:project_version].presence diff --git a/app/models/comment.rb b/app/models/comment.rb index e5c22c36f..f73fa7d67 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -15,7 +15,7 @@ class Comment < ActiveRecord::Base attr_accessible :body def commentable - commit_comment? ? project.git_repository.commit(commentable_id.to_s(16)) : super + commit_comment? ? project.repo.commit(commentable_id.to_s(16)) : super end def commentable=(c) diff --git a/app/models/git/repository.rb b/app/models/git/repository.rb deleted file mode 100644 index 057ba4968..000000000 --- a/app/models/git/repository.rb +++ /dev/null @@ -1,130 +0,0 @@ -# -*- encoding : utf-8 -*- -class Git::Repository - delegate :commits, :commit, :tree, :tags, :heads, :commit_count, :log, :branches, :to => :repo - - attr_accessor :path, :name, :repo, :last_actor - - def initialize(path) - @path = path - @update_callbacks = [] - end - - def master - commits('master', 1).first - end - - def to_s - name - end - - def repo - @repo ||= Grit::Repo.new(path) rescue Grit::Repo.new(GAP_REPO_PATH) - end - - # Adds a callback to be fired after update file. - # - # block - A block that expects this Git::Repository instance and the created - # commit's SHA1 as the arguments. - # - # For example: - # - # after_update_file do |repo, sha| - # # callback body - # end - # - # Returns nothing. - def after_update_file(&block) - @update_callbacks << block - end - - # Writes file to repo and runs 'after_update_file' callbacks - # - # path - path to file in repository - # data - new content of file - # options - an optional Hash of options - # :head - branch name to write this commit to - # (Default: 'master') - # :actor - author of this commit. (See Git::Repository#get_actor) - # (Default: nil) - # :message - commit message - # (Default: "Updated file ") - # - # Returns commits sha if committing was successful and false otherwise - def update_file(path, data, options = {}) - head = options[:head].to_s || 'master' - actor = get_actor(options[:actor]) - filename = File.split(path).last - message = options[:message] - message = "Updated file #{filename}" if message.nil? or message.empty? - - # can not write to unexisted branch - return false if branches.select{|b| b.name == head}.size != 1 - - parent = commits(head).first - - index = repo.index - index.read_tree(parent.tree.id) - - # can not create new file - return false if (index.current_tree / path).nil? - - index.add(path, data) - sha = index.commit(message, :parents => [parent], :actor => actor, - :last_tree => parent.tree.id, :head => head) - # call all defined callbacks - @update_callbacks.each do |cb| - cb.call(self, sha) - end - sha - end - - def self.create(path) - repo = Grit::Repo.init_bare(path) - repo.enable_daemon_serve - end - - def paginate_commits(treeish, options = {}) - options[:page] = 1 unless options[:page].present? - options[:page] = options[:page].to_i - - options[:per_page] = 20 unless options[:per_page].present? - options[:per_page] = options[:per_page].to_i - - skip = options[:per_page] * (options[:page] - 1) - last_page = (skip + options[:per_page]) >= commit_count(treeish) - - [commits(treeish, options[:per_page], skip), options[:page], last_page] - end - - # Pretty object inspection - def inspect - %Q{#} - end - - protected - - # Creates new Grit::Actor instance - # - # Might be: - # * A Hash containing :name and :email - # * An instance of Grit::Actor - # * A String like "John Doe - # * Any object that responds to `name` and `email` methods - def get_actor(actor = nil) - @last_actor = case actor.class.to_s - when 'Grit::Actor' then options[:actor] - when 'Hash' then Grit::Actor.new(actor[:name], actor[:email]) - when 'String' then Grit::Actor.from_stirng(actor) - else begin - if actor.respond_to?(:name) and actor.respond_to?(:email) - Grit::Actor.new(actor.name, actor.email) - else - config = Grit::Config.new(repo) - Grit::Actor.new(config['user.name'], config['user.email']) - end - end - end - @last_actor - end - -end diff --git a/app/models/project.rb b/app/models/project.rb index 927e7da61..458fba2bc 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -25,9 +25,6 @@ class Project < ActiveRecord::Base validates :owner, :presence => true validate { errors.add(:base, :can_have_less_or_equal, :count => MAX_OWN_PROJECTS) if owner.projects.size >= MAX_OWN_PROJECTS } - validates_attachment_size :srpm, :less_than => 500.megabytes - validates_attachment_content_type :srpm, :content_type => ['application/octet-stream', "application/x-rpm", "application/x-redhat-package-manager"], :message => I18n.t('layout.invalid_content_type') - attr_accessible :name, :description, :visibility, :srpm, :is_package, :default_branch, :has_issues, :has_wiki attr_readonly :name @@ -40,34 +37,50 @@ class Project < ActiveRecord::Base scope :addable_to_repository, lambda { |repository_id| where("projects.id NOT IN (SELECT project_to_repositories.project_id FROM project_to_repositories WHERE (project_to_repositories.repository_id = #{ repository_id }))") } after_create :attach_to_personal_repository - after_create :create_git_repo - after_save :create_wiki - after_commit(:on => :create) {|p| p.fork_git_repo unless p.is_root?} # later with resque - - after_destroy :destroy_git_repo - after_destroy :destroy_wiki - after_commit(:on => :create) {|p| p.import_attached_srpm if p.srpm?}# later with resque # should be after create_git_repo - # after_rollback lambda { destroy_git_repo rescue true if new_record? } has_ancestry - has_attached_file :srpm - include Modules::Models::Owner + include Modules::Models::Git + include Modules::Models::Wiki + + class << self + def find_by_owner_and_name(owner_name, project_name) + owner = User.find_by_uname(owner_name) || Group.find_by_uname(owner_name) || User.by_uname(owner_name).first || Group.by_uname(owner_name).first and + scoped = where(:owner_id => owner.id, :owner_type => owner.class) and + scoped.find_by_name(project_name) || scoped.by_name(project_name).first + # owner.projects.find_by_name(project_name) || owner.projects.by_name(project_name).first # TODO force this work? + end + + def find_by_owner_and_name!(owner_name, project_name) + find_by_owner_and_name(owner_name, project_name) or raise ActiveRecord::RecordNotFound + end + end def to_param name end - def self.find_by_owner_and_name(owner_name, project_name) - owner = User.find_by_uname(owner_name) || Group.find_by_uname(owner_name) || User.by_uname(owner_name).first || Group.by_uname(owner_name).first and - scoped = where(:owner_id => owner.id, :owner_type => owner.class) and - scoped.find_by_name(project_name) || scoped.by_name(project_name).first - # owner.projects.find_by_name(project_name) || owner.projects.by_name(project_name).first # TODO force this work? + def members + collaborators + groups.map(&:members).flatten end - def self.find_by_owner_and_name!(owner_name, project_name) - find_by_owner_and_name(owner_name, project_name) or raise ActiveRecord::RecordNotFound + def platforms + @platforms ||= repositories.map(&:platform).uniq + end + + def owner_and_admin_ids + recipients = self.relations.by_role('admin').where(:actor_type => 'User').map { |rel| rel.read_attribute(:actor_id) } + recipients = recipients | [self.owner_id] if self.owner_type == 'User' + recipients + end + + def public? + visibility == 'open' + end + + def owner?(user) + owner == user end def build_for(platform, user, arch = 'i586', auto_publish = false, mass_build_id = nil, priority = 0) @@ -93,85 +106,6 @@ class Project < ActiveRecord::Base end end - def tags - self.git_repository.tags #.sort_by{|t| t.name.gsub(/[a-zA-Z.]+/, '').to_i} - end - - def branches - self.git_repository.branches - end - - def last_active_branch - @last_active_branch ||= branches.inject do |r, c| - r_last = r.commit.committed_date || r.commit.authored_date unless r.nil? - c_last = c.commit.committed_date || c.commit.authored_date - if r.nil? or r_last < c_last - r = c - end - r - end - @last_active_branch - end - - def branch(name = nil) - name = default_branch if name.blank? - branches.select{|b| b.name == name}.first - end - - def tree_info(tree, treeish = nil, path = nil) - treeish = tree.id unless treeish.present? - # initialize result as hash of => nil - res = (tree.trees.sort + tree.blobs.sort).inject({}){|h, e| h.merge!({e => nil})} - # fills result vith commits that describes this file - res = res.inject(res) do |h, (entry, commit)| - # only if commit == nil ... - if commit.nil? and entry.respond_to? :name - # ... find last commit corresponds to this file ... - c = git_repository.log(treeish, File.join([path, entry.name].compact), :max_count => 1).first - # ... and add it to result. - h[entry] = c - # find another files, that linked to this commit and set them their commit - # c.diffs.map{|diff| diff.b_path.split(File::SEPARATOR, 2).first}.each do |name| - # h.each_pair do |k, v| - # h[k] = c if k.name == name and v.nil? - # end - # end - end - h - end - end - - def versions - tags.map(&:name) + branches.map{|b| "latest_#{b.name}"} - end - - def versions_for_group_select - [ - ['Branches', branches.map{|b| "latest_#{b.name}"}], - ['Tags', tags.map(&:name)] - ] - end - - def members - collaborators + groups.map(&:members).flatten - end - - def git_repository - @git_repository ||= Git::Repository.new(path) - end - - def git_repo_name - File.join owner.uname, name - end - - def wiki_repo_name - File.join owner.uname, "#{name}.wiki" - end - - def public? - visibility == 'open' - end - def fork(new_owner) dup.tap do |c| c.parent_id = id @@ -181,12 +115,8 @@ class Project < ActiveRecord::Base end end - def path - build_path(git_repo_name) - end - - def wiki_path - build_wiki_path(git_repo_name) + def human_average_build_time + I18n.t("layout.projects.human_average_build_time", {:hours => (average_build_time/3600).to_i, :minutes => (average_build_time%3600/60).to_i}) end def xml_rpc_create(repository) @@ -207,97 +137,9 @@ class Project < ActiveRecord::Base end end - def platforms - @platforms ||= repositories.map(&:platform).uniq - end - - def import_srpm(srpm_path = srpm.path, branch_name = 'import') - system("#{Rails.root.join('bin', 'import_srpm.sh')} #{srpm_path} #{path} #{branch_name} >> /dev/null 2>&1") - end - - def owner?(user) - owner == user - end - - def owner_and_admin_ids - recipients = self.relations.by_role('admin').where(:actor_type => 'User').map { |rel| rel.read_attribute(:actor_id) } - recipients = recipients | [self.owner_id] if self.owner_type == 'User' - recipients - end - - def human_average_build_time - time = average_build_time - I18n.t("layout.projects.human_average_build_time", {:hours => (time/3600).to_i, :minutes => (time%3600/60).to_i}) - end - protected - def build_path(dir) - File.join(APP_CONFIG['root_path'], 'git_projects', "#{dir}.git") - end - - def build_wiki_path(dir) - File.join(APP_CONFIG['root_path'], 'git_projects', "#{dir}.wiki.git") - end - def attach_to_personal_repository repositories << self.owner.personal_repository if !repositories.exists?(:id => self.owner.personal_repository) end - - def create_git_repo - if is_root? - Grit::Repo.init_bare(path) - write_hook - end - end - - def fork_git_repo - dummy = Grit::Repo.new(path) rescue parent.git_repository.repo.fork_bare(path) - write_hook - end - later :fork_git_repo, :queue => :fork_import - - def destroy_git_repo - FileUtils.rm_rf path - end - - def import_attached_srpm - if srpm? - import_srpm # srpm.path - self.srpm = nil; save # clear srpm - end - end - later :import_attached_srpm, :queue => :fork_import - - def create_wiki - if has_wiki && !FileTest.exist?(wiki_path) - Grit::Repo.init_bare(wiki_path) - wiki = Gollum::Wiki.new(wiki_path, {:base_path => Rails.application.routes.url_helpers.project_wiki_index_path(owner, self)}) - wiki.write_page('Home', :markdown, I18n.t("wiki.seed.welcome_content"), - {:name => owner.name, :email => owner.email, :message => 'Initial commit'}) - end - end - - def destroy_wiki - FileUtils.rm_rf wiki_path - end - - def write_hook - is_production = Rails.env == "production" - hook = File.join(::Rails.root.to_s, 'tmp', "post-receive-hook") - FileUtils.cp(File.join(::Rails.root.to_s, 'bin', "post-receive-hook.partial"), hook) - File.open(hook, 'a') do |f| - s = "\n /bin/bash -l -c \"cd #{is_production ? '/srv/rosa_build/current' : Rails.root.to_s} && #{is_production ? 'RAILS_ENV=production' : ''} bundle exec rake hook:enqueue[$owner,$reponame,$newrev,$oldrev,$ref,$newrev_type,$oldrev_type]\"" - s << " > /dev/null 2>&1" if is_production - s << "\ndone\n" - f.write(s) - f.chmod(0755) - end - - hook_file = File.join(path, 'hooks', 'post-receive') - FileUtils.cp(hook, hook_file) - FileUtils.rm_rf(hook) - - rescue Exception # FIXME - end end diff --git a/app/views/projects/base/_repo_block.html.haml b/app/views/projects/base/_repo_block.html.haml index 0870762d5..f301d63b3 100644 --- a/app/views/projects/base/_repo_block.html.haml +++ b/app/views/projects/base/_repo_block.html.haml @@ -6,8 +6,8 @@ =image_tag 'zip.png', :alt => 'ZIP' %b.caret %ul.dropdown-menu - %li=link_to "tar.gz", archive_path(project, 'tar', @treeish) - %li=link_to "zip", archive_path(project, 'zip', @treeish) + %li=link_to "tar.gz", archive_path(project, @treeish, 'tar') + %li=link_to "zip", archive_path(project, @treeish, 'zip') = text_field_tag :url, git_repo_url(project.git_repo_name), :class => 'name', :spellcheck => 'false', :readonly => true .git_help ? diff --git a/app/views/projects/base/_submenu.html.haml b/app/views/projects/base/_submenu.html.haml index c4bb613fd..8cb83b928 100644 --- a/app/views/projects/base/_submenu.html.haml +++ b/app/views/projects/base/_submenu.html.haml @@ -1,12 +1,12 @@ - content_for :submenu do - - act = action_name.to_sym; contr = controller_name.to_sym + - act = action_name.to_sym; contr = controller_name.to_sym; treeish = params[:treeish].presence || @project.default_branch .left .table-sort-left=image_tag visibility_icon(@project.visibility) .table-sort-right=@project.name %nav %ul - %li= link_to t("project_menu.project"), project_path(@project), :class => (act.in?([:show, :edit]) && contr.in?([:trees, :blobs]) ? 'active' : nil) - %li= link_to t("project_menu.commits"), commits_path(@project), :class => (act.in?([:index, :show]) && contr == :commits ? 'active' : nil) + %li= link_to t("project_menu.project"), tree_path(@project, treeish), :class => (act.in?([:show, :edit]) && contr.in?([:trees, :blobs]) ? 'active' : nil) + %li= link_to t("project_menu.commits"), commits_path(@project, treeish), :class => (act.in?([:index, :show]) && contr == :commits ? 'active' : nil) - if @project.is_package and can?(:read, @project => BuildList) %li= link_to t("project_menu.builds"), project_build_lists_path(@project), :class => (contr == :build_lists ? 'active' : nil) - if @project.has_issues diff --git a/app/views/projects/build_lists/new.html.haml b/app/views/projects/build_lists/new.html.haml index 10024025a..ccda36113 100644 --- a/app/views/projects/build_lists/new.html.haml +++ b/app/views/projects/build_lists/new.html.haml @@ -13,10 +13,7 @@ %h3= t("activerecord.attributes.build_list.save_to_platform") .lineForm= f.select :save_to_platform_id, @project.repositories.collect{|r| ["#{r.platform.name}/#{r.name}", r.platform.id]} %h3= t("activerecord.attributes.build_list.project_version") - - if controller.action_name == 'new' - .lineForm= f.select :project_version, @project.versions_for_group_select, :selected => "latest_" + @project.default_branch - - else - .lineForm= f.select :project_version, @project.versions_for_group_select + .lineForm= f.select :project_version, versions_for_group_select(@project), :selected => params[:build_list].try(:fetch, :project_version) || "latest_" + @project.default_branch %h3= t("activerecord.attributes.build_list.arch") - Arch.recent.each do |arch| .both diff --git a/app/views/projects/git/blobs/_editor.html.haml b/app/views/projects/git/blobs/_editor.html.haml index 874945aee..1298ff0c0 100644 --- a/app/views/projects/git/blobs/_editor.html.haml +++ b/app/views/projects/git/blobs/_editor.html.haml @@ -4,7 +4,7 @@ = render 'fork' .both -= form_tag blob_path(@project, @treeish, @path), :name => 'blob-editor', :method => :put do += form_tag edit_blob_path(@project, @treeish, @path), :name => 'blob-editor', :method => :put do .file= text_area_tag :content, @blob.data, :id => 'code' .both diff --git a/app/views/projects/git/blobs/_render_as_binary.html.haml b/app/views/projects/git/blobs/_render_as_binary.html.haml new file mode 100644 index 000000000..bd7379a10 --- /dev/null +++ b/app/views/projects/git/blobs/_render_as_binary.html.haml @@ -0,0 +1,8 @@ +%table.table.blob + %tr + %td.lines + %td.blob + :plain +
+
#{link_to @blob.basename, raw_path(@project, @treeish, @path)}
+
\ No newline at end of file diff --git a/app/views/projects/git/blobs/_render_as_image.html.haml b/app/views/projects/git/blobs/_render_as_image.html.haml new file mode 100644 index 000000000..ae1ef4884 --- /dev/null +++ b/app/views/projects/git/blobs/_render_as_image.html.haml @@ -0,0 +1,8 @@ +%table.table.blob + %tr + %td.lines + %td.blob + :plain +
+
+
\ No newline at end of file diff --git a/app/views/projects/git/blobs/_render_as_text.html.haml b/app/views/projects/git/blobs/_render_as_text.html.haml new file mode 100644 index 000000000..3105d704e --- /dev/null +++ b/app/views/projects/git/blobs/_render_as_text.html.haml @@ -0,0 +1,6 @@ +.gutter= render_line_numbers(@blob.loc) +#output.formatted.cm-s-default + %pre#code + :preserve + #{h(@blob.data).html_safe} +.both diff --git a/app/views/projects/git/blobs/_show.html.haml b/app/views/projects/git/blobs/_show.html.haml index f867189fd..3f686249c 100644 --- a/app/views/projects/git/blobs/_show.html.haml +++ b/app/views/projects/git/blobs/_show.html.haml @@ -1,40 +1,14 @@ +/ - raise @blob.file_mime_type.inspect %h3= t("layout.projects.files_in_project") .files .l= render 'whereami' = render 'fork' .both -- render_way = choose_render_way(@blob) .file - .top= render 'top', :render_way => render_way - .data - - case render_way - - when :image - %table.table.blob - %tr - %td.lines - %td.blob - :plain -
-
-
- - when :text - .gutter= render_line_numbers(@text.length) - #output.formatted.cm-s-default - %pre#code - =#{render_blob(@blob)} - :preserve - #{h(@blob.data).html_safe} - .both - - when :binary - %table.table.blob - %tr - %td.lines - %td.blob - :plain -
-
#{ link_to @blob.basename, raw_path(@project, @treeish, @path) }
-
+ .top= render 'top' + .data= render "render_as_#{@blob.render_as}" + :javascript $(document).ready(function() { var text = $('#code').text().replace(/&/gi, '&'); diff --git a/app/views/projects/git/blobs/_top.html.haml b/app/views/projects/git/blobs/_top.html.haml index 8073aa9db..a3631075d 100644 --- a/app/views/projects/git/blobs/_top.html.haml +++ b/app/views/projects/git/blobs/_top.html.haml @@ -1,20 +1,20 @@ .l = @blob.mode \| - - if render_way == :text - #{@text.length} lines (#{@text.select{|s| s.strip.length > 0}.length} sloc) + - if @blob.render_as == :text + #{@blob.loc} lines (#{@blob.sloc} sloc) \| = number_to_human_size @blob.size .r - - if render_way == :text and can? :write, @project and @treeish.in? @project.branches.map(&:name) + - if @blob.render_as == :text and can? :write, @project and @branch.present? = link_to "Edit", edit_blob_path(@project, @treeish, @path) \| - - if render_way == :text and params[:action] != 'show' + - if @blob.render_as == :text and params[:action] != 'show' = link_to "Normal", blob_path(@project, @treeish, @path) \| = link_to "Raw", raw_path(@project, @treeish, @path) \| - - if render_way == :text and params[:action] != 'blame' + - if @blob.render_as == :text and params[:action] != 'blame' = link_to "Blame", blame_path(@project, @treeish, @path) \| = link_to "History", commits_path(@project, @treeish, @path) diff --git a/app/views/projects/git/blobs/blame.html.haml b/app/views/projects/git/blobs/blame.html.haml index 81fef4b00..9f19328e8 100644 --- a/app/views/projects/git/blobs/blame.html.haml +++ b/app/views/projects/git/blobs/blame.html.haml @@ -20,7 +20,6 @@ .l= render 'whereami' .both - - render_way = choose_render_way(@blob) .file - .top= render 'top', :render_way => render_way + .top= render 'top' .blame_data= render 'blame_table' if @blame.first.first.present? diff --git a/app/views/projects/git/commits/_commit_diff.html.haml b/app/views/projects/git/commits/_commit_diff.html.haml index c15055706..46f639af9 100644 --- a/app/views/projects/git/commits/_commit_diff.html.haml +++ b/app/views/projects/git/commits/_commit_diff.html.haml @@ -7,4 +7,4 @@ .r= link_to "view file @ #{short_hash_id(commit_id)}", blob_path(@project, commit_id, commit_diff.b_path) .clear - .diff_data= render_diff(commit_diff) unless (@git_repository.tree(commit_id) / commit_diff.b_path).binary? \ No newline at end of file + .diff_data= render_diff(commit_diff) unless (@project.repo.tree(commit_id) / commit_diff.b_path).binary? \ No newline at end of file diff --git a/app/views/projects/git/commits/index.html.haml b/app/views/projects/git/commits/index.html.haml index f3f9cca11..e8221fb1e 100644 --- a/app/views/projects/git/commits/index.html.haml +++ b/app/views/projects/git/commits/index.html.haml @@ -3,4 +3,4 @@ = render 'repo_block', :project => @project = render :partial => 'commits', :object => @commits -= render 'paginate' if @render_paginate += render 'paginate' if @path.blank? diff --git a/app/views/projects/projects/_form.html.haml b/app/views/projects/projects/_form.html.haml index ffede9552..9a7b90ba2 100644 --- a/app/views/projects/projects/_form.html.haml +++ b/app/views/projects/projects/_form.html.haml @@ -35,7 +35,7 @@ .both - if [:edit, :update].include? act .leftlist= t("activerecord.attributes.project.default_branch") - .rightlist= f.select :default_branch, options_from_collection_for_select(@project.branches, :name, :name, @project.default_branch), :class => 'sel80', :id => 'branch_selector' + .rightlist= f.select :default_branch, options_from_collection_for_select(@project.repo.branches, :name, :name, @project.default_branch), :class => 'sel80', :id => 'branch_selector' .both - if [:edit, :update].include? act .leftlist diff --git a/config/routes.rb b/config/routes.rb index 62c3029d3..7b86054f4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -33,7 +33,7 @@ Rosa::Application.routes.draw do end end resources :event_logs, :only => :index - constraints AdminAccess do + constraints Rosa::Constraints::AdminAccess do mount Resque::Server => 'resque' end end @@ -132,7 +132,6 @@ Rosa::Application.routes.draw do end resources :projects, :only => [:index, :new, :create] - scope ':owner_name/:project_name', :constraints => {:project_name => Project::NAME_REGEXP} do # project scope :as => 'project' do resources :wiki do @@ -176,7 +175,7 @@ Rosa::Application.routes.draw do end end # Resource - get '/edit' => 'projects#edit', :as => :edit_project + get '/modify' => 'projects#edit', :as => :edit_project put '/' => 'projects#update' delete '/' => 'projects#destroy' # Member @@ -184,41 +183,43 @@ Rosa::Application.routes.draw do get '/sections' => 'projects#sections', :as => :sections_project post '/sections' => 'projects#sections' delete '/remove_user' => 'projects#remove_user', :as => :remove_user_project - constraints :treeish => /[^\/]+/ do - # Tree - get '/' => "git/trees#show", :as => :project - get '/tree/:treeish(/*path)' => "git/trees#show", :defaults => {:treeish => :master}, :as => :tree, :format => false - # Commits - get '/commits/:treeish(/*path)' => "git/commits#index", :defaults => {:treeish => :master}, :as => :commits, :format => false - get '/commit/:id(.:format)' => "git/commits#show", :as => :commit - # Commit comments - post '/commit/:commit_id/comments(.:format)' => "comments#create", :as => :project_commit_comments - get '/commit/:commit_id/comments/:id(.:format)' => "comments#edit", :as => :edit_project_commit_comment - put '/commit/:commit_id/comments/:id(.:format)' => "comments#update", :as => :project_commit_comment - delete '/commit/:commit_id/comments/:id(.:format)' => "comments#destroy" - # Commit subscribes - post '/commit/:commit_id/subscribe' => "commit_subscribes#create", :as => :subscribe_commit - delete '/commit/:commit_id/unsubscribe' => "commit_subscribes#destroy", :as => :unsubscribe_commit - # Editing files - get '/blob/:treeish/*path/edit' => "git/blobs#edit", :defaults => {:treeish => :master}, :as => :edit_blob - put '/blob/:treeish/*path' => "git/blobs#update", :defaults => {:treeish => :master}, :format => false - # Blobs - get '/blob/:treeish/*path' => "git/blobs#show", :defaults => {:treeish => :master}, :as => :blob, :format => false - # Blame - get '/blame/:treeish/*path' => "git/blobs#blame", :defaults => {:treeish => :master}, :as => :blame, :format => false - # Raw - get '/raw/:treeish/*path' => "git/blobs#raw", :defaults => {:treeish => :master}, :as => :raw, :format => false - # Archive - get '/archive/:format/tree/:treeish' => "git/trees#archive", :defaults => {:treeish => :master}, :as => :archive, :format => /zip|tar/ + constraints :treeish => /.+/ do + constraints Rosa::Constraints::Treeish do + # Tree + get '/' => "git/trees#show", :as => :project + get '/tree/:treeish(/*path)' => "git/trees#show", :as => :tree, :format => false + # Commits + get '/commits/:treeish(/*path)' => "git/commits#index", :as => :commits, :format => false + get '/commit/:id(.:format)' => "git/commits#show", :as => :commit + # Commit comments + post '/commit/:commit_id/comments(.:format)' => "comments#create", :as => :project_commit_comments + get '/commit/:commit_id/comments/:id(.:format)' => "comments#edit", :as => :edit_project_commit_comment + put '/commit/:commit_id/comments/:id(.:format)' => "comments#update", :as => :project_commit_comment + delete '/commit/:commit_id/comments/:id(.:format)' => "comments#destroy" + # Commit subscribes + post '/commit/:commit_id/subscribe' => "commit_subscribes#create", :as => :subscribe_commit + delete '/commit/:commit_id/unsubscribe' => "commit_subscribes#destroy", :as => :unsubscribe_commit + # Editing files + get '/edit/:treeish/*path' => "git/blobs#edit", :as => :edit_blob, :format => false + put '/edit/:treeish/*path' => "git/blobs#update", :format => false + # Blobs + get '/blob/:treeish/*path' => "git/blobs#show", :as => :blob, :format => false + # Blame + get '/blame/:treeish/*path' => "git/blobs#blame", :as => :blame, :format => false + # Raw + get '/raw/:treeish/*path' => "git/blobs#raw", :as => :raw, :format => false + # Archive + get '/archive/:treeish.:format' => "git/trees#archive", :as => :archive, :format => /zip|tar/ + end end end end scope ':uname' do # project owner profile - constraints OwnerConstraint.new(User) do + constraints Rosa::Constraints::Owner.new(User) do get '/' => 'users/profile#show', :as => :user end - constraints OwnerConstraint.new(Group, true) do + constraints Rosa::Constraints::Owner.new(Group, true) do get '/' => 'groups/profile#show', :as => :group end end diff --git a/db/schema.rb b/db/schema.rb index 5200f5c01..481588bde 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -53,8 +53,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do create_table "arches", :force => true do |t| t.string "name", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "arches", ["name"], :name => "index_arches_on_name", :unique => true @@ -63,8 +63,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.integer "user_id" t.string "provider" t.string "uid" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "authentications", ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true @@ -75,8 +75,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.integer "level" t.integer "status" t.integer "build_list_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "version" end @@ -107,8 +107,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.integer "project_id" t.integer "arch_id" t.datetime "notified_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "is_circle", :default => false t.text "additional_repos" t.string "name" @@ -137,8 +137,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "commentable_type" t.integer "user_id" t.text "body" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.decimal "commentable_id", :precision => 50, :scale => 0 t.integer "project_id" end @@ -155,14 +155,14 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "controller" t.string "action" t.text "message" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "groups", :force => true do |t| t.integer "owner_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "uname" t.integer "own_projects_count", :default => 0, :null => false t.text "description" @@ -175,8 +175,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "title" t.text "body" t.string "status", :default => "open" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "user_id" t.datetime "closed_at" t.integer "closed_by" @@ -225,14 +225,14 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "description" t.string "name", :null => false t.integer "parent_platform_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "released", :default => false, :null => false t.integer "owner_id" t.string "owner_type" t.string "visibility", :default => "open", :null => false t.string "platform_type", :default => "main", :null => false - t.string "distrib_type" + t.string "distrib_type", :null => false end add_index "platforms", ["name"], :name => "index_platforms_on_name", :unique => true, :case_sensitive => false @@ -241,8 +241,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.integer "platform_id" t.string "login" t.string "password" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "user_id" end @@ -258,8 +258,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do create_table "products", :force => true do |t| t.string "name", :null => false t.integer "platform_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.text "build_script" t.text "counter" t.text "ks" @@ -278,8 +278,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "name" t.string "version" t.datetime "file_mtime" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "platform_id" end @@ -288,25 +288,25 @@ ActiveRecord::Schema.define(:version => 20120703101719) do create_table "project_to_repositories", :force => true do |t| t.integer "project_id" t.integer "repository_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "projects", :force => true do |t| t.string "name" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "owner_id" t.string "owner_type" t.string "visibility", :default => "open" t.text "description" t.string "ancestry" t.boolean "has_issues", :default => true - t.boolean "has_wiki", :default => false t.string "srpm_file_name" t.string "srpm_content_type" t.integer "srpm_file_size" t.datetime "srpm_updated_at" + t.boolean "has_wiki", :default => false t.string "default_branch", :default => "master" t.boolean "is_package", :default => true, :null => false t.integer "average_build_time", :default => 0, :null => false @@ -321,8 +321,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "token" t.boolean "approved", :default => false t.boolean "rejected", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "interest" t.text "more" end @@ -335,16 +335,16 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "actor_type" t.integer "target_id" t.string "target_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "role" end create_table "repositories", :force => true do |t| t.string "description", :null => false t.integer "platform_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "name", :null => false end @@ -355,8 +355,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.boolean "new_comment_reply", :default => true t.boolean "new_issue", :default => true t.boolean "issue_assign", :default => true - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "new_comment_commit_owner", :default => true t.boolean "new_comment_commit_repo_owner", :default => true t.boolean "new_comment_commit_commentor", :default => true @@ -365,8 +365,8 @@ ActiveRecord::Schema.define(:version => 20120703101719) do create_table "subscribes", :force => true do |t| t.string "subscribeable_type" t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "status", :default => true t.integer "project_id" t.decimal "subscribeable_id", :precision => 50, :scale => 0 @@ -376,21 +376,15 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "name" t.string "email", :default => "", :null => false t.string "encrypted_password", :limit => 128, :default => "", :null => false - t.string "password_salt", :default => "", :null => false t.string "reset_password_token" - t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.text "ssh_key" + t.datetime "created_at" + t.datetime "updated_at" t.string "uname" t.string "role" t.string "language", :default => "en" - t.string "confirmation_token" - t.datetime "confirmed_at" - t.datetime "confirmation_sent_at" - t.integer "own_projects_count", :default => 0, :null => false t.datetime "reset_password_sent_at" + t.integer "own_projects_count", :default => 0, :null => false t.text "professional_experience" t.string "site" t.string "company" @@ -399,11 +393,14 @@ ActiveRecord::Schema.define(:version => 20120703101719) do t.string "avatar_content_type" t.integer "avatar_file_size" t.datetime "avatar_updated_at" - t.integer "failed_attempts", :default => 0 + t.integer "failed_attempts", :default => 0 t.string "unlock_token" t.datetime "locked_at" + t.string "confirmation_token" + t.datetime "confirmed_at" + t.datetime "confirmation_sent_at" t.string "authentication_token" - t.integer "build_priority", :default => 50 + t.integer "build_priority", :default => 50 end add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token" diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP index 8458ee4f1..cca71ab75 100644 --- a/doc/README_FOR_APP +++ b/doc/README_FOR_APP @@ -21,4 +21,8 @@ Add to /etc/rc.d/rc.sysinit sudo urpmi lib64icu-devel # mandriva gem install charlock_holmes -- --with-icu-dir=/opt/local # macports +sudo urpmi lib64magic-devel # mandriva +brew install libmagic; brew link libmagic # brew +gem install ruby-filemagic + git config --global core.quotepath false diff --git a/lib/ext/git/grit.rb b/lib/ext/git/grit.rb index 1fbc50109..43195530c 100644 --- a/lib/ext/git/grit.rb +++ b/lib/ext/git/grit.rb @@ -1,11 +1,49 @@ # -*- encoding : utf-8 -*- module Grit class Blob + include Linguist::BlobHelper + + MAX_VIEW_SIZE = 2.megabytes + MAX_DATA_SIZE = 50.megabytes + + def data_with_limit + size <= MAX_DATA_SIZE ? data_without_limit : nil # 'Error: blob is too big' + end + alias_method_chain :data, :limit + + def large? + size.to_i > MAX_VIEW_SIZE + end + + def render_as + @render_as ||= case + when large?; :binary + when image?; :image + when text?; :text + else + :binary + end + end + + # def file_mime_type + # @file_mime_type ||= data.file_type(:mime_type) + # end + # + # def text? + # file_mime_type =~ /^text\// # not binary? + # end + # + # def binary? + # not text? # file_mime_type !~ /^text\// + # # s = data.split(//); ((s.size - s.grep(" ".."~").size) / s.size.to_f) > 0.30 # works only for latin chars + # end + # + # def image? + # mime_type.match(/image/) + # end DEFAULT_RAW_MIME_TYPE = MIME::Types[DEFAULT_MIME_TYPE].first - delegate :binary?, :ascii?, :encoding, :to => :raw_mime_type - def mime_type_with_class_store set_associated_mimes @associated_mimes.first.simplified @@ -24,30 +62,30 @@ module Grit end protected + + # store all associated MIME::Types inside class + def set_associated_mimes + @associated_mimes ||= [] + if @associated_mimes.empty? + guesses = MIME::Types.type_for(self.name) rescue [DEFAULT_RAW_MIME_TYPE] + guesses = [DEFAULT_RAW_MIME_TYPE] if guesses.empty? - # store all associated MIME::Types inside class - def set_associated_mimes - @associated_mimes ||= [] - if @associated_mimes.empty? - guesses = MIME::Types.type_for(self.name) rescue [DEFAULT_RAW_MIME_TYPE] - guesses = [DEFAULT_RAW_MIME_TYPE] if guesses.empty? - - @associated_mimes = guesses.sort{|a,b| mime_sort(a, b)} - end - @associated_mimes - end - - # TODO make more clever function - def mime_sort(a,b) - return 0 if a.media_type == b.media_type and a.registered? == b.registered? - return -1 if a.media_type == 'text' and !a.registered? - return 1 + @associated_mimes = guesses.sort{|a,b| mime_sort(a, b)} end + @associated_mimes + end + # TODO make more clever function + def mime_sort(a,b) + return 0 if a.media_type == b.media_type and a.registered? == b.registered? + return -1 if a.media_type == 'text' and !a.registered? + return 1 + end end end Grit::Git.git_timeout = 60 +# Grit::Git.git_max_size = 5.megabytes # Grit.debug = true GAP_REPO_PATH = '/tmp/gap_repo.git' unless File.directory? GAP_REPO_PATH diff --git a/lib/ext/rails/constraint.rb b/lib/ext/rails/constraint.rb new file mode 100644 index 000000000..9a4b707f2 --- /dev/null +++ b/lib/ext/rails/constraint.rb @@ -0,0 +1,49 @@ +# -*- encoding : utf-8 -*- +class OwnerConstraint + def initialize(class_name, bang = false) + @class_name = class_name + @finder = 'find_by_insensitive_uname' + @finder << '!' if bang + end + + def matches?(request) + @class_name.send(@finder, request.params[:uname]).present? + end +end + +class AdminAccess + def self.matches?(request) + !!request.env['warden'].user.try(:admin?) + end +end + +class TreeishConstraint + def self.matches?(request) + # raise request.params.inspect + # params = request.env['action_dispatch.request.path_parameters'] || request.params + params = request.path_parameters + if params[:treeish] # parse existing branch (tag) and path + branch_or_tag = begin + (p = Project.find_by_owner_and_name params[:owner_name], params[:project_name]) && + (p.repo.branches + p.repo.tags).detect{|t| params[:treeish].start_with?(t.name)}.try(:name) || + params[:treeish].split('/').first + end + if path = params[:treeish].sub(branch_or_tag, '')[1..-1] and path.present? + params[:path] = File.join([path, params[:path]].compact) + end + params[:treeish] = branch_or_tag + end + true + end + + # def set_treeish_and_path + # if params[:treeish] and params[:path] and # try to correct branch with slashes + # treeish_with_path = File.join(params[:treeish], params[:path]) and + # branch_name = @project.repo.branches.detect{|t| treeish_with_path.start_with?(t.name)}.try(:name) + # params[:treeish] = branch_name + # params[:path] = treeish_with_path.sub(branch_name, '')[1..-1] + # end + # @treeish = params[:treeish].presence || @project.default_branch + # @path = params[:path] + # end +end diff --git a/lib/ext/rails/constraints.rb b/lib/ext/rails/constraints.rb deleted file mode 100644 index 2ec8ef342..000000000 --- a/lib/ext/rails/constraints.rb +++ /dev/null @@ -1,18 +0,0 @@ -# -*- encoding : utf-8 -*- -class OwnerConstraint - def initialize(class_name, bang = false) - @class_name = class_name - @finder = 'find_by_insensitive_uname' - @finder << '!' if bang - end - - def matches?(request) - @class_name.send(@finder, request.params[:uname]).present? - end -end - -class AdminAccess - def self.matches?(request) - !!request.env['warden'].user.try(:admin?) - end -end diff --git a/lib/ext/rails/middleware.rb b/lib/ext/rails/middleware.rb new file mode 100644 index 000000000..be6da8940 --- /dev/null +++ b/lib/ext/rails/middleware.rb @@ -0,0 +1,18 @@ +# class ParamsParser +# DEFAULT_PARSERS = { +# Mime::XML => :xml_simple, +# Mime::JSON => :json +# } +# +# def initialize(app, parsers = {}) +# @app, @parsers = app, DEFAULT_PARSERS.merge(parsers) +# end +# +# def call(env) +# if params = parse_formatted_parameters(env) +# env["action_dispatch.request.request_parameters"] = params +# end +# +# @app.call(env) +# end +# end diff --git a/lib/ext/rosa/constraints.rb b/lib/ext/rosa/constraints.rb new file mode 100644 index 000000000..8cbf1b26c --- /dev/null +++ b/lib/ext/rosa/constraints.rb @@ -0,0 +1,42 @@ +# -*- encoding : utf-8 -*- +module Rosa + module Constraints + class Owner + def initialize(class_name, bang = false) + @class_name = class_name + @finder = 'find_by_insensitive_uname' + @finder << '!' if bang + end + + def matches?(request) + @class_name.send(@finder, request.params[:uname]).present? + end + end + + class AdminAccess + def self.matches?(request) + !!request.env['warden'].user.try(:admin?) + end + end + + class Treeish + def self.matches?(request) + # raise request.params.inspect + # params = request.env['action_dispatch.request.path_parameters'] || request.params + params = request.path_parameters + if params[:treeish] # parse existing branch (tag) and path + branch_or_tag = begin + (p = Project.find_by_owner_and_name params[:owner_name], params[:project_name]) && + (p.repo.branches + p.repo.tags).detect{|t| params[:treeish].start_with?(t.name)}.try(:name) || + params[:treeish].split('/').first + end + if path = params[:treeish].sub(branch_or_tag, '')[1..-1] and path.present? + params[:path] = File.join([path, params[:path]].compact) + end + params[:treeish] = branch_or_tag + end + true + end + end + end +end diff --git a/lib/modules/models/git.rb b/lib/modules/models/git.rb new file mode 100644 index 000000000..e58ac3b25 --- /dev/null +++ b/lib/modules/models/git.rb @@ -0,0 +1,187 @@ +# -*- encoding : utf-8 -*- +module Modules + module Models + module Git + extend ActiveSupport::Concern + + included do + validates_attachment_size :srpm, :less_than => 500.megabytes + validates_attachment_content_type :srpm, :content_type => ['application/octet-stream', "application/x-rpm", "application/x-redhat-package-manager"], :message => I18n.t('layout.invalid_content_type') + + has_attached_file :srpm + # attr_accessible :srpm + + after_create :create_git_repo + after_commit(:on => :create) {|p| p.fork_git_repo unless p.is_root?} # later with resque + after_commit(:on => :create) {|p| p.import_attached_srpm if p.srpm?} # later with resque # should be after create_git_repo + after_destroy :destroy_git_repo + # after_rollback lambda { destroy_git_repo rescue true if new_record? } + + later :import_attached_srpm, :queue => :fork_import + later :fork_git_repo, :queue => :fork_import + end + + def repo + @repo ||= Grit::Repo.new(path) rescue Grit::Repo.new(GAP_REPO_PATH) + end + + def path + build_path(git_repo_name) + end + + def git_repo_name + File.join owner.uname, name + end + + def versions + repo.tags.map(&:name) + repo.branches.map{|b| "latest_#{b.name}"} + end + + def update_file(path, data, options = {}) + head = options[:head].to_s || default_branch + actor = get_actor(options[:actor]) + filename = File.split(path).last + message = options[:message] + message = "Updated file #{filename}" if message.nil? or message.empty? + + # can not write to unexisted branch + return false if repo.branches.select{|b| b.name == head}.size != 1 + + parent = repo.commits(head).first + + index = repo.index + index.read_tree(parent.tree.id) + + # can not create new file + return false if (index.current_tree / path).nil? + + index.add(path, data) + index.commit(message, :parents => [parent], :actor => actor, :last_tree => parent.tree.id, :head => head) + end + + def paginate_commits(treeish, options = {}) + options[:page] = 1 unless options[:page].present? + options[:page] = options[:page].to_i + + options[:per_page] = 20 unless options[:per_page].present? + options[:per_page] = options[:per_page].to_i + + skip = options[:per_page] * (options[:page] - 1) + last_page = (skip + options[:per_page]) >= repo.commit_count(treeish) + + [repo.commits(treeish, options[:per_page], skip), options[:page], last_page] + end + + def last_active_branch + @last_active_branch ||= repo.branches.inject do |r, c| + r_last = r.commit.committed_date || r.commit.authored_date unless r.nil? + c_last = c.commit.committed_date || c.commit.authored_date + if r.nil? or r_last < c_last + r = c + end + r + end + @last_active_branch + end + + def tree_info(tree, treeish = nil, path = nil) + treeish = tree.id unless treeish.present? + # initialize result as hash of => nil + res = (tree.trees.sort + tree.blobs.sort).inject({}){|h, e| h.merge!({e => nil})} + # fills result vith commits that describes this file + res = res.inject(res) do |h, (entry, commit)| + # only if commit == nil ... + if commit.nil? and entry.respond_to? :name + # ... find last commit corresponds to this file ... + c = repo.log(treeish, File.join([path, entry.name].compact), :max_count => 1).first + # ... and add it to result. + h[entry] = c + # find another files, that linked to this commit and set them their commit + # c.diffs.map{|diff| diff.b_path.split(File::SEPARATOR, 2).first}.each do |name| + # h.each_pair do |k, v| + # h[k] = c if k.name == name and v.nil? + # end + # end + end + h + end + end + + def import_srpm(srpm_path = srpm.path, branch_name = 'import') + system("#{Rails.root.join('bin', 'import_srpm.sh')} #{srpm_path} #{path} #{branch_name} >> /dev/null 2>&1") + end + + protected + + def build_path(dir) + File.join(APP_CONFIG['root_path'], 'git_projects', "#{dir}.git") + end + + def import_attached_srpm + if srpm? + import_srpm # srpm.path + self.srpm = nil; save # clear srpm + end + end + + def create_git_repo + if is_root? + Grit::Repo.init_bare(path) + write_hook + end + end + + def fork_git_repo + dummy = Grit::Repo.new(path) rescue parent.repo.fork_bare(path) + write_hook + end + + def destroy_git_repo + FileUtils.rm_rf path + end + + def write_hook + is_production = Rails.env == "production" + hook = File.join(::Rails.root.to_s, 'tmp', "post-receive-hook") + FileUtils.cp(File.join(::Rails.root.to_s, 'bin', "post-receive-hook.partial"), hook) + File.open(hook, 'a') do |f| + s = "\n /bin/bash -l -c \"cd #{is_production ? '/srv/rosa_build/current' : Rails.root.to_s} && #{is_production ? 'RAILS_ENV=production' : ''} bundle exec rake hook:enqueue[$owner,$reponame,$newrev,$oldrev,$ref,$newrev_type,$oldrev_type]\"" + s << " > /dev/null 2>&1" if is_production + s << "\ndone\n" + f.write(s) + f.chmod(0755) + end + + hook_file = File.join(path, 'hooks', 'post-receive') + FileUtils.cp(hook, hook_file) + FileUtils.rm_rf(hook) + + rescue Exception # FIXME + end + + def get_actor(actor = nil) + @last_actor = case actor.class.to_s + when 'Grit::Actor' then options[:actor] + when 'Hash' then Grit::Actor.new(actor[:name], actor[:email]) + when 'String' then Grit::Actor.from_stirng(actor) + else begin + if actor.respond_to?(:name) and actor.respond_to?(:email) + Grit::Actor.new(actor.name, actor.email) + else + config = Grit::Config.new(repo) + Grit::Actor.new(config['user.name'], config['user.email']) + end + end + end + @last_actor + end + + module ClassMethods + def process_hook(owner_uname, repo, newrev, oldrev, ref, newrev_type, oldrev_type) + rec = GitHook.new(owner_uname, repo, newrev, oldrev, ref, newrev_type, oldrev_type) + ActivityFeedObserver.instance.after_create rec + end + end + end + end +end diff --git a/lib/modules/models/owner.rb b/lib/modules/models/owner.rb index 182682e18..e88ac3f5f 100644 --- a/lib/modules/models/owner.rb +++ b/lib/modules/models/owner.rb @@ -8,15 +8,8 @@ module Modules after_create lambda { relations.create :actor_id => owner.id, :actor_type => owner.class.to_s, :role => 'admin' } end - module ClassMethods - end - - module InstanceMethods - - def name_with_owner - "#{owner.respond_to?(:uname) ? owner.uname : owner.name}/#{self.name}" - end - + def name_with_owner + "#{owner.respond_to?(:uname) ? owner.uname : owner.name}/#{self.name}" end end end diff --git a/lib/modules/models/wiki.rb b/lib/modules/models/wiki.rb new file mode 100644 index 000000000..1f13446b9 --- /dev/null +++ b/lib/modules/models/wiki.rb @@ -0,0 +1,39 @@ +# -*- encoding : utf-8 -*- +module Modules + module Models + module Wiki + extend ActiveSupport::Concern + + included do + after_create :create_wiki + after_destroy :destroy_wiki + end + + def wiki_path + build_path(wiki_repo_name) + end + + def wiki_repo_name + File.join owner.uname, "#{name}.wiki" + end + + protected + + def create_wiki + if has_wiki && !FileTest.exist?(wiki_path) + Grit::Repo.init_bare(wiki_path) + wiki = Gollum::Wiki.new(wiki_path, {:base_path => Rails.application.routes.url_helpers.project_wiki_index_path(owner, self)}) + wiki.write_page('Home', :markdown, I18n.t("wiki.seed.welcome_content"), + {:name => owner.name, :email => owner.email, :message => 'Initial commit'}) + end + end + + def destroy_wiki + FileUtils.rm_rf wiki_path + end + + module ClassMethods + end + end + end +end diff --git a/lib/tasks/add_branch.rake b/lib/tasks/add_branch.rake index c8d7cf48d..1857cb7c9 100644 --- a/lib/tasks/add_branch.rake +++ b/lib/tasks/add_branch.rake @@ -9,7 +9,7 @@ task :add_branch => :environment do Platform.find_by_name(dst_branch).repositories.each do |r| say "=== Process #{r.name} repo" r.projects.find_each do |p| - next if p.branches.map(&:name).include?(dst_branch) + next if p.repo.branches.map(&:name).include?(dst_branch) say "===== Process #{p.name} project" tmp_path = Rails.root.join('tmp', p.name) system("git clone #{p.path} #{tmp_path}") diff --git a/spec/controllers/platforms/mass_builds_controller_spec.rb b/spec/controllers/platforms/mass_builds_controller_spec.rb index 6a85981f9..357d66d94 100644 --- a/spec/controllers/platforms/mass_builds_controller_spec.rb +++ b/spec/controllers/platforms/mass_builds_controller_spec.rb @@ -76,6 +76,7 @@ describe Platforms::MassBuildsController do before(:each) do stub_symlink_methods + FactoryGirl.create(:arch) @platform = FactoryGirl.create(:platform) @repository = FactoryGirl.create(:repository, :platform => @platform) @personal_platform = FactoryGirl.create(:platform, :platform_type => 'personal') @@ -91,13 +92,18 @@ describe Platforms::MassBuildsController do end context 'for guest' do - [:index, :create, :cancel, :failed_builds_list].each do |action| + [:index, :create].each do |action| it "should not be able to perform #{ action } action" do get action, :platform_id => @platform response.should redirect_to(new_user_session_path) end end + it "should not be able to perform failed_builds_list action" do + get :failed_builds_list, :platform_id => @platform, :id => @mass_build + response.should redirect_to(new_user_session_path) + end + it 'should not change objects count on create success' do lambda { post :create, @create_params }.should change{ MassBuild.count }.by(0) end diff --git a/spec/controllers/platforms/repositories_controller_spec.rb b/spec/controllers/platforms/repositories_controller_spec.rb index 35120683d..82c4a5712 100644 --- a/spec/controllers/platforms/repositories_controller_spec.rb +++ b/spec/controllers/platforms/repositories_controller_spec.rb @@ -32,7 +32,7 @@ end shared_examples_for 'registered user' do it 'should be able to perform index action' do - get :index + get :index, :platform_id => @platform.id response.should render_template(:index) end @@ -80,7 +80,7 @@ describe Platforms::RepositoriesController do context 'for guest' do [:index, :create].each do |action| it "should not be able to perform #{ action } action" do - get action + get action, :platform_id => @platform response.should redirect_to(new_user_session_path) end end diff --git a/spec/controllers/projects/build_lists_controller_spec.rb b/spec/controllers/projects/build_lists_controller_spec.rb index 1431004eb..ef95a4cf7 100644 --- a/spec/controllers/projects/build_lists_controller_spec.rb +++ b/spec/controllers/projects/build_lists_controller_spec.rb @@ -42,13 +42,13 @@ describe Projects::BuildListsController do it 'should save correct commit_hash for branch based build' do post :create, {:owner_name => @project.owner.uname, :project_name => @project.name}.merge(@create_params).deep_merge(:build_list => {:project_version => "latest_master"}) - @project.build_lists.last.commit_hash.should == @project.git_repository.commits('master').last.id + @project.build_lists.last.commit_hash.should == @project.repo.commits('master').last.id end it 'should save correct commit_hash for tag based build' do - system("cd #{@project.git_repository.path} && git tag 4.7.5.3") # TODO REDO through grit + system("cd #{@project.repo.path} && git tag 4.7.5.3") # TODO REDO through grit post :create, {:owner_name => @project.owner.uname, :project_name => @project.name}.merge(@create_params).deep_merge(:build_list => {:project_version => "4.7.5.3"}) - @project.build_lists.last.commit_hash.should == @project.git_repository.commits('4.7.5.3').last.id + @project.build_lists.last.commit_hash.should == @project.repo.commits('4.7.5.3').last.id end end @@ -283,7 +283,7 @@ describe Projects::BuildListsController do @build_list1 = FactoryGirl.create(:build_list_core) @build_list2 = FactoryGirl.create(:build_list_core) @build_list3 = FactoryGirl.create(:build_list_core) - @build_list4 = FactoryGirl.create(:build_list_core, :created_at => (Time.now - 1.day), + @build_list4 = FactoryGirl.create(:build_list_core, :updated_at => (Time.now - 1.day), :project => @build_list3.project, :save_to_platform => @build_list3.save_to_platform, :arch => @build_list3.arch) end @@ -305,9 +305,9 @@ describe Projects::BuildListsController do it 'should filter by project_name and start_date' do get :index, :filter => {:project_name => @build_list3.project.name, :ownership => 'index', - "created_at_start(1i)" => @build_list3.created_at.year.to_s, - "created_at_start(2i)" => @build_list3.created_at.month.to_s, - "created_at_start(3i)" => @build_list3.created_at.day.to_s} + :"updated_at_start(1i)" => @build_list3.updated_at.year.to_s, + :"updated_at_start(2i)" => @build_list3.updated_at.month.to_s, + :"updated_at_start(3i)" => @build_list3.updated_at.day.to_s} assigns[:build_lists].should_not include(@build_list1) assigns[:build_lists].should_not include(@build_list2) assigns[:build_lists].should include(@build_list3) @@ -326,7 +326,7 @@ describe Projects::BuildListsController do describe 'publish_build' do before { test_git_commit(build_list.project) - build_list.update_attribute :commit_hash, build_list.project.git_repository.commits('master').last.id + build_list.update_attribute :commit_hash, build_list.project.repo.commits('master').last.id build_list.update_attribute(:status, BuildList::BUILD_PUBLISH) build_list_package } @@ -343,8 +343,8 @@ describe Projects::BuildListsController do } it 'should create correct git tag for correct commit' do do_get(BuildServer::SUCCESS) - build_list.project.git_repository.tags.last.name.should == build_list.package_version - build_list.project.git_repository.commits(build_list.package_version).last.id.should == build_list.commit_hash + build_list.project.repo.tags.last.name.should == build_list.package_version + build_list.project.repo.commits(build_list.package_version).last.id.should == build_list.commit_hash end it(:passes) { lambda{ do_get(BuildServer::SUCCESS) }.should change(build_list, :status).to(BuildList::BUILD_PUBLISHED) } it(:passes) { lambda{ do_get(BuildServer::SUCCESS) }.should change(build_list, :package_version).to("#{ build_list_package.platform.name }-4.7.5.3-1") } diff --git a/spec/controllers/projects/comments_controller_for_commit_spec.rb b/spec/controllers/projects/comments_controller_for_commit_spec.rb index 3ddce850e..7555d5a79 100644 --- a/spec/controllers/projects/comments_controller_for_commit_spec.rb +++ b/spec/controllers/projects/comments_controller_for_commit_spec.rb @@ -78,8 +78,8 @@ describe Projects::CommentsController do before(:each) do stub_symlink_methods @project = FactoryGirl.create(:project) - %x(cp -Rf #{Rails.root}/spec/tests.git/* #{@project.git_repository.path}) # maybe FIXME ? - @commit = @project.git_repository.commits.first + %x(cp -Rf #{Rails.root}/spec/tests.git/* #{@project.repo.path}) # maybe FIXME ? + @commit = @project.repo.commits.first @create_params = {:comment => {:body => 'I am a comment!'}, :owner_name => @project.owner.uname, :project_name => @project.name, :commit_id => @commit.id} @update_params = {:comment => {:body => 'updated'}, :owner_name => @project.owner.uname, :project_name => @project.name, :commit_id => @commit.id} diff --git a/spec/controllers/projects/git/git_trees_controller_spec.rb b/spec/controllers/projects/git/git_trees_controller_spec.rb index ce9884232..f2baf5020 100644 --- a/spec/controllers/projects/git/git_trees_controller_spec.rb +++ b/spec/controllers/projects/git/git_trees_controller_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' describe Projects::Git::TreesController do def fill_project - %x(cp -Rf #{Rails.root}/spec/tests.git/* #{@project.git_repository.path}) # maybe FIXME ? + %x(cp -Rf #{Rails.root}/spec/tests.git/* #{@project.repo.path}) # maybe FIXME ? end before(:each) do @@ -12,7 +12,7 @@ describe Projects::Git::TreesController do @project = FactoryGirl.create(:project) @another_user = FactoryGirl.create(:user) - @params = {:owner_name => @project.owner.uname, :project_name => @project.name} + @params = {:owner_name => @project.owner.uname, :project_name => @project.name, :treeish => 'master'} end context 'for guest' do @@ -35,21 +35,21 @@ describe Projects::Git::TreesController do it 'should not be able to archive empty project' do @user = FactoryGirl.create(:user) set_session_for(@user) - expect { get :archive, @params.merge(:format => 'tar') }.to raise_error(ActiveRecord::RecordNotFound) + expect { get :archive, @params.merge(:format => 'tar') }.to raise_error(ActionController::RoutingError) end it 'should not be able to injection code with format' do @user = FactoryGirl.create(:user) set_session_for(@user) fill_project - expect { get :archive, @params.merge(:format => "tar master > /dev/null; echo 'I am hacker!';\#") }.to raise_error(ActiveRecord::RecordNotFound) + expect { get :archive, @params.merge(:format => "tar master > /dev/null; echo 'I am hacker!';\#") }.to raise_error(ActionController::RoutingError) end it 'should not be able to injection code with treeish' do @user = FactoryGirl.create(:user) set_session_for(@user) fill_project - expect { get :archive, @params.merge(:treeish => "master > /dev/null; echo 'I am hacker!';\#") }.to raise_error(ActiveRecord::RecordNotFound) + expect { get :archive, @params.merge(:treeish => "master > /dev/null; echo 'I am hacker!';\#") }.to raise_error(ActionController::RoutingError) end it 'should be able to perform archive action' do diff --git a/spec/controllers/users/profile_controller_spec.rb b/spec/controllers/users/profile_controller_spec.rb index 0451de6a8..76617cf8d 100644 --- a/spec/controllers/users/profile_controller_spec.rb +++ b/spec/controllers/users/profile_controller_spec.rb @@ -16,7 +16,7 @@ describe Users::ProfileController do context 'for guest' do it 'should not be able to view profile' do - get :show, :owner_name => @simple_user.uname + get :show, :uname => @simple_user.uname response.should redirect_to(new_user_session_path) end end diff --git a/spec/factories/platforms.rb b/spec/factories/platforms.rb index e8d6aad69..6877fb58c 100644 --- a/spec/factories/platforms.rb +++ b/spec/factories/platforms.rb @@ -8,7 +8,7 @@ FactoryGirl.define do association :owner, :factory => :user factory :platform_with_repos do - after_create {|p| FactoryGirl.create_list(:repository, 1, platform: p)} + after(:create) {|p| FactoryGirl.create_list(:repository, 1, platform: p)} end factory :personal_platform do diff --git a/spec/models/comment_for_commit_spec.rb b/spec/models/comment_for_commit_spec.rb index e4ad33f74..6e51eb1fa 100644 --- a/spec/models/comment_for_commit_spec.rb +++ b/spec/models/comment_for_commit_spec.rb @@ -10,8 +10,8 @@ def set_comments_data_for_commit @ability = Ability.new(@user) @project = FactoryGirl.create(:project, :owner => @user) - %x(cp -Rf #{Rails.root}/spec/tests.git/* #{@project.git_repository.path}) # maybe FIXME ? - @commit = @project.git_repository.commits.first + %x(cp -Rf #{Rails.root}/spec/tests.git/* #{@project.repo.path}) # maybe FIXME ? + @commit = @project.repo.commits.first @comment = create_comment(@user) @stranger_comment = create_comment(@stranger) diff --git a/spec/routing/projects_routing_spec.rb.rb b/spec/routing/projects_routing_spec.rb.rb index 5bcc65d06..6f964e50c 100644 --- a/spec/routing/projects_routing_spec.rb.rb +++ b/spec/routing/projects_routing_spec.rb.rb @@ -39,6 +39,7 @@ describe Projects::Git::TreesController do get("/import/glib2.0-mib/tree/lib2safe-0.03").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'lib2safe-0.03') get("/import/glib2.0-mib/tree/branch-with.dot/folder_with.dot/path-with.dot").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'branch-with.dot', :path => 'folder_with.dot/path-with.dot') # get("/import/glib2.0-mib/tree/ветка-с.точкой/папка_с.точкой/путь-с.точкой").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'ветка-с.точкой', :path => 'папка_с.точкой/путь-с.точкой') + get("/import/glib2.0-mib/tree/tag13.52-5").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'tag13.52-5') end # TODO write more specs also with slash in branch name! diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 843efa51f..72f943b66 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -39,8 +39,8 @@ def stub_symlink_methods end def test_git_commit(project) - project.git_repository.repo.index.add('test', 'TEST') - project.git_repository.repo.index.commit('Test commit') + project.repo.index.add('test', 'TEST') + project.repo.index.commit('Test commit') end Resque.inline = true From 35e673d44e9f5369c593e46bfc19f8ed49ba4bb6 Mon Sep 17 00:00:00 2001 From: Pavel Chipiga Date: Fri, 27 Jul 2012 00:15:57 +0300 Subject: [PATCH 2/4] Minor gems update. Fix string length, refactor git helper and module, add branches_and_tags method, refactor build_list filter, cleanup and refactor templates. Take back test. Filter incorrect symbols during git encoding fix. Fix git http level bug. Refs #263 --- Gemfile | 4 +- Gemfile.lock | 24 ++++----- .../projects/build_lists_controller.rb | 3 +- app/helpers/git_helper.rb | 14 +++--- app/models/build_list/filter.rb | 6 +-- app/models/comment.rb | 4 +- app/views/projects/git/blobs/_show.html.haml | 1 - app/views/projects/git/blobs/_top.html.haml | 6 +-- .../projects/git/commits/_show.html.haml | 1 - app/views/projects/git/trees/_show.html.haml | 4 +- lib/ext/core/string.rb | 35 ++++++------- lib/ext/git/grit.rb | 2 +- lib/ext/rails/constraint.rb | 49 ------------------- lib/ext/rails/middleware.rb | 18 ------- lib/ext/rosa/constraints.rb | 4 +- lib/modules/models/git.rb | 24 ++------- lib/plugins/grack/base.rb | 2 +- .../platforms/mass_builds_controller_spec.rb | 5 ++ spec/routing/projects_routing_spec.rb.rb | 3 +- 19 files changed, 63 insertions(+), 146 deletions(-) delete mode 100644 lib/ext/rails/constraint.rb delete mode 100644 lib/ext/rails/middleware.rb diff --git a/Gemfile b/Gemfile index 01a5c745a..0ace218c6 100644 --- a/Gemfile +++ b/Gemfile @@ -13,7 +13,7 @@ gem 'omniauth-openid', '~> 1.0.1' gem 'cancan', '1.6.7' # 1.6.8 fail specs with strange error gem 'ancestry', '~> 1.3.0' -gem 'paperclip', '~> 3.1.3' +gem 'paperclip', '~> 3.1.4' gem 'resque', '~> 1.21.0' gem 'resque-status', '~> 0.3.3' gem 'resque_mailer', '~> 2.1.0' @@ -27,7 +27,7 @@ gem 'grack', :git => 'git://github.com/rdblue/grack.git', :require => 'git_http' gem "grit", :git => 'git://github.com/warpc/grit.git' #, :path => '~/Sites/code/grit' gem 'charlock_holmes', '~> 0.6.8' #, :git => 'git://github.com/brianmario/charlock_holmes.git', :branch => 'bundle-icu' # gem 'ruby-filemagic', '~> 0.4.2', :require => 'filemagic/ext' -gem 'github-linguist', '~> 2.0.1', :require => 'linguist' +gem 'github-linguist', '~> 2.1.2', :require => 'linguist' gem 'diff-display', '~> 0.0.1' # Wiki diff --git a/Gemfile.lock b/Gemfile.lock index 5d9e2545f..1ff9bd23d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -117,12 +117,12 @@ GEM railties (>= 3.0.0) ffi (1.0.11) fssm (0.2.9) - github-linguist (2.0.1) + github-linguist (2.1.2) charlock_holmes (~> 0.6.6) escape_utils (~> 0.2.3) mime-types (~> 1.18) - pygments.rb (~> 0.2.13) - github-markup (0.7.2) + pygments.rb (>= 0.2.13) + github-markup (0.7.4) gollum (1.3.1) albino (~> 1.3.2) github-markup (>= 0.4.0, < 1.0.0) @@ -150,7 +150,7 @@ GEM jquery-rails (2.0.2) railties (>= 3.2.0, < 5.0) thor (~> 0.14) - json (1.7.3) + json (1.7.4) kgio (2.7.4) libv8 (3.3.10.4) macaddr (1.6.1) @@ -159,7 +159,7 @@ GEM i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) - mailcatcher (0.5.7.2) + mailcatcher (0.5.8) activesupport (~> 3.0) eventmachine (~> 0.12) haml (~> 3.1) @@ -189,7 +189,7 @@ GEM omniauth (~> 1.0) rack-openid (~> 1.3.1) orm_adapter (0.4.0) - paperclip (3.1.3) + paperclip (3.1.4) activemodel (>= 3.0.0) activerecord (>= 3.0.0) activesupport (>= 3.0.0) @@ -267,8 +267,8 @@ GEM rspec-core (~> 2.11.0) rspec-expectations (~> 2.11.0) rspec-mocks (~> 2.11.0) - rspec-core (2.11.0) - rspec-expectations (2.11.1) + rspec-core (2.11.1) + rspec-expectations (2.11.2) diff-lcs (~> 1.1.3) rspec-mocks (2.11.1) rspec-rails (2.11.0) @@ -285,7 +285,7 @@ GEM ffi (~> 1.0.7) russian (0.6.0) i18n (>= 0.5.0) - rvm-capistrano (1.2.3) + rvm-capistrano (1.2.5) capistrano (>= 2.0.0) sanitize (2.0.3) nokogiri (>= 1.4.4, < 1.6) @@ -296,7 +296,7 @@ GEM tilt (~> 1.3) shotgun (0.9) rack (>= 1.0) - shoulda (3.1.0) + shoulda (3.1.1) shoulda-context (~> 1.0) shoulda-matchers (~> 1.2) shoulda-context (1.0.0) @@ -368,7 +368,7 @@ DEPENDENCIES devise (~> 2.1.2) diff-display (~> 0.0.1) factory_girl_rails (~> 3.5.0) - github-linguist (~> 2.0.1) + github-linguist (~> 2.1.2) gollum (= 1.3.1) grack! grit! @@ -382,7 +382,7 @@ DEPENDENCIES newrelic_rpm (~> 3.4.0.1) omniauth (~> 1.1.0) omniauth-openid (~> 1.0.1) - paperclip (~> 3.1.3) + paperclip (~> 3.1.4) perform_later (~> 1.3.0) pg (~> 0.14.0) rails (= 3.2.6) diff --git a/app/controllers/projects/build_lists_controller.rb b/app/controllers/projects/build_lists_controller.rb index eea85eb9c..ce7364d52 100644 --- a/app/controllers/projects/build_lists_controller.rb +++ b/app/controllers/projects/build_lists_controller.rb @@ -46,7 +46,8 @@ class Projects::BuildListsController < Projects::BaseController Arch.where(:id => params[:arches]).each do |arch| Platform.main.where(:id => params[:build_for_platforms]).each do |build_for_platform| @build_list = @project.build_lists.build(params[:build_list]) - @build_list.commit_hash = @project.repo.commits(@build_list.project_version.match(/^latest_(.+)/).to_a.last || @build_list.project_version).first.id if @build_list.project_version + @build_list.commit_hash = @project.repo.commits(@build_list.project_version.match(/^latest_(.+)/).to_a.last || + @build_list.project_version).first.id if @build_list.project_version @build_list.build_for_platform = build_for_platform; @build_list.arch = arch; @build_list.user = current_user @build_list.include_repos = @build_list.include_repos.select {|ir| @build_list.build_for_platform.repository_ids.include? ir.to_i} @build_list.priority = current_user.build_priority # User builds more priority than mass rebuild with zero priority diff --git a/app/helpers/git_helper.rb b/app/helpers/git_helper.rb index f3ea0bdc6..753db6e64 100644 --- a/app/helpers/git_helper.rb +++ b/app/helpers/git_helper.rb @@ -47,7 +47,6 @@ module GitHelper end end - # TODO This is very dirty hack. Maybe need to be changed. def branch_selector_options(project) p = params.dup p.delete(:path) if p[:path].present? # to root path @@ -55,18 +54,17 @@ module GitHelper current = url_for(p).split('?', 2).first res = [] - res << [I18n.t('layout.git.repositories.commits'), [truncate(params[:treeish], :length => 20)]] unless (project.repo.branches + project.repo.tags).map(&:name).include?(params[:treeish] || project.default_branch) - res << [I18n.t('layout.git.repositories.branches'), project.repo.branches.map{|b| [truncate(b.name, :length => 20), url_for(p.merge :treeish => b.name).split('?', 2).first]}] - res << [I18n.t('layout.git.repositories.tags'), project.repo.tags.map{|t| [truncate(t.name, :length => 20), url_for(p.merge :treeish => t.name).split('?', 2).first]}] + res << [I18n.t('layout.git.repositories.commits'), [params[:treeish].truncate(20)]] unless project.repo.branches_and_tags.map(&:name).include?(params[:treeish] || project.default_branch) + linking = Proc.new {|t| [t.name.truncate(20), url_for(p.merge :treeish => t.name).split('?', 2).first]} + res << [I18n.t('layout.git.repositories.branches'), project.repo.branches.map(&linking)] + res << [I18n.t('layout.git.repositories.tags'), project.repo.tags.map(&linking)] grouped_options_for_select(res, current) end def versions_for_group_select(project) - [ - ['Branches', project.repo.branches.map{|b| "latest_#{b.name}"}], - ['Tags', project.repo.tags.map(&:name)] - ] + [ ['Branches', project.repo.branches.map{|b| "latest_#{b.name}"}], + ['Tags', project.repo.tags.map(&:name)] ] end def split_commits_by_date(commits) diff --git a/app/models/build_list/filter.rb b/app/models/build_list/filter.rb index 7de174460..48f0b59cc 100644 --- a/app/models/build_list/filter.rb +++ b/app/models/build_list/filter.rb @@ -53,12 +53,12 @@ class BuildList::Filter })) @options[:ownership] = @options[:ownership].presence || (@project || !@user ? 'index' : 'owned') - @options[:status] = @options[:status].present? ? @options[:status].to_i : nil + @options[:status] = @options[:status].try(:to_i) @options[:updated_at_start] = build_date_from_params(:updated_at_start, @options) @options[:updated_at_end] = build_date_from_params(:updated_at_end, @options) @options[:project_version] = @options[:project_version].presence - @options[:arch_id] = @options[:arch_id].present? ? @options[:arch_id].to_i : nil - @options[:platform_id] = @options[:platform_id].present? ? @options[:platform_id].to_i : nil + @options[:arch_id] = @options[:arch_id].try(:to_i) + @options[:platform_id] = @options[:platform_id].try(:to_i) @options[:is_circle] = @options[:is_circle].present? ? @options[:is_circle] == "1" : nil @options[:bs_id] = @options[:bs_id].presence @options[:project_name] = @options[:project_name].presence diff --git a/app/models/comment.rb b/app/models/comment.rb index f73fa7d67..6960860cc 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -15,7 +15,9 @@ class Comment < ActiveRecord::Base attr_accessible :body def commentable - commit_comment? ? project.repo.commit(commentable_id.to_s(16)) : super + # raise commentable_id.inspect + # raise commentable_id.to_s(16).inspect + commit_comment? ? project.repo.commit(commentable_id.to_s(16)) : super # TODO leading zero problem end def commentable=(c) diff --git a/app/views/projects/git/blobs/_show.html.haml b/app/views/projects/git/blobs/_show.html.haml index 3f686249c..b808cefc1 100644 --- a/app/views/projects/git/blobs/_show.html.haml +++ b/app/views/projects/git/blobs/_show.html.haml @@ -1,4 +1,3 @@ -/ - raise @blob.file_mime_type.inspect %h3= t("layout.projects.files_in_project") .files .l= render 'whereami' diff --git a/app/views/projects/git/blobs/_top.html.haml b/app/views/projects/git/blobs/_top.html.haml index a3631075d..3fa62790b 100644 --- a/app/views/projects/git/blobs/_top.html.haml +++ b/app/views/projects/git/blobs/_top.html.haml @@ -6,15 +6,15 @@ \| = number_to_human_size @blob.size .r - - if @blob.render_as == :text and can? :write, @project and @branch.present? + - if @blob.render_as == :text && can?(:write, @project) && @branch.present? = link_to "Edit", edit_blob_path(@project, @treeish, @path) \| - - if @blob.render_as == :text and params[:action] != 'show' + - if @blob.render_as == :text && params[:action] != 'show' = link_to "Normal", blob_path(@project, @treeish, @path) \| = link_to "Raw", raw_path(@project, @treeish, @path) \| - - if @blob.render_as == :text and params[:action] != 'blame' + - if @blob.render_as == :text && params[:action] != 'blame' = link_to "Blame", blame_path(@project, @treeish, @path) \| = link_to "History", commits_path(@project, @treeish, @path) diff --git a/app/views/projects/git/commits/_show.html.haml b/app/views/projects/git/commits/_show.html.haml index 9e6e6a30c..9815b5e2d 100644 --- a/app/views/projects/git/commits/_show.html.haml +++ b/app/views/projects/git/commits/_show.html.haml @@ -13,7 +13,6 @@ -begin = render_commit_stats(stats) - = render :partial => 'commit_diff', :collection => @commit.diffs - rescue Grit::Git::GitTimeout %p= t 'layout.git.repositories.commit_diff_too_big' diff --git a/app/views/projects/git/trees/_show.html.haml b/app/views/projects/git/trees/_show.html.haml index 2bf2868aa..35bae8bea 100644 --- a/app/views/projects/git/trees/_show.html.haml +++ b/app/views/projects/git/trees/_show.html.haml @@ -31,7 +31,7 @@ .pic= image_tag 'folder.png' .name= link_to(entry.name, tree_path(@project, @treeish, entry_path), :class => 'files-see') %td - %span{:style => "display: none;"}= commit.committed_date || commit.authored_date - = l(commit.committed_date || commit.authored_date, :format => :short) + %span{:style => "display: none;"}= date = commit.committed_date || commit.authored_date + = l(date, :format => :short) %td= commit.short_message %td= (commit.committer || commit.author).name \ No newline at end of file diff --git a/lib/ext/core/string.rb b/lib/ext/core/string.rb index a8640324f..8e6e7d293 100644 --- a/lib/ext/core/string.rb +++ b/lib/ext/core/string.rb @@ -1,27 +1,24 @@ # -*- encoding : utf-8 -*- require 'charlock_holmes/string' -# require 'iconv' class String def default_encoding! - if ascii_only? - force_encoding(Encoding.default_internal || Encoding::UTF_8) - else - force_encoding((detected = detect_encoding and detected[:encoding]) || Encoding.default_internal || Encoding::UTF_8).encode! + default_encoding = Encoding.default_internal || Encoding::UTF_8 + if ascii_only? # no need to encode if ascii + force_encoding(default_encoding) + else # should encode + if (detected = detect_encoding) && detected[:encoding] + force_encoding(detected[:encoding]) + encode!(default_encoding, detected[:encoding], :invalid => :replace, :undef => :replace, :replace => '') + end + # re-encode through UTF-16 to filter incorrect symbols + encode!(Encoding::UTF_16, default_encoding, :invalid => :replace, :undef => :replace, :replace => '') + encode!(default_encoding, Encoding::UTF_16) + raise unless valid_encoding? # check result end + rescue + replace "--broken encoding: #{detect_encoding[:encoding] || 'unknown'}" + ensure + self end - - # def enforce_utf8(from = nil) - # begin - # is_utf8? ? self : ::Iconv.iconv('utf8', from, self).first - # rescue - # converter = ::Iconv.new('UTF-8//IGNORE//TRANSLIT', 'ASCII//IGNORE//TRANSLIT') - # # If Ruby 1.9, else another RubyEngine (ree, Ruby 1.8) - # begin - # converter.iconv(self).unpack('U*').select{|cp| cp < 127}.pack('U*').force_encoding('utf-8') - # rescue - # converter.iconv(self).unpack('U*').select{|cp| cp < 127}.pack('U*') - # end - # end - # end end diff --git a/lib/ext/git/grit.rb b/lib/ext/git/grit.rb index 43195530c..6a0095de3 100644 --- a/lib/ext/git/grit.rb +++ b/lib/ext/git/grit.rb @@ -62,7 +62,7 @@ module Grit end protected - + # store all associated MIME::Types inside class def set_associated_mimes @associated_mimes ||= [] diff --git a/lib/ext/rails/constraint.rb b/lib/ext/rails/constraint.rb deleted file mode 100644 index 9a4b707f2..000000000 --- a/lib/ext/rails/constraint.rb +++ /dev/null @@ -1,49 +0,0 @@ -# -*- encoding : utf-8 -*- -class OwnerConstraint - def initialize(class_name, bang = false) - @class_name = class_name - @finder = 'find_by_insensitive_uname' - @finder << '!' if bang - end - - def matches?(request) - @class_name.send(@finder, request.params[:uname]).present? - end -end - -class AdminAccess - def self.matches?(request) - !!request.env['warden'].user.try(:admin?) - end -end - -class TreeishConstraint - def self.matches?(request) - # raise request.params.inspect - # params = request.env['action_dispatch.request.path_parameters'] || request.params - params = request.path_parameters - if params[:treeish] # parse existing branch (tag) and path - branch_or_tag = begin - (p = Project.find_by_owner_and_name params[:owner_name], params[:project_name]) && - (p.repo.branches + p.repo.tags).detect{|t| params[:treeish].start_with?(t.name)}.try(:name) || - params[:treeish].split('/').first - end - if path = params[:treeish].sub(branch_or_tag, '')[1..-1] and path.present? - params[:path] = File.join([path, params[:path]].compact) - end - params[:treeish] = branch_or_tag - end - true - end - - # def set_treeish_and_path - # if params[:treeish] and params[:path] and # try to correct branch with slashes - # treeish_with_path = File.join(params[:treeish], params[:path]) and - # branch_name = @project.repo.branches.detect{|t| treeish_with_path.start_with?(t.name)}.try(:name) - # params[:treeish] = branch_name - # params[:path] = treeish_with_path.sub(branch_name, '')[1..-1] - # end - # @treeish = params[:treeish].presence || @project.default_branch - # @path = params[:path] - # end -end diff --git a/lib/ext/rails/middleware.rb b/lib/ext/rails/middleware.rb deleted file mode 100644 index be6da8940..000000000 --- a/lib/ext/rails/middleware.rb +++ /dev/null @@ -1,18 +0,0 @@ -# class ParamsParser -# DEFAULT_PARSERS = { -# Mime::XML => :xml_simple, -# Mime::JSON => :json -# } -# -# def initialize(app, parsers = {}) -# @app, @parsers = app, DEFAULT_PARSERS.merge(parsers) -# end -# -# def call(env) -# if params = parse_formatted_parameters(env) -# env["action_dispatch.request.request_parameters"] = params -# end -# -# @app.call(env) -# end -# end diff --git a/lib/ext/rosa/constraints.rb b/lib/ext/rosa/constraints.rb index 8cbf1b26c..54e9e6191 100644 --- a/lib/ext/rosa/constraints.rb +++ b/lib/ext/rosa/constraints.rb @@ -21,13 +21,11 @@ module Rosa class Treeish def self.matches?(request) - # raise request.params.inspect - # params = request.env['action_dispatch.request.path_parameters'] || request.params params = request.path_parameters if params[:treeish] # parse existing branch (tag) and path branch_or_tag = begin (p = Project.find_by_owner_and_name params[:owner_name], params[:project_name]) && - (p.repo.branches + p.repo.tags).detect{|t| params[:treeish].start_with?(t.name)}.try(:name) || + p.repo.branches_and_tags.detect{|t| params[:treeish].start_with?(t.name)}.try(:name) || params[:treeish].split('/').first end if path = params[:treeish].sub(branch_or_tag, '')[1..-1] and path.present? diff --git a/lib/modules/models/git.rb b/lib/modules/models/git.rb index e58ac3b25..4cf2baafc 100644 --- a/lib/modules/models/git.rb +++ b/lib/modules/models/git.rb @@ -60,11 +60,8 @@ module Modules end def paginate_commits(treeish, options = {}) - options[:page] = 1 unless options[:page].present? - options[:page] = options[:page].to_i - - options[:per_page] = 20 unless options[:per_page].present? - options[:per_page] = options[:per_page].to_i + options[:page] = options[:page].try(:to_i) || 1 + options[:per_page] = options[:per_page].try(:to_i) || 20 skip = options[:per_page] * (options[:page] - 1) last_page = (skip + options[:per_page]) >= repo.commit_count(treeish) @@ -72,26 +69,13 @@ module Modules [repo.commits(treeish, options[:per_page], skip), options[:page], last_page] end - def last_active_branch - @last_active_branch ||= repo.branches.inject do |r, c| - r_last = r.commit.committed_date || r.commit.authored_date unless r.nil? - c_last = c.commit.committed_date || c.commit.authored_date - if r.nil? or r_last < c_last - r = c - end - r - end - @last_active_branch - end - def tree_info(tree, treeish = nil, path = nil) - treeish = tree.id unless treeish.present? + treeish ||= tree.id # initialize result as hash of => nil res = (tree.trees.sort + tree.blobs.sort).inject({}){|h, e| h.merge!({e => nil})} # fills result vith commits that describes this file res = res.inject(res) do |h, (entry, commit)| - # only if commit == nil ... - if commit.nil? and entry.respond_to? :name + if commit.nil? and entry.respond_to?(:name) # only if commit == nil # ... find last commit corresponds to this file ... c = repo.log(treeish, File.join([path, entry.name].compact), :max_count => 1).first # ... and add it to result. diff --git a/lib/plugins/grack/base.rb b/lib/plugins/grack/base.rb index b464f44ee..99b2d160b 100644 --- a/lib/plugins/grack/base.rb +++ b/lib/plugins/grack/base.rb @@ -35,7 +35,7 @@ module Grack def project @project ||= begin uname, name = @env['PATH_INFO'].split('/')[1,2] - name.gsub!(/\.git$/, '').gsub!(/\.wiki$/, '') + name.gsub!(/(\.wiki)?\.git$/, '') Project.find_by_owner_and_name uname, name end end diff --git a/spec/controllers/platforms/mass_builds_controller_spec.rb b/spec/controllers/platforms/mass_builds_controller_spec.rb index 357d66d94..1cd611d72 100644 --- a/spec/controllers/platforms/mass_builds_controller_spec.rb +++ b/spec/controllers/platforms/mass_builds_controller_spec.rb @@ -104,6 +104,11 @@ describe Platforms::MassBuildsController do response.should redirect_to(new_user_session_path) end + it "should not be able to perform cancel action" do + post :cancel, :platform_id => @platform, :id => @mass_build + response.should redirect_to(new_user_session_path) + end + it 'should not change objects count on create success' do lambda { post :create, @create_params }.should change{ MassBuild.count }.by(0) end diff --git a/spec/routing/projects_routing_spec.rb.rb b/spec/routing/projects_routing_spec.rb.rb index 6f964e50c..caa2042ee 100644 --- a/spec/routing/projects_routing_spec.rb.rb +++ b/spec/routing/projects_routing_spec.rb.rb @@ -13,7 +13,7 @@ describe Projects::ProjectsController do end it "routes to #edit" do - get("/import/glib2.0-mib/edit").should route_to("projects/projects#edit", :owner_name => 'import', :project_name => 'glib2.0-mib') + get("/import/glib2.0-mib/modify").should route_to("projects/projects#edit", :owner_name => 'import', :project_name => 'glib2.0-mib') end it "routes to #create" do @@ -39,6 +39,7 @@ describe Projects::Git::TreesController do get("/import/glib2.0-mib/tree/lib2safe-0.03").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'lib2safe-0.03') get("/import/glib2.0-mib/tree/branch-with.dot/folder_with.dot/path-with.dot").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'branch-with.dot', :path => 'folder_with.dot/path-with.dot') # get("/import/glib2.0-mib/tree/ветка-с.точкой/папка_с.точкой/путь-с.точкой").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'ветка-с.точкой', :path => 'папка_с.точкой/путь-с.точкой') + get("/import/glib2.0-mib/tree/branch-with/slash.dot/folder_with.dot/path-with.dot").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'branch-with/slash.dot', :path => 'folder_with.dot/path-with.dot') get("/import/glib2.0-mib/tree/tag13.52-5").should route_to("projects/git/trees#show", :owner_name => 'import', :project_name => 'glib2.0-mib', :treeish => 'tag13.52-5') end From 566cd8209b863fec0eb195b19035c79fec61c802 Mon Sep 17 00:00:00 2001 From: Pavel Chipiga Date: Fri, 27 Jul 2012 00:24:14 +0300 Subject: [PATCH 3/4] Take back branches_and_repos method. Refs #263 --- lib/ext/git/grit.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/ext/git/grit.rb b/lib/ext/git/grit.rb index 6a0095de3..4fa2f11f3 100644 --- a/lib/ext/git/grit.rb +++ b/lib/ext/git/grit.rb @@ -82,6 +82,12 @@ module Grit return 1 end end + + class Repo + def branches_and_tags + branches + tags # @branches_and_tags ||= # ??? + end + end end Grit::Git.git_timeout = 60 From b476f7248c6d21e983aa5273f9234a0ebb552901 Mon Sep 17 00:00:00 2001 From: Pavel Chipiga Date: Fri, 27 Jul 2012 13:47:23 +0300 Subject: [PATCH 4/4] Minor refactor. Refs #263 --- lib/ext/core/string.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/ext/core/string.rb b/lib/ext/core/string.rb index 8e6e7d293..e84bca715 100644 --- a/lib/ext/core/string.rb +++ b/lib/ext/core/string.rb @@ -7,13 +7,12 @@ class String if ascii_only? # no need to encode if ascii force_encoding(default_encoding) else # should encode + options = {:invalid => :replace, :undef => :replace, :replace => ''} if (detected = detect_encoding) && detected[:encoding] - force_encoding(detected[:encoding]) - encode!(default_encoding, detected[:encoding], :invalid => :replace, :undef => :replace, :replace => '') + force_encoding(detected[:encoding]).encode!(default_encoding, detected[:encoding], options) end # re-encode through UTF-16 to filter incorrect symbols - encode!(Encoding::UTF_16, default_encoding, :invalid => :replace, :undef => :replace, :replace => '') - encode!(default_encoding, Encoding::UTF_16) + encode!(Encoding::UTF_16, default_encoding, options).encode!(default_encoding, Encoding::UTF_16) raise unless valid_encoding? # check result end rescue