Commit 0541b3f3c5dcd291d144c83d9731c75ee811b4e0

Authored by Dmitriy Zaporozhets
1 parent d3784687

1.0.1

CHANGELOG
  1 +v 1.0.1
  2 + - fixed: with invalid source code for commit
  3 + - fixed: lose branch/tag selection when use tree navigateion
  4 + - when history clicked - display path
  5 + - bug fix & code cleaning
1 6 v 1.0.0
2 7 - bug fix
3 8 - projects preview mode
... ...
Gemfile
... ... @@ -13,7 +13,7 @@ gem "carrierwave"
13 13 gem 'six'
14 14 gem 'therubyracer'
15 15 gem 'faker'
16   -gem 'seed-fu', :branch => 'rails-3-1', :git => 'git://github.com/mbleigh/seed-fu.git'
  16 +gem 'seed-fu', :git => 'git://github.com/mbleigh/seed-fu.git'
17 17 gem "inifile"
18 18 gem "albino", :git => "git://github.com/gitlabhq/albino.git"
19 19 gem "kaminari"
... ...
Gemfile.lock
... ... @@ -22,12 +22,11 @@ GIT
22 22  
23 23 GIT
24 24 remote: git://github.com/mbleigh/seed-fu.git
25   - revision: 29fe8c61ca6cc4408115ea7475fe2647081bd348
26   - branch: rails-3-1
  25 + revision: 77be06852b18fb01e272ab763ddb292da575586c
27 26 specs:
28   - seed-fu (2.0.1.rails31)
29   - activerecord (~> 3.1.0.rc4)
30   - activesupport (~> 3.1.0.rc4)
  27 + seed-fu (2.1.0)
  28 + activerecord (~> 3.1.0)
  29 + activesupport (~> 3.1.0)
31 30  
32 31 GEM
33 32 remote: http://rubygems.org/
... ...
VERSION
1   -1.0.0
  1 +1.0.1
... ...
app/controllers/application_controller.rb
... ... @@ -41,4 +41,24 @@ class ApplicationController < ActionController::Base
41 41 super
42 42 end
43 43 end
  44 +
  45 + def load_refs
  46 + @branch = unless params[:branch].blank?
  47 + params[:branch]
  48 + else
  49 + nil
  50 + end
  51 +
  52 + @tag = unless params[:tag].blank?
  53 + params[:tag]
  54 + else
  55 + nil
  56 + end
  57 +
  58 + @ref = @branch || @tag || "master"
  59 + end
  60 +
  61 + def render_404
  62 + render :file => File.join(Rails.root, "public", "404"), :layout => false, :status => "404"
  63 + end
44 64 end
... ...
app/controllers/commits_controller.rb
... ... @@ -8,25 +8,19 @@ class CommitsController < ApplicationController
8 8 before_filter :authorize_read_project!
9 9  
10 10 def index
  11 + load_refs # load @branch, @tag & @ref
  12 +
11 13 @repo = project.repo
12   - @branch = if !params[:branch].blank?
13   - params[:branch]
14   - elsif !params[:tag].blank?
15   - params[:tag]
16   - else
17   - "master"
18   - end
19 14  
20 15 if params[:path]
21   - @commits = @repo.log(@branch, params[:path], :max_count => params[:limit] || 100, :skip => params[:offset] || 0)
  16 + @commits = @repo.log(@ref, params[:path], :max_count => params[:limit] || 100, :skip => params[:offset] || 0)
22 17 else
23   - @commits = @repo.commits(@branch, params[:limit] || 100, params[:offset] || 0)
  18 + @commits = @repo.commits(@ref, params[:limit] || 100, params[:offset] || 0)
