Commit 0955863489ee449389ec08afb498803bc6fbb59e
Exists in
master
and in
4 other branches
Merge branch 'master' of dev.gitlabhq.com:gitlabhq into feature/issues_search
Showing
32 changed files
with
262 additions
and
179 deletions
Show diff stats
README.rdoc
| @@ -28,24 +28,33 @@ sqlite as default db | @@ -28,24 +28,33 @@ sqlite as default db | ||
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | git clone git://github.com/gitlabhq/gitlabhq.git | 30 | git clone git://github.com/gitlabhq/gitlabhq.git |
| 31 | + | ||
| 31 | cd gitlabhq/ | 32 | cd gitlabhq/ |
| 32 | 33 | ||
| 33 | # install this library first | 34 | # install this library first |
| 34 | sudo easy_install pygments | 35 | sudo easy_install pygments |
| 36 | + | ||
| 37 | + # give your user access to remove git repo | ||
| 38 | + # Ex. | ||
| 39 | + # If you are going to use user 'gitlabhq' for rails server | ||
| 40 | + # gitlabhq ALL = (git) NOPASSWD: /bin/rm" | sudo tee -a /etc/sudoers | ||
| 41 | + # | ||
| 42 | + echo "USERNAME ALL = (git) NOPASSWD: /bin/rm" | sudo tee -a /etc/sudoers | ||
| 35 | 43 | ||
| 36 | sudo gem install bundler | 44 | sudo gem install bundler |
| 45 | + | ||
| 37 | bundle | 46 | bundle |
| 38 | 47 | ||
| 39 | - RAILS_ENV=production rake db:setup | 48 | + bundle exec rake db:setup RAILS_ENV=production |
| 40 | 49 | ||
| 41 | # create admin user | 50 | # create admin user |
| 42 | # login....admin@local.host | 51 | # login....admin@local.host |
| 43 | # pass.....5iveL!fe | 52 | # pass.....5iveL!fe |
| 44 | - RAILS_ENV=production rake db:seed_fu | 53 | + bundle exec rake db:seed_fu RAILS_ENV=production |
| 45 | 54 | ||
| 46 | Install gitosis, edit conf/gitosis.yml & start server | 55 | Install gitosis, edit conf/gitosis.yml & start server |
| 47 | 56 | ||
| 48 | - rails s | 57 | + rails s -e production |
| 49 | 58 | ||
| 50 | == Install Gitosis | 59 | == Install Gitosis |
| 51 | sudo aptitude install gitosis | 60 | sudo aptitude install gitosis |
| @@ -63,6 +72,7 @@ Install gitosis, edit conf/gitosis.yml & start server | @@ -63,6 +72,7 @@ Install gitosis, edit conf/gitosis.yml & start server | ||
| 63 | ssh-keygen -t rsa | 72 | ssh-keygen -t rsa |
| 64 | 73 | ||
| 65 | sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub | 74 | sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub |
| 75 | + | ||
| 66 | sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update | 76 | sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update |
| 67 | 77 | ||
| 68 | 78 | ||
| @@ -83,3 +93,8 @@ Install gitosis, edit conf/gitosis.yml & start server | @@ -83,3 +93,8 @@ Install gitosis, edit conf/gitosis.yml & start server | ||
| 83 | 93 | ||
| 84 | 94 | ||
| 85 | echo "gem: --no-rdoc --no-ri" > ~/.gemrc | 95 | echo "gem: --no-rdoc --no-ri" > ~/.gemrc |
| 96 | + | ||
| 97 | +== Contribute | ||
| 98 | + | ||
| 99 | +We develop project on our private server. | ||
| 100 | +Want to help? Contact us on twitter or email to become a team member. |
app/assets/stylesheets/projects.css.scss
| @@ -638,3 +638,46 @@ tbody tr:nth-child(2n) td, tbody tr.even td { | @@ -638,3 +638,46 @@ tbody tr:nth-child(2n) td, tbody tr.even td { | ||
| 638 | display:none; | 638 | display:none; |
| 639 | } | 639 | } |
| 640 | } | 640 | } |
| 641 | + | ||
| 642 | +.field_with_errors { | ||
| 643 | + input[type="text"], | ||
| 644 | + input[type="password"], | ||
| 645 | + textarea | ||
| 646 | + { | ||
| 647 | + background: none repeat scroll 0 0 #FFBBBB | ||
| 648 | + } | ||
| 649 | +} | ||
| 650 | + | ||
| 651 | +.tag { | ||
| 652 | + @include round-borders-all(4px); | ||
| 653 | + padding:2px 4px; | ||
| 654 | + border:none; | ||
| 655 | + | ||
| 656 | + &.high { | ||
| 657 | + background: #D12F19; | ||
| 658 | + color:white; | ||
| 659 | + } | ||
| 660 | + | ||
| 661 | + &.today { | ||
| 662 | + background: #44aa22; | ||
| 663 | + color:white; | ||
| 664 | + } | ||
| 665 | + | ||
| 666 | + &.yours { | ||
| 667 | + background: #4466cc; | ||
| 668 | + color:white; | ||
| 669 | + } | ||
| 670 | + &.notes { | ||
| 671 | + background: #2c5c66; | ||
| 672 | + color:white; | ||
| 673 | + } | ||
| 674 | +} | ||
| 675 | + | ||
| 676 | +#issues-table .issue { | ||
| 677 | + &.critical { | ||
| 678 | + td { | ||
| 679 | + //background: #D12F19; | ||
| 680 | + //color:#fff; | ||
| 681 | + } | ||
| 682 | + } | ||
| 683 | +} |
app/controllers/issues_controller.rb
| @@ -12,7 +12,7 @@ class IssuesController < ApplicationController | @@ -12,7 +12,7 @@ class IssuesController < ApplicationController | ||
| 12 | 12 | ||
| 13 | def index | 13 | def index |
| 14 | @issues = case params[:f].to_i | 14 | @issues = case params[:f].to_i |
| 15 | - when 1 then @project.issues.all | 15 | + when 1 then @project.issues |
| 16 | when 2 then @project.issues.closed | 16 | when 2 then @project.issues.closed |
| 17 | when 3 then @project.issues.opened.assigned(current_user) | 17 | when 3 then @project.issues.opened.assigned(current_user) |
| 18 | else @project.issues.opened | 18 | else @project.issues.opened |
app/controllers/team_members_controller.rb
| @@ -8,35 +8,16 @@ class TeamMembersController < ApplicationController | @@ -8,35 +8,16 @@ class TeamMembersController < ApplicationController | ||
| 8 | 8 | ||
| 9 | def show | 9 | def show |
| 10 | @team_member = project.users_projects.find(params[:id]) | 10 | @team_member = project.users_projects.find(params[:id]) |
| 11 | - | ||
| 12 | - respond_to do |format| | ||
| 13 | - format.html # show.html.erb | ||
| 14 | - format.js | ||
| 15 | - end | ||
| 16 | end | 11 | end |
| 17 | 12 | ||
| 18 | def new | 13 | def new |
| 19 | @team_member = project.users_projects.new | 14 | @team_member = project.users_projects.new |
| 20 | - | ||
| 21 | - respond_to do |format| | ||
| 22 | - format.html # new.html.erb | ||
| 23 | - format.js | ||
| 24 | - end | ||
| 25 | end | 15 | end |
| 26 | 16 | ||
| 27 | def create | 17 | def create |
| 28 | @team_member = UsersProject.new(params[:team_member]) | 18 | @team_member = UsersProject.new(params[:team_member]) |
| 29 | @team_member.project = project | 19 | @team_member.project = project |
| 30 | - | ||
| 31 | - respond_to do |format| | ||
| 32 | - if @team_member.save | ||
| 33 | - format.html { redirect_to @team_member, notice: 'Team member was successfully created.' } | ||
| 34 | - format.js | ||
| 35 | - else | ||
| 36 | - format.html { render action: "new" } | ||
| 37 | - format.js | ||
| 38 | - end | ||
| 39 | - end | 20 | + @team_member.save |
| 40 | end | 21 | end |
| 41 | 22 | ||
| 42 | def update | 23 | def update |
| @@ -45,7 +26,12 @@ class TeamMembersController < ApplicationController | @@ -45,7 +26,12 @@ class TeamMembersController < ApplicationController | ||
| 45 | 26 | ||
| 46 | respond_to do |format| | 27 | respond_to do |format| |
| 47 | format.js | 28 | format.js |
| 48 | - format.html { redirect_to team_project_path(@project)} | 29 | + format.html do |
| 30 | + unless @team_member.valid? | ||
| 31 | + flash[:alert] = "User should have at least one role" | ||
| 32 | + end | ||
| 33 | + redirect_to team_project_path(@project) | ||
| 34 | + end | ||
| 49 | end | 35 | end |
| 50 | end | 36 | end |
| 51 | 37 |
app/helpers/commits_helper.rb
| @@ -21,13 +21,4 @@ module CommitsHelper | @@ -21,13 +21,4 @@ module CommitsHelper | ||
| 21 | link_to "More", project_commits_path(@project, :offset => offset.to_i + limit.to_i, :limit => limit), | 21 | link_to "More", project_commits_path(@project, :offset => offset.to_i + limit.to_i, :limit => limit), |
| 22 | :remote => true, :class => "lite_button vm", :style => "text-align:center; width:930px; ", :id => "more-commits-link" | 22 | :remote => true, :class => "lite_button vm", :style => "text-align:center; width:930px; ", :id => "more-commits-link" |
| 23 | end | 23 | end |
| 24 | - | ||
| 25 | - # Cause some errors with trucate & encoding use this method | ||
| 26 | - def truncate_commit_message(commit, size = 60) | ||
| 27 | - message = commit.message | ||
| 28 | - message.length > size ? (message[0..(size - 1)] + "...") : message | ||
| 29 | - # if special characters occurs | ||
| 30 | - rescue | ||
| 31 | - commit.message | ||
| 32 | - end | ||
| 33 | end | 24 | end |
app/models/issue.rb
| @@ -18,11 +18,22 @@ class Issue < ActiveRecord::Base | @@ -18,11 +18,22 @@ class Issue < ActiveRecord::Base | ||
| 18 | :presence => true, | 18 | :presence => true, |
| 19 | :length => { :within => 0..2000 } | 19 | :length => { :within => 0..2000 } |
| 20 | 20 | ||
| 21 | + scope :critical, where(:critical => true) | ||
| 22 | + scope :non_critical, where(:critical => false) | ||
| 23 | + | ||
| 21 | scope :opened, where(:closed => false) | 24 | scope :opened, where(:closed => false) |
| 22 | scope :closed, where(:closed => true) | 25 | scope :closed, where(:closed => true) |
| 23 | scope :assigned, lambda { |u| where(:assignee_id => u.id)} | 26 | scope :assigned, lambda { |u| where(:assignee_id => u.id)} |
| 24 | 27 | ||
| 25 | acts_as_list | 28 | acts_as_list |
| 29 | + | ||
| 30 | + def today? | ||
| 31 | + Date.today == created_at.to_date | ||
| 32 | + end | ||
| 33 | + | ||
| 34 | + def new? | ||
| 35 | + today? && created_at == updated_at | ||
| 36 | + end | ||
| 26 | end | 37 | end |
| 27 | # == Schema Information | 38 | # == Schema Information |
| 28 | # | 39 | # |
app/models/project.rb
| @@ -35,7 +35,8 @@ class Project < ActiveRecord::Base | @@ -35,7 +35,8 @@ class Project < ActiveRecord::Base | ||
| 35 | :presence => true | 35 | :presence => true |
| 36 | 36 | ||
| 37 | validate :check_limit | 37 | validate :check_limit |
| 38 | - | 38 | + validate :repo_name |
| 39 | + | ||
| 39 | after_destroy :destroy_gitosis_project | 40 | after_destroy :destroy_gitosis_project |
| 40 | after_save :update_gitosis_project | 41 | after_save :update_gitosis_project |
| 41 | 42 | ||
| @@ -168,6 +169,12 @@ class Project < ActiveRecord::Base | @@ -168,6 +169,12 @@ class Project < ActiveRecord::Base | ||
| 168 | errors[:base] << ("Cant check your ability to create project") | 169 | errors[:base] << ("Cant check your ability to create project") |
| 169 | end | 170 | end |
| 170 | 171 | ||
| 172 | + def repo_name | ||
| 173 | + if path == "gitosis-admin" | ||
| 174 | + errors.add(:path, " like 'gitosis-admin' is not allowed") | ||
| 175 | + end | ||
| 176 | + end | ||
| 177 | + | ||
| 171 | def valid_repo? | 178 | def valid_repo? |
| 172 | repo | 179 | repo |
| 173 | rescue | 180 | rescue |
app/models/users_project.rb
| @@ -9,7 +9,8 @@ class UsersProject < ActiveRecord::Base | @@ -9,7 +9,8 @@ class UsersProject < ActiveRecord::Base | ||
| 9 | validates_uniqueness_of :user_id, :scope => [:project_id] | 9 | validates_uniqueness_of :user_id, :scope => [:project_id] |
| 10 | validates_presence_of :user_id | 10 | validates_presence_of :user_id |
| 11 | validates_presence_of :project_id | 11 | validates_presence_of :project_id |
| 12 | - | 12 | + validate :user_has_a_role_selected |
| 13 | + | ||
| 13 | delegate :name, :email, :to => :user, :prefix => true | 14 | delegate :name, :email, :to => :user, :prefix => true |
| 14 | 15 | ||
| 15 | def update_gitosis_project | 16 | def update_gitosis_project |
| @@ -18,6 +19,10 @@ class UsersProject < ActiveRecord::Base | @@ -18,6 +19,10 @@ class UsersProject < ActiveRecord::Base | ||
| 18 | end | 19 | end |
| 19 | end | 20 | end |
| 20 | 21 | ||
| 22 | + def user_has_a_role_selected | ||
| 23 | + errors.add(:base, "Please choose at least one Role in the Access list") unless read || write || admin | ||
| 24 | + end | ||
| 25 | + | ||
| 21 | end | 26 | end |
| 22 | # == Schema Information | 27 | # == Schema Information |
| 23 | # | 28 | # |
app/views/commits/_commits.html.haml
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | = image_tag "no_avatar.png", :class => "left", :width => 40, :style => "padding-right:5px;" | 11 | = image_tag "no_avatar.png", :class => "left", :width => 40, :style => "padding-right:5px;" |
| 12 | %p | 12 | %p |
| 13 | %strong | 13 | %strong |
| 14 | - = truncate_commit_message(commit) | 14 | + = truncate(commit.safe_message, :length => 60) |
| 15 | = link_to "Browse Code", tree_project_path(@project, :commit_id => commit.id), :class => "lite_button", :style => "float:right" | 15 | = link_to "Browse Code", tree_project_path(@project, :commit_id => commit.id), :class => "lite_button", :style => "float:right" |
| 16 | = link_to truncate(commit.id.to_s, :length => 16), project_commit_path(@project, :id => commit.id), :class => "lite_button", :style => "width:120px;float:right" | 16 | = link_to truncate(commit.id.to_s, :length => 16), project_commit_path(@project, :id => commit.id), :class => "lite_button", :style => "width:120px;float:right" |
| 17 | %span | 17 | %span |
app/views/commits/_diff.html.haml
| 1 | -.file_stats | ||
| 2 | - - @commit.diffs.each do |diff| | ||
| 3 | - - if diff.deleted_file | ||
| 4 | - %span.removed_file | ||
| 5 | - %a{:href => "##{diff.a_path}"} | ||
| 6 | - = diff.a_path | ||
| 7 | - = image_tag "blueprint_delete.png" | ||
| 8 | - - elsif diff.renamed_file | ||
| 9 | - %span.moved_file | ||
| 10 | - %a{:href => "##{diff.b_path}"} | ||
| 11 | - = diff.a_path | ||
| 12 | - = "->" | ||
| 13 | - = diff.b_path | ||
| 14 | - = image_tag "blueprint_notice.png" | ||
| 15 | - - elsif diff.new_file | ||
| 16 | - %span.new_file | ||
| 17 | - %a{:href => "##{diff.b_path}"} | ||
| 18 | - = diff.b_path | ||
| 19 | - = image_tag "blueprint_add.png" | ||
| 20 | - - else | ||
| 21 | - %span.edit_file | ||
| 22 | - %a{:href => "##{diff.b_path}"} | ||
| 23 | - = diff.b_path | ||
| 24 | - = image_tag "blueprint_info.png" | 1 | +.file_stats= render "commits/diff_head" |
| 2 | + | ||
| 25 | - @commit.diffs.each do |diff| | 3 | - @commit.diffs.each do |diff| |
| 26 | - next if diff.diff.empty? | 4 | - next if diff.diff.empty? |
| 27 | - file = (@commit.tree / diff.b_path) | 5 | - file = (@commit.tree / diff.b_path) |
| @@ -31,24 +9,12 @@ | @@ -31,24 +9,12 @@ | ||
| 31 | - if diff.deleted_file | 9 | - if diff.deleted_file |
| 32 | %strong{:id => "#{diff.b_path}"}= diff.a_path | 10 | %strong{:id => "#{diff.b_path}"}= diff.a_path |
| 33 | - else | 11 | - else |
| 34 | - %strong{:id => "#{diff.b_path}"}= diff.b_path | 12 | + = link_to tree_file_project_path(@project, @commit.id, diff.b_path) do |
| 13 | + %strong{:id => "#{diff.b_path}"}= diff.b_path | ||
| 35 | %br/ | 14 | %br/ |
| 36 | .diff_file_content | 15 | .diff_file_content |
| 37 | - if file.text? | 16 | - if file.text? |
| 38 | - - lines_arr = diff.diff.lines.to_a | ||
| 39 | - - line_old = lines_arr[2].match(/-(\d)/)[0].to_i.abs rescue 0 | ||
| 40 | - - line_new = lines_arr[2].match(/\+(\d)/)[0].to_i.abs rescue 0 | ||
| 41 | - - lines = lines_arr[3..-1].join | ||
| 42 | - - lines.each_line do |line| | ||
| 43 | - = diff_line(line, line_new, line_old) | ||
| 44 | - - if line[0] == "+" | ||
| 45 | - - line_new += 1 | ||
| 46 | - - elsif | ||
| 47 | - - line[0] == "-" | ||
| 48 | - - line_old += 1 | ||
| 49 | - - else | ||
| 50 | - - line_new += 1 | ||
| 51 | - - line_old += 1 | 17 | + = render :partial => "commits/text_file", :locals => { :diff => diff } |
| 52 | - elsif file.image? | 18 | - elsif file.image? |
| 53 | .diff_file_content_image | 19 | .diff_file_content_image |
| 54 | %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} | 20 | %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} |
| @@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
| 1 | +- @commit.diffs.each do |diff| | ||
| 2 | + - if diff.deleted_file | ||
| 3 | + %span.removed_file | ||
| 4 | + %a{:href => "##{diff.a_path}"} | ||
| 5 | + = diff.a_path | ||
| 6 | + = image_tag "blueprint_delete.png" | ||
| 7 | + - elsif diff.renamed_file | ||
| 8 | + %span.moved_file | ||
| 9 | + %a{:href => "##{diff.b_path}"} | ||
| 10 | + = diff.a_path | ||
| 11 | + = "->" | ||
| 12 | + = diff.b_path | ||
| 13 | + = image_tag "blueprint_notice.png" | ||
| 14 | + - elsif diff.new_file | ||
| 15 | + %span.new_file | ||
| 16 | + %a{:href => "##{diff.b_path}"} | ||
| 17 | + = diff.b_path | ||
| 18 | + = image_tag "blueprint_add.png" | ||
| 19 | + - else | ||
| 20 | + %span.edit_file | ||
| 21 | + %a{:href => "##{diff.b_path}"} | ||
| 22 | + = diff.b_path | ||
| 23 | + = image_tag "blueprint_info.png" | ||
| 24 | + |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | +- line_old = 0 | ||
| 2 | +- line_new = 0 | ||
| 3 | +- lines_arr = diff.diff.lines.to_a | ||
| 4 | +- lines_arr.each do |line| | ||
| 5 | + - next if line.match(/^--- a/) | ||
| 6 | + - next if line.match(/^\+\+\+ b/) | ||
| 7 | + - if line.match(/^@@ -/) | ||
| 8 | + - line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0 | ||
| 9 | + - line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0 | ||
| 10 | + - next | ||
| 11 | + | ||
| 12 | + = diff_line(line, line_new, line_old) | ||
| 13 | + - if line[0] == "+" | ||
| 14 | + - line_new += 1 | ||
| 15 | + - elsif | ||
| 16 | + - line[0] == "-" | ||
| 17 | + - line_old += 1 | ||
| 18 | + - else | ||
| 19 | + - line_new += 1 | ||
| 20 | + - line_old += 1 | ||
| 21 | + |
app/views/commits/show.html.haml
| 1 | %h3 | 1 | %h3 |
| 2 | - = "[ #{@commit.committer} ] #{truncate_commit_message(@commit, 80)}" | 2 | + = "[ #{@commit.committer} ] #{truncate(@commit.safe_message)}" |
| 3 | -#= link_to 'Back', project_commits_path(@project), :class => "button" | 3 | -#= link_to 'Back', project_commits_path(@project), :class => "button" |
| 4 | %table.round-borders | 4 | %table.round-borders |
| 5 | %tr | 5 | %tr |
| @@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
| 16 | %td= @commit.committed_date | 16 | %td= @commit.committed_date |
| 17 | %tr | 17 | %tr |
| 18 | %td Message | 18 | %td Message |
| 19 | - %td= @commit.message | 19 | + %td= @commit.safe_message |
| 20 | %tr | 20 | %tr |
| 21 | %td Tree | 21 | %td Tree |
| 22 | %td= link_to 'Browse Code', tree_project_path(@project, :commit_id => @commit.id) | 22 | %td= link_to 'Browse Code', tree_project_path(@project, :commit_id => @commit.id) |
app/views/issues/_form.html.haml
| @@ -5,17 +5,21 @@ | @@ -5,17 +5,21 @@ | ||
| 5 | - @issue.errors.full_messages.each do |msg| | 5 | - @issue.errors.full_messages.each do |msg| |
| 6 | %li= msg | 6 | %li= msg |
| 7 | 7 | ||
| 8 | - .span-6 | 8 | + .span-8 |
| 9 | = f.label :title | 9 | = f.label :title |
| 10 | = f.text_field :title, :style => "width:450px" | 10 | = f.text_field :title, :style => "width:450px" |
| 11 | - .span-6 | 11 | + .span-8 |
| 12 | = f.label :content | 12 | = f.label :content |
| 13 | = f.text_area :content, :style => "width:450px; height:130px" | 13 | = f.text_area :content, :style => "width:450px; height:130px" |
| 14 | - .span-6.append-bottom | 14 | + .span-8.append-bottom |
| 15 | = f.label :assignee_id | 15 | = f.label :assignee_id |
| 16 | = f.select(:assignee_id, @project.users.all.collect {|p| [ p.name, p.id ] }, { :include_blank => "Select user" }) | 16 | = f.select(:assignee_id, @project.users.all.collect {|p| [ p.name, p.id ] }, { :include_blank => "Select user" }) |
| 17 | + .span-1 | ||
| 18 | + = f.label :critical, "Critical" | ||
| 19 | + %br | ||
| 20 | + = f.check_box :critical | ||
| 17 | - unless @issue.new_record? | 21 | - unless @issue.new_record? |
| 18 | - .span-3.right | 22 | + .span-2.right |
| 19 | = f.label :closed | 23 | = f.label :closed |
| 20 | %br | 24 | %br |
| 21 | = f.check_box :closed | 25 | = f.check_box :closed |
app/views/issues/_issues.html.haml
| 1 | %table.round-borders#issues-table | 1 | %table.round-borders#issues-table |
| 2 | %tr | 2 | %tr |
| 3 | + - if can?(current_user, :admin_issue, @project) && !params[:f] || params[:f] == "0" | ||
| 4 | + %th | ||
| 3 | %th Assignee | 5 | %th Assignee |
| 4 | %th ID | 6 | %th ID |
| 5 | %th Title | 7 | %th Title |
| 6 | %th Closed? | 8 | %th Closed? |
| 7 | %th | 9 | %th |
| 8 | 10 | ||
| 9 | - - @issues.each do |issue| | 11 | + - @issues.critical.each do |issue| |
| 12 | + = render(:partial => 'show', :locals => {:issue => issue}) | ||
| 13 | + | ||
| 14 | + - @issues.non_critical.each do |issue| | ||
| 10 | = render(:partial => 'show', :locals => {:issue => issue}) | 15 | = render(:partial => 'show', :locals => {:issue => issue}) |
app/views/issues/_show.html.haml
| 1 | -%tr{ :id => dom_id(issue), :class => "issue", :url => project_issue_path(@project, issue) } | 1 | +%tr{ :id => dom_id(issue), :class => "issue #{issue.critical ? "critical" : ""}", :url => project_issue_path(@project, issue) } |
| 2 | + - if can?(current_user, :admin_issue, @project) && !params[:f] || params[:f] == "0" | ||
| 3 | + %td | ||
| 4 | + = image_tag "move.png" , :class => [:handle, :left] | ||
| 2 | %td | 5 | %td |
| 3 | - = image_tag "move.png" , :class => [:handle, :left] | ||
| 4 | = image_tag gravatar_icon(issue.assignee.email), :class => "left", :width => 40, :style => "padding:0 5px;" | 6 | = image_tag gravatar_icon(issue.assignee.email), :class => "left", :width => 40, :style => "padding:0 5px;" |
| 5 | = truncate issue.assignee.name, :lenght => 20 | 7 | = truncate issue.assignee.name, :lenght => 20 |
| 6 | %td ##{issue.id} | 8 | %td ##{issue.id} |
| 7 | - %td= html_escape issue.title | 9 | + %td |
| 10 | + = html_escape issue.title | ||
| 11 | + %br | ||
| 12 | + - if issue.critical | ||
| 13 | + %span.tag.high critical | ||
| 14 | + - if issue.today? | ||
| 15 | + %span.tag.today today | ||
| 16 | + -#- if issue.author == current_user | ||
| 17 | + -#%span.tag.yours yours | ||
| 18 | + -#- if issue.notes.count > 0 | ||
| 19 | + -#%span.tag.notes | ||
| 20 | + -#= issue.notes.count | ||
| 21 | + -#notes | ||
| 8 | %td | 22 | %td |
| 9 | - if can? current_user, :write_issue, @project | 23 | - if can? current_user, :write_issue, @project |
| 10 | = form_for([@project, issue], :remote => true) do |f| | 24 | = form_for([@project, issue], :remote => true) do |f| |
app/views/projects/_recent_commits.html.haml
| @@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
| 6 | = image_tag "no_avatar.png", :class => "left", :width => 40, :style => "padding-right:5px;" | 6 | = image_tag "no_avatar.png", :class => "left", :width => 40, :style => "padding-right:5px;" |
| 7 | %p{:style => "margin-bottom: 3px;"} | 7 | %p{:style => "margin-bottom: 3px;"} |
| 8 | %strong | 8 | %strong |
| 9 | - = link_to truncate_commit_message(commit, 60), project_commit_path(@project, :id => commit.id) | 9 | + = link_to truncate(commit.safe_message, :length => 60), project_commit_path(@project, :id => commit.id) |
| 10 | 10 | ||
| 11 | %span | 11 | %span |
| 12 | %span.author | 12 | %span.author |
app/views/projects/_recent_messages.html.haml
| @@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
| 19 | - css_class = "dash_commit" | 19 | - css_class = "dash_commit" |
| 20 | - commit = parent | 20 | - commit = parent |
| 21 | - item_code = commit.author.email | 21 | - item_code = commit.author.email |
| 22 | - - link_item_name = truncate_commit_message(commit, 50) | 22 | + - link_item_name = truncate(commit.safe_message, :length => 50) |
| 23 | - link_to_item = project_commit_path(@project, :id => commit.id) | 23 | - link_to_item = project_commit_path(@project, :id => commit.id) |
| 24 | - else | 24 | - else |
| 25 | - css_class = "dash_wall" | 25 | - css_class = "dash_wall" |
app/views/projects/_tree.html.haml
| @@ -30,15 +30,15 @@ | @@ -30,15 +30,15 @@ | ||
| 30 | %th Last Update | 30 | %th Last Update |
| 31 | %th | 31 | %th |
| 32 | Last commit | 32 | Last commit |
| 33 | - = link_to "history", project_commits_path(@project, :path => params[:path]), :class => "right" | 33 | + = link_to "history", project_commits_path(@project, :path => params[:path], :branch => params[:branch],:tag => params[:tag]), :class => "right" |
| 34 | - if params[:path] | 34 | - if params[:path] |
| 35 | - file = File.join(params[:path], "..") | 35 | - file = File.join(params[:path], "..") |
| 36 | %tr{ :class => "tree-item", :url => tree_file_project_path(@project, @commit.id, file) } | 36 | %tr{ :class => "tree-item", :url => tree_file_project_path(@project, @commit.id, file) } |
| 37 | %td.tree-item-file-name | 37 | %td.tree-item-file-name |
| 38 | = image_tag "dir.png" | 38 | = image_tag "dir.png" |
| 39 | = link_to "..", tree_file_project_path(@project, @commit.id, file, :branch => @branch, :tag => @tag), :remote => :true | 39 | = link_to "..", tree_file_project_path(@project, @commit.id, file, :branch => @branch, :tag => @tag), :remote => :true |
| 40 | - %td | ||
| 41 | - %td | 40 | + %td |
| 41 | + %td | ||
| 42 | 42 | ||
| 43 | - contents.select{ |i| i.is_a?(Grit::Tree)}.each do |content| | 43 | - contents.select{ |i| i.is_a?(Grit::Tree)}.each do |content| |
| 44 | = render :partial => "projects/tree_item", :locals => { :content => content } | 44 | = render :partial => "projects/tree_item", :locals => { :content => content } |
| @@ -52,7 +52,7 @@ | @@ -52,7 +52,7 @@ | ||
| 52 | }); | 52 | }); |
| 53 | 53 | ||
| 54 | - if params[:path] && request.xhr? | 54 | - if params[:path] && request.xhr? |
| 55 | - :javascript | 55 | + :javascript |
| 56 | $(window).unbind('popstate'); | 56 | $(window).unbind('popstate'); |
| 57 | $(window).bind('popstate', function() { | 57 | $(window).bind('popstate', function() { |
| 58 | if(location.pathname.search("tree") != -1) { | 58 | if(location.pathname.search("tree") != -1) { |
app/views/projects/_tree_file.html.haml
| @@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
| 4 | %strong | 4 | %strong |
| 5 | = name | 5 | = name |
| 6 | = link_to "raw", blob_project_path(@project, :commit_id => @commit.id, :path => params[:path] ), :class => "right", :target => "_blank" | 6 | = link_to "raw", blob_project_path(@project, :commit_id => @commit.id, :path => params[:path] ), :class => "right", :target => "_blank" |
| 7 | - = link_to "history", project_commits_path(@project, :path => params[:path]), :class => "right", :style => "margin-right:10px;" | 7 | + = link_to "history", project_commits_path(@project, :path => params[:path], :branch => params[:branch], :tag => params[:tag] ), :class => "right", :style => "margin-right:10px;" |
| 8 | %br/ | 8 | %br/ |
| 9 | - if file.text? | 9 | - if file.text? |
| 10 | .view_file_content | 10 | .view_file_content |
| @@ -14,6 +14,6 @@ | @@ -14,6 +14,6 @@ | ||
| 14 | .view_file_content_image | 14 | .view_file_content_image |
| 15 | %img{ :src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} | 15 | %img{ :src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} |
| 16 | - else | 16 | - else |
| 17 | - %p | 17 | + %p |
| 18 | %center No preview for this file type | 18 | %center No preview for this file type |
| 19 | 19 |
app/views/projects/_tree_item.html.haml
| @@ -12,4 +12,4 @@ | @@ -12,4 +12,4 @@ | ||
| 12 | = time_ago_in_words(content_commit.committed_date) | 12 | = time_ago_in_words(content_commit.committed_date) |
| 13 | ago | 13 | ago |
| 14 | %td | 14 | %td |
| 15 | - = link_to truncate_commit_message(content_commit, 40), project_commit_path(@project, content_commit) | 15 | + = link_to truncate(content_commit.safe_message, :length => 40), project_commit_path(@project, content_commit) |
config/initializers/grit_ext.rb
db/fixtures/development/001_admin.rb
| 1 | -# Admin account | ||
| 2 | admin = User.create( | 1 | admin = User.create( |
| 3 | :email => "admin@local.host", | 2 | :email => "admin@local.host", |
| 4 | :name => "Administrator", | 3 | :name => "Administrator", |
| @@ -9,3 +8,12 @@ admin = User.create( | @@ -9,3 +8,12 @@ admin = User.create( | ||
| 9 | admin.projects_limit = 10000 | 8 | admin.projects_limit = 10000 |
| 10 | admin.admin = true | 9 | admin.admin = true |
| 11 | admin.save! | 10 | admin.save! |
| 11 | + | ||
| 12 | +if admin.valid? | ||
| 13 | +puts %q[ | ||
| 14 | +Administrator account created: | ||
| 15 | + | ||
| 16 | +login.........admin@local.host | ||
| 17 | +password......5iveL!fe | ||
| 18 | +] | ||
| 19 | +end |
db/fixtures/production/001_admin.rb
| @@ -8,3 +8,12 @@ admin = User.create( | @@ -8,3 +8,12 @@ admin = User.create( | ||
| 8 | admin.projects_limit = 10000 | 8 | admin.projects_limit = 10000 |
| 9 | admin.admin = true | 9 | admin.admin = true |
| 10 | admin.save! | 10 | admin.save! |
| 11 | + | ||
| 12 | +if admin.valid? | ||
| 13 | +puts %q[ | ||
| 14 | +Administrator account created: | ||
| 15 | + | ||
| 16 | +login.........admin@local.host | ||
| 17 | +password......5iveL!fe | ||
| 18 | +] | ||
| 19 | +end |
db/schema.rb
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | # | 11 | # |
| 12 | # It's strongly recommended to check this file into your version control system. | 12 | # It's strongly recommended to check this file into your version control system. |
| 13 | 13 | ||
| 14 | -ActiveRecord::Schema.define(:version => 20111021101550) do | 14 | +ActiveRecord::Schema.define(:version => 20111025134235) do |
| 15 | 15 | ||
| 16 | create_table "issues", :force => true do |t| | 16 | create_table "issues", :force => true do |t| |
| 17 | t.string "title" | 17 | t.string "title" |
| @@ -23,6 +23,7 @@ ActiveRecord::Schema.define(:version => 20111021101550) do | @@ -23,6 +23,7 @@ ActiveRecord::Schema.define(:version => 20111021101550) do | ||
| 23 | t.datetime "updated_at" | 23 | t.datetime "updated_at" |
| 24 | t.boolean "closed", :default => false, :null => false | 24 | t.boolean "closed", :default => false, :null => false |
| 25 | t.integer "position", :default => 0 | 25 | t.integer "position", :default => 0 |
| 26 | + t.boolean "critical", :default => false, :null => false | ||
| 26 | end | 27 | end |
| 27 | 28 | ||
| 28 | create_table "keys", :force => true do |t| | 29 | create_table "keys", :force => true do |t| |
install.rb
| @@ -1,32 +0,0 @@ | @@ -1,32 +0,0 @@ | ||
| 1 | -root_path = File.expand_path(File.dirname(__FILE__)) | ||
| 2 | -require File.join(root_path, "lib", "color") | ||
| 3 | -include Color | ||
| 4 | - | ||
| 5 | -# | ||
| 6 | -# ruby ./update.rb development # or test or production (default) | ||
| 7 | -# | ||
| 8 | -envs = ["production", "test", "development"] | ||
| 9 | -env = if envs.include?(ARGV[0]) | ||
| 10 | - ARGV[0] | ||
| 11 | - else | ||
| 12 | - "production" | ||
| 13 | - end | ||
| 14 | - | ||
| 15 | -puts green " == Install for ENV=#{env} ..." | ||
| 16 | - | ||
| 17 | -# bundle install | ||
| 18 | -`bundle install` | ||
| 19 | - | ||
| 20 | -# migrate db | ||
| 21 | -`bundle exec rake db:create RAILS_ENV=#{env}` | ||
| 22 | -`bundle exec rake db:schema:load RAILS_ENV=#{env}` | ||
| 23 | -`bundle exec rake db:seed_fu RAILS_ENV=#{env}` | ||
| 24 | - | ||
| 25 | -puts green %q[ | ||
| 26 | -Administrator account created: | ||
| 27 | - | ||
| 28 | -login.........admin@local.host | ||
| 29 | -password......5iveL!fe | ||
| 30 | -] | ||
| 31 | - | ||
| 32 | -puts green " == Done! Now you can start server" |
lib/gitosis.rb
| @@ -42,7 +42,7 @@ class Gitosis | @@ -42,7 +42,7 @@ class Gitosis | ||
| 42 | end | 42 | end |
| 43 | 43 | ||
| 44 | def destroy_project(project) | 44 | def destroy_project(project) |
| 45 | - FileUtils.rm_rf(project.path_to_repo) | 45 | + `sudo -u git rm -rf #{project.path_to_repo}` |
| 46 | 46 | ||
| 47 | conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) | 47 | conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) |
| 48 | 48 |
spec/models/project_spec.rb
| @@ -4,11 +4,15 @@ describe Project do | @@ -4,11 +4,15 @@ describe Project do | ||
| 4 | describe "Associations" do | 4 | describe "Associations" do |
| 5 | it { should have_many(:users) } | 5 | it { should have_many(:users) } |
| 6 | it { should have_many(:users_projects) } | 6 | it { should have_many(:users_projects) } |
| 7 | + it { should have_many(:issues) } | ||
| 8 | + it { should have_many(:notes) } | ||
| 9 | + it { should have_many(:snippets) } | ||
| 7 | end | 10 | end |
| 8 | 11 | ||
| 9 | describe "Validation" do | 12 | describe "Validation" do |
| 10 | it { should validate_presence_of(:name) } | 13 | it { should validate_presence_of(:name) } |
| 11 | it { should validate_presence_of(:path) } | 14 | it { should validate_presence_of(:path) } |
| 15 | + it { should validate_presence_of(:code) } | ||
| 12 | end | 16 | end |
| 13 | 17 | ||
| 14 | describe "Respond to" do | 18 | describe "Respond to" do |
| @@ -31,6 +35,11 @@ describe Project do | @@ -31,6 +35,11 @@ describe Project do | ||
| 31 | it { should respond_to(:commit) } | 35 | it { should respond_to(:commit) } |
| 32 | end | 36 | end |
| 33 | 37 | ||
| 38 | + it "should not allow 'gitosis-admin' as repo name" do | ||
| 39 | + should allow_value("blah").for(:path) | ||
| 40 | + should_not allow_value("gitosis-admin").for(:path) | ||
| 41 | + end | ||
| 42 | + | ||
| 34 | it "should return valid url to repo" do | 43 | it "should return valid url to repo" do |
| 35 | project = Project.new(:path => "somewhere") | 44 | project = Project.new(:path => "somewhere") |
| 36 | project.url_to_repo.should == "git@localhost:somewhere.git" | 45 | project.url_to_repo.should == "git@localhost:somewhere.git" |
spec/requests/team_members_spec.rb
| @@ -10,7 +10,9 @@ describe "TeamMembers" do | @@ -10,7 +10,9 @@ describe "TeamMembers" do | ||
| 10 | describe "View profile" do | 10 | describe "View profile" do |
| 11 | it "should be available" do | 11 | it "should be available" do |
| 12 | visit(team_project_path(@project)) | 12 | visit(team_project_path(@project)) |
| 13 | - find(:xpath, "//table[@id='team-table']//a[1]").click | 13 | + within "#team-table" do |
| 14 | + click_link(@user.name) | ||
| 15 | + end | ||
| 14 | page.should have_content @user.skype | 16 | page.should have_content @user.skype |
| 15 | page.should_not have_content 'Twitter' | 17 | page.should_not have_content 'Twitter' |
| 16 | end | 18 | end |
| @@ -29,19 +31,37 @@ describe "TeamMembers" do | @@ -29,19 +31,37 @@ describe "TeamMembers" do | ||
| 29 | 31 | ||
| 30 | describe "fill in" do | 32 | describe "fill in" do |
| 31 | before do | 33 | before do |
| 32 | - check "team_member_read" | ||
| 33 | click_link "Select user" | 34 | click_link "Select user" |
| 34 | click_link @user_1.name | 35 | click_link @user_1.name |
| 35 | - #select @user_1.name, :from => "team_member_user_id" | 36 | + |
| 37 | + within "#team_member_new" do | ||
| 38 | + check "team_member_read" | ||
| 39 | + check "team_member_write" | ||
| 40 | + end | ||
| 36 | end | 41 | end |
| 37 | 42 | ||
| 38 | - it { expect { click_button "Save" }.to change {UsersProject.count}.by(1) } | 43 | + it { expect { click_button "Save";sleep(1) }.to change {UsersProject.count}.by(1) } |
| 39 | 44 | ||
| 40 | it "should add new member to table" do | 45 | it "should add new member to table" do |
| 41 | click_button "Save" | 46 | click_button "Save" |
| 47 | + @member = UsersProject.last | ||
| 42 | 48 | ||
| 43 | - page.should_not have_content("Add new member") | ||
| 44 | page.should have_content @user_1.name | 49 | page.should have_content @user_1.name |
| 50 | + | ||
| 51 | + @member.read.should be_true | ||
| 52 | + @member.write.should be_true | ||
| 53 | + @member.admin.should be_false | ||
| 54 | + end | ||
| 55 | + | ||
| 56 | + it "should not allow creation without access selected" do | ||
| 57 | + within "#team_member_new" do | ||
| 58 | + uncheck "team_member_read" | ||
| 59 | + uncheck "team_member_write" | ||
| 60 | + uncheck "team_member_admin" | ||
| 61 | + end | ||
| 62 | + | ||
| 63 | + expect { click_button "Save" }.to_not change {UsersProject.count} | ||
| 64 | + page.should have_content("Please choose at least one Role in the Access list") | ||
| 45 | end | 65 | end |
| 46 | end | 66 | end |
| 47 | end | 67 | end |
update.rb
| @@ -1,44 +0,0 @@ | @@ -1,44 +0,0 @@ | ||
| 1 | -root_path = File.expand_path(File.dirname(__FILE__)) | ||
| 2 | -require File.join(root_path, "lib", "color") | ||
| 3 | -include Color | ||
| 4 | - | ||
| 5 | -def version | ||
| 6 | - File.read("VERSION") | ||
| 7 | -end | ||
| 8 | - | ||
| 9 | -# | ||
| 10 | -# ruby ./update.rb development # or test or production (default) | ||
| 11 | -# | ||
| 12 | -envs = ["production", "test", "development"] | ||
| 13 | -env = if envs.include?(ARGV[0]) | ||
| 14 | - ARGV[0] | ||
| 15 | - else | ||
| 16 | - "production" | ||
| 17 | - end | ||
| 18 | - | ||
| 19 | -puts yellow "== RAILS ENV | #{env}" | ||
| 20 | -current_version = version | ||
| 21 | -puts yellow "Your version is #{current_version}" | ||
| 22 | -puts yellow "Check for new version: $ git pull origin 1x" | ||
| 23 | -`git pull origin 1x` # pull from origin | ||
| 24 | - | ||
| 25 | -# latest version | ||
| 26 | -if version == current_version | ||
| 27 | - puts yellow "You have a latest version" | ||
| 28 | -else | ||
| 29 | - puts green "Update to #{version}" | ||
| 30 | - | ||
| 31 | -`bundle install` | ||
| 32 | - | ||
| 33 | - # migrate db | ||
| 34 | -if env == "development" | ||
| 35 | -`bundle exec rake db:migrate RAILS_ENV=development` | ||
| 36 | -`bundle exec rake db:migrate RAILS_ENV=test` | ||
| 37 | -else | ||
| 38 | -`bundle exec rake db:migrate RAILS_ENV=#{env}` | ||
| 39 | -end | ||
| 40 | - | ||
| 41 | - puts green "== Done! Now you can start/restart server" | ||
| 42 | -end | ||
| 43 | - | ||
| 44 | - |