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.

@@ -34,3 +34,4 @@ doc/code/* @@ -34,3 +34,4 @@ doc/code/*
34 .secret 34 .secret
35 *.log 35 *.log
36 public/uploads.* 36 public/uploads.*
  37 +public/assets/
1 language: ruby 1 language: ruby
2 env: 2 env:
3 global: 3 global:
4 - - DB=mysql  
5 - TRAVIS=true 4 - TRAVIS=true
6 matrix: 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 before_install: 12 before_install:
11 - sudo apt-get install libicu-dev -y 13 - sudo apt-get install libicu-dev -y
12 branches: 14 branches:
@@ -15,7 +17,6 @@ branches: @@ -15,7 +17,6 @@ branches:
15 rvm: 17 rvm:
16 - 2.0.0 18 - 2.0.0
17 services: 19 services:
18 - - mysql  
19 - redis-server 20 - redis-server
20 before_script: 21 before_script:
21 - "cp config/database.yml.$DB config/database.yml" 22 - "cp config/database.yml.$DB config/database.yml"
  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 v 6.5.0 46 v 6.5.0
2 - Dropdown menus on issue#show page for assignee and milestone (Jason Blanchard) 47 - Dropdown menus on issue#show page for assignee and milestone (Jason Blanchard)
3 - Add color custimization and previewing to broadcast messages 48 - Add color custimization and previewing to broadcast messages
4 - Fixed notes anchors 49 - Fixed notes anchors
5 - Load new comments in issues dynamically 50 - Load new comments in issues dynamically
6 - Added sort options to Public page 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 - Add project visibility icons to dashboard 53 - Add project visibility icons to dashboard
9 - Enable secure cookies if https used 54 - Enable secure cookies if https used
10 - Protect users/confirmation with rack_attack 55 - Protect users/confirmation with rack_attack
@@ -15,6 +60,11 @@ v 6.5.0 @@ -15,6 +60,11 @@ v 6.5.0
15 - SCSS refactored 60 - SCSS refactored
16 - Use jquery timeago plugin 61 - Use jquery timeago plugin
17 - Fix 500 error for rdoc files 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 v6.4.3 69 v6.4.3
20 - Don't use unicorn worker killer if PhusionPassenger is defined 70 - Don't use unicorn worker killer if PhusionPassenger is defined
@@ -22,7 +72,7 @@ v6.4.3 @@ -22,7 +72,7 @@ v6.4.3
22 v6.4.2 72 v6.4.2
23 - Fixed wrong behaviour of script/upgrade.rb 73 - Fixed wrong behaviour of script/upgrade.rb
24 74
25 -v6.4.1 75 +v6.4.1
26 - Fixed bug with repository rename 76 - Fixed bug with repository rename
27 - Fixed bug with project transfer 77 - Fixed bug with project transfer
28 78
@@ -615,4 +665,4 @@ v 0.8.0 @@ -615,4 +665,4 @@ v 0.8.0
615 - stability 665 - stability
616 - security fixes 666 - security fixes
617 - increased test coverage 667 - increased test coverage
618 - - email notification  
619 \ No newline at end of file 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,7 +48,7 @@ Please send a merge request with a tested solution or a merge request with a fai
48 48
49 ## Merge requests 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 ### Merge request guidelines 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,19 +66,30 @@ If you can, please submit a merge request with the fix or improvements including
66 1. If the MR changes the UI it should include before and after screenshots 66 1. If the MR changes the UI it should include before and after screenshots
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 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 1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submittion 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)
@@ -14,7 +14,9 @@ gem "protected_attributes" @@ -14,7 +14,9 @@ gem "protected_attributes"
14 gem 'rails-observers' 14 gem 'rails-observers'
15 gem 'actionpack-page_caching' 15 gem 'actionpack-page_caching'
16 gem 'actionpack-action_caching' 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 # Supported DBs 21 # Supported DBs
20 gem "mysql2", group: :mysql 22 gem "mysql2", group: :mysql
@@ -30,28 +32,28 @@ gem 'omniauth-github' @@ -30,28 +32,28 @@ gem 'omniauth-github'
30 32
31 # Extracting information from a git repository 33 # Extracting information from a git repository
32 # Provide access to Gitlab::Git library 34 # Provide access to Gitlab::Git library
33 -gem "gitlab_git", "~> 4.0.0" 35 +gem "gitlab_git", '~> 5.6.0'
34 36
35 # Ruby/Rack Git Smart-HTTP Server Handler 37 # Ruby/Rack Git Smart-HTTP Server Handler
36 gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack' 38 gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack'
37 39
38 # LDAP Auth 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 # Git Wiki 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 # Language detection 46 # Language detection
48 -gem "gitlab-linguist", "~> 2.9.6", require: "linguist" 47 +gem "gitlab-linguist", "~> 3.0.0", require: "linguist"
49 48
50 # API 49 # API
51 gem "grape", "~> 0.6.1" 50 gem "grape", "~> 0.6.1"
52 gem "grape-entity", "~> 0.3.0" 51 gem "grape-entity", "~> 0.3.0"
53 gem 'rack-cors', require: 'rack/cors' 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 # Format dates and times 57 # Format dates and times
56 # based on human-friendly examples 58 # based on human-friendly examples
57 gem "stamp" 59 gem "stamp"
@@ -60,7 +62,7 @@ gem "stamp" @@ -60,7 +62,7 @@ gem "stamp"
60 gem 'enumerize' 62 gem 'enumerize'
61 63
62 # Pagination 64 # Pagination
63 -gem "kaminari", "~> 0.14.1" 65 +gem "kaminari", "~> 0.15.1"
64 66
65 # HAML 67 # HAML
66 gem "haml-rails" 68 gem "haml-rails"
@@ -125,6 +127,9 @@ gem "hipchat", "~> 0.14.0" @@ -125,6 +127,9 @@ gem "hipchat", "~> 0.14.0"
125 # Flowdock integration 127 # Flowdock integration
126 gem "gitlab-flowdock-git-hook", "~> 0.4.2" 128 gem "gitlab-flowdock-git-hook", "~> 0.4.2"
127 129
  130 +# Gemnasium integration
  131 +gem "gemnasium-gitlab-service", "~> 0.2"
  132 +
128 # d3 133 # d3
129 gem "d3_rails", "~> 3.1.4" 134 gem "d3_rails", "~> 3.1.4"
130 135
@@ -137,6 +142,9 @@ gem "sanitize" @@ -137,6 +142,9 @@ gem "sanitize"
137 # Protect against bruteforcing 142 # Protect against bruteforcing
138 gem "rack-attack" 143 gem "rack-attack"
139 144
  145 +# Ace editor
  146 +gem 'ace-rails-ap'
  147 +
140 gem "sass-rails" 148 gem "sass-rails"
141 gem "coffee-rails" 149 gem "coffee-rails"
142 gem "uglifier" 150 gem "uglifier"
@@ -159,7 +167,7 @@ group :development do @@ -159,7 +167,7 @@ group :development do
159 gem "annotate", "~> 2.6.0.beta2" 167 gem "annotate", "~> 2.6.0.beta2"
160 gem "letter_opener" 168 gem "letter_opener"
161 gem 'quiet_assets', '~> 1.0.1' 169 gem 'quiet_assets', '~> 1.0.1'
162 - gem 'rack-mini-profiler' 170 + gem 'rack-mini-profiler', require: false
163 171
164 # Better errors handler 172 # Better errors handler
165 gem 'better_errors' 173 gem 'better_errors'
@@ -206,6 +214,10 @@ group :development, :test do @@ -206,6 +214,10 @@ group :development, :test do
206 214
207 gem 'spork', '~> 1.0rc' 215 gem 'spork', '~> 1.0rc'
208 gem 'jasmine', '2.0.0.rc5' 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 end 221 end
210 222
211 group :test do 223 group :test do
@@ -8,11 +8,12 @@ GIT @@ -8,11 +8,12 @@ GIT
8 GEM 8 GEM
9 remote: https://rubygems.org/ 9 remote: https://rubygems.org/
10 specs: 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 mail (~> 2.5.4) 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 builder (~> 3.1.0) 17 builder (~> 3.1.0)
17 erubis (~> 2.7.0) 18 erubis (~> 2.7.0)
18 rack (~> 1.5.2) 19 rack (~> 1.5.2)
@@ -21,16 +22,16 @@ GEM @@ -21,16 +22,16 @@ GEM
21 actionpack (>= 4.0.0, < 5.0) 22 actionpack (>= 4.0.0, < 5.0)
22 actionpack-page_caching (1.0.2) 23 actionpack-page_caching (1.0.2)
23 actionpack (>= 4.0.0, < 5) 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 builder (~> 3.1.0) 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 activerecord-deprecated_finders (~> 1.0.2) 30 activerecord-deprecated_finders (~> 1.0.2)
30 - activesupport (= 4.0.2) 31 + activesupport (= 4.0.3)
31 arel (~> 4.0.0) 32 arel (~> 4.0.0)
32 activerecord-deprecated_finders (1.0.3) 33 activerecord-deprecated_finders (1.0.3)
33 - activesupport (4.0.2) 34 + activesupport (4.0.3)
34 i18n (~> 0.6, >= 0.6.4) 35 i18n (~> 0.6, >= 0.6.4)
35 minitest (~> 4.2) 36 minitest (~> 4.2)
36 multi_json (~> 1.3) 37 multi_json (~> 1.3)
@@ -42,7 +43,7 @@ GEM @@ -42,7 +43,7 @@ GEM
42 annotate (2.6.0) 43 annotate (2.6.0)
43 activerecord (>= 2.3.0) 44 activerecord (>= 2.3.0)
44 rake (>= 0.8.7) 45 rake (>= 0.8.7)
45 - arel (4.0.1) 46 + arel (4.0.2)
46 asciidoctor (0.1.4) 47 asciidoctor (0.1.4)
47 atomic (1.1.14) 48 atomic (1.1.14)
48 awesome_print (1.2.0) 49 awesome_print (1.2.0)
@@ -100,6 +101,8 @@ GEM @@ -100,6 +101,8 @@ GEM
100 daemons (1.1.9) 101 daemons (1.1.9)
101 database_cleaner (1.2.0) 102 database_cleaner (1.2.0)
102 debug_inspector (0.0.2) 103 debug_inspector (0.0.2)
  104 + default_value_for (3.0.0)
  105 + activerecord (>= 3.2.0, < 5.0)
103 descendants_tracker (0.0.3) 106 descendants_tracker (0.0.3)
104 devise (3.0.4) 107 devise (3.0.4)
105 bcrypt-ruby (~> 3.0) 108 bcrypt-ruby (~> 3.0)
@@ -114,6 +117,8 @@ GEM @@ -114,6 +117,8 @@ GEM
114 email_spec (1.5.0) 117 email_spec (1.5.0)
115 launchy (~> 2.1) 118 launchy (~> 2.1)
116 mail (~> 2.2) 119 mail (~> 2.2)
  120 + email_validator (1.4.0)
  121 + activemodel
117 enumerize (0.7.0) 122 enumerize (0.7.0)
118 activesupport (>= 3.2) 123 activesupport (>= 3.2)
119 equalizer (0.0.8) 124 equalizer (0.0.8)
@@ -149,6 +154,8 @@ GEM @@ -149,6 +154,8 @@ GEM
149 dotenv (>= 0.7) 154 dotenv (>= 0.7)
150 thor (>= 0.13.6) 155 thor (>= 0.13.6)
151 formatador (0.2.4) 156 formatador (0.2.4)
  157 + gemnasium-gitlab-service (0.2.1)
  158 + rugged (~> 0.19)
152 gemoji (1.3.1) 159 gemoji (1.3.1)
153 gherkin-ruby (0.3.1) 160 gherkin-ruby (0.3.1)
154 racc 161 racc
@@ -156,36 +163,32 @@ GEM @@ -156,36 +163,32 @@ GEM
156 gitlab-flowdock-git-hook (0.4.2.2) 163 gitlab-flowdock-git-hook (0.4.2.2)
157 gitlab-grit (>= 2.4.1) 164 gitlab-grit (>= 2.4.1)
158 multi_json 165 multi_json
159 - gitlab-gollum-lib (1.0.2) 166 + gitlab-gollum-lib (1.1.0)
160 github-markdown (~> 0.5.3) 167 github-markdown (~> 0.5.3)
161 github-markup (>= 0.7.5, < 1.0.0) 168 github-markup (>= 0.7.5, < 1.0.0)
162 gitlab-grit (~> 2.6.1) 169 gitlab-grit (~> 2.6.1)
163 - gitlab-pygments.rb (~> 0.5.4)  
164 nokogiri (~> 1.5.9) 170 nokogiri (~> 1.5.9)
165 sanitize (~> 2.0.3) 171 sanitize (~> 2.0.3)
166 stringex (~> 1.5.1) 172 stringex (~> 1.5.1)
167 gitlab-grack (2.0.0.pre) 173 gitlab-grack (2.0.0.pre)
168 rack (~> 1.5.1) 174 rack (~> 1.5.1)
169 - gitlab-grit (2.6.3) 175 + gitlab-grit (2.6.4)
170 charlock_holmes (~> 0.6.9) 176 charlock_holmes (~> 0.6.9)
171 diff-lcs (~> 1.1) 177 diff-lcs (~> 1.1)
172 mime-types (~> 1.15) 178 mime-types (~> 1.15)
173 posix-spawn (~> 0.3.6) 179 posix-spawn (~> 0.3.6)
174 - gitlab-linguist (2.9.6) 180 + gitlab-linguist (3.0.0)
175 charlock_holmes (~> 0.6.6) 181 charlock_holmes (~> 0.6.6)
176 escape_utils (~> 0.2.4) 182 escape_utils (~> 0.2.4)
177 - gitlab-pygments.rb (~> 0.5.4)  
178 mime-types (~> 1.19) 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 activesupport (~> 4.0.0) 185 activesupport (~> 4.0.0)
  186 + charlock_holmes (~> 0.6.9)
184 gitlab-grit (~> 2.6.1) 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 gitlab_meta (6.0) 190 gitlab_meta (6.0)
188 - gitlab_omniauth-ldap (1.0.3) 191 + gitlab_omniauth-ldap (1.0.4)
189 net-ldap (~> 0.3.1) 192 net-ldap (~> 0.3.1)
190 omniauth (~> 1.0) 193 omniauth (~> 1.0)
191 pyu-ruby-sasl (~> 0.0.3.1) 194 pyu-ruby-sasl (~> 0.0.3.1)
@@ -257,7 +260,7 @@ GEM @@ -257,7 +260,7 @@ GEM
257 json (1.8.1) 260 json (1.8.1)
258 jwt (0.1.8) 261 jwt (0.1.8)
259 multi_json (>= 1.5) 262 multi_json (>= 1.5)
260 - kaminari (0.14.1) 263 + kaminari (0.15.1)
261 actionpack (>= 3.0.0) 264 actionpack (>= 3.0.0)
262 activesupport (>= 3.0.0) 265 activesupport (>= 3.0.0)
263 kgio (2.8.1) 266 kgio (2.8.1)
@@ -279,7 +282,7 @@ GEM @@ -279,7 +282,7 @@ GEM
279 minitest (4.7.5) 282 minitest (4.7.5)
280 modernizr (2.6.2) 283 modernizr (2.6.2)
281 sprockets (~> 2.0) 284 sprockets (~> 2.0)
282 - multi_json (1.8.2) 285 + multi_json (1.8.4)
283 multi_xml (0.5.5) 286 multi_xml (0.5.5)
284 multipart-post (1.2.0) 287 multipart-post (1.2.0)
285 mysql2 (0.3.11) 288 mysql2 (0.3.11)
@@ -321,8 +324,8 @@ GEM @@ -321,8 +324,8 @@ GEM
321 cliver (~> 0.2.1) 324 cliver (~> 0.2.1)
322 multi_json (~> 1.0) 325 multi_json (~> 1.0)
323 websocket-driver (>= 0.2.0) 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 protected_attributes (1.0.5) 329 protected_attributes (1.0.5)
327 activemodel (>= 4.0.1, < 5.0) 330 activemodel (>= 4.0.1, < 5.0)
328 pry (0.9.12.4) 331 pry (0.9.12.4)
@@ -339,7 +342,7 @@ GEM @@ -339,7 +342,7 @@ GEM
339 rack-attack (2.3.0) 342 rack-attack (2.3.0)
340 rack 343 rack
341 rack-cors (0.2.9) 344 rack-cors (0.2.9)
342 - rack-mini-profiler (0.1.31) 345 + rack-mini-profiler (0.9.0)
343 rack (>= 1.1.3) 346 rack (>= 1.1.3)
344 rack-mount (0.8.3) 347 rack-mount (0.8.3)
345 rack (>= 1.0.0) 348 rack (>= 1.0.0)
@@ -347,13 +350,13 @@ GEM @@ -347,13 +350,13 @@ GEM
347 rack 350 rack
348 rack-test (0.6.2) 351 rack-test (0.6.2)
349 rack (>= 1.0) 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 bundler (>= 1.3.0, < 2.0) 358 bundler (>= 1.3.0, < 2.0)
356 - railties (= 4.0.2) 359 + railties (= 4.0.3)
357 sprockets-rails (~> 2.0.0) 360 sprockets-rails (~> 2.0.0)
358 rails-observers (0.1.2) 361 rails-observers (0.1.2)
359 activemodel (~> 4.0) 362 activemodel (~> 4.0)
@@ -366,13 +369,13 @@ GEM @@ -366,13 +369,13 @@ GEM
366 i18n 369 i18n
367 require_all 370 require_all
368 ruby-progressbar 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 rake (>= 0.8.7) 375 rake (>= 0.8.7)
373 thor (>= 0.18.1, < 2.0) 376 thor (>= 0.18.1, < 2.0)
374 raindrops (0.12.0) 377 raindrops (0.12.0)
375 - rake (10.1.0) 378 + rake (10.1.1)
376 raphael-rails (2.1.2) 379 raphael-rails (2.1.2)
377 rb-fsevent (0.9.3) 380 rb-fsevent (0.9.3)
378 rb-inotify (0.9.2) 381 rb-inotify (0.9.2)
@@ -421,6 +424,7 @@ GEM @@ -421,6 +424,7 @@ GEM
421 ruby-hmac (0.4.0) 424 ruby-hmac (0.4.0)
422 ruby-progressbar (1.2.0) 425 ruby-progressbar (1.2.0)
423 rubyntlm (0.1.1) 426 rubyntlm (0.1.1)
  427 + rugged (0.19.0)
424 safe_yaml (0.9.7) 428 safe_yaml (0.9.7)
425 sanitize (2.0.6) 429 sanitize (2.0.6)
426 nokogiri (>= 1.4.4) 430 nokogiri (>= 1.4.4)
@@ -470,6 +474,11 @@ GEM @@ -470,6 +474,11 @@ GEM
470 railties (>= 3) 474 railties (>= 3)
471 spinach (>= 0.4) 475 spinach (>= 0.4)
472 spork (1.0.0rc4) 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 sprockets (2.10.1) 482 sprockets (2.10.1)
474 hike (~> 1.2) 483 hike (~> 1.2)
475 multi_json (~> 1.0) 484 multi_json (~> 1.0)
@@ -541,15 +550,14 @@ GEM @@ -541,15 +550,14 @@ GEM
541 websocket-driver (0.3.1) 550 websocket-driver (0.3.1)
542 xpath (2.0.0) 551 xpath (2.0.0)
543 nokogiri (~> 1.3) 552 nokogiri (~> 1.3)
544 - yajl-ruby (1.1.0)  
545 553
546 PLATFORMS 554 PLATFORMS
547 ruby 555 ruby
548 556
549 DEPENDENCIES 557 DEPENDENCIES
  558 + ace-rails-ap
550 actionpack-action_caching 559 actionpack-action_caching
551 actionpack-page_caching 560 actionpack-page_caching
552 - activerecord-deprecated_finders  
553 acts-as-taggable-on 561 acts-as-taggable-on
554 annotate (~> 2.6.0.beta2) 562 annotate (~> 2.6.0.beta2)
555 asciidoctor 563 asciidoctor
@@ -564,25 +572,27 @@ DEPENDENCIES @@ -564,25 +572,27 @@ DEPENDENCIES
564 coveralls 572 coveralls
565 d3_rails (~> 3.1.4) 573 d3_rails (~> 3.1.4)
566 database_cleaner 574 database_cleaner
  575 + default_value_for (~> 3.0.0)
567 devise (= 3.0.4) 576 devise (= 3.0.4)
568 devise-async (= 0.8.0) 577 devise-async (= 0.8.0)
569 email_spec 578 email_spec
  579 + email_validator (~> 1.4.0)
570 enumerize 580 enumerize
571 factory_girl_rails 581 factory_girl_rails
572 ffaker 582 ffaker
573 fog (~> 1.3.1) 583 fog (~> 1.3.1)
574 font-awesome-rails (~> 3.2) 584 font-awesome-rails (~> 3.2)
575 foreman 585 foreman
  586 + gemnasium-gitlab-service (~> 0.2)
576 gemoji (~> 1.3.0) 587 gemoji (~> 1.3.0)
577 github-markup (~> 0.7.4)! 588 github-markup (~> 0.7.4)!
578 gitlab-flowdock-git-hook (~> 0.4.2) 589 gitlab-flowdock-git-hook (~> 0.4.2)
579 - gitlab-gollum-lib (~> 1.0.2) 590 + gitlab-gollum-lib (~> 1.1.0)
580 gitlab-grack (~> 2.0.0.pre) 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 gitlab_meta (= 6.0) 594 gitlab_meta (= 6.0)
585 - gitlab_omniauth-ldap (= 1.0.3) 595 + gitlab_omniauth-ldap (= 1.0.4)
586 gon (~> 5.0.0) 596 gon (~> 5.0.0)
587 grape (~> 0.6.1) 597 grape (~> 0.6.1)
588 grape-entity (~> 0.3.0) 598 grape-entity (~> 0.3.0)
@@ -597,7 +607,7 @@ DEPENDENCIES @@ -597,7 +607,7 @@ DEPENDENCIES
597 jquery-rails (= 2.1.3) 607 jquery-rails (= 2.1.3)
598 jquery-turbolinks 608 jquery-turbolinks
599 jquery-ui-rails (= 2.0.2) 609 jquery-ui-rails (= 2.0.2)
600 - kaminari (~> 0.14.1) 610 + kaminari (~> 0.15.1)
601 launchy 611 launchy
602 letter_opener 612 letter_opener
603 minitest (~> 4.7.0) 613 minitest (~> 4.7.0)
@@ -638,6 +648,9 @@ DEPENDENCIES @@ -638,6 +648,9 @@ DEPENDENCIES
638 slim 648 slim
639 spinach-rails 649 spinach-rails
640 spork (~> 1.0rc) 650 spork (~> 1.0rc)
  651 + spring (= 1.1.1)
  652 + spring-commands-rspec (= 1.0.1)
  653 + spring-commands-spinach (= 1.0.0)
641 stamp 654 stamp
642 state_machine 655 state_machine
643 test_after_commit 656 test_after_commit
1 -Copyright (c) 2011 Dmitriy Zaporozhets 1 +Copyright (c) 2011-2014 Dmitriy Zaporozhets
2 2
3 Permission is hereby granted, free of charge, to any person obtaining a copy 3 Permission is hereby granted, free of charge, to any person obtaining a copy
4 of this software and associated documentation files (the "Software"), to deal 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,3 +21,5 @@ release where the minor version is increased numerically by increments of one
21 (eg. `5.0 -> 5.1`). 21 (eg. `5.0 -> 5.1`).
22 22
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. 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.
@@ -73,7 +73,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue @@ -73,7 +73,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue
73 73
74 ### Feature requests 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 ### Issue report for old version 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,7 +81,7 @@ Thanks for the issue report but we only support issues for the latest stable ver
81 81
82 ### Support requests and configuration questions 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 ### Code format 86 ### Code format
87 87
@@ -4,26 +4,21 @@ @@ -4,26 +4,21 @@
4 4
5 ![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif) 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 ### Code status 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 * [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.png)](https://codeclimate.com/github/gitlabhq/gitlabhq) 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 * [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq) 22 * [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq)
28 23
29 ### Resources 24 ### Resources
@@ -36,6 +31,8 @@ @@ -36,6 +31,8 @@
36 31
37 * [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. 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 ### Requirements 36 ### Requirements
40 37
41 * Ubuntu/Debian** 38 * Ubuntu/Debian**
@@ -50,13 +47,17 @@ @@ -50,13 +47,17 @@
50 47
51 #### Official installation methods 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 * [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. 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 #### Third party one-click installers 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 * [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 * [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,11 +69,9 @@
68 69
69 ### New versions and upgrading 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 * 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). 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,16 +144,18 @@ or start each component separately
145 144
146 * [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab. 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 * [Support subscription](http://www.gitlab.com/subscription/) connects you to the knowledge of GitLab experts that will resolve your issues and answer your questions. 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 * [Consultancy](http://www.gitlab.com/consultancy/) from the GitLab experts for installations, upgrades and customizations. 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 * [Book](http://www.packtpub.com/gitlab-repository-management/book) written by GitLab enthusiast Jonathan M. Hethey is unofficial but it offers a good overview. 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 ### Getting in touch 160 ### Getting in touch
160 161
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,6 +3,7 @@
3 user_path: "/api/:version/users/:id.json" 3 user_path: "/api/:version/users/:id.json"
4 notes_path: "/api/:version/projects/:id/notes.json" 4 notes_path: "/api/:version/projects/:id/notes.json"
5 namespaces_path: "/api/:version/namespaces.json" 5 namespaces_path: "/api/:version/namespaces.json"
  6 + project_users_path: "/api/:version/projects/:id/users.json"
6 7
7 # Get 20 (depends on api) recent notes 8 # Get 20 (depends on api) recent notes
8 # and sort the ascending from oldest to newest 9 # and sort the ascending from oldest to newest
@@ -50,6 +51,23 @@ @@ -50,6 +51,23 @@
50 ).done (users) -> 51 ).done (users) ->
51 callback(users) 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 # Return namespaces list. Filtered by query 71 # Return namespaces list. Filtered by query
54 namespaces: (query, callback) -> 72 namespaces: (query, callback) ->
55 url = Api.buildUrl(Api.namespaces_path) 73 url = Api.buildUrl(Api.namespaces_path)
app/assets/javascripts/application.js
@@ -24,7 +24,8 @@ @@ -24,7 +24,8 @@
24 //= require g.raphael-min 24 //= require g.raphael-min
25 //= require g.bar-min 25 //= require g.bar-min
26 //= require branch-graph 26 //= require branch-graph
27 -//= require ace-src-noconflict/ace 27 +//= require highlightjs.min
  28 +//= require ace/ace
28 //= require_tree . 29 //= require_tree .
29 //= require d3 30 //= require d3
30 //= require underscore 31 //= require underscore
app/assets/javascripts/blob.js.coffee
@@ -17,7 +17,7 @@ class BlobView @@ -17,7 +17,7 @@ class BlobView
17 17
18 setHash(hash) 18 setHash(hash)
19 e.preventDefault() 19 e.preventDefault()
20 - 20 +
21 # See if there are lines selected 21 # See if there are lines selected
22 # "#L12" and "#L34-56" supported 22 # "#L12" and "#L34-56" supported
23 highlightBlobLines = (e) -> 23 highlightBlobLines = (e) ->
@@ -64,7 +64,7 @@ class BlobView @@ -64,7 +64,7 @@ class BlobView
64 nodes.attr("id", hash) 64 nodes.attr("id", hash)
65 65
66 # initialize multi-line select 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 # Highlight the correct lines on load 69 # Highlight the correct lines on load
70 highlightBlobLines() 70 highlightBlobLines()
app/assets/javascripts/commit.js.coffee
1 class Commit 1 class Commit
2 constructor: -> 2 constructor: ->
3 - $('.files .file').each -> 3 + $('.files .diff-file').each ->
4 new CommitFile(this) 4 new CommitFile(this)
5 5
6 @Commit = Commit 6 @Commit = Commit
app/assets/javascripts/dispatcher.js.coffee
@@ -4,6 +4,7 @@ $ -&gt; @@ -4,6 +4,7 @@ $ -&gt;
4 class Dispatcher 4 class Dispatcher
5 constructor: () -> 5 constructor: () ->
6 @initSearch() 6 @initSearch()
  7 + @initHighlight()
7 @initPageScripts() 8 @initPageScripts()
8 9
9 initPageScripts: -> 10 initPageScripts: ->
@@ -18,6 +19,8 @@ class Dispatcher @@ -18,6 +19,8 @@ class Dispatcher
18 switch page 19 switch page
19 when 'projects:issues:index' 20 when 'projects:issues:index'
20 Issues.init() 21 Issues.init()
  22 + when 'projects:issues:show'
  23 + new Issue()
21 when 'projects:issues:new', 'projects:merge_requests:new' 24 when 'projects:issues:new', 'projects:merge_requests:new'
22 GitLab.GfmAutoComplete.setup() 25 GitLab.GfmAutoComplete.setup()
23 when 'dashboard:show' 26 when 'dashboard:show'
@@ -47,5 +50,16 @@ class Dispatcher @@ -47,5 +50,16 @@ class Dispatcher
47 50
48 51
49 initSearch: -> 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,3 +4,14 @@ class GroupMembers
4 $(this).fadeOut() 4 $(this).fadeOut()
5 5
6 @GroupMembers = GroupMembers 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 \ No newline at end of file 18 \ No newline at end of file
app/assets/javascripts/issue.js.coffee 0 → 100644
@@ -0,0 +1,9 @@ @@ -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,10 +29,10 @@
29 $('#filter_issue_search').val($('#issue_search').val()) 29 $('#filter_issue_search').val($('#issue_search').val())
30 30
31 initSelects: -> 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 $("#milestone_id, #assignee_id, #label_name").on "change", -> 36 $("#milestone_id, #assignee_id, #label_name").on "change", ->
37 $(this).closest("form").submit() 37 $(this).closest("form").submit()
38 38
@@ -77,9 +77,3 @@ @@ -77,9 +77,3 @@
77 $("#update_issues_ids").val [] 77 $("#update_issues_ids").val []
78 $(".issues_bulk_update").hide() 78 $(".issues_bulk_update").hide()
79 $(".issues-filters").show() 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,11 +117,11 @@ $ -&gt;
117 117
118 118
119 # Commit show suppressed diff 119 # Commit show suppressed diff
120 - $(".content").on "click", ".supp_diff_link", -> 120 + $(".diff-content").on "click", ".supp_diff_link", ->
121 $(@).next('table').show() 121 $(@).next('table').show()
122 $(@).remove() 122 $(@).remove()
123 123
124 - $(".content").on "click", ".js-details-expand", -> 124 + $(".diff-content").on "click", ".js-details-expand", ->
125 $(@).next('.js-details-contain').removeClass("hide") 125 $(@).next('.js-details-contain').removeClass("hide")
126 $(@).remove() 126 $(@).remove()
127 127
app/assets/javascripts/merge_request.js.coffee 0 → 100644
@@ -0,0 +1,103 @@ @@ -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,97 +6,3 @@
6 $('#milestone_id').select2() 6 $('#milestone_id').select2()
7 $('#milestone_id, #assignee_id').on 'change', -> 7 $('#milestone_id, #assignee_id').on 'change', ->
8 $(this).closest('form').submit() 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,6 +94,9 @@ class Notes
94 if @isNewNote(note) 94 if @isNewNote(note)
95 @note_ids.push(note.id) 95 @note_ids.push(note.id)
96 $('ul.main-notes-list').append(note.html) 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,6 +256,9 @@ class Notes
253 updateNote: (xhr, note, status) => 256 updateNote: (xhr, note, status) =>
254 note_li = $("#note_" + note.id) 257 note_li = $("#note_" + note.id)
255 note_li.replaceWith(note.html) 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 Called in response to clicking the edit note link 264 Called in response to clicking the edit note link
app/assets/javascripts/profile.js.coffee
@@ -26,3 +26,5 @@ $ -&gt; @@ -26,3 +26,5 @@ $ -&gt;
26 form = $(this).closest("form") 26 form = $(this).closest("form")
27 filename = $(this).val().replace(/^.*[\\\/]/, '') 27 filename = $(this).val().replace(/^.*[\\\/]/, '')
28 form.find(".js-avatar-filename").text(filename) 28 form.find(".js-avatar-filename").text(filename)
  29 +
  30 + $('.profile-groups-avatars').tooltip("placement": "top")
29 \ No newline at end of file 31 \ No newline at end of file
app/assets/javascripts/project_users_select.js.coffee 0 → 100644
@@ -0,0 +1,63 @@ @@ -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 class SearchAutocomplete 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 $("#search").autocomplete 7 $("#search").autocomplete
4 - source: json 8 + source: search_autocomplete_path + query
  9 + minLength: 1
5 select: (event, ui) -> 10 select: (event, ui) ->
6 location.href = ui.item.url 11 location.href = ui.item.url
7 12
app/assets/javascripts/users_select.js.coffee
1 $ -> 1 $ ->
2 userFormatResult = (user) -> 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 avatar = gon.gravatar_url 6 avatar = gon.gravatar_url
7 avatar = avatar.replace('%{hash}', md5(user.email)) 7 avatar = avatar.replace('%{hash}', md5(user.email))
8 avatar = avatar.replace('%{size}', '24') 8 avatar = avatar.replace('%{size}', '24')
  9 + else
  10 + avatar = gon.relative_url_root + "/assets/no_avatar.png"
9 11
10 "<div class='user-result'> 12 "<div class='user-result'>
11 <div class='user-image'><img class='avatar s24' src='#{avatar}'></div> 13 <div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
app/assets/stylesheets/application.scss
@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
5 *= require jquery.ui.gitlab 5 *= require jquery.ui.gitlab
6 *= require jquery.atwho 6 *= require jquery.atwho
7 *= require select2 7 *= require select2
  8 + *= require highlightjs.min
8 *= require_self 9 *= require_self
9 */ 10 */
10 11
@@ -36,8 +37,10 @@ @@ -36,8 +37,10 @@
36 @import "generic/issue_box.scss"; 37 @import "generic/issue_box.scss";
37 @import "generic/files.scss"; 38 @import "generic/files.scss";
38 @import "generic/lists.scss"; 39 @import "generic/lists.scss";
  40 +@import "generic/flash.scss";
