Commit b61f80babb10d0583d3199d557b4e8234d981a33

Authored by Javier Castro
2 parents 556ae5ae fbbd9897

Merge remote-tracking branch 'upstream/master' into fix-4305

Showing 824 changed files with 11416 additions and 169127 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 824 files displayed.

.gitignore
... ... @@ -34,3 +34,4 @@ doc/code/*
34 34 .secret
35 35 *.log
36 36 public/uploads.*
  37 +public/assets/
... ...
.travis.yml
1 1 language: ruby
2 2 env:
3 3 global:
4   - - DB=mysql
5 4 - TRAVIS=true
6 5 matrix:
7   - - TASK=spinach
8   - - TASK=spec
9   - - TASK=jasmine:ci
  6 + - TASK=spinach DB=mysql
  7 + - TASK=spec DB=mysql
  8 + - TASK=jasmine:ci DB=mysql
  9 + - TASK=spinach DB=postgresql
  10 + - TASK=spec DB=postgresql
  11 + - TASK=jasmine:ci DB=postgresql
10 12 before_install:
11 13 - sudo apt-get install libicu-dev -y
12 14 branches:
... ... @@ -15,7 +17,6 @@ branches:
15 17 rvm:
16 18 - 2.0.0
17 19 services:
18   - - mysql
19 20 - redis-server
20 21 before_script:
21 22 - "cp config/database.yml.$DB config/database.yml"
... ...
CHANGELOG
  1 +v 6.7.0
  2 + - Add support for Gemnasium as a Project Service (Olivier Gonzalez)
  3 + - Add edit file button to MergeRequest diff
  4 + - Public groups (Jason Hollingsworth)
  5 + - Cleaner headers in Notification Emails (Pierre de La Morinerie)
  6 + - Blob and tree gfm links to anchors work
  7 + - Piwik Integration (Sebastian Winkler)
  8 + - Show contribution guide link for new issue form (Jeroen van Baarsen)
  9 + - Fix CI status for merge requests from fork
  10 + - Added option to remove issue assignee on project issue page and issue edit page (Jason Blanchard)
  11 +
  12 +v 6.6.2
  13 + - Fix 500 error on branch/tag create or remove via UI
  14 +
  15 +v 6.6.1
  16 + - Fix 500 error on files tab if submodules presents
  17 +
  18 +v 6.6.0
  19 + - Retrieving user ssh keys publically(github style): http://__HOST__/__USERNAME__.keys
  20 + - Permissions: Developer now can manage issue tracker (modify any issue)
  21 + - Improve Code Compare page performance
  22 + - Group avatar
  23 + - Pygments.rb replaced with highlight.js
  24 + - Improve Merge request diff store logic
  25 + - Improve render performnace for MR show page
  26 + - Fixed Assembla hardcoded project name
  27 + - Jira integration documentation
  28 + - Refactored app/services
  29 + - Remove snippet expiration
  30 + - Mobile UI improvements (Drew Blessing)
  31 + - Fix block/remove UI for admin::users#show page
  32 + - Show users' group membership on users' activity page (Robert Djurasaj)
  33 + - User pages are visible without login if user is authorized to a public project
  34 + - Markdown rendered headers have id derived from their name and link to their id
  35 + - Improve application to work faster with large groups (100+ members)
  36 + - Multiple emails per user
  37 + - Show last commit for file when view file source
  38 + - Restyle Issue#show page and MR#show page
  39 + - Ability to filter by multiple labels for Issues page
  40 + - Rails version to 4.0.3
  41 + - Fixed attachment identifier displaying underneath note text (Jason Blanchard)
  42 +
  43 +v 6.5.1
  44 + - Fix branch selectbox when create merge request from fork
  45 +
1 46 v 6.5.0
2 47 - Dropdown menus on issue#show page for assignee and milestone (Jason Blanchard)
3 48 - Add color custimization and previewing to broadcast messages
4 49 - Fixed notes anchors
5 50 - Load new comments in issues dynamically
6 51 - Added sort options to Public page
7   - - Added new filters(assigned/authored/all) to Dashboard#issues, Dashboard#merge_request pages
  52 + - New filters (assigned/authored/all) for Dashboard#issues/merge_requests (sponsored by Say Media)
8 53 - Add project visibility icons to dashboard
9 54 - Enable secure cookies if https used
10 55 - Protect users/confirmation with rack_attack
... ... @@ -15,6 +60,11 @@ v 6.5.0
15 60 - SCSS refactored
16 61 - Use jquery timeago plugin
17 62 - Fix 500 error for rdoc files
  63 + - Ability to customize merge commit message (sponsored by Say Media)
  64 + - Search autocomplete via ajax
  65 + - Add website url to user profile
  66 + - Files API supports base64 encoded content (sponsored by O'Reilly Media)
  67 + - Added support for Go's repository retrieval (Bruno Albuquerque)
18 68  
19 69 v6.4.3
20 70 - Don't use unicorn worker killer if PhusionPassenger is defined
... ... @@ -22,7 +72,7 @@ v6.4.3
22 72 v6.4.2
23 73 - Fixed wrong behaviour of script/upgrade.rb
24 74  
25   -v6.4.1
  75 +v6.4.1
26 76 - Fixed bug with repository rename
27 77 - Fixed bug with project transfer
28 78  
... ... @@ -615,4 +665,4 @@ v 0.8.0
615 665 - stability
616 666 - security fixes
617 667 - increased test coverage
618   - - email notification
619 668 \ No newline at end of file
  669 + - email notification
... ...
CONTRIBUTING.md
... ... @@ -48,7 +48,7 @@ Please send a merge request with a tested solution or a merge request with a fai
48 48  
49 49 ## Merge requests
50 50  
51   -We welcome merge requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a merge request for are listed with the [status 'accepting merge/merge requests' on our feedback forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome.
  51 +We welcome merge requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a merge request for are listed with the [status 'accepting merge requests' on our feedback forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome. If you want to add a new feature that is not marked it is best to first create a feedback issue (if there isn't one already) and leave a comment asking for it to be marked accepting merge requests. Please include screenshots or wireframes if the feature will also change the UI.
52 52  
53 53 ### Merge request guidelines
54 54  
... ... @@ -66,19 +66,30 @@ If you can, please submit a merge request with the fix or improvements including
66 66 1. If the MR changes the UI it should include before and after screenshots
67 67 1. Link relevant [issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) and/or [feedback items](http://feedback.gitlab.com/) from the merge request description and leave a comment on them with a link back to the MR
68 68 1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submittion
  69 +1. If your MR touches code that executes shell commands, make sure it adheres to the [shell command guidelines]( doc/development/shell_commands.md).
69 70  
70   -Please keep the change in a single MR as small as possible. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? The smaller a MR is the more likely it is it will be merged, after that you can send more MR's to enhance it.
  71 +The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast. Before this time the GitLab.com team is still dealing with work that is created by the monthly release such as assisting subscribers with upgrade issues, the release of Enterprise Edition and the upgrade of GitLab Cloud. After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features.
71 72  
72   -We will accept a merge requests if it:
  73 +Please keep the change in a single MR **as small as possible**. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? The smaller a MR is the more likely it is it will be merged, after that you can send more MR's to enhance it.
73 74  
74   -* Includes proper tests and all tests pass (unless it contains a test exposing a bug in existing code)
75   -* Can be merged without problems (if not please use: `git rebase master`)
76   -* Do not break any existing functionality
77   -* Conforms to the [Ruby](https://github.com/bbatsov/ruby-style-guide) and [Rails](https://github.com/bbatsov/rails-style-guide) style guides and best practices
78   -* Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
79   -* Keeps the GitLab code base clean and well structured
80   -* Contains functionality we think other users will benefit from too
81   -* Doesn't add unnessecary configuration options since they complicate future changes
82   -* Contains a single commit (please use `git rebase -i` to squash commits)
  75 +For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). Please ensure that your merge request meets the following contribution acceptance criteria.
83 76  
84   -For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed).
  77 +## Contribution acceptance criteria
  78 +
  79 +1. The change is as small as possible (see the above paragraph for details)
  80 +1. Include proper tests and make all tests pass (unless it contains a test exposing a bug in existing code)
  81 +1. Can merge without problems (if not please use: `git rebase master`)
  82 +1. Does not break any existing functionality
  83 +1. Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
  84 +1. Keeps the GitLab code base clean and well structured
  85 +1. Contains functionality we think other users will benefit from too
  86 +1. Doesn't add configuration options since they complicate future changes
  87 +1. Contains a single commit (please use `git rebase -i` to squash commits)
  88 +1. It conforms to the following style guides
  89 +
  90 +## Style guides
  91 +
  92 +1. [Ruby style guide](https://github.com/bbatsov/ruby-style-guide)
  93 +1. [Rails style guide](https://github.com/bbatsov/rails-style-guide)
  94 +1. [CoffeeScript style guide](https://github.com/polarmobile/coffeescript-style-guide)
  95 +1. [Shell command guidelines](doc/development/shell_commands.md)
... ...
Gemfile
... ... @@ -14,7 +14,9 @@ gem "protected_attributes"
14 14 gem 'rails-observers'
15 15 gem 'actionpack-page_caching'
16 16 gem 'actionpack-action_caching'
17   -gem 'activerecord-deprecated_finders'
  17 +
  18 +# Default values for AR models
  19 +gem "default_value_for", "~> 3.0.0"
18 20  
19 21 # Supported DBs
20 22 gem "mysql2", group: :mysql
... ... @@ -30,28 +32,28 @@ gem 'omniauth-github'
30 32  
31 33 # Extracting information from a git repository
32 34 # Provide access to Gitlab::Git library
33   -gem "gitlab_git", "~> 4.0.0"
  35 +gem "gitlab_git", '~> 5.6.0'
34 36  
35 37 # Ruby/Rack Git Smart-HTTP Server Handler
36 38 gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack'
37 39  
38 40 # LDAP Auth
39   -gem 'gitlab_omniauth-ldap', '1.0.3', require: "omniauth-ldap"
40   -
41   -# Syntax highlighter
42   -gem "gitlab-pygments.rb", '~> 0.5.4', require: 'pygments.rb'
  41 +gem 'gitlab_omniauth-ldap', '1.0.4', require: "omniauth-ldap"
43 42  
44 43 # Git Wiki
45   -gem "gitlab-gollum-lib", "~> 1.0.2", require: 'gollum-lib'
  44 +gem "gitlab-gollum-lib", "~> 1.1.0", require: 'gollum-lib'
46 45  
47 46 # Language detection
48   -gem "gitlab-linguist", "~> 2.9.6", require: "linguist"
  47 +gem "gitlab-linguist", "~> 3.0.0", require: "linguist"
49 48  
50 49 # API
51 50 gem "grape", "~> 0.6.1"
52 51 gem "grape-entity", "~> 0.3.0"
53 52 gem 'rack-cors', require: 'rack/cors'
54 53  
  54 +# Email validation
  55 +gem "email_validator", "~> 1.4.0", :require => 'email_validator/strict'
  56 +
55 57 # Format dates and times
56 58 # based on human-friendly examples
57 59 gem "stamp"
... ... @@ -60,7 +62,7 @@ gem "stamp"
60 62 gem 'enumerize'
61 63  
62 64 # Pagination
63   -gem "kaminari", "~> 0.14.1"
  65 +gem "kaminari", "~> 0.15.1"
64 66  
65 67 # HAML
66 68 gem "haml-rails"
... ... @@ -125,6 +127,9 @@ gem "hipchat", "~> 0.14.0"
125 127 # Flowdock integration
126 128 gem "gitlab-flowdock-git-hook", "~> 0.4.2"
127 129  
  130 +# Gemnasium integration
  131 +gem "gemnasium-gitlab-service", "~> 0.2"
  132 +
128 133 # d3
129 134 gem "d3_rails", "~> 3.1.4"
130 135  
... ... @@ -137,6 +142,9 @@ gem "sanitize"
137 142 # Protect against bruteforcing
138 143 gem "rack-attack"
139 144  
  145 +# Ace editor
  146 +gem 'ace-rails-ap'
  147 +
140 148 gem "sass-rails"
141 149 gem "coffee-rails"
142 150 gem "uglifier"
... ... @@ -159,7 +167,7 @@ group :development do
159 167 gem "annotate", "~> 2.6.0.beta2"
160 168 gem "letter_opener"
161 169 gem 'quiet_assets', '~> 1.0.1'
162   - gem 'rack-mini-profiler'
  170 + gem 'rack-mini-profiler', require: false
163 171  
164 172 # Better errors handler
165 173 gem 'better_errors'
... ... @@ -206,6 +214,10 @@ group :development, :test do
206 214  
207 215 gem 'spork', '~> 1.0rc'
208 216 gem 'jasmine', '2.0.0.rc5'
  217 +
  218 + gem "spring", '1.1.1'
  219 + gem "spring-commands-rspec", '1.0.1'
  220 + gem "spring-commands-spinach", '1.0.0'
209 221 end
210 222  
211 223 group :test do
... ...
Gemfile.lock
... ... @@ -8,11 +8,12 @@ GIT
8 8 GEM
9 9 remote: https://rubygems.org/
10 10 specs:
11   - actionmailer (4.0.2)
12   - actionpack (= 4.0.2)
  11 + ace-rails-ap (2.0.1)
  12 + actionmailer (4.0.3)
  13 + actionpack (= 4.0.3)
13 14 mail (~> 2.5.4)
14   - actionpack (4.0.2)
15   - activesupport (= 4.0.2)
  15 + actionpack (4.0.3)
  16 + activesupport (= 4.0.3)
16 17 builder (~> 3.1.0)
17 18 erubis (~> 2.7.0)
18 19 rack (~> 1.5.2)
... ... @@ -21,16 +22,16 @@ GEM
21 22 actionpack (>= 4.0.0, < 5.0)
22 23 actionpack-page_caching (1.0.2)
23 24 actionpack (>= 4.0.0, < 5)
24   - activemodel (4.0.2)
25   - activesupport (= 4.0.2)
  25 + activemodel (4.0.3)
  26 + activesupport (= 4.0.3)
26 27 builder (~> 3.1.0)
27   - activerecord (4.0.2)
28   - activemodel (= 4.0.2)
  28 + activerecord (4.0.3)
  29 + activemodel (= 4.0.3)
29 30 activerecord-deprecated_finders (~> 1.0.2)
30   - activesupport (= 4.0.2)
  31 + activesupport (= 4.0.3)
31 32 arel (~> 4.0.0)
32 33 activerecord-deprecated_finders (1.0.3)
33   - activesupport (4.0.2)
  34 + activesupport (4.0.3)
34 35 i18n (~> 0.6, >= 0.6.4)
35 36 minitest (~> 4.2)
36 37 multi_json (~> 1.3)
... ... @@ -42,7 +43,7 @@ GEM
42 43 annotate (2.6.0)
43 44 activerecord (>= 2.3.0)
44 45 rake (>= 0.8.7)
45   - arel (4.0.1)
  46 + arel (4.0.2)
46 47 asciidoctor (0.1.4)
47 48 atomic (1.1.14)
48 49 awesome_print (1.2.0)
... ... @@ -100,6 +101,8 @@ GEM
100 101 daemons (1.1.9)
101 102 database_cleaner (1.2.0)
102 103 debug_inspector (0.0.2)
  104 + default_value_for (3.0.0)
  105 + activerecord (>= 3.2.0, < 5.0)
103 106 descendants_tracker (0.0.3)
104 107 devise (3.0.4)
105 108 bcrypt-ruby (~> 3.0)
... ... @@ -114,6 +117,8 @@ GEM
114 117 email_spec (1.5.0)
115 118 launchy (~> 2.1)
116 119 mail (~> 2.2)
  120 + email_validator (1.4.0)
  121 + activemodel
117 122 enumerize (0.7.0)
118 123 activesupport (>= 3.2)
119 124 equalizer (0.0.8)
... ... @@ -149,6 +154,8 @@ GEM
149 154 dotenv (>= 0.7)
150 155 thor (>= 0.13.6)
151 156 formatador (0.2.4)
  157 + gemnasium-gitlab-service (0.2.1)
  158 + rugged (~> 0.19)
152 159 gemoji (1.3.1)
153 160 gherkin-ruby (0.3.1)
154 161 racc
... ... @@ -156,36 +163,32 @@ GEM
156 163 gitlab-flowdock-git-hook (0.4.2.2)
157 164 gitlab-grit (>= 2.4.1)
158 165 multi_json
159   - gitlab-gollum-lib (1.0.2)
  166 + gitlab-gollum-lib (1.1.0)
160 167 github-markdown (~> 0.5.3)
161 168 github-markup (>= 0.7.5, < 1.0.0)
162 169 gitlab-grit (~> 2.6.1)
163   - gitlab-pygments.rb (~> 0.5.4)
164 170 nokogiri (~> 1.5.9)
165 171 sanitize (~> 2.0.3)
166 172 stringex (~> 1.5.1)
167 173 gitlab-grack (2.0.0.pre)
168 174 rack (~> 1.5.1)
169   - gitlab-grit (2.6.3)
  175 + gitlab-grit (2.6.4)
170 176 charlock_holmes (~> 0.6.9)
171 177 diff-lcs (~> 1.1)
172 178 mime-types (~> 1.15)
173 179 posix-spawn (~> 0.3.6)
174   - gitlab-linguist (2.9.6)
  180 + gitlab-linguist (3.0.0)
175 181 charlock_holmes (~> 0.6.6)
176 182 escape_utils (~> 0.2.4)
177   - gitlab-pygments.rb (~> 0.5.4)
178 183 mime-types (~> 1.19)
179   - gitlab-pygments.rb (0.5.4)
180   - posix-spawn (~> 0.3.6)
181   - yajl-ruby (~> 1.1.0)
182   - gitlab_git (4.0.0)
  184 + gitlab_git (5.6.0)
183 185 activesupport (~> 4.0.0)
  186 + charlock_holmes (~> 0.6.9)
184 187 gitlab-grit (~> 2.6.1)
185   - gitlab-linguist (~> 2.9.5)
186   - gitlab-pygments.rb (~> 0.5.4)
  188 + gitlab-linguist (~> 3.0.0)
  189 + rugged (~> 0.19.0)
187 190 gitlab_meta (6.0)
188   - gitlab_omniauth-ldap (1.0.3)
  191 + gitlab_omniauth-ldap (1.0.4)
189 192 net-ldap (~> 0.3.1)
190 193 omniauth (~> 1.0)
191 194 pyu-ruby-sasl (~> 0.0.3.1)
... ... @@ -257,7 +260,7 @@ GEM
257 260 json (1.8.1)
258 261 jwt (0.1.8)
259 262 multi_json (>= 1.5)
260   - kaminari (0.14.1)
  263 + kaminari (0.15.1)
261 264 actionpack (>= 3.0.0)
262 265 activesupport (>= 3.0.0)
263 266 kgio (2.8.1)
... ... @@ -279,7 +282,7 @@ GEM
279 282 minitest (4.7.5)
280 283 modernizr (2.6.2)
281 284 sprockets (~> 2.0)
282   - multi_json (1.8.2)
  285 + multi_json (1.8.4)
283 286 multi_xml (0.5.5)
284 287 multipart-post (1.2.0)
285 288 mysql2 (0.3.11)
... ... @@ -321,8 +324,8 @@ GEM
321 324 cliver (~> 0.2.1)
322 325 multi_json (~> 1.0)
323 326 websocket-driver (>= 0.2.0)
324   - polyglot (0.3.3)
325   - posix-spawn (0.3.6)
  327 + polyglot (0.3.4)
  328 + posix-spawn (0.3.8)
326 329 protected_attributes (1.0.5)
327 330 activemodel (>= 4.0.1, < 5.0)
328 331 pry (0.9.12.4)
... ... @@ -339,7 +342,7 @@ GEM
339 342 rack-attack (2.3.0)
340 343 rack
341 344 rack-cors (0.2.9)
342   - rack-mini-profiler (0.1.31)
  345 + rack-mini-profiler (0.9.0)
343 346 rack (>= 1.1.3)
344 347 rack-mount (0.8.3)
345 348 rack (>= 1.0.0)
... ... @@ -347,13 +350,13 @@ GEM
347 350 rack
348 351 rack-test (0.6.2)
349 352 rack (>= 1.0)
350   - rails (4.0.2)
351   - actionmailer (= 4.0.2)
352   - actionpack (= 4.0.2)
353   - activerecord (= 4.0.2)
354   - activesupport (= 4.0.2)
  353 + rails (4.0.3)
  354 + actionmailer (= 4.0.3)
  355 + actionpack (= 4.0.3)
  356 + activerecord (= 4.0.3)
  357 + activesupport (= 4.0.3)
355 358 bundler (>= 1.3.0, < 2.0)
356   - railties (= 4.0.2)
  359 + railties (= 4.0.3)
357 360 sprockets-rails (~> 2.0.0)
358 361 rails-observers (0.1.2)
359 362 activemodel (~> 4.0)
... ... @@ -366,13 +369,13 @@ GEM
366 369 i18n
367 370 require_all
368 371 ruby-progressbar
369   - railties (4.0.2)
370   - actionpack (= 4.0.2)
371   - activesupport (= 4.0.2)
  372 + railties (4.0.3)
  373 + actionpack (= 4.0.3)
  374 + activesupport (= 4.0.3)
372 375 rake (>= 0.8.7)
373 376 thor (>= 0.18.1, < 2.0)
374 377 raindrops (0.12.0)
375   - rake (10.1.0)
  378 + rake (10.1.1)
376 379 raphael-rails (2.1.2)
377 380 rb-fsevent (0.9.3)
378 381 rb-inotify (0.9.2)
... ... @@ -421,6 +424,7 @@ GEM
421 424 ruby-hmac (0.4.0)
422 425 ruby-progressbar (1.2.0)
423 426 rubyntlm (0.1.1)
  427 + rugged (0.19.0)
424 428 safe_yaml (0.9.7)
425 429 sanitize (2.0.6)
426 430 nokogiri (>= 1.4.4)
... ... @@ -470,6 +474,11 @@ GEM
470 474 railties (>= 3)
471 475 spinach (>= 0.4)
472 476 spork (1.0.0rc4)
  477 + spring (1.1.1)
  478 + spring-commands-rspec (1.0.1)
  479 + spring (>= 0.9.1)
  480 + spring-commands-spinach (1.0.0)
  481 + spring (>= 0.9.1)
473 482 sprockets (2.10.1)
474 483 hike (~> 1.2)
475 484 multi_json (~> 1.0)
... ... @@ -541,15 +550,14 @@ GEM
541 550 websocket-driver (0.3.1)
542 551 xpath (2.0.0)
543 552 nokogiri (~> 1.3)
544   - yajl-ruby (1.1.0)
545 553  
546 554 PLATFORMS
547 555 ruby
548 556  
549 557 DEPENDENCIES
  558 + ace-rails-ap
550 559 actionpack-action_caching
551 560 actionpack-page_caching
552   - activerecord-deprecated_finders
553 561 acts-as-taggable-on
554 562 annotate (~> 2.6.0.beta2)
555 563 asciidoctor
... ... @@ -564,25 +572,27 @@ DEPENDENCIES
564 572 coveralls
565 573 d3_rails (~> 3.1.4)
566 574 database_cleaner
  575 + default_value_for (~> 3.0.0)
567 576 devise (= 3.0.4)
568 577 devise-async (= 0.8.0)
569 578 email_spec
  579 + email_validator (~> 1.4.0)
570 580 enumerize
571 581 factory_girl_rails
572 582 ffaker
573 583 fog (~> 1.3.1)
574 584 font-awesome-rails (~> 3.2)
575 585 foreman
  586 + gemnasium-gitlab-service (~> 0.2)
576 587 gemoji (~> 1.3.0)
577 588 github-markup (~> 0.7.4)!
578 589 gitlab-flowdock-git-hook (~> 0.4.2)
579   - gitlab-gollum-lib (~> 1.0.2)
  590 + gitlab-gollum-lib (~> 1.1.0)
580 591 gitlab-grack (~> 2.0.0.pre)
581   - gitlab-linguist (~> 2.9.6)
582   - gitlab-pygments.rb (~> 0.5.4)
583   - gitlab_git (~> 4.0.0)
  592 + gitlab-linguist (~> 3.0.0)
  593 + gitlab_git (~> 5.6.0)
584 594 gitlab_meta (= 6.0)
585   - gitlab_omniauth-ldap (= 1.0.3)
  595 + gitlab_omniauth-ldap (= 1.0.4)
586 596 gon (~> 5.0.0)
587 597 grape (~> 0.6.1)
588 598 grape-entity (~> 0.3.0)
... ... @@ -597,7 +607,7 @@ DEPENDENCIES
597 607 jquery-rails (= 2.1.3)
598 608 jquery-turbolinks
599 609 jquery-ui-rails (= 2.0.2)
600   - kaminari (~> 0.14.1)
  610 + kaminari (~> 0.15.1)
601 611 launchy
602 612 letter_opener
603 613 minitest (~> 4.7.0)
... ... @@ -638,6 +648,9 @@ DEPENDENCIES
638 648 slim
639 649 spinach-rails
640 650 spork (~> 1.0rc)
  651 + spring (= 1.1.1)
  652 + spring-commands-rspec (= 1.0.1)
  653 + spring-commands-spinach (= 1.0.0)
641 654 stamp
642 655 state_machine
643 656 test_after_commit
... ...
LICENSE
1   -Copyright (c) 2011 Dmitriy Zaporozhets
  1 +Copyright (c) 2011-2014 Dmitriy Zaporozhets
2 2  
3 3 Permission is hereby granted, free of charge, to any person obtaining a copy
4 4 of this software and associated documentation files (the "Software"), to deal
... ...
MAINTENANCE.md
... ... @@ -21,3 +21,5 @@ release where the minor version is increased numerically by increments of one
21 21 (eg. `5.0 -> 5.1`).
22 22  
23 23 We encourage everyone to run the latest stable release to ensure that you can easily upgrade to the most secure and feature rich GitLab experience. In order to make sure you can easily run the most recent stable release, we are working hard to keep the update process simple and reliable.
  24 +
  25 +More information about the release procedures can be found in the doc/release directory.
... ...
PROCESS.md
... ... @@ -73,7 +73,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue
73 73  
74 74 ### Feature requests
75 75  
76   -Thanks for your interest in GitLab. We don't use the GitHub issue tracker for feature requests. Please use http://feedback.gitlab.com/ for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
  76 +Thanks for your interest in GitLab. We don't use the issue tracker for feature requests. Please use http://feedback.gitlab.com/ for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
77 77  
78 78 ### Issue report for old version
79 79  
... ... @@ -81,7 +81,7 @@ Thanks for the issue report but we only support issues for the latest stable ver
81 81  
82 82 ### Support requests and configuration questions
83 83  
84   -Thanks for your interest in GitLab. We don't use the GitHub issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the unofficial #gitlab IRC channel on Freenode or the http://www.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
  84 +Thanks for your interest in GitLab. We don't use the issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the unofficial #gitlab IRC channel on Freenode or the http://www.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
85 85  
86 86 ### Code format
87 87  
... ...
README.md
... ... @@ -4,26 +4,21 @@
4 4  
5 5 ![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif)
6 6  
7   -### GitLab allows you to
8   - * keep your code secure on your own server
9   - * manage repositories, users and access permissions
10   - * communicate through issues, line-comments and wiki pages
11   - * perform code review with merge requests
  7 +### Gitlab is open source software to collaborate on code
12 8  
13   -### GitLab is
14   -
15   -* powered by Ruby on Rails
16   -* completely free and open source (MIT license)
17   -* used by more than 25.000 organizations to keep their code secure
  9 +* Manage git repositories with fine grained access controls that keep your code secure
  10 +* Perform code reviews and enhance collaboration with merge requests
  11 +* Each project can also have an issue tracker and a wiki
  12 +* Used by more than 50,000 organizations, GitLab is the most popular solution to manage git repositories on-premises
  13 +* Completely free and open source (MIT Expat license)
  14 +* Powered by Ruby on Rails
18 15  
19 16 ### Code status
20 17  
21   -* [![build status](http://ci.gitlab.org/projects/1/status.png?ref=master)](http://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch)
  18 +* [![build status](https://ci.gitlab.org/projects/1/status.png?ref=master)](https://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch)
22 19  
23 20 * [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.png)](https://codeclimate.com/github/gitlabhq/gitlabhq)
24 21  
25   -* [![Dependency Status](https://gemnasium.com/gitlabhq/gitlabhq.png)](https://gemnasium.com/gitlabhq/gitlabhq) this button can be yellow (small updates are available) but must not be red (a security fix or an important update is available), gems are updated in major releases of GitLab.
26   -
27 22 * [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq)
28 23  
29 24 ### Resources
... ... @@ -36,6 +31,8 @@
36 31  
37 32 * [GitLab CI](https://gitlab.com/gitlab-org/gitlab-ci/blob/master/README.md) is a continuous integration (CI) server that is easy to integrate with GitLab.
38 33  
  34 +* Unofficial third-party [iPhone app](http://gitlabcontrol.com/) and [Android app](https://play.google.com/store/apps/details?id=com.bd.gitlab&hl=en) for GitLab
  35 +
39 36 ### Requirements
40 37  
41 38 * Ubuntu/Debian**
... ... @@ -50,13 +47,17 @@
50 47  
51 48 #### Official installation methods
52 49  
53   -* [Manual installation guide for a production server](doc/install/installation.md)
  50 +* [GitLab packages (beta)](https://www.gitlab.com/downloads/) These packages contain GitLab and all its depencies (PostgreSQL, Redis, Nginx, Unicorn, etc.). They are made with [omnibus-gitlab](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md) that also contains the installation instructions. These packages currently support a reduced selection of GitLab's normal features. For instance, it is not yet possible to create/restore application backups or to use HTTPS.
  51 +
  52 +* [GitLab virtual machine images](https://www.gitlab.com/downloads/) contain an operating system and a preinstalled GitLab. They are made with [GitLab Packer](https://gitlab.com/gitlab-org/gitlab-packer/blob/master/README.md) that also contains the installation instructions.
54 53  
55 54 * [GitLab Chef Cookbook](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/README.md) This cookbook can be used both for development installations and production installations. If you want to [contribute](CONTRIBUTE.md) to GitLab we suggest you follow the [development installation on a virtual machine with Vagrant](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/doc/development.md) instructions to install all testing dependencies.
56 55  
  56 +* [Manual installation guide](doc/install/installation.md) This guide to set up a production server offers detailed and complete step-by-step instructions.
  57 +
57 58 #### Third party one-click installers
58 59  
59   -* [Digital Ocean 1-Click Application Install](https://www.digitalocean.com/blog_posts/host-your-git-repositories-in-55-seconds-with-gitlab) Have a new server up in 55 seconds. Digital Ocean uses SSD disks which is great for an IO intensive app such as GitLab.
  60 +* [Digital Ocean 1-Click Application Install](https://www.digitalocean.com/blog_posts/host-your-git-repositories-in-55-seconds-with-gitlab) Have a new server up in 55 seconds. Digital Ocean uses SSD disks which is great for an IO intensive app such as GitLab. We recommend selecting a droplet with [1GB of memory](https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/requirements.md).
60 61  
61 62 * [BitNami one-click installers](http://bitnami.com/stack/gitlab) This package contains both GitLab and GitLab CI. It is available as installer, virtual machine or for cloud hosting providers (Amazon Web Services/Azure/etc.).
62 63  
... ... @@ -68,11 +69,9 @@
68 69  
69 70 ### New versions and upgrading
70 71  
71   -Since 2011 GitLab is released on the 22nd of every month. Every new release includes an upgrade guide.
72   -
73   -* [Upgrade guides](doc/update)
  72 +Since 2011 GitLab is released on the 22nd of every month. Every new release includes an [upgrade guide](doc/update) and new features are detailed in the [Changelog](CHANGELOG).
74 73  
75   -* [Changelog](CHANGELOG)
  74 +It is recommended to follow a monthly upgrade schedule. Security releases come out when needed. For more information about the release process see the documentation for [monthly](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/release/monthly.md) and [security](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/release/security.md) releases.
76 75  
77 76 * Features that will be in the next releases are listed on [the feedback and suggestions forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457).
78 77  
... ... @@ -145,16 +144,18 @@ or start each component separately
145 144  
146 145 * [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab.
147 146  
148   -* [Contributing guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md) describes how to submit merge requests and issues. Pull requests and issues not in line with the guidelines in this document will be closed.
  147 +* [Contributing guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) describes how to submit merge requests and issues. Pull requests and issues not in line with the guidelines in this document will be closed.
149 148  
150 149 * [Support subscription](http://www.gitlab.com/subscription/) connects you to the knowledge of GitLab experts that will resolve your issues and answer your questions.
151 150  
152 151 * [Consultancy](http://www.gitlab.com/consultancy/) from the GitLab experts for installations, upgrades and customizations.
153 152  
154   -* [#gitlab IRC channel](http://www.freenode.net/) on Freenode to get in touch with other GitLab users and get help, it's managed by James Newton, Drew Blessing and Sam Gleske
  153 +* [#gitlab IRC channel](http://www.freenode.net/) on Freenode to get in touch with other GitLab users and get help, it's managed by James Newton (newton), Drew Blessing (dblessing), and Sam Gleske (sag47).
155 154  
156 155 * [Book](http://www.packtpub.com/gitlab-repository-management/book) written by GitLab enthusiast Jonathan M. Hethey is unofficial but it offers a good overview.
157 156  
  157 +* [Gitter chat room](https://gitter.im/gitlabhq/gitlabhq#) here you can ask questions when you need help.
  158 +
158 159  
159 160 ### Getting in touch
160 161  
... ...
VERSION
1   -6.5.0.pre
  1 +6.7.0.pre
... ...
app/assets/images/ajax_loader.gif

7.74 KB

app/assets/images/ajax_loader_gray.gif

8.17 KB

app/assets/images/ajax_loader_tree.gif

6.38 KB

app/assets/images/bg-header.png

212 Bytes | W: | H:

210 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/dark-scheme-preview.png

16.5 KB | W: | H:

9.64 KB | W: | H:

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

290 Bytes | W: | H:

463 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/icon-link.png 0 → 100644

1019 Bytes

app/assets/images/icon-search.png

422 Bytes | W: | H:

331 Bytes | W: | H:

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

8.49 KB | W: | H:

6.49 KB | W: | H:

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

2.95 KB | W: | H:

2.73 KB | W: | H:

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

8.14 KB | W: | H:

7.33 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/monokai-scheme-preview.png

6.5 KB | W: | H:

4.23 KB | W: | H:

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

1.31 KB | W: | H:

704 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/no_group_avatar.png 0 → 100644

4.77 KB

app/assets/images/onion_skin_sprites.gif

1.55 KB | W: | H:

548 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/solarized-dark-scheme-preview.png

15.9 KB | W: | H:

9.67 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/swipemode_sprites.gif

1.5 KB | W: | H:

505 Bytes | W: | H:

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

1.17 KB | W: | H:

1.17 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/trans_bg.gif

58 Bytes | W: | H:

50 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/white-scheme-preview.png

16.8 KB | W: | H:

9.79 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/javascripts/api.js.coffee
... ... @@ -3,6 +3,7 @@
3 3 user_path: "/api/:version/users/:id.json"
4 4 notes_path: "/api/:version/projects/:id/notes.json"
5 5 namespaces_path: "/api/:version/namespaces.json"
  6 + project_users_path: "/api/:version/projects/:id/users.json"
6 7  
7 8 # Get 20 (depends on api) recent notes
8 9 # and sort the ascending from oldest to newest
... ... @@ -50,6 +51,23 @@
50 51 ).done (users) ->
51 52 callback(users)
52 53  
  54 + # Return project users list. Filtered by query
  55 + # Only active users retrieved
  56 + projectUsers: (project_id, query, callback) ->
  57 + url = Api.buildUrl(Api.project_users_path)
  58 + url = url.replace(':id', project_id)
  59 +
  60 + $.ajax(
  61 + url: url
  62 + data:
  63 + private_token: gon.api_token
  64 + search: query
  65 + per_page: 20
  66 + active: true
  67 + dataType: "json"
  68 + ).done (users) ->
  69 + callback(users)
  70 +
53 71 # Return namespaces list. Filtered by query
54 72 namespaces: (query, callback) ->
55 73 url = Api.buildUrl(Api.namespaces_path)
... ...
app/assets/javascripts/application.js
... ... @@ -24,7 +24,8 @@
24 24 //= require g.raphael-min
25 25 //= require g.bar-min
26 26 //= require branch-graph
27   -//= require ace-src-noconflict/ace
  27 +//= require highlightjs.min
  28 +//= require ace/ace
28 29 //= require_tree .
29 30 //= require d3
30 31 //= require underscore
... ...
app/assets/javascripts/blob.js.coffee
... ... @@ -17,7 +17,7 @@ class BlobView
17 17  
18 18 setHash(hash)
19 19 e.preventDefault()
20   -
  20 +
21 21 # See if there are lines selected
22 22 # "#L12" and "#L34-56" supported
23 23 highlightBlobLines = (e) ->
... ... @@ -64,7 +64,7 @@ class BlobView
64 64 nodes.attr("id", hash)
65 65  
66 66 # initialize multi-line select
67   - $("#tree-content-holder .line_numbers a[id^=L]").on("click", handleMultiSelect)
  67 + $("#tree-content-holder .line-numbers a[id^=L]").on("click", handleMultiSelect)
68 68  
69 69 # Highlight the correct lines on load
70 70 highlightBlobLines()
... ...
app/assets/javascripts/commit.js.coffee
1 1 class Commit
2 2 constructor: ->
3   - $('.files .file').each ->
  3 + $('.files .diff-file').each ->
4 4 new CommitFile(this)
5 5  
6 6 @Commit = Commit
... ...
app/assets/javascripts/dispatcher.js.coffee
... ... @@ -4,6 +4,7 @@ $ -&gt;
4 4 class Dispatcher
5 5 constructor: () ->
6 6 @initSearch()
  7 + @initHighlight()
7 8 @initPageScripts()
8 9  
9 10 initPageScripts: ->
... ... @@ -18,6 +19,8 @@ class Dispatcher
18 19 switch page
19 20 when 'projects:issues:index'
20 21 Issues.init()
  22 + when 'projects:issues:show'
  23 + new Issue()
21 24 when 'projects:issues:new', 'projects:merge_requests:new'
22 25 GitLab.GfmAutoComplete.setup()
23 26 when 'dashboard:show'
... ... @@ -47,5 +50,16 @@ class Dispatcher
47 50  
48 51  
49 52 initSearch: ->
50   - autocomplete_json = $('.search-autocomplete-json').data('autocomplete-opts')
51   - new SearchAutocomplete(autocomplete_json)
  53 + opts = $('.search-autocomplete-opts')
  54 + path = opts.data('autocomplete-path')
  55 + project_id = opts.data('autocomplete-project-id')
  56 + project_ref = opts.data('autocomplete-project-ref')
  57 +
  58 + new SearchAutocomplete(path, project_id, project_ref)
  59 +
  60 + initHighlight: ->
  61 + $('.highlight pre code').each (i, e) ->
  62 + hljs.highlightBlock(e)
  63 + $(e).html($.map($(e).html().split("\n"), (line, i) ->
  64 + "<div class='line' id='LC" + (i + 1) + "'>" + line + "</div>"
  65 + ).join("\n"))
... ...
app/assets/javascripts/groups.js.coffee
... ... @@ -4,3 +4,14 @@ class GroupMembers
4 4 $(this).fadeOut()
5 5  
6 6 @GroupMembers = GroupMembers
  7 +
  8 +$ ->
  9 + # avatar
  10 + $('.js-choose-group-avatar-button').bind "click", ->
  11 + form = $(this).closest("form")
  12 + form.find(".js-group-avatar-input").click()
  13 +
  14 + $('.js-group-avatar-input').bind "change", ->
  15 + form = $(this).closest("form")
  16 + filename = $(this).val().replace(/^.*[\\\/]/, '')
  17 + form.find(".js-avatar-filename").text(filename)
7 18 \ No newline at end of file
... ...
app/assets/javascripts/issue.js.coffee 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class Issue
  2 + constructor: ->
  3 + $('.edit-issue.inline-update input[type="submit"]').hide()
  4 + $(".issue-box .inline-update").on "change", "select", ->
  5 + $(this).submit()
  6 + $(".issue-box .inline-update").on "change", "#issue_assignee_id", ->
  7 + $(this).submit()
  8 +
  9 +@Issue = Issue
... ...
app/assets/javascripts/issues.js.coffee
... ... @@ -29,10 +29,10 @@
29 29 $('#filter_issue_search').val($('#issue_search').val())
30 30  
31 31 initSelects: ->
32   - $("select#update_status").select2()
33   - $("select#update_assignee_id").select2()
34   - $("select#update_milestone_id").select2()
35   - $("select#label_name").select2()
  32 + $("select#update_status").select2(width: 'resolve', dropdownAutoWidth: true)
  33 + $("select#update_assignee_id").select2(width: 'resolve', dropdownAutoWidth: true)
  34 + $("select#update_milestone_id").select2(width: 'resolve', dropdownAutoWidth: true)
  35 + $("select#label_name").select2(width: 'resolve', dropdownAutoWidth: true)
36 36 $("#milestone_id, #assignee_id, #label_name").on "change", ->
37 37 $(this).closest("form").submit()
38 38  
... ... @@ -77,9 +77,3 @@
77 77 $("#update_issues_ids").val []
78 78 $(".issues_bulk_update").hide()
79 79 $(".issues-filters").show()
80   -
81   -$ ->
82   - $('.edit-issue.inline-update input[type="submit"]').hide();
83   - $("body").on "change", ".edit-issue.inline-update select", ->
84   - $(this).submit()
85   -
... ...
app/assets/javascripts/main.js.coffee
... ... @@ -117,11 +117,11 @@ $ -&gt;
117 117  
118 118  
119 119 # Commit show suppressed diff
120   - $(".content").on "click", ".supp_diff_link", ->
  120 + $(".diff-content").on "click", ".supp_diff_link", ->
121 121 $(@).next('table').show()
122 122 $(@).remove()
123 123  
124   - $(".content").on "click", ".js-details-expand", ->
  124 + $(".diff-content").on "click", ".js-details-expand", ->
125 125 $(@).next('.js-details-contain').removeClass("hide")
126 126 $(@).remove()
127 127  
... ...
app/assets/javascripts/merge_request.js.coffee 0 → 100644
... ... @@ -0,0 +1,103 @@
  1 +class MergeRequest
  2 + constructor: (@opts) ->
  3 + @initContextWidget()
  4 + this.$el = $('.merge-request')
  5 + @diffs_loaded = if @opts.action == 'diffs' then true else false
  6 + @commits_loaded = false
  7 +
  8 + this.activateTab(@opts.action)
  9 +
  10 + this.bindEvents()
  11 +
  12 + this.initMergeWidget()
  13 + this.$('.show-all-commits').on 'click', =>
  14 + this.showAllCommits()
  15 +
  16 + modal = $('#modal_merge_info').modal(show: false)
  17 +
  18 + disableButtonIfEmptyField '#merge_commit_message', '.accept_merge_request'
  19 +
  20 +
  21 + # Local jQuery finder
  22 + $: (selector) ->
  23 + this.$el.find(selector)
  24 +
  25 + initContextWidget: ->
  26 + $('.edit-merge_request.inline-update input[type="submit"]').hide()
  27 + $(".issue-box .inline-update").on "change", "select", ->
  28 + $(this).submit()
  29 + $(".issue-box .inline-update").on "change", "#merge_request_assignee_id", ->
  30 + $(this).submit()
  31 +
  32 + initMergeWidget: ->
  33 + this.showState( @opts.current_status )
  34 +
  35 + if this.$('.automerge_widget').length and @opts.check_enable
  36 + $.get @opts.url_to_automerge_check, (data) =>
  37 + this.showState( data.merge_status )
  38 + , 'json'
  39 +
  40 + if @opts.ci_enable
  41 + $.get @opts.url_to_ci_check, (data) =>
  42 + this.showCiState data.status
  43 + , 'json'
  44 +
  45 + bindEvents: ->
  46 + this.$('.nav-tabs').on 'click', 'a', (event) =>
  47 + a = $(event.currentTarget)
  48 +
  49 + href = a.attr('href')
  50 + History.replaceState {path: href}, document.title, href
  51 +
  52 + event.preventDefault()
  53 +
  54 + this.$('.nav-tabs').on 'click', 'li', (event) =>
  55 + this.activateTab($(event.currentTarget).data('action'))
  56 +
  57 + this.$('.accept_merge_request').on 'click', ->
  58 + $('.automerge_widget.can_be_merged').hide()
  59 + $('.merge-in-progress').show()
  60 +
  61 + activateTab: (action) ->
  62 + this.$('.nav-tabs li').removeClass 'active'
  63 + this.$('.tab-content').hide()
  64 + switch action
  65 + when 'diffs'
  66 + this.$('.nav-tabs .diffs-tab').addClass 'active'
  67 + this.loadDiff() unless @diffs_loaded
  68 + this.$('.diffs').show()
  69 + else
  70 + this.$('.nav-tabs .notes-tab').addClass 'active'
  71 + this.$('.notes').show()
  72 +
  73 + showState: (state) ->
  74 + $('.automerge_widget').hide()
  75 + $('.automerge_widget.' + state).show()
  76 +
  77 + showCiState: (state) ->
  78 + $('.ci_widget').hide()
  79 + $('.ci_widget.ci-' + state).show()
  80 +
  81 + loadDiff: (event) ->
  82 + $.ajax
  83 + type: 'GET'
  84 + url: this.$('.nav-tabs .diffs-tab a').attr('href')
  85 + beforeSend: =>
  86 + this.$('.status').addClass 'loading'
  87 + complete: =>
  88 + @diffs_loaded = true
  89 + this.$('.status').removeClass 'loading'
  90 + success: (data) =>
  91 + this.$(".diffs").html(data.html)
  92 + dataType: 'json'
  93 +
  94 + showAllCommits: ->
  95 + this.$('.first-commits').remove()
  96 + this.$('.all-commits').removeClass 'hide'
  97 +
  98 + alreadyOrCannotBeMerged: ->
  99 + this.$('.automerge_widget').hide()
  100 + this.$('.merge-in-progress').hide()
  101 + this.$('.automerge_widget.already_cannot_be_merged').show()
  102 +
  103 +this.MergeRequest = MergeRequest
... ...
app/assets/javascripts/merge_requests.js.coffee
... ... @@ -6,97 +6,3 @@
6 6 $('#milestone_id').select2()
7 7 $('#milestone_id, #assignee_id').on 'change', ->
8 8 $(this).closest('form').submit()
9   -
10   -class MergeRequest
11   -
12   - constructor: (@opts) ->
13   - this.$el = $('.merge-request')
14   - @diffs_loaded = if @opts.action == 'diffs' then true else false
15   - @commits_loaded = false
16   -
17   - this.activateTab(@opts.action)
18   -
19   - this.bindEvents()
20   -
21   - this.initMergeWidget()
22   - this.$('.show-all-commits').on 'click', =>
23   - this.showAllCommits()
24   -
25   - modal = $('#modal_merge_info').modal(show: false)
26   -
27   - # Local jQuery finder
28   - $: (selector) ->
29   - this.$el.find(selector)
30   -
31   - initMergeWidget: ->
32   - this.showState( @opts.current_status )
33   -
34   - if this.$('.automerge_widget').length and @opts.check_enable
35   - $.get @opts.url_to_automerge_check, (data) =>
36   - this.showState( data.merge_status )
37   - , 'json'
38   -
39   - if @opts.ci_enable
40   - $.get @opts.url_to_ci_check, (data) =>
41   - this.showCiState data.status
42   - , 'json'
43   -
44   - bindEvents: ->
45   - this.$('.nav-tabs').on 'click', 'a', (event) =>
46   - a = $(event.currentTarget)
47   -
48   - href = a.attr('href')
49   - History.replaceState {path: href}, document.title, href
50   -
51   - event.preventDefault()
52   -
53   - this.$('.nav-tabs').on 'click', 'li', (event) =>
54   - this.activateTab($(event.currentTarget).data('action'))
55   -
56   - this.$('.accept_merge_request').on 'click', ->
57   - $('.automerge_widget.can_be_merged').hide()
58   - $('.merge-in-progress').show()
59   -
60   - activateTab: (action) ->
61   - this.$('.nav-tabs li').removeClass 'active'
62   - this.$('.tab-content').hide()
63   - switch action
64   - when 'diffs'
65   - this.$('.nav-tabs .diffs-tab').addClass 'active'
66   - this.loadDiff() unless @diffs_loaded
67   - this.$('.diffs').show()
68   - else
69   - this.$('.nav-tabs .notes-tab').addClass 'active'
70   - this.$('.notes').show()
71   -
72   - showState: (state) ->
73   - $('.automerge_widget').hide()
74   - $('.automerge_widget.' + state).show()
75   -
76   - showCiState: (state) ->
77   - $('.ci_widget').hide()
78   - $('.ci_widget.ci-' + state).show()
79   -
80   - loadDiff: (event) ->
81   - $.ajax
82   - type: 'GET'
83   - url: this.$('.nav-tabs .diffs-tab a').attr('href')
84   - beforeSend: =>
85   - this.$('.status').addClass 'loading'
86   - complete: =>
87   - @diffs_loaded = true
88   - this.$('.status').removeClass 'loading'
89   - success: (data) =>
90   - this.$(".diffs").html(data.html)
91   - dataType: 'json'
92   -
93   - showAllCommits: ->
94   - this.$('.first-commits').remove()
95   - this.$('.all-commits').removeClass 'hide'
96   -
97   - alreadyOrCannotBeMerged: ->
98   - this.$('.automerge_widget').hide()
99   - this.$('.merge-in-progress').hide()
100   - this.$('.automerge_widget.already_cannot_be_merged').show()
101   -
102   -this.MergeRequest = MergeRequest
... ...
app/assets/javascripts/notes.js.coffee
... ... @@ -94,6 +94,9 @@ class Notes
94 94 if @isNewNote(note)
95 95 @note_ids.push(note.id)
96 96 $('ul.main-notes-list').append(note.html)
  97 + code = "#note_" + note.id + " .highlight pre code"
  98 + $(code).each (i, e) ->
  99 + hljs.highlightBlock(e)
97 100  
98 101  
99 102 ###
... ... @@ -253,6 +256,9 @@ class Notes
253 256 updateNote: (xhr, note, status) =>
254 257 note_li = $("#note_" + note.id)
255 258 note_li.replaceWith(note.html)
  259 + code = "#note_" + note.id + " .highlight pre code"
  260 + $(code).each (i, e) ->
  261 + hljs.highlightBlock(e)
256 262  
257 263 ###
258 264 Called in response to clicking the edit note link
... ...
app/assets/javascripts/profile.js.coffee
... ... @@ -26,3 +26,5 @@ $ -&gt;
26 26 form = $(this).closest("form")
27 27 filename = $(this).val().replace(/^.*[\\\/]/, '')
28 28 form.find(".js-avatar-filename").text(filename)
  29 +
  30 + $('.profile-groups-avatars').tooltip("placement": "top")
29 31 \ No newline at end of file
... ...
app/assets/javascripts/project_users_select.js.coffee 0 → 100644
... ... @@ -0,0 +1,63 @@
  1 +@projectUsersSelect =
  2 + init: ->
  3 + $('.ajax-project-users-select').each (i, select) ->
  4 + project_id = $('body').data('project-id')
  5 +
  6 + $(select).select2
  7 + placeholder: $(select).data('placeholder') || "Search for a user"
  8 + multiple: $(select).hasClass('multiselect')
  9 + minimumInputLength: 0
  10 + query: (query) ->
  11 + Api.projectUsers project_id, query.term, (users) ->
  12 + data = { results: users }
  13 +
  14 + nullUser = {
  15 + name: 'Unassigned',
  16 + avatar: null,
  17 + username: 'none',
  18 + id: ''
  19 + }
  20 +
  21 + data.results.unshift(nullUser)
  22 +
  23 + query.callback(data)
  24 +
  25 + initSelection: (element, callback) ->
  26 + id = $(element).val()
  27 + if id isnt ""
  28 + Api.user(id, callback)
  29 +
  30 +
  31 + formatResult: projectUsersSelect.projectUserFormatResult
  32 + formatSelection: projectUsersSelect.projectUserFormatSelection
  33 + dropdownCssClass: "ajax-project-users-dropdown"
  34 + dropdownAutoWidth: true
  35 + escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
  36 + m
  37 +
  38 + projectUserFormatResult: (user) ->
  39 + if user.avatar_url
  40 + avatar = user.avatar_url
  41 + else if gon.gravatar_enabled
  42 + avatar = gon.gravatar_url
  43 + avatar = avatar.replace('%{hash}', md5(user.email))
  44 + avatar = avatar.replace('%{size}', '24')
  45 + else
  46 + avatar = gon.relative_url_root + "/assets/no_avatar.png"
  47 +
  48 + if user.id == ''
  49 + avatarMarkup = ''
  50 + else
  51 + avatarMarkup = "<div class='user-image'><img class='avatar s24' src='#{avatar}'></div>"
  52 +
  53 + "<div class='user-result'>
  54 + #{avatarMarkup}
  55 + <div class='user-name'>#{user.name}</div>
  56 + <div class='user-username'>#{user.username}</div>
  57 + </div>"
  58 +
  59 + projectUserFormatSelection: (user) ->
  60 + user.name
  61 +
  62 +$ ->
  63 + projectUsersSelect.init()
... ...
app/assets/javascripts/search_autocomplete.js.coffee
1 1 class SearchAutocomplete
2   - constructor: (json) ->
  2 + constructor: (search_autocomplete_path, project_id, project_ref) ->
  3 + project_id = '' unless project_id
  4 + project_ref = '' unless project_ref
  5 + query = "?project_id=" + project_id + "&project_ref=" + project_ref
  6 +
3 7 $("#search").autocomplete
4   - source: json
  8 + source: search_autocomplete_path + query
  9 + minLength: 1
5 10 select: (event, ui) ->
6 11 location.href = ui.item.url
7 12  
... ...
app/assets/javascripts/users_select.js.coffee
1 1 $ ->
2 2 userFormatResult = (user) ->
3   - if user.avatar
4   - avatar = user.avatar.url
5   - else
  3 + if user.avatar_url
  4 + avatar = user.avatar_url
  5 + else if gon.gravatar_enabled
6 6 avatar = gon.gravatar_url
7 7 avatar = avatar.replace('%{hash}', md5(user.email))
8 8 avatar = avatar.replace('%{size}', '24')
  9 + else
  10 + avatar = gon.relative_url_root + "/assets/no_avatar.png"
9 11  
10 12 "<div class='user-result'>
11 13 <div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
... ...
app/assets/stylesheets/application.scss
... ... @@ -5,6 +5,7 @@
5 5 *= require jquery.ui.gitlab
6 6 *= require jquery.atwho
7 7 *= require select2
  8 + *= require highlightjs.min
8 9 *= require_self
9 10 */
10 11  
... ... @@ -36,8 +37,10 @@
36 37 @import "generic/issue_box.scss";
37 38 @import "generic/files.scss";
38 39 @import "generic/lists.scss";
  40 +@import "generic/flash.scss";
