Commit 319f0c30573d1f2158adf52276981b2c7780392f

Authored by Dmitriy Zaporozhets
2 parents e469084c ced242a2

Merge branch 'master' into stable

Conflicts:
	doc/install/installation.md
Showing 510 changed files with 105376 additions and 3191 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 510 files displayed.

@@ -3,8 +3,11 @@ env: @@ -3,8 +3,11 @@ env:
3 - DB=mysql 3 - DB=mysql
4 before_install: 4 before_install:
5 - sudo apt-get install libicu-dev -y 5 - sudo apt-get install libicu-dev -y
6 - - sudo apt-get install libqt4-dev libqtwebkit-dev -y  
7 - - gem install charlock_holmes -v="0.6.8" 6 + - wget -P /tmp http://phantomjs.googlecode.com/files/phantomjs-1.7.0-linux-i686.tar.bz2
  7 + - tar -xf /tmp/phantomjs-1.7.0-linux-i686.tar.bz2 -C /tmp/
  8 + - sudo rm -rf /usr/local/phantomjs
  9 + - sudo mv /tmp/phantomjs-1.7.0-linux-i686 /usr/local/phantomjs
  10 + - gem install charlock_holmes -v="0.6.9"
8 branches: 11 branches:
9 only: 12 only:
10 - 'master' 13 - 'master'
  1 +v 3.1.0
  2 + - Updated gems
  3 + - Services: Gitlab CI integration
  4 + - Events filter on dashboard
  5 + - Own namespace for redis/resque
  6 + - Optimized commit diff views
  7 + - add alphabetical order for projects admin page
  8 + - Improved web editor
  9 + - Commit stats page
  10 + - Documentation split and cleanup
  11 + - Link to commit authors everywhere
  12 + - Restyled milestones list
  13 + - added Milestone to Merge Request
  14 + - Restyled Top panel
  15 + - Refactored Satellite Code
  16 + - Added file line links
  17 + - moved from capybara-webkit to poltergeist + phantomjs
  18 +