39 @import "generic/forms.scss"; 41 @import "generic/forms.scss";
40 @import "generic/selects.scss"; 42 @import "generic/selects.scss";
  43 +@import "generic/highlight.scss";
41 44
42 /** 45 /**
43 * Page specific styles (issues, projects etc): 46 * Page specific styles (issues, projects etc):
@@ -45,6 +48,7 @@ @@ -45,6 +48,7 @@
45 @import "sections/header.scss"; 48 @import "sections/header.scss";
46 @import "sections/nav.scss"; 49 @import "sections/nav.scss";
47 @import "sections/commits.scss"; 50 @import "sections/commits.scss";
  51 +@import "sections/diff.scss";
48 @import "sections/issues.scss"; 52 @import "sections/issues.scss";
49 @import "sections/projects.scss"; 53 @import "sections/projects.scss";
50 @import "sections/snippets.scss"; 54 @import "sections/snippets.scss";
@@ -63,9 +67,10 @@ @@ -63,9 +67,10 @@
63 @import "sections/wall.scss"; 67 @import "sections/wall.scss";
64 @import "sections/dashboard.scss"; 68 @import "sections/dashboard.scss";
65 @import "sections/stat_graph.scss"; 69 @import "sections/stat_graph.scss";
  70 +@import "sections/groups.scss";
66 71
67 /** 72 /**
68 - * Code ighlight 73 + * Code highlight
69 */ 74 */
70 @import "highlight/white.scss"; 75 @import "highlight/white.scss";
71 @import "highlight/dark.scss"; 76 @import "highlight/dark.scss";
app/assets/stylesheets/generic/blocks.scss
@@ -2,3 +2,18 @@ @@ -2,3 +2,18 @@
2 background: #f9f9f9; 2 background: #f9f9f9;
3 padding: 15px; 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,7 +118,6 @@
118 @extend .btn-primary; 118 @extend .btn-primary;
119 } 119 }
120 120
121 - &.btn-close,  
122 &.btn-remove { 121 &.btn-remove {
123 @extend .btn-danger; 122 @extend .btn-danger;
124 } 123 }
@@ -143,6 +142,30 @@ @@ -143,6 +142,30 @@
143 line-height: 16px; 142 line-height: 16px;
144 margin: 2px; 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 .btn-block { 171 .btn-block {
@@ -154,9 +177,8 @@ @@ -154,9 +177,8 @@
154 } 177 }
155 } 178 }
156 179
157 -.btn,  
158 .btn-group { 180 .btn-group {
159 - &.grouped { 181 + &.btn-grouped {
160 margin-right: 7px; 182 margin-right: 7px;
161 float: left; 183 float: left;
162 &:last-child { 184 &:last-child {
app/assets/stylesheets/generic/common.scss
@@ -11,8 +11,6 @@ @@ -11,8 +11,6 @@
11 .bgred { background: #F2DEDE!important } 11 .bgred { background: #F2DEDE!important }
12 12
13 /** COMMON CLASSES **/ 13 /** COMMON CLASSES **/
14 -.left { float:left }  
15 -  
16 .prepend-top-10 { margin-top:10px } 14 .prepend-top-10 { margin-top:10px }
17 .prepend-top-20 { margin-top:20px } 15 .prepend-top-20 { margin-top:20px }
18 .prepend-left-10 { margin-left:10px } 16 .prepend-left-10 { margin-left:10px }
@@ -24,32 +22,9 @@ @@ -24,32 +22,9 @@
24 .append-bottom-20 { margin-bottom:20px } 22 .append-bottom-20 { margin-bottom:20px }
25 .inline { display: inline-block } 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 .hint { font-style: italic; color: #999; } 26 .hint { font-style: italic; color: #999; }
32 .light { color: #888 } 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 .slead { 29 .slead {
55 color: #666; 30 color: #666;
@@ -59,49 +34,23 @@ @@ -59,49 +34,23 @@
59 line-height: 24px; 34 line-height: 24px;
60 } 35 }
61 36
62 -  
63 .tab-content { 37 .tab-content {
64 overflow: visible; 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,6 +61,7 @@ pre.well-pre {
112 .dropdown-menu > li > a:hover, 61 .dropdown-menu > li > a:hover,
113 .dropdown-menu > li > a:focus { 62 .dropdown-menu > li > a:focus {
114 background: #29b; 63 background: #29b;
  64 + color: #FFF
115 } 65 }
116 66
117 .breadcrumb > li + li:before { 67 .breadcrumb > li + li:before {
@@ -130,31 +80,6 @@ pre.well-pre { @@ -130,31 +80,6 @@ pre.well-pre {
130 } 80 }
131 81
132 /** FLASH message **/ 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 .author_link { 83 .author_link {
159 color: $link_color; 84 color: $link_color;
160 } 85 }
@@ -173,12 +98,10 @@ table a code { @@ -173,12 +98,10 @@ table a code {
173 98
174 .loading { 99 .loading {
175 margin: 20px auto; 100 margin: 20px auto;
176 - background: url(ajax_loader.gif) no-repeat center center;  
177 - width: 40px;  
178 height: 40px; 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 span.update-author { 107 span.update-author {
@@ -276,22 +199,6 @@ li.note { @@ -276,22 +199,6 @@ li.note {
276 cursor: pointer; 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 .git_error_tips { 202 .git_error_tips {
296 @extend .col-md-6; 203 @extend .col-md-6;
297 text-align: left; 204 text-align: left;
@@ -327,6 +234,12 @@ li.note { @@ -327,6 +234,12 @@ li.note {
327 color: #fff; 234 color: #fff;
328 text-decoration: underline; 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 .warning_message { 245 .warning_message {
@@ -349,15 +262,6 @@ li.note { @@ -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 .milestone { 265 .milestone {
362 &.milestone-closed { 266 &.milestone-closed {
363 background: #eee; 267 background: #eee;
@@ -441,40 +345,6 @@ table { @@ -441,40 +345,6 @@ table {
441 margin-bottom: 20px; 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 .btn-sign-in { 348 .btn-sign-in {
479 margin-top: 7px; 349 margin-top: 7px;
480 text-shadow: none; 350 text-shadow: none;
@@ -485,3 +355,7 @@ table { @@ -485,3 +355,7 @@ table {
485 margin-bottom: 15px; 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,14 +45,14 @@
45 text-align: center; 45 text-align: center;
46 img { 46 img {
47 padding: 100px; 47 padding: 100px;
48 - max-width: 300px; 48 + max-width: 50%;
49 } 49 }
50 } 50 }
51 51
52 &.wiki { 52 &.wiki {
53 - padding: 20px;  
54 font-size: 14px; 53 font-size: 14px;
55 line-height: 1.6; 54 line-height: 1.6;
  55 + padding: 25px;
56 56
57 .highlight { 57 .highlight {
58 margin-bottom: 9px; 58 margin-bottom: 9px;
@@ -143,75 +143,6 @@ @@ -143,75 +143,6 @@
143 */ 143 */
144 &.code { 144 &.code {
145 padding: 0; 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 @@ @@ -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,3 +51,27 @@ label {
51 .input-mn-300 { 51 .input-mn-300 {
52 min-width: 300px; 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 @@ @@ -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,37 +10,103 @@
10 .issue-box { 10 .issue-box {
11 color: #666; 11 color: #666;
12 margin:20px 0; 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 .control-group { 68 .control-group {
17 margin-bottom: 0; 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 .title { 78 .title {
21 - font-size: 20px; 79 + font-size: 22px;
22 font-weight: 500; 80 font-weight: 500;
23 - line-height: 28px; 81 + line-height: 1.5;
24 margin: 0; 82 margin: 0;
25 - color: #444; 83 + color: #333;
  84 + padding-bottom: 0;
  85 + padding: 15px 25px;
26 } 86 }
27 87
28 .context { 88 .context {
29 border: none; 89 border: none;
30 - background-color: #f5f5f5;  
31 - border: none;  
32 border-top: 1px solid #eee; 90 border-top: 1px solid #eee;
  91 + padding: 15px 25px;
33 } 92 }
34 93
35 .description { 94 .description {
36 - border-top: 1px solid #eee; 95 + padding: 0 25px 15px 25px;
37 } 96 }
38 97
39 .title, .context, .description { 98 .title, .context, .description {
40 - padding: 15px;  
41 -  
42 .clearfix { 99 .clearfix {
43 margin: 0; 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,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 &.smoke { background-color: #f5f5f5; } 32 &.smoke { background-color: #f5f5f5; }
27 33
28 &:hover { 34 &:hover {
app/assets/stylesheets/generic/selects.scss
1 /** Select2 selectbox style override **/ 1 /** Select2 selectbox style override **/
2 -  
3 -.select2-container { 2 +.select2-container, .select2-container.select2-drop-above {
4 .select2-choice { 3 .select2-choice {
5 background: #FFF; 4 background: #FFF;
6 border-color: #BBB; 5 border-color: #BBB;
@@ -12,8 +11,24 @@ @@ -12,8 +11,24 @@
12 } 11 }
13 12
14 .select2-drop-active { 13 .select2-drop-active {
15 - border: 1px solid #BBB; 14 + border: 1px solid #BBB !important;
16 margin-top: 4px; 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 select { 34 select {
@@ -66,3 +81,43 @@ select { @@ -66,3 +81,43 @@ select {
66 .project-refs-form .select2-container { 81 .project-refs-form .select2-container {
67 margin-right: 10px; 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,9 +90,27 @@ a:focus {
90 90
91 font-size: 14px; 91 font-size: 14px;
92 line-height: 1.6; 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 ul { 114 ul {
97 padding: 0; 115 padding: 0;
98 margin: 0 0 9px 25px !important; 116 margin: 0 0 9px 25px !important;
app/assets/stylesheets/gl_bootstrap.scss
@@ -108,6 +108,8 @@ $pagination-active-bg: $bg_style_color; @@ -108,6 +108,8 @@ $pagination-active-bg: $bg_style_color;
108 108
109 // Nav tabs 109 // Nav tabs
110 .nav.nav-tabs { 110 .nav.nav-tabs {
  111 + margin-bottom: 15px;
  112 +
111 li { 113 li {
112 > a { 114 > a {
113 padding: 8px 20px; 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 pre { 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 pre { 20 pre {
15 background-color: #272822; 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 background-color: #002B36; 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 pre { 16 pre {
6 background-color: #002B36; 17 background-color: #002B36;
7 color: #eee; 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 background-color: #fff; 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 pre { 12 pre {
6 background-color: #fff; 13 background-color: #fff;
7 color: #333; 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 .shadow { 178 .shadow {
71 @include box-shadow(0 5px 15px #000); 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 html { 1 html {
2 overflow-y: scroll; 2 overflow-y: scroll;
  3 +
  4 + &.touch .tooltip { display: none !important; }
3 } 5 }
4 6
5 body { 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 .container { 11 .container {
app/assets/stylesheets/main/mixins.scss
@@ -106,12 +106,12 @@ @@ -106,12 +106,12 @@
106 106
107 h3 { 107 h3 {
108 margin-top: 35px; 108 margin-top: 35px;
109 - font-size: 2em; 109 + font-size: 1.5em;
110 } 110 }
111 111
112 h4 { 112 h4 {
113 margin-top: 30px; 113 margin-top: 30px;
114 - font-size: 1.5em; 114 + font-size: 1.2em;
115 } 115 }
116 116
117 blockquote p { 117 blockquote p {
@@ -128,7 +128,7 @@ @@ -128,7 +128,7 @@
128 } 128 }
129 } 129 }
130 130
131 - code { 131 + p > code {
132 font-size: inherit; 132 font-size: inherit;
133 font-weight: inherit; 133 font-weight: inherit;
134 color: #555; 134 color: #555;
app/assets/stylesheets/main/variables.scss
@@ -5,6 +5,7 @@ $primary_color: #2FA0BB; @@ -5,6 +5,7 @@ $primary_color: #2FA0BB;
5 $link_color: #3A89A3; 5 $link_color: #3A89A3;
6 $style_color: #474D57; 6 $style_color: #474D57;
7 $bg_style_color: #2299BB; 7 $bg_style_color: #2299BB;
  8 +$list-group-active-bg: $bg_style_color;
8 $hover: #D9EDF7; 9 $hover: #D9EDF7;
9 10
10 /** 11 /**
app/assets/stylesheets/sections/admin.scss
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 * Admin area 2 * Admin area
3 * 3 *
4 */ 4 */
5 -.admin_dash { 5 +.admin-dashboard {
6 .data { 6 .data {
7 a { 7 a {
8 h1 { 8 h1 {
@@ -14,6 +14,10 @@ @@ -14,6 +14,10 @@
14 } 14 }
15 } 15 }
16 } 16 }
  17 +
  18 + .str-truncated {
  19 + max-width: 60%;
  20 + }
17 } 21 }
18 22
19 .admin-filter form { 23 .admin-filter form {
app/assets/stylesheets/sections/commits.scss
@@ -10,331 +10,6 @@ @@ -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 /** COMMIT BLOCK **/ 13 /** COMMIT BLOCK **/
339 .commit-title{ 14 .commit-title{
340 display: block; 15 display: block;
@@ -493,6 +168,25 @@ li.commit { @@ -493,6 +168,25 @@ li.commit {
493 text-decoration: underline; 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 .commit-row-info { 192 .commit-row-info {
app/assets/stylesheets/sections/dashboard.scss
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 .dash-sidebar-tabs { 41 .dash-sidebar-tabs {
42 margin-bottom: 2px; 42 margin-bottom: 2px;
43 border: none; 43 border: none;
44 - margin: 0; 44 + margin: 0 !important;
45 45
46 li { 46 li {
47 &.active { 47 &.active {
app/assets/stylesheets/sections/diff.scss 0 → 100644
@@ -0,0 +1,329 @@ @@ -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,8 +37,8 @@
37 37
38 &.event-inline { 38 &.event-inline {
39 .avatar { 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,6 +113,7 @@
113 &.commit { 113 &.commit {
114 background: transparent; 114 background: transparent;
115 padding: 3px; 115 padding: 3px;
  116 + padding-left: 0;
116 border: none; 117 border: none;
117 color: #666; 118 color: #666;
118 .commit-row-title { 119 .commit-row-title {
@@ -122,6 +123,7 @@ @@ -122,6 +123,7 @@
122 &.commits-stat { 123 &.commits-stat {
123 display: block; 124 display: block;
124 padding: 3px; 125 padding: 3px;
  126 + padding-left: 0;
125 127
126 &:hover { 128 &:hover {
127 background: none; 129 background: none;
app/assets/stylesheets/sections/groups.scss 0 → 100644
@@ -0,0 +1,9 @@ @@ -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,7 +19,7 @@ header {
19 line-height: 32px; 19 line-height: 32px;
20 padding: 6px 10px; 20 padding: 6px 10px;
21 21
22 - &:hover { 22 + &:hover, &:focus, &:active {
23 background: none; 23 background: none;
24 } 24 }
25 } 25 }
@@ -29,6 +29,64 @@ header { @@ -29,6 +29,64 @@ header {
29 float: right; 29 float: right;
30 margin-right: 0; 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,7 +108,7 @@ header {
50 108
51 h1 { 109 h1 {
52 margin: 0; 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 background-size: 32px; 112 background-size: 32px;
55 float: left; 113 float: left;
56 height: 46px; 114 height: 46px;
@@ -69,7 +127,7 @@ header { @@ -69,7 +127,7 @@ header {
69 * Project / Area name 127 * Project / Area name
70 * 128 *
71 */ 129 */
72 - .project_name { 130 + .title {
73 position: relative; 131 position: relative;
74 float: left; 132 float: left;
75 margin: 0; 133 margin: 0;
@@ -128,11 +186,14 @@ header { @@ -128,11 +186,14 @@ header {
128 background: #708090; 186 background: #708090;
129 border-bottom: 1px solid #AAA; 187 border-bottom: 1px solid #AAA;
130 188
  189 + .navbar-toggle { color: #fff; }
  190 +
131 .nav > li > a { 191 .nav > li > a {
132 color: #AAA; 192 color: #AAA;
133 text-shadow: 0 1px 0 #444; 193 text-shadow: 0 1px 0 #444;
134 194
135 - &:hover { 195 + &:hover, &:focus, &:active {
  196 + background: none;
136 color: #FFF; 197 color: #FFF;
137 } 198 }
138 } 199 }
@@ -160,18 +221,18 @@ header { @@ -160,18 +221,18 @@ header {
160 .app_logo { 221 .app_logo {
161 a { 222 a {
162 h1 { 223 h1 {
163 - background: url('logo-white.png') no-repeat center center; 224 + background: image-url('logo-white.png') no-repeat center center;
164 background-size: 32px; 225 background-size: 32px;
165 color: #fff; 226 color: #fff;
166 text-shadow: 0 1px 1px #444; 227 text-shadow: 0 1px 1px #444;
167 } 228 }
168 } 229 }
169 } 230 }
170 - .project_name { 231 + .title {
171 a { 232 a {
172 - color: #BBB; 233 + color: #FFF;
173 &:hover { 234 &:hover {
174 - color: #FFF; 235 + text-decoration: underline;
175 } 236 }
176 } 237 }
177 color: #fff; 238 color: #fff;
app/assets/stylesheets/sections/issues.scss
@@ -14,8 +14,8 @@ @@ -14,8 +14,8 @@
14 14
15 .issue-check { 15 .issue-check {
16 float: left; 16 float: left;
17 - padding: 8px 0;  
18 padding-right: 8px; 17 padding-right: 8px;
  18 + margin-bottom: 10px;
19 min-width: 15px; 19 min-width: 15px;
20 } 20 }
21 21
@@ -38,13 +38,21 @@ @@ -38,13 +38,21 @@
38 } 38 }
39 } 39 }
40 40
41 -input.check_all_issues { 41 +.check-all-holder {
  42 + height: 32px;
42 float: left; 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 .issues_content { 58 .issues_content {
@@ -57,23 +65,6 @@ input.check_all_issues { @@ -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 @media (min-width: 800px) { .issues_filters select { width: 160px; } } 68 @media (min-width: 800px) { .issues_filters select { width: 160px; } }
78 @media (min-width: 1200px) { .issues_filters select { width: 220px; } } 69 @media (min-width: 1200px) { .issues_filters select { width: 220px; } }
79 70
@@ -93,6 +84,13 @@ input.check_all_issues { @@ -93,6 +84,13 @@ input.check_all_issues {
93 .update_selected_issues { 84 .update_selected_issues {
94 margin-left: 4px; 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,3 +125,21 @@ input.check_all_issues {
127 form.edit-issue { 125 form.edit-issue {
128 margin: 0; 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,11 +6,10 @@
6 } 6 }
7 7
8 .login-box{ 8 .login-box{
9 - width: 304px; 9 + max-width: 304px;
10 position: relative; 10 position: relative;
11 @include border-radius(5px); 11 @include border-radius(5px);
12 margin: auto; 12 margin: auto;
13 - padding: 20px;  
14 background: white; 13 background: white;
15 } 14 }
16 15
@@ -23,7 +22,7 @@ @@ -23,7 +22,7 @@
23 background-color: #f1f1f1; 22 background-color: #f1f1f1;
24 font-size: 16px; 23 font-size: 16px;
25 padding: 14px 10px; 24 padding: 14px 10px;
26 - width: 280px; 25 + width: 100%;
27 height: auto; 26 height: auto;
28 27
29 &.top { 28 &.top {
app/assets/stylesheets/sections/merge_requests.scss
@@ -31,10 +31,10 @@ @@ -31,10 +31,10 @@
31 31
32 .mr_source_commit, 32 .mr_source_commit,
33 .mr_target_commit { 33 .mr_target_commit {
  34 + margin-top: 10px;
34 .commit { 35 .commit {
35 margin: 0; 36 margin: 0;
36 - padding: 0;  
37 - padding: 5px 0; 37 + padding: 2px 0;
38 list-style: none; 38 list-style: none;
39 &:hover { 39 &:hover {
40 background: none; 40 background: none;
@@ -90,15 +90,8 @@ @@ -90,15 +90,8 @@
90 padding-top: 15px; 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,9 +35,8 @@
35 width: 1%; 35 width: 1%;
36 &.active { 36 &.active {
37 a { 37 a {
38 - color: $style_color;  
39 - font-weight: bolder;  
40 - 38 + color: #333;
  39 + font-weight: bold;
41 &:after { 40 &:after {
42 content: ''; 41 content: '';
43 display: block; 42 display: block;
@@ -46,7 +45,7 @@ @@ -46,7 +45,7 @@
46 left: 50%; 45 left: 50%;
47 width: 0; 46 width: 0;
48 height: 0; 47 height: 0;
49 - border-color: transparent transparent #777 transparent; 48 + border-color: transparent transparent #333 transparent;
50 border-style: solid; 49 border-style: solid;
51 border-width: 6px; 50 border-width: 6px;
52 margin-left: -6px; 51 margin-left: -6px;
@@ -56,7 +55,20 @@ @@ -56,7 +55,20 @@
56 55
57 &:hover { 56 &:hover {
58 a { 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,7 +85,7 @@
73 a { 85 a {
74 display: block; 86 display: block;
75 text-align: center; 87 text-align: center;
76 - font-weight: normal; 88 + font-weight: 500;
77 height: 38px; 89 height: 38px;
78 line-height: 34px; 90 line-height: 34px;
79 color: #777; 91 color: #777;
@@ -83,4 +95,38 @@ @@ -83,4 +95,38 @@
83 padding-top: 2px; 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,13 +47,13 @@ ul.notes {
47 .discussion-body { 47 .discussion-body {
48 margin-left: 50px; 48 margin-left: 50px;
49 49
50 - .file, 50 + .diff-file,
51 .discussion-hidden, 51 .discussion-hidden,
52 .notes { 52 .notes {
53 @extend .borders; 53 @extend .borders;
54 background-color: #F9F9F9; 54 background-color: #F9F9F9;
55 } 55 }
56 - .file .notes { 56 + .diff-file .notes {
57 /* reset */ 57 /* reset */
58 background: inherit; 58 background: inherit;
59 border: none; 59 border: none;
@@ -87,15 +87,10 @@ ul.notes { @@ -87,15 +87,10 @@ ul.notes {
87 } 87 }
88 .attachment { 88 .attachment {
89 font-size: 14px; 89 font-size: 14px;
90 - margin-top: -20px;  
91 } 90 }
92 .note-body { 91 .note-body {
93 @include md-typography; 92 @include md-typography;
94 margin-left: 45px; 93 margin-left: 45px;
95 -  
96 - .highlight {  
97 - @include border-radius(4px);  
98 - }  
99 } 94 }
100 .note-header { 95 .note-header {
101 padding-bottom: 5px; 96 padding-bottom: 5px;
@@ -118,7 +113,7 @@ ul.notes { @@ -118,7 +113,7 @@ ul.notes {
118 } 113 }
119 } 114 }
120 115
121 -.file .notes_holder { 116 +.diff-file .notes_holder {
122 font-size: 13px; 117 font-size: 13px;
123 line-height: 18px; 118 line-height: 18px;
124 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 119 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
@@ -188,7 +183,7 @@ ul.notes { @@ -188,7 +183,7 @@ ul.notes {
188 } 183 }
189 } 184 }
190 } 185 }
191 -.file .note .note-actions { 186 +.diff-file .note .note-actions {
192 right: 0; 187 right: 0;
193 top: 0; 188 top: 0;
194 } 189 }
@@ -199,7 +194,7 @@ ul.notes { @@ -199,7 +194,7 @@ ul.notes {
199 * Line note button on the side of diffs 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 .add-diff-note { 198 .add-diff-note {
204 background: url("diff_note_add.png") no-repeat left 0; 199 background: url("diff_note_add.png") no-repeat left 0;
205 height: 22px; 200 height: 22px;
@@ -239,22 +234,25 @@ ul.notes { @@ -239,22 +234,25 @@ ul.notes {
239 .reply-btn { 234 .reply-btn {
240 @extend .btn-primary; 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 .discussion { 256 .discussion {
259 .new_note { 257 .new_note {
260 margin: 0; 258 margin: 0;
@@ -292,7 +290,7 @@ ul.notes { @@ -292,7 +290,7 @@ ul.notes {
292 box-shadow: none; 290 box-shadow: none;
293 font-size: 14px; 291 font-size: 14px;
294 height: 80px; 292 height: 80px;
295 - width: 98.6%; 293 + width: 100%;
296 } 294 }
297 } 295 }
298 } 296 }
@@ -306,6 +304,7 @@ ul.notes { @@ -306,6 +304,7 @@ ul.notes {
306 @extend .col-md-4; 304 @extend .col-md-4;
307 @extend .thumbnail; 305 @extend .thumbnail;
308 margin-left: 45px; 306 margin-left: 45px;
  307 + float: none;
309 } 308 }
310 309
311 310
@@ -341,7 +340,7 @@ ul.notes { @@ -341,7 +340,7 @@ ul.notes {
341 box-shadow: none; 340 box-shadow: none;
342 font-size: 14px; 341 font-size: 14px;
343 height: 80px; 342 height: 80px;
344 - width: 98.6%; 343 + width: 100%;
345 } 344 }
346 345
347 .form-actions { 346 .form-actions {
app/assets/stylesheets/sections/profile.scss
@@ -105,3 +105,23 @@ @@ -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,14 +123,9 @@
123 } 123 }
124 124
125 .save-project-loader { 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 ul.nav.nav-projects-tabs { 131 ul.nav.nav-projects-tabs {
app/assets/stylesheets/sections/tree.scss
@@ -127,9 +127,27 @@ @@ -127,9 +127,27 @@
127 border-top: 1px dashed #CCC; 127 border-top: 1px dashed #CCC;
128 padding-top: 10px; 128 padding-top: 10px;
129 129
130 - h4 { 130 + .readme-file-title {
131 font-size: 14px; 131 font-size: 14px;
132 margin-bottom: 20px; 132 margin-bottom: 20px;
133 color: #777; 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,7 +18,7 @@
18 .navbar-inner { 18 .navbar-inner {
19 background: #547; 19 background: #547;
20 border-bottom: 1px solid #435; 20 border-bottom: 1px solid #435;
21 - .app_logo { 21 + .app_logo, .navbar-toggle {
22 &:hover { 22 &:hover {
23 background-color: #435; 23 background-color: #435;
24 } 24 }
@@ -36,4 +36,8 @@ @@ -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,7 +18,7 @@
18 .navbar-inner { 18 .navbar-inner {
19 background: #373737; 19 background: #373737;
20 border-bottom: 1px solid #272727; 20 border-bottom: 1px solid #272727;
21 - .app_logo { 21 + .app_logo, .navbar-toggle {
22 &:hover { 22 &:hover {
23 background-color: #272727; 23 background-color: #272727;
24 } 24 }
app/assets/stylesheets/themes/ui_mars.scss
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 .navbar-inner { 18 .navbar-inner {
19 background: #474D57; 19 background: #474D57;
20 border-bottom: 1px solid #373D47; 20 border-bottom: 1px solid #373D47;
21 - .app_logo { 21 + .app_logo, .navbar-toggle {
22 &:hover { 22 &:hover {
23 background-color: #373D47; 23 background-color: #373D47;
24 } 24 }
app/assets/stylesheets/themes/ui_modern.scss
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 .navbar-inner { 18 .navbar-inner {
19 background: #345; 19 background: #345;
20 border-bottom: 1px solid #234; 20 border-bottom: 1px solid #234;
21 - .app_logo { 21 + .app_logo, .navbar-toggle {
22 &:hover { 22 &:hover {
23 background-color: #234; 23 background-color: #234;
24 } 24 }
app/contexts/base_context.rb
@@ -1,19 +0,0 @@ @@ -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,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,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,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,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,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,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,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,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,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,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,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,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,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