39 41 @import "generic/forms.scss";
40 42 @import "generic/selects.scss";
  43 +@import "generic/highlight.scss";
41 44  
42 45 /**
43 46 * Page specific styles (issues, projects etc):
... ... @@ -45,6 +48,7 @@
45 48 @import "sections/header.scss";
46 49 @import "sections/nav.scss";
47 50 @import "sections/commits.scss";
  51 +@import "sections/diff.scss";
48 52 @import "sections/issues.scss";
49 53 @import "sections/projects.scss";
50 54 @import "sections/snippets.scss";
... ... @@ -63,9 +67,10 @@
63 67 @import "sections/wall.scss";
64 68 @import "sections/dashboard.scss";
65 69 @import "sections/stat_graph.scss";
  70 +@import "sections/groups.scss";
66 71  
67 72 /**
68   - * Code ighlight
  73 + * Code highlight
69 74 */
70 75 @import "highlight/white.scss";
71 76 @import "highlight/dark.scss";
... ...
app/assets/stylesheets/generic/blocks.scss
... ... @@ -2,3 +2,18 @@
2 2 background: #f9f9f9;
3 3 padding: 15px;
4 4 }
  5 +
  6 +.centered-light-block {
  7 + text-align: center;
  8 + color: #888;
  9 + margin: 20px;
  10 +}
  11 +
  12 +.nothing-here-block {
  13 + text-align: center;
  14 + padding: 20px;
  15 + color: #666;
  16 + font-weight: normal;
  17 + font-size: 16px;
  18 + line-height: 36px;
  19 +}