24 19 end
25 20  
26 21 respond_to do |format|
27 22 format.html # index.html.erb
28 23 format.js
29   - format.json { render json: @commits }
30 24 end
31 25 end
32 26  
... ... @@ -38,7 +32,6 @@ class CommitsController < ApplicationController
38 32 respond_to do |format|
39 33 format.html # show.html.erb
40 34 format.js
41   - format.json { render json: @commit }
42 35 end
43 36 end
44 37 end
... ...
app/controllers/keys_controller.rb
... ... @@ -3,11 +3,6 @@ class KeysController < ApplicationController
3 3  
4 4 def index
5 5 @keys = current_user.keys.all
6   -
7   - respond_to do |format|
8   - format.html # index.html.erb
9   - format.json { render json: @keys }
10   - end
11 6 end
12 7  
13 8 def new
... ... @@ -23,8 +18,6 @@ class KeysController < ApplicationController
23 18 respond_with(@key)
24 19 end
25 20  
26   - # DELETE /keys/1
27   - # DELETE /keys/1.json
28 21 def destroy
29 22 @key = current_user.keys.find(params[:id])
30 23 @key.destroy
... ... @@ -32,7 +25,6 @@ class KeysController < ApplicationController
32 25 respond_to do |format|
33 26 format.html { redirect_to keys_url }
34 27 format.js { render :nothing => true }
35   - format.json { head :ok }
36 28 end
37 29 end
38 30 end
... ...
app/controllers/projects_controller.rb
... ... @@ -8,78 +8,10 @@ class ProjectsController < ApplicationController
8 8  
9 9 def index
10 10 @projects = current_user.projects.all
11   -
12   - respond_to do |format|
13   - format.html # index.html.erb
14   - format.json { render json: @projects }
15   - end
16   - end
17   -
18   - def show
19   - @repo = project.repo
20   - @commit = @repo.commits.first
21   - @tree = @commit.tree
22   - @tree = @tree / params[:path] if params[:path]
23   -
24   - respond_to do |format|
25   - format.html # show.html.erb
26   - format.json { render json: project }
27   - end
28   - rescue Grit::NoSuchPathError => ex
29   - respond_to do |format|
30   - format.html {render "projects/empty"}
31   - end
32   - end
33   -
34   - def tree
35   - @repo = project.repo
36   - @branch = if !params[:branch].blank?
37   - params[:branch]
38   - elsif !params[:tag].blank?
39   - params[:tag]
40   - else
41   - "master"
42   - end
43   -
44   - if params[:commit_id]
45   - @commit = @repo.commits(params[:commit_id]).first
46   - else
47   - @commit = @repo.commits(@branch || "master").first
48   - end
49   - @tree = @commit.tree
50   - @tree = @tree / params[:path] if params[:path]
51   -
52   - respond_to do |format|
53   - format.html # show.html.erb
54   - format.js do
55   - # temp solution
56   - response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
57   - response.headers["Pragma"] = "no-cache"
58   - response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
59   - end
60   - format.json { render json: project }
61   - end
62   - end
63   -
64   - def blob
65   - @repo = project.repo
66   - @commit = project.commit(params[:commit_id])
67   - @tree = project.tree(@commit, params[:path])
68   -
69   - if @tree.is_a?(Grit::Blob)
70   - send_data(@tree.data, :type => @tree.mime_type, :disposition => 'inline', :filename => @tree.name)
71   - else
72   - head(404)
73   - end
74 11 end
75 12  
76 13 def new
77 14 @project = Project.new
78   -
79   - respond_to do |format|
80   - format.html # new.html.erb
81   - format.json { render json: @project }
82   - end
83 15 end
84 16  
85 17 def edit
... ... @@ -98,11 +30,9 @@ class ProjectsController < ApplicationController
98 30 if @project.valid?
99 31 format.html { redirect_to @project, notice: 'Project was successfully created.' }
100 32 format.js
101   - format.json { render json: @project, status: :created, location: @project }
102 33 else
103 34 format.html { render action: "new" }
104 35 format.js
105   - format.json { render json: @project.errors, status: :unprocessable_entity }
106 36 end
107 37 end
108 38 rescue Gitosis::AccessDenied
... ... @@ -112,7 +42,6 @@ class ProjectsController < ApplicationController
112 42 respond_to do |format|
113 43 format.html { render action: "new" }
114 44 format.js
115   - format.json { render json: @project.errors, status: :unprocessable_entity }
116 45 end
117 46 end
118 47  
... ... @@ -121,29 +50,87 @@ class ProjectsController < ApplicationController
121 50 if project.update_attributes(params[:project])
122 51 format.html { redirect_to project, notice: 'Project was successfully updated.' }
123 52 format.js
124   - format.json { head :ok }
125 53 else
126 54 format.html { render action: "edit" }
127 55 format.js
128   - format.json { render json: project.errors, status: :unprocessable_entity }
129 56 end
130 57 end
131 58 end
132 59  
133   - def destroy
134   - project.destroy
  60 + def show
  61 + @repo = project.repo
  62 + @commit = @repo.commits.first
  63 + @tree = @commit.tree
  64 + @tree = @tree / params[:path] if params[:path]
135 65  
  66 + rescue Grit::NoSuchPathError => ex
136 67 respond_to do |format|
137   - format.html { redirect_to projects_url }
138   - format.json { head :ok }
  68 + format.html {render "projects/empty"}
