From 5a3f23f395eef87bf3457e6474bac82333e71ec8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 00:57:43 +0200 Subject: [PATCH 01/15] Persist Merge Request diff. Auto merge request close on push --- app/controllers/merge_requests_controller.rb | 13 +++-- app/models/event.rb | 1 + app/models/merge_request.rb | 55 ++++++++++++++++++- app/models/project.rb | 34 ++++++++++++ app/views/merge_requests/_commits.html.haml | 4 +- app/views/merge_requests/show.html.haml | 8 +-- app/workers/post_receive.rb | 6 ++ ...add_commits_diff_store_to_merge_request.rb | 6 ++ ...20315132931_add_merged_to_merge_request.rb | 5 ++ db/schema.rb | 17 +----- 10 files changed, 121 insertions(+), 28 deletions(-) create mode 100644 db/migrate/20120315111711_add_commits_diff_store_to_merge_request.rb create mode 100644 db/migrate/20120315132931_add_merged_to_merge_request.rb diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index d1d19efc..2de7ec31 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -41,13 +41,12 @@ class MergeRequestsController < ApplicationController @note = @project.notes.new(:noteable => @merge_request) - @commits = @project.repo. - commits_between(@merge_request.target_branch, @merge_request.source_branch). - map {|c| Commit.new(c)}. - sort_by(&:created_at). - reverse + # Get commits from repository + # or from cache if already merged + @commits = @merge_request.commits - render_full_content + # Close MR if nothing to merge + #@merge_request.mark_as_merged! if @merge_request.probably_merged? respond_to do |format| format.html @@ -76,6 +75,8 @@ class MergeRequestsController < ApplicationController respond_to do |format| if @merge_request.save + @merge_request.reloaded_commits + @merge_request.reloaded_diffs format.html { redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.' } format.json { render json: @merge_request, status: :created, location: @merge_request } else diff --git a/app/models/event.rb b/app/models/event.rb index 8ab127c0..c8af9363 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -7,6 +7,7 @@ class Event < ActiveRecord::Base Reopened = 4 Pushed = 5 Commented = 6 + Merged = 7 belongs_to :project belongs_to :target, :polymorphic => true diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 9bbbcd47..6782d738 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -1,9 +1,14 @@ +require File.join(Rails.root, "app/models/commit") + class MergeRequest < ActiveRecord::Base belongs_to :project belongs_to :author, :class_name => "User" belongs_to :assignee, :class_name => "User" has_many :notes, :as => :noteable, :dependent => :destroy + serialize :st_commits + serialize :st_diffs + attr_protected :author, :author_id, :project, :project_id attr_accessor :author_id_of_changes @@ -32,7 +37,6 @@ class MergeRequest < ActiveRecord::Base scope :closed, where(:closed => true) scope :assigned, lambda { |u| where(:assignee_id => u.id)} - def validate_branches if target_branch == source_branch errors.add :base, "You can not use same branch for source and target branches" @@ -44,18 +48,65 @@ class MergeRequest < ActiveRecord::Base end def diffs + st_diffs || [] + end + + def reloaded_diffs + if open? && unmerged_diffs.any? + self.st_diffs = unmerged_diffs + save + end + diffs + end + + def unmerged_diffs commits = project.repo.commits_between(target_branch, source_branch).map {|c| Commit.new(c)} diffs = project.repo.diff(commits.first.prev_commit.id, commits.last.id) rescue [] end def last_commit - project.commit(source_branch) + commits.first end # Return the number of +1 comments (upvotes) def upvotes notes.select(&:upvote?).size end + + def commits + st_commits || [] + end + + def probably_merged? + unmerged_commits.empty? && + commits.any? && open? + end + + def open? + !closed + end + + def mark_as_merged! + self.merged = true + self.closed = true + save + end + + def reloaded_commits + if open? && unmerged_commits.any? + self.st_commits = unmerged_commits + save + end + commits + end + + def unmerged_commits + self.project.repo. + commits_between(self.target_branch, self.source_branch). + map {|c| Commit.new(c)}. + sort_by(&:created_at). + reverse + end end # == Schema Information # diff --git a/app/models/project.rb b/app/models/project.rb index 2ba0c907..28f03297 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -73,6 +73,40 @@ class Project < ActiveRecord::Base ) end + def update_merge_requests(oldrev, newrev, ref, author_key_id) + return true unless ref =~ /heads/ + branch_name = ref.gsub("refs/heads/", "") + + key = Key.find_by_identifier(author_key_id) + user = key.user + + c_ids = self.commits_between(oldrev, newrev).map(&:id) + + # update commits & diffs for existing MR + mrs = self.merge_requests.opened.where(:source_branch => branch_name).all + mrs.each do |merge_request| + merge_request.reloaded_commits + merge_request.reloaded_diffs + end + + # Close merge requests + mrs = self.merge_requests.opened.where(:target_branch => branch_name).all + mrs.each do |merge_request| + next unless merge_request.last_commit + # Mark as merged & create event if merged + if c_ids.include?(merge_request.last_commit.id) + merge_request.mark_as_merged! + Event.create( + :project => self, + :action => Event::Merged, + :data => {:merge_request_id => merge_request.id}, + :author_id => user.id + ) + end + end + true + end + def execute_web_hooks(oldrev, newrev, ref, author_key_id) ref_parts = ref.split('/') diff --git a/app/views/merge_requests/_commits.html.haml b/app/views/merge_requests/_commits.html.haml index 7606e71e..60cb21ba 100644 --- a/app/views/merge_requests/_commits.html.haml +++ b/app/views/merge_requests/_commits.html.haml @@ -2,7 +2,9 @@ .ui-box %h5 Commits .merge-request-commits - %ul.unstyled= render @commits + %ul.unstyled + - @commits.each do |commit| + = render "commits/commit", :commit => commit - else %h5 diff --git a/app/views/merge_requests/show.html.haml b/app/views/merge_requests/show.html.haml index 77bb6120..7b9e31df 100644 --- a/app/views/merge_requests/show.html.haml +++ b/app/views/merge_requests/show.html.haml @@ -11,12 +11,10 @@ %span.right - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.closed - = link_to 'Reopen', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => false }, :status_only => true), :method => :put, :class => "btn" - - else + - if @merge_request.open? = link_to 'Close', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => true }, :status_only => true), :method => :put, :class => "btn", :title => "Close merge request" - = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn" do - Edit + = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn" do + Edit - if @merge_request.upvotes > 0 = link_to "#notes", :class => "btn success" do diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb index d74f10a1..28216ec3 100644 --- a/app/workers/post_receive.rb +++ b/app/workers/post_receive.rb @@ -8,7 +8,13 @@ class PostReceive # Ignore push from non-gitlab users return false unless Key.find_by_identifier(author_key_id) + # Create push event project.observe_push(oldrev, newrev, ref, author_key_id) + + # Close merged MR + project.update_merge_requests(oldrev, newrev, ref, author_key_id) + + # Execute web hooks project.execute_web_hooks(oldrev, newrev, ref, author_key_id) end end diff --git a/db/migrate/20120315111711_add_commits_diff_store_to_merge_request.rb b/db/migrate/20120315111711_add_commits_diff_store_to_merge_request.rb new file mode 100644 index 00000000..2dc1dfb4 --- /dev/null +++ b/db/migrate/20120315111711_add_commits_diff_store_to_merge_request.rb @@ -0,0 +1,6 @@ +class AddCommitsDiffStoreToMergeRequest < ActiveRecord::Migration + def change + add_column :merge_requests, :st_commits, :text, :null => true + add_column :merge_requests, :st_diffs, :text, :null => true + end +end diff --git a/db/migrate/20120315132931_add_merged_to_merge_request.rb b/db/migrate/20120315132931_add_merged_to_merge_request.rb new file mode 100644 index 00000000..1db590ae --- /dev/null +++ b/db/migrate/20120315132931_add_merged_to_merge_request.rb @@ -0,0 +1,5 @@ +class AddMergedToMergeRequest < ActiveRecord::Migration + def change + add_column :merge_requests, :merged, :true, :null => false, :default => false + end +end diff --git a/db/schema.rb b/db/schema.rb index 45e18a68..886fdf8f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120307095918) do +ActiveRecord::Schema.define(:version => 20120315132931) do create_table "events", :force => true do |t| t.string "target_type" @@ -50,19 +50,8 @@ ActiveRecord::Schema.define(:version => 20120307095918) do t.integer "project_id" end - create_table "merge_requests", :force => true do |t| - t.string "target_branch", :null => false - t.string "source_branch", :null => false - t.integer "project_id", :null => false - t.integer "author_id" - t.integer "assignee_id" - t.string "title" - t.boolean "closed", :default => false, :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" +# Could not dump table "merge_requests" because of following StandardError +# Unknown type 'true' for column 'merged' create_table "notes", :force => true do |t| t.text "note" From a4993f16c0239c8615b8d068c6e53415209f8cb1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 19:39:03 +0200 Subject: [PATCH 02/15] Fixed migration, test for MR --- ...120315132931_add_merged_to_merge_request.rb | 2 +- db/schema.rb | 18 ++++++++++++++++-- spec/requests/merge_requests_spec.rb | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/db/migrate/20120315132931_add_merged_to_merge_request.rb b/db/migrate/20120315132931_add_merged_to_merge_request.rb index 1db590ae..2deb59e4 100644 --- a/db/migrate/20120315132931_add_merged_to_merge_request.rb +++ b/db/migrate/20120315132931_add_merged_to_merge_request.rb @@ -1,5 +1,5 @@ class AddMergedToMergeRequest < ActiveRecord::Migration def change - add_column :merge_requests, :merged, :true, :null => false, :default => false + add_column :merge_requests, :merged, :boolean, :null => false, :default => false end end diff --git a/db/schema.rb b/db/schema.rb index 886fdf8f..e224aa2c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -50,8 +50,22 @@ ActiveRecord::Schema.define(:version => 20120315132931) do t.integer "project_id" end -# Could not dump table "merge_requests" because of following StandardError -# Unknown type 'true' for column 'merged' + create_table "merge_requests", :force => true do |t| + t.string "target_branch", :null => false + t.string "source_branch", :null => false + t.integer "project_id", :null => false + t.integer "author_id" + t.integer "assignee_id" + t.string "title" + t.boolean "closed", :default => false, :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.text "st_commits" + t.text "st_diffs" + t.boolean "merged", :default => false, :null => false + end + + add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" create_table "notes", :force => true do |t| t.text "note" diff --git a/spec/requests/merge_requests_spec.rb b/spec/requests/merge_requests_spec.rb index f4e25cab..f8b8725f 100644 --- a/spec/requests/merge_requests_spec.rb +++ b/spec/requests/merge_requests_spec.rb @@ -42,7 +42,7 @@ describe "MergeRequests" do it { should have_content(@merge_request.title[0..10]) } it "Show page should inform user that merge request closed" do - page.should have_content "Reopen" + page.should have_content "Closed" end end end From 5fdcbedab4ea8ea42f60af275aff30d29a84d3e8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 19:49:36 +0200 Subject: [PATCH 03/15] add resque to gitlab service --- doc/installation.md | 9 +++++++-- resque.sh | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index 95249abc..c16fc4c9 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -256,33 +256,38 @@ Create init script in /etc/init.d/gitlab: NAME=unicorn DESC="Gitlab service" PID=/home/gitlab/gitlab/tmp/pids/unicorn.pid + RESQUE_PID=/home/gitlab/gitlab/tmp/pids/resque_worker.pid case "$1" in start) CD_TO_APP_DIR="cd /home/gitlab/gitlab" START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" + START_RESQUE_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" echo -n "Starting $DESC: " if [ `whoami` = root ]; then - sudo -u gitlab sh -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS" + sudo -u gitlab sh -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && START_RESQUE_PROCESS" else - $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS + $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS fi echo "$NAME." ;; stop) echo -n "Stopping $DESC: " kill -QUIT `cat $PID` + kill -QUIT `cat $RESQUE_PID` echo "$NAME." ;; restart) echo -n "Restarting $DESC: " kill -USR2 `cat $PID` + kill -USR2 `cat $RESQUE_PID` echo "$NAME." ;; reload) echo -n "Reloading $DESC configuration: " kill -HUP `cat $PID` + kill -HUP `cat $RESQUE_PID` echo "$NAME." ;; *) diff --git a/resque.sh b/resque.sh index 84a1066f..d8b68d46 100755 --- a/resque.sh +++ b/resque.sh @@ -1,2 +1,2 @@ mkdir tmp/pids -nohup bundle exec rake environment resque:work QUEUE=* RAILS_ENV=production PIDFILE=tmp/pids/resque_worker_QUEUE.pid & >> log/resque_worker_QUEUE.log 2>&1 +nohup bundle exec rake environment resque:work QUEUE=* RAILS_ENV=production PIDFILE=tmp/pids/resque_worker.pid & >> log/resque_worker.log 2>&1 From cf68adda4b77ec9dae63f717f965df887e1b5d9a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 20:06:26 +0200 Subject: [PATCH 04/15] fixed service docs --- doc/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index c16fc4c9..8a3736d8 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -262,11 +262,11 @@ Create init script in /etc/init.d/gitlab: start) CD_TO_APP_DIR="cd /home/gitlab/gitlab" START_DAEMON_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" - START_RESQUE_PROCESS="bundle exec unicorn_rails $DAEMON_OPTS" + START_RESQUE_PROCESS="./resque.sh" echo -n "Starting $DESC: " if [ `whoami` = root ]; then - sudo -u gitlab sh -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && START_RESQUE_PROCESS" + sudo -u gitlab sh -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS" else $CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS && $START_RESQUE_PROCESS fi From 828f84fdb35a61c3de93226c1a6cd5c6be68c263 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 23:01:50 +0200 Subject: [PATCH 05/15] fixed merge request notes hide --- app/assets/javascripts/merge_requests.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/merge_requests.js b/app/assets/javascripts/merge_requests.js index 1c262afc..96bc1ccb 100644 --- a/app/assets/javascripts/merge_requests.js +++ b/app/assets/javascripts/merge_requests.js @@ -11,7 +11,7 @@ var MergeRequest = { $(".tabs a.merge-notes-tab").live("click", function(e) { $(".merge-request-diffs").hide(); - $(".merge-request-notes").show(); + $(".merge_request_notes").show(); e.preventDefault(); }); @@ -19,7 +19,7 @@ var MergeRequest = { if(!MergeRequest.diffs_loaded) { MergeRequest.loadDiff(); } - $(".merge-request-notes").hide(); + $(".merge_request_notes").hide(); $(".merge-request-diffs").show(); e.preventDefault(); }); @@ -33,7 +33,7 @@ var MergeRequest = { url: $(".merge-diffs-tab").attr("data-url"), complete: function(){ MergeRequest.diffs_loaded = true; - $(".merge-request-notes").hide(); + $(".merge_request_notes").hide(); $(".dashboard-loader").hide()}, dataType: "script"}); } From 7b75f3cfd34820ecdf0eddb7703bdba1e4c23f9f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 23:32:00 +0200 Subject: [PATCH 06/15] show who merged request --- app/models/merge_request.rb | 4 ++++ app/models/project.rb | 3 ++- app/views/merge_requests/show.html.haml | 10 ++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 6782d738..da74baa2 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -68,6 +68,10 @@ class MergeRequest < ActiveRecord::Base commits.first end + def merge_event + self.project.events.where(:target_id => self.id, :target_type => "MergeRequest", :action => Event::Merged).last + end + # Return the number of +1 comments (upvotes) def upvotes notes.select(&:upvote?).size diff --git a/app/models/project.rb b/app/models/project.rb index 28f03297..08a12d7d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -99,7 +99,8 @@ class Project < ActiveRecord::Base Event.create( :project => self, :action => Event::Merged, - :data => {:merge_request_id => merge_request.id}, + :target_id => merge_request.id, + :target_type => "MergeRequest", :author_id => user.id ) end diff --git a/app/views/merge_requests/show.html.haml b/app/views/merge_requests/show.html.haml index 3db24774..44291cf4 100644 --- a/app/views/merge_requests/show.html.haml +++ b/app/views/merge_requests/show.html.haml @@ -28,6 +28,16 @@ %hr - if @merge_request.closed .alert-message.error Closed + - if @merge_request.merged + - event = @merge_request.merge_event + %div + %p + %strong #{event.author_name} + merged this request + %span.cgray + = time_ago_in_words(event.created_at) + ago. + %br - else .alert-message.success = link_to "#", :class => "info_link", :title => "How To Merge" do From b2c13bdd777838e9837b12e56854e152b8a13f0c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 15 Mar 2012 23:44:04 +0200 Subject: [PATCH 07/15] button styled --- app/assets/stylesheets/common.scss | 12 ++++++++++++ app/views/commits/show.html.haml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index ee06ca6d..a0f522c1 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -11,6 +11,18 @@ a { } } +.btn { + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6)); + background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); + background-image: -moz-linear-gradient(top, #f1f1f1, #f1f1f1 25%, #e6e6e6); + background-image: -ms-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); + background-image: -o-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); + background-image: linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); + + &:hover { + } +} + a:focus { outline: none; } diff --git a/app/views/commits/show.html.haml b/app/views/commits/show.html.haml index 9c1df54e..8c81b862 100644 --- a/app/views/commits/show.html.haml +++ b/app/views/commits/show.html.haml @@ -12,7 +12,7 @@ = @commit.committer_name %small= @commit.committed_date.stamp("Aug 21, 2011 9:23pm") -%hr +%br %pre.commit_message = commit_msg_with_link_to_issues(@project, @commit.safe_message) .clear From 5d2bd5ec3a6d1c9ceb985e0af684f162926b0555 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Mar 2012 01:14:39 +0200 Subject: [PATCH 08/15] Simple search implementation --- app/assets/javascripts/application.js | 1 + app/assets/stylesheets/common.scss | 4 ++ app/controllers/search_controller.rb | 12 +++++ app/models/merge_request.rb | 4 ++ app/models/project.rb | 4 ++ app/views/dashboard/_projects_feed.html.haml | 2 +- app/views/dashboard/index.html.haml | 2 +- app/views/layouts/_app_menu.html.haml | 1 + app/views/layouts/_head_panel.html.haml | 4 +- app/views/search/_result.html.haml | 1 + app/views/search/show.html.haml | 41 ++++++++++++++ config/routes.rb | 2 +- vendor/assets/javascripts/jquery.highlight.js | 53 +++++++++++++++++++ 13 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 app/controllers/search_controller.rb create mode 100644 app/views/search/_result.html.haml create mode 100644 app/views/search/show.html.haml create mode 100644 vendor/assets/javascripts/jquery.highlight.js diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b3142feb..85fb8e78 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -11,6 +11,7 @@ //= require jquery.tagify //= require jquery.cookie //= require jquery.endless-scroll +//= require jquery.highlight //= require bootstrap-modal //= require modernizr //= require chosen diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index a0f522c1..9609733c 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -947,3 +947,7 @@ p.time { padding: 4px; margin: 2px; } + +.highlight_word { + background:#EEDC94; +} diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb new file mode 100644 index 00000000..8a452fe0 --- /dev/null +++ b/app/controllers/search_controller.rb @@ -0,0 +1,12 @@ +class SearchController < ApplicationController + def show + query = params[:search] + if query.blank? + @projects = [] + @merge_requests = [] + else + @projects = Project.search(query).limit(10) + @merge_requests = MergeRequest.search(query).limit(10) + end + end +end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index da74baa2..8f5c2f27 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -37,6 +37,10 @@ class MergeRequest < ActiveRecord::Base scope :closed, where(:closed => true) scope :assigned, lambda { |u| where(:assignee_id => u.id)} + def self.search query + where("title like :query", :query => "%#{query}%") + end + def validate_branches if target_branch == source_branch errors.add :base, "You can not use same branch for source and target branches" diff --git a/app/models/project.rb b/app/models/project.rb index 08a12d7d..9391ba9c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -54,6 +54,10 @@ class Project < ActiveRecord::Base UsersProject.access_roles end + def self.search query + where("name like :query or code like :query or path like :query", :query => "%#{query}%") + end + def to_param code end diff --git a/app/views/dashboard/_projects_feed.html.haml b/app/views/dashboard/_projects_feed.html.haml index c1abe556..5f146d49 100644 --- a/app/views/dashboard/_projects_feed.html.haml +++ b/app/views/dashboard/_projects_feed.html.haml @@ -1,4 +1,4 @@ -- @active_projects.first(5).each do |project| +- projects.first(5).each do |project| .wll = link_to project do %h4 diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index d3946f5b..5dde57e8 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -20,7 +20,7 @@ .row .dashboard_block .row - .span10= render "dashboard/projects_feed" + .span10= render "dashboard/projects_feed", :projects => @active_projects .span4.right - if current_user.can_create_project? .alert-message.block-message.warning diff --git a/app/views/layouts/_app_menu.html.haml b/app/views/layouts/_app_menu.html.haml index 27d9b458..60ff4854 100644 --- a/app/views/layouts/_app_menu.html.haml +++ b/app/views/layouts/_app_menu.html.haml @@ -1,6 +1,7 @@ %nav.main_menu = render "layouts/const_menu_links" = link_to "Projects", projects_path, :class => "#{"current" if current_page?(projects_path)}" + = link_to "Search", search_path, :class => "#{"current" if current_page?(search_path)}" = link_to "Issues", dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" = link_to "Requests", dashboard_merge_requests_path, :class => "#{"current" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide" = link_to "Help", help_path, :class => "#{"current" if controller.controller_name == "help"}" diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index 221bca55..88429a48 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -7,7 +7,9 @@ %h1 GITLAB %h1.project_name= title - .search= text_field_tag "search", nil, :placeholder => "Search", :class => "search-input" + .search + = form_tag search_path, :method => :get do |f| + = text_field_tag "search", nil, :placeholder => "Search", :class => "search-input" - if current_user.is_admin? = link_to admin_projects_path, :class => "admin_link", :title => "Admin area" do = image_tag "admin.PNG", :width => 16 diff --git a/app/views/search/_result.html.haml b/app/views/search/_result.html.haml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/app/views/search/_result.html.haml @@ -0,0 +1 @@ + diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml new file mode 100644 index 00000000..a524b7b4 --- /dev/null +++ b/app/views/search/show.html.haml @@ -0,0 +1,41 @@ += form_tag search_path, :method => :get do |f| + .padded + = label_tag :search, "Looking for" + .input + = text_field_tag :search, params[:search],:placeholder => "issue 143", :class => "xxlarge" + = submit_tag 'Search', :class => "btn primary" +- if params[:search].present? + %br + %h3 Search results + %hr + .search_results + - if @projects.empty? && @merge_requests.empty? + %h3 + %small Nothing here + - else + - if @projects.any? + - @projects.each do |project| + = link_to project do + %h4 + %span.ico.project + = project.name + %small + last activity at + = project.last_activity_date.stamp("Aug 25, 2011") + - if @merge_requests.any? + - @merge_requests.each do |merge_request| + = link_to [merge_request.project, merge_request] do + %h5 + Merge Request # + = merge_request.id + – + = truncate merge_request.title, :length => 50 + %small + updated at + = merge_request.updated_at.stamp("Aug 25, 2011") + %strong + %span.label= merge_request.project.name + :javascript + $(function() { + $(".search_results").highlight("#{params[:search]}"); + }) diff --git a/config/routes.rb b/config/routes.rb index 4cc3a4ff..be559282 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Gitlab::Application.routes.draw do - + get 'search' => "search#show" # Optionally, enable Resque here require 'resque/server' diff --git a/vendor/assets/javascripts/jquery.highlight.js b/vendor/assets/javascripts/jquery.highlight.js new file mode 100644 index 00000000..7a67cf99 --- /dev/null +++ b/vendor/assets/javascripts/jquery.highlight.js @@ -0,0 +1,53 @@ +/* + +highlight v3 + +Highlights arbitrary terms. + + + +MIT license. + +Johann Burkard + + + +*/ + +jQuery.fn.highlight = function(pat) { + function innerHighlight(node, pat) { + var skip = 0; + if (node.nodeType == 3) { + var pos = node.data.toUpperCase().indexOf(pat); + if (pos >= 0) { + var spannode = document.createElement('span'); + spannode.className = 'highlight_word'; + var middlebit = node.splitText(pos); + var endbit = middlebit.splitText(pat.length); + var middleclone = middlebit.cloneNode(true); + spannode.appendChild(middleclone); + middlebit.parentNode.replaceChild(spannode, middlebit); + skip = 1; + } + } + else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) { + for (var i = 0; i < node.childNodes.length; ++i) { + i += innerHighlight(node.childNodes[i], pat); + } + } + return skip; + } + return this.each(function() { + innerHighlight(this, pat.toUpperCase()); + }); +}; + +jQuery.fn.removeHighlight = function() { + return this.find("span.highlight").each(function() { + this.parentNode.firstChild.nodeName; + with (this.parentNode) { + replaceChild(this.firstChild, this); + normalize(); + } + }).end(); +}; From 7f76d6cfee7f95e6d89691431540e8d948ca60ec Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Mar 2012 01:31:46 +0200 Subject: [PATCH 09/15] counters for dashboard panel --- app/assets/stylesheets/common.scss | 12 ++++++++++++ app/controllers/dashboard_controller.rb | 2 +- app/models/user.rb | 4 ++++ app/views/layouts/_app_menu.html.haml | 8 ++++++-- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 9609733c..e998b7bb 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -43,6 +43,18 @@ a:focus { background-color: #474D57; } +.pretty_label { + @include round-borders-all(4px); + padding:2px 4px; + background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8)); + background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8); + background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8); + background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8); + color: #777; + border: 1px solid #DEDFE1; + +} + .tabs > li > a, .pills > li > a { color:$style_color; } diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 8fa41298..f6b09e23 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -18,7 +18,7 @@ class DashboardController < ApplicationController # Get authored or assigned open merge requests def merge_requests @projects = current_user.projects.all - @merge_requests = MergeRequest.where("author_id = :id or assignee_id = :id", :id => current_user.id).opened.order("created_at DESC").limit(40) + @merge_requests = current_user.cared_merge_requests.order("created_at DESC").limit(40) end # Get only assigned issues diff --git a/app/models/user.rb b/app/models/user.rb index 660e5a21..5caa7451 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -86,6 +86,10 @@ class User < ActiveRecord::Base ) end end + + def cared_merge_requests + MergeRequest.where("author_id = :id or assignee_id = :id", :id => self.id).opened + end end # == Schema Information # diff --git a/app/views/layouts/_app_menu.html.haml b/app/views/layouts/_app_menu.html.haml index 60ff4854..e6a6ebf0 100644 --- a/app/views/layouts/_app_menu.html.haml +++ b/app/views/layouts/_app_menu.html.haml @@ -2,6 +2,10 @@ = render "layouts/const_menu_links" = link_to "Projects", projects_path, :class => "#{"current" if current_page?(projects_path)}" = link_to "Search", search_path, :class => "#{"current" if current_page?(search_path)}" - = link_to "Issues", dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" - = link_to "Requests", dashboard_merge_requests_path, :class => "#{"current" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide" + = link_to dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" do + Issues + %span.count= current_user.assigned_issues.opened.count + = link_to dashboard_merge_requests_path, :class => "#{"current" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide" do + Requests + %span.count= current_user.cared_merge_requests.count = link_to "Help", help_path, :class => "#{"current" if controller.controller_name == "help"}" From e2b39517003bb2045f63c2653471275cbbbc1c10 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Mar 2012 01:32:46 +0200 Subject: [PATCH 10/15] Some test covering merge request update hook --- spec/models/project_spec.rb | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index cb28a7ec..1f8133e7 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -160,6 +160,34 @@ describe Project do end end end + + describe :update_merge_requests do + let(:project) { Factory :project } + + before do + @merge_request = Factory :merge_request, + :project => project, + :merged => false, + :closed => false + @key = Factory :key, :user_id => project.owner.id + end + + it "should close merge request if last commit from source branch was pushed to target branch" do + @merge_request.reloaded_commits + @merge_request.last_commit.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a" + project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/stable", @key.identifier) + @merge_request.reload + @merge_request.merged.should be_true + @merge_request.closed.should be_true + end + + it "should update merge request commits with new one if pushed to source branch" do + @merge_request.last_commit.should == nil + project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/master", @key.identifier) + @merge_request.reload + @merge_request.last_commit.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a" + end + end end # == Schema Information # From 2ec12c9bb81b28add0b1d7404822d8312ed08d77 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Mar 2012 01:45:46 +0200 Subject: [PATCH 11/15] Impoved merge requests show page. Minor style improvements across project --- app/assets/stylesheets/common.scss | 20 ++++++++++- app/controllers/merge_requests_controller.rb | 7 ++-- app/models/merge_request.rb | 29 ++++++++++++++++ app/models/project.rb | 31 ++++------------- .../events/_event_changed_issue.html.haml | 11 +++--- .../_event_changed_merge_request.html.haml | 12 +++---- app/views/events/_event_new_issue.html.haml | 3 +- .../events/_event_new_merge_request.html.haml | 4 +-- app/views/events/_event_push.html.haml | 14 ++++---- app/views/issues/_show.html.haml | 2 +- .../merge_requests/_how_to_merge.html.haml | 2 +- .../merge_requests/_merge_request.html.haml | 2 +- app/views/merge_requests/show.html.haml | 34 +++++++++---------- 13 files changed, 101 insertions(+), 70 deletions(-) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index e998b7bb..9b65d605 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -41,6 +41,10 @@ a:focus { .label { background-color: #474D57; + + &.pushed { + background-color: $link_color; + } } .pretty_label { @@ -865,7 +869,7 @@ p.time { } } - padding: 10px 5px; + padding: 15px 5px; border-bottom: 1px solid #eee; border-bottom: 1px solid rgba(0, 0, 0, 0.05); &:last-child { border:none } @@ -963,3 +967,17 @@ p.time { .highlight_word { background:#EEDC94; } + +.status_info { + font-size:14px; + padding:5px 15px; + line-height:24px; + width:60px; + text-align:center; + float:left; + margin-right:20px; +} + +.merge_request_status_holder { + margin-bottom:20px; +} diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index 2de7ec31..3a3143cb 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -45,9 +45,6 @@ class MergeRequestsController < ApplicationController # or from cache if already merged @commits = @merge_request.commits - # Close MR if nothing to merge - #@merge_request.mark_as_merged! if @merge_request.probably_merged? - respond_to do |format| format.html format.js @@ -75,8 +72,7 @@ class MergeRequestsController < ApplicationController respond_to do |format| if @merge_request.save - @merge_request.reloaded_commits - @merge_request.reloaded_diffs + @merge_request.reload_code format.html { redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.' } format.json { render json: @merge_request, status: :created, location: @merge_request } else @@ -89,6 +85,7 @@ class MergeRequestsController < ApplicationController def update respond_to do |format| if @merge_request.update_attributes(params[:merge_request].merge(:author_id_of_changes => current_user.id)) + @merge_request.reload_code format.html { redirect_to [@project, @merge_request], notice: 'Merge request was successfully updated.' } format.json { head :ok } else diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 8f5c2f27..edf073d4 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -41,12 +41,21 @@ class MergeRequest < ActiveRecord::Base where("title like :query", :query => "%#{query}%") end + def self.find_all_by_branch(branch_name) + where("source_branch like :branch or target_branch like :branch", :branch => branch_name) + end + def validate_branches if target_branch == source_branch errors.add :base, "You can not use same branch for source and target branches" end end + def reload_code + self.reloaded_commits + self.reloaded_diffs + end + def new? today? && created_at == updated_at end @@ -72,10 +81,19 @@ class MergeRequest < ActiveRecord::Base commits.first end + def merged? + merged && merge_event + end + def merge_event self.project.events.where(:target_id => self.id, :target_type => "MergeRequest", :action => Event::Merged).last end + def closed_event + self.project.events.where(:target_id => self.id, :target_type => "MergeRequest", :action => Event::Closed).last + end + + # Return the number of +1 comments (upvotes) def upvotes notes.select(&:upvote?).size @@ -115,6 +133,17 @@ class MergeRequest < ActiveRecord::Base sort_by(&:created_at). reverse end + + def merge!(user_id) + self.mark_as_merged! + Event.create( + :project => self.project, + :action => Event::Merged, + :target_id => self.id, + :target_type => "MergeRequest", + :author_id => user_id + ) + end end # == Schema Information # diff --git a/app/models/project.rb b/app/models/project.rb index 9391ba9c..88111761 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -80,35 +80,18 @@ class Project < ActiveRecord::Base def update_merge_requests(oldrev, newrev, ref, author_key_id) return true unless ref =~ /heads/ branch_name = ref.gsub("refs/heads/", "") - - key = Key.find_by_identifier(author_key_id) - user = key.user - + user = Key.find_by_identifier(author_key_id).user c_ids = self.commits_between(oldrev, newrev).map(&:id) - # update commits & diffs for existing MR - mrs = self.merge_requests.opened.where(:source_branch => branch_name).all - mrs.each do |merge_request| - merge_request.reloaded_commits - merge_request.reloaded_diffs - end + # Update code for merge requests + mrs = self.merge_requests.opened.find_all_by_branch(branch_name).all + mrs.each { |merge_request| merge_request.reload_code } # Close merge requests mrs = self.merge_requests.opened.where(:target_branch => branch_name).all - mrs.each do |merge_request| - next unless merge_request.last_commit - # Mark as merged & create event if merged - if c_ids.include?(merge_request.last_commit.id) - merge_request.mark_as_merged! - Event.create( - :project => self, - :action => Event::Merged, - :target_id => merge_request.id, - :target_type => "MergeRequest", - :author_id => user.id - ) - end - end + mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) } + mrs.each { |merge_request| merge_request.merge!(user.id) } + true end diff --git a/app/views/events/_event_changed_issue.html.haml b/app/views/events/_event_changed_issue.html.haml index 65cfebbd..4f5d78af 100644 --- a/app/views/events/_event_changed_issue.html.haml +++ b/app/views/events/_event_changed_issue.html.haml @@ -1,10 +1,11 @@ = image_tag gravatar_icon(event.author_email), :class => "avatar" %strong #{event.author_name} -- if event.closed? - closed -- else - reopened -issue +%span.label.important + - if event.closed? + closed + - else + reopened + issue = link_to project_issue_path(event.project, event.issue) do %strong= truncate event.issue_title at diff --git a/app/views/events/_event_changed_merge_request.html.haml b/app/views/events/_event_changed_merge_request.html.haml index a55e609c..ff91375e 100644 --- a/app/views/events/_event_changed_merge_request.html.haml +++ b/app/views/events/_event_changed_merge_request.html.haml @@ -1,10 +1,11 @@ = image_tag gravatar_icon(event.author_email), :class => "avatar" %strong #{event.author_name} -- if event.closed? - closed -- else - reopened -merge request +%span.label.important + - if event.closed? + closed + - else + reopened + merge request = link_to project_merge_request_path(event.project, event.merge_request) do %strong= truncate event.merge_request_title at @@ -12,7 +13,6 @@ at %span.cgray = time_ago_in_words(event.created_at) ago. -%br %span.label= event.merge_request.source_branch → %span.label= event.merge_request.target_branch diff --git a/app/views/events/_event_new_issue.html.haml b/app/views/events/_event_new_issue.html.haml index 477ca48f..3d38d844 100644 --- a/app/views/events/_event_new_issue.html.haml +++ b/app/views/events/_event_new_issue.html.haml @@ -1,6 +1,7 @@ = image_tag gravatar_icon(event.author_email), :class => "avatar" %strong #{event.author_name} -created new issue +%span.label.success created + new issue = link_to project_issue_path(event.project, event.issue) do %strong= truncate event.issue_title at diff --git a/app/views/events/_event_new_merge_request.html.haml b/app/views/events/_event_new_merge_request.html.haml index e6895351..e3d8ab2a 100644 --- a/app/views/events/_event_new_merge_request.html.haml +++ b/app/views/events/_event_new_merge_request.html.haml @@ -1,6 +1,7 @@ = image_tag gravatar_icon(event.author_email), :class => "avatar" %strong #{event.author_name} -requested merge +%span.label.success requested + merge = link_to project_merge_request_path(event.project, event.merge_request) do %strong= truncate event.merge_request_title at @@ -8,7 +9,6 @@ at %span.cgray = time_ago_in_words(event.created_at) ago. -%br %span.label= event.merge_request.source_branch → %span.label= event.merge_request.target_branch diff --git a/app/views/events/_event_push.html.haml b/app/views/events/_event_push.html.haml index c59b482f..f09aac29 100644 --- a/app/views/events/_event_push.html.haml +++ b/app/views/events/_event_push.html.haml @@ -1,7 +1,8 @@ - if event.new_branch? || event.new_tag? = image_tag gravatar_icon(event.author_email), :class => "avatar" %strong #{event.author_name} - pushed new + %span.label.pushed pushed +  new - if event.new_tag? tag = link_to project_commits_path(event.project, :ref => event.tag_name) do @@ -18,7 +19,8 @@ - else = image_tag gravatar_icon(event.author_email), :class => "avatar" %strong #{event.author_name} - pushed to + %span.label.pushed pushed +  to = link_to project_commits_path(event.project, :ref => event.branch_name) do %strong= event.branch_name at @@ -30,10 +32,10 @@ = link_to compare_project_commits_path(event.project, :from => event.commits.first.prev_commit_id, :to => event.commits.last.id) do Compare #{event.commits.first.commit.id[0..8]}...#{event.commits.last.id[0..8]} - @project = event.project - %ul.unstyled - - if event.commits.size > 4 - = render event.commits[0..2] - %li ... and #{event.commits.size - 3} more commits + %ul.unstyled.event_commits + - if event.commits.size > 3 + = render event.commits[0...2] + %li ... and #{event.commits.size - 2} more commits - else = render event.commits diff --git a/app/views/issues/_show.html.haml b/app/views/issues/_show.html.haml index 7b25579f..78d50340 100644 --- a/app/views/issues/_show.html.haml +++ b/app/views/issues/_show.html.haml @@ -15,7 +15,7 @@ - if issue.today? %span.label.success today - if issue.notes.any? - %span.label= pluralize issue.notes.count, 'note' + %span.pretty_label= pluralize issue.notes.count, 'note' - if issue.upvotes > 0 %span.label.success= "+#{issue.upvotes}" diff --git a/app/views/merge_requests/_how_to_merge.html.haml b/app/views/merge_requests/_how_to_merge.html.haml index 19caca3f..5cf5e5bc 100644 --- a/app/views/merge_requests/_how_to_merge.html.haml +++ b/app/views/merge_requests/_how_to_merge.html.haml @@ -15,7 +15,7 @@ :javascript $(function(){ var modal = $('#modal_merge_info').modal({modal: true}); - $('.info_link').bind("click", function(){ + $('.how_to_merge_link').bind("click", function(){ modal.show(); }); $('.modal-header .close').bind("click", function(){ diff --git a/app/views/merge_requests/_merge_request.html.haml b/app/views/merge_requests/_merge_request.html.haml index 4b3470f9..9f556c06 100644 --- a/app/views/merge_requests/_merge_request.html.haml +++ b/app/views/merge_requests/_merge_request.html.haml @@ -6,7 +6,7 @@ = time_ago_in_words(merge_request.created_at) ago - if merge_request.notes.any? - %span.label= pluralize merge_request.notes.count, 'note' + %span.pretty_label= pluralize merge_request.notes.count, 'note' - if merge_request.upvotes > 0 %span.label.success= "+#{merge_request.upvotes}" .right diff --git a/app/views/merge_requests/show.html.haml b/app/views/merge_requests/show.html.haml index 44291cf4..a72813a0 100644 --- a/app/views/merge_requests/show.html.haml +++ b/app/views/merge_requests/show.html.haml @@ -26,23 +26,23 @@ %hr -- if @merge_request.closed - .alert-message.error Closed - - if @merge_request.merged - - event = @merge_request.merge_event - %div - %p - %strong #{event.author_name} - merged this request - %span.cgray - = time_ago_in_words(event.created_at) - ago. - %br -- else - .alert-message.success - = link_to "#", :class => "info_link", :title => "How To Merge" do - = image_tag "Info-UI.PNG" - Open +.merge_request_status_holder + - if @merge_request.closed + %h5 + .alert-message.error.status_info Closed + - if @merge_request.merged? + %span + Merged by #{@merge_request.merge_event.author_name} + %small #{time_ago_in_words(@merge_request.merge_event.created_at)} ago. + - elsif @merge_request.closed_event + %span + Closed by #{@merge_request.closed_event.author_name} + %small #{time_ago_in_words(@merge_request.closed_event.created_at)} ago. + %br + - else + %h5 + .alert-message.success.status_info Open + = link_to "How to merge", "#", :class => "vlink how_to_merge_link", :title => "How To Merge" = render "merge_requests/how_to_merge" From f4646f970eb142a531e5f6676515a927dc660549 Mon Sep 17 00:00:00 2001 From: Valeriy Sizov Date: Fri, 16 Mar 2012 14:58:49 +0200 Subject: [PATCH 12/15] fix install guide --- doc/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/installation.md b/doc/installation.md index 8a3736d8..22205af9 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -209,7 +209,7 @@ Application can be started with next command: cd /home/gitlab/gitlab sudo -u gitlab cp config/unicorn.rb.orig config/unicorn.rb - sudo -u gitlab unicorn_rails -c config/unicorn.rb -E production -D + sudo -u gitlab bundle exec unicorn_rails -c config/unicorn.rb -E production -D Edit /etc/nginx/nginx.conf. Add next code to **http** section: From 341b4414ea0e0b289089f1895e61e0c14051f4d9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 16 Mar 2012 21:11:03 +0300 Subject: [PATCH 13/15] styled title block for mr, issue, commit --- app/assets/stylesheets/common.scss | 7 +++++++ app/views/commits/show.html.haml | 2 +- app/views/issues/show.html.haml | 2 +- app/views/merge_requests/show.html.haml | 6 +++--- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 9b65d605..03bfd185 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -57,6 +57,13 @@ a:focus { color: #777; border: 1px solid #DEDFE1; + &.branch { + border:none; + font-size:13px; + background: #474D57; + color:#fff; + font-family: monospace; + } } .tabs > li > a, .pills > li > a { diff --git a/app/views/commits/show.html.haml b/app/views/commits/show.html.haml index 8c81b862..9e633072 100644 --- a/app/views/commits/show.html.haml +++ b/app/views/commits/show.html.haml @@ -13,7 +13,7 @@ %small= @commit.committed_date.stamp("Aug 21, 2011 9:23pm") %br -%pre.commit_message +%pre.commit_message.prettyprint = commit_msg_with_link_to_issues(@project, @commit.safe_message) .clear %br diff --git a/app/views/issues/show.html.haml b/app/views/issues/show.html.haml index ab0e82c6..a320a16f 100644 --- a/app/views/issues/show.html.haml +++ b/app/views/issues/show.html.haml @@ -31,7 +31,7 @@ .alert-message.success Open -%div.well +%div.well.prettyprint %div %cite.cgray Created by = image_tag gravatar_icon(@issue.author_email), :width => 16, :class => "lil_av" diff --git a/app/views/merge_requests/show.html.haml b/app/views/merge_requests/show.html.haml index a72813a0..e3ee5bc6 100644 --- a/app/views/merge_requests/show.html.haml +++ b/app/views/merge_requests/show.html.haml @@ -1,9 +1,9 @@ %h3 = "Merge Request ##{@merge_request.id}:"   - %span.label= @merge_request.source_branch + %span.pretty_label.branch= @merge_request.source_branch → - %span.label= @merge_request.target_branch + %span.pretty_label.branch= @merge_request.target_branch %small created at @@ -46,7 +46,7 @@ = render "merge_requests/how_to_merge" -%div.well +%div.well.prettyprint %div %cite.cgray Created by = image_tag gravatar_icon(@merge_request.author_email), :width => 16, :class => "lil_av" From 724ea16c348bc61cf7cb3dbe362c6f30cff1b2c7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 19 Mar 2012 22:52:16 +0200 Subject: [PATCH 14/15] Activities page added. Dashboard few specs. Preparing for 2.3 --- app/assets/stylesheets/common.scss | 26 +++++- app/assets/stylesheets/main.scss | 2 +- app/assets/stylesheets/ui_basic.scss | 2 +- app/controllers/dashboard_controller.rb | 5 ++ app/views/dashboard/_events_feed.html.haml | 2 - app/views/dashboard/_issues_feed.html.haml | 4 +- .../dashboard/_merge_requests_feed.html.haml | 7 +- app/views/dashboard/_projects_feed.html.haml | 4 +- app/views/dashboard/activities.html.haml | 10 +++ app/views/dashboard/index.html.haml | 5 +- app/views/layouts/_app_menu.html.haml | 3 +- app/views/profile/password.html.haml | 84 ++++++++++--------- app/views/projects/_show.html.haml | 2 +- app/views/projects/empty.html.haml | 2 +- app/views/projects/show.html.haml | 8 +- config/routes.rb | 1 + spec/requests/dashboard_spec.rb | 28 +++---- 17 files changed, 122 insertions(+), 73 deletions(-) delete mode 100644 app/views/dashboard/_events_feed.html.haml create mode 100644 app/views/dashboard/activities.html.haml diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 03bfd185..c0ead28e 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -3,7 +3,7 @@ a { color: $link_color; &:hover { text-decoration:none; - color: $style_color; + color: $blue_link; } &.btn { @@ -838,12 +838,19 @@ p.time { width:840px; margin:auto; - .wll { - padding:5px; - margin-top:5px; + .dash_project_item { + margin-bottom:10px; border:none; &:hover { background:none; + + h4 { + color:#2FA0BB; + .arrow { + background:#2FA0BB; + color:#fff; + } + } } h4 { @@ -988,3 +995,14 @@ p.time { .merge_request_status_holder { margin-bottom:20px; } + +.arrow{ + float: right; + background: #E3E5EA; + padding: 10px; + border-radius: 5px; + text-shadow: none; + color: #999; + line-height: 16px; + font-weight:bold; +} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 58818809..10388bcf 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -15,7 +15,7 @@ $app_padding:20px; $bg_color: #FFF; $styled_border_color: #2FA0BB; $color: "#4BB8D2"; -$blue_link: "#2fa0bb"; +$blue_link: #2fa0bb; /** Style colors **/ diff --git a/app/assets/stylesheets/ui_basic.scss b/app/assets/stylesheets/ui_basic.scss index 64347525..a1e6133d 100644 --- a/app/assets/stylesheets/ui_basic.scss +++ b/app/assets/stylesheets/ui_basic.scss @@ -17,7 +17,7 @@ color: $link_color; &:hover { text-decoration:none; - color: $style_color; + color: $blue_link; } } diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index f6b09e23..e098f571 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -34,4 +34,9 @@ class DashboardController < ApplicationController format.atom { render :layout => false } end end + + def activities + @projects = current_user.projects.all + @events = Event.where(:project_id => @projects.map(&:id)).recent.limit(40) + end end diff --git a/app/views/dashboard/_events_feed.html.haml b/app/views/dashboard/_events_feed.html.haml deleted file mode 100644 index 97659753..00000000 --- a/app/views/dashboard/_events_feed.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -= render @events - diff --git a/app/views/dashboard/_issues_feed.html.haml b/app/views/dashboard/_issues_feed.html.haml index 5c0e05ef..f867b358 100644 --- a/app/views/dashboard/_issues_feed.html.haml +++ b/app/views/dashboard/_issues_feed.html.haml @@ -3,8 +3,10 @@ = link_to [issue.project, issue] do %p %strong - %span.label= issue.project.name + %span.pretty_label= issue.project.name – Issue # = issue.id = truncate issue.title, :length => 50 + %span.right.cgray + = issue.updated_at.stamp("Aug 21, 2011") diff --git a/app/views/dashboard/_merge_requests_feed.html.haml b/app/views/dashboard/_merge_requests_feed.html.haml index db1ebd32..7fb7998d 100644 --- a/app/views/dashboard/_merge_requests_feed.html.haml +++ b/app/views/dashboard/_merge_requests_feed.html.haml @@ -3,8 +3,9 @@ = link_to [merge_request.project, merge_request] do %p %strong - %span.label= merge_request.project.name + %span.pretty_label= merge_request.project.name – - Merge Request # - = merge_request.id + Merge Request ##{merge_request.id} = truncate merge_request.title, :length => 50 + %span.right.cgray + = merge_request.updated_at.stamp("Aug 21, 2011") diff --git a/app/views/dashboard/_projects_feed.html.haml b/app/views/dashboard/_projects_feed.html.haml index 5f146d49..61154147 100644 --- a/app/views/dashboard/_projects_feed.html.haml +++ b/app/views/dashboard/_projects_feed.html.haml @@ -1,5 +1,5 @@ - projects.first(5).each do |project| - .wll + %div.dash_project_item = link_to project do %h4 %span.ico.project @@ -7,3 +7,5 @@ %small last activity at = project.last_activity_date.stamp("Aug 25, 2011") + %span.right.arrow + → diff --git a/app/views/dashboard/activities.html.haml b/app/views/dashboard/activities.html.haml new file mode 100644 index 00000000..2b96acc6 --- /dev/null +++ b/app/views/dashboard/activities.html.haml @@ -0,0 +1,10 @@ +- if @events.any? + %div.dashboard_category + %h3 + %span.ico.activities + = link_to "Activities" , "#activities", :id => "activities" + + %hr + = render @events +- else + %h3 Nothing here diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index 5dde57e8..895c4712 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -62,7 +62,10 @@ %h3 %span.ico.activities = link_to "Activities" , "#activities", :id => "activities" + %strong.right + = link_to dashboard_activities_path do + Visit activities page → %hr .row - .dashboard_block= render "dashboard/events_feed" + .dashboard_block= render @events diff --git a/app/views/layouts/_app_menu.html.haml b/app/views/layouts/_app_menu.html.haml index e6a6ebf0..b96bdacc 100644 --- a/app/views/layouts/_app_menu.html.haml +++ b/app/views/layouts/_app_menu.html.haml @@ -1,11 +1,12 @@ %nav.main_menu = render "layouts/const_menu_links" = link_to "Projects", projects_path, :class => "#{"current" if current_page?(projects_path)}" - = link_to "Search", search_path, :class => "#{"current" if current_page?(search_path)}" + = link_to "Activities", dashboard_activities_path, :class => "#{"current" if current_page?(dashboard_activities_path)}" = link_to dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" do Issues %span.count= current_user.assigned_issues.opened.count = link_to dashboard_merge_requests_path, :class => "#{"current" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide" do Requests %span.count= current_user.cared_merge_requests.count + = link_to "Search", search_path, :class => "#{"current" if current_page?(search_path)}" = link_to "Help", help_path, :class => "#{"current" if controller.controller_name == "help"}" diff --git a/app/views/profile/password.html.haml b/app/views/profile/password.html.haml index dc1f2214..350d6801 100644 --- a/app/views/profile/password.html.haml +++ b/app/views/profile/password.html.haml @@ -1,42 +1,46 @@ -%h3 Password -%hr -= form_for @user, :url => profile_password_path, :method => :put do |f| - .data - .alert-message.block-message.warning - %p After successfull password update you will be redirected to login page where you should login with new password - -if @user.errors.any? - .alert-message.block-message.error - %ul - - @user.errors.full_messages.each do |msg| - %li= msg - - .clearfix - = f.label :password - .input= f.password_field :password - .clearfix - = f.label :password_confirmation - .input= f.password_field :password_confirmation - .actions - = f.submit 'Save', :class => "btn" - -%h3 - Private token - %span.cred.right - keep it in secret! -%hr -= form_for @user, :url => profile_reset_private_token_path, :method => :put do |f| - .data - %p Private token used to access application resources without authentication. - %p For example its required to access commits feed. +.row + .span8 + %h3 Password %hr - %p.cgray - - if current_user.private_token - = text_field_tag "token", current_user.private_token - - else - You don`t have one yet. Click generate to fix it. - .actions - - if current_user.private_token - = f.submit 'Reset', :confirm => "Are you sure?", :class => "btn" - - else - = f.submit 'Generate', :class => "btn" + = form_for @user, :url => profile_password_path, :method => :put do |f| + .data + .alert-message.block-message.warning + %p After successfull password update you will be redirected to login page where you should login with new password + -if @user.errors.any? + .alert-message.block-message.error + %ul + - @user.errors.full_messages.each do |msg| + %li= msg + + .clearfix + = f.label :password + .input= f.password_field :password + .clearfix + = f.label :password_confirmation + .input= f.password_field :password_confirmation + .actions + = f.submit 'Save', :class => "btn" + + .span7.right + %h3 + Private token + %span.cred.right + keep it in secret! + %hr + = form_for @user, :url => profile_reset_private_token_path, :method => :put do |f| + .data + .alert-message.block-message.warning + %p Private token used to access application resources without authentication. + %hr + %p * required for rss feed + %p.cgray + - if current_user.private_token + = text_field_tag "token", current_user.private_token + - else + You don`t have one yet. Click generate to fix it. + .actions + - if current_user.private_token + = f.submit 'Reset', :confirm => "Are you sure?", :class => "btn" + - else + = f.submit 'Generate', :class => "btn" diff --git a/app/views/projects/_show.html.haml b/app/views/projects/_show.html.haml index 5d30b75b..edb9c1ce 100644 --- a/app/views/projects/_show.html.haml +++ b/app/views/projects/_show.html.haml @@ -1,4 +1,4 @@ -%h4.title +%h5.title = @project.name %br %div diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 5088c2e7..3fb81370 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -6,7 +6,7 @@ %li Visit profile → keys and add public key of every machine you want to use for work with gitlabhq. .alert-message.block-message.error - %ul.alert_holder + %ul.unstyled.alert_holder %li You should push repository to proceed. %li After push you will be able to browse code, commits etc. diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 89a3a426..ae92b1ca 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -21,9 +21,13 @@ = text_field_tag :project_clone, @project.url_to_repo, :class => "xlarge one_click_select git_clone_url" - if @project.description.present? - = markdown @project.description + .prettyprint= markdown @project.description - unless @events.blank? - %h5.cgray Recent Activity + %br + %h5.cgray + %span.ico.activities + Recent Activity + %hr .content_list= render @events diff --git a/config/routes.rb b/config/routes.rb index be559282..8241b542 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -40,6 +40,7 @@ Gitlab::Application.routes.draw do get "dashboard", :to => "dashboard#index" get "dashboard/issues", :to => "dashboard#issues" get "dashboard/merge_requests", :to => "dashboard#merge_requests" + get "dashboard/activities", :to => "dashboard#activities" #get "profile/:id", :to => "profile#show" diff --git a/spec/requests/dashboard_spec.rb b/spec/requests/dashboard_spec.rb index 98de046f..1ca256f9 100644 --- a/spec/requests/dashboard_spec.rb +++ b/spec/requests/dashboard_spec.rb @@ -1,6 +1,4 @@ require 'spec_helper' -__END__ -# Disabled for now describe "Dashboard" do before do @project = Factory :project @@ -22,19 +20,21 @@ describe "Dashboard" do end it "should have projects panel" do - within ".project-list" do - page.should have_content(@project.name) - end + page.should have_content(@project.name) + end + end + + describe "GET /dashboard/activities" do + before do + visit dashboard_activities_path end - # Temporary disabled cause of travis - # TODO: fix or rewrite - #it "should have news feed" do - #within "#news-feed" do - #page.should have_content("commit") - #page.should have_content(@project.commit.author.name) - #page.should have_content(@project.commit.safe_message) - #end - #end + it "should be on dashboard page" do + current_path.should == dashboard_activities_path + end + + it "should have projects panel" do + page.should have_content(@project.name) + end end end From cadf12c60cc27c5b0b8273c1de4b190a0e88bd7d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 20 Mar 2012 00:05:35 +0200 Subject: [PATCH 15/15] Merged activities & projects pages --- app/assets/stylesheets/common.scss | 2 +- app/controllers/dashboard_controller.rb | 5 ---- app/controllers/projects_controller.rb | 2 +- app/views/dashboard/activities.html.haml | 10 -------- app/views/dashboard/index.html.haml | 3 --- app/views/layouts/_app_menu.html.haml | 1 - app/views/projects/index.html.haml | 32 +++++++----------------- app/views/projects/show.js.haml | 7 ------ spec/requests/dashboard_spec.rb | 14 ----------- 9 files changed, 11 insertions(+), 65 deletions(-) delete mode 100644 app/views/dashboard/activities.html.haml delete mode 100644 app/views/projects/show.js.haml diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index c0ead28e..6b3455c5 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -925,7 +925,7 @@ p.time { } a:last-child h4 { border:none; } - a.active { + a:hover { h4 { color:#111; border-right:4px solid $styled_border_color; diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index e098f571..f6b09e23 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -34,9 +34,4 @@ class DashboardController < ApplicationController format.atom { render :layout => false } end end - - def activities - @projects = current_user.projects.all - @events = Event.where(:project_id => @projects.map(&:id)).recent.limit(40) - end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 90372cf5..459beec9 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -13,6 +13,7 @@ class ProjectsController < ApplicationController def index @projects = current_user.projects @projects = @projects.select(&:last_activity_date).sort_by(&:last_activity_date).reverse + @events = Event.where(:project_id => @projects.map(&:id)).recent.limit(40) end def new @@ -78,7 +79,6 @@ class ProjectsController < ApplicationController render "projects/empty" end end - format.js end end diff --git a/app/views/dashboard/activities.html.haml b/app/views/dashboard/activities.html.haml deleted file mode 100644 index 2b96acc6..00000000 --- a/app/views/dashboard/activities.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -- if @events.any? - %div.dashboard_category - %h3 - %span.ico.activities - = link_to "Activities" , "#activities", :id => "activities" - - %hr - = render @events -- else - %h3 Nothing here diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index 895c4712..b20fafca 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -62,9 +62,6 @@ %h3 %span.ico.activities = link_to "Activities" , "#activities", :id => "activities" - %strong.right - = link_to dashboard_activities_path do - Visit activities page → %hr .row diff --git a/app/views/layouts/_app_menu.html.haml b/app/views/layouts/_app_menu.html.haml index b96bdacc..b9249b52 100644 --- a/app/views/layouts/_app_menu.html.haml +++ b/app/views/layouts/_app_menu.html.haml @@ -1,7 +1,6 @@ %nav.main_menu = render "layouts/const_menu_links" = link_to "Projects", projects_path, :class => "#{"current" if current_page?(projects_path)}" - = link_to "Activities", dashboard_activities_path, :class => "#{"current" if current_page?(dashboard_activities_path)}" = link_to dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide" do Issues %span.count= current_user.assigned_issues.opened.count diff --git a/app/views/projects/index.html.haml b/app/views/projects/index.html.haml index e163851f..fee6363d 100644 --- a/app/views/projects/index.html.haml +++ b/app/views/projects/index.html.haml @@ -1,22 +1,25 @@ - if @projects.any? .row - .span4 + .span11 + = render @events + .span5.right %div.leftbar.ui-box %h5 Projects + %small + (#{@projects.count}) - if current_user.can_create_project? %span.right = link_to new_project_path, :class => "btn very_small info" do New Project .content_list - @projects.each do |project| - = link_to project_path(project), :remote => true, :class => dom_class(project) do + = link_to project_path(project), :class => dom_class(project) do %h4 %span.ico.project - = truncate(project.name, :length => 22) - .span12.right - .show_holder.ui-box.padded - .loading + = truncate(project.name, :length => 25) + %span.right + → - else %h3 Nothing here @@ -31,20 +34,3 @@ New Project ยป - else If you will be added to project - it will be displayed here - - -:javascript - $(function(){ - $("a.project").live("ajax:before", function() { - $(".show_holder").html("
"); - $('a.project').removeClass("active"); - $(this).addClass("active"); - }); - $('a.project:first-child').trigger("click"); - }); - -- if @projects.count == @limit - :javascript - $(function(){ - Pager.init(#{@limit}); - }); diff --git a/app/views/projects/show.js.haml b/app/views/projects/show.js.haml deleted file mode 100644 index 132ebebf..00000000 --- a/app/views/projects/show.js.haml +++ /dev/null @@ -1,7 +0,0 @@ -- if @project.repo_exists? && @project.has_commits? - :plain - $(".show_holder").html("#{escape_javascript(render(:partial => 'projects/show'))}"); -- else - :plain - $(".show_holder").html("#{escape_javascript(render(:template => 'projects/empty'))}"); - diff --git a/spec/requests/dashboard_spec.rb b/spec/requests/dashboard_spec.rb index 1ca256f9..cfdbb8d4 100644 --- a/spec/requests/dashboard_spec.rb +++ b/spec/requests/dashboard_spec.rb @@ -23,18 +23,4 @@ describe "Dashboard" do page.should have_content(@project.name) end end - - describe "GET /dashboard/activities" do - before do - visit dashboard_activities_path - end - - it "should be on dashboard page" do - current_path.should == dashboard_activities_path - end - - it "should have projects panel" do - page.should have_content(@project.name) - end - end end