1 v 3.0.3 19 v 3.0.3
2 - Fixed bug with issues list in Chrome 20 - Fixed bug with issues list in Chrome
3 - New Feature: Import team from another project 21 - New Feature: Import team from another project
@@ -28,7 +46,7 @@ v 3.0.0 @@ -28,7 +46,7 @@ v 3.0.0
28 - Reject ssh keys that break gitolite 46 - Reject ssh keys that break gitolite
29 - [API] list one project hook 47 - [API] list one project hook
30 - [API] edit project hook 48 - [API] edit project hook
31 - - [API] add project snippets list 49 + - [API] list project snippets
32 - [API] allow to authorize using private token in HTTP header 50 - [API] allow to authorize using private token in HTTP header
33 - [API] add user creation 51 - [API] add user creation
34 52
CONTRIBUTING.md
1 -## Contribute to GitLab 1 +## Contribute to GitLab
2 2
3 If you want to contribute to GitLab, follow this process: 3 If you want to contribute to GitLab, follow this process:
4 4
@@ -7,24 +7,20 @@ If you want to contribute to GitLab, follow this process: @@ -7,24 +7,20 @@ If you want to contribute to GitLab, follow this process:
7 3. Code 7 3. Code
8 4. Create a pull request 8 4. Create a pull request
9 9
10 -We will only accept pull requests if: 10 +We will only accept pull requests if:
11 11
12 * Your code has proper tests and all tests pass 12 * Your code has proper tests and all tests pass
13 -* Your code can be merged w/o problems 13 +* Your code can be merged w/o problems
14 * It won't break existing functionality 14 * It won't break existing functionality
15 * It's quality code 15 * It's quality code
16 * We like it :) 16 * We like it :)
17 17
18 -## [You may need a developer VM](https://github.com/gitlabhq/developer-vm) 18 +For examples of feedback on pull requests please look at the [closed pull requests](https://github.com/gitlabhq/gitlabhq/pulls?direction=desc&page=1&sort=created&state=closed).
19 19
20 -## Running tests  
21 -  
22 -To run the specs for GitLab, you need to run seeds for test db. 20 +## Installation
23 21
24 - cd gitlabhq  
25 - rake db:seed_fu RAILS_ENV=test 22 +Install the Gitlab development in a virtual machine with the [Gitlab Vagrant virtual machine](https://github.com/gitlabhq/gitlab-vagrant-vm). Installing it in a virtual machine makes it much easier to set up all the dependencies for integration testing.
26 23
27 -Then you can run the test suite with rake:  
28 -  
29 - rake gitlab:test 24 +## Running tests
30 25
  26 +For more information on running the tests please read the [development tips](https://github.com/gitlabhq/gitlabhq/blob/master/doc/development.md)
@@ -8,34 +8,35 @@ def linux_only(require_as) @@ -8,34 +8,35 @@ def linux_only(require_as)
8 RUBY_PLATFORM.include?('linux') && require_as 8 RUBY_PLATFORM.include?('linux') && require_as
9 end 9 end
10 10
11 -gem "rails", "3.2.8" 11 +gem "rails", "3.2.9"
12 12
13 # Supported DBs 13 # Supported DBs
14 -gem "sqlite3", :group => :sqlite  
15 -gem "mysql2", :group => :mysql  
16 -gem "pg", :group => :postgres 14 +gem "sqlite3", group: :sqlite
  15 +gem "mysql2", group: :mysql
  16 +gem "pg", group: :postgres
17 17
18 # Auth 18 # Auth
19 gem "devise", "~> 2.1.0" 19 gem "devise", "~> 2.1.0"
20 -gem 'omniauth' 20 +gem 'omniauth', "~> 1.1.1"
21 gem 'omniauth-google-oauth2' 21 gem 'omniauth-google-oauth2'
22 gem 'omniauth-twitter' 22 gem 'omniauth-twitter'
23 gem 'omniauth-github' 23 gem 'omniauth-github'
24 24
25 # GITLAB patched libs 25 # GITLAB patched libs
26 -gem "grit", :git => "https://github.com/gitlabhq/grit.git", :ref => "7f35cb98ff17d534a07e3ce6ec3d580f67402837"  
27 -gem "omniauth-ldap", :git => "https://github.com/gitlabhq/omniauth-ldap.git", :ref => "f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e"  
28 -gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git"  
29 -gem 'grack', :git => "https://github.com/gitlabhq/grack.git" 26 +gem "grit", git: "https://github.com/gitlabhq/grit.git", ref: '7f35cb98ff17d534a07e3ce6ec3d580f67402837'
  27 +gem "omniauth-ldap", git: "https://github.com/gitlabhq/omniauth-ldap.git", ref: 'f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e'
  28 +gem 'yaml_db', git: "https://github.com/gitlabhq/yaml_db.git", ref: '98e9a5dca43e3fedd3268c76a73af40d1bdf1dfd'
  29 +gem 'grack', git: "https://github.com/gitlabhq/grack.git", ref: 'ba46f3b0845c6a09d488ae6abdce6ede37e227e8'
  30 +gem 'grit_ext', git: "https://github.com/gitlabhq/grit_ext.git", ref: '212fd40bea61f3c6a167223768e7295dc32bbc10'
30 31
31 # Gitolite client (for work with gitolite-admin repo) 32 # Gitolite client (for work with gitolite-admin repo)
32 gem "gitolite", '1.1.0' 33 gem "gitolite", '1.1.0'
33 34
34 # Syntax highlighter 35 # Syntax highlighter
35 -gem "pygments.rb", "0.3.1" 36 +gem "pygments.rb", git: "https://github.com/gitlabhq/pygments.rb.git", ref: '4db80c599067e2d5f23c5c243bf85b8ca0368ad4'
36 37
37 # Language detection 38 # Language detection
38 -gem "github-linguist", "~> 2.3.4" , :require => "linguist" 39 +gem "github-linguist", "~> 2.3.4" , require: "linguist"
39 40
40 # API 41 # API
41 gem "grape", "~> 0.2.1" 42 gem "grape", "~> 0.2.1"
@@ -45,13 +46,13 @@ gem "grape", "~> 0.2.1" @@ -45,13 +46,13 @@ gem "grape", "~> 0.2.1"
45 gem "stamp" 46 gem "stamp"
46 47
47 # Pagination 48 # Pagination
48 -gem "kaminari" 49 +gem "kaminari", "~> 0.14.1"
49 50
50 # HAML 51 # HAML
51 -gem "haml-rails" 52 +gem "haml-rails", "~> 0.3.5"
52 53
53 # Files attachments 54 # Files attachments
54 -gem "carrierwave" 55 +gem "carrierwave", "~> 0.7.1"
55 56
56 # Authorization 57 # Authorization
57 gem "six" 58 gem "six"
@@ -63,59 +64,57 @@ gem "ffaker" @@ -63,59 +64,57 @@ gem "ffaker"
63 gem "seed-fu" 64 gem "seed-fu"
64 65
65 # Markdown to HTML 66 # Markdown to HTML
66 -gem "redcarpet", "~> 2.1.1" 67 +gem "redcarpet", "~> 2.2.2"
67 gem "github-markup", "~> 0.7.4", require: 'github/markup' 68 gem "github-markup", "~> 0.7.4", require: 'github/markup'
68 69
69 # Servers 70 # Servers
70 -gem "thin"  
71 -gem "unicorn" 71 +gem "thin", '~> 1.5.0'
  72 +gem "unicorn", "~> 4.4.0"
72 73
73 # Issue tags 74 # Issue tags
74 -gem "acts-as-taggable-on", "2.3.1" 75 +gem "acts-as-taggable-on", "2.3.3"
75 76
76 # Decorators 77 # Decorators
77 -gem "draper" 78 +gem "draper", "~> 0.18.0"
78 79
79 # Background jobs 80 # Background jobs
80 -gem "resque", "~> 1.20.0" 81 +gem "resque", "~> 1.23.0"
81 gem 'resque_mailer' 82 gem 'resque_mailer'
82 83
83 # HTTP requests 84 # HTTP requests
84 gem "httparty" 85 gem "httparty"
85 86
86 -# Handle encodings  
87 -gem "charlock_holmes"  
88 -  
89 # Colored output to console 87 # Colored output to console
90 gem "colored" 88 gem "colored"
91 89
92 -# GITLAB settings 90 +# GitLab settings
93 gem 'settingslogic' 91 gem 'settingslogic'
94 92
95 # Misc 93 # Misc
96 gem "foreman" 94 gem "foreman"
97 -gem 'gemoji', require: 'emoji/railtie'  
98 gem "git" 95 gem "git"
99 96
100 group :assets do 97 group :assets do
101 - gem "sass-rails", "3.2.5"  
102 - gem "coffee-rails", "3.2.2"  
103 - gem "uglifier", "1.0.3" 98 + gem "sass-rails", "~> 3.2.5"
  99 + gem "coffee-rails", "~> 3.2.2"
  100 + gem "uglifier", "~> 1.3.0"
104 gem "therubyracer" 101 gem "therubyracer"
105 102
106 - gem 'chosen-rails'  
107 - gem 'jquery-atwho-rails', '0.1.6'  
108 - gem "jquery-rails", "2.0.2"  
109 - gem "jquery-ui-rails", "0.5.0"  
110 - gem "modernizr", "2.5.3"  
111 - gem "raphael-rails", "1.5.2"  
112 - gem 'bootstrap-sass', "2.0.4" 103 + gem 'chosen-rails', "0.9.8"
  104 + gem 'jquery-atwho-rails', "0.1.6"
  105 + gem "jquery-rails", "2.1.3"
  106 + gem "jquery-ui-rails", "2.0.2"
  107 + gem "modernizr", "2.6.2"
  108 + gem "raphael-rails", "2.1.0"
  109 + gem 'bootstrap-sass', "2.2.1.1"
113 gem "font-awesome-sass-rails", "~> 2.0.0" 110 gem "font-awesome-sass-rails", "~> 2.0.0"
  111 + gem "gemoji", "~> 1.2.1", require: 'emoji/railtie'
114 end 112 end
115 113
116 group :development do 114 group :development do
  115 + gem "annotate", git: "https://github.com/ctran/annotate_models.git"
117 gem "letter_opener" 116 gem "letter_opener"
118 - gem "annotate", :git => "https://github.com/ctran/annotate_models.git" 117 + gem 'quiet_assets', '~> 1.0.1'
119 gem 'rack-mini-profiler' 118 gem 'rack-mini-profiler'
120 end 119 end
121 120
@@ -124,8 +123,6 @@ group :development, :test do @@ -124,8 +123,6 @@ group :development, :test do
124 gem 'spinach-rails' 123 gem 'spinach-rails'
125 gem "rspec-rails" 124 gem "rspec-rails"
126 gem "capybara" 125 gem "capybara"
127 - gem "capybara-webkit"  
128 - gem "headless"  
129 gem "pry" 126 gem "pry"
130 gem "awesome_print" 127 gem "awesome_print"
131 gem "database_cleaner" 128 gem "database_cleaner"
@@ -137,14 +134,17 @@ group :development, :test do @@ -137,14 +134,17 @@ group :development, :test do
137 gem 'guard-spinach' 134 gem 'guard-spinach'
138 135
139 # Notification 136 # Notification
140 - gem 'rb-fsevent', :require => darwin_only('rb-fsevent')  
141 - gem 'growl', :require => darwin_only('growl')  
142 - gem 'rb-inotify', :require => linux_only('rb-inotify') 137 + gem 'rb-fsevent', require: darwin_only('rb-fsevent')
  138 + gem 'growl', require: darwin_only('growl')
  139 + gem 'rb-inotify', require: linux_only('rb-inotify')
  140 +
  141 + # PhantomJS driver for Capybara
  142 + gem 'poltergeist'
143 end 143 end
144 144
145 group :test do 145 group :test do
146 - gem "simplecov", :require => false  
147 - gem "shoulda-matchers" 146 + gem "simplecov", require: false
  147 + gem "shoulda-matchers", "1.3.0"
148 gem 'email_spec' 148 gem 'email_spec'
149 gem 'resque_spec' 149 gem 'resque_spec'
150 gem "webmock" 150 gem "webmock"
@@ -152,5 +152,5 @@ group :test do @@ -152,5 +152,5 @@ group :test do
152 end 152 end
153 153
154 group :production do 154 group :production do
155 - gem "gitlab_meta", '3.0' 155 + gem "gitlab_meta", '3.1'
156 end 156 end
1 GIT 1 GIT
2 remote: https://github.com/ctran/annotate_models.git 2 remote: https://github.com/ctran/annotate_models.git
3 - revision: 18cd39ad01829deba5aa34634b8540d6675ab978 3 + revision: be4e26825b521f0b2d86b181e2dff89901aa9b1e
4 specs: 4 specs:
5 - annotate (2.4.1.beta1) 5 + annotate (2.6.0.beta1)
  6 + activerecord (>= 2.3.0)
  7 + rake (>= 0.8.7)
6 8
7 GIT 9 GIT
8 remote: https://github.com/gitlabhq/grack.git 10 remote: https://github.com/gitlabhq/grack.git
9 revision: ba46f3b0845c6a09d488ae6abdce6ede37e227e8 11 revision: ba46f3b0845c6a09d488ae6abdce6ede37e227e8
  12 + ref: ba46f3b0845c6a09d488ae6abdce6ede37e227e8
10 specs: 13 specs:
11 grack (1.0.0) 14 grack (1.0.0)
12 rack (~> 1.4.1) 15 rack (~> 1.4.1)
@@ -22,6 +25,14 @@ GIT @@ -22,6 +25,14 @@ GIT
22 posix-spawn (~> 0.3.6) 25 posix-spawn (~> 0.3.6)
23 26
24 GIT 27 GIT
  28 + remote: https://github.com/gitlabhq/grit_ext.git
  29 + revision: 212fd40bea61f3c6a167223768e7295dc32bbc10
  30 + ref: 212fd40bea61f3c6a167223768e7295dc32bbc10
  31 + specs:
  32 + grit_ext (0.6.0)
  33 + charlock_holmes (~> 0.6.9)
  34 +
  35 +GIT
25 remote: https://github.com/gitlabhq/omniauth-ldap.git 36 remote: https://github.com/gitlabhq/omniauth-ldap.git
26 revision: f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e 37 revision: f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e
27 ref: f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e 38 ref: f038dd852d7bd473a557e385d5d7c2fd5dc1dc2e
@@ -33,114 +44,125 @@ GIT @@ -33,114 +44,125 @@ GIT
33 rubyntlm (~> 0.1.1) 44 rubyntlm (~> 0.1.1)
34 45
35 GIT 46 GIT
  47 + remote: https://github.com/gitlabhq/pygments.rb.git
  48 + revision: 4db80c599067e2d5f23c5c243bf85b8ca0368ad4
  49 + ref: 4db80c599067e2d5f23c5c243bf85b8ca0368ad4
  50 + specs:
  51 + pygments.rb (0.3.2)
  52 + posix-spawn (~> 0.3.6)
  53 + yajl-ruby (~> 1.1.0)
  54 +
  55 +GIT
36 remote: https://github.com/gitlabhq/yaml_db.git 56 remote: https://github.com/gitlabhq/yaml_db.git
37 revision: 98e9a5dca43e3fedd3268c76a73af40d1bdf1dfd 57 revision: 98e9a5dca43e3fedd3268c76a73af40d1bdf1dfd
  58 + ref: 98e9a5dca43e3fedd3268c76a73af40d1bdf1dfd
38 specs: 59 specs:
39 yaml_db (0.2.2) 60 yaml_db (0.2.2)
40 61
41 GEM 62 GEM
42 remote: http://rubygems.org/ 63 remote: http://rubygems.org/
43 specs: 64 specs:
44 - actionmailer (3.2.8)  
45 - actionpack (= 3.2.8) 65 + actionmailer (3.2.9)
  66 + actionpack (= 3.2.9)
46 mail (~> 2.4.4) 67 mail (~> 2.4.4)
47 - actionpack (3.2.8)  
48 - activemodel (= 3.2.8)  
49 - activesupport (= 3.2.8) 68 + actionpack (3.2.9)
  69 + activemodel (= 3.2.9)
  70 + activesupport (= 3.2.9)
50 builder (~> 3.0.0) 71 builder (~> 3.0.0)
51 erubis (~> 2.7.0) 72 erubis (~> 2.7.0)
52 journey (~> 1.0.4) 73 journey (~> 1.0.4)
53 rack (~> 1.4.0) 74 rack (~> 1.4.0)
54 rack-cache (~> 1.2) 75 rack-cache (~> 1.2)
55 rack-test (~> 0.6.1) 76 rack-test (~> 0.6.1)
56 - sprockets (~> 2.1.3)  
57 - activemodel (3.2.8)  
58 - activesupport (= 3.2.8) 77 + sprockets (~> 2.2.1)
  78 + activemodel (3.2.9)
  79 + activesupport (= 3.2.9)
59 builder (~> 3.0.0) 80 builder (~> 3.0.0)
60 - activerecord (3.2.8)  
61 - activemodel (= 3.2.8)  
62 - activesupport (= 3.2.8) 81 + activerecord (3.2.9)
  82 + activemodel (= 3.2.9)
  83 + activesupport (= 3.2.9)
63 arel (~> 3.0.2) 84 arel (~> 3.0.2)
64 tzinfo (~> 0.3.29) 85 tzinfo (~> 0.3.29)
65 - activeresource (3.2.8)  
66 - activemodel (= 3.2.8)  
67 - activesupport (= 3.2.8)  
68 - activesupport (3.2.8) 86 + activeresource (3.2.9)
  87 + activemodel (= 3.2.9)
  88 + activesupport (= 3.2.9)
  89 + activesupport (3.2.9)
69 i18n (~> 0.6) 90 i18n (~> 0.6)
70 multi_json (~> 1.0) 91 multi_json (~> 1.0)
71 - acts-as-taggable-on (2.3.1) 92 + acts-as-taggable-on (2.3.3)
72 rails (~> 3.0) 93 rails (~> 3.0)
73 - addressable (2.2.8) 94 + addressable (2.3.2)
74 arel (3.0.2) 95 arel (3.0.2)
75 - awesome_print (1.0.2) 96 + awesome_print (1.1.0)
  97 + backports (2.6.5)
76 bcrypt-ruby (3.0.1) 98 bcrypt-ruby (3.0.1)
77 - blankslate (2.1.2.4)  
78 - bootstrap-sass (2.0.4.0)  
79 - builder (3.0.2)  
80 - capybara (1.1.2) 99 + blankslate (3.1.2)
  100 + bootstrap-sass (2.2.1.1)
  101 + sass (~> 3.2)
  102 + builder (3.0.4)
  103 + capybara (1.1.3)
81 mime-types (>= 1.16) 104 mime-types (>= 1.16)
82 nokogiri (>= 1.3.3) 105 nokogiri (>= 1.3.3)
83 rack (>= 1.0.0) 106 rack (>= 1.0.0)
84 rack-test (>= 0.5.4) 107 rack-test (>= 0.5.4)
85 selenium-webdriver (~> 2.0) 108 selenium-webdriver (~> 2.0)
86 xpath (~> 0.1.4) 109 xpath (~> 0.1.4)
87 - capybara-webkit (0.12.1)  
88 - capybara (>= 1.0.0, < 1.2)  
89 - json  
90 - carrierwave (0.6.2) 110 + carrierwave (0.7.1)
91 activemodel (>= 3.2.0) 111 activemodel (>= 3.2.0)
92 activesupport (>= 3.2.0) 112 activesupport (>= 3.2.0)
93 - charlock_holmes (0.6.8)  
94 - childprocess (0.3.2)  
95 - ffi (~> 1.0.6)  
96 - chosen-rails (0.9.8.3) 113 + charlock_holmes (0.6.9)
  114 + childprocess (0.3.6)
  115 + ffi (~> 1.0, >= 1.0.6)
  116 + chosen-rails (0.9.8)
97 railties (~> 3.0) 117 railties (~> 3.0)
98 thor (~> 0.14) 118 thor (~> 0.14)
99 - coderay (1.0.6) 119 + coderay (1.0.8)
100 coffee-rails (3.2.2) 120 coffee-rails (3.2.2)
101 coffee-script (>= 2.2.0) 121 coffee-script (>= 2.2.0)
102 railties (~> 3.2.0) 122 railties (~> 3.2.0)
103 coffee-script (2.2.0) 123 coffee-script (2.2.0)
104 coffee-script-source 124 coffee-script-source
105 execjs 125 execjs
106 - coffee-script-source (1.3.3) 126 + coffee-script-source (1.4.0)
107 colored (1.2) 127 colored (1.2)
108 colorize (0.5.8) 128 colorize (0.5.8)
109 crack (0.3.1) 129 crack (0.3.1)
110 - daemons (1.1.8)  
111 - database_cleaner (0.8.0) 130 + daemons (1.1.9)
  131 + database_cleaner (0.9.1)
112 devise (2.1.2) 132 devise (2.1.2)
113 bcrypt-ruby (~> 3.0) 133 bcrypt-ruby (~> 3.0)
114 orm_adapter (~> 0.1) 134 orm_adapter (~> 0.1)
115 railties (~> 3.1) 135 railties (~> 3.1)
116 warden (~> 1.2.1) 136 warden (~> 1.2.1)
117 diff-lcs (1.1.3) 137 diff-lcs (1.1.3)
118 - draper (0.17.0) 138 + draper (0.18.0)
119 actionpack (~> 3.2) 139 actionpack (~> 3.2)
120 activesupport (~> 3.2) 140 activesupport (~> 3.2)
121 - email_spec (1.2.1) 141 + email_spec (1.4.0)
  142 + launchy (~> 2.1)
122 mail (~> 2.2) 143 mail (~> 2.2)
123 - rspec (~> 2.0)  
124 erubis (2.7.0) 144 erubis (2.7.0)
125 escape_utils (0.2.4) 145 escape_utils (0.2.4)
126 - eventmachine (0.12.10) 146 + eventmachine (1.0.0)
127 execjs (1.4.0) 147 execjs (1.4.0)
128 multi_json (~> 1.0) 148 multi_json (~> 1.0)
129 - factory_girl (4.0.0) 149 + factory_girl (4.1.0)
130 activesupport (>= 3.0.0) 150 activesupport (>= 3.0.0)
131 - factory_girl_rails (4.0.0)  
132 - factory_girl (~> 4.0.0) 151 + factory_girl_rails (4.1.0)
  152 + factory_girl (~> 4.1.0)
133 railties (>= 3.0.0) 153 railties (>= 3.0.0)
134 faraday (0.8.4) 154 faraday (0.8.4)
135 multipart-post (~> 1.1) 155 multipart-post (~> 1.1)
136 - ffaker (1.14.0)  
137 - ffi (1.0.11) 156 + faye-websocket (0.4.6)
  157 + eventmachine (>= 0.12.0)
  158 + ffaker (1.15.0)
  159 + ffi (1.1.5)
138 font-awesome-sass-rails (2.0.0.0) 160 font-awesome-sass-rails (2.0.0.0)
139 railties (>= 3.1.1) 161 railties (>= 3.1.1)
140 sass-rails (>= 3.1.1) 162 sass-rails (>= 3.1.1)
141 - foreman (0.47.0) 163 + foreman (0.60.2)
142 thor (>= 0.13.6) 164 thor (>= 0.13.6)
143 - gemoji (1.1.1) 165 + gemoji (1.2.1)
144 gherkin-ruby (0.2.1) 166 gherkin-ruby (0.2.1)
145 git (1.2.5) 167 git (1.2.5)
146 github-linguist (2.3.4) 168 github-linguist (2.3.4)
@@ -149,80 +171,87 @@ GEM @@ -149,80 +171,87 @@ GEM
149 mime-types (~> 1.19) 171 mime-types (~> 1.19)
150 pygments.rb (>= 0.2.13) 172 pygments.rb (>= 0.2.13)
151 github-markup (0.7.4) 173 github-markup (0.7.4)
152 - gitlab_meta (3.0) 174 + gitlab_meta (3.1)
153 gitolite (1.1.0) 175 gitolite (1.1.0)
154 gratr19 (~> 0.4.4.1) 176 gratr19 (~> 0.4.4.1)
155 grit (~> 2.5.0) 177 grit (~> 2.5.0)
156 hashery (~> 1.5.0) 178 hashery (~> 1.5.0)
157 - grape (0.2.1) 179 + grape (0.2.2)
  180 + activesupport
158 hashie (~> 1.2) 181 hashie (~> 1.2)
159 - multi_json 182 + multi_json (>= 1.3.2)
160 multi_xml 183 multi_xml
161 rack 184 rack
  185 + rack-accept
162 rack-mount 186 rack-mount
  187 + virtus
163 gratr19 (0.4.4.1) 188 gratr19 (0.4.4.1)
164 growl (1.0.3) 189 growl (1.0.3)
165 - guard (1.3.2) 190 + guard (1.5.4)
166 listen (>= 0.4.2) 191 listen (>= 0.4.2)
  192 + lumberjack (>= 1.0.2)
  193 + pry (>= 0.9.10)
167 thor (>= 0.14.6) 194 thor (>= 0.14.6)
168 - guard-rspec (1.2.1) 195 + guard-rspec (2.1.2)
169 guard (>= 1.1) 196 guard (>= 1.1)
  197 + rspec (~> 2.11)
170 guard-spinach (0.0.2) 198 guard-spinach (0.0.2)
171 guard (>= 1.1) 199 guard (>= 1.1)
172 spinach 200 spinach
173 - haml (3.1.6)  
174 - haml-rails (0.3.4)  
175 - actionpack (~> 3.0)  
176 - activesupport (~> 3.0)  
177 - haml (~> 3.0)  
178 - railties (~> 3.0) 201 + haml (3.1.7)
  202 + haml-rails (0.3.5)
  203 + actionpack (>= 3.1, < 4.1)
  204 + activesupport (>= 3.1, < 4.1)
  205 + haml (~> 3.1)
  206 + railties (>= 3.1, < 4.1)
179 hashery (1.5.0) 207 hashery (1.5.0)
180 blankslate 208 blankslate
181 hashie (1.2.0) 209 hashie (1.2.0)
182 - headless (0.3.1)  
183 hike (1.2.1) 210 hike (1.2.1)
184 - httparty (0.8.3) 211 + http_parser.rb (0.5.3)
  212 + httparty (0.9.0)
185 multi_json (~> 1.0) 213 multi_json (~> 1.0)
186 multi_xml 214 multi_xml
187 - httpauth (0.1) 215 + httpauth (0.2.0)
188 i18n (0.6.1) 216 i18n (0.6.1)
189 journey (1.0.4) 217 journey (1.0.4)
190 jquery-atwho-rails (0.1.6) 218 jquery-atwho-rails (0.1.6)
191 - jquery-rails (2.0.2)  
192 - railties (>= 3.2.0, < 5.0) 219 + jquery-rails (2.1.3)
  220 + railties (>= 3.1.0, < 5.0)
193 thor (~> 0.14) 221 thor (~> 0.14)
194 - jquery-ui-rails (0.5.0) 222 + jquery-ui-rails (2.0.2)
195 jquery-rails 223 jquery-rails
196 railties (>= 3.1.0) 224 railties (>= 3.1.0)
197 json (1.7.5) 225 json (1.7.5)
198 jwt (0.1.5) 226 jwt (0.1.5)
199 multi_json (>= 1.0) 227 multi_json (>= 1.0)
200 - kaminari (0.14.0) 228 + kaminari (0.14.1)
201 actionpack (>= 3.0.0) 229 actionpack (>= 3.0.0)
202 activesupport (>= 3.0.0) 230 activesupport (>= 3.0.0)
203 kgio (2.7.4) 231 kgio (2.7.4)
204 - launchy (2.1.0)  
205 - addressable (~> 2.2.6)  
206 - letter_opener (0.0.2)  
207 - launchy 232 + launchy (2.1.2)
  233 + addressable (~> 2.3)
  234 + letter_opener (1.0.0)
  235 + launchy (>= 2.0.4)
208 libv8 (3.3.10.4) 236 libv8 (3.3.10.4)
209 - libwebsocket (0.1.3)  
210 - addressable  
211 - listen (0.5.0) 237 + libwebsocket (0.1.6)
  238 + websocket
  239 + listen (0.5.3)
  240 + lumberjack (1.0.2)
212 mail (2.4.4) 241 mail (2.4.4)
213 i18n (>= 0.4.0) 242 i18n (>= 0.4.0)
214 mime-types (~> 1.16) 243 mime-types (~> 1.16)
215 treetop (~> 1.4.8) 244 treetop (~> 1.4.8)
216 - method_source (0.7.1) 245 + method_source (0.8.1)
217 mime-types (1.19) 246 mime-types (1.19)
218 - modernizr (2.5.3) 247 + modernizr (2.6.2)
219 sprockets (~> 2.0) 248 sprockets (~> 2.0)
220 - multi_json (1.3.6) 249 + multi_json (1.3.7)
221 multi_xml (0.5.1) 250 multi_xml (0.5.1)
222 multipart-post (1.1.5) 251 multipart-post (1.1.5)
223 mysql2 (0.3.11) 252 mysql2 (0.3.11)
224 net-ldap (0.2.2) 253 net-ldap (0.2.2)
225 - nokogiri (1.5.3) 254 + nokogiri (1.5.5)
226 oauth (0.4.7) 255 oauth (0.4.7)
227 oauth2 (0.8.0) 256 oauth2 (0.8.0)
228 faraday (~> 0.8) 257 faraday (~> 0.8)
@@ -230,7 +259,7 @@ GEM @@ -230,7 +259,7 @@ GEM
230 jwt (~> 0.1.4) 259 jwt (~> 0.1.4)
231 multi_json (~> 1.0) 260 multi_json (~> 1.0)
232 rack (~> 1.2) 261 rack (~> 1.2)
233 - omniauth (1.1.0) 262 + omniauth (1.1.1)
234 hashie (~> 1.2) 263 hashie (~> 1.2)
235 rack 264 rack
236 omniauth-github (1.0.3) 265 omniauth-github (1.0.3)
@@ -242,28 +271,35 @@ GEM @@ -242,28 +271,35 @@ GEM
242 omniauth-oauth (1.0.1) 271 omniauth-oauth (1.0.1)
243 oauth 272 oauth
244 omniauth (~> 1.0) 273 omniauth (~> 1.0)
245 - omniauth-oauth2 (1.1.0) 274 + omniauth-oauth2 (1.1.1)
246 oauth2 (~> 0.8.0) 275 oauth2 (~> 0.8.0)
247 omniauth (~> 1.0) 276 omniauth (~> 1.0)
248 - omniauth-twitter (0.0.13) 277 + omniauth-twitter (0.0.14)
249 multi_json (~> 1.3) 278 multi_json (~> 1.3)
250 omniauth-oauth (~> 1.0) 279 omniauth-oauth (~> 1.0)
251 - orm_adapter (0.3.0)  
252 - pg (0.14.0) 280 + orm_adapter (0.4.0)
  281 + pg (0.14.1)
  282 + poltergeist (1.0.2)
  283 + capybara (~> 1.1)
  284 + childprocess (~> 0.3)
  285 + faye-websocket (~> 0.4, >= 0.4.4)
  286 + http_parser.rb (~> 0.5.3)
  287 + multi_json (~> 1.0)
253 polyglot (0.3.3) 288 polyglot (0.3.3)
254 posix-spawn (0.3.6) 289 posix-spawn (0.3.6)
255 - pry (0.9.9.6) 290 + pry (0.9.10)
256 coderay (~> 1.0.5) 291 coderay (~> 1.0.5)
257 - method_source (~> 0.7.1)  
258 - slop (>= 2.4.4, < 3)  
259 - pygments.rb (0.3.1)  
260 - posix-spawn (~> 0.3.6)  
261 - yajl-ruby (~> 1.1.0) 292 + method_source (~> 0.8)
  293 + slop (~> 3.3.1)
262 pyu-ruby-sasl (0.0.3.3) 294 pyu-ruby-sasl (0.0.3.3)
  295 + quiet_assets (1.0.1)
  296 + railties (~> 3.1)
263 rack (1.4.1) 297 rack (1.4.1)
  298 + rack-accept (0.4.5)
  299 + rack (>= 0.4)
264 rack-cache (1.2) 300 rack-cache (1.2)
265 rack (>= 0.4) 301 rack (>= 0.4)
266 - rack-mini-profiler (0.1.9) 302 + rack-mini-profiler (0.1.23)
267 rack (>= 1.1.3) 303 rack (>= 1.1.3)
268 rack-mount (0.8.3) 304 rack-mount (0.8.3)
269 rack (>= 1.0.0) 305 rack (>= 1.0.0)
@@ -271,65 +307,66 @@ GEM @@ -271,65 +307,66 @@ GEM
271 rack 307 rack
272 rack-ssl (1.3.2) 308 rack-ssl (1.3.2)
273 rack 309 rack
274 - rack-test (0.6.1) 310 + rack-test (0.6.2)
275 rack (>= 1.0) 311 rack (>= 1.0)
276 - rails (3.2.8)  
277 - actionmailer (= 3.2.8)  
278 - actionpack (= 3.2.8)  
279 - activerecord (= 3.2.8)  
280 - activeresource (= 3.2.8)  
281 - activesupport (= 3.2.8) 312 + rails (3.2.9)
  313 + actionmailer (= 3.2.9)
  314 + actionpack (= 3.2.9)
  315 + activerecord (= 3.2.9)
  316 + activeresource (= 3.2.9)
  317 + activesupport (= 3.2.9)
282 bundler (~> 1.0) 318 bundler (~> 1.0)
283 - railties (= 3.2.8) 319 + railties (= 3.2.9)
284 rails-dev-tweaks (0.6.1) 320 rails-dev-tweaks (0.6.1)
285 actionpack (~> 3.1) 321 actionpack (~> 3.1)
286 railties (~> 3.1) 322 railties (~> 3.1)
287 - railties (3.2.8)  
288 - actionpack (= 3.2.8)  
289 - activesupport (= 3.2.8) 323 + railties (3.2.9)
  324 + actionpack (= 3.2.9)
  325 + activesupport (= 3.2.9)
290 rack-ssl (~> 1.3.2) 326 rack-ssl (~> 1.3.2)
291 rake (>= 0.8.7) 327 rake (>= 0.8.7)
292 rdoc (~> 3.4) 328 rdoc (~> 3.4)
293 thor (>= 0.14.6, < 2.0) 329 thor (>= 0.14.6, < 2.0)
294 - raindrops (0.9.0)  
295 - rake (0.9.2.2)  
296 - raphael-rails (1.5.2)  
297 - rb-fsevent (0.9.1) 330 + raindrops (0.10.0)
  331 + rake (10.0.1)
  332 + raphael-rails (2.1.0)
  333 + rb-fsevent (0.9.2)
298 rb-inotify (0.8.8) 334 rb-inotify (0.8.8)
299 ffi (>= 0.5.0) 335 ffi (>= 0.5.0)
300 rdoc (3.12) 336 rdoc (3.12)
301 json (~> 1.4) 337 json (~> 1.4)
302 - redcarpet (2.1.1)  
303 - redis (2.2.2)  
304 - redis-namespace (1.0.3)  
305 - redis (< 3.0.0)  
306 - resque (1.20.0) 338 + redcarpet (2.2.2)
  339 + redis (3.0.2)
  340 + redis-namespace (1.2.1)
  341 + redis (~> 3.0.0)
  342 + resque (1.23.0)
307 multi_json (~> 1.0) 343 multi_json (~> 1.0)
308 - redis-namespace (~> 1.0.2) 344 + redis-namespace (~> 1.0)
309 sinatra (>= 0.9.2) 345 sinatra (>= 0.9.2)
310 vegas (~> 0.1.2) 346 vegas (~> 0.1.2)
311 - resque_mailer (2.0.3)  
312 - actionmailer (>= 3.0.0)  
313 - resque (>= 1.2.3)  
314 - resque_spec (0.11.0) 347 + resque_mailer (2.1.0)
  348 + actionmailer (~> 3.0)
  349 + resque_spec (0.12.5)
315 resque (>= 1.19.0) 350 resque (>= 1.19.0)
316 rspec (>= 2.5.0) 351 rspec (>= 2.5.0)
317 - rspec (2.10.0)  
318 - rspec-core (~> 2.10.0)  
319 - rspec-expectations (~> 2.10.0)  
320 - rspec-mocks (~> 2.10.0)  
321 - rspec-core (2.10.1)  
322 - rspec-expectations (2.10.0) 352 + rspec (2.12.0)
  353 + rspec-core (~> 2.12.0)
  354 + rspec-expectations (~> 2.12.0)
  355 + rspec-mocks (~> 2.12.0)
  356 + rspec-core (2.12.0)
  357 + rspec-expectations (2.12.0)
323 diff-lcs (~> 1.1.3) 358 diff-lcs (~> 1.1.3)
324 - rspec-mocks (2.10.1)  
325 - rspec-rails (2.10.1) 359 + rspec-mocks (2.12.0)
  360 + rspec-rails (2.12.0)
326 actionpack (>= 3.0) 361 actionpack (>= 3.0)
327 activesupport (>= 3.0) 362 activesupport (>= 3.0)
328 railties (>= 3.0) 363 railties (>= 3.0)
329 - rspec (~> 2.10.0) 364 + rspec-core (~> 2.12.0)
  365 + rspec-expectations (~> 2.12.0)
  366 + rspec-mocks (~> 2.12.0)
330 rubyntlm (0.1.1) 367 rubyntlm (0.1.1)
331 - rubyzip (0.9.8)  
332 - sass (3.1.19) 368 + rubyzip (0.9.9)
  369 + sass (3.2.3)
333 sass-rails (3.2.5) 370 sass-rails (3.2.5)
334 railties (~> 3.2.0) 371 railties (~> 3.2.0)
335 sass (>= 3.1.10) 372 sass (>= 3.1.10)
@@ -337,25 +374,24 @@ GEM @@ -337,25 +374,24 @@ GEM
337 seed-fu (2.2.0) 374 seed-fu (2.2.0)
338 activerecord (~> 3.1) 375 activerecord (~> 3.1)
339 activesupport (~> 3.1) 376 activesupport (~> 3.1)
340 - selenium-webdriver (2.22.2) 377 + selenium-webdriver (2.26.0)
341 childprocess (>= 0.2.5) 378 childprocess (>= 0.2.5)
342 - ffi (~> 1.0)  
343 libwebsocket (~> 0.1.3) 379 libwebsocket (~> 0.1.3)
344 multi_json (~> 1.0) 380 multi_json (~> 1.0)
345 rubyzip 381 rubyzip
346 settingslogic (2.0.8) 382 settingslogic (2.0.8)
347 shoulda-matchers (1.3.0) 383 shoulda-matchers (1.3.0)
348 activesupport (>= 3.0.0) 384 activesupport (>= 3.0.0)
349 - simplecov (0.6.4) 385 + simplecov (0.7.1)
350 multi_json (~> 1.0) 386 multi_json (~> 1.0)
351 - simplecov-html (~> 0.5.3)  
352 - simplecov-html (0.5.3)  
353 - sinatra (1.3.2) 387 + simplecov-html (~> 0.7.1)
  388 + simplecov-html (0.7.1)
  389 + sinatra (1.3.3)
354 rack (~> 1.3, >= 1.3.6) 390 rack (~> 1.3, >= 1.3.6)
355 rack-protection (~> 1.2) 391 rack-protection (~> 1.2)
356 tilt (~> 1.3, >= 1.3.3) 392 tilt (~> 1.3, >= 1.3.3)
357 six (0.2.0) 393 six (0.2.0)
358 - slop (2.4.4) 394 + slop (3.3.3)
359 spinach (0.5.2) 395 spinach (0.5.2)
360 colorize 396 colorize
361 gherkin-ruby (~> 0.2.0) 397 gherkin-ruby (~> 0.2.0)
@@ -363,39 +399,43 @@ GEM @@ -363,39 +399,43 @@ GEM
363 capybara (~> 1) 399 capybara (~> 1)
364 railties (>= 3) 400 railties (>= 3)
365 spinach (>= 0.4) 401 spinach (>= 0.4)
366 - sprockets (2.1.3) 402 + sprockets (2.2.1)
367 hike (~> 1.2) 403 hike (~> 1.2)
  404 + multi_json (~> 1.0)
368 rack (~> 1.0) 405 rack (~> 1.0)
369 tilt (~> 1.1, != 1.3.0) 406 tilt (~> 1.1, != 1.3.0)
370 sqlite3 (1.3.6) 407 sqlite3 (1.3.6)
371 - stamp (0.1.6) 408 + stamp (0.3.0)
372 test_after_commit (0.0.1) 409 test_after_commit (0.0.1)
373 - therubyracer (0.10.1) 410 + therubyracer (0.10.2)
374 libv8 (~> 3.3.10) 411 libv8 (~> 3.3.10)
375 - thin (1.3.1) 412 + thin (1.5.0)
376 daemons (>= 1.0.9) 413 daemons (>= 1.0.9)
377 eventmachine (>= 0.12.6) 414 eventmachine (>= 0.12.6)
378 rack (>= 1.0.0) 415 rack (>= 1.0.0)
379 thor (0.16.0) 416 thor (0.16.0)
380 tilt (1.3.3) 417 tilt (1.3.3)
381 - treetop (1.4.10) 418 + treetop (1.4.12)
382 polyglot 419 polyglot
383 polyglot (>= 0.3.1) 420 polyglot (>= 0.3.1)
384 - tzinfo (0.3.33)  
385 - uglifier (1.0.3) 421 + tzinfo (0.3.35)
  422 + uglifier (1.3.0)
386 execjs (>= 0.3.0) 423 execjs (>= 0.3.0)
387 - multi_json (>= 1.0.2)  
388 - unicorn (4.3.1) 424 + multi_json (~> 1.0, >= 1.0.2)
  425 + unicorn (4.4.0)
389 kgio (~> 2.6) 426 kgio (~> 2.6)
390 rack 427 rack
391 raindrops (~> 0.7) 428 raindrops (~> 0.7)
392 vegas (0.1.11) 429 vegas (0.1.11)
393 rack (>= 1.0.0) 430 rack (>= 1.0.0)
  431 + virtus (0.5.2)
  432 + backports (~> 2.6.1)
394 warden (1.2.1) 433 warden (1.2.1)
395 rack (>= 1.0) 434 rack (>= 1.0)
396 - webmock (1.8.7) 435 + webmock (1.9.0)
397 addressable (>= 2.2.7) 436 addressable (>= 2.2.7)
398 crack (>= 0.1.7) 437 crack (>= 0.1.7)
  438 + websocket (1.0.2)
399 xpath (0.1.4) 439 xpath (0.1.4)
400 nokogiri (~> 1.3) 440 nokogiri (~> 1.3)
401 yajl-ruby (1.1.0) 441 yajl-ruby (1.1.0)
@@ -404,71 +444,71 @@ PLATFORMS @@ -404,71 +444,71 @@ PLATFORMS
404 ruby 444 ruby
405 445
406 DEPENDENCIES 446 DEPENDENCIES
407 - acts-as-taggable-on (= 2.3.1) 447 + acts-as-taggable-on (= 2.3.3)
408 annotate! 448 annotate!
409 awesome_print 449 awesome_print
410 - bootstrap-sass (= 2.0.4) 450 + bootstrap-sass (= 2.2.1.1)
411 capybara 451 capybara
412 - capybara-webkit  
413 - carrierwave  
414 - charlock_holmes  
415 - chosen-rails  
416 - coffee-rails (= 3.2.2) 452 + carrierwave (~> 0.7.1)
  453 + chosen-rails (= 0.9.8)
  454 + coffee-rails (~> 3.2.2)
417 colored 455 colored
418 database_cleaner 456 database_cleaner
419 devise (~> 2.1.0) 457 devise (~> 2.1.0)
420 - draper 458 + draper (~> 0.18.0)
421 email_spec 459 email_spec
422 factory_girl_rails 460 factory_girl_rails
423 ffaker 461 ffaker
424 font-awesome-sass-rails (~> 2.0.0) 462 font-awesome-sass-rails (~> 2.0.0)
425 foreman 463 foreman
426 - gemoji 464 + gemoji (~> 1.2.1)
427 git 465 git
428 github-linguist (~> 2.3.4) 466 github-linguist (~> 2.3.4)
429 github-markup (~> 0.7.4) 467 github-markup (~> 0.7.4)
430 - gitlab_meta (= 3.0) 468 + gitlab_meta (= 3.1)
431 gitolite (= 1.1.0) 469 gitolite (= 1.1.0)
432 grack! 470 grack!
433 grape (~> 0.2.1) 471 grape (~> 0.2.1)
434 grit! 472 grit!
  473 + grit_ext!
435 growl 474 growl
436 guard-rspec 475 guard-rspec
437 guard-spinach 476 guard-spinach
438 - haml-rails  
439 - headless 477 + haml-rails (~> 0.3.5)
440 httparty 478 httparty
441 jquery-atwho-rails (= 0.1.6) 479 jquery-atwho-rails (= 0.1.6)
442 - jquery-rails (= 2.0.2)  
443 - jquery-ui-rails (= 0.5.0)  
444 - kaminari 480 + jquery-rails (= 2.1.3)
  481 + jquery-ui-rails (= 2.0.2)
  482 + kaminari (~> 0.14.1)
445 launchy 483 launchy
446 letter_opener 484 letter_opener
447 - modernizr (= 2.5.3) 485 + modernizr (= 2.6.2)
448 mysql2 486 mysql2
449 - omniauth 487 + omniauth (~> 1.1.1)
450 omniauth-github 488 omniauth-github
451 omniauth-google-oauth2 489 omniauth-google-oauth2
452 omniauth-ldap! 490 omniauth-ldap!
453 omniauth-twitter 491 omniauth-twitter
454 pg 492 pg
  493 + poltergeist
455 pry 494 pry
456 - pygments.rb (= 0.3.1) 495 + pygments.rb!
  496 + quiet_assets (~> 1.0.1)
457 rack-mini-profiler 497 rack-mini-profiler
458 - rails (= 3.2.8) 498 + rails (= 3.2.9)
459 rails-dev-tweaks 499 rails-dev-tweaks
460 - raphael-rails (= 1.5.2) 500 + raphael-rails (= 2.1.0)
461 rb-fsevent 501 rb-fsevent
462 rb-inotify 502 rb-inotify
463 - redcarpet (~> 2.1.1)  
464 - resque (~> 1.20.0) 503 + redcarpet (~> 2.2.2)
  504 + resque (~> 1.23.0)
465 resque_mailer 505 resque_mailer
466 resque_spec 506 resque_spec
467 rspec-rails 507 rspec-rails
468 - sass-rails (= 3.2.5) 508 + sass-rails (~> 3.2.5)
469 seed-fu 509 seed-fu
470 settingslogic 510 settingslogic
471 - shoulda-matchers 511 + shoulda-matchers (= 1.3.0)
472 simplecov 512 simplecov
473 six 513 six
474 spinach-rails 514 spinach-rails
@@ -476,8 +516,8 @@ DEPENDENCIES @@ -476,8 +516,8 @@ DEPENDENCIES
476 stamp 516 stamp
477 test_after_commit 517 test_after_commit
478 therubyracer 518 therubyracer
479 - thin  
480 - uglifier (= 1.0.3)  
481 - unicorn 519 + thin (~> 1.5.0)
  520 + uglifier (~> 1.3.0)
  521 + unicorn (~> 4.4.0)
482 webmock 522 webmock
483 yaml_db! 523 yaml_db!
Procfile.production
@@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
1 -web: bundle exec rails s -p $PORT -e production  
2 -worker: bundle exec rake environment resque:work RAILS_ENV=production QUEUE=*  
@@ -13,7 +13,7 @@ GitLab is a free project and repository management application @@ -13,7 +13,7 @@ GitLab is a free project and repository management application
13 13
14 * Ubuntu/Debian 14 * Ubuntu/Debian
15 * ruby 1.9.3+ 15 * ruby 1.9.3+
16 -* mysql or sqlite 16 +* MySQL
17 * git 17 * git
18 * gitolite 18 * gitolite
19 * redis 19 * redis
ROADMAP.md 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +## GitLab Roadmap
  2 +
  3 +### Common
  4 +
  5 +* Help page for service tasks like repos import, backup etc
  6 +* Hide last push widget after following link
  7 +* Add comment events
  8 +* gitolite namespaces for projects per user/group. It will allow us same project names for different users
  9 +
  10 +### Issues
  11 +
  12 +* labels autocomplete via jquery autocomplete
  13 +* Import/Export issues
  14 +* Form: Assign to me link right to the selectbox
  15 +
  16 +### Merge Request
  17 +
  18 +* Save code fragments with MR comments
  19 +
  20 +### Services
  21 +
  22 +* Campfire integration service
  23 +* Hipchat integration service
  24 +* Travis CI integration service
  25 +* Jenkins CI integration service
1 -3.0.3 1 +3.1.0
app/assets/images/event_filter_comments.png 0 → 100644

750 Bytes

app/assets/images/event_filter_merged.png 0 → 100644

463 Bytes

app/assets/images/event_filter_push.png 0 → 100644

632 Bytes

app/assets/images/event_filter_team.png 0 → 100644

1.31 KB

app/assets/images/gitlab_classic.png

2.98 KB

app/assets/images/gitlab_default.png

6.28 KB

app/assets/images/gitlab_modern.png

3.8 KB

app/assets/images/logo_dark.png

2.79 KB | W: | H:

2.53 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/logo_white.png

1.64 KB | W: | H:

1.48 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/service-disabled-gitlab-ci.png 0 → 100644

2.13 KB

app/assets/images/service-gitlab-ci.png 0 → 100644

2.34 KB

app/assets/images/trans_bg.gif 0 → 100644

58 Bytes

app/assets/javascripts/application.js
@@ -13,10 +13,13 @@ @@ -13,10 +13,13 @@
13 //= require jquery.history 13 //= require jquery.history
14 //= require jquery.waitforimages 14 //= require jquery.waitforimages
15 //= require jquery.atwho 15 //= require jquery.atwho
  16 +//= require jquery.scrollto
16 //= require bootstrap 17 //= require bootstrap
17 //= require modernizr 18 //= require modernizr
18 //= require chosen-jquery 19 //= require chosen-jquery
19 //= require raphael 20 //= require raphael
  21 +//= require g.raphael-min
  22 +//= require g.bar-min
20 //= require branch-graph 23 //= require branch-graph
21 //= require ace-src-noconflict/ace 24 //= require ace-src-noconflict/ace
22 //= require_tree . 25 //= require_tree .
app/assets/javascripts/gfm_auto_complete.js.coffee
  1 +# Creates the variables for setting up GFM auto-completion
  2 +
  3 +window.GitLab ?= {}
  4 +GitLab.GfmAutoComplete ?= {}
1 5
2 -###  
3 - Creates the variables for setting up GFM auto-completion  
4 -###  
5 # Emoji 6 # Emoji
6 -window.autocompleteEmojiData = [];  
7 -window.autocompleteEmojiTemplate = "<li data-value='${insert}'>${name} <img alt='${name}' height='20' src='${image}' width='20' /></li>"; 7 +data = []
  8 +template = "<li data-value='${insert}'>${name} <img alt='${name}' height='20' src='${image}' width='20' /></li>"
  9 +GitLab.GfmAutoComplete.Emoji = {data, template}
8 10
9 # Team Members 11 # Team Members
10 -window.autocompleteMembersUrl = "";  
11 -window.autocompleteMembersParams =  
12 - private_token: ""  
13 - page: 1  
14 -window.autocompleteMembersData = [];  
15 -  
16 -  
17 -  
18 -###  
19 - Add GFM auto-completion to all input fields, that accept GFM input.  
20 -###  
21 -window.setupGfmAutoComplete = ->  
22 - ###  
23 - Emoji  
24 - ###  
25 - $('.gfm-input').atWho ':',  
26 - data: autocompleteEmojiData,  
27 - tpl: autocompleteEmojiTemplate  
28 -  
29 - ###  
30 - Team Members  
31 - ###  
32 - $('.gfm-input').atWho '@', (query, callback) -> 12 +data = []
  13 +url = '';
  14 +params = {private_token: '', page: 1}
  15 +GitLab.GfmAutoComplete.Members = {data, url, params}
  16 +
  17 +# Add GFM auto-completion to all input fields, that accept GFM input.
  18 +GitLab.GfmAutoComplete.setup = ->
  19 + input = $('.js-gfm-input')
  20 +
  21 + # Emoji
  22 + input.atWho ':',
  23 + data: GitLab.GfmAutoComplete.Emoji.data,
  24 + tpl: GitLab.GfmAutoComplete.Emoji.template
  25 +
  26 + # Team Members
  27 + input.atWho '@', (query, callback) ->
33 (getMoreMembers = -> 28 (getMoreMembers = ->
34 - $.getJSON(autocompleteMembersUrl, autocompleteMembersParams) 29 + $.getJSON(GitLab.GfmAutoComplete.Members.url, GitLab.GfmAutoComplete.Members.params)
35 .success (members) -> 30 .success (members) ->
36 # pick the data we need 31 # pick the data we need
37 - newMembersData = $.map members, (m) -> m.name 32 + newMembersData = $.map(members, (m) -> m.name )
38 33
39 # add the new page of data to the rest 34 # add the new page of data to the rest
40 - $.merge autocompleteMembersData, newMembersData 35 + $.merge(GitLab.GfmAutoComplete.Members.data, newMembersData)
41 36
42 # show the pop-up with a copy of the current data 37 # show the pop-up with a copy of the current data
43 - callback autocompleteMembersData[..] 38 + callback(GitLab.GfmAutoComplete.Members.data[..])
44 39
45 # are we past the last page? 40 # are we past the last page?
46 - if newMembersData.length == 0 41 + if newMembersData.length is 0
47 # set static data and stop callbacks 42 # set static data and stop callbacks
48 - $('.gfm-input').atWho '@',  
49 - data: autocompleteMembersData 43 + input.atWho '@',
  44 + data: GitLab.GfmAutoComplete.Members.data
50 callback: null 45 callback: null
51 else 46 else
52 # get next page 47 # get next page
53 getMoreMembers() 48 getMoreMembers()
54 49
55 # so the next request gets the next page 50 # so the next request gets the next page
56 - autocompleteMembersParams.page += 1;  
57 - ).call();  
58 \ No newline at end of file 51 \ No newline at end of file
  52 + GitLab.GfmAutoComplete.Members.params.page += 1
  53 + ).call()
app/assets/javascripts/graph.js.coffee
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -initGraphNav = ->  
2 - $('.graph svg').css 'position', 'relative'  
3 -  
4 - $('body').bind 'keyup', (e) ->  
5 - if e.keyCode is 37 # left  
6 - $('.graph svg').animate left: '+=400'  
7 - else if e.keyCode is 39 # right  
8 - $('.graph svg').animate left: '-=400'  
9 -  
10 -window.initGraphNav = initGraphNav  
app/assets/javascripts/issues.js
1 -function switchToNewIssue(form){ 1 +function switchToNewIssue(){
2 $(".issues_content").hide("fade", { direction: "left" }, 150, function(){ 2 $(".issues_content").hide("fade", { direction: "left" }, 150, function(){
3 - $(".issues_content").after(form);  
4 $('select#issue_assignee_id').chosen(); 3 $('select#issue_assignee_id').chosen();
5 $('select#issue_milestone_id').chosen(); 4 $('select#issue_milestone_id').chosen();
6 $("#new_issue_dialog").show("fade", { direction: "right" }, 150); 5 $("#new_issue_dialog").show("fade", { direction: "right" }, 150);
7 $('.top-tabs .add_new').hide(); 6 $('.top-tabs .add_new').hide();
8 disableButtonIfEmptyField("#issue_title", ".save-btn"); 7 disableButtonIfEmptyField("#issue_title", ".save-btn");
9 - setupGfmAutoComplete(); 8 + GitLab.GfmAutoComplete.setup();
10 }); 9 });
11 } 10 }
12 11
13 -function switchToEditIssue(form){ 12 +function switchToEditIssue(){
14 $(".issues_content").hide("fade", { direction: "left" }, 150, function(){ 13 $(".issues_content").hide("fade", { direction: "left" }, 150, function(){
15 - $(".issues_content").after(form);  
16 $('select#issue_assignee_id').chosen(); 14 $('select#issue_assignee_id').chosen();
17 $('select#issue_milestone_id').chosen(); 15 $('select#issue_milestone_id').chosen();
18 $("#edit_issue_dialog").show("fade", { direction: "right" }, 150); 16 $("#edit_issue_dialog").show("fade", { direction: "right" }, 150);
19 $('.add_new').hide(); 17 $('.add_new').hide();
20 disableButtonIfEmptyField("#issue_title", ".save-btn"); 18 disableButtonIfEmptyField("#issue_title", ".save-btn");
21 - setupGfmAutoComplete(); 19 + GitLab.GfmAutoComplete.setup();
22 }); 20 });
23 } 21 }
24 22
@@ -33,18 +31,18 @@ function switchFromEditIssue(){ @@ -33,18 +31,18 @@ function switchFromEditIssue(){
33 function backToIssues(){ 31 function backToIssues(){
34 $("#edit_issue_dialog, #new_issue_dialog").hide("fade", { direction: "right" }, 150, function(){ 32 $("#edit_issue_dialog, #new_issue_dialog").hide("fade", { direction: "right" }, 150, function(){
35 $(".issues_content").show("fade", { direction: "left" }, 150, function() { 33 $(".issues_content").show("fade", { direction: "left" }, 150, function() {
36 - $("#edit_issue_dialog").remove();  
37 - $("#new_issue_dialog").remove(); 34 + $("#edit_issue_dialog").html("");
  35 + $("#new_issue_dialog").html("");
38 $('.add_new').show(); 36 $('.add_new').show();
39 }); 37 });
40 }); 38 });
41 } 39 }
42 40
43 function initIssuesSearch() { 41 function initIssuesSearch() {
44 - var href = $('.issue_search').parent().attr('action'); 42 + var href = $('#issue_search_form').attr('action');
45 var last_terms = ''; 43 var last_terms = '';
46 44
47 - $('.issue_search').keyup(function() { 45 + $('#issue_search').keyup(function() {
48 var terms = $(this).val(); 46 var terms = $(this).val();
49 var milestone_id = $('#milestone_id').val(); 47 var milestone_id = $('#milestone_id').val();
50 var status = $('#status').val(); 48 var status = $('#status').val();
@@ -59,10 +57,6 @@ function initIssuesSearch() { @@ -59,10 +57,6 @@ function initIssuesSearch() {
59 } 57 }
60 } 58 }
61 }); 59 });
62 -  
63 - $('.delete-issue').live('ajax:success', function() {  
64 - $(this).closest('tr').fadeOut(); updatePage();  
65 - });  
66 } 60 }
67 61
68 /** 62 /**
app/assets/javascripts/loader.js.coffee
@@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
1 -Loader =  
2 - html: (width) ->  
3 - $('<img>').attr src: '/assets/ajax-loader.gif', width: width  
4 -  
5 -window.Loader = Loader  
app/assets/javascripts/main.js.coffee
@@ -7,29 +7,36 @@ window.slugify = (text) -&gt; @@ -7,29 +7,36 @@ window.slugify = (text) -&gt;
7 window.ajaxGet = (url) -> 7 window.ajaxGet = (url) ->
8 $.ajax({type: "GET", url: url, dataType: "script"}) 8 $.ajax({type: "GET", url: url, dataType: "script"})
9 9
10 - # Disable button if text field is empty 10 +# Disable button if text field is empty
11 window.disableButtonIfEmptyField = (field_selector, button_selector) -> 11 window.disableButtonIfEmptyField = (field_selector, button_selector) ->
12 field = $(field_selector) 12 field = $(field_selector)
13 closest_submit = field.closest("form").find(button_selector) 13 closest_submit = field.closest("form").find(button_selector)
14 14
15 closest_submit.disable() if field.val() is "" 15 closest_submit.disable() if field.val() is ""
16 16
17 - field.on "keyup", ->  
18 - if $(this).val() is "" 17 + field.on "input", ->
  18 + if $(@).val() is ""
19 closest_submit.disable() 19 closest_submit.disable()
20 else 20 else
21 closest_submit.enable() 21 closest_submit.enable()
22 22
23 $ -> 23 $ ->
24 # Click a .one_click_select field, select the contents 24 # Click a .one_click_select field, select the contents
25 - $(".one_click_select").live 'click', -> $(this).select() 25 + $(".one_click_select").on 'click', -> $(@).select()
26 26
27 # Initialize chosen selects 27 # Initialize chosen selects
28 $('select.chosen').chosen() 28 $('select.chosen').chosen()
29 29
  30 + # Initialize tooltips
  31 + $('.has_tooltip').tooltip()
  32 +
  33 + # Bottom tooltip
  34 + $('.has_bottom_tooltip').tooltip(placement: 'bottom')
  35 +
  36 +
30 # Disable form buttons while a form is submitting 37 # Disable form buttons while a form is submitting
31 $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> 38 $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) ->
32 - buttons = $('[type="submit"]', this) 39 + buttons = $('[type="submit"]', @)
33 40
34 switch e.type 41 switch e.type
35 when 'ajax:beforeSend', 'submit' 42 when 'ajax:beforeSend', 'submit'
@@ -38,7 +45,7 @@ $ -&gt; @@ -38,7 +45,7 @@ $ -&gt;
38 buttons.enable() 45 buttons.enable()
39 46
40 # Show/Hide the profile menu when hovering the account box 47 # Show/Hide the profile menu when hovering the account box
41 - $('.account-box').hover -> $(this).toggleClass('hover') 48 + $('.account-box').hover -> $(@).toggleClass('hover')
42 49
43 # Focus search field by pressing 's' key 50 # Focus search field by pressing 's' key
44 $(document).keypress (e) -> 51 $(document).keypress (e) ->
@@ -52,41 +59,22 @@ $ -&gt; @@ -52,41 +59,22 @@ $ -&gt;
52 59
53 # Commit show suppressed diff 60 # Commit show suppressed diff
54 $(".supp_diff_link").bind "click", -> 61 $(".supp_diff_link").bind "click", ->
55 - $(this).next('table').show()  
56 - $(this).remove()  
57 -  
58 - # Note markdown preview  
59 - $(document).on 'click', '#preview-link', (e) ->  
60 - $('#preview-note').text('Loading...')  
61 -  
62 - previewLinkText = if $(this).text() == 'Preview' then 'Edit' else 'Preview'  
63 - $(this).text(previewLinkText)  
64 -  
65 - note = $('#note_note').val()  
66 -  
67 - if note.trim().length == 0  
68 - $('#preview-note').text("Nothing to preview.")  
69 - else  
70 - $.post $(this).attr('href'), {note: note}, (data) ->  
71 - $('#preview-note').html(data)  
72 -  
73 - $('#preview-note, #note_note').toggle()  
74 - e.preventDefault()  
75 - false 62 + $(@).next('table').show()
  63 + $(@).remove()
76 64
77 (($) -> 65 (($) ->
78 _chosen = $.fn.chosen 66 _chosen = $.fn.chosen
79 $.fn.extend chosen: (options) -> 67 $.fn.extend chosen: (options) ->
80 default_options = search_contains: "true" 68 default_options = search_contains: "true"
81 $.extend default_options, options 69 $.extend default_options, options
82 - _chosen.apply this, [default_options] 70 + _chosen.apply @, [default_options]
83 71
84 # Disable an element and add the 'disabled' Bootstrap class 72 # Disable an element and add the 'disabled' Bootstrap class
85 $.fn.extend disable: -> 73 $.fn.extend disable: ->
86 - $(this).attr('disabled', 'disabled').addClass('disabled') 74 + $(@).attr('disabled', 'disabled').addClass('disabled')
87 75
88 # Enable an element and remove the 'disabled' Bootstrap class 76 # Enable an element and remove the 'disabled' Bootstrap class
89 $.fn.extend enable: -> 77 $.fn.extend enable: ->
90 - $(this).removeAttr('disabled').removeClass('disabled') 78 + $(@).removeAttr('disabled').removeClass('disabled')
91 79
92 )(jQuery) 80 )(jQuery)
app/assets/javascripts/merge_requests.js
@@ -115,4 +115,15 @@ var MergeRequest = { @@ -115,4 +115,15 @@ var MergeRequest = {
115 $(".merge_in_progress").hide(); 115 $(".merge_in_progress").hide();
116 $(".automerge_widget.already_cannot_be_merged").show(); 116 $(".automerge_widget.already_cannot_be_merged").show();
117 } 117 }
  118 +};
  119 +
  120 +/*
  121 + * Filter merge requests
  122 + */
  123 +function merge_requestsPage() {
  124 + $("#assignee_id").chosen();
  125 + $("#milestone_id").chosen();
  126 + $("#milestone_id, #assignee_id").on("change", function(){
  127 + $(this).closest("form").submit();
  128 + });
118 } 129 }
app/assets/javascripts/milestones.js.coffee
@@ -5,3 +5,10 @@ $ -&gt; @@ -5,3 +5,10 @@ $ -&gt;
5 $('.milestone-issue-filter li').toggleClass('active') 5 $('.milestone-issue-filter li').toggleClass('active')
6 $('.milestone-issue-filter tr[data-closed]').toggleClass('hide') 6 $('.milestone-issue-filter tr[data-closed]').toggleClass('hide')
7 false 7 false
  8 +
  9 + $('.milestone-merge-requests-filter tr[data-closed]').addClass('hide')
  10 +
  11 + $('.milestone-merge-requests-filter ul.nav li a').click ->
  12 + $('.milestone-merge-requests-filter li').toggleClass('active')
  13 + $('.milestone-merge-requests-filter tr[data-closed]').toggleClass('hide')
  14 + false
app/assets/javascripts/notes.js
@@ -14,8 +14,8 @@ var NoteList = { @@ -14,8 +14,8 @@ var NoteList = {
14 this.notes_path = path + ".js"; 14 this.notes_path = path + ".js";
15 this.target_id = tid; 15 this.target_id = tid;
16 this.target_type = tt; 16 this.target_type = tt;
17 - this.reversed = $("#notes-list").hasClass("reversed");  
18 - this.target_params = "&target_type=" + this.target_type + "&target_id=" + this.target_id; 17 + this.reversed = $("#notes-list").is(".reversed");
  18 + this.target_params = "target_type=" + this.target_type + "&target_id=" + this.target_id;
19 19
20 // get initial set of notes 20 // get initial set of notes
21 this.getContent(); 21 this.getContent();
@@ -33,6 +33,8 @@ var NoteList = { @@ -33,6 +33,8 @@ var NoteList = {
33 33
34 $(".note-form-holder").on("ajax:complete", function(){ 34 $(".note-form-holder").on("ajax:complete", function(){
35 $(".submit_note").enable(); 35 $(".submit_note").enable();
  36 + $('#preview-note').hide();
  37 + $('#note_note').show();
36 }) 38 })
37 39
38 disableButtonIfEmptyField(".note-text", ".submit_note"); 40 disableButtonIfEmptyField(".note-text", ".submit_note");
@@ -52,6 +54,26 @@ var NoteList = { @@ -52,6 +54,26 @@ var NoteList = {
52 $('.note_advanced_opts').show(); 54 $('.note_advanced_opts').show();
53 }); 55 });
54 } 56 }
  57 +
  58 + // Setup note preview
  59 + $(document).on('click', '#preview-link', function(e) {
  60 + $('#preview-note').text('Loading...');
  61 +
  62 + $(this).text($(this).text() === "Edit" ? "Preview" : "Edit");
  63 +
  64 + var note_text = $('#note_note').val();
  65 +
  66 + if(note_text.trim().length === 0) {
  67 + $('#preview-note').text('Nothing to preview.');
  68 + } else {
  69 + $.post($(this).attr('href'), {note: note_text}).success(function(data) {
  70 + $('#preview-note').html(data);
  71 + });
  72 + }
  73 +
  74 + $('#preview-note, #note_note').toggle();
  75 + e.preventDefault();
  76 + });
55 }, 77 },
56 78
57 79
@@ -69,7 +91,7 @@ var NoteList = { @@ -69,7 +91,7 @@ var NoteList = {
69 $.ajax({ 91 $.ajax({
70 type: "GET", 92 type: "GET",
71 url: this.notes_path, 93 url: this.notes_path,
72 - data: "?" + this.target_params, 94 + data: this.target_params,
73 complete: function(){ $('.notes-status').removeClass("loading")}, 95 complete: function(){ $('.notes-status').removeClass("loading")},
74 beforeSend: function() { $('.notes-status').addClass("loading") }, 96 beforeSend: function() { $('.notes-status').addClass("loading") },
75 dataType: "script"}); 97 dataType: "script"});
@@ -131,7 +153,7 @@ var NoteList = { @@ -131,7 +153,7 @@ var NoteList = {
131 $.ajax({ 153 $.ajax({
132 type: "GET", 154 type: "GET",
133 url: this.notes_path, 155 url: this.notes_path,
134 - data: "loading_more=1&" + (this.reversed ? "before_id" : "after_id") + "=" + this.bottom_id + this.target_params, 156 + data: this.target_params + "&loading_more=1&" + (this.reversed ? "before_id" : "after_id") + "=" + this.bottom_id,
135 complete: function(){ $('.notes-status').removeClass("loading")}, 157 complete: function(){ $('.notes-status').removeClass("loading")},
136 beforeSend: function() { $('.notes-status').addClass("loading") }, 158 beforeSend: function() { $('.notes-status').addClass("loading") },
137 dataType: "script"}); 159 dataType: "script"});
@@ -192,7 +214,7 @@ var NoteList = { @@ -192,7 +214,7 @@ var NoteList = {
192 $.ajax({ 214 $.ajax({
193 type: "GET", 215 type: "GET",
194 url: this.notes_path, 216 url: this.notes_path,
195 - data: "loading_new=1&after_id=" + (this.reversed ? this.top_id : this.bottom_id) + this.target_params, 217 + data: this.target_params + "&loading_new=1&after_id=" + (this.reversed ? this.top_id : this.bottom_id),
196 dataType: "script"}); 218 dataType: "script"});
197 }, 219 },
198 220
@@ -264,7 +286,7 @@ var PerLineNotes = { @@ -264,7 +286,7 @@ var PerLineNotes = {
264 $(this).closest("tr").after(form); 286 $(this).closest("tr").after(form);
265 form.find("#note_line_code").val($(this).data("lineCode")); 287 form.find("#note_line_code").val($(this).data("lineCode"));
266 form.show(); 288 form.show();
267 - return false; 289 + e.preventDefault();
268 }); 290 });
269 291
270 disableButtonIfEmptyField(".line-note-text", ".submit_inline_note"); 292 disableButtonIfEmptyField(".line-note-text", ".submit_inline_note");
@@ -285,7 +307,7 @@ var PerLineNotes = { @@ -285,7 +307,7 @@ var PerLineNotes = {
285 // elements must really be removed for this to work reliably 307 // elements must really be removed for this to work reliably
286 var trLine = trNote.prev(); 308 var trLine = trNote.prev();
287 var trRpl = trNote.next(); 309 var trRpl = trNote.next();
288 - if (trLine.hasClass("line_holder") && trRpl.hasClass("reply")) { 310 + if (trLine.is(".line_holder") && trRpl.is(".reply")) {
289 trRpl.fadeOut(function() { $(this).remove(); }); 311 trRpl.fadeOut(function() { $(this).remove(); });
290 } 312 }
291 }); 313 });
app/assets/javascripts/profile.js.coffee 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +$ ->
  2 + $('.edit_user .application-theme input, .edit_user .code-preview-theme input').click ->
  3 + # Hide any previous submission feedback
  4 + $('.edit_user .update-feedback').hide()
  5 +
  6 + # Submit the form
  7 + $('.edit_user').submit()
  8 +
  9 + # Go up the hierarchy and show the corresponding submission feedback element
  10 + $(@).closest('fieldset').find('.update-feedback').show('highlight', {color: '#DFF0D8'}, 500)