139 69 end
140 70 end
141 71  
  72 + #
  73 + # Wall
  74 + #
  75 +
142 76 def wall
143 77 @notes = @project.common_notes
144 78 @note = Note.new
145 79 end
146 80  
  81 + #
  82 + # Repository preview
  83 + #
  84 +
  85 + def tree
  86 + load_refs # load @branch, @tag & @ref
  87 +
  88 + @repo = project.repo
  89 +
  90 + if params[:commit_id]
  91 + @commit = @repo.commits(params[:commit_id]).first
  92 + else
  93 + @commit = @repo.commits(@ref || "master").first
  94 + end
  95 +
  96 + @tree = @commit.tree
  97 + @tree = @tree / params[:path] if params[:path]
  98 +
  99 + respond_to do |format|
  100 + format.html # show.html.erb
  101 + format.js do
  102 + # diasbale cache to allow back button works
  103 + response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
  104 + response.headers["Pragma"] = "no-cache"
  105 + response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
  106 + end
  107 + end
  108 + rescue
  109 + return render_404
  110 + end
  111 +
  112 + def blob
  113 + @repo = project.repo
  114 + @commit = project.commit(params[:commit_id])
  115 + @tree = project.tree(@commit, params[:path])
  116 +
  117 + if @tree.is_a?(Grit::Blob)
  118 + send_data(@tree.data, :type => @tree.mime_type, :disposition => 'inline', :filename => @tree.name)
  119 + else
  120 + head(404)
  121 + end
  122 + rescue
  123 + return render_404
  124 + end
  125 +
  126 + def destroy
  127 + project.destroy
  128 +
  129 + respond_to do |format|
  130 + format.html { redirect_to projects_url }
  131 + end
  132 + end
  133 +
147 134 protected
148 135  
149 136 def project
... ...
app/controllers/team_members_controller.rb
... ... @@ -12,7 +12,6 @@ class TeamMembersController < ApplicationController
12 12 respond_to do |format|
13 13 format.html # show.html.erb
14 14 format.js
15   - format.json { render json: @team_member }
16 15 end
17 16 end
18 17  
... ... @@ -22,7 +21,6 @@ class TeamMembersController < ApplicationController
22 21 respond_to do |format|
23 22 format.html # new.html.erb
24 23 format.js
25   - format.json { render json: @team_member }
26 24 end
27 25 end
28 26  
... ... @@ -34,11 +32,9 @@ class TeamMembersController < ApplicationController
34 32 if @team_member.save
35 33 format.html { redirect_to @team_member, notice: 'Team member was successfully created.' }
36 34 format.js
37   - format.json { render json: @team_member, status: :created, location: @team_member }
38 35 else
39 36 format.html { render action: "new" }
40 37 format.js
41   - format.json { render json: @team_member.errors, status: :unprocessable_entity }
42 38 end
43 39 end
44 40 end
... ... @@ -59,7 +55,6 @@ class TeamMembersController < ApplicationController
59 55  
60 56 respond_to do |format|
61 57 format.html { redirect_to root_path }
62   - format.json { head :ok }
63 58 format.js { render :nothing => true }
64 59 end
65 60 end
... ...
app/views/admin/projects/index.html.haml
... ... @@ -11,7 +11,7 @@
11 11  
12 12 - @admin_projects.each do |project|
13 13 %tr
14   - %td= project.name
  14 + %td= link_to project.name, [:admin, project]
15 15 %td= project.code
16 16 %td= project.path
17 17 %td= project.users_projects.count
... ...
app/views/admin/team_members/index.html.haml
... ... @@ -14,7 +14,7 @@
14 14 - members.each do |tm|
15 15 - user = tm.user
16 16 %tr
17   - %td.span-6= tm.user_name
  17 + %td.span-6= link_to tm.user_name, admin_team_member_path(tm)
18 18 %td.span-6= tm.user_email
19 19 %td.span-1= check_box_tag "read", 1, project.readers.include?(user), :disabled => :disabled
20 20 %td.span-1= check_box_tag "commit", 1, project.writers.include?(user), :disabled => :disabled
... ...
app/views/admin/users/index.html.haml
... ... @@ -11,7 +11,7 @@
11 11 - @admin_users.each do |user|
12 12 %tr
13 13 %td= check_box_tag "admin", 1, user.admin, :disabled => :disabled
14   - %td= user.name
  14 + %td= link_to user.name, [:admin, user]