... ...
app/assets/stylesheets/generic/buttons.scss
... ... @@ -118,7 +118,6 @@
118 118 @extend .btn-primary;
119 119 }
120 120  
121   - &.btn-close,
122 121 &.btn-remove {
123 122 @extend .btn-danger;
124 123 }
... ... @@ -143,6 +142,30 @@
143 142 line-height: 16px;
144 143 margin: 2px;
145 144 }
  145 +
  146 + &.btn-close {
  147 + color: #B94A48;
  148 + font-weight: bold;
  149 + &:hover {
  150 + color: #B94A48;
  151 + }
  152 + }
  153 +
  154 + &.btn-reopen {
  155 + color: #468847;
  156 + font-weight: bold;
  157 + &:hover {
  158 + color: #468847;
  159 + }
  160 + }
  161 +
  162 + &.btn-grouped {
  163 + margin-right: 7px;
  164 + float: left;
  165 + &:last-child {
  166 + margin-right: 0px;
  167 + }
  168 + }
146 169 }
147 170  
148 171 .btn-block {
... ... @@ -154,9 +177,8 @@
154 177 }
155 178 }
156 179  
157   -.btn,
158 180 .btn-group {
159   - &.grouped {
  181 + &.btn-grouped {
160 182 margin-right: 7px;
161 183 float: left;
162 184 &:last-child {
... ...
app/assets/stylesheets/generic/common.scss
... ... @@ -11,8 +11,6 @@
11 11 .bgred { background: #F2DEDE!important }
12 12  
13 13 /** COMMON CLASSES **/
14   -.left { float:left }
15   -
16 14 .prepend-top-10 { margin-top:10px }
17 15 .prepend-top-20 { margin-top:20px }
18 16 .prepend-left-10 { margin-left:10px }
... ... @@ -24,32 +22,9 @@
24 22 .append-bottom-20 { margin-bottom:20px }
25 23 .inline { display: inline-block }
26 24  
27   -.padded { padding:20px }
28   -.ipadded { padding:20px!important }
29   -.lborder { border-left:1px solid #eee }
30   -.underlined_link { text-decoration: underline; }
  25 +.underlined-link { text-decoration: underline; }
31 26 .hint { font-style: italic; color: #999; }
32 27 .light { color: #888 }
33   -.tiny { font-weight: normal }
34   -.vtop { vertical-align: top !important; }
35   -
36   -
37   -/** ALERT MESSAGES **/
38   -.alert.alert-disabled {
39   - background: #EEE;
40   - color: #777;
41   - border-color: #DDD;
42   -}
43   -
44   -/** HELPERS **/
45   -.nothing_here_message {
46   - text-align: center;
47   - padding: 20px;
48   - color: #666;
49   - font-weight: normal;
50   - font-size: 16px;
51   - line-height: 36px;
52   -}
53 28  
54 29 .slead {
55 30 color: #666;
... ... @@ -59,49 +34,23 @@
59 34 line-height: 24px;
60 35 }
61 36  
62   -
63 37 .tab-content {
64 38 overflow: visible;
65 39 }
66 40  
67   -@media (max-width: 1200px) {
68   - .only-wide {
69   - display: none;
70   - }
71   -}
72   -
73   -pre.well-pre {
74   - border: 1px solid #EEE;
75   - background: #f9f9f9;
76   - border-radius: 0;
77   - color: #555;
78   -}
79   -
80   -.input-append .btn.active, .input-prepend .btn.active {
81   - background: #CCC;
82   - border-color: #BBB;
83   - text-shadow: 0 1px 1px #fff;
84   - font-weight: bold;
85   - @include box-shadow(inset 0 2px 4px rgba(0,0,0,.15));
86   -}
87   -
88   -/** Big Labels **/
89   -.state-label {
90   - font-size: 14px;
91   - padding: 6px 25px;
92   - text-align: center;
93   - @include border-radius(4px);
94   - text-shadow: none;
95   - margin-left: 10px;
96   -
97   - &.state-label-green {
98   - background: #4A4;
99   - color: #FFF;
  41 +pre {
  42 + &.clean {
  43 + background: none;
  44 + border: none;
  45 + margin: 0;
  46 + padding: 0;
100 47 }
101 48  
102   - &.state-label-red {
103   - background: #DA4E49;
104   - color: #FFF;
  49 + &.well-pre {
  50 + border: 1px solid #EEE;
  51 + background: #f9f9f9;
  52 + border-radius: 0;
  53 + color: #555;
105 54 }
106 55 }
107 56  
... ... @@ -112,6 +61,7 @@ pre.well-pre {
112 61 .dropdown-menu > li > a:hover,
113 62 .dropdown-menu > li > a:focus {
114 63 background: #29b;
  64 + color: #FFF
115 65 }
116 66  
117 67 .breadcrumb > li + li:before {
... ... @@ -130,31 +80,6 @@ pre.well-pre {
130 80 }
131 81  
132 82 /** FLASH message **/
133   -.flash-container {
134   - display: none;
135   - cursor: pointer;
136   - margin: 0;
137   - text-align: center;
138   - color: #fff;
139   - font-size: 14px;
140   - position: fixed;
141   - bottom: 0;
142   - width: 100%;
143   - opacity: 0.8;
144   - z-index: 100;
145   -
146   - .flash-notice {
147   - background: #49C;
148   - padding: 10px;
149   - text-shadow: 0 1px 1px #178;
150   - }
151   -
152   - .flash-alert {
153   - background: #C67;
154   - text-shadow: 0 1px 1px #945;
155   - padding: 10px;
156   - }
157   -}
158 83 .author_link {
159 84 color: $link_color;
160 85 }
... ... @@ -173,12 +98,10 @@ table a code {
173 98  
174 99 .loading {
175 100 margin: 20px auto;
176   - background: url(ajax_loader.gif) no-repeat center center;
177   - width: 40px;
178 101 height: 40px;
179   - &.loading-gray {
180   - background: url(ajax_loader_gray.gif) no-repeat center center;
181   - }
  102 + color: #555;
  103 + font-size: 32px;
  104 + text-align: center;
182 105 }
183 106  
184 107 span.update-author {
... ... @@ -276,22 +199,6 @@ li.note {
276 199 cursor: pointer;
277 200 }
278 201  
279   -.merge-request,
280   -.issue {
281   - &.today{
282   - background: #EFE;
283   - border-color: #CEC;
284   - }
285   - &.closed {
286   - background: #F5f5f5;
287   - border-color: #E5E5E5;
288   - }
289   - &.merged {
290   - background: #F5f5f5;
291   - border-color: #E5E5E5;
292   - }
293   -}
294   -
295 202 .git_error_tips {
296 203 @extend .col-md-6;
297 204 text-align: left;
... ... @@ -327,6 +234,12 @@ li.note {
327 234 color: #fff;
328 235 text-decoration: underline;
329 236 }
  237 +
  238 + .links-xs {
  239 + text-align: center;
  240 + font-size: 16px;
  241 + padding: 5px;
  242 + }
330 243 }
331 244  
332 245 .warning_message {
... ... @@ -349,15 +262,6 @@ li.note {
349 262 }
350 263 }
351 264  
352   -pre {
353   - &.clean {
354   - background: none;
355   - border: none;
356   - margin: 0;
357   - padding: 0;
358   - }
359   -}
360   -
361 265 .milestone {
362 266 &.milestone-closed {
363 267 background: #eee;
... ... @@ -441,40 +345,6 @@ table {
441 345 margin-bottom: 20px;
442 346 }
443 347  
444   -.ajax-users-select {
445   - width: 400px;
446   -
447   - &.input-large {
448   - width: 210px;
449   - }
450   -
451   - &.input-clamp {
452   - max-width: 100%;
453   - }
454   -}
455   -
456   -.user-result {
457   - .user-image {
458   - float: left;
459   - }
460   - .user-name {
461   - }
462   - .user-username {
463   - color: #999;
464   - }
465   -}
466   -
467   -.namespace-result {
468   - .namespace-kind {
469   - color: #AAA;
470   - font-weight: normal;
471   - }
472   - .namespace-path {
473   - margin-left: 10px;
474   - font-weight: bolder;
475   - }
476   -}
477   -
478 348 .btn-sign-in {
479 349 margin-top: 7px;
480 350 text-shadow: none;
... ... @@ -485,3 +355,7 @@ table {
485 355 margin-bottom: 15px;
486 356 }
487 357 }
  358 +
  359 +@media (max-width: $screen-xs-max) {
  360 + .container .content { margin-top: 20px; }
  361 +}
... ...
app/assets/stylesheets/generic/files.scss
... ... @@ -45,14 +45,14 @@
45 45 text-align: center;
46 46 img {
47 47 padding: 100px;
48   - max-width: 300px;
  48 + max-width: 50%;
49 49 }
50 50 }
51 51  
52 52 &.wiki {
53   - padding: 20px;
54 53 font-size: 14px;
55 54 line-height: 1.6;
  55 + padding: 25px;
56 56  
57 57 .highlight {
58 58 margin-bottom: 9px;
... ... @@ -143,75 +143,6 @@
143 143 */
144 144 &.code {
145 145 padding: 0;
146   -
147   - table.lines {
148   - border: none;
149   - box-shadow: none;
150   - margin: 0px;
151   - padding: 0px;
152   - table-layout: fixed;
153   -
154   - pre {
155   - border: none;
156   - border-radius: 0;
157   - font-family: $monospace_font;
158   - font-size: 12px !important;
159   - line-height: 16px !important;
160   - margin: 0;
161   - padding: 10px 0;
162   - }
163   - td {
164   - border: none;
165   - margin: 0;
166   - padding: 0;
167   - vertical-align: top;
168   -
169   - &:first-child {
170   - background: #eee;
171   - width: 50px;
172   - }
173   - &:last-child {
174   - }
175   - }
176   - tr:hover {
177   - background: none;
178   - }
179   -
180   - pre.line_numbers {
181   - color: #666;
182   - padding: 10px 6px 10px 0;
183   - text-align: right;
184   - background: #EEE;
185   -
186   - a {
187   - color: #666;
188   -
189   - i {
190   - display: none;
191   - font-size: 14px;
192   - line-height: 14px;
193   - }
194   - &:hover i {
195   - display: inherit;
196   - }
197   - }
198   - }
199   -
200   - .highlight {
201   - border-left: 1px solid #DEE2E3;
202   - overflow: auto;
203   - overflow-y: hidden;
204   -
205   - pre {
206   - white-space: pre;
207   - word-wrap: normal;
208   -
209   - .line {
210   - padding: 0 10px;
211   - }
212   - }
213   - }
214   - }
215 146 }
216 147 }
217 148 }
... ...
app/assets/stylesheets/generic/flash.scss 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +.flash-container {
  2 + display: none;
  3 + cursor: pointer;
  4 + margin: 0;
  5 + text-align: center;
  6 + color: #fff;
  7 + font-size: 14px;
  8 + position: fixed;
  9 + bottom: 0;
  10 + width: 100%;
  11 + opacity: 0.8;
  12 + z-index: 100;
  13 +
  14 + .flash-notice {
  15 + background: #49C;
  16 + padding: 10px;
  17 + text-shadow: 0 1px 1px #178;
  18 + }
  19 +
  20 + .flash-alert {
  21 + background: #C67;
  22 + text-shadow: 0 1px 1px #945;
  23 + padding: 10px;
  24 + }
  25 +}
... ...
app/assets/stylesheets/generic/forms.scss
... ... @@ -51,3 +51,27 @@ label {
51 51 .input-mn-300 {
52 52 min-width: 300px;
53 53 }
  54 +
  55 +.custom-form-control {
  56 + width: 150px;
  57 +}
  58 +
  59 +@media (min-width: $screen-sm-min) {
  60 + .custom-form-control {
  61 + width: 150px;
  62 + }
  63 +}
  64 +
  65 +/* Medium devices (desktops, 992px and up) */
  66 +@media (min-width: $screen-md-min) {
  67 + .custom-form-control {
  68 + width: 170px;
  69 + }
  70 +}
  71 +
  72 +/* Large devices (large desktops, 1200px and up) */
  73 +@media (min-width: $screen-lg-min) {
  74 + .custom-form-control {
  75 + width: 200px;
  76 + }
  77 +}
... ...
app/assets/stylesheets/generic/highlight.scss 0 → 100644
... ... @@ -0,0 +1,64 @@
  1 +.highlighted-data {
  2 + border: none;
  3 + box-shadow: none;
  4 + margin: 0px;
  5 + padding: 0px;
  6 + table-layout: fixed;
  7 +
  8 + pre {
  9 + padding: 10px;
  10 + border: none;
  11 + border-radius: 0;
  12 + font-family: $monospace_font;
  13 + font-size: 12px !important;
  14 + line-height: 16px !important;
  15 + margin: 0;
  16 +
  17 + code {
  18 + white-space: pre;
  19 + word-wrap: normal;
  20 + padding: 0;
  21 +
  22 + .line {
  23 + display: inline;
  24 + }
  25 + }
  26 + }
  27 +
  28 + .hljs {
  29 + padding: 0;
  30 + }
  31 +
  32 + .line-numbers {
  33 + padding: 10px;
  34 + text-align: right;
  35 + float: left;
  36 +
  37 + a {
  38 + font-family: $monospace_font;
  39 + display: block;
  40 + font-size: 12px !important;
  41 + line-height: 16px !important;
  42 + white-space: nowrap;
  43 +
  44 + i {
  45 + visibility: hidden;
  46 + @extend .pull-left;
  47 + }
  48 +
  49 + &:hover i {
  50 + visibility: visible;
  51 + }
  52 + }
  53 + }
  54 +
  55 + .highlight {
  56 + overflow: auto;
  57 + overflow-y: hidden;
  58 +
  59 + pre {
  60 + white-space: pre;
  61 + word-wrap: normal;
  62 + }
  63 + }
  64 +}
... ...
app/assets/stylesheets/generic/issue_box.scss
... ... @@ -10,37 +10,103 @@
10 10 .issue-box {
11 11 color: #666;
12 12 margin:20px 0;
13   - background: #FAFAFA;
14   - border: 1px solid #DDD;
  13 + background: #FFF;
  14 + border: 1px solid #EEE;
  15 +
  16 + &.issue-box-closed {
  17 + border-color: #DA4E49;
  18 + .state {
  19 + background-color: #f2dede;
  20 + border-color: #ebccd1;
  21 + color: #a94442;
  22 + .state-label {
  23 + background: #DA4E49;
  24 + color: #FFF;
  25 + }
  26 + }
  27 + }
  28 +
  29 + &.issue-box-merged {
  30 + border-color: #31708f;
  31 + .state {
  32 + background-color: #d9edf7;
  33 + border-color: #bce8f1;
  34 + color: #31708f;
  35 + .state-label {
  36 + background: #31708f;
  37 + color: #FFF;
  38 + }
  39 + }
  40 + }
  41 +
  42 + &.issue-box-open {
  43 + border-color: #4A4;
  44 + .state {
  45 + background-color: #dff0d8;
  46 + border-color: #d6e9c6;
  47 + color: #3c763d;
  48 + .state-label {
  49 + background: #4A4;
  50 + color: #FFF;
  51 + }
  52 + }
  53 + }
  54 +
  55 + &.issue-box-expired {
  56 + border-color: #cea61b;
  57 + .state {
  58 + background-color: #fcf8e3;
  59 + border-color: #faebcc;
  60 + color: #8a6d3b;
  61 + .state-label {
  62 + background: #cea61b;
  63 + color: #FFF;
  64 + }
  65 + }
  66 + }
15 67  
16 68 .control-group {
17 69 margin-bottom: 0;
18 70 }
19 71  
  72 + .state {
  73 + height: 34px;
  74 + border-bottom: 1px solid #DDD;
  75 + line-height: 32px;
  76 + }
  77 +
20 78 .title {
21   - font-size: 20px;
  79 + font-size: 22px;
22 80 font-weight: 500;
23   - line-height: 28px;
  81 + line-height: 1.5;
24 82 margin: 0;
25   - color: #444;
  83 + color: #333;
  84 + padding-bottom: 0;
  85 + padding: 15px 25px;
26 86 }
27 87  
28 88 .context {
29 89 border: none;
30   - background-color: #f5f5f5;
31   - border: none;
32 90 border-top: 1px solid #eee;
  91 + padding: 15px 25px;
33 92 }
34 93  
35 94 .description {
36   - border-top: 1px solid #eee;
  95 + padding: 0 25px 15px 25px;
37 96 }
38 97  
39 98 .title, .context, .description {
40   - padding: 15px;
41   -
42 99 .clearfix {
43 100 margin: 0;
44 101 }
45 102 }
  103 +
  104 + .state-label {
  105 + font-size: 14px;
  106 + padding: 1px 25px;
  107 + text-align: center;
  108 + text-shadow: none;
  109 + margin-right: 20px;
  110 + display: inline-block;
  111 + }
46 112 }
... ...
app/assets/stylesheets/generic/lists.scss
... ... @@ -23,6 +23,12 @@
23 23 }
24 24 }
25 25  
  26 + &.warning-row {
  27 + background-color: #fcf8e3;
  28 + border-color: #faebcc;
  29 + color: #8a6d3b;
  30 + }
  31 +
26 32 &.smoke { background-color: #f5f5f5; }
27 33  
28 34 &:hover {
... ...
app/assets/stylesheets/generic/selects.scss
1 1 /** Select2 selectbox style override **/
2   -
3   -.select2-container {
  2 +.select2-container, .select2-container.select2-drop-above {
4 3 .select2-choice {
5 4 background: #FFF;
6 5 border-color: #BBB;
... ... @@ -12,8 +11,24 @@
12 11 }
13 12  
14 13 .select2-drop-active {
15   - border: 1px solid #BBB;
  14 + border: 1px solid #BBB !important;
16 15 margin-top: 4px;
  16 +
  17 + &.select2-drop-above {
  18 + margin-bottom: 8px;
  19 + }
  20 +
  21 + .select2-search input {
  22 + background: #fafafa;
  23 + border-color: #DDD;
  24 + }
  25 +
  26 + .select2-results {
  27 + max-height: 350px;
  28 + .select2-highlighted {
  29 + background: $bg_style_color;
  30 + }
  31 + }
17 32 }
18 33  
19 34 select {
... ... @@ -66,3 +81,43 @@ select {
66 81 .project-refs-form .select2-container {
67 82 margin-right: 10px;
68 83 }
  84 +
  85 +.ajax-users-dropdown, .ajax-project-users-dropdown {
  86 + .select2-search {
  87 + padding-top: 4px;
  88 + }
  89 +}
  90 +
  91 +.ajax-users-select {
  92 + width: 400px;
  93 +
  94 + &.input-large {
  95 + width: 210px;
  96 + }
  97 +
  98 + &.input-clamp {
  99 + max-width: 100%;
  100 + }
  101 +}
  102 +
  103 +.user-result {
  104 + .user-image {
  105 + float: left;
  106 + }
  107 + .user-name {
  108 + }
  109 + .user-username {
  110 + color: #999;
  111 + }
  112 +}
  113 +
  114 +.namespace-result {
  115 + .namespace-kind {
  116 + color: #AAA;
  117 + font-weight: normal;
  118 + }
  119 + .namespace-path {
  120 + margin-left: 10px;
  121 + font-weight: bolder;
  122 + }
  123 +}
... ...
app/assets/stylesheets/generic/typography.scss
... ... @@ -90,9 +90,27 @@ a:focus {
90 90  
91 91 font-size: 14px;
92 92 line-height: 1.6;
93   - .white .highlight pre {
94   - background: #f5f5f5;
  93 +
  94 + /* Link to current header. */
  95 + h1, h2, h3, h4, h5, h6 {
  96 + position: relative;
  97 + &:hover > :last-child {
  98 + $size: 16px;
  99 + position: absolute;
  100 + right: 100%;
  101 + top: 50%;
  102 + margin-top: -$size/2;
  103 + margin-right: 0px;
  104 + padding-right: 20px;
  105 + display: inline-block;
  106 + width: $size;
  107 + height: $size;
  108 + background-image: url("icon-link.png");
  109 + background-size: contain;
  110 + background-repeat: no-repeat;
  111 + }
95 112 }
  113 +
96 114 ul {
97 115 padding: 0;
98 116 margin: 0 0 9px 25px !important;
... ...
app/assets/stylesheets/gl_bootstrap.scss
... ... @@ -108,6 +108,8 @@ $pagination-active-bg: $bg_style_color;
108 108  
109 109 // Nav tabs
110 110 .nav.nav-tabs {
  111 + margin-bottom: 15px;
  112 +
111 113 li {
112 114 > a {
113 115 padding: 8px 20px;
... ...
app/assets/stylesheets/highlight/dark.scss
1   -.dark .highlight {
  1 +.dark {
  2 + background-color: #232323;
2 3  
3   - background-color: #333;
  4 + .line.hll {
  5 + background: #558;
  6 + }
  7 +
  8 + .highlight{
  9 + border-left: 1px solid #444;
  10 + }
  11 +
  12 + .no-highlight {
  13 + color: #DDD;
  14 + }
  15 +
  16 + .line-numbers a {
  17 + color: #666;
  18 + }
4 19  
5 20 pre {
6   - background-color: #333;
7   - color: #eee;
8   - }
9   -
10   - .hll { display: block; background-color: darken($hover, 65%) }
11   - .c { color: #888888; font-style: italic } /* Comment */
12   - .err { color: #a61717; background-color: #e3d2d2 } /* Error */
13   - .k { color: #CDA869; font-weight: bold } /* Keyword */
14   - .kp { color: #CDA869; font-weight: bold } /* Keyword */
15   - .cm { color: #888888 } /* Comment.Multiline */
16   - .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
17   - .c1 { color: #888888 } /* Comment.Single */
18   - .cs { color: #cc0000; font-weight: bold; background-color: transparent } /* Comment.Special */
19   - .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
20   - .ge { font-style: italic } /* Generic.Emph */
21   - .gr { color: #aa0000 } /* Generic.Error */
22   - .gh { color: #303030 } /* Generic.Heading */
23   - .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
24   - .go { color: #888888 } /* Generic.Output */
25   - .gp { color: #555555 } /* Generic.Prompt */
26   - .gs { font-weight: bold } /* Generic.Strong */
27   - .gu { color: #606060 } /* Generic.Subheading */
28   - .gt { color: #aa0000 } /* Generic.Traceback */
29   - .kc{font-weight: bold;} /* Keyword.Constant */
30   - .kd{font-weight: bold;} /* Keyword.Declaration */
31   - .kn{font-weight: bold;} /* Keyword.Namespace */
32   - .kp{font-weight: bold;} /* Keyword.Pseudo */
33   - .kr{font-weight: bold;} /* Keyword.Reserved */
34   - .kt{color: #458;font-weight: bold;} /* Keyword.Type */
35   - .m { color: #0000DD; font-weight: bold } /* Literal.Number */
36   - .p { color: #eee; }
37   - .s { color: #0AD; background-color: transparent } /* Literal.String */
38   - .na{color: #008080;} /* Name.Attribute */
39   - .nb{color: #0086B3;} /* Name.Builtin */
40   - .nc{color: #ccc;font-weight: bold;} /* Name.Class */
41   - .no{color: turquoise;} /* Name.Constant */
42   - .ni{color: #800080;}
43   - .ne{color: #900;font-weight: bold;} /* Name.Exception */
44   - .nf{color: #ccc;font-weight: bold;} /* Name.Function */
45   - .nn{color: #79C3E0;font-weight: bold;} /* Name.Namespace */
46   - .nt{color: #fc5;} /* Name.Tag */
47   - .nv{color: #FA4;} /* Name.Variable */
48   - .py { color: #336699; font-weight: bold } /* Name.Property */
49   - .ow { color: #008800 } /* Operator.Word */
50   - .w { color: #bbbbbb } /* Text.Whitespace */
51   - .mf { color: #7AC; font-weight: bold } /* Literal.Number.Float */
52   - .mh { color: #7AC; font-weight: bold } /* Literal.Number.Hex */
53   - .mi {color: #099;} /* Literal.Number.Integer */
54   - .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
55   - .sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
56   - .sc{color: #d14;} /* Literal.String.Char */
57   - .sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
58   - .s2{color: orange;} /* Literal.String.Double */
59   - .se{color: orange;} /* Literal.String.Escape */
60   - .sh{color: orange;} /* Literal.String.Heredoc */
61   - .si{color: orange;} /* Literal.String.Interpol */
62   - .sx{color: orange;} /* Literal.String.Other */
63   - .sr{color: orange;} /* Literal.String.Regex */
64   - .s1{color: orange;} /* Literal.String.Single */
65   - .ss{color: orange;} /* Literal.String.Symbol */
66   - .bp { color: #D58 } /* Name.Builtin.Pseudo */
67   - .vc { color: #336699 } /* Name.Variable.Class */
68   - .vg { color: #dd7700 } /* Name.Variable.Global */
69   - .vi { color: cyan }
70   -}
  21 + background-color: #232323;
  22 + }
  23 +
  24 + .hljs {
  25 + display: block;
  26 + background: #232323;
  27 + color: #E6E1DC;
  28 + }
  29 +
  30 + .hljs-comment,
  31 + .hljs-template_comment,
  32 + .hljs-javadoc,
  33 + .hljs-shebang {
  34 + color: #BC9458;
  35 + font-style: italic;
  36 + }
  37 +
  38 + .hljs-keyword,
  39 + .ruby .hljs-function .hljs-keyword,
  40 + .hljs-request,
  41 + .hljs-status,
  42 + .nginx .hljs-title,
  43 + .method,
  44 + .hljs-list .hljs-title {
  45 + color: #C26230;
  46 + }
  47 +
  48 + .hljs-string,
  49 + .hljs-number,
  50 + .hljs-regexp,
  51 + .hljs-tag .hljs-value,
  52 + .hljs-cdata,
  53 + .hljs-filter .hljs-argument,
  54 + .hljs-attr_selector,
  55 + .apache .hljs-cbracket,
  56 + .hljs-date,
  57 + .tex .hljs-command,
  58 + .markdown .hljs-link_label {
  59 + color: #A5C261;
  60 + }
  61 +
  62 + .hljs-subst {
  63 + color: #519F50;
  64 + }
  65 +
  66 + .hljs-tag,
  67 + .hljs-tag .hljs-keyword,
  68 + .hljs-tag .hljs-title,
  69 + .hljs-doctype,
  70 + .hljs-sub .hljs-identifier,
  71 + .hljs-pi,
  72 + .input_number {
  73 + color: #E8BF6A;
  74 + }
  75 +
  76 + .hljs-identifier {
  77 + color: #D0D0FF;
  78 + }
  79 +
  80 + .hljs-class .hljs-title,
  81 + .haskell .hljs-type,
  82 + .smalltalk .hljs-class,
  83 + .hljs-javadoctag,
  84 + .hljs-yardoctag,
  85 + .hljs-phpdoc {
  86 + text-decoration: none;
  87 + }
  88 +
  89 + .hljs-constant {
  90 + color: #DA4939;
  91 + }
  92 +
  93 +
  94 + .hljs-symbol,
  95 + .hljs-built_in,
  96 + .ruby .hljs-symbol .hljs-string,
  97 + .ruby .hljs-symbol .hljs-identifier,
  98 + .markdown .hljs-link_url,
  99 + .hljs-attribute {
  100 + color: #6D9CBE;
  101 + }
  102 +
  103 + .markdown .hljs-link_url {
  104 + text-decoration: underline;
  105 + }
71 106  
  107 +
  108 +
  109 + .hljs-params,
  110 + .hljs-variable,
  111 + .clojure .hljs-attribute {
  112 + color: #D0D0FF;
  113 + }
  114 +
  115 + .css .hljs-tag,
  116 + .hljs-rules .hljs-property,
  117 + .hljs-pseudo,
  118 + .tex .hljs-special {
  119 + color: #CDA869;
  120 + }
  121 +
  122 + .css .hljs-class {
  123 + color: #9B703F;
  124 + }
  125 +
  126 + .hljs-rules .hljs-keyword {
  127 + color: #C5AF75;
  128 + }
  129 +
  130 + .hljs-rules .hljs-value {
  131 + color: #CF6A4C;
  132 + }
  133 +
  134 + .css .hljs-id {
  135 + color: #8B98AB;
  136 + }
  137 +
  138 + .hljs-annotation,
  139 + .apache .hljs-sqbracket,
  140 + .nginx .hljs-built_in {
  141 + color: #9B859D;
  142 + }
  143 +
  144 + .hljs-preprocessor,
  145 + .hljs-preprocessor *,
  146 + .hljs-pragma {
  147 + color: #8996A8 !important;
  148 + }
  149 +
  150 + .hljs-hexcolor,
  151 + .css .hljs-value .hljs-number {
  152 + color: #A5C261;
  153 + }
  154 +
  155 + .hljs-title,
  156 + .hljs-decorator,
  157 + .css .hljs-function {
  158 + color: #FFC66D;
  159 + }
  160 +
  161 + .diff .hljs-header,
  162 + .hljs-chunk {
  163 + background-color: #2F33AB;
  164 + color: #E6E1DC;
  165 + display: inline-block;
  166 + width: 100%;
  167 + }
  168 +
  169 + .diff .hljs-change {
  170 + background-color: #4A410D;
  171 + color: #F8F8F8;
  172 + display: inline-block;
  173 + width: 100%;
  174 + }
  175 +
  176 + .hljs-addition {
  177 + background-color: #144212;
  178 + color: #E6E1DC;
  179 + display: inline-block;
  180 + width: 100%;
  181 + }
  182 +
  183 + .hljs-deletion {
  184 + background-color: #600;
  185 + color: #E6E1DC;
  186 + display: inline-block;
  187 + width: 100%;
  188 + }
  189 +
  190 + .coffeescript .javascript,
  191 + .javascript .xml,
  192 + .tex .hljs-formula,
  193 + .xml .javascript,
  194 + .xml .vbscript,
  195 + .xml .css,
  196 + .xml .hljs-cdata {
  197 + opacity: 0.7;
  198 + }
  199 +}
... ...
app/assets/stylesheets/highlight/monokai.scss
1   -$monokai-fg: #f8f8f2;
2   -$monokai-comment: #75715e;
3   -$monokai-pink: #f92672;
4   -$monokai-blue: #66d9ef;
5   -$monokai-green: #a6e22e;
6   -$monokai-gold: #e6db74;
7   -$monokai-dark: #3b3a32;
8   -$monokai-purple: #ae81ff;
  1 +.monokai {
  2 + background-color: #272822;
9 3  
10   -.monokai .highlight {
  4 + .highlight{
  5 + border-left: 1px solid #444;
  6 + }
11 7  
12   - background-color: #272822;
  8 + .line.hll {
  9 + background: #558;
  10 + }
  11 +
  12 + .no-highlight {
  13 + color: #DDD;
  14 + }
  15 +
  16 + .line-numbers a {
  17 + color: #666;
  18 + }
13 19  
14 20 pre {
15 21 background-color: #272822;
16   - color: $monokai-fg;
  22 + color: #f8f8f2;
17 23 }
18 24  
19   - .hll { background-color: darken($hover, 65%) }
20   - .c { color: $monokai-comment } /* Comment */
21   - .err { color: $monokai-fg } /* Error */
22   - .g { color: $monokai-fg } /* Generic */
23   - .k { color: $monokai-pink } /* Keyword */
24   - .l { color: $monokai-fg } /* Literal */
25   - .n { color: $monokai-blue } /* Name */
26   - .o { color: $monokai-fg } /* Operator */
27   - .x { color: $monokai-fg } /* Other */
28   - .p { color: $monokai-fg } /* Punctuation */
29   - .cm { color: $monokai-comment } /* Comment.Multiline */
30   - .cp { color: $monokai-comment } /* Comment.Preproc */
31   - .c1 { color: $monokai-comment } /* Comment.Single */
32   - .cs { color: $monokai-comment } /* Comment.Special */
33   - .gd { color: #8b0807 } /* Generic.Deleted */
34   - .ge { color: $monokai-fg; text-decoration: underline } /* Generic.Emph */
35   - .gr { color: $monokai-fg } /* Generic.Error */
36   - .gh { color: $monokai-fg; font-weight: bold } /* Generic.Heading */
37   - .gi { color: $monokai-fg; font-weight: bold; background-color: #46830c } /* Generic.Inserted */
38   - .go { color: $monokai-dark; background-color: #31322c } /* Generic.Output */
39   - .gp { color: $monokai-fg } /* Generic.Prompt */
40   - .gs { color: $monokai-fg } /* Generic.Strong */
41   - .gu { color: $monokai-fg; font-weight: bold } /* Generic.Subheading */
42   - .gt { color: #f8f8f0; background-color: $monokai-pink } /* Generic.Traceback */
43   - .kc { color: $monokai-purple } /* Keyword.Constant */
44   - .kd { color: $monokai-pink } /* Keyword.Declaration */
45   - .kn { color: $monokai-pink } /* Keyword.Namespace */
46   - .kp { color: $monokai-pink } /* Keyword.Pseudo */
47   - .kr { color: $monokai-pink } /* Keyword.Reserved */
48   - .kt { color: $monokai-fg } /* Keyword.Type */
49   - .ld { color: $monokai-fg } /* Literal.Date */
50   - .m { color: $monokai-purple } /* Literal.Number */
51   - .s { color: $monokai-gold } /* Literal.String */
52   - .na { color: $monokai-purple } /* Name.Attribute */
53   - .nb { color: $monokai-blue } /* Name.Builtin */
54   - .nc { color: $monokai-fg } /* Name.Class */
55   - .no { color: $monokai-fg } /* Name.Constant */
56   - .nd { color: $monokai-fg } /* Name.Decorator */
57   - .ni { color: $monokai-fg } /* Name.Entity */
58   - .ne { color: $monokai-fg } /* Name.Exception */
59   - .nf { color: $monokai-green } /* Name.Function */
60   - .nl { color: $monokai-gold } /* Name.Label */
61   - .nn { color: $monokai-fg } /* Name.Namespace */
62   - .nx { color: $monokai-fg } /* Name.Other */
63   - .nt { color: $monokai-pink } /* Name.Tag */
64   - .nv { color: $monokai-blue; font-style: italic } /* Name.Variable */
65   - .py { color: $monokai-fg } /* Name.Property */
66   - .ow { color: $monokai-pink } /* Operator.Word */
67   - .w { color: $monokai-fg } /* Text.Whitespace */
68   - .mf { color: $monokai-purple } /* Literal.Number.Float */
69   - .mh { color: $monokai-purple } /* Literal.Number.Hex */
70   - .mi { color: $monokai-purple } /* Literal.Number.Integer */
71   - .mo { color: $monokai-purple } /* Literal.Number.Oct */
72   - .sb { color: $monokai-gold } /* Literal.String.Backtick */
73   - .sc { color: $monokai-gold } /* Literal.String.Char */
74   - .sd { color: $monokai-gold } /* Literal.String.Doc */
75   - .s2 { color: $monokai-gold } /* Literal.String.Double */
76   - .se { color: $monokai-gold } /* Literal.String.Escape */
77   - .sh { color: $monokai-gold } /* Literal.String.Heredoc */
78   - .si { color: $monokai-gold } /* Literal.String.Interpol */
79   - .sx { color: $monokai-gold } /* Literal.String.Other */
80   - .sr { color: $monokai-gold } /* Literal.String.Regex */
81   - .s1 { color: $monokai-gold } /* Literal.String.Single */
82   - .ss { color: $monokai-gold } /* Literal.String.Symbol */
83   - .bp { color: $monokai-fg } /* Name.Builtin.Pseudo */
84   - .vc { color: $monokai-blue; font-style: italic } /* Name.Variable.Class */
85   - .vg { color: $monokai-blue; font-style: italic } /* Name.Variable.Global */
86   - .vi { color: $monokai-blue; font-style: italic } /* Name.Variable.Instance */
87   - .il { color: $monokai-purple } /* Literal.Number.Integer.Long */
88   -}
  25 + .hljs {
  26 + display: block;
  27 + background: #272822;
  28 + }
  29 +
  30 + .hljs-tag,
  31 + .hljs-tag .hljs-title,
  32 + .hljs-keyword,
  33 + .hljs-literal,
  34 + .hljs-strong,
  35 + .hljs-change,
  36 + .hljs-winutils,
  37 + .hljs-flow,
  38 + .lisp .hljs-title,
  39 + .clojure .hljs-built_in,
  40 + .nginx .hljs-title,
  41 + .tex .hljs-special {
  42 + color: #F92672;
  43 + }
  44 +
  45 + .hljs {
  46 + color: #DDD;
  47 + }
89 48  
  49 + .hljs .hljs-constant,
  50 + .asciidoc .hljs-code {
  51 + color: #66D9EF;
  52 + }
  53 +
  54 + .hljs-code,
  55 + .hljs-class .hljs-title,
  56 + .hljs-header {
  57 + color: white;
  58 + }
  59 +
  60 + .hljs-link_label,
  61 + .hljs-attribute,
  62 + .hljs-symbol,
  63 + .hljs-symbol .hljs-string,
  64 + .hljs-value,
  65 + .hljs-regexp {
  66 + color: #BF79DB;
  67 + }
  68 +
  69 + .hljs-link_url,
  70 + .hljs-tag .hljs-value,
  71 + .hljs-string,
  72 + .hljs-bullet,
  73 + .hljs-subst,
  74 + .hljs-title,
  75 + .hljs-emphasis,
  76 + .haskell .hljs-type,
  77 + .hljs-preprocessor,
  78 + .hljs-pragma,
  79 + .ruby .hljs-class .hljs-parent,
  80 + .hljs-built_in,
  81 + .sql .hljs-aggregate,
  82 + .django .hljs-template_tag,
  83 + .django .hljs-variable,
  84 + .smalltalk .hljs-class,
  85 + .hljs-javadoc,
  86 + .django .hljs-filter .hljs-argument,
  87 + .smalltalk .hljs-localvars,
  88 + .smalltalk .hljs-array,
  89 + .hljs-attr_selector,
  90 + .hljs-pseudo,
  91 + .hljs-addition,
  92 + .hljs-stream,
  93 + .hljs-envvar,
  94 + .apache .hljs-tag,
  95 + .apache .hljs-cbracket,
  96 + .tex .hljs-command,
  97 + .hljs-prompt {
  98 + color: #A6E22E;
  99 + }
  100 +
  101 + .hljs-comment,
  102 + .java .hljs-annotation,
  103 + .smartquote,
  104 + .hljs-blockquote,
  105 + .hljs-horizontal_rule,
  106 + .python .hljs-decorator,
  107 + .hljs-template_comment,
  108 + .hljs-pi,
  109 + .hljs-doctype,
  110 + .hljs-deletion,
  111 + .hljs-shebang,
  112 + .apache .hljs-sqbracket,
  113 + .tex .hljs-formula {
  114 + color: #75715E;
  115 + }
  116 +
  117 + .hljs-keyword,
  118 + .hljs-literal,
  119 + .css .hljs-id,
  120 + .hljs-phpdoc,
  121 + .hljs-title,
  122 + .hljs-header,
  123 + .haskell .hljs-type,
  124 + .vbscript .hljs-built_in,
  125 + .sql .hljs-aggregate,
  126 + .rsl .hljs-built_in,
  127 + .smalltalk .hljs-class,
  128 + .diff .hljs-header,
  129 + .hljs-chunk,
  130 + .hljs-winutils,
  131 + .bash .hljs-variable,
  132 + .apache .hljs-tag,
  133 + .tex .hljs-special,
  134 + .hljs-request,
  135 + .hljs-status {
  136 + font-weight: bold;
  137 + }
  138 +
  139 + .coffeescript .javascript,
  140 + .javascript .xml,
  141 + .tex .hljs-formula,
  142 + .xml .javascript,
  143 + .xml .vbscript,
  144 + .xml .css,
  145 + .xml .hljs-cdata {
  146 + opacity: 0.5;
  147 + }
  148 +}
... ...
app/assets/stylesheets/highlight/solarized_dark.scss
1   -.solarized-dark .highlight {
2   -
  1 +.solarized-dark {
3 2 background-color: #002B36;
4   -
  3 +
  4 + .highlight{
  5 + border-left: 1px solid #113b46;
  6 + }
  7 +
  8 + .line.hll {
  9 + background: #000;
  10 + }
  11 +
  12 + .no-highlight {
  13 + color: #DDD;
  14 + }
  15 +
5 16 pre {
6 17 background-color: #002B36;
7 18 color: #eee;
8 19 }
9 20  
10   - .hll { background-color: #073642 }
11   - .c { color: #586E75 } /* Comment */
12   - .err { color: #93A1A1 } /* Error */
13   - .g { color: #93A1A1 } /* Generic */
14   - .k { color: #859900 } /* Keyword */
15   - .l { color: #93A1A1 } /* Literal */
16   - .n { color: #93A1A1 } /* Name */
17   - .o { color: #859900 } /* Operator */
18   - .x { color: #CB4B16 } /* Other */
19   - .p { color: #93A1A1 } /* Punctuation */
20   - .cm { color: #586E75 } /* Comment.Multiline */
21   - .cp { color: #859900 } /* Comment.Preproc */
22   - .c1 { color: #586E75 } /* Comment.Single */
23   - .cs { color: #859900 } /* Comment.Special */
24   - .gd { color: #2AA198 } /* Generic.Deleted */
25   - .ge { color: #93A1A1; font-style: italic } /* Generic.Emph */
26   - .gr { color: #DC322F } /* Generic.Error */
27   - .gh { color: #CB4B16 } /* Generic.Heading */
28   - .gi { color: #859900 } /* Generic.Inserted */
29   - .go { color: #93A1A1 } /* Generic.Output */
30   - .gp { color: #93A1A1 } /* Generic.Prompt */
31   - .gs { color: #93A1A1; font-weight: bold } /* Generic.Strong */
32   - .gu { color: #CB4B16 } /* Generic.Subheading */
33   - .gt { color: #93A1A1 } /* Generic.Traceback */
34   - .kc { color: #CB4B16 } /* Keyword.Constant */
35   - .kd { color: #268BD2 } /* Keyword.Declaration */
36   - .kn { color: #859900 } /* Keyword.Namespace */
37   - .kp { color: #859900 } /* Keyword.Pseudo */
38   - .kr { color: #268BD2 } /* Keyword.Reserved */
39   - .kt { color: #DC322F } /* Keyword.Type */
40   - .ld { color: #93A1A1 } /* Literal.Date */
41   - .m { color: #2AA198 } /* Literal.Number */
42   - .s { color: #2AA198 } /* Literal.String */
43   - .na { color: #93A1A1 } /* Name.Attribute */
44   - .nb { color: #B58900 } /* Name.Builtin */
45   - .nc { color: #268BD2 } /* Name.Class */
46   - .no { color: #CB4B16 } /* Name.Constant */
47   - .nd { color: #268BD2 } /* Name.Decorator */
48   - .ni { color: #CB4B16 } /* Name.Entity */
49   - .ne { color: #CB4B16 } /* Name.Exception */
50   - .nf { color: #268BD2 } /* Name.Function */
51   - .nl { color: #93A1A1 } /* Name.Label */
52   - .nn { color: #93A1A1 } /* Name.Namespace */
53   - .nx { color: #93A1A1 } /* Name.Other */
54   - .py { color: #93A1A1 } /* Name.Property */
55   - .nt { color: #268BD2 } /* Name.Tag */
56   - .nv { color: #268BD2 } /* Name.Variable */
57   - .ow { color: #859900 } /* Operator.Word */
58   - .w { color: #93A1A1 } /* Text.Whitespace */
59   - .mf { color: #2AA198 } /* Literal.Number.Float */
60   - .mh { color: #2AA198 } /* Literal.Number.Hex */
61   - .mi { color: #2AA198 } /* Literal.Number.Integer */
62   - .mo { color: #2AA198 } /* Literal.Number.Oct */
63   - .sb { color: #586E75 } /* Literal.String.Backtick */
64   - .sc { color: #2AA198 } /* Literal.String.Char */
65   - .sd { color: #93A1A1 } /* Literal.String.Doc */
66   - .s2 { color: #2AA198 } /* Literal.String.Double */
67   - .se { color: #CB4B16 } /* Literal.String.Escape */
68   - .sh { color: #93A1A1 } /* Literal.String.Heredoc */
69   - .si { color: #2AA198 } /* Literal.String.Interpol */
70   - .sx { color: #2AA198 } /* Literal.String.Other */
71   - .sr { color: #DC322F } /* Literal.String.Regex */
72   - .s1 { color: #2AA198 } /* Literal.String.Single */
73   - .ss { color: #2AA198 } /* Literal.String.Symbol */
74   - .bp { color: #268BD2 } /* Name.Builtin.Pseudo */
75   - .vc { color: #268BD2 } /* Name.Variable.Class */
76   - .vg { color: #268BD2 } /* Name.Variable.Global */
77   - .vi { color: #268BD2 } /* Name.Variable.Instance */
78   - .il { color: #2AA198 } /* Literal.Number.Integer.Long */
79   -}
  21 + .line-numbers a {
  22 + color: #666;
  23 + }
  24 +
  25 + .hljs {
  26 + display: block;
  27 + background: #002b36;
  28 + color: #839496;
  29 + }
  30 +
  31 + .hljs-comment,
  32 + .hljs-template_comment,
  33 + .diff .hljs-header,
  34 + .hljs-doctype,
  35 + .hljs-pi,
  36 + .lisp .hljs-string,
  37 + .hljs-javadoc {
  38 + color: #586e75;
  39 + }
  40 +
  41 + /* Solarized Green */
  42 + .hljs-keyword,
  43 + .hljs-winutils,
  44 + .method,
  45 + .hljs-addition,
  46 + .css .hljs-tag,
  47 + .hljs-request,
  48 + .hljs-status,
  49 + .nginx .hljs-title {
  50 + color: #859900;
  51 + }
80 52  
  53 + /* Solarized Cyan */
  54 + .hljs-number,
  55 + .hljs-command,
  56 + .hljs-string,
  57 + .hljs-tag .hljs-value,
  58 + .hljs-rules .hljs-value,
  59 + .hljs-phpdoc,
  60 + .tex .hljs-formula,
  61 + .hljs-regexp,
  62 + .hljs-hexcolor,
  63 + .hljs-link_url {
  64 + color: #2aa198;
  65 + }
  66 +
  67 + /* Solarized Blue */
  68 + .hljs-title,
  69 + .hljs-localvars,
  70 + .hljs-chunk,
  71 + .hljs-decorator,
  72 + .hljs-built_in,
  73 + .hljs-identifier,
  74 + .vhdl .hljs-literal,
  75 + .hljs-id,
  76 + .css .hljs-function {
  77 + color: #268bd2;
  78 + }
  79 +
  80 + /* Solarized Yellow */
  81 + .hljs-attribute,
  82 + .hljs-variable,
  83 + .lisp .hljs-body,
  84 + .smalltalk .hljs-number,
  85 + .hljs-constant,
  86 + .hljs-class .hljs-title,
  87 + .hljs-parent,
  88 + .haskell .hljs-type,
  89 + .hljs-link_reference {
  90 + color: #b58900;
  91 + }
  92 +
  93 + /* Solarized Orange */
  94 + .hljs-preprocessor,
  95 + .hljs-preprocessor .hljs-keyword,
  96 + .hljs-pragma,
  97 + .hljs-shebang,
  98 + .hljs-symbol,
  99 + .hljs-symbol .hljs-string,
  100 + .diff .hljs-change,
  101 + .hljs-special,
  102 + .hljs-attr_selector,
  103 + .hljs-subst,
  104 + .hljs-cdata,
  105 + .clojure .hljs-title,
  106 + .css .hljs-pseudo,
  107 + .hljs-header {
  108 + color: #cb4b16;
  109 + }
  110 +
  111 + /* Solarized Red */
  112 + .hljs-deletion,
  113 + .hljs-important {
  114 + color: #dc322f;
  115 + }
  116 +
  117 + /* Solarized Violet */
  118 + .hljs-link_label {
  119 + color: #6c71c4;
  120 + }
  121 +
  122 + .tex .hljs-formula {
  123 + background: #073642;
  124 + }
  125 +}
... ...
app/assets/stylesheets/highlight/white.scss
1   -.white .highlight {
2   -
  1 +.white {
3 2 background-color: #fff;
4   -
  3 +
  4 + .line.hll {
  5 + background: #FFA;
  6 + }
  7 +
  8 + .highlight{
  9 + border-left: 1px solid #eee;
  10 + }
  11 +
5 12 pre {
6 13 background-color: #fff;
7 14 color: #333;
8 15 }
9 16  
10   - .hll { display: block; background-color: $hover }
11   - .c { color: #888888; font-style: italic } /* Comment */
12   - .err { color: #a61717; background-color: #e3d2d2 } /* Error */
13   - .k { color: #000000; font-weight: bold } /* Keyword */
14   - .cm { color: #888888 } /* Comment.Multiline */
15   - .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
16   - .c1 { color: #888888 } /* Comment.Single */
17   - .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
18   - .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
19   - .ge { font-style: italic } /* Generic.Emph */
20   - .gr { color: #aa0000 } /* Generic.Error */
21   - .gh { color: #303030 } /* Generic.Heading */
22   - .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
23   - .go { color: #888888 } /* Generic.Output */
24   - .gp { color: #555555 } /* Generic.Prompt */
25   - .gs { font-weight: bold } /* Generic.Strong */
26   - .gu { color: #606060 } /* Generic.Subheading */
27   - .gt { color: #aa0000 } /* Generic.Traceback */
28   - .kc{font-weight: bold;} /* Keyword.Constant */
29   - .kd{font-weight: bold;} /* Keyword.Declaration */
30   - .kn{font-weight: bold;} /* Keyword.Namespace */
31   - .kp{font-weight: bold;} /* Keyword.Pseudo */
32   - .kr{font-weight: bold;} /* Keyword.Reserved */
33   - .kt{color: #458;font-weight: bold;} /* Keyword.Type */
34   - .m { color: #0000DD; font-weight: bold } /* Literal.Number */
35   - .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
36   - .na{color: #008080;} /* Name.Attribute */
37   - .nb{color: #0086B3;} /* Name.Builtin */
38   - .nc{color: #458;font-weight: bold;} /* Name.Class */
39   - .no{color: #008080;} /* Name.Constant */
40   - .ni{color: #800080;}
41   - .ne{color: #900;font-weight: bold;} /* Name.Exception */
42   - .nf{color: #900;font-weight: bold;} /* Name.Function */
43   - .nn{color: #005;font-weight: bold;} /* Name.Namespace */
44   - .nt{color: #000080;} /* Name.Tag */
45   - .nv{color: #008080;} /* Name.Variable */
46   - .py { color: #336699; font-weight: bold } /* Name.Property */
47   - .ow { color: #008800 } /* Operator.Word */
48   - .w { color: #bbbbbb } /* Text.Whitespace */
49   - .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
50   - .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
51   - .mi {color: #099;} /* Literal.Number.Integer */
52   - .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
53   - .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
54   - .sc{color: #d14;} /* Literal.String.Char */
55   - .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
56   - .s2{color: #d14;} /* Literal.String.Double */
57   - .se{color: #d14;} /* Literal.String.Escape */
58   - .sh{color: #d14;} /* Literal.String.Heredoc */
59   - .si{color: #d14;} /* Literal.String.Interpol */
60   - .sx{color: #d14;} /* Literal.String.Other */
61   - .sr{color: #d14;} /* Literal.String.Regex */
62   - .s1{color: #d14;} /* Literal.String.Single */
63   - .ss{color: #d14;} /* Literal.String.Symbol */
64   - .bp { color: #003388 } /* Name.Builtin.Pseudo */
65   - .vc { color: #336699 } /* Name.Variable.Class */
66   - .vg { color: #dd7700 } /* Name.Variable.Global */
67   - .vi { color: #3333bb }
  17 + .hljs {
  18 + background: #FFF;
  19 + }
  20 +
  21 + .line-numbers a {
  22 + color: #999;
  23 + }
  24 +
  25 + .hljs {
  26 + display: block;
  27 + background: #fff; color: black;
  28 + }
  29 +
  30 + .hljs-comment,
  31 + .hljs-template_comment,
  32 + .hljs-javadoc,
  33 + .hljs-comment * {
  34 + color: #006a00;
  35 + }
  36 +
  37 + .hljs-keyword,
  38 + .hljs-literal,
  39 + .nginx .hljs-title {
  40 + color: #aa0d91;
  41 + }
  42 + .method,
  43 + .hljs-list .hljs-title,
  44 + .hljs-tag .hljs-title,
  45 + .setting .hljs-value,
  46 + .hljs-winutils,
  47 + .tex .hljs-command,
  48 + .http .hljs-title,
  49 + .hljs-request,
  50 + .hljs-status {
  51 + color: #008;
  52 + }
  53 +
  54 + .hljs-envvar,
  55 + .tex .hljs-special {
  56 + color: #660;
  57 + }
  58 +
  59 + .hljs-string {
  60 + color: #c41a16;
  61 + }
  62 + .hljs-tag .hljs-value,
  63 + .hljs-cdata,
  64 + .hljs-filter .hljs-argument,
  65 + .hljs-attr_selector,
  66 + .apache .hljs-cbracket,
  67 + .hljs-date,
  68 + .hljs-regexp {
  69 + color: #080;
  70 + }
  71 +
  72 + .hljs-sub .hljs-identifier,
  73 + .hljs-pi,
  74 + .hljs-tag,
  75 + .hljs-tag .hljs-keyword,
  76 + .hljs-decorator,
  77 + .ini .hljs-title,
  78 + .hljs-shebang,
  79 + .hljs-prompt,
  80 + .hljs-hexcolor,
  81 + .hljs-rules .hljs-value,
  82 + .hljs-symbol,
  83 + .hljs-symbol .hljs-string,
  84 + .hljs-number,
  85 + .css .hljs-function,
  86 + .clojure .hljs-title,
  87 + .clojure .hljs-built_in,
  88 + .hljs-function .hljs-title,
  89 + .coffeescript .hljs-attribute {
  90 + color: #1c00cf;
  91 + }
  92 +
  93 + .hljs-class .hljs-title,
  94 + .haskell .hljs-type,
  95 + .smalltalk .hljs-class,
  96 + .hljs-javadoctag,
  97 + .hljs-yardoctag,
  98 + .hljs-phpdoc,
  99 + .hljs-typename,
  100 + .hljs-tag .hljs-attribute,
  101 + .hljs-doctype,
  102 + .hljs-class .hljs-id,
  103 + .hljs-built_in,
  104 + .setting,
  105 + .hljs-params,
  106 + .clojure .hljs-attribute {
  107 + color: #5c2699;
  108 + }
  109 +
  110 + .hljs-variable {
  111 + color: #3f6e74;
  112 + }
  113 + .css .hljs-tag,
  114 + .hljs-rules .hljs-property,
  115 + .hljs-pseudo,
  116 + .hljs-subst {
  117 + color: #000;
  118 + }
  119 +
  120 + .css .hljs-class,
  121 + .css .hljs-id {
  122 + color: #9B703F;
  123 + }
  124 +
  125 + .hljs-value .hljs-important {
  126 + color: #ff7700;
  127 + font-weight: bold;
  128 + }
  129 +
  130 + .hljs-rules .hljs-keyword {
  131 + color: #C5AF75;
  132 + }
  133 +
  134 + .hljs-annotation,
  135 + .apache .hljs-sqbracket,
  136 + .nginx .hljs-built_in {
  137 + color: #9B859D;
  138 + }
  139 +
  140 + .hljs-preprocessor,
  141 + .hljs-preprocessor *,
  142 + .hljs-pragma {
  143 + color: #643820;
  144 + }
  145 +
  146 + .tex .hljs-formula {
  147 + background-color: #EEE;
  148 + font-style: italic;
  149 + }
  150 +
  151 + .diff .hljs-header,
  152 + .hljs-chunk {
  153 + color: #808080;
  154 + font-weight: bold;
  155 + }
  156 +
  157 + .diff .hljs-change {
  158 + background-color: #BCCFF9;
  159 + }
  160 +
  161 + .hljs-addition {
  162 + background-color: #BAEEBA;
  163 + }
  164 +
  165 + .hljs-deletion {
  166 + background-color: #FFC8BD;
  167 + }
  168 +
  169 + .hljs-comment .hljs-yardoctag {
  170 + font-weight: bold;
  171 + }
  172 +
  173 + .method .hljs-id {
  174 + color: #000;
  175 + }
68 176 }
69 177  
70 178 .shadow {
71 179 @include box-shadow(0 5px 15px #000);
72 180 }
  181 +
  182 +.wiki, .note-body {
  183 + .highlight {
  184 + border: 1px solid #DDD;
  185 + }
  186 +}
... ...
app/assets/stylesheets/main/layout.scss
1 1 html {
2 2 overflow-y: scroll;
  3 +
  4 + &.touch .tooltip { display: none !important; }
3 5 }
4 6  
5 7 body {
6   - -webkit-font-smoothing: antialiased;
7   - -moz-osx-font-smoothing: grayscale;
8   - margin-bottom: 20px;
  8 + padding-bottom: 20px;
9 9 }
10 10  
11 11 .container {
... ...
app/assets/stylesheets/main/mixins.scss
... ... @@ -106,12 +106,12 @@
106 106  
107 107 h3 {
108 108 margin-top: 35px;
109   - font-size: 2em;
  109 + font-size: 1.5em;
110 110 }
111 111  
112 112 h4 {
113 113 margin-top: 30px;
114   - font-size: 1.5em;
  114 + font-size: 1.2em;
115 115 }
116 116  
117 117 blockquote p {
... ... @@ -128,7 +128,7 @@
128 128 }
129 129 }
130 130  
131   - code {
  131 + p > code {
132 132 font-size: inherit;
133 133 font-weight: inherit;
134 134 color: #555;
... ...
app/assets/stylesheets/main/variables.scss
... ... @@ -5,6 +5,7 @@ $primary_color: #2FA0BB;
5 5 $link_color: #3A89A3;
6 6 $style_color: #474D57;
7 7 $bg_style_color: #2299BB;
  8 +$list-group-active-bg: $bg_style_color;
8 9 $hover: #D9EDF7;
9 10  
10 11 /**
... ...
app/assets/stylesheets/sections/admin.scss
... ... @@ -2,7 +2,7 @@
2 2 * Admin area
3 3 *
4 4 */
5   -.admin_dash {
  5 +.admin-dashboard {
6 6 .data {
7 7 a {
8 8 h1 {
... ... @@ -14,6 +14,10 @@
14 14 }
15 15 }
16 16 }
  17 +
  18 + .str-truncated {
  19 + max-width: 60%;
  20 + }
17 21 }
18 22  
19 23 .admin-filter form {
... ...
app/assets/stylesheets/sections/commits.scss
... ... @@ -10,331 +10,6 @@
10 10 }
11 11 }
12 12  
13   -.file {
14   - border: 1px solid #CCC;
15   - margin-bottom: 1em;
16   -
17   - .header {
18   - @extend .clearfix;
19   - background: #DDD;
20   - border-bottom: 1px solid #CCC;
21   - padding: 5px 5px 5px 10px;
22   - color: #555;
23   -
24   - > span {
25   - font-family: $monospace_font;
26   - font-size: 14px;
27   - line-height: 2;
28   - }
29   -
30   - .view-file {
31   - font-weight: bold;
32   - float: right;
33   - background-color: #EEE;
34   - }
35   -
36   - .commit-short-id {
37   - font-family: $monospace_font;
38   - font-size: smaller;
39   - }
40   -
41   - .file-mode {
42   - font-family: $monospace_font;
43   - }
44   - }
45   - .content {
46   - overflow: auto;
47   - overflow-y: hidden;
48   - background: #FFF;
49   - color: #333;
50   - font-size: 12px;
51   - .old {
52   - span.idiff {
53   - background-color: #FAA;
54   - }
55   - }
56   - .new {
57   - span.idiff {
58   - background-color: #AFA;
59   - }
60   - }
61   -
62   - table {
63   - width: 100%;
64   - font-family: $monospace_font;
65   - border: none;
66   - margin: 0px;
67   - padding: 0px;
68   - td {
69   - line-height: 18px;
70   - font-size: 12px;
71   - }
72   - }
73   - .old_line, .new_line, .diff_line {
74   - margin: 0px;
75   - padding: 0px;
76   - border: none;
77   - background: #EEE;
78   - color: #666;
79   - padding: 0px 5px;
80   - border-right: 1px solid #ccc;
81   - text-align: right;
82   - min-width: 35px;
83   - max-width: 50px;
84   - width: 35px;
85   - @include user-select(none);
86   - a {
87   - float: left;
88   - width: 35px;
89   - font-weight: normal;
90   - color: #666;
91   - &:hover {
92   - text-decoration: underline;
93   - }
94   - }
95   - &.new {
96   - background: #CFD;
97   - }
98   - &.old {
99   - background: #FDD;
100   - }
101   - }
102   - .diff_line {
103   - padding: 0;
104   - }
105   - .line_holder {
106   - &.old .old_line,
107   - &.old .new_line {
108   - background: #FCC;
109   - border-color: #E7BABA;
110   - }
111   - &.new .old_line,
112   - &.new .new_line {
113   - background: #CFC;
114   - border-color: #B9ECB9;
115   - }
116   - }
117   - .line_content {
118   - display: block;
119   - white-space: pre;
120   - height: 18px;
121   - margin: 0px;
122   - padding: 0px 0.5em;
123   - border: none;
124   - &.new {
125   - background: #CFD;
126   - }
127   - &.old {
128   - background: #FDD;
129   - }
130   - &.matched {
131   - color: #ccc;
132   - background: #fafafa;
133   - }
134   - &.parallel {
135   - display: table-cell;
136   - overflow: hidden;
137   - width: 50%;
138   - }
139   - }
140   - }
141   - .image {
142   - background: #ddd;
143   - text-align: center;
144   - padding: 30px;
145   - .wrap{
146   - display: inline-block;
147   - }
148   -
149   - .frame {
150   - display: inline-block;
151   - background-color: #fff;
152   - line-height: 0;
153   - img{
154   - border: 1px solid #FFF;
155   - background: url('trans_bg.gif');
156   - }
157   - &.deleted {
158   - border: 1px solid $deleted;
159   - }
160   -
161   - &.added {
162   - border: 1px solid $added;
163   - }
164   - }
165   - .image-info{
166   - font-size: 12px;
167   - margin: 5px 0 0 0;
168   - color: grey;
169   - }
170   -
171   - .view.swipe{
172   - position: relative;
173   -
174   - .swipe-frame{
175   - display: block;
176   - margin: auto;
177   - position: relative;
178   - }
179   - .swipe-wrap{
180   - overflow: hidden;
181   - border-left: 1px solid #999;
182   - position: absolute;
183   - display: block;
184   - top: 13px;
185   - right: 7px;
186   - }
187   - .frame{
188   - top: 0;
189   - right: 0;
190   - position: absolute;
191   - &.deleted{
192   - margin: 0;
193   - display: block;
194   - top: 13px;
195   - right: 7px;
196   - }
197   - }
198   - .swipe-bar{
199   - display: block;
200   - height: 100%;
201   - width: 15px;
202   - z-index: 100;
203   - position: absolute;
204   - cursor: pointer;
205   - &:hover{
206   - .top-handle{
207   - background-position: -15px 3px;
208   - }
209   - .bottom-handle{
210   - background-position: -15px -11px;
211   - }
212   - };
213   - .top-handle{
214   - display: block;
215   - height: 14px;
216   - width: 15px;
217   - position: absolute;
218   - top: 0px;
219   - background: url('swipemode_sprites.gif') 0 3px no-repeat;
220   - }
221   - .bottom-handle{
222   - display: block;
223   - height: 14px;
224   - width: 15px;
225   - position: absolute;
226   - bottom: 0px;
227   - background: url('swipemode_sprites.gif') 0 -11px no-repeat;
228   - }
229   - }
230   - } //.view.swipe
231   - .view.onion-skin{
232   - .onion-skin-frame{
233   - display: block;
234   - margin: auto;
235   - position: relative;
236   - }
237   - .frame.added, .frame.deleted {
238   - position: absolute;
239   - display: block;
240   - top: 0px;
241   - left: 0px;
242   - }
243   - .controls{
244   - display: block;
245   - height: 14px;
246   - width: 300px;
247   - z-index: 100;
248   - position: absolute;
249   - bottom: 0px;
250   - left: 50%;
251   - margin-left: -150px;
252   -
253   - .drag-track{
254   - display: block;
255   - position: absolute;
256   - left: 12px;
257   - height: 10px;
258   - width: 276px;
259   - background: url('onion_skin_sprites.gif') -4px -20px repeat-x;
260   - }
261   -
262   - .dragger {
263   - display: block;
264   - position: absolute;
265   - left: 0px;
266   - top: 0px;
267   - height: 14px;
268   - width: 14px;
269   - background: url('onion_skin_sprites.gif') 0px -34px repeat-x;
270   - cursor: pointer;
271   - }
272   -
273   - .transparent {
274   - display: block;
275   - position: absolute;
276   - top: 2px;
277   - right: 0px;
278   - height: 10px;
279   - width: 10px;
280   - background: url('onion_skin_sprites.gif') -2px 0px no-repeat;
281   - }
282   -
283   - .opaque {
284   - display: block;
285   - position: absolute;
286   - top: 2px;
287   - left: 0px;
288   - height: 10px;
289   - width: 10px;
290   - background: url('onion_skin_sprites.gif') -2px -10px no-repeat;
291   - }
292   - }
293   - } //.view.onion-skin
294   - }
295   - .view-modes{
296   -
297   - padding: 10px;
298   - text-align: center;
299   -
300   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
301   - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
302   - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
303   - background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
304   - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
305   -
306   - ul, li{
307   - list-style: none;
308   - margin: 0;
309   - padding: 0;
310   - display: inline-block;
311   - }
312   -
313   - li{
314   - color: grey;
315   - border-left: 1px solid #c1c1c1;
316   - padding: 0 12px 0 16px;
317   - cursor: pointer;
318   - &:first-child{
319   - border-left: none;
320   - }
321   - &:hover{
322   - text-decoration: underline;
323   - }
324   - &.active{
325   - &:hover{
326   - text-decoration: none;
327   - }
328   - cursor: default;
329   - color: #333;
330   - }
331   - &.disabled{
332   - display: none;
333   - }
334   - }
335   - }
336   -}
337   -
338 13 /** COMMIT BLOCK **/
339 14 .commit-title{
340 15 display: block;
... ... @@ -493,6 +168,25 @@ li.commit {
493 168 text-decoration: underline;
494 169 }
495 170 }
  171 +
  172 + .text-expander {
  173 + background: #eee;
  174 + color: #555;
  175 + padding: 0 5px;
  176 + cursor: pointer;
  177 + margin-left: 4px;
  178 + &:hover {
  179 + background-color: #ddd;
  180 + }
  181 + }
  182 + }
  183 +
  184 + .commit-row-description {
  185 + font-size: 14px;
  186 + border-left: 1px solid #e5e5e5;
  187 + padding: 0 15px 0 7px;
  188 + margin: 5px 0 10px 5px;
  189 + display: none;
496 190 }
497 191  
498 192 .commit-row-info {
... ...
app/assets/stylesheets/sections/dashboard.scss
... ... @@ -41,7 +41,7 @@
41 41 .dash-sidebar-tabs {
42 42 margin-bottom: 2px;
43 43 border: none;
44   - margin: 0;
  44 + margin: 0 !important;
45 45  
46 46 li {
47 47 &.active {
... ...
app/assets/stylesheets/sections/diff.scss 0 → 100644
... ... @@ -0,0 +1,329 @@
  1 +.diff-file {
  2 + border: 1px solid #CCC;
  3 + margin-bottom: 1em;
  4 +
  5 + .diff-header {
  6 + @extend .clearfix;
  7 + background: #DDD;
  8 + border-bottom: 1px solid #CCC;
  9 + padding: 5px 5px 5px 10px;
  10 + color: #555;
  11 +
  12 + > span {
  13 + font-family: $monospace_font;
  14 + font-size: 14px;
  15 + line-height: 2;
  16 + }
  17 +
  18 + .diff-btn-group {
  19 + float: right;
  20 +
  21 + .btn {
  22 + background-color: #EEE;
  23 + color: #666;
  24 + font-weight: bolder;
  25 + }
  26 + }
  27 +
  28 + .commit-short-id {
  29 + font-family: $monospace_font;
  30 + font-size: smaller;
  31 + }
  32 +
  33 + .file-mode {
  34 + font-family: $monospace_font;
  35 + }
  36 + }
  37 + .diff-content {
  38 + overflow: auto;
  39 + overflow-y: hidden;
  40 + background: #FFF;
  41 + color: #333;
  42 + font-size: 12px;
  43 + .old {
  44 + span.idiff {
  45 + background-color: #FAA;
  46 + }
  47 + }
  48 + .new {
  49 + span.idiff {
  50 + background-color: #AFA;
  51 + }
  52 + }
  53 +
  54 + table {
  55 + width: 100%;
  56 + font-family: $monospace_font;
  57 + border: none;
  58 + margin: 0px;
  59 + padding: 0px;
  60 + td {
  61 + line-height: 18px;
  62 + font-size: 12px;
  63 + }
  64 + }
  65 + .old_line, .new_line, .diff_line {
  66 + margin: 0px;
  67 + padding: 0px;
  68 + border: none;
  69 + background: #EEE;
  70 + color: #666;
  71 + padding: 0px 5px;
  72 + border-right: 1px solid #ccc;
  73 + text-align: right;
  74 + min-width: 35px;
  75 + max-width: 50px;
  76 + width: 35px;
  77 + @include user-select(none);
  78 + a {
  79 + float: left;
  80 + width: 35px;
  81 + font-weight: normal;
  82 + color: #666;
  83 + &:hover {
  84 + text-decoration: underline;
  85 + }
  86 + }
  87 + &.new {
  88 + background: #CFD;
  89 + }
  90 + &.old {
  91 + background: #FDD;
  92 + }
  93 + }
  94 + .diff_line {
  95 + padding: 0;
  96 + }
  97 + .line_holder {
  98 + &.old .old_line,
  99 + &.old .new_line {
  100 + background: #FCC;
  101 + border-color: #E7BABA;
  102 + }
  103 + &.new .old_line,
  104 + &.new .new_line {
  105 + background: #CFC;
  106 + border-color: #B9ECB9;
  107 + }
  108 + }
  109 + .line_content {
  110 + display: block;
  111 + white-space: pre;
  112 + height: 18px;
  113 + margin: 0px;
  114 + padding: 0px 0.5em;
  115 + border: none;
  116 + &.new {
  117 + background: #CFD;
  118 + }
  119 + &.old {
  120 + background: #FDD;
  121 + }
  122 + &.matched {
  123 + color: #ccc;
  124 + background: #fafafa;
  125 + }
  126 + &.parallel {
  127 + display: table-cell;
  128 + overflow: hidden;
  129 + width: 50%;
  130 + }
  131 + }
  132 + }
  133 + .image {
  134 + background: #ddd;
  135 + text-align: center;
  136 + padding: 30px;
  137 + .wrap{
  138 + display: inline-block;
  139 + }
  140 +
  141 + .frame {
  142 + display: inline-block;
  143 + background-color: #fff;
  144 + line-height: 0;
  145 + img{
  146 + border: 1px solid #FFF;
  147 + background: url('trans_bg.gif');
  148 + max-width: 100%;
  149 + }
  150 + &.deleted {
  151 + border: 1px solid $deleted;
  152 + }
  153 +
  154 + &.added {
  155 + border: 1px solid $added;
  156 + }
  157 + }
  158 + .image-info{
  159 + font-size: 12px;
  160 + margin: 5px 0 0 0;
  161 + color: grey;
  162 + }
  163 +
  164 + .view.swipe{
  165 + position: relative;
  166 +
  167 + .swipe-frame{
  168 + display: block;
  169 + margin: auto;
  170 + position: relative;
  171 + }
  172 + .swipe-wrap{
  173 + overflow: hidden;
  174 + border-left: 1px solid #999;
  175 + position: absolute;
  176 + display: block;
  177 + top: 13px;
  178 + right: 7px;
  179 + }
  180 + .frame{
  181 + top: 0;
  182 + right: 0;
  183 + position: absolute;
  184 + &.deleted{
  185 + margin: 0;
  186 + display: block;
  187 + top: 13px;
  188 + right: 7px;
  189 + }
  190 + }
  191 + .swipe-bar{
  192 + display: block;
  193 + height: 100%;
  194 + width: 15px;
  195 + z-index: 100;
  196 + position: absolute;
  197 + cursor: pointer;
  198 + &:hover{
  199 + .top-handle{
  200 + background-position: -15px 3px;
  201 + }
  202 + .bottom-handle{
  203 + background-position: -15px -11px;
  204 + }
  205 + };
  206 + .top-handle{
  207 + display: block;
  208 + height: 14px;
  209 + width: 15px;
  210 + position: absolute;
  211 + top: 0px;
  212 + background: url('swipemode_sprites.gif') 0 3px no-repeat;
  213 + }
  214 + .bottom-handle{
  215 + display: block;
  216 + height: 14px;
  217 + width: 15px;
  218 + position: absolute;
  219 + bottom: 0px;
  220 + background: url('swipemode_sprites.gif') 0 -11px no-repeat;
  221 + }
  222 + }
  223 + } //.view.swipe
  224 + .view.onion-skin{
  225 + .onion-skin-frame{
  226 + display: block;
  227 + margin: auto;
  228 + position: relative;
  229 + }
  230 + .frame.added, .frame.deleted {
  231 + position: absolute;
  232 + display: block;
  233 + top: 0px;
  234 + left: 0px;
  235 + }
  236 + .controls{
  237 + display: block;
  238 + height: 14px;
  239 + width: 300px;
  240 + z-index: 100;
  241 + position: absolute;
  242 + bottom: 0px;
  243 + left: 50%;
  244 + margin-left: -150px;
  245 +
  246 + .drag-track{
  247 + display: block;
  248 + position: absolute;
  249 + left: 12px;
  250 + height: 10px;
  251 + width: 276px;
  252 + background: url('onion_skin_sprites.gif') -4px -20px repeat-x;
  253 + }
  254 +
  255 + .dragger {
  256 + display: block;
  257 + position: absolute;
  258 + left: 0px;
  259 + top: 0px;
  260 + height: 14px;
  261 + width: 14px;
  262 + background: url('onion_skin_sprites.gif') 0px -34px repeat-x;
  263 + cursor: pointer;
  264 + }
  265 +
  266 + .transparent {
  267 + display: block;
  268 + position: absolute;
  269 + top: 2px;
  270 + right: 0px;
  271 + height: 10px;
  272 + width: 10px;
  273 + background: url('onion_skin_sprites.gif') -2px 0px no-repeat;
  274 + }
  275 +
  276 + .opaque {
  277 + display: block;
  278 + position: absolute;
  279 + top: 2px;
  280 + left: 0px;
  281 + height: 10px;
  282 + width: 10px;
  283 + background: url('onion_skin_sprites.gif') -2px -10px no-repeat;
  284 + }
  285 + }
  286 + } //.view.onion-skin
  287 + }
  288 + .view-modes{
  289 +
  290 + padding: 10px;
  291 + text-align: center;
  292 +
  293 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
  294 + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
  295 + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  296 + background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
  297 + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
  298 +
  299 + ul, li{
  300 + list-style: none;
  301 + margin: 0;
  302 + padding: 0;
  303 + display: inline-block;
  304 + }
  305 +
  306 + li{
  307 + color: grey;
  308 + border-left: 1px solid #c1c1c1;
  309 + padding: 0 12px 0 16px;
  310 + cursor: pointer;
  311 + &:first-child{
  312 + border-left: none;
  313 + }
  314 + &:hover{
  315 + text-decoration: underline;
  316 + }
  317 + &.active{
  318 + &:hover{
  319 + text-decoration: none;
  320 + }
  321 + cursor: default;
  322 + color: #333;
  323 + }
  324 + &.disabled{
  325 + display: none;
  326 + }
  327 + }
  328 + }
  329 +}
... ...
app/assets/stylesheets/sections/events.scss
... ... @@ -37,8 +37,8 @@
37 37  
38 38 &.event-inline {
39 39 .avatar {
40   - width: 16px;
41   - height: 16px;
  40 + position: relative;
  41 + top: -2px;
42 42 }
43 43 }
44 44  
... ... @@ -113,6 +113,7 @@
113 113 &.commit {
114 114 background: transparent;
115 115 padding: 3px;
  116 + padding-left: 0;
116 117 border: none;
117 118 color: #666;
118 119 .commit-row-title {
... ... @@ -122,6 +123,7 @@
122 123 &.commits-stat {
123 124 display: block;
124 125 padding: 3px;
  126 + padding-left: 0;
125 127  
126 128 &:hover {
127 129 background: none;
... ...
app/assets/stylesheets/sections/groups.scss 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +.new-group-member-holder {
  2 + margin-top: 50px;
  3 + background: #f9f9f9;
  4 + padding-top: 20px;
  5 +}
  6 +
  7 +.member-search-form {
  8 + float: left;
  9 +}
... ...
app/assets/stylesheets/sections/header.scss
... ... @@ -19,7 +19,7 @@ header {
19 19 line-height: 32px;
20 20 padding: 6px 10px;
21 21  
22   - &:hover {
  22 + &:hover, &:focus, &:active {
23 23 background: none;
24 24 }
25 25 }
... ... @@ -29,6 +29,64 @@ header {
29 29 float: right;
30 30 margin-right: 0;
31 31 }
  32 +
  33 + .navbar-toggle {
  34 + color: $style_color;
  35 + margin: 0 -15px 0 0;
  36 + padding: 10px;
  37 + border-radius: 0;
  38 +
  39 + button i { font-size: 22px; }
  40 +
  41 + &.collapsed { background-color: transparent !important;}
  42 +
  43 + &:hover {
  44 + background-color: #EEE;
  45 + }
  46 + }
  47 + }
  48 +
  49 + .turbolink-spinner {
  50 + font-size: 20px;
  51 + margin-right: 10px;
  52 + }
  53 +
  54 + @media (max-width: $screen-xs-max) {
  55 + border-width: 0;
  56 + font-size: 18px;
  57 +
  58 + .app_logo { margin-left: -15px; }
  59 + .title {
  60 + display: inline-block;
  61 + overflow: hidden;
  62 + text-overflow: ellipsis;
  63 + vertical-align: top;
  64 + white-space: nowrap;
  65 + max-width: 70%;
  66 + }
  67 +
  68 + .navbar-collapse {
  69 + padding-right: 0;
  70 + padding-left: 0;
  71 + }
  72 +
  73 + .navbar-nav {
  74 + margin: 5px 0;
  75 +
  76 + .visible-xs, .visable-sm {
  77 + display: table-cell !important;
  78 + }
  79 + }
  80 +
  81 + li {
  82 + display: table-cell;
  83 + width: 1%;
  84 +
  85 + a {
  86 + text-align: center;
  87 + font-size: 18px !important;
  88 + }
  89 + }
32 90 }
33 91 }
34 92  
... ... @@ -50,7 +108,7 @@ header {
50 108  
51 109 h1 {
52 110 margin: 0;
53   - background: url('logo-black.png') no-repeat center center;
  111 + background: image-url('logo-black.png') no-repeat center center;
54 112 background-size: 32px;
55 113 float: left;
56 114 height: 46px;
... ... @@ -69,7 +127,7 @@ header {
69 127 * Project / Area name
70 128 *
71 129 */
72   - .project_name {
  130 + .title {
73 131 position: relative;
74 132 float: left;
75 133 margin: 0;
... ... @@ -128,11 +186,14 @@ header {
128 186 background: #708090;
129 187 border-bottom: 1px solid #AAA;
130 188  
  189 + .navbar-toggle { color: #fff; }
  190 +
131 191 .nav > li > a {
132 192 color: #AAA;
133 193 text-shadow: 0 1px 0 #444;
134 194  
135   - &:hover {
  195 + &:hover, &:focus, &:active {
  196 + background: none;
136 197 color: #FFF;
137 198 }
138 199 }
... ... @@ -160,18 +221,18 @@ header {
160 221 .app_logo {
161 222 a {
162 223 h1 {
163   - background: url('logo-white.png') no-repeat center center;
  224 + background: image-url('logo-white.png') no-repeat center center;
164 225 background-size: 32px;
165 226 color: #fff;
166 227 text-shadow: 0 1px 1px #444;
167 228 }
168 229 }
169 230 }
170   - .project_name {
  231 + .title {
171 232 a {
172   - color: #BBB;
  233 + color: #FFF;
173 234 &:hover {
174   - color: #FFF;
  235 + text-decoration: underline;
175 236 }
176 237 }
177 238 color: #fff;
... ...
app/assets/stylesheets/sections/issues.scss
... ... @@ -14,8 +14,8 @@
14 14  
15 15 .issue-check {
16 16 float: left;
17   - padding: 8px 0;
18 17 padding-right: 8px;
  18 + margin-bottom: 10px;
19 19 min-width: 15px;
20 20 }
21 21  
... ... @@ -38,13 +38,21 @@
38 38 }
39 39 }
40 40  
41   -input.check_all_issues {
  41 +.check-all-holder {
  42 + height: 32px;
42 43 float: left;
43   - padding: 0;
44   - margin: 0;
45   - margin-right: 10px;
46   - position: relative;
47   - top: 13px;
  44 + margin-right: 12px;
  45 + padding: 6px 10px;
  46 + border: 1px solid #ccc;
  47 + @include border-radius(4px);
  48 +
  49 +
  50 + input.check_all_issues {
  51 + padding: 0;
  52 + margin: 0;
  53 + position: relative;
  54 + top: 3px;
  55 + }
48 56 }
49 57  
50 58 .issues_content {
... ... @@ -57,23 +65,6 @@ input.check_all_issues {
57 65 }
58 66 }
59 67  
60   -.btn.close_issue {
61   - color: #B94A48;
62   - font-weight: bold;
63   - @include shade;
64   - &:hover {
65   - color: #B94A48;
66   - }
67   -}
68   -.btn.reopen_issue {
69   - color: #468847;
70   - font-weight: bold;
71   - @include shade;
72   - &:hover {
73   - color: #468847;
74   - }
75   -}
76   -
77 68 @media (min-width: 800px) { .issues_filters select { width: 160px; } }
78 69 @media (min-width: 1200px) { .issues_filters select { width: 220px; } }
79 70  
... ... @@ -93,6 +84,13 @@ input.check_all_issues {
93 84 .update_selected_issues {
94 85 margin-left: 4px;
95 86 }
  87 +
  88 + .select2-container .select2-choice {
  89 + height: 32px;
  90 + line-height: 28px;
  91 + color: #444 !important;
  92 + font-weight: 500;
  93 + }
96 94 }
97 95 }
98 96  
... ... @@ -127,3 +125,21 @@ input.check_all_issues {
127 125 form.edit-issue {
128 126 margin: 0;
129 127 }
  128 +
  129 +.merge-request,
  130 +.issue {
  131 + &.today {
  132 + background: #EFE;
  133 + border-color: #CEC;
  134 + }
  135 +
  136 + &.closed {
  137 + background: #F5f5f5;
  138 + border-color: #E5E5E5;
  139 + }
  140 +
  141 + &.merged {
  142 + background: #F5f5f5;
  143 + border-color: #E5E5E5;
  144 + }
  145 +}
... ...
app/assets/stylesheets/sections/login.scss
... ... @@ -6,11 +6,10 @@
6 6 }
7 7  
8 8 .login-box{
9   - width: 304px;
  9 + max-width: 304px;
10 10 position: relative;
11 11 @include border-radius(5px);
12 12 margin: auto;
13   - padding: 20px;
14 13 background: white;
15 14 }
16 15  
... ... @@ -23,7 +22,7 @@
23 22 background-color: #f1f1f1;
24 23 font-size: 16px;
25 24 padding: 14px 10px;
26   - width: 280px;
  25 + width: 100%;
27 26 height: auto;
28 27  
29 28 &.top {
... ...
app/assets/stylesheets/sections/merge_requests.scss
... ... @@ -31,10 +31,10 @@
31 31  
32 32 .mr_source_commit,
33 33 .mr_target_commit {
  34 + margin-top: 10px;
34 35 .commit {
35 36 margin: 0;
36   - padding: 0;
37   - padding: 5px 0;
  37 + padding: 2px 0;
38 38 list-style: none;
39 39 &:hover {
40 40 background: none;
... ... @@ -90,15 +90,8 @@
90 90 padding-top: 15px;
91 91 }
92 92  
93   -.merge-request-branches {
94   - .commit-row-message {
95   - font-weight: normal !important;
96   - }
97   -
98   - .select2-container .select2-single {
99   - span {
100   - font-weight: bold;
101   - color: #555;
102   - }
103   - }
  93 +// hide mr close link for inline diff comment form
  94 +.diff-file .close-mr-link,
  95 +.diff-file .reopen-mr-link {
  96 + display: none;
104 97 }
... ...
app/assets/stylesheets/sections/nav.scss
... ... @@ -35,9 +35,8 @@
35 35 width: 1%;
36 36 &.active {
37 37 a {
38   - color: $style_color;
39   - font-weight: bolder;
40   -
  38 + color: #333;
  39 + font-weight: bold;
41 40 &:after {
42 41 content: '';
43 42 display: block;
... ... @@ -46,7 +45,7 @@
46 45 left: 50%;
47 46 width: 0;
48 47 height: 0;
49   - border-color: transparent transparent #777 transparent;
  48 + border-color: transparent transparent #333 transparent;
50 49 border-style: solid;
51 50 border-width: 6px;
52 51 margin-left: -6px;
... ... @@ -56,7 +55,20 @@
56 55  
57 56 &:hover {
58 57 a {
59   - color: $style_color;
  58 + color: $link_color;
  59 + &:after {
  60 + content: '';
  61 + display: block;
  62 + position: relative;
  63 + bottom: 8px;
  64 + left: 50%;
  65 + width: 0;
  66 + height: 0;
  67 + border-color: transparent transparent #29b transparent;
  68 + border-style: solid;
  69 + border-width: 6px;
  70 + margin-left: -6px;
  71 + }
60 72 }
61 73 }
62 74  
... ... @@ -73,7 +85,7 @@
73 85 a {
74 86 display: block;
75 87 text-align: center;
76   - font-weight: normal;
  88 + font-weight: 500;
77 89 height: 38px;
78 90 line-height: 34px;
79 91 color: #777;
... ... @@ -83,4 +95,38 @@
83 95 padding-top: 2px;
84 96 }
85 97 }
  98 +
  99 + @media (max-width: $screen-xs-max) {
  100 + font-size: 18px;
  101 + margin: 0;
  102 +
  103 + max-height: none;
  104 +
  105 + &, .container {
  106 + padding: 0;
  107 + border-top: 0;
  108 + }
  109 +
  110 + ul {
  111 + height: auto;
  112 +
  113 + li {
  114 + display: list-item;
  115 + width: auto;
  116 + padding: 5px 0;
  117 +
  118 + &.active {
  119 + background-color: $primary_color;
  120 +
  121 + a {
  122 + color: #fff;
  123 + font-weight: normal;
  124 + text-shadow: none;
  125 +
  126 + &:after { display: none; }
  127 + }
  128 + }
  129 + }
  130 + }
  131 + }
86 132 }
... ...
app/assets/stylesheets/sections/notes.scss
... ... @@ -47,13 +47,13 @@ ul.notes {
47 47 .discussion-body {
48 48 margin-left: 50px;
49 49  
50   - .file,
  50 + .diff-file,
51 51 .discussion-hidden,
52 52 .notes {
53 53 @extend .borders;
54 54 background-color: #F9F9F9;
55 55 }
56   - .file .notes {
  56 + .diff-file .notes {
57 57 /* reset */
58 58 background: inherit;
59 59 border: none;
... ... @@ -87,15 +87,10 @@ ul.notes {
87 87 }
88 88 .attachment {
89 89 font-size: 14px;
90   - margin-top: -20px;
91 90 }
92 91 .note-body {
93 92 @include md-typography;
94 93 margin-left: 45px;
95   -
96   - .highlight {
97   - @include border-radius(4px);
98   - }
99 94 }
100 95 .note-header {
101 96 padding-bottom: 5px;
... ... @@ -118,7 +113,7 @@ ul.notes {
118 113 }
119 114 }
120 115  
121   -.file .notes_holder {
  116 +.diff-file .notes_holder {
122 117 font-size: 13px;
123 118 line-height: 18px;
124 119 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
... ... @@ -188,7 +183,7 @@ ul.notes {
188 183 }
189 184 }
190 185 }
191   -.file .note .note-actions {
  186 +.diff-file .note .note-actions {
192 187 right: 0;
193 188 top: 0;
194 189 }
... ... @@ -199,7 +194,7 @@ ul.notes {
199 194 * Line note button on the side of diffs
200 195 */
201 196  
202   -.file tr.line_holder {
  197 +.diff-file tr.line_holder {
203 198 .add-diff-note {
204 199 background: url("diff_note_add.png") no-repeat left 0;
205 200 height: 22px;
... ... @@ -239,22 +234,25 @@ ul.notes {
239 234 .reply-btn {
240 235 @extend .btn-primary;
241 236 }
242   -.file .content tr.line_holder:hover {
243   - &> td.line_content {
244   - background: $hover !important;
245   - border-color: darken($hover, 10%) !important;
  237 +.diff-file .diff-content {
  238 + tr.line_holder:hover {
  239 + &> td.line_content {
  240 + background: $hover !important;
  241 + border-color: darken($hover, 10%) !important;
  242 + }
  243 + &> td.new_line,
  244 + &> td.old_line {
  245 + background: darken($hover, 4%) !important;
  246 + border-color: darken($hover, 10%) !important;
  247 + }
246 248 }
247   - &> td.new_line,
248   - &> td.old_line {
249   - background: darken($hover, 4%) !important;
250   - border-color: darken($hover, 10%) !important;
  249 +
  250 + tr.line_holder:hover > td .line_note_link {
  251 + opacity: 1.0;
  252 + filter: alpha(opacity=100);
251 253 }
252 254 }
253   -.file .content tr.line_holder:hover > td .line_note_link {
254   - opacity: 1.0;
255   - filter: alpha(opacity=100);
256   -}
257   -.file,
  255 +.diff-file,
258 256 .discussion {
259 257 .new_note {
260 258 margin: 0;
... ... @@ -292,7 +290,7 @@ ul.notes {
292 290 box-shadow: none;
293 291 font-size: 14px;
294 292 height: 80px;
295   - width: 98.6%;
  293 + width: 100%;
296 294 }
297 295 }
298 296 }
... ... @@ -306,6 +304,7 @@ ul.notes {
306 304 @extend .col-md-4;
307 305 @extend .thumbnail;
308 306 margin-left: 45px;
  307 + float: none;
309 308 }
310 309  
311 310  
... ... @@ -341,7 +340,7 @@ ul.notes {
341 340 box-shadow: none;
342 341 font-size: 14px;
343 342 height: 80px;
344   - width: 98.6%;
  343 + width: 100%;
345 344 }
346 345  
347 346 .form-actions {
... ...
app/assets/stylesheets/sections/profile.scss
... ... @@ -105,3 +105,23 @@
105 105 }
106 106 }
107 107 }
  108 +
  109 +.profile-groups-avatars {
  110 + margin: 0 5px 10px 0;
  111 +
  112 + img {
  113 + width: 50px;
  114 + height: 50px;
  115 + }
  116 +}
  117 +
  118 +.global-notifications-form .level-title {
  119 + font-size: 15px;
  120 + color: #333;
  121 + font-weight: bold;
  122 +}
  123 +
  124 +.notification-icon-holder {
  125 + width: 20px;
  126 + float: left;
  127 +}
... ...
app/assets/stylesheets/sections/projects.scss
... ... @@ -123,14 +123,9 @@
123 123 }
124 124  
125 125 .save-project-loader {
126   - img {
127   - margin-top: 50px;
128   - margin-bottom: 50px;
129   - }
130   - h3 {
131   - @extend .page-title;
132   - }
133   -
  126 + margin-top: 50px;
  127 + margin-bottom: 50px;
  128 + color: #555;
134 129 }
135 130  
136 131 ul.nav.nav-projects-tabs {
... ...
app/assets/stylesheets/sections/tree.scss
... ... @@ -127,9 +127,27 @@
127 127 border-top: 1px dashed #CCC;
128 128 padding-top: 10px;
129 129  
130   - h4 {
  130 + .readme-file-title {
131 131 font-size: 14px;
132 132 margin-bottom: 20px;
133 133 color: #777;
134 134 }
135 135 }
  136 +
  137 +.blob-commit-info {
  138 + list-style: none;
  139 + margin: 0;
  140 + padding: 0;
  141 + margin-bottom: 10px;
  142 +
  143 + .commit {
  144 + .commit-row-title {
  145 + font-size: 13px;
  146 +
  147 + .commit-row-message {
  148 + font-weight: normal;
  149 + color: #555;
  150 + }
  151 + }
  152 + }
  153 +}
... ...
app/assets/stylesheets/themes/ui_color.scss
... ... @@ -18,7 +18,7 @@
18 18 .navbar-inner {
19 19 background: #547;
20 20 border-bottom: 1px solid #435;
21   - .app_logo {
  21 + .app_logo, .navbar-toggle {
22 22 &:hover {
23 23 background-color: #435;
24 24 }
... ... @@ -36,4 +36,8 @@
36 36 }
37 37 }
38 38 }
  39 +
  40 + .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
  41 + background: #769;
  42 + }
39 43 }
... ...
app/assets/stylesheets/themes/ui_gray.scss
... ... @@ -18,7 +18,7 @@
18 18 .navbar-inner {
19 19 background: #373737;
20 20 border-bottom: 1px solid #272727;
21   - .app_logo {
  21 + .app_logo, .navbar-toggle {
22 22 &:hover {
23 23 background-color: #272727;
24 24 }
... ...
app/assets/stylesheets/themes/ui_mars.scss
... ... @@ -18,7 +18,7 @@
18 18 .navbar-inner {
19 19 background: #474D57;
20 20 border-bottom: 1px solid #373D47;
21   - .app_logo {
  21 + .app_logo, .navbar-toggle {
22 22 &:hover {
23 23 background-color: #373D47;
24 24 }
... ...
app/assets/stylesheets/themes/ui_modern.scss
... ... @@ -18,7 +18,7 @@
18 18 .navbar-inner {
19 19 background: #345;
20 20 border-bottom: 1px solid #234;
21   - .app_logo {
  21 + .app_logo, .navbar-toggle {
22 22 &:hover {
23 23 background-color: #234;
24 24 }
... ...
app/contexts/base_context.rb
... ... @@ -1,19 +0,0 @@
1   -class BaseContext
2   - attr_accessor :project, :current_user, :params
3   -
4   - def initialize(project, user, params)
5   - @project, @current_user, @params = project, user, params.dup
6   - end
7   -
8   - def abilities
9   - @abilities ||= begin
10   - abilities = Six.new
11   - abilities << Ability
12   - abilities
13   - end
14   - end
15   -
16   - def can?(object, action, subject)
17   - abilities.allowed?(object, action, subject)
18   - end
19   -end
app/contexts/commit_load_context.rb
... ... @@ -1,34 +0,0 @@
1   -class CommitLoadContext < BaseContext
2   - def execute
3   - result = {
4   - commit: nil,
5   - suppress_diff: false,
6   - line_notes: [],
7   - notes_count: 0,
8   - note: nil,
9   - status: :ok
10   - }
11   -
12   - commit = project.repository.commit(params[:id])
13   -
14   - if commit
15   - line_notes = project.notes.for_commit_id(commit.id).inline
16   -
17   - result[:commit] = commit
18   - result[:note] = project.build_commit_note(commit)
19   - result[:line_notes] = line_notes
20   - result[:notes_count] = project.notes.for_commit_id(commit.id).count
21   - result[:branches] = project.repository.branch_names_contains(commit.id)
22   -
23   - begin
24   - result[:suppress_diff] = true if commit.diff_suppress? && !params[:force_show_diff]
25   - result[:force_suppress_diff] = commit.diff_force_suppress?
26   - rescue Grit::Git::GitTimeout
27   - result[:suppress_diff] = true
28   - result[:status] = :huge_commit
29   - end
30   - end
31   -
32   - result
33   - end
34   -end
app/contexts/files/base_context.rb
... ... @@ -1,31 +0,0 @@
1   -module Files
2   - class BaseContext < ::BaseContext
3   - attr_reader :ref, :path
4   -
5   - def initialize(project, user, params, ref, path = nil)
6   - @project, @current_user, @params = project, user, params.dup
7   - @ref = ref
8   - @path = path
9   - end
10   -
11   - private
12   -
13   - def error(message)
14   - {
15   - error: message,
16   - status: :error
17   - }
18   - end
19   -
20   - def success
21   - {
22   - error: '',
23   - status: :success
24   - }
25   - end
26   -
27   - def repository
28   - project.repository
29   - end
30   - end
31   -end
app/contexts/files/create_context.rb
... ... @@ -1,46 +0,0 @@
1   -require_relative "base_context"
2   -
3   -module Files
4   - class CreateContext < BaseContext
5   - def execute
6   - allowed = if project.protected_branch?(ref)
7   - can?(current_user, :push_code_to_protected_branches, project)
8   - else
9   - can?(current_user, :push_code, project)
10   - end
11   -
12   - unless allowed
13   - return error("You are not allowed to create file in this branch")
14   - end
15   -
16   - unless repository.branch_names.include?(ref)
17   - return error("You can only create files if you are on top of a branch")
18   - end
19   -
20   - file_name = File.basename(path)
21   - file_path = path
22   -
23   - unless file_name =~ Gitlab::Regex.path_regex
24   - return error("Your changes could not be committed, because file name contains not allowed characters")
25   - end
26   -
27   - blob = repository.blob_at(ref, file_path)
28   -
29   - if blob
30   - return error("Your changes could not be committed, because file with such name exists")
31   - end
32   -
33   - new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, project, ref, file_path)
34   - created_successfully = new_file_action.commit!(
35   - params[:content],
36   - params[:commit_message]
37   - )
38   -
39   - if created_successfully
40   - success
41   - else
42   - error("Your changes could not be committed, because the file has been changed")
43   - end
44   - end
45   - end
46   -end
app/contexts/files/delete_context.rb
... ... @@ -1,40 +0,0 @@
1   -require_relative "base_context"
2   -
3   -module Files
4   - class DeleteContext < BaseContext
5   - def execute
6   - allowed = if project.protected_branch?(ref)
7   - can?(current_user, :push_code_to_protected_branches, project)
8   - else
9   - can?(current_user, :push_code, project)
10   - end
11   -
12   - unless allowed
13   - return error("You are not allowed to push into this branch")
14   - end
15   -
16   - unless repository.branch_names.include?(ref)
17   - return error("You can only create files if you are on top of a branch")
18   - end
19   -
20   - blob = repository.blob_at(ref, path)
21   -
22   - unless blob
23   - return error("You can only edit text files")
24   - end
25   -
26   - delete_file_action = Gitlab::Satellite::DeleteFileAction.new(current_user, project, ref, path)
27   -
28   - deleted_successfully = delete_file_action.commit!(
29   - nil,
30   - params[:commit_message]
31   - )
32   -
33   - if deleted_successfully
34   - success
35   - else
36   - error("Your changes could not be committed, because the file has been changed")
37   - end
38   - end
39   - end
40   -end
app/contexts/files/update_context.rb
... ... @@ -1,39 +0,0 @@
1   -require_relative "base_context"
2   -
3   -module Files
4   - class UpdateContext < BaseContext
5   - def execute
6   - allowed = if project.protected_branch?(ref)
7   - can?(current_user, :push_code_to_protected_branches, project)
8   - else
9   - can?(current_user, :push_code, project)
10   - end
11   -
12   - unless allowed
13   - return error("You are not allowed to push into this branch")
14   - end
15   -
16   - unless repository.branch_names.include?(ref)
17   - return error("You can only create files if you are on top of a branch")
18   - end
19   -
20   - blob = repository.blob_at(ref, path)
21   -
22   - unless blob
23   - return error("You can only edit text files")
24   - end
25   -
26   - new_file_action = Gitlab::Satellite::EditFileAction.new(current_user, project, ref, path)
27   - created_successfully = new_file_action.commit!(
28   - params[:content],
29   - params[:commit_message]
30   - )
31   -
32   - if created_successfully
33   - success
34   - else
35   - error("Your changes could not be committed, because the file has been changed")
36   - end
37   - end
38   - end
39   -end
app/contexts/filter_context.rb
... ... @@ -1,58 +0,0 @@
1   -class FilterContext
2   - attr_accessor :klass, :current_user, :params
3   -
4   - def initialize(klass, current_user, params)
5   - @klass = klass
6   - @current_user = current_user
7   - @params = params
8   - end
9   -
10   - def execute
11   - items = by_scope
12   - items = by_state(items)
13   - items = by_project(items)
14   - items = by_search(items)
15   - end
16   -
17   - private
18   -
19   - def by_scope
20   - table_name = klass.table_name
21   -
22   - case params[:scope]
23   - when 'authored' then
24   - current_user.send(table_name)
25   - when 'all' then
26   - klass.of_projects(current_user.authorized_projects.pluck(:id))
27   - else
28   - current_user.send("assigned_#{table_name}")
29   - end
30   - end
31   -
32   - def by_state(items)
33   - case params[:status]
34   - when 'closed'
35   - items.closed
36   - when 'all'
37   - items
38   - else
39   - items.opened
40   - end
41   - end
42   -
43   - def by_project(items)
44   - if params[:project_id].present?
45   - items = items.of_projects(params[:project_id])
46   - end
47   -
48   - items
49   - end
50   -
51   - def by_search(items)
52   - if params[:search].present?
53   - items = items.search(params[:search])
54   - end
55   -
56   - items
57   - end
58   -end
app/contexts/issues/bulk_update_context.rb
... ... @@ -1,39 +0,0 @@
1   -module Issues
2   - class BulkUpdateContext < BaseContext
3   - def execute
4   - update_data = params[:update]
5   -
6   - issues_ids = update_data[:issues_ids].split(",")
7   - milestone_id = update_data[:milestone_id]
8   - assignee_id = update_data[:assignee_id]
9   - status = update_data[:status]
10   -
11   - new_state = nil
12   -
13   - if status.present?
14   - if status == 'closed'
15   - new_state = :close
16   - else
17   - new_state = :reopen
18   - end
19   - end
20   -
21   - opts = {}
22   - opts[:milestone_id] = milestone_id if milestone_id.present?
23   - opts[:assignee_id] = assignee_id if assignee_id.present?
24   -
25   - issues = Issue.where(id: issues_ids)
26   - issues = issues.select { |issue| can?(current_user, :modify_issue, issue) }
27   -
28   - issues.each do |issue|
29   - issue.update_attributes(opts)
30   - issue.send new_state if new_state
31   - end
32   -
33   - {
34   - count: issues.count,
35   - success: !issues.count.zero?
36   - }
37   - end
38   - end
39   -end
app/contexts/issues/list_context.rb
... ... @@ -1,53 +0,0 @@
1   -module Issues
2   - class ListContext < BaseContext
3   - attr_accessor :issues
4   -
5   - def execute
6   - @issues = @project.issues
7   -
8   - @issues = case params[:state]
9   - when 'all' then @issues
10   - when 'closed' then @issues.closed
11   - else @issues.opened
12   - end
13   -
14   - @issues = case params[:scope]
15   - when 'assigned-to-me' then @issues.assigned_to(current_user)
16   - when 'created-by-me' then @issues.authored(current_user)
17   - else @issues
18   - end
19   -
20   - @issues = @issues.tagged_with(params[:label_name]) if params[:label_name].present?
21   - @issues = @issues.includes(:author, :project)
22   -
23   - # Filter by specific assignee_id (or lack thereof)?
24   - if params[:assignee_id].present?
25   - @issues = @issues.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
26   - end
27   -
28   - # Filter by specific milestone_id (or lack thereof)?
29   - if params[:milestone_id].present?
30   - @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
31   - end
32   -
33   - # Sort by :sort param
34   - @issues = sort(@issues, params[:sort])
35   -
36   - @issues
37   - end
38   -
39   - private
40   -
41   - def sort(issues, condition)
42   - case condition
43   - when 'newest' then issues.except(:order).order('created_at DESC')
44   - when 'oldest' then issues.except(:order).order('created_at ASC')
45   - when 'recently_updated' then issues.except(:order).order('updated_at DESC')
46   - when 'last_updated' then issues.except(:order).order('updated_at ASC')
47   - when 'milestone_due_soon' then issues.except(:order).joins(:milestone).order("milestones.due_date ASC")
48   - when 'milestone_due_later' then issues.except(:order).joins(:milestone).order("milestones.due_date DESC")
49   - else issues
50   - end
51   - end
52   - end
53   -end
app/contexts/merge_requests_load_context.rb
... ... @@ -1,35 +0,0 @@
1   -# Build collection of Merge Requests
2   -# based on filtering passed via params for @project
3   -class MergeRequestsLoadContext < BaseContext
4   - def execute
5   - merge_requests = @project.merge_requests
6   -
7   - merge_requests = case params[:state]
8   - when 'all' then merge_requests
9   - when 'closed' then merge_requests.closed
10   - else merge_requests.opened
11   - end
12   -
13   - merge_requests = case params[:scope]
14   - when 'assigned-to-me' then merge_requests.assigned_to(current_user)
15   - when 'created-by-me' then merge_requests.authored(current_user)
16   - else merge_requests
17   - end
18   -
19   -
20   - merge_requests = merge_requests.page(params[:page]).per(20)
21   - merge_requests = merge_requests.includes(:author, :source_project, :target_project).order("created_at desc")
22   -
23   - # Filter by specific assignee_id (or lack thereof)?
24   - if params[:assignee_id].present?
25   - merge_requests = merge_requests.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
26   - end
27   -
28   - # Filter by specific milestone_id (or lack thereof)?
29   - if params[:milestone_id].present?
30   - merge_requests = merge_requests.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
31   - end
32   -
33   - merge_requests
34   - end
35   -end
app/contexts/notes/create_context.rb
... ... @@ -1,10 +0,0 @@
1   -module Notes
2   - class CreateContext < BaseContext
3   - def execute
4   - note = project.notes.new(params[:note])
5   - note.author = current_user
6   - note.save
7   - note
8   - end
9   - end
10   -end
app/contexts/notes/load_context.rb
... ... @@ -1,20 +0,0 @@
1   -module Notes
2   - class LoadContext < BaseContext
3   - def execute
4   - target_type = params[:target_type]
5   - target_id = params[:target_id]
6   -
7   -
8   - @notes = case target_type
9   - when "commit"
10   - project.notes.for_commit_id(target_id).not_inline.fresh
11   - when "issue"
12   - project.issues.find(target_id).notes.inc_author.fresh
13   - when "merge_request"
14   - project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh
15   - when "snippet"
16   - project.snippets.find(target_id).notes.fresh
17   - end
18   - end
19   - end
20   -end
app/contexts/projects/create_context.rb
... ... @@ -1,80 +0,0 @@
1   -module Projects
2   - class CreateContext < BaseContext
3   - def initialize(user, params)
4   - @current_user, @params = user, params.dup
5   - end
6   -
7   - def execute
8   - # get namespace id
9   - namespace_id = params.delete(:namespace_id)
10   -
11   - # check that user is allowed to set specified visibility_level
12   - unless Gitlab::VisibilityLevel.allowed_for?(current_user, params[:visibility_level])
13   - params.delete(:visibility_level)
14   - end
15   -
16   - # Load default feature settings
17   - default_features = Gitlab.config.gitlab.default_projects_features
18   -
19   - default_opts = {
20   - issues_enabled: default_features.issues,
21   - wiki_enabled: default_features.wiki,
22   - wall_enabled: default_features.wall,
23   - snippets_enabled: default_features.snippets,
24   - merge_requests_enabled: default_features.merge_requests,
25   - visibility_level: default_features.visibility_level
26   - }.stringify_keys
27   -
28   - @project = Project.new(default_opts.merge(params))
29   -
30   - # Parametrize path for project
31   - #
32   - # Ex.
33   - # 'GitLab HQ'.parameterize => "gitlab-hq"
34   - #
35   - @project.path = @project.name.dup.parameterize unless @project.path.present?
36   -
37   -
38   - if namespace_id
39   - # Find matching namespace and check if it allowed
40   - # for current user if namespace_id passed.
41   - if allowed_namespace?(current_user, namespace_id)
42   - @project.namespace_id = namespace_id
43   - else
44   - deny_namespace
45   - return @project
46   - end
47   - else
48   - # Set current user namespace if namespace_id is nil
49   - @project.namespace_id = current_user.namespace_id
50   - end
51   -
52   - @project.creator = current_user
53   -
54   - if @project.save
55   - unless @project.group
56   - @project.users_projects.create(
57   - project_access: UsersProject::MASTER,
58   - user: current_user
59   - )
60   - end
61   - end
62   -
63   - @project
64   - rescue => ex
65   - @project.errors.add(:base, "Can't save project. Please try again later")
66   - @project
67   - end
68   -
69   - protected
70   -
71   - def deny_namespace
72   - @project.errors.add(:namespace, "is not valid")
73   - end
74   -
75   - def allowed_namespace?(user, namespace_id)
76   - namespace = Namespace.find_by_id(namespace_id)
77   - current_user.can?(:manage_namespace, namespace)
78   - end
79   - end
80   -end
app/contexts/projects/fork_context.rb
... ... @@ -1,44 +0,0 @@
1   -module Projects
2   - class ForkContext < BaseContext
3   - include Gitlab::ShellAdapter
4   -
5   - def initialize(project, user)
6   - @from_project, @current_user = project, user
7   - end
8   -
9   - def execute
10   - project = @from_project.dup
11   - project.name = @from_project.name
12   - project.path = @from_project.path
13   - project.namespace = current_user.namespace
14   - project.creator = current_user
15   -
16   - # If the project cannot save, we do not want to trigger the project destroy
17   - # as this can have the side effect of deleting a repo attached to an existing
18   - # project with the same name and namespace
19   - if project.valid?
20   - begin
21   - Project.transaction do
22   - #First save the DB entries as they can be rolled back if the repo fork fails
23   - project.build_forked_project_link(forked_to_project_id: project.id, forked_from_project_id: @from_project.id)
24   - if project.save
25   - project.users_projects.create(project_access: UsersProject::MASTER, user: current_user)
26   - end
27   - #Now fork the repo
28   - unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path)
29   - raise "forking failed in gitlab-shell"
30   - end
31   - project.ensure_satellite_exists
32   - end
33   - rescue => ex
34   - project.errors.add(:base, "Fork transaction failed.")
35   - project.destroy
36   - end
37   - else
38   - project.errors.add(:base, "Invalid fork destination")
39   - end
40   - project
41   -
42   - end
43   - end
44   -end