app/assets/javascripts/projects.js.coffee
@@ -22,3 +22,10 @@ $ -&gt; @@ -22,3 +22,10 @@ $ -&gt;
22 # Ref switcher 22 # Ref switcher
23 $('.project-refs-select').on 'change', -> 23 $('.project-refs-select').on 'change', ->
24 $(@).parents('form').submit() 24 $(@).parents('form').submit()
  25 +
  26 +class @GraphNav
  27 + @init: ->
  28 + $('.graph svg').css 'position', 'relative'
  29 + $('body').bind 'keyup', (e) ->
  30 + $('.graph svg').animate(left: '+=400') if e.keyCode is 37 # left
  31 + $('.graph svg').animate(left: '-=400') if e.keyCode is 39 # right
app/assets/javascripts/snippets.js.coffee
@@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
1 -$ ->  
2 - $('#snippets-table .snippet').live 'click', (e) ->  
3 - if e.target.nodeName isnt 'A' and e.target.nodeName isnt 'INPUT'  
4 - location.href = $(@).attr 'url'  
5 - e.stopPropagation()  
6 - false  
app/assets/javascripts/tree.js.coffee
@@ -17,23 +17,40 @@ $ -&gt; @@ -17,23 +17,40 @@ $ -&gt;
17 "ajax:beforeSend": -> $('.tree_progress').addClass("loading") 17 "ajax:beforeSend": -> $('.tree_progress').addClass("loading")
18 "ajax:complete": -> $('.tree_progress').removeClass("loading") 18 "ajax:complete": -> $('.tree_progress').removeClass("loading")
19 19
20 -# Maintain forward/back history while browsing the file tree  
21 -  
22 -((window) ->  
23 - History = window.History  
24 - $ = window.jQuery  
25 - document = window.document  
26 -  
27 - # Check to see if History.js is enabled for our Browser  
28 - unless History.enabled  
29 - return false  
30 -  
31 - $ ->  
32 - $('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live 'click', (e) ->  
33 - History.pushState(null, null, $(@).attr('href'))  
34 - return false  
35 -  
36 - History.Adapter.bind window, 'statechange', ->  
37 - state = History.getState()  
38 - window.ajaxGet(state.url)  
39 -)(window) 20 + # Maintain forward/back history while browsing the file tree
  21 + ((window) ->
  22 + History = window.History
  23 + $ = window.jQuery
  24 + document = window.document
  25 +
  26 + # Check to see if History.js is enabled for our Browser
  27 + unless History.enabled
  28 + return false
  29 +
  30 + $('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live 'click', (e) ->
  31 + History.pushState(null, null, $(@).attr('href'))
  32 + return false
  33 +
  34 + History.Adapter.bind window, 'statechange', ->
  35 + state = History.getState()
  36 + window.ajaxGet(state.url)
  37 + )(window)
  38 +
  39 + # See if there are lines selected
  40 + # "#L12" and "#L34-56" supported
  41 + highlightBlobLines = ->
  42 + if window.location.hash isnt ""
  43 + matches = window.location.hash.match(/\#L(\d+)(\-(\d+))?/)
  44 + first_line = parseInt(matches?[1])
  45 + last_line = parseInt(matches?[3])
  46 +
  47 + unless isNaN first_line
  48 + last_line = first_line if isNaN(last_line)
  49 + $("#tree-content-holder .highlight .line").removeClass("hll")
  50 + $("#LC#{line}").addClass("hll") for line in [first_line..last_line]
  51 + $("#L#{first_line}").ScrollTo()
  52 +
  53 + # Highlight the correct lines on load
  54 + highlightBlobLines()
  55 + # Highlight the correct lines when the hash part of the URL changes
  56 + $(window).on 'hashchange', highlightBlobLines
app/assets/stylesheets/common.scss
@@ -20,18 +20,6 @@ body { @@ -20,18 +20,6 @@ body {
20 float:right; 20 float:right;
21 } 21 }
22 22
23 -.profile_avatar_holder {  
24 - float:left;  
25 - width:60px;  
26 - height:60px;  
27 - margin-right:20px;  
28 - img {  
29 - width:60px;  
30 - height:60px;  
31 - background:#eee;  
32 - }  
33 -}  
34 -  
35 23
36 .visible_link, 24 .visible_link,
37 .author_link { 25 .author_link {
@@ -596,25 +584,6 @@ li.note { @@ -596,25 +584,6 @@ li.note {
596 } 584 }
597 } 585 }
598 586
599 -.themes_opts {  
600 - padding-left:20px;  
601 -  
602 - label {  
603 - width:175px;  
604 - margin-right:40px;  
605 -  
606 - .prev {  
607 - @extend .thumbnail;  
608 - height:120px;  
609 - width:175px;  
610 - margin-bottom:10px;  
611 - img {  
612 - width:180px;  
613 - }  
614 - }  
615 - }  
616 -}  
617 -  
618 .git_error_tips { 587 .git_error_tips {
619 @extend .span6; 588 @extend .span6;
620 text-align:left; 589 text-align:left;
@@ -628,10 +597,11 @@ li.note { @@ -628,10 +597,11 @@ li.note {
628 597
629 .error_message { 598 .error_message {
630 @extend .cred; 599 @extend .cred;
631 - border-bottom: 1px solid #D21;  
632 - padding-bottom:20px;  
633 - text-align:center;  
634 - margin-bottom:10px; 600 + border-left: 4px solid #E99;
  601 + padding: 10px;
  602 + margin-bottom: 10px;
  603 + background: #FEE;
  604 + padding-left: 20px;
635 } 605 }
636 606
637 .oauth_select_holder { 607 .oauth_select_holder {
@@ -670,3 +640,16 @@ pre { @@ -670,3 +640,16 @@ pre {
670 padding:0; 640 padding:0;
671 } 641 }
672 } 642 }
  643 +
  644 +.milestone .progress {
  645 + margin-bottom: 0;
  646 + margin-top:4px;
  647 +}
  648 +
  649 +.float-link {
  650 + float:left;
  651 + margin-right:15px;
  652 + .s16 {
  653 + margin-right:5px;
  654 + }
  655 +}
app/assets/stylesheets/gitlab_bootstrap/buttons.scss
@@ -94,6 +94,7 @@ @@ -94,6 +94,7 @@
94 &.very_small { 94 &.very_small {
95 font-size:11px; 95 font-size:11px;
96 padding:2px 6px; 96 padding:2px 6px;
  97 + line-height: 16px;
97 margin:2px; 98 margin:2px;
98 } 99 }
99 100
app/assets/stylesheets/gitlab_bootstrap/common.scss
@@ -26,8 +26,10 @@ @@ -26,8 +26,10 @@
26 .underlined { border-bottom: 1px solid #CCC; } 26 .underlined { border-bottom: 1px solid #CCC; }
27 .no-borders { border:none; } 27 .no-borders { border:none; }
28 .vlink { color: $link_color !important; } 28 .vlink { color: $link_color !important; }
  29 +.underlined_link { text-decoration: underline; }
29 .borders { border: 1px solid #ccc; @include shade; } 30 .borders { border: 1px solid #ccc; @include shade; }
30 .hint { font-style: italic; color: #999; } 31 .hint { font-style: italic; color: #999; }
  32 +.light { color: #888 }
31 33
32 /** PILLS & TABS**/ 34 /** PILLS & TABS**/
33 .nav-pills a:hover { background-color:#888; } 35 .nav-pills a:hover { background-color:#888; }
@@ -38,6 +40,7 @@ @@ -38,6 +40,7 @@
38 > a { 40 > a {
39 padding:8px 20px; 41 padding:8px 20px;
40 margin-right: 7px; 42 margin-right: 7px;
  43 + line-height: 19px;
41 border-color: #EEE; 44 border-color: #EEE;
42 color:#888; 45 color:#888;
43 border-bottom: 1px solid #ddd; 46 border-bottom: 1px solid #ddd;
@@ -66,11 +69,12 @@ @@ -66,11 +69,12 @@
66 .alert-message.error { @extend .alert-error; } 69 .alert-message.error { @extend .alert-error; }
67 70
68 /** AVATARS **/ 71 /** AVATARS **/
69 -img.avatar { float:left; margin-right:15px; width:40px; border:1px solid #ddd; padding:1px; }  
70 -img.avatar.s16 { width:16px; height:16px; }  
71 -img.avatar.s24 { width:24px; height:24px; }  
72 -img.avatar.s32 { width:32px; height:32px; } 72 +img.avatar { float:left; margin-right:12px; width:40px; border:1px solid #ddd; padding:1px; }
  73 +img.avatar.s16 { width:16px; height:16px; margin-right:6px; }
  74 +img.avatar.s24 { width:24px; height:24px; margin-right:8px; }
  75 +img.avatar.s32 { width:32px; height:32px; margin-right:10px; }
73 img.lil_av { padding-left: 4px; padding-right:3px; } 76 img.lil_av { padding-left: 4px; padding-right:3px; }
  77 +img.small { width: 80px; }
74 78
75 /** HELPERS **/ 79 /** HELPERS **/
76 .nothing_here_message { text-align:center; padding:20px; color:#777; } 80 .nothing_here_message { text-align:center; padding:20px; color:#777; }
@@ -85,3 +89,5 @@ input[type=&#39;search&#39;].search-text-input { @@ -85,3 +89,5 @@ input[type=&#39;search&#39;].search-text-input {
85 @include border-radius(4px); 89 @include border-radius(4px);
86 border:1px solid #ccc; 90 border:1px solid #ccc;
87 } 91 }
  92 +
  93 +fieldset legend { font-size: 17px; }
app/assets/stylesheets/gitlab_bootstrap/files.scss
@@ -132,35 +132,74 @@ @@ -132,35 +132,74 @@
132 * Code file 132 * Code file
133 */ 133 */
134 &.code { 134 &.code {
135 - padding:0;  
136 - td.code {  
137 - width: 100%;  
138 - .highlight {  
139 - margin-left: 55px;  
140 - overflow:auto;  
141 - overflow-y:hidden;  
142 - }  
143 - }  
144 - .highlight pre {  
145 - white-space: pre;  
146 - word-wrap:normal;  
147 - } 135 + padding: 0;
148 136
149 - table.highlighttable { 137 + table.lines {
150 border: none; 138 border: none;
151 - }  
152 - body.project-page table.highlighttable td { border: none }  
153 - table.highlighttable tr:hover { background:none;} 139 + box-shadow: none;
  140 + margin: 0px;
  141 + padding: 0px;
  142 + table-layout: fixed;
154 143
155 - table.highlighttable pre{  
156 - line-height:16px !important;  
157 - font-size:12px !important;  
158 - } 144 + pre {
  145 + background: none;
  146 + border: none;
  147 + font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
  148 + font-size: 12px !important;
  149 + line-height: 16px !important;
  150 + margin: 0;
  151 + padding: 10px 0;
  152 + }
  153 + td {
  154 + border: none;
  155 + margin: 0;
  156 + padding: 0;
  157 + vertical-align: top;
  158 +
  159 + &:first-child {
  160 + background: #eee;
  161 + width: 50px;
  162 + }
  163 + &:last-child {
  164 + }
  165 + }
  166 + tr:hover {
  167 + background: none;
  168 + }
  169 +
  170 + pre.line_numbers {
  171 + color: #666;
  172 + padding: 10px 6px 10px 0;
  173 + text-align: right;
  174 +
  175 + a {
  176 + color: #666;
  177 +
  178 + i {
  179 + display: none;
  180 + font-size: 14px;
  181 + line-height: 14px;
  182 + }
  183 + &:hover i {
  184 + display: inherit;
  185 + }
  186 + }
  187 + }
159 188
160 - table.highlighttable .linenodiv pre {  
161 - text-align: right;  
162 - padding-right: 4px;  
163 - color:#666; 189 + .highlight {
  190 + border-left: 1px solid #DEE2E3;
  191 + overflow: auto;
  192 + overflow-y: hidden;
  193 +
  194 + pre {
  195 + white-space: pre;
  196 + word-wrap: normal;
  197 +
  198 + .line {
  199 + padding: 0 10px;
  200 + }
  201 + }
  202 + }
164 } 203 }
165 } 204 }
166 } 205 }
app/assets/stylesheets/gitlab_bootstrap/lists.scss
@@ -21,7 +21,7 @@ ul { @@ -21,7 +21,7 @@ ul {
21 .author { color: #999; } 21 .author { color: #999; }
22 22
23 p { 23 p {
24 - padding-top:5px; 24 + padding-top: 1px;
25 margin:0; 25 margin:0;
26 color:#222; 26 color:#222;
27 img { 27 img {
@@ -31,3 +31,11 @@ ul { @@ -31,3 +31,11 @@ ul {
31 } 31 }
32 } 32 }
33 } 33 }
  34 +
  35 +ol, ul {
  36 + &.styled {
  37 + li {
  38 + padding:2px;
  39 + }
  40 + }
  41 +}
app/assets/stylesheets/gitlab_bootstrap/tables.scss
@@ -34,6 +34,11 @@ table { @@ -34,6 +34,11 @@ table {
34 border-color:#f1f1f1; 34 border-color:#f1f1f1;
35 line-height:28px; 35 line-height:28px;
36 36
  37 + .s16 {
  38 + margin-top: 5px;
  39 + margin-right: 5px;
  40 + }
  41 +
37 &:first-child { 42 &:first-child {
38 border-left:1px solid #bbb; 43 border-left:1px solid #bbb;
39 } 44 }
app/assets/stylesheets/gitlab_bootstrap/typography.scss
@@ -2,8 +2,11 @@ @@ -2,8 +2,11 @@
2 * Headers 2 * Headers
3 * 3 *
4 */ 4 */
  5 +
  6 +h1, h2, h3, h4, h5, h6 { margin: 0; }
5 h3, h4, h5, h6 { line-height: 36px; } 7 h3, h4, h5, h6 { line-height: 36px; }
6 h5 { font-size:14px; } 8 h5 { font-size:14px; }
  9 +
7 h3.page_title { 10 h3.page_title {
8 color:#456; 11 color:#456;
9 font-size:20px; 12 font-size:20px;
@@ -11,6 +14,11 @@ h3.page_title { @@ -11,6 +14,11 @@ h3.page_title {
11 line-height: 28px; 14 line-height: 28px;
12 } 15 }
13 16
  17 +h6 {
  18 + color: #888;
  19 + text-transform: uppercase;
  20 +}
  21 +
14 /** CODE **/ 22 /** CODE **/
15 pre { 23 pre {
16 font-family:'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; 24 font-family:'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;
app/assets/stylesheets/highlight/dark.scss
1 -.black .highlighttable {  
2 - td.linenos { border:none; }  
3 - pre { color: #eee }  
4 - .highlight { background: #333; border-left:1px solid #555; } 1 +.black .lines .highlight {
  2 + background: #333;
  3 + pre { color: #eee; }
5 4
6 - .hll { background-color: #ffffff } 5 + .hll { display: block; background-color: darken($hover, 65%) }
7 .c { color: #888888; font-style: italic } /* Comment */ 6 .c { color: #888888; font-style: italic } /* Comment */
8 .err { color: #a61717; background-color: #e3d2d2 } /* Error */ 7 .err { color: #a61717; background-color: #e3d2d2 } /* Error */
9 .k { color: #CDA869; font-weight: bold } /* Keyword */ 8 .k { color: #CDA869; font-weight: bold } /* Keyword */
@@ -22,43 +21,43 @@ @@ -22,43 +21,43 @@
22 .gs { font-weight: bold } /* Generic.Strong */ 21 .gs { font-weight: bold } /* Generic.Strong */
23 .gu { color: #606060 } /* Generic.Subheading */ 22 .gu { color: #606060 } /* Generic.Subheading */
24 .gt { color: #aa0000 } /* Generic.Traceback */ 23 .gt { color: #aa0000 } /* Generic.Traceback */
25 - .highlight .kc{font-weight:bold;} /* Keyword.Constant */  
26 - .highlight .kd{font-weight:bold;} /* Keyword.Declaration */  
27 - .highlight .kn{font-weight:bold;} /* Keyword.Namespace */  
28 - .highlight .kp{font-weight:bold;} /* Keyword.Pseudo */  
29 - .highlight .kr{font-weight:bold;} /* Keyword.Reserved */  
30 - .highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */ 24 + .kc{font-weight:bold;} /* Keyword.Constant */
  25 + .kd{font-weight:bold;} /* Keyword.Declaration */
  26 + .kn{font-weight:bold;} /* Keyword.Namespace */
  27 + .kp{font-weight:bold;} /* Keyword.Pseudo */
  28 + .kr{font-weight:bold;} /* Keyword.Reserved */
  29 + .kt{color:#458;font-weight:bold;} /* Keyword.Type */
31 .m { color: #0000DD; font-weight: bold } /* Literal.Number */ 30 .m { color: #0000DD; font-weight: bold } /* Literal.Number */
32 .p { color: #eee; } 31 .p { color: #eee; }
33 .s { color: #0AD; background-color: transparent } /* Literal.String */ 32 .s { color: #0AD; background-color: transparent } /* Literal.String */
34 - .highlight .na{color:#008080;} /* Name.Attribute */  
35 - .highlight .nb{color:#0086B3;} /* Name.Builtin */  
36 - .highlight .nc{color:#ccc;font-weight:bold;} /* Name.Class */  
37 - .highlight .no{color:turquoise;} /* Name.Constant */  
38 - .highlight .ni{color:#800080;}  
39 - .highlight .ne{color:#900;font-weight:bold;} /* Name.Exception */  
40 - .highlight .nf{color:#ccc;font-weight:bold;} /* Name.Function */  
41 - .highlight .nn{color:#79C3E0;font-weight:bold;} /* Name.Namespace */  
42 - .highlight .nt{color:#fc5;} /* Name.Tag */  
43 - .highlight .nv{color:#FA4;} /* Name.Variable */ 33 + .na{color:#008080;} /* Name.Attribute */
  34 + .nb{color:#0086B3;} /* Name.Builtin */
  35 + .nc{color:#ccc;font-weight:bold;} /* Name.Class */
  36 + .no{color:turquoise;} /* Name.Constant */
  37 + .ni{color:#800080;}
  38 + .ne{color:#900;font-weight:bold;} /* Name.Exception */
  39 + .nf{color:#ccc;font-weight:bold;} /* Name.Function */
  40 + .nn{color:#79C3E0;font-weight:bold;} /* Name.Namespace */
  41 + .nt{color:#fc5;} /* Name.Tag */
  42 + .nv{color:#FA4;} /* Name.Variable */
44 .py { color: #336699; font-weight: bold } /* Name.Property */ 43 .py { color: #336699; font-weight: bold } /* Name.Property */
45 .ow { color: #008800 } /* Operator.Word */ 44 .ow { color: #008800 } /* Operator.Word */
46 .w { color: #bbbbbb } /* Text.Whitespace */ 45 .w { color: #bbbbbb } /* Text.Whitespace */
47 .mf { color: #7AC; font-weight: bold } /* Literal.Number.Float */ 46 .mf { color: #7AC; font-weight: bold } /* Literal.Number.Float */
48 .mh { color: #7AC; font-weight: bold } /* Literal.Number.Hex */ 47 .mh { color: #7AC; font-weight: bold } /* Literal.Number.Hex */
49 - .highlight .mi {color:#099;} /* Literal.Number.Integer */ 48 + .mi {color:#099;} /* Literal.Number.Integer */
50 .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ 49 .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
51 .sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */ 50 .sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
52 - .highlight .sc{color:#d14;} /* Literal.String.Char */ 51 + .sc{color:#d14;} /* Literal.String.Char */
53 .sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */ 52 .sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
54 - .highlight .s2{color:orange;} /* Literal.String.Double */  
55 - .highlight .se{color:orange;} /* Literal.String.Escape */  
56 - .highlight .sh{color:orange;} /* Literal.String.Heredoc */  
57 - .highlight .si{color:orange;} /* Literal.String.Interpol */  
58 - .highlight .sx{color:orange;} /* Literal.String.Other */  
59 - .highlight .sr{color:orange;} /* Literal.String.Regex */  
60 - .highlight .s1{color:orange;} /* Literal.String.Single */  
61 - .highlight .ss{color:orange;} /* Literal.String.Symbol */ 53 + .s2{color:orange;} /* Literal.String.Double */
  54 + .se{color:orange;} /* Literal.String.Escape */
  55 + .sh{color:orange;} /* Literal.String.Heredoc */
  56 + .si{color:orange;} /* Literal.String.Interpol */
  57 + .sx{color:orange;} /* Literal.String.Other */
  58 + .sr{color:orange;} /* Literal.String.Regex */
  59 + .s1{color:orange;} /* Literal.String.Single */
  60 + .ss{color:orange;} /* Literal.String.Symbol */
62 .bp { color: #D58 } /* Name.Builtin.Pseudo */ 61 .bp { color: #D58 } /* Name.Builtin.Pseudo */
63 .vc { color: #336699 } /* Name.Variable.Class */ 62 .vc { color: #336699 } /* Name.Variable.Class */
64 .vg { color: #dd7700 } /* Name.Variable.Global */ 63 .vg { color: #dd7700 } /* Name.Variable.Global */
app/assets/stylesheets/highlight/white.scss
1 -table.highlighttable {  
2 - margin:0px;  
3 - padding:0px;  
4 - font-size:12px;  
5 - table-layout:fixed;  
6 - background: #EEE;  
7 - box-shadow: none;  
8 - border: none;  
9 - td.linenos {  
10 - background:#eee;  
11 - border-left:none;  
12 - }  
13 - td.code {  
14 - border-right:none;  
15 - }  
16 -}  
17 -  
18 -  
19 -td.code,  
20 -td.linenos{  
21 - padding:0;  
22 - margin:0;  
23 - border-top:0;  
24 - vertical-align:top;  
25 -}  
26 -  
27 -.highlighttable .highlight{  
28 - background:none;  
29 - padding:10px 0px 0px 10px;  
30 - margin-left:0px;  
31 - border-left: 1px solid #DEE2E3; 1 +.white .lines .highlight {
32 background: white; 2 background: white;
33 -}  
34 -  
35 -.linenodiv pre,  
36 -.highlighttable .highlight pre{  
37 - margin:0;  
38 - padding:0;  
39 - background:none;  
40 - border:none;  
41 -} 3 + pre { color: #333; }
42 4
43 -.linenodiv pre {  
44 - white-space:pre-line; 5 + .hll { display: block; background-color: $hover }
  6 + .c { color: #888888; font-style: italic } /* Comment */
  7 + .err { color: #a61717; background-color: #e3d2d2 } /* Error */
  8 + .k { color: #000000; font-weight: bold } /* Keyword */
  9 + .cm { color: #888888 } /* Comment.Multiline */
  10 + .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
  11 + .c1 { color: #888888 } /* Comment.Single */
  12 + .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
  13 + .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
  14 + .ge { font-style: italic } /* Generic.Emph */
  15 + .gr { color: #aa0000 } /* Generic.Error */
  16 + .gh { color: #303030 } /* Generic.Heading */
  17 + .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
  18 + .go { color: #888888 } /* Generic.Output */
  19 + .gp { color: #555555 } /* Generic.Prompt */
  20 + .gs { font-weight: bold } /* Generic.Strong */
  21 + .gu { color: #606060 } /* Generic.Subheading */
  22 + .gt { color: #aa0000 } /* Generic.Traceback */
  23 + .kc{font-weight:bold;} /* Keyword.Constant */
  24 + .kd{font-weight:bold;} /* Keyword.Declaration */
  25 + .kn{font-weight:bold;} /* Keyword.Namespace */
  26 + .kp{font-weight:bold;} /* Keyword.Pseudo */
  27 + .kr{font-weight:bold;} /* Keyword.Reserved */
  28 + .kt{color:#458;font-weight:bold;} /* Keyword.Type */
  29 + .m { color: #0000DD; font-weight: bold } /* Literal.Number */
  30 + .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
  31 + .na{color:#008080;} /* Name.Attribute */
  32 + .nb{color:#0086B3;} /* Name.Builtin */
  33 + .nc{color:#458;font-weight:bold;} /* Name.Class */
  34 + .no{color:#008080;} /* Name.Constant */
  35 + .ni{color:#800080;}
  36 + .ne{color:#900;font-weight:bold;} /* Name.Exception */
  37 + .nf{color:#900;font-weight:bold;} /* Name.Function */
  38 + .nn{color:#005;font-weight:bold;} /* Name.Namespace */
  39 + .nt{color:#000080;} /* Name.Tag */
  40 + .nv{color:#008080;} /* Name.Variable */
  41 + .py { color: #336699; font-weight: bold } /* Name.Property */
  42 + .ow { color: #008800 } /* Operator.Word */
  43 + .w { color: #bbbbbb } /* Text.Whitespace */
  44 + .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
  45 + .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
  46 + .mi {color:#099;} /* Literal.Number.Integer */
  47 + .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
  48 + .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
  49 + .sc{color:#d14;} /* Literal.String.Char */
  50 + .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
  51 + .s2{color:#d14;} /* Literal.String.Double */
  52 + .se{color:#d14;} /* Literal.String.Escape */
  53 + .sh{color:#d14;} /* Literal.String.Heredoc */
  54 + .si{color:#d14;} /* Literal.String.Interpol */
  55 + .sx{color:#d14;} /* Literal.String.Other */
  56 + .sr{color:#d14;} /* Literal.String.Regex */
  57 + .s1{color:#d14;} /* Literal.String.Single */
  58 + .ss{color:#d14;} /* Literal.String.Symbol */
  59 + .bp { color: #003388 } /* Name.Builtin.Pseudo */
  60 + .vc { color: #336699 } /* Name.Variable.Class */
  61 + .vg { color: #dd7700 } /* Name.Variable.Global */
  62 + .vi { color: #3333bb }
45 } 63 }
46 64
47 -td.linenos {  
48 - /*background:#F7F7F7;*/  
49 - color:#666;  
50 - padding:10px 0px 0px 10px;  
51 - float:left;  
52 - width:45px;  
53 - border-right: 1px solid #ccc;  
54 -  
55 -}  
56 -  
57 -td.code .highlight {  
58 - overflow: auto;  
59 -}  
60 -table.highlighttable pre{  
61 - padding:0;  
62 - margin:0;  
63 - font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;  
64 - color: #333;  
65 - text-align:left;  
66 -}  
67 -  
68 -.git-empty .highlight {  
69 - pre{  
70 - padding:15px;  
71 - line-height:2.0;  
72 - margin:0;  
73 - font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace;  
74 - color: #333;  
75 - text-align:left;}  
76 - }  
77 -  
78 -.shadow{ 65 +.shadow {
79 -webkit-box-shadow:0 5px 15px #000; 66 -webkit-box-shadow:0 5px 15px #000;
80 -moz-box-shadow:0 5px 15px #000; 67 -moz-box-shadow:0 5px 15px #000;
81 box-shadow:0 5px 15px #000; 68 box-shadow:0 5px 15px #000;
82 } 69 }
83 -  
84 -.hll { background-color: #ffffff }  
85 -.c { color: #888888; font-style: italic } /* Comment */  
86 -.err { color: #a61717; background-color: #e3d2d2 } /* Error */  
87 -.k { color: #000000; font-weight: bold } /* Keyword */  
88 -.cm { color: #888888 } /* Comment.Multiline */  
89 -.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */  
90 -.c1 { color: #888888 } /* Comment.Single */  
91 -.cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */  
92 -.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */  
93 -.ge { font-style: italic } /* Generic.Emph */  
94 -.gr { color: #aa0000 } /* Generic.Error */  
95 -.gh { color: #303030 } /* Generic.Heading */  
96 -.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */  
97 -.go { color: #888888 } /* Generic.Output */  
98 -.gp { color: #555555 } /* Generic.Prompt */  
99 -.gs { font-weight: bold } /* Generic.Strong */  
100 -.gu { color: #606060 } /* Generic.Subheading */  
101 -.gt { color: #aa0000 } /* Generic.Traceback */  
102 -.highlight .kc{font-weight:bold;} /* Keyword.Constant */  
103 -.highlight .kd{font-weight:bold;} /* Keyword.Declaration */  
104 -.highlight .kn{font-weight:bold;} /* Keyword.Namespace */  
105 -.highlight .kp{font-weight:bold;} /* Keyword.Pseudo */  
106 -.highlight .kr{font-weight:bold;} /* Keyword.Reserved */  
107 -.highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */  
108 -.m { color: #0000DD; font-weight: bold } /* Literal.Number */  
109 -.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */  
110 -.highlight .na{color:#008080;} /* Name.Attribute */  
111 -.highlight .nb{color:#0086B3;} /* Name.Builtin */  
112 -.highlight .nc{color:#458;font-weight:bold;} /* Name.Class */  
113 -.highlight .no{color:#008080;} /* Name.Constant */  
114 -.highlight .ni{color:#800080;}  
115 -.highlight .ne{color:#900;font-weight:bold;} /* Name.Exception */  
116 -.highlight .nf{color:#900;font-weight:bold;} /* Name.Function */  
117 -.highlight .nn{color:#005;font-weight:bold;} /* Name.Namespace */  
118 -.highlight .nt{color:#000080;} /* Name.Tag */  
119 -.highlight .nv{color:#008080;} /* Name.Variable */  
120 -.py { color: #336699; font-weight: bold } /* Name.Property */  
121 -.ow { color: #008800 } /* Operator.Word */  
122 -.w { color: #bbbbbb } /* Text.Whitespace */  
123 -.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */  
124 -.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */  
125 -.highlight .mi {color:#099;} /* Literal.Number.Integer */  
126 -.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */  
127 -.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */  
128 -.highlight .sc{color:#d14;} /* Literal.String.Char */  
129 -.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */  
130 -.highlight .s2{color:#d14;} /* Literal.String.Double */  
131 -.highlight .se{color:#d14;} /* Literal.String.Escape */  
132 -.highlight .sh{color:#d14;} /* Literal.String.Heredoc */  
133 -.highlight .si{color:#d14;} /* Literal.String.Interpol */  
134 -.highlight .sx{color:#d14;} /* Literal.String.Other */  
135 -.highlight .sr{color:#d14;} /* Literal.String.Regex */  
136 -.highlight .s1{color:#d14;} /* Literal.String.Single */  
137 -.highlight .ss{color:#d14;} /* Literal.String.Symbol */  
138 -.bp { color: #003388 } /* Name.Builtin.Pseudo */  
139 -.vc { color: #336699 } /* Name.Variable.Class */  
140 -.vg { color: #dd7700 } /* Name.Variable.Global */  
141 -.vi { color: #3333bb }  
app/assets/stylesheets/main.scss
  1 +/** Override bootstrap variables **/
  2 +$baseFontSize: 13px !default;
  3 +$baseLineHeight: 18px !default;
  4 +
1 @import "bootstrap"; 5 @import "bootstrap";
2 @import "bootstrap-responsive"; 6 @import "bootstrap-responsive";
3 @import 'font-awesome'; 7 @import 'font-awesome';
4 8
5 /** GitLab colors **/ 9 /** GitLab colors **/
6 -$link_color:#3A89A3;  
7 -$blue_link: #2fa0bb;  
8 -$style_color: #474d57; 10 +$link_color: #3A89A3;
  11 +$blue_link: #2FA0BB;
  12 +$style_color: #474D57;
9 $hover: #D9EDF7; 13 $hover: #D9EDF7;
  14 +$hover_border: #ADF;
10 15
11 /** GitLab Fonts **/ 16 /** GitLab Fonts **/
12 @font-face { font-family: Korolev; src: font-url('korolev-medium-compressed.otf'); } 17 @font-face { font-family: Korolev; src: font-url('korolev-medium-compressed.otf'); }
  18 +$monospace: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono', 'lucida console', monospace;
13 19
14 /** MIXINS **/ 20 /** MIXINS **/
15 @mixin shade { 21 @mixin shade {
@@ -19,9 +25,9 @@ $hover: #D9EDF7; @@ -19,9 +25,9 @@ $hover: #D9EDF7;
19 } 25 }
20 26
21 @mixin solid_shade { 27 @mixin solid_shade {
22 - -moz-box-shadow: 0 0 0 3px #eee;  
23 - -webkit-box-shadow: 0 0 0 3px #eee;  
24 - box-shadow: 0 0 0 3px #eee; 28 + -moz-box-shadow: 0 0 0 3px #f1f1f1;
  29 + -webkit-box-shadow: 0 0 0 3px #f1f1f1;
  30 + box-shadow: 0 0 0 3px #f1f1f1;
25 } 31 }
26 32
27 @mixin border-radius($radius) { 33 @mixin border-radius($radius) {
@@ -64,6 +70,14 @@ $hover: #D9EDF7; @@ -64,6 +70,14 @@ $hover: #D9EDF7;
64 background-image: -o-linear-gradient($from, $to); 70 background-image: -o-linear-gradient($from, $to);
65 } 71 }
66 72
  73 +@mixin bg-light-gray-gradient {
  74 + background:#f1f1f1;
  75 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #f5f5f5), to(#e1e1e1));
  76 + background-image: -webkit-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  77 + background-image: -moz-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  78 + background-image: -o-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  79 +}
  80 +
67 @mixin bg-gray-gradient { 81 @mixin bg-gray-gradient {
68 background:#eee; 82 background:#eee;
69 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); 83 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
@@ -104,14 +118,12 @@ $hover: #D9EDF7; @@ -104,14 +118,12 @@ $hover: #D9EDF7;
104 @import "themes/ui_basic.scss"; 118 @import "themes/ui_basic.scss";
105 119
106 /** 120 /**
107 - * UI mars theme 121 + * UI themes:
108 */ 122 */
109 @import "themes/ui_mars.scss"; 123 @import "themes/ui_mars.scss";
110 -  
111 -/**  
112 - * UI Modern theme  
113 - */  
114 @import "themes/ui_modern.scss"; 124 @import "themes/ui_modern.scss";
  125 +@import "themes/ui_gray.scss";
  126 +@import "themes/ui_color.scss";
115 127
116 /** 128 /**
117 * GitLab bootstrap. 129 * GitLab bootstrap.
@@ -145,6 +157,7 @@ $hover: #D9EDF7; @@ -145,6 +157,7 @@ $hover: #D9EDF7;
145 @import "sections/merge_requests.scss"; 157 @import "sections/merge_requests.scss";
146 @import "sections/graph.scss"; 158 @import "sections/graph.scss";
147 @import "sections/events.scss"; 159 @import "sections/events.scss";
  160 +@import "sections/themes.scss";
148 161
149 /** 162 /**
150 * This scss file redefine chozen selectbox styles for 163 * This scss file redefine chozen selectbox styles for
app/assets/stylesheets/ref_select.scss
@@ -19,31 +19,66 @@ @@ -19,31 +19,66 @@
19 margin-right: 10px; 19 margin-right: 10px;
20 20
21 .chzn-drop { 21 .chzn-drop {
22 - margin:7px 0;  
23 min-width: 400px; 22 min-width: 400px;
24 - border: 2px solid $blue_link;  
25 - @include border-radius(4px); 23 + .chzn-results {
  24 + max-height:300px;
  25 + }
  26 + .chzn-search input {
  27 + min-width:365px;
  28 + }
  29 + }
  30 +}
  31 +
  32 +/** Fix for Search Dropdown Border **/
  33 +.chzn-container {
  34 + .chzn-search {
  35 + input:focus {
  36 + -webkit-box-shadow: none;
  37 + -moz-box-shadow: none;
  38 + box-shadow: none;
  39 + }
  40 + }
  41 +
  42 + .chzn-drop {
  43 + margin:7px 0;
  44 + min-width: 200px;
  45 + border: 1px solid #bbb;
  46 + border-radius:0;
26 47
27 .chzn-results { 48 .chzn-results {
  49 + margin-top: 5px;
28 max-height:300px; 50 max-height:300px;
29 51
30 .group-result { 52 .group-result {
31 - color: $blue_link; 53 + color: $style_color;
  54 + border-bottom: 1px solid #EEE;
  55 + padding: 8px;
32 } 56 }
33 .active-result { 57 .active-result {
  58 + border-radius: 0;
  59 +
34 &.highlighted { 60 &.highlighted {
35 - background: $blue_link; 61 + background: $hover;
  62 + color: $style_color;
  63 + }
  64 + &.result-selected {
  65 + background: #EEE;
  66 + border-left: 4px solid #CCC;
36 } 67 }
37 } 68 }
38 } 69 }
39 70
40 - .chzn-search input {  
41 - min-width:365px; 71 + .chzn-search {
  72 + @include bg-gray-gradient;
  73 + input {
  74 + min-width:165px;
  75 + border-color: #CCC;
  76 + }
42 } 77 }
43 } 78 }
44 79
45 .chzn-single { 80 .chzn-single {
46 - @include bg-gray-gradient; 81 + @include bg-light-gray-gradient;
47 82
48 div { 83 div {
49 background:transparent; 84 background:transparent;
@@ -55,14 +90,3 @@ @@ -55,14 +90,3 @@
55 } 90 }
56 } 91 }
57 } 92 }
58 -  
59 -/** Fix for Search Dropdown Border **/  
60 -.chzn-container {  
61 - .chzn-search {  
62 - input:focus {  
63 - -webkit-box-shadow: none;  
64 - -moz-box-shadow: none;  
65 - box-shadow: none;  
66 - }  
67 - }  
68 -}  
app/assets/stylesheets/sections/commits.scss
@@ -47,12 +47,15 @@ @@ -47,12 +47,15 @@
47 padding-left: 32px; 47 padding-left: 32px;
48 } 48 }
49 49
50 - .author,  
51 - .committer { 50 + .author a,
  51 + .committer a {
52 font-size:14px; 52 font-size:14px;
53 line-height:22px; 53 line-height:22px;
54 text-shadow:0 1px 1px #fff; 54 text-shadow:0 1px 1px #fff;
55 color:#777; 55 color:#777;
  56 + &:hover {
  57 + color: #999;
  58 + }
56 } 59 }
57 60
58 .avatar { 61 .avatar {
@@ -71,7 +74,9 @@ @@ -71,7 +74,9 @@
71 margin-bottom:1em; 74 margin-bottom:1em;
72 75
73 .diff_file_header { 76 .diff_file_header {
74 - padding:7px 5px; 77 + @extend .clearfix;
  78 + padding: 5px 5px 5px 10px;
  79 + color: #555;
75 border-bottom:1px solid #CCC; 80 border-bottom:1px solid #CCC;
76 background: #eee; 81 background: #eee;
77 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); 82 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
@@ -79,8 +84,23 @@ @@ -79,8 +84,23 @@
79 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); 84 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
80 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); 85 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
81 86
82 - span { 87 + > span {
  88 + font-family: $monospace;
83 font-size:14px; 89 font-size:14px;
  90 + line-height: 30px;
  91 + }
  92 +
  93 + a.view-commit{
  94 + font-weight: bold;
  95 + }
  96 +
  97 + .commit-short-id{
  98 + font-family: $monospace;
  99 + font-size: smaller;
  100 + }
  101 +
  102 + .file-mode{
  103 + font-family: $monospace;
84 } 104 }
85 } 105 }
86 .diff_file_content { 106 .diff_file_content {
@@ -89,7 +109,7 @@ @@ -89,7 +109,7 @@
89 background:#fff; 109 background:#fff;
90 color:#333; 110 color:#333;
91 font-size: 12px; 111 font-size: 12px;
92 - font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; 112 + font-family: $monospace;
93 .old{ 113 .old{
94 span.idiff{ 114 span.idiff{
95 background-color:#FAA; 115 background-color:#FAA;
@@ -110,22 +130,34 @@ @@ -110,22 +130,34 @@
110 .diff_file_content_image { 130 .diff_file_content_image {
111 background:#eee; 131 background:#eee;
112 text-align:center; 132 text-align:center;
113 - img { 133 + .image {
  134 + display: inline-block;
114 margin:50px; 135 margin:50px;
115 - padding:1px;  
116 max-width:400px; 136 max-width:400px;
117 137
118 - &.diff_image_removed {  
119 - border: 1px solid #C00; 138 + img{
  139 + background: url('trans_bg.gif');
  140 + }
  141 +
  142 + &.diff_removed {
  143 + img{
  144 + border: 1px solid #C00;
  145 + }
  146 + }
  147 +
  148 + &.diff_added {
  149 + img{
  150 + border: 1px solid #0C0;
  151 + }
120 } 152 }
121 153
122 - &.diff_image_added {  
123 - border: 1px solid #0C0;; 154 + .image-info{
  155 + margin: 5px 0 0 0;
124 } 156 }
125 } 157 }
126 158
127 &.img_compared { 159 &.img_compared {
128 - img { 160 + .image {
129 max-width:300px; 161 max-width:300px;
130 } 162 }
131 } 163 }
@@ -222,26 +254,41 @@ @@ -222,26 +254,41 @@
222 float:left; 254 float:left;
223 @extend .lined; 255 @extend .lined;
224 min-width:65px; 256 min-width:65px;
225 - font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; 257 + font-family: $monospace;
226 } 258 }
227 259
228 .commit-author-name { 260 .commit-author-name {
229 color: #777; 261 color: #777;
  262 + &:hover {
  263 + color: #999;
  264 + }
230 } 265 }
231 } 266 }
232 267
233 .diff_file_header a, 268 .diff_file_header a,
234 -.file_stats a {  
235 - color:$style_color; 269 +.file-stats a {
  270 + color: $style_color;
236 } 271 }
237 272
238 -.file_stats {  
239 - span {  
240 - img {  
241 - width:14px;  
242 - float:left;  
243 - margin-right:6px;  
244 - padding:2px 0; 273 +.file-stats {
  274 + .new-file{
  275 + i{
  276 + color: #1BCF00;
  277 + }
  278 + }
  279 + .renamed-file{
  280 + i{
  281 + color: #FE9300;
  282 + }
  283 + }
  284 + .deleted-file{
  285 + i{
  286 + color: #FF0000;
  287 + }
  288 + }
  289 + .edit-file{
  290 + i{
  291 + color: #555;
245 } 292 }
246 } 293 }
247 } 294 }
@@ -253,5 +300,5 @@ @@ -253,5 +300,5 @@
253 font-size:13px; 300 font-size:13px;
254 background: #474D57; 301 background: #474D57;
255 color:#fff; 302 color:#fff;
256 - font-family: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono','lucida console',monospace; 303 + font-family: $monospace;
257 } 304 }
app/assets/stylesheets/sections/editor.scss
1 .file-editor { 1 .file-editor {
2 #editor{ 2 #editor{
  3 + border: none;
  4 + border-radius: 0;
3 height: 500px; 5 height: 500px;
4 - width: 100%; 6 + margin: 0;
  7 + padding: 0;
5 position: relative; 8 position: relative;
  9 + width: 100%;
6 } 10 }
7 - .editor-commit-comment {  
8 - padding-top:20px; 11 +
  12 + .cancel-btn {
  13 + color: #B94A48;
  14 + &:hover {
  15 + color: #B94A48;
  16 + }
  17 + }
  18 + .commit-button-annotation {
  19 + @extend .alert;
  20 + @extend .alert-info;
  21 + display: inline-block;
  22 + margin: 0;
  23 + padding: 2px;
  24 +
  25 + > * {
  26 + float: left;
  27 + }
  28 +
  29 + .commit-btn {
  30 + @extend .save-btn;
  31 + }
  32 + .message {
  33 + display: inline-block;
  34 + margin: 5px 8px 0 8px;
  35 + }
  36 + }
  37 + .commit_message-group {
  38 + margin-top: 20px;
  39 +
  40 + label {
  41 + font-size: 16px;
  42 + line-height: 20px;
  43 + }
9 textarea { 44 textarea {
10 - width: 50%;  
11 - margin-left: 20px; 45 + @extend .span8;
12 } 46 }
13 } 47 }
14 } 48 }
app/assets/stylesheets/sections/events.scss
@@ -43,6 +43,7 @@ @@ -43,6 +43,7 @@
43 .event-body { 43 .event-body {
44 p { 44 p {
45 color:#555; 45 color:#555;
  46 + padding-top: 5px;
46 } 47 }
47 .event-info { 48 .event-info {
48 color:#666; 49 color:#666;
@@ -115,3 +116,29 @@ @@ -115,3 +116,29 @@
115 margin: -3px; 116 margin: -3px;
116 } 117 }
117 } 118 }
  119 +
  120 +/**
  121 + * Event filter
  122 + *
  123 + */
  124 +.event_filter {
  125 + position: absolute;
  126 + width: 40px;
  127 + margin-left: -50px;
  128 +
  129 + .filter_icon {
  130 + float: left;
  131 + border-left: 3px solid #4bc;
  132 + padding: 7px;
  133 + background: #f9f9f9;
  134 + margin-bottom: 10px;
  135 + img {
  136 + width:20px;
  137 + }
  138 +
  139 + &.inactive {
  140 + border-left: 3px solid #EEE;
  141 + opacity: 0.5;
  142 + }
  143 + }
  144 +}
app/assets/stylesheets/sections/header.scss
@@ -3,18 +3,29 @@ @@ -3,18 +3,29 @@
3 * 3 *
4 */ 4 */
5 header { 5 header {
6 - width:100%;  
7 - padding:0;  
8 - margin:0;  
9 - top:1px;  
10 - left:0;  
11 - background: #F1F1F1; /* for non-css3 browsers */  
12 - border-bottom: 1px solid #ccc;  
13 - box-shadow: 0 -1px 0 white inset;  
14 - -moz-box-shadow: 0 -1px 0 white inset;  
15 - -webkit-box-shadow: 0 -1px 0 white inset; 6 + &.navbar-gitlab {
  7 + .navbar-inner {
  8 + height:45px;
  9 + padding: 5px;
  10 + background: #F1F1F1;
  11 +
  12 + .nav > li > a {
  13 + color: $style_color;
  14 + text-shadow: 0 1px 0 #fff;
  15 + font-size: 18px;
  16 + padding: 11px;
  17 + }
  18 +
  19 + /** NAV block with links and profile **/
  20 + .nav {
  21 + float: right;
  22 + margin-right: 0;
  23 + }
  24 + }
  25 + }
  26 +
16 z-index:10; 27 z-index:10;
17 - height:60px; 28 + /*height:60px;*/
18 29
19 /** 30 /**
20 * 31 *
@@ -22,45 +33,26 @@ header { @@ -22,45 +33,26 @@ header {
22 * 33 *
23 */ 34 */
24 .app_logo { 35 .app_logo {
25 - width:200px; 36 + width:170px;
26 float:left; 37 float:left;
27 - position:relative;  
28 - top:-5px;  
29 a { 38 a {
30 float:left; 39 float:left;
  40 + padding: 0px;
31 41
32 h1 { 42 h1 {
33 - padding-top: 5px;  
34 width:90px; 43 width:90px;
35 - background: url('logo_dark.png') no-repeat 0px -3px; 44 + background: url('logo_dark.png') no-repeat 0px 2px;
36 float:left; 45 float:left;
37 - margin-left:5px;  
38 - font-size:36px;  
39 - line-height:36px; 46 + margin-left:2px;
  47 + font-size:30px;
  48 + line-height:48px;
40 font-weight:normal; 49 font-weight:normal;
41 color:$style_color; 50 color:$style_color;
42 text-shadow: 0 1px 1px #FFF; 51 text-shadow: 0 1px 1px #FFF;
43 - padding-left:50px; 52 + padding-left:45px;
44 height:40px; 53 height:40px;
45 font-family: 'Korolev', sans-serif; 54 font-family: 'Korolev', sans-serif;
46 } 55 }
47 -  
48 - }  
49 - .separator {  
50 - margin-left:20px;  
51 - float: left;  
52 - height: 60px;  
53 - width: 1px;  
54 - background: white;  
55 - border-left: 1px solid #DDD;  
56 - margin-top: -10px;  
57 - }  
58 - }  
59 - .container {  
60 - .top_panel_content {  
61 - margin:auto;  
62 - position:relative;  
63 - padding:15px 0;  
64 } 56 }
65 } 57 }
66 58
@@ -74,33 +66,23 @@ header { @@ -74,33 +66,23 @@ header {
74 float:left; 66 float:left;
75 margin:0; 67 margin:0;
76 margin-right:30px; 68 margin-right:30px;
77 - font-size:36px;  
78 - line-height:36px; 69 + font-size:30px;
  70 + line-height:48px;
79 font-weight:normal; 71 font-weight:normal;
80 color:$style_color; 72 color:$style_color;
81 text-shadow: 0 1px 1px #FFF; 73 text-shadow: 0 1px 1px #FFF;
82 font-family: 'Korolev', sans-serif; 74 font-family: 'Korolev', sans-serif;
83 } 75 }
84 76
85 - .fbtn {  
86 - float: right;  
87 - margin-right:10px;  
88 - .btn {  
89 - margin-left:7px;  
90 - background: #F1F1F1;  
91 - border: 1px solid #CCC;  
92 - }  
93 - }  
94 -  
95 -  
96 /** 77 /**
97 * 78 *
98 * Search box 79 * Search box
99 * 80 *
100 */ 81 */
101 .search { 82 .search {
102 - float: right;  
103 margin-right: 45px; 83 margin-right: 45px;
  84 + margin-left:10px;
  85 + margin-top: 2px;
104 86
105 .search-input { 87 .search-input {
106 @extend .span2; 88 @extend .span2;
@@ -108,8 +90,13 @@ header { @@ -108,8 +90,13 @@ header {
108 background-repeat: no-repeat; 90 background-repeat: no-repeat;
109 background-position: 10px; 91 background-position: 10px;
110 padding-left:25px; 92 padding-left:25px;
111 - @include border-radius(5px);  
112 - border:1px solid #ccc; 93 + font-size: 13px;
  94 + @include border-radius(3px);
  95 + border:1px solid #c6c6c6;
  96 + box-shadow:none;
  97 + &:focus {
  98 + @extend .span3;
  99 + }
113 } 100 }
114 } 101 }
115 102
@@ -121,7 +108,7 @@ header { @@ -121,7 +108,7 @@ header {
121 .account-box { 108 .account-box {
122 position: absolute; 109 position: absolute;
123 right: 0; 110 right: 0;
124 - top: 13px; 111 + top: 6px;
125 z-index: 10000; 112 z-index: 10000;
126 width: 128px; 113 width: 128px;
127 font-size: 11px; 114 font-size: 11px;
@@ -129,13 +116,13 @@ header { @@ -129,13 +116,13 @@ header {
129 display: block; 116 display: block;
130 cursor: pointer; 117 cursor: pointer;
131 img { 118 img {
132 - @include border-radius(4px); 119 + @include border-radius(3px);
133 right: 5px; 120 right: 5px;
134 position: absolute; 121 position: absolute;
135 width: 28px; 122 width: 28px;
136 height: 28px; 123 height: 28px;
137 display: block; 124 display: block;
138 - top: 2px; 125 + top:1px;
139 &:after { 126 &:after {
140 content: " "; 127 content: " ";
141 display: block; 128 display: block;
@@ -162,12 +149,7 @@ header { @@ -162,12 +149,7 @@ header {
162 display: block; } } 149 display: block; } }
163 150
164 .account-links { 151 .account-links {
165 - background: #79C3E0;  
166 - display: none;  
167 border-radius: 5px; 152 border-radius: 5px;
168 - width: 100px;  
169 - margin-top: 0;  
170 - float: right;  
171 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); 153 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
172 position: relative; 154 position: relative;
173 &:before { 155 &:before {
@@ -177,32 +159,33 @@ header { @@ -177,32 +159,33 @@ header {
177 position: absolute; 159 position: absolute;
178 border: 5px solid transparent; 160 border: 5px solid transparent;
179 border-color: rgba(255, 255, 255, 0); 161 border-color: rgba(255, 255, 255, 0);
180 - border-bottom-color: #333; 162 + border-bottom-color: #555;
181 text-indent: -9999px; 163 text-indent: -9999px;
182 top: -10px; 164 top: -10px;
183 line-height: 0; 165 line-height: 0;
184 right: 10px; 166 right: 10px;
185 z-index: 10; } 167 z-index: 10; }
186 - background: #333; 168 + background: #555;
187 display: none; 169 display: none;
188 z-index: 100000; 170 z-index: 100000;
189 - border-radius: 5px; 171 + @include border-radius(4px);
190 width: 100px; 172 width: 100px;
191 position: absolute; 173 position: absolute;
192 - right: 10px;  
193 - top: 42px; 174 + right: 5px;
  175 + top: 38px;
194 margin-top: 0; 176 margin-top: 0;
195 float: right; 177 float: right;
196 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); 178 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
197 a { 179 a {
198 - color: #EEE;  
199 - padding: 6px 10px; 180 + color: #fff;
  181 + padding: 7px 10px;
200 display: block; 182 display: block;
201 text-shadow: none; 183 text-shadow: none;
202 - border-bottom: 1px solid #555; 184 + border-bottom: 1px solid #666;
  185 + font-size: 12px;
203 &:hover { 186 &:hover {
204 - color:#eee;  
205 - background: #444; 187 + color:#fff;
  188 + background: #333;
206 } 189 }
207 } 190 }
208 } 191 }
@@ -228,5 +211,52 @@ header { @@ -228,5 +211,52 @@ header {
228 border-bottom-right-radius: 5px; 211 border-bottom-right-radius: 5px;
229 border-bottom-left-radius: 5px; 212 border-bottom-left-radius: 5px;
230 border-bottom: 0; } } 213 border-bottom: 0; } }
  214 +
  215 +
  216 +
  217 + /*
  218 + * Dark header
  219 + *
  220 + */
  221 + &.header-dark {
  222 + &.navbar-gitlab {
  223 + .navbar-inner {
  224 + background: #708090;
  225 + border-bottom: 1px solid #AAA;
  226 +
  227 + .nav > li > a {
  228 + color: #fff;
  229 + text-shadow: 0 1px 0 #111;
  230 + }
  231 + }
  232 + }
  233 +
  234 + .search {
  235 + .search-input {
  236 + background-color: #D2D5DA;
  237 + background-color: rgba(255, 255, 255, 0.5);
  238 +
  239 + &:focus {
  240 + background-color: white;
  241 + }
  242 + }
  243 + }
  244 + .search-input::-webkit-input-placeholder {
  245 + color: #666;
  246 + }
  247 + .app_logo {
  248 + a {
  249 + h1 {
  250 + background: url('logo_white.png') no-repeat 0px 2px;
  251 + color:#fff;
  252 + text-shadow: 0 1px 1px #111;
  253 + }
  254 + }
  255 + }
  256 + .project_name {
  257 + color:#fff;
  258 + text-shadow: 0 1px 1px #111;
  259 + }
  260 + }
231 } 261 }
232 262
app/assets/stylesheets/sections/issues.scss
@@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
44 44
45 img.avatar { 45 img.avatar {
46 width:32px; 46 width:32px;
47 - margin-top:4px; 47 + margin-top:1px;
48 } 48 }
49 } 49 }
50 } 50 }
app/assets/stylesheets/sections/merge_requests.scss
@@ -71,7 +71,7 @@ li.merge_request { @@ -71,7 +71,7 @@ li.merge_request {
71 padding:7px 10px; 71 padding:7px 10px;
72 img.avatar { 72 img.avatar {
73 width: 32px; 73 width: 32px;
74 - margin-top: 4px; 74 + margin-top: 1px;
75 } 75 }
76 p { 76 p {
77 padding: 0px; 77 padding: 0px;
@@ -121,3 +121,25 @@ li.merge_request { @@ -121,3 +121,25 @@ li.merge_request {
121 .mr_direction_tip { 121 .mr_direction_tip {
122 margin-top:40px 122 margin-top:40px
123 } 123 }
  124 +
  125 +.merge_requests_form_box {
  126 + @extend .main_box;
  127 + .merge_requests_middle_box {
  128 + @extend .middle_box_content;
  129 + height:30px;
  130 + .merge_requests_assignee {
  131 + @extend .span6;
  132 + float:left;
  133 + }
  134 + .merge_requests_milestone {
  135 + @extend .span4;
  136 + float:left;
  137 + }
  138 + }
  139 +}
  140 +
  141 +.status-badge {
  142 + height: 32px;
  143 + width: 100%;
  144 + @include border-radius(5px);
  145 +}
app/assets/stylesheets/sections/nav.scss
@@ -6,7 +6,7 @@ ul.main_menu { @@ -6,7 +6,7 @@ ul.main_menu {
6 border-radius: 4px; 6 border-radius: 4px;
7 margin: auto; 7 margin: auto;
8 margin:30px 0; 8 margin:30px 0;
9 - border:1px solid #AAA; 9 + border:1px solid #BBB;
10 height:37px; 10 height:37px;
11 @include bg-gray-gradient; 11 @include bg-gray-gradient;
12 position:relative; 12 position:relative;
app/assets/stylesheets/sections/profile.scss
@@ -6,3 +6,17 @@ @@ -6,3 +6,17 @@
6 } 6 }
7 } 7 }
8 } 8 }
  9 +
  10 +.profile_avatar_holder {
  11 + float:left;
  12 + width:60px;
  13 + height:60px;
  14 + margin-right:20px;
  15 + img {
  16 + width:60px;
  17 + height:60px;
  18 + background:#fff;
  19 + padding: 1px;
  20 + border: 1px solid #ddd;
  21 + }
  22 +}
app/assets/stylesheets/sections/projects.scss
@@ -85,9 +85,18 @@ @@ -85,9 +85,18 @@
85 } 85 }
86 86
87 .project_clone_holder { 87 .project_clone_holder {
  88 + input[type="text"],
  89 + .btn {
  90 + font-size:12px;
  91 + line-height: 18px;
  92 + margin: 0;
  93 + padding: 3px 10px;
  94 + }
  95 +
88 input[type="text"] { 96 input[type="text"] {
89 border: 1px solid #BBB; 97 border: 1px solid #BBB;
90 box-shadow: none; 98 box-shadow: none;
  99 + margin-left: -1px;
91 } 100 }
92 } 101 }
93 102
app/assets/stylesheets/sections/themes.scss 0 → 100644
@@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
  1 +.application-theme, .code-preview-theme {
  2 + .update-feedback {
  3 + color: #468847;
  4 + float: right;
  5 + }
  6 +}
  7 +
  8 +.themes_opts {
  9 + padding-left:20px;
  10 +
  11 + label {
  12 + width:175px;
  13 + margin-right:40px;
  14 +
  15 + .prev {
  16 + @extend .thumbnail;
  17 + height:30px;
  18 + width:175px;
  19 + margin-bottom:10px;
  20 +
  21 + &.classic {
  22 + background: #31363e;
  23 + }
  24 +
  25 + &.default {
  26 + background: #f1f1f1;
  27 + }
  28 +
  29 + &.modern {
  30 + background: #567;
  31 + }
  32 +
  33 + &.gray {
  34 + background: #708090;
  35 + }
  36 +
  37 + &.violet {
  38 + background: #657;
  39 + }
  40 + }
  41 + }
  42 +}
  43 +
  44 +.code_highlight_opts {
  45 + padding-left:20px;
  46 +
  47 + label {
  48 + width:220px;
  49 + margin-right:40px;
  50 +
  51 + .prev {
  52 + @extend .thumbnail;
  53 + height:151px;
  54 + width:220px;
  55 + margin-bottom:10px;
  56 + }
  57 + }
  58 +}
  59 +
  60 +
app/assets/stylesheets/sections/tree.scss
@@ -57,10 +57,7 @@ @@ -57,10 +57,7 @@
57 padding-right: 8px; 57 padding-right: 8px;
58 58
59 img.avatar { 59 img.avatar {
60 - border: 0 none;  
61 - float: none;  
62 - margin-right: 0;  
63 - padding: 0; 60 + margin-top: 0;
64 width: 16px; 61 width: 16px;
65 } 62 }
66 } 63 }
@@ -75,6 +72,15 @@ @@ -75,6 +72,15 @@
75 } 72 }
76 } 73 }
77 } 74 }
  75 +
  76 + .blame {
  77 + img.avatar {
  78 + border: 0 none;
  79 + float: none;
  80 + margin: 0;
  81 + padding: 0;
  82 + }
  83 + }
78 } 84 }
79 85
80 .tree-btn-group { 86 .tree-btn-group {
app/assets/stylesheets/themes/ui_basic.scss
@@ -16,35 +16,21 @@ @@ -16,35 +16,21 @@
16 } 16 }
17 } 17 }
18 18
19 - header {  
20 - .fbtn {  
21 - .btn {  
22 - background-color: #F8F8F8;  
23 - background-image: -webkit-gradient(linear,left top,left bottom,from(#F8F8F8),to(#ECECEC));  
24 - background-image: -webkit-linear-gradient(top,#F8F8F8,#ECECEC);  
25 - background-image: -moz-linear-gradient(top,#F8F8F8,#ECECEC);  
26 - background-image: -ms-linear-gradient(top,#F8F8F8,#ECECEC);  
27 - background-image: -o-linear-gradient(top,#F8F8F8,#ECECEC);  
28 - background-image: linear-gradient(top,#F8F8F8,#ECECEC);  
29 - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f8f8f8',EndColorStr='#ececec');  
30 - border-color: #C6C6C6;  
31 - margin-left:7px;  
32 - @include border-radius(3px);  
33 - box-shadow:none;  
34 - color:#666;  
35 - }  
36 - }  
37 - .search {  
38 - .search-input {  
39 - @include border-radius(3px);  
40 - border-color: #C6C6C6;  
41 - box-shadow:none;  
42 - }  
43 - }  
44 - .pic {  
45 - img {  
46 - @include border-radius(3px);  
47 - } 19 + .app_logo {
  20 + .separator {
  21 + margin-left: 0;
  22 + margin-right: 0;
48 } 23 }
49 } 24 }
  25 +
  26 + .separator {
  27 + float: left;
  28 + height: 60px;
  29 + width: 1px;
  30 + background: white;
  31 + border-left: 1px solid #DDD;
  32 + margin-top: -10px;
  33 + margin-left: 10px;
  34 + margin-right: 10px;
  35 + }
50 } 36 }
app/assets/stylesheets/themes/ui_color.scss 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +/**
  2 + * This file represent some UI that can be changed
  3 + * during web app restyle or theme select.
  4 + *
  5 + * Next items should be placed there
  6 + * - link colors
  7 + * - header restyles
  8 + *
  9 + */
  10 +.ui_color {
  11 + /*
  12 + * Application Header
  13 + *
  14 + */
  15 + header {
  16 + @extend .header-dark;
  17 + &.navbar-gitlab {
  18 + .navbar-inner {
  19 + background: #657;
  20 + }
  21 + }
  22 + }
  23 +}
app/assets/stylesheets/themes/ui_gray.scss 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +/**
  2 + * This file represent some UI that can be changed
  3 + * during web app restyle or theme select.
  4 + *
  5 + * Next items should be placed there
  6 + * - link colors
  7 + * - header restyles
  8 + *
  9 + */
  10 +.ui_gray {
  11 + /*
  12 + * Application Header
  13 + *
  14 + */
  15 + header {
  16 + @extend .header-dark;
  17 + &.navbar-gitlab {
  18 + .navbar-inner {
  19 + background: #708090;
  20 + }
  21 + }
  22 + }
  23 +}
app/assets/stylesheets/themes/ui_mars.scss
@@ -14,45 +14,24 @@ @@ -14,45 +14,24 @@
14 * 14 *
15 */ 15 */
16 header { 16 header {
17 - background: #474D57 url('bg-header.png') repeat-x bottom;  
18 - box-shadow:none;  
19 - border-bottom: 1px solid #444;  
20 17
21 - .fbtn {  
22 - .btn {  
23 - i {  
24 - position: relative;  
25 - top: 1px;  
26 - }  
27 - margin-left:8px;  
28 - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#31363E));  
29 - background-image: -webkit-linear-gradient(#595D63 6.6%, #31363E);  
30 - background-image: -moz-linear-gradient(#595D63 6.6%, #31363E);  
31 - background-image: -o-linear-gradient(#595D63 6.6%, #31363E);  
32 - font-size: 12px;  
33 - &:hover {  
34 - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#2C2F35));  
35 - background-image: -webkit-linear-gradient(#595D63 6.6%, #2C2F35);  
36 - background-image: -moz-linear-gradient(#595D63 6.6%, #202227);  
37 - background-image: -o-linear-gradient(#595D63 6.6%, #202227);  
38 - background-position:0 0;  
39 - color:#fff;  
40 - i {  
41 - @extend .icon-white;  
42 - }  
43 - } 18 + &.navbar-gitlab {
  19 + .navbar-inner {
  20 + background: #474D57 url('bg-header.png') repeat-x bottom;
  21 + border-bottom: 1px solid #444;
44 22
45 - border: 1px solid #31363E;  
46 - color:#D6DADF;  
47 - text-shadow: 0 -1px 0 #000000; 23 + .nav > li > a {
  24 + color: #eee;
  25 + text-shadow: 0 1px 0 #444;
  26 + }
48 } 27 }
49 } 28 }
  29 +
50 .search { 30 .search {
51 float: right; 31 float: right;
52 margin-right: 45px; 32 margin-right: 45px;
53 .search-input { 33 .search-input {
54 border: 1px solid rgba(0, 0, 0, 0.7); 34 border: 1px solid rgba(0, 0, 0, 0.7);
55 - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset;  
56 background-color: #D2D5DA; 35 background-color: #D2D5DA;
57 background-color: rgba(255, 255, 255, 0.5); 36 background-color: rgba(255, 255, 255, 0.5);
58 37
@@ -67,8 +46,8 @@ @@ -67,8 +46,8 @@
67 .app_logo { 46 .app_logo {
68 a { 47 a {
69 h1 { 48 h1 {
70 - background: url('logo_white.png') no-repeat 0px -3px;  
71 - color:#fff; 49 + background: url('logo_white.png') no-repeat 0px 2px;
  50 + color:#eee;
72 text-shadow: 0 1px 1px #111; 51 text-shadow: 0 1px 1px #111;
73 } 52 }
74 } 53 }
@@ -78,7 +57,7 @@ @@ -78,7 +57,7 @@
78 57
79 } 58 }
80 .project_name { 59 .project_name {
81 - color:#fff; 60 + color:#eee;
82 text-shadow: 0 1px 1px #111; 61 text-shadow: 0 1px 1px #111;
83 } 62 }
84 } 63 }
app/assets/stylesheets/themes/ui_modern.scss
@@ -4,8 +4,7 @@ @@ -4,8 +4,7 @@
4 * 4 *
5 * Next items should be placed there 5 * Next items should be placed there
6 * - link colors 6 * - link colors
7 - * - header styles  
8 - * - main menu styles 7 + * - header restyles
9 * 8 *
10 */ 9 */
11 .ui_modern { 10 .ui_modern {
@@ -14,120 +13,10 @@ @@ -14,120 +13,10 @@
14 * 13 *
15 */ 14 */
16 header { 15 header {
17 - height:40px;  
18 - background-image: -moz-linear-gradient(top, #333, #222);  
19 - background-image: -ms-linear-gradient(top, #333, #222);  
20 - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333), to(#222));  
21 - background-image: -webkit-linear-gradient(top, #333, #222);  
22 - background-image: -o-linear-gradient(top, #333, #222);  
23 - background-image: linear-gradient(top, #333, #222);  
24 - background-repeat: repeat-x;  
25 - background-repeat: repeat-x;  
26 - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);  
27 - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);  
28 - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);  
29 - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);  
30 -  
31 - .container .top_panel_content { padding: 5px 0; }  
32 -  
33 -  
34 - /**  
35 - *  
36 - * Logo holder  
37 - *  
38 - */  
39 - .app_logo {  
40 - width:160px;  
41 - a {  
42 - h1 {  
43 - background: none;  
44 - color:#DDD;  
45 - font-size:30px;  
46 - text-shadow: 0 1px 1px #111;  
47 - padding-left: 0;  
48 - }  
49 - }  
50 - .separator {  
51 - width: 1px;  
52 - height: 40px;  
53 - margin: 0 10px;  
54 - overflow: hidden;  
55 - background: #222;  
56 - border-left: 1px solid #333;  
57 - }  
58 - }  
59 -  
60 - .fbtn {  
61 - .btn {  
62 - i {  
63 - position: relative;  
64 - top: 2px;  
65 - }  
66 - background:none;  
67 - margin-left:8px;  
68 - font-size: 13px;  
69 - line-height: 19px;  
70 - color:#ccc;  
71 - &:hover {  
72 - color:#fff;  
73 - i {  
74 - @extend .icon-white;  
75 - }  
76 - }  
77 - border: none;  
78 - box-shadow:none;  
79 - text-shadow: 0 -1px 0 #000000;  
80 - border-left: 1px solid #333;  
81 - }  
82 - }  
83 -  
84 - /**  
85 - *  
86 - * Search box  
87 - *  
88 - */  
89 - .search {  
90 - float: right;  
91 - margin-right: 45px;  
92 - .search-input {  
93 - border: 1px solid rgba(0, 0, 0, 0.7);  
94 - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset;  
95 - background-color: #D2D5DA;  
96 - background-color: rgba(255, 255, 255, 0.5);  
97 -  
98 - &:focus {  
99 - background-color: white;  
100 - }  
101 - }  
102 - .search-input::-webkit-input-placeholder {  
103 - color: #666;  
104 - }  
105 - }  
106 -  
107 - /**  
108 - *  
109 - * Project / Area name  
110 - *  
111 - */  
112 - .project_name {  
113 - line-height:36px;  
114 - font-size:30px;  
115 - color:#DDD;  
116 - text-shadow: 0 1px 1px #111;  
117 - }  
118 -  
119 - /**  
120 - *  
121 - * Account box  
122 - *  
123 - */  
124 - .account-box {  
125 - top:6px;  
126 - img {  
127 - top:1px;  
128 - right: 5px;  
129 - width: 26px;  
130 - height: 26px; 16 + @extend .header-dark;
  17 + &.navbar-gitlab {
  18 + .navbar-inner {
  19 + background: #567;
131 } 20 }
132 } 21 }
133 } 22 }
app/contexts/commit_load_context.rb
@@ -21,7 +21,7 @@ class CommitLoadContext &lt; BaseContext @@ -21,7 +21,7 @@ class CommitLoadContext &lt; BaseContext
21 result[:notes_count] = line_notes.count + project.commit_notes(commit).count 21 result[:notes_count] = line_notes.count + project.commit_notes(commit).count
22 22
23 begin 23 begin
24 - result[:suppress_diff] = true if commit.diffs.size > 200 && !params[:force_show_diff] 24 + result[:suppress_diff] = true if commit.diffs.size > Commit::DIFF_SAFE_SIZE && !params[:force_show_diff]
25 rescue Grit::Git::GitTimeout 25 rescue Grit::Git::GitTimeout
26 result[:suppress_diff] = true 26 result[:suppress_diff] = true
27 result[:status] = :huge_commit 27 result[:status] = :huge_commit
app/contexts/merge_requests_load_context.rb
  1 +# Build collection of Merge Requests
  2 +# based on filtering passed via params for @project
1 class MergeRequestsLoadContext < BaseContext 3 class MergeRequestsLoadContext < BaseContext
2 def execute 4 def execute
3 type = params[:f] 5 type = params[:f]
@@ -9,8 +11,21 @@ class MergeRequestsLoadContext &lt; BaseContext @@ -9,8 +11,21 @@ class MergeRequestsLoadContext &lt; BaseContext
9 when 'closed' then merge_requests.closed 11 when 'closed' then merge_requests.closed
10 when 'assigned-to-me' then merge_requests.opened.assigned(current_user) 12 when 'assigned-to-me' then merge_requests.opened.assigned(current_user)
11 else merge_requests.opened 13 else merge_requests.opened
12 - end.page(params[:page]).per(20) 14 + end
13 15
14 - merge_requests.includes(:author, :project).order("closed, created_at desc") 16 + merge_requests = merge_requests.page(params[:page]).per(20)
  17 + merge_requests = merge_requests.includes(:author, :project).order("closed, created_at desc")
  18 +
  19 + # Filter by specific assignee_id (or lack thereof)?
  20 + if params[:assignee_id].present?
  21 + merge_requests = merge_requests.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
  22 + end
  23 +
  24 + # Filter by specific milestone_id (or lack thereof)?
  25 + if params[:milestone_id].present?
  26 + merge_requests = merge_requests.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
  27 + end
  28 +
  29 + merge_requests
15 end 30 end
16 end 31 end
app/contexts/search_context.rb
@@ -13,6 +13,7 @@ class SearchContext @@ -13,6 +13,7 @@ class SearchContext
13 result[:projects] = Project.where(id: project_ids).search(query).limit(10) 13 result[:projects] = Project.where(id: project_ids).search(query).limit(10)
14 result[:merge_requests] = MergeRequest.where(project_id: project_ids).search(query).limit(10) 14 result[:merge_requests] = MergeRequest.where(project_id: project_ids).search(query).limit(10)
15 result[:issues] = Issue.where(project_id: project_ids).search(query).limit(10) 15 result[:issues] = Issue.where(project_id: project_ids).search(query).limit(10)
  16 + result[:wiki_pages] = Wiki.where(project_id: project_ids).search(query).limit(10)
16 result 17 result
17 end 18 end
18 19
@@ -20,7 +21,8 @@ class SearchContext @@ -20,7 +21,8 @@ class SearchContext
20 @result ||= { 21 @result ||= {
21 projects: [], 22 projects: [],
22 merge_requests: [], 23 merge_requests: [],
23 - issues: [] 24 + issues: [],
  25 + wiki_pages: []
24 } 26 }
25 end 27 end
26 end 28 end
app/controllers/admin/dashboard_controller.rb
1 class Admin::DashboardController < AdminController 1 class Admin::DashboardController < AdminController
2 def index 2 def index
3 - @workers = Resque.workers  
4 - @pending_jobs = Resque.size(:post_receive)  
5 @projects = Project.order("created_at DESC").limit(10) 3 @projects = Project.order("created_at DESC").limit(10)
6 @users = User.order("created_at DESC").limit(10) 4 @users = User.order("created_at DESC").limit(10)
  5 +
  6 + @resque_accessible = true
  7 + @workers = Resque.workers
  8 + @pending_jobs = Resque.size(:post_receive)
  9 +
  10 + rescue Redis::InheritedError
  11 + @resque_accessible = false
7 end 12 end
8 end 13 end
app/controllers/admin/projects_controller.rb
@@ -4,7 +4,7 @@ class Admin::ProjectsController &lt; AdminController @@ -4,7 +4,7 @@ class Admin::ProjectsController &lt; AdminController
4 def index 4 def index
5 @admin_projects = Project.scoped 5 @admin_projects = Project.scoped
6 @admin_projects = @admin_projects.search(params[:name]) if params[:name].present? 6 @admin_projects = @admin_projects.search(params[:name]) if params[:name].present?
7 - @admin_projects = @admin_projects.page(params[:page]).per(20) 7 + @admin_projects = @admin_projects.order("name ASC").page(params[:page]).per(20)
8 end 8 end
9 9
10 def show 10 def show
app/controllers/admin/users_controller.rb
@@ -98,6 +98,9 @@ class Admin::UsersController &lt; AdminController @@ -98,6 +98,9 @@ class Admin::UsersController &lt; AdminController
98 98
99 def destroy 99 def destroy
100 @admin_user = User.find(params[:id]) 100 @admin_user = User.find(params[:id])
  101 + if @admin_user.my_own_projects.count > 0
  102 + redirect_to admin_users_path, alert: "User is a project owner and can't be removed." and return
  103 + end
101 @admin_user.destroy 104 @admin_user.destroy
102 105
103 respond_to do |format| 106 respond_to do |format|
app/controllers/application_controller.rb
@@ -9,19 +9,28 @@ class ApplicationController &lt; ActionController::Base @@ -9,19 +9,28 @@ class ApplicationController &lt; ActionController::Base
9 helper_method :abilities, :can? 9 helper_method :abilities, :can?
10 10
11 rescue_from Gitlab::Gitolite::AccessDenied do |exception| 11 rescue_from Gitlab::Gitolite::AccessDenied do |exception|
  12 + log_exception(exception)
12 render "errors/gitolite", layout: "errors", status: 500 13 render "errors/gitolite", layout: "errors", status: 500
13 end 14 end
14 15
15 rescue_from Encoding::CompatibilityError do |exception| 16 rescue_from Encoding::CompatibilityError do |exception|
  17 + log_exception(exception)
16 render "errors/encoding", layout: "errors", status: 500 18 render "errors/encoding", layout: "errors", status: 500
17 end 19 end
18 20
19 rescue_from ActiveRecord::RecordNotFound do |exception| 21 rescue_from ActiveRecord::RecordNotFound do |exception|
  22 + log_exception(exception)
20 render "errors/not_found", layout: "errors", status: 404 23 render "errors/not_found", layout: "errors", status: 404
21 end 24 end
22 25
23 protected 26 protected
24 27
  28 + def log_exception(exception)
  29 + application_trace = ActionDispatch::ExceptionWrapper.new(env, exception).application_trace
  30 + application_trace.map!{ |t| " #{t}\n" }
  31 + logger.error "\n#{exception.class.name} (#{exception.message}):\n#{application_trace.join}"
  32 + end
  33 +
25 def reject_blocked! 34 def reject_blocked!
26 if current_user && current_user.blocked 35 if current_user && current_user.blocked
27 sign_out current_user 36 sign_out current_user
app/controllers/blob_controller.rb
1 # Controller for viewing a file's blame 1 # Controller for viewing a file's blame
2 class BlobController < ProjectResourceController 2 class BlobController < ProjectResourceController
3 include ExtractsPath 3 include ExtractsPath
4 - include Gitlab::Encode  
5 4
6 # Authorize 5 # Authorize
7 before_filter :authorize_read_project! 6 before_filter :authorize_read_project!
@@ -12,16 +11,9 @@ class BlobController &lt; ProjectResourceController @@ -12,16 +11,9 @@ class BlobController &lt; ProjectResourceController
12 11
13 def show 12 def show
14 if @tree.is_blob? 13 if @tree.is_blob?
15 - if @tree.text?  
16 - encoding = detect_encoding(@tree.data)  
17 - mime_type = encoding ? "text/plain; charset=#{encoding}" : "text/plain"  
18 - else  
19 - mime_type = @tree.mime_type  
20 - end  
21 -  
22 send_data( 14 send_data(
23 @tree.data, 15 @tree.data,
24 - type: mime_type, 16 + type: @tree.mime_type,
25 disposition: 'inline', 17 disposition: 'inline',
26 filename: @tree.name 18 filename: @tree.name
27 ) 19 )
app/controllers/dashboard_controller.rb
1 class DashboardController < ApplicationController 1 class DashboardController < ApplicationController
2 respond_to :html 2 respond_to :html
3 3
  4 + before_filter :event_filter, only: :index
  5 +
4 def index 6 def index
5 @groups = Group.where(id: current_user.projects.pluck(:group_id)) 7 @groups = Group.where(id: current_user.projects.pluck(:group_id))
6 - @projects = current_user.projects_with_events 8 + @projects = current_user.projects_sorted_by_activity
7 @projects = @projects.page(params[:page]).per(30) 9 @projects = @projects.page(params[:page]).per(30)
8 10
9 - @events = Event.in_projects(current_user.project_ids).limit(20).offset(params[:offset] || 0) 11 + @events = Event.in_projects(current_user.project_ids)
  12 + @events = @event_filter.apply_filter(@events)
  13 + @events = @events.limit(20).offset(params[:offset] || 0)
  14 +
10 @last_push = current_user.recent_push 15 @last_push = current_user.recent_push
11 16
12 respond_to do |format| 17 respond_to do |format|
@@ -34,4 +39,8 @@ class DashboardController &lt; ApplicationController @@ -34,4 +39,8 @@ class DashboardController &lt; ApplicationController
34 format.atom { render layout: false } 39 format.atom { render layout: false }
35 end 40 end
36 end 41 end
  42 +
  43 + def event_filter
  44 + @event_filter ||= EventFilter.new(params[:event_filter])
  45 + end
37 end 46 end
app/controllers/groups_controller.rb
@@ -54,7 +54,7 @@ class GroupsController &lt; ApplicationController @@ -54,7 +54,7 @@ class GroupsController &lt; ApplicationController
54 end 54 end
55 55
56 def projects 56 def projects
57 - @projects ||= current_user.projects_with_events.where(group_id: @group.id) 57 + @projects ||= current_user.projects_sorted_by_activity.where(group_id: @group.id)
58 end 58 end
59 59
60 def project_ids 60 def project_ids
app/controllers/milestones_controller.rb
@@ -31,7 +31,8 @@ class MilestonesController &lt; ProjectResourceController @@ -31,7 +31,8 @@ class MilestonesController &lt; ProjectResourceController
31 31
32 def show 32 def show
33 @issues = @milestone.issues 33 @issues = @milestone.issues
34 - @users = @milestone.participants 34 + @users = UserDecorator.decorate(@milestone.participants)
  35 + @merge_requests = @milestone.merge_requests
35 36
36 respond_to do |format| 37 respond_to do |format|
37 format.html 38 format.html
app/controllers/profile_controller.rb
@@ -9,7 +9,11 @@ class ProfileController &lt; ApplicationController @@ -9,7 +9,11 @@ class ProfileController &lt; ApplicationController
9 9
10 def update 10 def update
11 @user.update_attributes(params[:user]) 11 @user.update_attributes(params[:user])
12 - redirect_to :back 12 +
  13 + respond_to do |format|
  14 + format.html { redirect_to :back }
  15 + format.js
  16 + end
13 end 17 end
14 18
15 def token 19 def token
@@ -22,7 +26,7 @@ class ProfileController &lt; ApplicationController @@ -22,7 +26,7 @@ class ProfileController &lt; ApplicationController
22 flash[:notice] = "Password was successfully updated. Please login with it" 26 flash[:notice] = "Password was successfully updated. Please login with it"
23 redirect_to new_user_session_path 27 redirect_to new_user_session_path
24 else 28 else
25 - render action: "password" 29 + render 'account'
26 end 30 end
27 end 31 end
28 32
app/controllers/projects_controller.rb
1 -require Rails.root.join('lib', 'gitlab', 'graph_commit') 1 +require Rails.root.join('lib', 'gitlab', 'graph', 'json_builder')
2 2
3 class ProjectsController < ProjectResourceController 3 class ProjectsController < ProjectResourceController
4 skip_before_filter :project, only: [:new, :create] 4 skip_before_filter :project, only: [:new, :create]
@@ -21,9 +21,10 @@ class ProjectsController &lt; ProjectResourceController @@ -21,9 +21,10 @@ class ProjectsController &lt; ProjectResourceController
21 @project = Project.create_by_user(params[:project], current_user) 21 @project = Project.create_by_user(params[:project], current_user)
22 22
23 respond_to do |format| 23 respond_to do |format|
  24 + flash[:notice] = 'Project was successfully created.' if @project.saved?
24 format.html do 25 format.html do
25 if @project.saved? 26 if @project.saved?
26 - redirect_to(@project, notice: 'Project was successfully created.') 27 + redirect_to @project
27 else 28 else
28 render action: "new" 29 render action: "new"
29 end 30 end
@@ -79,7 +80,9 @@ class ProjectsController &lt; ProjectResourceController @@ -79,7 +80,9 @@ class ProjectsController &lt; ProjectResourceController
79 end 80 end
80 81
81 def graph 82 def graph
82 - @days_json, @commits_json = Gitlab::GraphCommit.to_graph(project) 83 + graph = Gitlab::Graph::JsonBuilder.new(project)
  84 +
  85 + @days_json, @commits_json = graph.days_json, graph.commits_json
83 end 86 end
84 87
85 def destroy 88 def destroy
app/controllers/refs_controller.rb
1 class RefsController < ProjectResourceController 1 class RefsController < ProjectResourceController
2 - include Gitlab::Encode  
3 2
4 # Authorize 3 # Authorize
5 before_filter :authorize_read_project! 4 before_filter :authorize_read_project!
app/controllers/repositories_controller.rb
@@ -16,9 +16,14 @@ class RepositoriesController &lt; ProjectResourceController @@ -16,9 +16,14 @@ class RepositoriesController &lt; ProjectResourceController
16 @tags = @project.tags 16 @tags = @project.tags
17 end 17 end
18 18
  19 + def stats
  20 + @stats = Gitlab::GitStats.new(@project.repo, @project.root_ref)
  21 + @graph = @stats.graph
  22 + end
  23 +
19 def archive 24 def archive
20 unless can?(current_user, :download_code, @project) 25 unless can?(current_user, :download_code, @project)
21 - render_404 and return 26 + render_404 and return
22 end 27 end
23 28
24 29
app/controllers/search_controller.rb
@@ -5,5 +5,6 @@ class SearchController &lt; ApplicationController @@ -5,5 +5,6 @@ class SearchController &lt; ApplicationController
5 @projects = result[:projects] 5 @projects = result[:projects]
6 @merge_requests = result[:merge_requests] 6 @merge_requests = result[:merge_requests]
7 @issues = result[:issues] 7 @issues = result[:issues]
  8 + @wiki_pages = result[:wiki_pages]
8 end 9 end
9 end 10 end
app/controllers/services_controller.rb 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +class ServicesController < ProjectResourceController
  2 + # Authorize
  3 + before_filter :authorize_admin_project!
  4 +
  5 + respond_to :html
  6 +
  7 + def index
  8 + @gitlab_ci_service = @project.gitlab_ci_service
  9 + end
  10 +
  11 + def edit
  12 + @service = @project.gitlab_ci_service
  13 +
  14 + # Create if missing
  15 + @service = @project.create_gitlab_ci_service unless @service
  16 + end
  17 +
  18 + def update
  19 + @service = @project.gitlab_ci_service
  20 +
  21 + if @service.update_attributes(params[:service])
  22 + redirect_to edit_project_service_path(@project, :gitlab_ci)
  23 + else
  24 + render 'edit'
  25 + end
  26 + end
  27 +
  28 + def test
  29 + commits = project.commits(project.default_branch, nil, 3)
  30 + data = project.post_receive_data(commits.last.id, commits.first.id, "refs/heads/#{project.default_branch}", current_user)
  31 +
  32 + @service = project.gitlab_ci_service
  33 + @service.execute(data)
  34 +
  35 + redirect_to :back
  36 + end
  37 +end
app/controllers/tree_controller.rb
@@ -26,15 +26,14 @@ class TreeController &lt; ProjectResourceController @@ -26,15 +26,14 @@ class TreeController &lt; ProjectResourceController
26 end 26 end
27 27
28 def update 28 def update
29 - file_editor = Gitlab::FileEditor.new(current_user, @project, @ref)  
30 - update_status = file_editor.update(  
31 - @path, 29 + edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path)
  30 + updated_successfully = edit_file_action.commit!(
32 params[:content], 31 params[:content],
33 params[:commit_message], 32 params[:commit_message],
34 params[:last_commit] 33 params[:last_commit]
35 ) 34 )
36 35
37 - if update_status 36 + if updated_successfully
38 redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited" 37 redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited"
39 else 38 else
40 flash[:notice] = "Your changes could not be commited, because the file has been changed" 39 flash[:notice] = "Your changes could not be commited, because the file has been changed"
app/decorators/commit_decorator.rb
@@ -47,21 +47,15 @@ class CommitDecorator &lt; ApplicationDecorator @@ -47,21 +47,15 @@ class CommitDecorator &lt; ApplicationDecorator
47 # Otherwise it will link to the author email as specified in the commit. 47 # Otherwise it will link to the author email as specified in the commit.
48 # 48 #
49 # options: 49 # options:
50 - # avatar: true will prepend avatar image  
51 - def author_link(options)  
52 - text = if options[:avatar]  
53 - avatar = h.image_tag h.gravatar_icon(author_email), class: "avatar", width: 16  
54 - "#{avatar} #{author_name}"  
55 - else  
56 - author_name  
57 - end  
58 - team_member = @project.try(:team_member_by_name_or_email, author_name, author_email) 50 + # avatar: true will prepend the avatar image
  51 + # size: size of the avatar image in px
  52 + def author_link(options = {})
  53 + person_link(options.merge source: :author)
  54 + end
59 55
60 - if team_member.nil?  
61 - h.mail_to author_email, text.html_safe, class: "commit-author-link"  
62 - else  
63 - h.link_to text, h.project_team_member_path(@project, team_member), class: "commit-author-link"  
64 - end 56 + # Just like #author_link but for the committer.
  57 + def committer_link(options = {})
  58 + person_link(options.merge source: :committer)
65 end 59 end
66 60
67 protected 61 protected
@@ -69,4 +63,30 @@ class CommitDecorator &lt; ApplicationDecorator @@ -69,4 +63,30 @@ class CommitDecorator &lt; ApplicationDecorator
69 def no_commit_message 63 def no_commit_message
70 "--no commit message" 64 "--no commit message"
71 end 65 end
  66 +
  67 + # Private: Returns a link to a person. If the person has a matching user and
  68 + # is a member of the current @project it will link to the team member page.
  69 + # Otherwise it will link to the person email as specified in the commit.
  70 + #
  71 + # options:
  72 + # source: one of :author or :committer
  73 + # avatar: true will prepend the avatar image
  74 + # size: size of the avatar image in px
  75 + def person_link(options = {})
  76 + source_name = send "#{options[:source]}_name".to_sym
  77 + source_email = send "#{options[:source]}_email".to_sym
  78 + text = if options[:avatar]
  79 + avatar = h.image_tag h.gravatar_icon(source_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size]
  80 + %Q{#{avatar} <span class="commit-#{options[:source]}-name">#{source_name}</span>}
  81 + else
  82 + source_name
  83 + end
  84 + team_member = @project.try(:team_member_by_name_or_email, source_name, source_email)
  85 +
  86 + if team_member.nil?
  87 + h.mail_to source_email, text.html_safe, class: "commit-#{options[:source]}-link"
  88 + else
  89 + h.link_to text, h.project_team_member_path(@project, team_member), class: "commit-#{options[:source]}-link"
  90 + end
  91 + end
72 end 92 end
app/decorators/tree_decorator.rb
@@ -8,14 +8,14 @@ class TreeDecorator &lt; ApplicationDecorator @@ -8,14 +8,14 @@ class TreeDecorator &lt; ApplicationDecorator
8 8
9 #parts = parts[0...-1] if is_blob? 9 #parts = parts[0...-1] if is_blob?
10 10
11 - yield(h.link_to("..", "#", remote: true)) if parts.count > max_links 11 + yield(h.link_to("..", "#")) if parts.count > max_links
12 12
13 parts.each do |part| 13 parts.each do |part|
14 part_path = File.join(part_path, part) unless part_path.empty? 14 part_path = File.join(part_path, part) unless part_path.empty?
15 part_path = part if part_path.empty? 15 part_path = part if part_path.empty?
16 16
17 next unless parts.last(2).include?(part) if parts.count > max_links 17 next unless parts.last(2).include?(part) if parts.count > max_links
18 - yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path)), remote: true)) 18 + yield(h.link_to(h.truncate(part, length: 40), h.project_tree_path(project, h.tree_join(ref, part_path))))
19 end 19 end
20 end 20 end
21 end 21 end
app/decorators/user_decorator.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +class UserDecorator < ApplicationDecorator
  2 + decorates :user
  3 +
  4 + def avatar_image size = 16
  5 + h.image_tag h.gravatar_icon(self.email, size), class: "avatar #{"s#{size}"}", width: size
  6 + end
  7 +
  8 + def tm_of(project)
  9 + project.team_member_by_id(self.id)
  10 + end
  11 +end
app/helpers/application_helper.rb
@@ -36,7 +36,7 @@ module ApplicationHelper @@ -36,7 +36,7 @@ module ApplicationHelper
36 else 36 else
37 gravatar_prefix = request.ssl? ? "https://secure" : "http://www" 37 gravatar_prefix = request.ssl? ? "https://secure" : "http://www"
38 user_email.strip! 38 user_email.strip!
39 - "#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=identicon" 39 + "#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=mm"
40 end 40 end
41 end 41 end
42 42
app/helpers/commits_helper.rb
@@ -57,12 +57,17 @@ module CommitsHelper @@ -57,12 +57,17 @@ module CommitsHelper
57 57
58 def image_diff_class(diff) 58 def image_diff_class(diff)
59 if diff.deleted_file 59 if diff.deleted_file
60 - "diff_image_removed" 60 + "diff_removed"
61 elsif diff.new_file 61 elsif diff.new_file
62 - "diff_image_added" 62 + "diff_added"
63 else 63 else
64 nil 64 nil
65 end 65 end
66 end 66 end
67 67
  68 + def commit_to_html commit
  69 + if commit.model
  70 + escape_javascript(render 'commits/commit', commit: commit)
  71 + end
  72 + end
68 end 73 end
app/helpers/events_helper.rb
@@ -33,4 +33,22 @@ module EventsHelper @@ -33,4 +33,22 @@ module EventsHelper
33 image_tag event_image_path 33 image_tag event_image_path
34 end 34 end
35 end 35 end
  36 +
  37 + def event_filter_link key, tooltip
  38 + key = key.to_s
  39 +
  40 + filter = @event_filter.options key
  41 +
  42 + inactive = if @event_filter.active? key
  43 + nil
  44 + else
  45 + 'inactive'
  46 + end
  47 +
  48 + content_tag :div, class: "filter_icon #{inactive}" do
  49 + link_to dashboard_path(event_filter: filter), class: 'has_tooltip', 'data-original-title' => tooltip do
  50 + image_tag "event_filter_#{key}.png"
  51 + end
  52 + end
  53 + end
36 end 54 end
app/helpers/merge_requests_helper.rb
@@ -38,4 +38,8 @@ module MergeRequestsHelper @@ -38,4 +38,8 @@ module MergeRequestsHelper
38 classes << " merged" if mr.merged? 38 classes << " merged" if mr.merged?
39 classes 39 classes
40 end 40 end
  41 +
  42 + def ci_status_path
  43 + @project.gitlab_ci_service.commit_badge_path(@merge_request.last_commit.sha)
  44 + end
41 end 45 end
app/helpers/projects_helper.rb
@@ -10,5 +10,9 @@ module ProjectsHelper @@ -10,5 +10,9 @@ module ProjectsHelper
10 def link_to_project project 10 def link_to_project project
11 link_to project.name, project 11 link_to project.name, project
12 end 12 end
  13 +
  14 + def tm_path team_member
  15 + project_team_member_path(@project, team_member)
  16 + end
13 end 17 end
14 18
app/helpers/tree_helper.rb
@@ -67,4 +67,29 @@ module TreeHelper @@ -67,4 +67,29 @@ module TreeHelper
67 can?(current_user, :push_code, @project) 67 can?(current_user, :push_code, @project)
68 end 68 end
69 end 69 end
  70 +
  71 + # Breadcrumb links for a Project and, if applicable, a tree path
  72 + def breadcrumbs
  73 + return unless @project && @ref
  74 +
  75 + # Add the root project link and the arrow icon
  76 + crumbs = content_tag(:li) do
  77 + content_tag(:span, nil, class: 'arrow') +
  78 + link_to(@project.name, project_commits_path(@project, @ref))
  79 + end
  80 +
  81 + if @path
  82 + parts = @path.split('/')
  83 +
  84 + parts.each_with_index do |part, i|
  85 + crumbs += content_tag(:span, '/', class: 'divider')
  86 + crumbs += content_tag(:li) do
  87 + # The text is just the individual part, but the link needs all the parts before it
  88 + link_to part, project_commits_path(@project, tree_join(@ref, parts[0..i].join('/')))
  89 + end
  90 + end
  91 + end
  92 +
  93 + crumbs.html_safe
  94 + end
70 end 95 end
app/models/commit.rb
1 class Commit 1 class Commit
2 include ActiveModel::Conversion 2 include ActiveModel::Conversion
3 - include Gitlab::Encode  
4 include StaticModel 3 include StaticModel
5 extend ActiveModel::Naming 4 extend ActiveModel::Naming
6 5
  6 + # Safe amount of files with diffs in one commit to render
  7 + # Used to prevent 500 error on huge commits by suppressing diff
  8 + #
  9 + DIFF_SAFE_SIZE = 100
  10 +
7 attr_accessor :commit, :head, :refs 11 attr_accessor :commit, :head, :refs
8 12
9 delegate :message, :authored_date, :committed_date, :parents, :sha, 13 delegate :message, :authored_date, :committed_date, :parents, :sha,
@@ -107,7 +111,7 @@ class Commit @@ -107,7 +111,7 @@ class Commit
107 end 111 end
108 112
109 def safe_message 113 def safe_message
110 - @safe_message ||= utf8 message 114 + @safe_message ||= message
111 end 115 end
112 116
113 def created_at 117 def created_at
@@ -119,7 +123,7 @@ class Commit @@ -119,7 +123,7 @@ class Commit
119 end 123 end
120 124
121 def author_name 125 def author_name
122 - utf8 author.name 126 + author.name
123 end 127 end
124 128
125 # Was this commit committed by a different person than the original author? 129 # Was this commit committed by a different person than the original author?
@@ -128,7 +132,7 @@ class Commit @@ -128,7 +132,7 @@ class Commit
128 end 132 end
129 133
130 def committer_name 134 def committer_name
131 - utf8 committer.name 135 + committer.name
132 end 136 end
133 137
134 def committer_email 138 def committer_email
app/models/event.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: events
  4 +#
  5 +# id :integer not null, primary key
  6 +# target_type :string(255)
  7 +# target_id :integer
  8 +# title :string(255)
  9 +# data :text
  10 +# project_id :integer
  11 +# created_at :datetime not null
  12 +# updated_at :datetime not null
  13 +# action :integer
  14 +# author_id :integer
  15 +#
  16 +
1 class Event < ActiveRecord::Base 17 class Event < ActiveRecord::Base
2 include PushEvent 18 include PushEvent
3 19
@@ -144,20 +160,3 @@ class Event &lt; ActiveRecord::Base @@ -144,20 +160,3 @@ class Event &lt; ActiveRecord::Base
144 end 160 end
145 end 161 end
146 end 162 end
147 -  
148 -# == Schema Information  
149 -#  
150 -# Table name: events  
151 -#  
152 -# id :integer not null, primary key  
153 -# target_type :string(255)  
154 -# target_id :integer  
155 -# title :string(255)  
156 -# data :text  
157 -# project_id :integer  
158 -# created_at :datetime not null  
159 -# updated_at :datetime not null  
160 -# action :integer  
161 -# author_id :integer  
162 -#  
163 -  
app/models/gitlab_ci_service.rb 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +#
  15 +
  16 +class GitlabCiService < Service
  17 + attr_accessible :project_url
  18 +
  19 + validates :project_url, presence: true, if: :activated?
  20 + validates :token, presence: true, if: :activated?
  21 +
  22 + delegate :execute, to: :service_hook, prefix: nil
  23 +
  24 + after_save :compose_service_hook, if: :activated?
  25 +
  26 + def activated?
  27 + active
  28 + end
  29 +
  30 + def compose_service_hook
  31 + hook = service_hook || build_service_hook
  32 + hook.url = [project_url, "/build", "?token=#{token}"].join("")
  33 + hook.save
  34 + end
  35 +
  36 + def commit_badge_path sha
  37 + project_url + "/status?sha=#{sha}"
  38 + end
  39 +end
app/models/group.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: groups
  4 +#
  5 +# id :integer not null, primary key
  6 +# name :string(255) not null
  7 +# code :string(255) not null
  8 +# owner_id :integer not null
  9 +# created_at :datetime not null
  10 +# updated_at :datetime not null
  11 +#
  12 +
1 class Group < ActiveRecord::Base 13 class Group < ActiveRecord::Base
2 attr_accessible :code, :name, :owner_id 14 attr_accessible :code, :name, :owner_id
3 15
@@ -22,16 +34,3 @@ class Group &lt; ActiveRecord::Base @@ -22,16 +34,3 @@ class Group &lt; ActiveRecord::Base
22 User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq 34 User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq
23 end 35 end
24 end 36 end
25 -  
26 -# == Schema Information  
27 -#  
28 -# Table name: groups  
29 -#  
30 -# id :integer not null, primary key  
31 -# name :string(255) not null  
32 -# code :string(255) not null  
33 -# owner_id :integer not null  
34 -# created_at :datetime not null  
35 -# updated_at :datetime not null  
36 -#  
37 -  
app/models/issue.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: issues
  4 +#
  5 +# id :integer not null, primary key
  6 +# title :string(255)
  7 +# assignee_id :integer
  8 +# author_id :integer
  9 +# project_id :integer
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# closed :boolean default(FALSE), not null
  13 +# position :integer default(0)
  14 +# branch_name :string(255)
  15 +# description :text
  16 +# milestone_id :integer
  17 +#
  18 +
1 class Issue < ActiveRecord::Base 19 class Issue < ActiveRecord::Base
2 include IssueCommonality 20 include IssueCommonality
3 include Votes 21 include Votes
@@ -7,30 +25,9 @@ class Issue &lt; ActiveRecord::Base @@ -7,30 +25,9 @@ class Issue &lt; ActiveRecord::Base
7 25
8 acts_as_taggable_on :labels 26 acts_as_taggable_on :labels
9 27
10 - belongs_to :milestone  
11 -  
12 validates :description, length: { within: 0..2000 } 28 validates :description, length: { within: 0..2000 }
13 29
14 def self.open_for(user) 30 def self.open_for(user)
15 opened.assigned(user) 31 opened.assigned(user)
16 end 32 end
17 end 33 end
18 -  
19 -# == Schema Information  
20 -#  
21 -# Table name: issues  
22 -#  
23 -# id :integer not null, primary key  
24 -# title :string(255)  
25 -# assignee_id :integer  
26 -# author_id :integer  
27 -# project_id :integer  
28 -# created_at :datetime not null  
29 -# updated_at :datetime not null  
30 -# closed :boolean default(FALSE), not null  
31 -# position :integer default(0)  
32 -# branch_name :string(255)  
33 -# description :text  
34 -# milestone_id :integer  
35 -#  
36 -  
app/models/key.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: keys
  4 +#
  5 +# id :integer not null, primary key
  6 +# user_id :integer
  7 +# created_at :datetime not null
  8 +# updated_at :datetime not null
  9 +# key :text
  10 +# title :string(255)
  11 +# identifier :string(255)
  12 +# project_id :integer
  13 +#
  14 +
1 require 'digest/md5' 15 require 'digest/md5'
2 16
3 class Key < ActiveRecord::Base 17 class Key < ActiveRecord::Base
@@ -67,18 +81,3 @@ class Key &lt; ActiveRecord::Base @@ -67,18 +81,3 @@ class Key &lt; ActiveRecord::Base
67 Key.where(identifier: identifier).count == 0 81 Key.where(identifier: identifier).count == 0
68 end 82 end
69 end 83 end
70 -  
71 -# == Schema Information  
72 -#  
73 -# Table name: keys  
74 -#  
75 -# id :integer not null, primary key  
76 -# user_id :integer  
77 -# created_at :datetime not null  
78 -# updated_at :datetime not null  
79 -# key :text  
80 -# title :string(255)  
81 -# identifier :string(255)  
82 -# project_id :integer  
83 -#  
84 -  
app/models/merge_request.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: merge_requests
  4 +#
  5 +# id :integer not null, primary key
  6 +# target_branch :string(255) not null
  7 +# source_branch :string(255) not null
  8 +# project_id :integer not null
  9 +# author_id :integer
  10 +# assignee_id :integer
  11 +# title :string(255)
  12 +# closed :boolean default(FALSE), not null
  13 +# created_at :datetime not null
  14 +# updated_at :datetime not null
  15 +# st_commits :text(2147483647)
  16 +# st_diffs :text(2147483647)
  17 +# merged :boolean default(FALSE), not null
  18 +# state :integer default(1), not null
  19 +# milestone_id :integer
  20 +#
  21 +
1 require Rails.root.join("app/models/commit") 22 require Rails.root.join("app/models/commit")
  23 +require Rails.root.join("app/roles/static_model")
2 24
3 class MergeRequest < ActiveRecord::Base 25 class MergeRequest < ActiveRecord::Base
4 include IssueCommonality 26 include IssueCommonality
5 include Votes 27 include Votes
6 28
7 - attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch, 29 + attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch, :milestone_id,
8 :author_id_of_changes 30 :author_id_of_changes
9 31
10 attr_accessor :should_remove_source_branch 32 attr_accessor :should_remove_source_branch
@@ -26,6 +48,10 @@ class MergeRequest &lt; ActiveRecord::Base @@ -26,6 +48,10 @@ class MergeRequest &lt; ActiveRecord::Base
26 where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) 48 where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name)
27 end 49 end
28 50
  51 + def self.find_all_by_milestone(milestone)
  52 + where("milestone_id = :milestone_id", milestone_id: milestone)
  53 + end
  54 +
29 def human_state 55 def human_state
30 states = { 56 states = {
31 CAN_BE_MERGED => "can_be_merged", 57 CAN_BE_MERGED => "can_be_merged",
@@ -60,7 +86,7 @@ class MergeRequest &lt; ActiveRecord::Base @@ -60,7 +86,7 @@ class MergeRequest &lt; ActiveRecord::Base
60 end 86 end
61 87
62 def check_if_can_be_merged 88 def check_if_can_be_merged
63 - self.state = if Gitlab::Merge.new(self, self.author).can_be_merged? 89 + self.state = if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
64 CAN_BE_MERGED 90 CAN_BE_MERGED
65 else 91 else
66 CANNOT_BE_MERGED 92 CANNOT_BE_MERGED
@@ -167,7 +193,7 @@ class MergeRequest &lt; ActiveRecord::Base @@ -167,7 +193,7 @@ class MergeRequest &lt; ActiveRecord::Base
167 end 193 end
168 194
169 def automerge!(current_user) 195 def automerge!(current_user)
170 - if Gitlab::Merge.new(self, current_user).merge! && self.unmerged_commits.empty? 196 + if Gitlab::Satellite::MergeAction.new(current_user, self).merge! && self.unmerged_commits.empty?
171 self.merge!(current_user.id) 197 self.merge!(current_user.id)
172 true 198 true
173 end 199 end
@@ -193,24 +219,3 @@ class MergeRequest &lt; ActiveRecord::Base @@ -193,24 +219,3 @@ class MergeRequest &lt; ActiveRecord::Base
193 Note.where("(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND noteable_id IN (:commit_ids))", mr_id: id, commit_ids: commit_ids) 219 Note.where("(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND noteable_id IN (:commit_ids))", mr_id: id, commit_ids: commit_ids)
194 end 220 end
195 end 221 end
196 -  
197 -# == Schema Information  
198 -#  
199 -# Table name: merge_requests  
200 -#  
201 -# id :integer not null, primary key  
202 -# target_branch :string(255) not null  
203 -# source_branch :string(255) not null  
204 -# project_id :integer not null  
205 -# author_id :integer  
206 -# assignee_id :integer  
207 -# title :string(255)  
208 -# closed :boolean default(FALSE), not null  
209 -# created_at :datetime not null  
210 -# updated_at :datetime not null  
211 -# st_commits :text(4294967295  
212 -# st_diffs :text(4294967295  
213 -# merged :boolean default(FALSE), not null  
214 -# state :integer default(1), not null  
215 -#  
216 -  
app/models/milestone.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: milestones
  4 +#
  5 +# id :integer not null, primary key
  6 +# title :string(255) not null
  7 +# project_id :integer not null
  8 +# description :text
  9 +# due_date :date
  10 +# closed :boolean default(FALSE), not null
  11 +# created_at :datetime not null
  12 +# updated_at :datetime not null
  13 +#
  14 +
1 class Milestone < ActiveRecord::Base 15 class Milestone < ActiveRecord::Base
2 attr_accessible :title, :description, :due_date, :closed 16 attr_accessible :title, :description, :due_date, :closed
3 17
4 belongs_to :project 18 belongs_to :project
5 has_many :issues 19 has_many :issues
  20 + has_many :merge_requests
6 21
7 validates :title, presence: true 22 validates :title, presence: true
8 validates :project, presence: true 23 validates :project, presence: true
  24 + validates :closed, inclusion: { in: [true, false] }
9 25
10 def self.active 26 def self.active
11 where("due_date > ? OR due_date IS NULL", Date.today) 27 where("due_date > ? OR due_date IS NULL", Date.today)
@@ -15,8 +31,20 @@ class Milestone &lt; ActiveRecord::Base @@ -15,8 +31,20 @@ class Milestone &lt; ActiveRecord::Base
15 User.where(id: issues.pluck(:assignee_id)) 31 User.where(id: issues.pluck(:assignee_id))
16 end 32 end
17 33
  34 + def open_items_count
  35 + self.issues.opened.count + self.merge_requests.opened.count
  36 + end
  37 +
  38 + def closed_items_count
  39 + self.issues.closed.count + self.merge_requests.closed.count
  40 + end
  41 +
  42 + def total_items_count
  43 + self.issues.count + self.merge_requests.count
  44 + end
  45 +
18 def percent_complete 46 def percent_complete
19 - ((self.issues.closed.count * 100) / self.issues.count).abs 47 + ((closed_items_count * 100) / total_items_count).abs
20 rescue ZeroDivisionError 48 rescue ZeroDivisionError
21 100 49 100
22 end 50 end
@@ -25,18 +53,3 @@ class Milestone &lt; ActiveRecord::Base @@ -25,18 +53,3 @@ class Milestone &lt; ActiveRecord::Base
25 "expires at #{due_date.stamp("Aug 21, 2011")}" if due_date 53 "expires at #{due_date.stamp("Aug 21, 2011")}" if due_date
26 end 54 end
27 end 55 end
28 -  
29 -# == Schema Information  
30 -#  
31 -# Table name: milestones  
32 -#  
33 -# id :integer not null, primary key  
34 -# title :string(255) not null  
35 -# project_id :integer not null  
36 -# description :text  
37 -# due_date :date  
38 -# closed :boolean default(FALSE), not null  
39 -# created_at :datetime not null  
40 -# updated_at :datetime not null  
41 -#  
42 -  
app/models/note.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: notes
  4 +#
  5 +# id :integer not null, primary key
  6 +# note :text
  7 +# noteable_id :string(255)
  8 +# noteable_type :string(255)
  9 +# author_id :integer
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# project_id :integer
  13 +# attachment :string(255)
  14 +# line_code :string(255)
  15 +#
  16 +
1 require 'carrierwave/orm/activerecord' 17 require 'carrierwave/orm/activerecord'
2 require 'file_size_validator' 18 require 'file_size_validator'
3 19
@@ -23,13 +39,13 @@ class Note &lt; ActiveRecord::Base @@ -23,13 +39,13 @@ class Note &lt; ActiveRecord::Base
23 mount_uploader :attachment, AttachmentUploader 39 mount_uploader :attachment, AttachmentUploader
24 40
25 # Scopes 41 # Scopes
26 - scope :common, where(noteable_id: nil)  
27 - scope :today, where("created_at >= :date", date: Date.today)  
28 - scope :last_week, where("created_at >= :date", date: (Date.today - 7.days)) 42 + scope :common, ->{ where(noteable_id: nil) }
  43 + scope :today, ->{ where("created_at >= :date", date: Date.today) }
  44 + scope :last_week, ->{ where("created_at >= :date", date: (Date.today - 7.days)) }
29 scope :since, ->(day) { where("created_at >= :date", date: (day)) } 45 scope :since, ->(day) { where("created_at >= :date", date: (day)) }
30 - scope :fresh, order("created_at ASC, id ASC")  
31 - scope :inc_author_project, includes(:project, :author)  
32 - scope :inc_author, includes(:author) 46 + scope :fresh, ->{ order("created_at ASC, id ASC") }
  47 + scope :inc_author_project, ->{ includes(:project, :author) }
  48 + scope :inc_author, ->{ includes(:author) }
33 49
34 def self.create_status_change_note(noteable, author, status) 50 def self.create_status_change_note(noteable, author, status)
35 create({ 51 create({
@@ -107,20 +123,3 @@ class Note &lt; ActiveRecord::Base @@ -107,20 +123,3 @@ class Note &lt; ActiveRecord::Base
107 note.start_with?('-1') || note.start_with?(':-1:') 123 note.start_with?('-1') || note.start_with?(':-1:')
108 end 124 end
109 end 125 end
110 -  
111 -# == Schema Information  
112 -#  
113 -# Table name: notes  
114 -#  
115 -# id :integer not null, primary key  
116 -# note :text  
117 -# noteable_id :string(255)  
118 -# noteable_type :string(255)  
119 -# author_id :integer  
120 -# created_at :datetime not null  
121 -# updated_at :datetime not null  
122 -# project_id :integer  
123 -# attachment :string(255)  
124 -# line_code :string(255)  
125 -#  
126 -  
app/models/project.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: projects
  4 +#
  5 +# id :integer not null, primary key
  6 +# name :string(255)
  7 +# path :string(255)
  8 +# description :text
  9 +# created_at :datetime not null
  10 +# updated_at :datetime not null
  11 +# private_flag :boolean default(TRUE), not null
  12 +# code :string(255)
  13 +# owner_id :integer
  14 +# default_branch :string(255)
  15 +# issues_enabled :boolean default(TRUE), not null
  16 +# wall_enabled :boolean default(TRUE), not null
  17 +# merge_requests_enabled :boolean default(TRUE), not null
  18 +# wiki_enabled :boolean default(TRUE), not null
  19 +# group_id :integer
  20 +#
  21 +
1 require "grit" 22 require "grit"
2 23
3 class Project < ActiveRecord::Base 24 class Project < ActiveRecord::Base
@@ -26,6 +47,7 @@ class Project &lt; ActiveRecord::Base @@ -26,6 +47,7 @@ class Project &lt; ActiveRecord::Base
26 has_many :wikis, dependent: :destroy 47 has_many :wikis, dependent: :destroy
27 has_many :protected_branches, dependent: :destroy 48 has_many :protected_branches, dependent: :destroy
28 has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id' 49 has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id'
  50 + has_one :gitlab_ci_service, dependent: :destroy
29 51
30 delegate :name, to: :owner, allow_nil: true, prefix: true 52 delegate :name, to: :owner, allow_nil: true, prefix: true
31 53
@@ -104,8 +126,10 @@ class Project &lt; ActiveRecord::Base @@ -104,8 +126,10 @@ class Project &lt; ActiveRecord::Base
104 end 126 end
105 127
106 def repo_name 128 def repo_name
107 - if path == "gitolite-admin"  
108 - errors.add(:path, " like 'gitolite-admin' is not allowed") 129 + denied_paths = %w(gitolite-admin groups projects dashboard)
  130 +
  131 + if denied_paths.include?(path)
  132 + errors.add(:path, "like #{path} is not allowed")
109 end 133 end
110 end 134 end
111 135
@@ -160,26 +184,12 @@ class Project &lt; ActiveRecord::Base @@ -160,26 +184,12 @@ class Project &lt; ActiveRecord::Base
160 def issues_labels 184 def issues_labels
161 issues.tag_counts_on(:labels) 185 issues.tag_counts_on(:labels)
162 end 186 end
163 -end  
164 187
165 -# == Schema Information  
166 -#  
167 -# Table name: projects  
168 -#  
169 -# id :integer not null, primary key  
170 -# name :string(255)  
171 -# path :string(255)  
172 -# description :text  
173 -# created_at :datetime not null  
174 -# updated_at :datetime not null  
175 -# private_flag :boolean default(TRUE), not null  
176 -# code :string(255)  
177 -# owner_id :integer  
178 -# default_branch :string(255)  
179 -# issues_enabled :boolean default(TRUE), not null  
180 -# wall_enabled :boolean default(TRUE), not null  
181 -# merge_requests_enabled :boolean default(TRUE), not null  
182 -# wiki_enabled :boolean default(TRUE), not null  
183 -# group_id :integer  
184 -# 188 + def services
  189 + [gitlab_ci_service].compact
  190 + end
185 191
  192 + def gitlab_ci?
  193 + gitlab_ci_service && gitlab_ci_service.active
  194 + end
  195 +end
app/models/project_hook.rb
1 -class ProjectHook < WebHook  
2 - belongs_to :project  
3 -end  
4 -  
5 # == Schema Information 1 # == Schema Information
6 # 2 #
7 # Table name: web_hooks 3 # Table name: web_hooks
8 # 4 #
9 -# id :integer not null, primary key 5 +# id :integer not null, primary key
10 # url :string(255) 6 # url :string(255)
11 # project_id :integer 7 # project_id :integer
12 -# created_at :datetime not null  
13 -# updated_at :datetime not null  
14 -# type :string(255) default("ProjectHook") 8 +# created_at :datetime not null
  9 +# updated_at :datetime not null
  10 +# type :string(255) default("ProjectHook")
  11 +# service_id :integer
15 # 12 #
16 13
  14 +class ProjectHook < WebHook
  15 + belongs_to :project
  16 +end
app/models/protected_branch.rb
  1 +# == Schema Information
  2 +#
  3 +# Table name: protected_branches
  4 +#
  5 +# id :integer not null, primary key
  6 +# project_id :integer not null
  7 +# name :string(255) not null
  8 +# created_at :datetime not null
  9 +# updated_at :datetime not null
  10 +#
  11 +
1 class ProtectedBranch < ActiveRecord::Base 12 class ProtectedBranch < ActiveRecord::Base
2 include GitHost 13 include GitHost
3 14
@@ -18,15 +29,3 @@ class ProtectedBranch &lt; ActiveRecord::Base @@ -18,15 +29,3 @@ class ProtectedBranch &lt; ActiveRecord::Base
18 project.commit(self.name) 29 project.commit(self.name)
19 end 30 end
20 end 31 end
21 -  
22 -# == Schema Information  
23 -#  
24 -# Table name: protected_branches  
25 -#  
26 -# id :integer not null, primary key  
27 -# project_id :integer not null  
28 -# name :string(255) not null  
29 -# created_at :datetime not null  
30 -# updated_at :datetime not null  
31 -#  
32 -