15 15 %td= user.email
16 16 %td= user.users_projects.count
17 17 %td= link_to 'Show', [:admin, user]
... ...
app/views/commits/index.html.haml
... ... @@ -6,8 +6,10 @@
6 6  
7 7 .left.prepend-1
8 8 = form_tag project_commits_path(@project), :method => :get do
9   - = select_tag "tag", options_for_select(@project.tags, @branch), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
  9 + = select_tag "tag", options_for_select(@project.tags, @tag), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
10 10 = text_field_tag "ssh", @project.url_to_repo, :class => ["ssh_project_url", "one_click_select"]
11 11 .clear
  12 + - if params[:path]
  13 + %h3{:style => "color:#555"} /#{params[:path]}
12 14 %div{:id => dom_id(@project)}
13 15 = render "commits"
... ...
app/views/notes/_notes.html.haml
1 1 %ul#notes-list
2 2 - @notes.each do |note|
  3 + - next unless note.author
3 4 = render :partial => "notes/show", :locals => {:note => note}
4 5  
5 6 %br
... ...
app/views/projects/_list.html.haml
1   --#- if current_user.can_create_project?
2   - = link_to 'New Project', new_project_path, :class => "lbutton vm"
3   -
4 1 %table.round-borders#projects-list
5 2 %tr
6 3 %th Name
... ...
app/views/projects/_projects_top_menu.html.haml
1 1 %div.top_project_menu
2 2 %span= link_to 'All', projects_path, :class => current_page?(projects_path) ? "current" : nil
3   - %span= link_to "New Project", new_project_path, :class => current_page?(:controller => "projects", :action => "new") ? "current" : nil
  3 + - if current_user.can_create_project?
  4 + %span= link_to "New Project", new_project_path, :class => current_page?(:controller => "projects", :action => "new") ? "current" : nil
4 5 %span.right
5 6 = link_to_function(image_tag("list_view_icon.jpg"), "switchProjectView()", :style => "border:none;box-shadow:none;")
6 7  
... ...
app/views/projects/_tree.html.haml
... ... @@ -5,7 +5,7 @@
5 5  
6 6 .left.prepend-1
7 7 = form_tag tree_project_path(@project), :method => :get do
8   - = select_tag "tag", options_for_select(@project.tags, @branch), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
  8 + = select_tag "tag", options_for_select(@project.tags, @tag), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
9 9 = text_field_tag "ssh", @project.url_to_repo, :class => ["ssh_project_url","one_click_select"]
10 10 .clear
11 11  
... ... @@ -18,7 +18,7 @@
18 18 - if part_path.empty?
19 19 - part_path = part
20 20 \/
21   - = link_to truncate(part, :length => 40), tree_file_project_path(@project, :path => part_path, :commit_id => @commit.try(:id)), :remote => :true
  21 + = link_to truncate(part, :length => 40), tree_file_project_path(@project, :path => part_path, :commit_id => @commit.try(:id), :branch => @branch, :tag => @tag), :remote => :true
22 22 #tree-content-holder
23 23 - if tree.is_a?(Grit::Blob)
24 24 = render :partial => "projects/tree_file", :locals => { :name => tree.name, :content => tree.data, :file => tree }
... ... @@ -36,7 +36,7 @@
36 36 %tr{ :class => "tree-item", :url => tree_file_project_path(@project, @commit.id, file) }
37 37 %td.tree-item-file-name
38 38 = image_tag "dir.png"
39   - = link_to "..", tree_file_project_path(@project, @commit.id, file), :remote => :true
  39 + = link_to "..", tree_file_project_path(@project, @commit.id, file, :branch => @branch, :tag => @tag), :remote => :true
40 40 %td
41 41 %td
42 42  
... ...
app/views/projects/_tree_file.html.haml
... ... @@ -3,7 +3,6 @@
3 3 .view_file_header
4 4 %strong
5 5 = name
6   - -#= file.mime_type
7 6 = link_to "raw", blob_project_path(@project, :commit_id => @commit.id, :path => params[:path] ), :class => "right", :target => "_blank"
8 7 = link_to "history", project_commits_path(@project, :path => params[:path]), :class => "right", :style => "margin-right:10px;"
9 8 %br/
... ...
app/views/projects/_tree_item.html.haml
1 1 - file = params[:path] ? File.join(params[:path], content.name) : content.name
2   -- content_commit = @project.repo.log(@branch, file, :max_count => 1).last
  2 +- content_commit = @project.repo.log(@commit.id, file, :max_count => 1).last
3 3 - return unless content_commit
4 4 %tr{ :class => "tree-item", :url => tree_file_project_path(@project, @commit.id, file) }
5 5 %td.tree-item-file-name
... ... @@ -7,7 +7,7 @@
7 7 = image_tag "txt.png"
8 8 - else
9 9 = image_tag "dir.png"
10   - = link_to truncate(content.name, :length => 40), tree_file_project_path(@project, @commit.id, file), :remote => :true
  10 + = link_to truncate(content.name, :length => 40), tree_file_project_path(@project, @commit.id, file, :branch => @branch, :tag => @tag), :remote => :true
11 11 %td
12 12 = time_ago_in_words(content_commit.committed_date)
13 13 ago
... ...
configure.rb
... ... @@ -1,5 +0,0 @@
1   -root_path = File.expand_path(File.dirname(__FILE__))
2   -require File.join(root_path, "install", "prepare")
3   -env = ARGV[0] || "development"
4   -
5   -Install.prepare(env)
install.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  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"
... ...
install/prepare.rb
... ... @@ -1,51 +0,0 @@
1   -module Install
2   - class << self
3   - def prepare(env)
4   - puts green " == Starting for ENV=#{env} ..."
5   - puts "rvm detected" if is_rvm?
6   -
7   - bundler
8   - db(env)
9   -
10   - puts green " == Done! Now you can start server"
11   - end
12   -
13   - def bundler
14   - command 'gem install bundler'
15   - command 'bundle install'
16   - end
17   -
18   - def db(env)
19   - command "bundle exec rake db:setup RAILS_ENV=#{env}"
20   - command "bundle exec rake db:seed_fu RAILS_ENV=#{env}"
21   - end
22   -
23   - def is_rvm?
24   - `type rvm | head -1` =~ /^rvm is/
25   - end
26   -
27   - def colorize(text, color_code)
28   - "\033[#{color_code}#{text}\033[0m"
29   - end
30   -
31   - def red(text)
32   - colorize(text, "31m")
33   - end
34   -
35   - def green(text)
36   - colorize(text, "32m")
37   - end
38   -
39   - def command(string)
40   - `#{string}`
41   - if $?.to_i > 0
42   - puts red " == #{string} - FAIL"
43   - puts red " == Error during configure"
44   - exit
45   - else
46   - puts green " == #{string} - OK"
47   - end
48   - end
49   - end
50   -end
51   -
lib/color.rb 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +module Color
  2 + def colorize(text, color_code)
  3 + "\033[#{color_code}#{text}\033[0m"
  4 + end
  5 +
  6 + def red(text)
  7 + colorize(text, "31m")
  8 + end
  9 +
  10 + def green(text)
  11 + colorize(text, "32m")
  12 + end
  13 +
  14 + def command(string)
  15 + `#{string}`
  16 + if $?.to_i > 0
  17 + puts red " == #{string} - FAIL"
  18 + puts red " == Error during configure"
  19 + exit
  20 + else
  21 + puts green " == #{string} - OK"
  22 + end
  23 + end
  24 +end
  25 +
... ...
spec/requests/projects_tree_perfomance_spec.rb 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +require 'spec_helper'
  2 +require 'benchmark'
  3 +
  4 +describe "Projects" do
  5 + before { login_as :user }
  6 +
  7 + describe "GET /projects/tree" do
  8 + describe "head" do
  9 + before do
  10 + @project = Factory :project
  11 + @project.add_access(@user, :read)
  12 +
  13 + end
  14 +
  15 + it "should be fast" do
  16 + time = Benchmark.realtime do
  17 + visit tree_project_path(@project)
  18 + end
  19 + (time < 1.0).should be_true
  20 + end
  21 + end
  22 +
  23 + describe ValidCommit::ID do
  24 + before do
  25 + @project = Factory :project
  26 + @project.add_access(@user, :read)
  27 + end
  28 +
  29 + it "should be fast" do
  30 + time = Benchmark.realtime do
  31 + visit tree_project_path(@project, :commit_id => ValidCommit::ID)
  32 + end
  33 + (time < 1.0).should be_true
  34 + end
  35 + end
  36 + end
  37 +end
... ...
update.rb 0 → 100644
... ... @@ -0,0 +1,26 @@
  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 " == Update for ENV=#{env}"
  16 +
  17 +# pull from github
  18 +`git pull`
  19 +
  20 +`bundle install`
  21 +
  22 +# migrate db
  23 +`bundle exec rake db:migrate RAILS_ENV=#{env}`
  24 +
  25 +
  26 +puts green " == Done! Now you can start/restart server"
... ...