Commit 284546b2e00639bfa5e965f6a846cf308752d58e

Authored by Kevin Lyda
2 parents dcaedb4a d28ee0df

Merge branch 'master' into logo-white-compress

Conflicts:
	app/assets/images/logo-black.png
	app/assets/images/logo-white.png
Showing 597 changed files with 11754 additions and 5898 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 597 files displayed.

.travis.yml
1 1 language: ruby
2 2 env:
3   - - DB=mysql TRAVIS=true
  3 + global:
  4 + - DB=mysql
  5 + - TRAVIS=true
  6 + matrix:
  7 + - TASK=spinach
  8 + - TASK=spec
  9 + - TASK=jasmine:ci
4 10 before_install:
5 11 - sudo apt-get install libicu-dev -y
6   - - gem install charlock_holmes -v="0.6.9"
7 12 branches:
8 13 only:
9 14 - 'master'
... ... @@ -11,8 +16,12 @@ rvm:
11 16 - 2.0.0
12 17 services:
13 18 - mysql
14   - - postgresql
  19 + - redis-server
15 20 before_script:
16 21 - "cp config/database.yml.$DB config/database.yml"
17 22 - "cp config/gitlab.yml.example config/gitlab.yml"
18   -script: "bundle exec rake gitlab:test --trace"
  23 + - "bundle exec rake db:setup"
  24 + - "bundle exec rake db:seed_fu"
  25 +script: "bundle exec rake $TASK --trace"
  26 +notifications:
  27 + email: false
... ...
CHANGELOG
  1 +v 6.5.0
  2 + - Dropdown menus on issue#show page for assignee and milestone (Jason Blanchard)
  3 + - Add color custimization and previewing to broadcast messages
  4 + - Fixed notes anchors
  5 + - Load new comments in issues dynamically
  6 + - Added sort options to Public page
  7 + - Added new filters(assigned/authored/all) to Dashboard#issues, Dashboard#merge_request pages
  8 + - Add project visibility icons to dashboard
  9 + - Enable secure cookies if https used
  10 + - Protect users/confirmation with rack_attack
  11 + - Default HTTP headers to protect against MIME-sniffing, force https if enabled
  12 +
  13 +v6.4.3
  14 + - Don't use unicorn worker killer if PhusionPassenger is defined
  15 +
  16 +v6.4.2
  17 + - Fixed wrong behaviour of script/upgrade.rb
  18 +
  19 +v6.4.1
  20 + - Fixed bug with repository rename
  21 + - Fixed bug with project transfer
  22 +
  23 +v 6.4.0
  24 + - Added sorting to project issues page (Jason Blanchard)
  25 + - Assembla integration (Carlos Paramio)
  26 + - Fixed another 500 error with submodules
  27 + - UI: More compact issues page
  28 + - Minimal password length increased to 8 symbols
  29 + - Side-by-side diff view (Steven Thonus)
  30 + - Internal projects (Jason Hollingsworth)
  31 + - Allow removal of avatar (Drew Blessing)
  32 + - Project web hooks now support issues and merge request events
  33 + - Visiting project page while not logged in will redirect to sign-in instead of 404 (Jason Hollingsworth)
  34 + - Expire event cache on avatar creation/removal (Drew Blessing)
  35 + - Archiving old projects (Steven Thonus)
  36 + - Rails 4
  37 + - Add time ago tooltips to show actual date/time
  38 + - UI: Fixed UI for admin system hooks
  39 + - Ruby script for easier GitLab upgrade
  40 + - Do not remove Merge requests if fork project was removed
  41 + - Improve sign-in/signup UX
  42 + - Add resend confirmation link to sign-in page
  43 + - Set noreply@HOSTNAME for reply_to field in all emails
  44 + - Show GitLab API version on Admin#dashboard
  45 + - API Cross-origin resource sharing
  46 + - Show READMe link at project home page
  47 + - Show repo size for projects in Admin area
  48 +
1 49 v 6.3.0
2 50 - API for adding gitlab-ci service
3 51 - Init script now waits for pids to appear after (re)starting before reporting status (Rovanion Luckey)
4 52 - Restyle project home page
5 53 - Grammar fixes
6 54 - Show branches list (which branches contains commit) on commit page (Andrew Kumanyaev)
  55 + - Security improvements
  56 + - Added support for GitLab CI 4.0
  57 + - Fixed issue with 500 error when group did not exist
  58 + - Ability to leave project
  59 + - You can create file in repo using UI
  60 + - You can remove file from repo using UI
  61 + - API: dropped default_branch attribute from project during creation
  62 + - Project default_branch is not stored in db any more. It takes from repo now.
  63 + - Admin broadcast messages
  64 + - UI improvements
  65 + - Dont show last push widget if user removed this branch
  66 + - Fix 500 error for repos with newline in file name
  67 + - Extended html titles
  68 + - API: create/update/delete repo files
  69 + - Admin can transfer project to any namespace
  70 + - API: projects/all for admin users
  71 + - Fix recent branches order
  72 +
  73 +v 6.2.4
  74 + - Security: Cast API private_token to string (CVE-2013-4580)
  75 + - Security: Require gitlab-shell 1.7.8 (CVE-2013-4581, CVE-2013-4582, CVE-2013-4583)
  76 + - Fix for Git SSH access for LDAP users
  77 +
  78 +v 6.2.3
  79 + - Security: More protection against CVE-2013-4489
  80 + - Security: Require gitlab-shell 1.7.4 (CVE-2013-4490, CVE-2013-4546)
  81 + - Fix sidekiq rake tasks
  82 +
  83 +v 6.2.2
  84 + - Security: Update gitlab_git (CVE-2013-4489)
  85 +
  86 +v 6.2.1
  87 + - Security: Fix issue with generated passwords for new users
7 88  
8 89 v 6.2.0
9 90 - Public project pages are now visible to everyone (files, issues, wik, etc.)
... ... @@ -25,7 +106,7 @@ v 6.2.0
25 106 - Avatar upload on profile page with a maximum of 100KB (Steven Thonus)
26 107 - Store the sessions in Redis instead of the cookie store
27 108 - Fixed relative links in markdown
28   - - User must confirm his email if signup enabled
  109 + - User must confirm their email if signup enabled
29 110 - User must confirm changed email
30 111  
31 112 v 6.1.0
... ... @@ -47,7 +128,7 @@ v 6.1.0
47 128 - Add links to create branch/tag from project home page
48 129 - Add public-project? checkbox to new-project view
49 130 - Improved compare page. Added link to proceed into Merge Request
50   - - Send email to user when he was added to group
  131 + - Send an email to a user when they are added to group
51 132 - New landing page when you have 0 projects
52 133  
53 134 v 6.0.0
... ... @@ -90,6 +171,14 @@ v 6.0.0
90 171 - Improved MR comments logic
91 172 - Render readme file for projects in public area
92 173  
  174 +v 5.4.2
  175 + - Security: Cast API private_token to string (CVE-2013-4580)
  176 + - Security: Require gitlab-shell 1.7.8 (CVE-2013-4581, CVE-2013-4582, CVE-2013-4583)
  177 +
  178 +v 5.4.1
  179 + - Security: Fixes for CVE-2013-4489
  180 + - Security: Require gitlab-shell 1.7.4 (CVE-2013-4490, CVE-2013-4546)
  181 +
93 182 v 5.4.0
94 183 - Ability to edit own comments
95 184 - Documentation improvements
... ...
CONTRIBUTING.md
1 1 # Contribute to GitLab
2 2  
3   -This guide details how to use issues and pull requests to improve GitLab.
4   -
5   -- [Closing policy for issues and pull requests](#closing-policy-for-issues-and-pull-requests)
6   -- [Issue tracker](#issue-tracker)
7   -- [Pull requests](#pull-requests)
8   -- [Security vulnerabilities](#security-vulnerabilities)
  3 +This guide details how contribute to GitLab.
9 4  
10 5 If you want to know how the GitLab team handles contributions have a look at [the GitLab contributing process](PROCESS.md).
11 6  
12   -## Closing policy for issues and pull requests
  7 +## Contributor license agreement
  8 +
  9 +By submitting code as an individual you agree to the [individual contributor license agreement](doc/legal/individual_contributor_license_agreement.md). By submitting code as an entity you agree to the [corporate contributor license agreement](doc/legal/corporate_contributor_license_agreement.md).
  10 +
  11 +## Security vulnerability disclosure
  12 +
  13 +Please report suspected security vulnerabilities in private to support@gitlab.com, also see the [disclosure section on the GitLab.com website](http://www.gitlab.com/disclosure/). Please do NOT create publicly viewable issues for suspected security vulnerabilities.
13 14  
14   -GitLab is a popular open source project and the capacity to deal with issues and pull requests is limited. Out of respect for our volunteers, issues and pull requests not in line with the guidelines listed in this document may be closed without notice.
  15 +## Closing policy for issues and merge requests
  16 +
  17 +GitLab is a popular open source project and the capacity to deal with issues and merge requests is limited. Out of respect for our volunteers, issues and merge requests not in line with the guidelines listed in this document may be closed without notice.
15 18  
16 19 Please treat our volunteers with courtesy and respect, it will go a long way towards getting your issue resolved.
17 20  
18   -Issues and pull requests should be in English and contain appropriate language for audiences of all ages.
  21 +Issues and merge requests should be in English and contain appropriate language for audiences of all ages.
19 22  
20 23 ## Issue tracker
21 24  
22   -To get support for your particular problem please use the channels as detailed in [the getting help section of the readme](https://github.com/gitlabhq/gitlabhq#getting-help). Professional [support subscriptions](http://www.gitlab.com/subscription/) and [consulting services](http://www.gitlab.com/consultancy/) are available from [GitLab.com](http://www.gitlab.com/).
  25 +To get support for your particular problem please use the channels as detailed in the getting help section of [the readme](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/README.md). Professional [support subscriptions](http://www.gitlab.com/subscription/) and [consulting services](http://www.gitlab.com/consultancy/) are available from [GitLab.com](http://www.gitlab.com/).
23 26  
24   -The [issue tracker](https://github.com/gitlabhq/gitlabhq/issues) is only for obvious bugs or misbehavior in the latest [stable or development release of GitLab](MAINTENANCE.md). When submitting an issue please conform to the issue submission guidelines listed below. Not all issues will be addressed and your issue is more likely to be addressed if you submit a pull request which partially or fully addresses the issue.
  27 +The [issue tracker](https://gitlab.com/gitlab-org/gitlab-ce/issues) is only for obvious bugs or misbehavior in the latest [stable or development release of GitLab](MAINTENANCE.md). When submitting an issue please conform to the issue submission guidelines listed below. Not all issues will be addressed and your issue is more likely to be addressed if you submit a merge request which partially or fully addresses the issue.
25 28  
26 29 Do not use the issue tracker for feature requests. We have a specific [feedback and suggestions forum](http://feedback.gitlab.com) for this purpose.
27 30  
28   -Please send a pull request with a tested solution or a pull request with a failing test instead of opening an issue if you can. If you're unsure where to post, post to the [mailing list](https://groups.google.com/forum/#!forum/gitlabhq) or [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) first. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there.
  31 +Please send a merge request with a tested solution or a merge request with a failing test instead of opening an issue if you can. If you're unsure where to post, post to the [mailing list](https://groups.google.com/forum/#!forum/gitlabhq) or [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) first. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there.
29 32  
30 33 ### Issue tracker guidelines
31 34  
32   -**[Search](https://github.com/gitlabhq/gitlabhq/search?q=&ref=cmdform&type=Issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format (as the first post):
  35 +**[Search the issues](https://gitlab.com/gitlab-org/gitlab-ce/issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format (as the first post):
33 36  
34 37 1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen)
35   -2. **Steps to reproduce:** How can we reproduce the issue, preferably on the [GitLab Vagrant virtual machine](https://github.com/gitlabhq/gitlab-vagrant-vm) (start with: `vagrant destroy && vagrant up && vagrant ssh`)
  38 +2. **Steps to reproduce:** How can we reproduce the issue, preferably on the [GitLab development virtual machine with vagrant](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/doc/development.md) (start your issue with: `vagrant destroy && vagrant up && vagrant ssh`)
36 39 3. **Expected behavior:** Describe your issue in detail
37 40 4. **Observed behavior**
38 41 5. **Relevant logs and/or screenshots:** Please use code blocks (\`\`\`) to format console output, logs, and code as it's very hard to read otherwise.
... ... @@ -43,37 +46,37 @@ Please send a pull request with a tested solution or a pull request with a faili
43 46 * Describe your setup (use relevant parts from `sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production`)
44 47 7. **Possible fixes**: If you can, link to the line of code that might be responsible for the problem
45 48  
46   -## Pull requests
  49 +## Merge requests
47 50  
48   -We welcome pull requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a pull request for are listed with the [status 'accepting merge/pull 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/merge requests' on our feedback forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome.
49 52  
50   -### Pull request guidelines
  53 +### Merge request guidelines
51 54  
52   -If you can, please submit a pull request with the fix or improvements including tests. If you don't know how to fix the issue but can write a test that exposes the issue we will accept that as well. In general bug fixes that include a regression test are merged quickly while new features without proper tests are least likely to receive timely feedback. The workflow to make a pull request is as follows:
  55 +If you can, please submit a merge request with the fix or improvements including tests. If you don't know how to fix the issue but can write a test that exposes the issue we will accept that as well. In general bug fixes that include a regression test are merged quickly while new features without proper tests are least likely to receive timely feedback. The workflow to make a merge request is as follows:
53 56  
54   -1. Fork the project on GitHub
  57 +1. Fork the project on GitLab Cloud
55 58 1. Create a feature branch
56 59 1. Write [tests](README.md#run-the-tests) and code
57 60 1. Add your changes to the [CHANGELOG](CHANGELOG)
58 61 1. If you have multiple commits please combine them into one commit by [squashing them](http://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)
59 62 1. Push the commit to your fork
60   -1. Submit a pull request
61   -2. [Search for issues](https://github.com/gitlabhq/gitlabhq/search?q=&ref=cmdform&type=Issues) related to your pull request and mention them in the pull request description
  63 +1. Submit a merge request (MR)
  64 +1. The MR title should describes the change you want to make
  65 +1. The MR description should give a motive for your change and the method you used to achieve it
  66 +* If the MR changes the UI it should include before and after screenshots
  67 +1. [Search for issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) related to your merge request and mention them in the merge request description
  68 +
  69 +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.
62 70  
63   -We will accept pull requests if:
  71 +We will accept merge requests if:
64 72  
65 73 * The code has proper tests and all tests pass (or it is a test exposing a failure in existing code)
66 74 * It can be merged without problems (if not please use: `git rebase master`)
67 75 * It does not break any existing functionality
68 76 * It's quality code that 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
69   -* The description includes a motive for your change and the method you used to achieve it
70   -* It is not a catch all pull request but rather fixes a specific issue or implements a specific feature
  77 +* It is not a catch all merge request but rather fixes a specific issue or implements a specific feature
71 78 * It keeps the GitLab code base clean and well structured
72 79 * We think other users will benefit from the same functionality
73   -* If it makes changes to the UI the pull request should include screenshots
74 80 * It is a single commit (please use `git rebase -i` to squash commits)
75 81  
76   -For examples of feedback on pull requests please look at already [closed pull requests](https://github.com/gitlabhq/gitlabhq/pulls?direction=desc&page=1&sort=created&state=closed).
77   -
78   -## Security vulnerabilities
79   -Please report security vulnerabilities in private to support@gitlab.com; also see http://www.gitlab.com/disclosure/. Do NOT create GitHub issues for security vulnerabilities.
  82 +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).
... ...
Gemfile
... ... @@ -8,15 +8,21 @@ def linux_only(require_as)
8 8 RUBY_PLATFORM.include?('linux') && require_as
9 9 end
10 10  
11   -gem "rails", "3.2.15"
  11 +gem "rails", "~> 4.0.0"
  12 +
  13 +gem "protected_attributes"
  14 +gem 'rails-observers'
  15 +gem 'actionpack-page_caching'
  16 +gem 'actionpack-action_caching'
  17 +gem 'activerecord-deprecated_finders'
12 18  
13 19 # Supported DBs
14 20 gem "mysql2", group: :mysql
15 21 gem "pg", group: :postgres
16 22  
17 23 # Auth
18   -gem "devise", '~> 2.2'
19   -gem "devise-async"
  24 +gem "devise", '3.0.4'
  25 +gem "devise-async", '0.8.0'
20 26 gem 'omniauth', "~> 1.1.3"
21 27 gem 'omniauth-google-oauth2'
22 28 gem 'omniauth-twitter'
... ... @@ -24,26 +30,27 @@ gem 'omniauth-github'
24 30  
25 31 # Extracting information from a git repository
26 32 # Provide access to Gitlab::Git library
27   -gem "gitlab_git", "~> 3.0.0.rc1"
  33 +gem "gitlab_git", "~> 4.0.0"
28 34  
29 35 # Ruby/Rack Git Smart-HTTP Server Handler
30   -gem 'gitlab-grack', '~> 1.0.1', require: 'grack'
  36 +gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack'
31 37  
32 38 # LDAP Auth
33 39 gem 'gitlab_omniauth-ldap', '1.0.3', require: "omniauth-ldap"
34 40  
35 41 # Syntax highlighter
36   -gem "gitlab-pygments.rb", '~> 0.3.2', require: 'pygments.rb'
  42 +gem "gitlab-pygments.rb", '~> 0.5.4', require: 'pygments.rb'
37 43  
38 44 # Git Wiki
39   -gem "gitlab-gollum-lib", "~> 1.0.1", require: 'gollum-lib'
  45 +gem "gitlab-gollum-lib", "~> 1.0.2", require: 'gollum-lib'
40 46  
41 47 # Language detection
42   -gem "github-linguist", require: "linguist"
  48 +gem "gitlab-linguist", "~> 2.9.6", require: "linguist"
43 49  
44 50 # API
45   -gem "grape", "~> 0.4.1"
  51 +gem "grape", "~> 0.6.1"
46 52 gem "grape-entity", "~> 0.3.0"
  53 +gem 'rack-cors', require: 'rack/cors'
47 54  
48 55 # Format dates and times
49 56 # based on human-friendly examples
... ... @@ -72,13 +79,16 @@ gem "seed-fu"
72 79  
73 80 # Markdown to HTML
74 81 gem "redcarpet", "~> 2.2.2"
75   -gem "github-markup", "~> 0.7.4", require: 'github/markup'
  82 +gem "github-markup", "~> 0.7.4", require: 'github/markup', git: 'https://github.com/gitlabhq/markup.git', ref: '61ade389c1e1c159359338f570d18464a44ddbc4'
76 83  
77 84 # Asciidoc to HTML
78 85 gem "asciidoctor"
79 86  
80 87 # Application server
81   -gem "unicorn", '~> 4.6.3', group: :unicorn
  88 +group :unicorn do
  89 + gem "unicorn", '~> 4.6.3'
  90 + gem 'unicorn-worker-killer'
  91 +end
82 92  
83 93 # State machine
84 94 gem "state_machine"
... ... @@ -127,26 +137,24 @@ gem "sanitize"
127 137 # Protect against bruteforcing
128 138 gem "rack-attack"
129 139  
130   -group :assets do
131   - gem "sass-rails"
132   - gem "coffee-rails"
133   - gem "uglifier"
134   - gem "therubyracer"
135   - gem 'turbolinks'
136   - gem 'jquery-turbolinks'
137   -
138   - gem 'chosen-rails', "1.0.0"
139   - gem 'select2-rails'
140   - gem 'jquery-atwho-rails', "0.3.0"
141   - gem "jquery-rails", "2.1.3"
142   - gem "jquery-ui-rails", "2.0.2"
143   - gem "modernizr", "2.6.2"
144   - gem "raphael-rails", "~> 2.1.2"
145   - gem 'bootstrap-sass'
146   - gem "font-awesome-rails"
147   - gem "gemoji", "~> 1.2.1", require: 'emoji/railtie'
148   - gem "gon"
149   -end
  140 +gem "sass-rails"
  141 +gem "coffee-rails"
  142 +gem "uglifier"
  143 +gem "therubyracer"
  144 +gem 'turbolinks'
  145 +gem 'jquery-turbolinks'
  146 +
  147 +gem 'chosen-rails', "1.0.1"
  148 +gem 'select2-rails'
  149 +gem 'jquery-atwho-rails', "~> 0.3.3"
  150 +gem "jquery-rails", "2.1.3"
  151 +gem "jquery-ui-rails", "2.0.2"
  152 +gem "modernizr", "2.6.2"
  153 +gem "raphael-rails", "~> 2.1.2"
  154 +gem 'bootstrap-sass', '~> 3.0'
  155 +gem "font-awesome-rails", '~> 3.2'
  156 +gem "gemoji", "~> 1.3.0"
  157 +gem "gon", '~> 5.0.0'
150 158  
151 159 group :development do
152 160 gem "annotate", "~> 2.6.0.beta2"
... ... @@ -169,7 +177,7 @@ end
169 177  
170 178 group :development, :test do
171 179 gem 'coveralls', require: false
172   - gem 'rails-dev-tweaks'
  180 + # gem 'rails-dev-tweaks'
173 181 gem 'spinach-rails'
174 182 gem "rspec-rails"
175 183 gem "capybara"
... ... @@ -198,7 +206,7 @@ group :development, :test do
198 206 gem 'poltergeist', '~> 1.4.1'
199 207  
200 208 gem 'spork', '~> 1.0rc'
201   - gem 'jasmine'
  209 + gem 'jasmine', '2.0.0.rc5'
202 210 end
203 211  
204 212 group :test do
... ...
Gemfile.lock
  1 +GIT
  2 + remote: https://github.com/gitlabhq/markup.git
  3 + revision: 61ade389c1e1c159359338f570d18464a44ddbc4
  4 + ref: 61ade389c1e1c159359338f570d18464a44ddbc4
  5 + specs:
  6 + github-markup (0.7.6)
  7 +
1 8 GEM
2 9 remote: https://rubygems.org/
3 10 specs:
4   - actionmailer (3.2.15)
5   - actionpack (= 3.2.15)
  11 + actionmailer (4.0.2)
  12 + actionpack (= 4.0.2)
6 13 mail (~> 2.5.4)
7   - actionpack (3.2.15)
8   - activemodel (= 3.2.15)
9   - activesupport (= 3.2.15)
10   - builder (~> 3.0.0)
  14 + actionpack (4.0.2)
  15 + activesupport (= 4.0.2)
  16 + builder (~> 3.1.0)
11 17 erubis (~> 2.7.0)
12   - journey (~> 1.0.4)
13   - rack (~> 1.4.5)
14   - rack-cache (~> 1.2)
15   - rack-test (~> 0.6.1)
16   - sprockets (~> 2.2.1)
17   - activemodel (3.2.15)
18   - activesupport (= 3.2.15)
19   - builder (~> 3.0.0)
20   - activerecord (3.2.15)
21   - activemodel (= 3.2.15)
22   - activesupport (= 3.2.15)
23   - arel (~> 3.0.2)
24   - tzinfo (~> 0.3.29)
25   - activeresource (3.2.15)
26   - activemodel (= 3.2.15)
27   - activesupport (= 3.2.15)
28   - activesupport (3.2.15)
  18 + rack (~> 1.5.2)
  19 + rack-test (~> 0.6.2)
  20 + actionpack-action_caching (1.1.0)
  21 + actionpack (>= 4.0.0, < 5.0)
  22 + actionpack-page_caching (1.0.2)
  23 + actionpack (>= 4.0.0, < 5)
  24 + activemodel (4.0.2)
  25 + activesupport (= 4.0.2)
  26 + builder (~> 3.1.0)
  27 + activerecord (4.0.2)
  28 + activemodel (= 4.0.2)
  29 + activerecord-deprecated_finders (~> 1.0.2)
  30 + activesupport (= 4.0.2)
  31 + arel (~> 4.0.0)
  32 + activerecord-deprecated_finders (1.0.3)
  33 + activesupport (4.0.2)
29 34 i18n (~> 0.6, >= 0.6.4)
30   - multi_json (~> 1.0)
  35 + minitest (~> 4.2)
  36 + multi_json (~> 1.3)
  37 + thread_safe (~> 0.1)
  38 + tzinfo (~> 0.3.37)
31 39 acts-as-taggable-on (2.4.1)
32 40 rails (>= 3, < 5)
33   - addressable (2.3.4)
34   - annotate (2.6.0.beta2)
  41 + addressable (2.3.5)
  42 + annotate (2.6.0)
35 43 activerecord (>= 2.3.0)
36 44 rake (>= 0.8.7)
37   - arel (3.0.2)
38   - asciidoctor (0.1.3)
  45 + arel (4.0.1)
  46 + asciidoctor (0.1.4)
  47 + atomic (1.1.14)
39 48 awesome_print (1.2.0)
40   - backports (3.3.2)
41   - bcrypt-ruby (3.1.1)
  49 + axiom-types (0.0.5)
  50 + descendants_tracker (~> 0.0.1)
  51 + ice_nine (~> 0.9)
  52 + bcrypt-ruby (3.1.2)
42 53 better_errors (1.0.1)
43 54 coderay (>= 1.0.0)
44 55 erubis (>= 2.6.6)
45 56 binding_of_caller (0.7.2)
46 57 debug_inspector (>= 0.0.1)
47   - bootstrap-sass (2.3.2.2)
  58 + bootstrap-sass (3.0.3.0)
48 59 sass (~> 3.2)
49   - builder (3.0.4)
  60 + builder (3.1.4)
50 61 capybara (2.1.0)
51 62 mime-types (>= 1.16)
52 63 nokogiri (>= 1.3.3)
53 64 rack (>= 1.0.0)
54 65 rack-test (>= 0.5.4)
55 66 xpath (~> 2.0)
56   - carrierwave (0.8.0)
  67 + carrierwave (0.9.0)
57 68 activemodel (>= 3.2.0)
58 69 activesupport (>= 3.2.0)
59   - celluloid (0.14.1)
60   - timers (>= 1.0.0)
  70 + json (>= 1.7)
  71 + celluloid (0.15.2)
  72 + timers (~> 1.1.0)
61 73 charlock_holmes (0.6.9.4)
62   - childprocess (0.3.9)
63   - ffi (~> 1.0, >= 1.0.11)
64   - chosen-rails (1.0.0)
  74 + chosen-rails (1.0.1)
65 75 coffee-rails (>= 3.2)
66 76 compass-rails (>= 1.0)
67 77 railties (>= 3.0)
68 78 sass-rails (>= 3.2)
69   - chunky_png (1.2.8)
70   - cliver (0.2.1)
  79 + chunky_png (1.2.9)
  80 + cliver (0.2.2)
71 81 code_analyzer (0.4.3)
72 82 sexp_processor
73   - coderay (1.0.9)
74   - coffee-rails (3.2.2)
  83 + coderay (1.1.0)
  84 + coercible (1.0.0)
  85 + descendants_tracker (~> 0.0.1)
  86 + coffee-rails (4.0.1)
75 87 coffee-script (>= 2.2.0)
76   - railties (~> 3.2.0)
  88 + railties (>= 4.0.0, < 5.0)
77 89 coffee-script (2.2.0)
78 90 coffee-script-source
79 91 execjs
80   - coffee-script-source (1.6.2)
  92 + coffee-script-source (1.6.3)
81 93 colored (1.2)
82 94 colorize (0.5.8)
83 95 compass (0.12.2)
84 96 chunky_png (~> 1.2)
85 97 fssm (>= 0.2.7)
86 98 sass (~> 3.1)
87   - compass-rails (1.0.3)
88   - compass (>= 0.12.2, < 0.14)
89   - connection_pool (1.1.0)
  99 + compass-rails (1.1.1)
  100 + compass (>= 0.12.2)
  101 + connection_pool (1.2.0)
90 102 coveralls (0.7.0)
91 103 multi_json (~> 1.3)
92 104 rest-client
93 105 simplecov (>= 0.7)
94 106 term-ansicolor
95 107 thor
96   - crack (0.4.0)
  108 + crack (0.4.1)
97 109 safe_yaml (~> 0.9.0)
98 110 d3_rails (3.1.10)
99 111 railties (>= 3.1.0)
100 112 daemons (1.1.9)
101   - database_cleaner (1.1.1)
  113 + database_cleaner (1.2.0)
102 114 debug_inspector (0.0.2)
103   - descendants_tracker (0.0.1)
104   - devise (2.2.5)
  115 + descendants_tracker (0.0.3)
  116 + devise (3.0.4)
105 117 bcrypt-ruby (~> 3.0)
106 118 orm_adapter (~> 0.1)
107   - railties (~> 3.1)
108   - warden (~> 1.2.1)
  119 + railties (>= 3.2.6, < 5)
  120 + warden (~> 1.2.3)
109 121 devise-async (0.8.0)
110 122 devise (>= 2.2, < 3.2)
111   - diff-lcs (1.2.4)
112   - dotenv (0.8.0)
113   - email_spec (1.4.0)
  123 + diff-lcs (1.2.5)
  124 + docile (1.1.1)
  125 + dotenv (0.9.0)
  126 + email_spec (1.5.0)
114 127 launchy (~> 2.1)
115 128 mail (~> 2.2)
116   - enumerize (0.6.1)
  129 + enumerize (0.7.0)
117 130 activesupport (>= 3.2)
  131 + equalizer (0.0.8)
118 132 erubis (2.7.0)
119 133 escape_utils (0.2.4)
120 134 eventmachine (1.0.3)
121 135 excon (0.13.4)
122   - execjs (1.4.0)
123   - multi_json (~> 1.0)
124   - factory_girl (4.2.0)
  136 + execjs (2.0.2)
  137 + factory_girl (4.3.0)
125 138 activesupport (>= 3.0.0)
126   - factory_girl_rails (4.2.1)
127   - factory_girl (~> 4.2.0)
  139 + factory_girl_rails (4.3.0)
  140 + factory_girl (~> 4.3.0)
128 141 railties (>= 3.0.0)
129   - faraday (0.8.7)
130   - multipart-post (~> 1.1)
  142 + faraday (0.8.8)
  143 + multipart-post (~> 1.2.0)
131 144 faraday_middleware (0.9.0)
132 145 faraday (>= 0.7.4, < 0.9)
133   - ffaker (1.18.0)
134   - ffi (1.9.0)
  146 + ffaker (1.22.1)
  147 + ffi (1.9.3)
135 148 fog (1.3.1)
136 149 builder
137 150 excon (~> 0.13.0)
... ... @@ -149,50 +162,51 @@ GEM
149 162 thor (>= 0.13.6)
150 163 formatador (0.2.4)
151 164 fssm (0.2.10)
152   - gemoji (1.2.1)
153   - gherkin-ruby (0.3.0)
154   - github-linguist (2.3.4)
155   - charlock_holmes (~> 0.6.6)
156   - escape_utils (~> 0.2.3)
157   - mime-types (~> 1.19)
158   - pygments.rb (>= 0.2.13)
159   - github-markdown (0.5.3)
160   - github-markup (0.7.5)
  165 + gemoji (1.3.1)
  166 + gherkin-ruby (0.3.1)
  167 + racc
  168 + github-markdown (0.5.5)
161 169 gitlab-flowdock-git-hook (0.4.2.2)
162 170 gitlab-grit (>= 2.4.1)
163 171 multi_json
164   - gitlab-gollum-lib (1.0.1)
  172 + gitlab-gollum-lib (1.0.2)
165 173 github-markdown (~> 0.5.3)
166 174 github-markup (>= 0.7.5, < 1.0.0)
167   - gitlab-grit (>= 2.5.1)
  175 + gitlab-grit (~> 2.6.1)
  176 + gitlab-pygments.rb (~> 0.5.4)
168 177 nokogiri (~> 1.5.9)
169   - pygments.rb (~> 0.4.2)
170 178 sanitize (~> 2.0.3)
171 179 stringex (~> 1.5.1)
172   - gitlab-grack (1.0.1)
173   - rack (~> 1.4.1)
174   - gitlab-grit (2.6.0)
  180 + gitlab-grack (2.0.0.pre)
  181 + rack (~> 1.5.1)
  182 + gitlab-grit (2.6.3)
175 183 charlock_holmes (~> 0.6.9)
176 184 diff-lcs (~> 1.1)
177 185 mime-types (~> 1.15)
178 186 posix-spawn (~> 0.3.6)
179   - gitlab-pygments.rb (0.3.2)
  187 + gitlab-linguist (2.9.6)
  188 + charlock_holmes (~> 0.6.6)
  189 + escape_utils (~> 0.2.4)
  190 + gitlab-pygments.rb (~> 0.5.4)
  191 + mime-types (~> 1.19)
  192 + gitlab-pygments.rb (0.5.4)
180 193 posix-spawn (~> 0.3.6)
181 194 yajl-ruby (~> 1.1.0)
182   - gitlab_git (3.0.0.rc1)
183   - activesupport (~> 3.2.13)
184   - github-linguist (~> 2.3.4)
185   - gitlab-grit (~> 2.6.0)
  195 + gitlab_git (4.0.0)
  196 + activesupport (~> 4.0.0)
  197 + gitlab-grit (~> 2.6.1)
  198 + gitlab-linguist (~> 2.9.5)
  199 + gitlab-pygments.rb (~> 0.5.4)
186 200 gitlab_meta (6.0)
187 201 gitlab_omniauth-ldap (1.0.3)
188 202 net-ldap (~> 0.3.1)
189 203 omniauth (~> 1.0)
190 204 pyu-ruby-sasl (~> 0.0.3.1)
191 205 rubyntlm (~> 0.1.1)
192   - gon (4.1.1)
  206 + gon (5.0.1)
193 207 actionpack (>= 2.3.0)
194 208 json
195   - grape (0.4.1)
  209 + grape (0.6.1)
196 210 activesupport
197 211 builder
198 212 hashie (>= 1.2.0)
... ... @@ -201,91 +215,91 @@ GEM
201 215 rack (>= 1.3.0)
202 216 rack-accept
203 217 rack-mount
204   - virtus
  218 + virtus (>= 1.0.0)
205 219 grape-entity (0.3.0)
206 220 activesupport
207 221 multi_json (>= 1.3.2)
208 222 growl (1.0.3)
209   - guard (1.8.1)
  223 + guard (2.2.4)
210 224 formatador (>= 0.2.4)
211   - listen (>= 1.0.0)
212   - lumberjack (>= 1.0.2)
213   - pry (>= 0.9.10)
214   - thor (>= 0.14.6)
215   - guard-rspec (3.0.2)
216   - guard (>= 1.8)
217   - rspec (~> 2.13)
  225 + listen (~> 2.1)
  226 + lumberjack (~> 1.0)
  227 + pry (>= 0.9.12)
  228 + thor (>= 0.18.1)
  229 + guard-rspec (4.2.0)
  230 + guard (>= 2.1.1)
  231 + rspec (>= 2.14, < 4.0)
218 232 guard-spinach (0.0.2)
219 233 guard (>= 1.1)
220 234 spinach
221   - haml (4.0.3)
  235 + haml (4.0.4)
222 236 tilt
223   - haml-rails (0.4)
224   - actionpack (>= 3.1, < 4.1)
225   - activesupport (>= 3.1, < 4.1)
226   - haml (>= 3.1, < 4.1)
227   - railties (>= 3.1, < 4.1)
228   - hashie (1.2.0)
  237 + haml-rails (0.5.1)
  238 + actionpack (~> 4.0.0)
  239 + activesupport (~> 4.0.0)
  240 + haml (>= 3.1, < 5.0)
  241 + railties (~> 4.0.0)
  242 + hashie (2.0.5)
229 243 hike (1.2.3)
230 244 hipchat (0.9.0)
231 245 httparty
232 246 httparty
233 247 http_parser.rb (0.5.3)
234   - httparty (0.11.0)
235   - multi_json (~> 1.0)
  248 + httparty (0.12.0)
  249 + json (~> 1.8)
236 250 multi_xml (>= 0.5.2)
237 251 httpauth (0.2.0)
238   - i18n (0.6.5)
239   - jasmine (1.3.2)
240   - jasmine-core (~> 1.3.1)
241   - rack (~> 1.0)
242   - rspec (>= 1.3.1)
243   - selenium-webdriver (>= 0.1.3)
244   - jasmine-core (1.3.1)
245   - journey (1.0.4)
246   - jquery-atwho-rails (0.3.0)
  252 + i18n (0.6.9)
  253 + ice_nine (0.10.0)
  254 + jasmine (2.0.0.rc5)
  255 + jasmine-core (~> 2.0.0.rc5)
  256 + phantomjs
  257 + rack (>= 1.2.1)
  258 + rake
  259 + jasmine-core (2.0.0.rc5)
  260 + jquery-atwho-rails (0.3.3)
247 261 jquery-rails (2.1.3)
248 262 railties (>= 3.1.0, < 5.0)
249 263 thor (~> 0.14)
250   - jquery-turbolinks (1.0.0)
  264 + jquery-turbolinks (2.0.1)
251 265 railties (>= 3.1.0)
252 266 turbolinks
253 267 jquery-ui-rails (2.0.2)
254 268 jquery-rails
255 269 railties (>= 3.1.0)
256   - json (1.7.7)
  270 + json (1.8.1)
257 271 jwt (0.1.8)
258 272 multi_json (>= 1.5)
259 273 kaminari (0.14.1)
260 274 actionpack (>= 3.0.0)
261 275 activesupport (>= 3.0.0)
262   - kgio (2.8.0)
263   - launchy (2.3.0)
  276 + kgio (2.8.1)
  277 + launchy (2.4.2)
264 278 addressable (~> 2.3)
265   - letter_opener (1.1.1)
  279 + letter_opener (1.1.2)
266 280 launchy (~> 2.2)
267   - libv8 (3.11.8.17)
268   - listen (1.2.2)
  281 + libv8 (3.16.14.3)
  282 + listen (2.3.1)
  283 + celluloid (>= 0.15.2)
269 284 rb-fsevent (>= 0.9.3)
270 285 rb-inotify (>= 0.9)
271   - rb-kqueue (>= 0.2)
272   - lumberjack (1.0.3)
  286 + lumberjack (1.0.4)
273 287 mail (2.5.4)
274 288 mime-types (~> 1.16)
275 289 treetop (~> 1.4.8)
276   - method_source (0.8.1)
277   - mime-types (1.25)
278   - minitest (4.7.4)
  290 + method_source (0.8.2)
  291 + mime-types (1.25.1)
  292 + minitest (4.7.5)
279 293 modernizr (2.6.2)
280 294 sprockets (~> 2.0)
281 295 multi_json (1.8.2)
282   - multi_xml (0.5.4)
  296 + multi_xml (0.5.5)
283 297 multipart-post (1.2.0)
284 298 mysql2 (0.3.11)
285 299 net-ldap (0.3.1)
286 300 net-scp (1.0.4)
287 301 net-ssh (>= 1.99.1)
288   - net-ssh (2.6.8)
  302 + net-ssh (2.7.0)
289 303 nokogiri (1.5.10)
290 304 oauth (0.4.7)
291 305 oauth2 (0.8.1)
... ... @@ -297,10 +311,10 @@ GEM
297 311 omniauth (1.1.4)
298 312 hashie (>= 1.2, < 3)
299 313 rack
300   - omniauth-github (1.1.0)
  314 + omniauth-github (1.1.1)
301 315 omniauth (~> 1.0)
302 316 omniauth-oauth2 (~> 1.1)
303   - omniauth-google-oauth2 (0.1.19)
  317 + omniauth-google-oauth2 (0.2.1)
304 318 omniauth (~> 1.0)
305 319 omniauth-oauth2
306 320 omniauth-oauth (1.0.1)
... ... @@ -309,11 +323,12 @@ GEM
309 323 omniauth-oauth2 (1.1.1)
310 324 oauth2 (~> 0.8.0)
311 325 omniauth (~> 1.0)
312   - omniauth-twitter (0.0.17)
  326 + omniauth-twitter (1.0.1)
313 327 multi_json (~> 1.3)
314 328 omniauth-oauth (~> 1.0)
315   - orm_adapter (0.4.0)
  329 + orm_adapter (0.5.0)
316 330 pg (0.15.1)
  331 + phantomjs (1.9.2.0)
317 332 poltergeist (1.4.1)
318 333 capybara (~> 2.1.0)
319 334 cliver (~> 0.2.1)
... ... @@ -321,44 +336,40 @@ GEM
321 336 websocket-driver (>= 0.2.0)
322 337 polyglot (0.3.3)
323 338 posix-spawn (0.3.6)
324   - pry (0.9.12.2)
325   - coderay (~> 1.0.5)
  339 + protected_attributes (1.0.5)
  340 + activemodel (>= 4.0.1, < 5.0)
  341 + pry (0.9.12.4)
  342 + coderay (~> 1.0)
326 343 method_source (~> 0.8)
327 344 slop (~> 3.4)
328   - pygments.rb (0.4.2)
329   - posix-spawn (~> 0.3.6)
330   - yajl-ruby (~> 1.1.0)
331 345 pyu-ruby-sasl (0.0.3.3)
332 346 quiet_assets (1.0.2)
333 347 railties (>= 3.1, < 5.0)
334   - rack (1.4.5)
  348 + racc (1.4.10)
  349 + rack (1.5.2)
335 350 rack-accept (0.4.5)
336 351 rack (>= 0.4)
337   - rack-attack (2.2.1)
  352 + rack-attack (2.3.0)
338 353 rack
339   - rack-cache (1.2)
340   - rack (>= 0.4)
  354 + rack-cors (0.2.9)
341 355 rack-mini-profiler (0.1.31)
342 356 rack (>= 1.1.3)
343 357 rack-mount (0.8.3)
344 358 rack (>= 1.0.0)
345   - rack-protection (1.5.0)
346   - rack
347   - rack-ssl (1.3.3)
  359 + rack-protection (1.5.1)
348 360 rack
349 361 rack-test (0.6.2)
350 362 rack (>= 1.0)
351   - rails (3.2.15)
352   - actionmailer (= 3.2.15)
353   - actionpack (= 3.2.15)
354   - activerecord (= 3.2.15)
355   - activeresource (= 3.2.15)
356   - activesupport (= 3.2.15)
357   - bundler (~> 1.0)
358   - railties (= 3.2.15)
359   - rails-dev-tweaks (0.6.1)
360   - actionpack (~> 3.1)
361   - railties (~> 3.1)
  363 + rails (4.0.2)
  364 + actionmailer (= 4.0.2)
  365 + actionpack (= 4.0.2)
  366 + activerecord (= 4.0.2)
  367 + activesupport (= 4.0.2)
  368 + bundler (>= 1.3.0, < 2.0)
  369 + railties (= 4.0.2)
  370 + sprockets-rails (~> 2.0.0)
  371 + rails-observers (0.1.2)
  372 + activemodel (~> 4.0)
362 373 rails_best_practices (1.14.4)
363 374 activesupport
364 375 awesome_print
... ... @@ -368,180 +379,179 @@ GEM
368 379 i18n
369 380 require_all
370 381 ruby-progressbar
371   - railties (3.2.15)
372   - actionpack (= 3.2.15)
373   - activesupport (= 3.2.15)
374   - rack-ssl (~> 1.3.2)
  382 + railties (4.0.2)
  383 + actionpack (= 4.0.2)
  384 + activesupport (= 4.0.2)
375 385 rake (>= 0.8.7)
376   - rdoc (~> 3.4)
377   - thor (>= 0.14.6, < 2.0)
378   - raindrops (0.11.0)
  386 + thor (>= 0.18.1, < 2.0)
  387 + raindrops (0.12.0)
379 388 rake (10.1.0)
380 389 raphael-rails (2.1.2)
381 390 rb-fsevent (0.9.3)
382   - rb-inotify (0.9.0)
383   - ffi (>= 0.5.0)
384   - rb-kqueue (0.2.0)
  391 + rb-inotify (0.9.2)
385 392 ffi (>= 0.5.0)
386 393 rdoc (3.12.2)
387 394 json (~> 1.4)
388 395 redcarpet (2.2.2)
389   - redis (3.0.4)
390   - redis-actionpack (3.2.4)
391   - actionpack (~> 3.2.0)
392   - redis-rack (~> 1.4.4)
393   - redis-store (~> 1.1.4)
394   - redis-activesupport (3.2.4)
395   - activesupport (~> 3.2.0)
  396 + redis (3.0.6)
  397 + redis-actionpack (4.0.0)
  398 + actionpack (~> 4)
  399 + redis-rack (~> 1.5.0)
  400 + redis-store (~> 1.1.0)
  401 + redis-activesupport (4.0.0)
  402 + activesupport (~> 4)
  403 + redis-store (~> 1.1.0)
  404 + redis-namespace (1.4.1)
  405 + redis (~> 3.0.4)
  406 + redis-rack (1.5.0)
  407 + rack (~> 1.5)
  408 + redis-store (~> 1.1.0)
  409 + redis-rails (4.0.0)
  410 + redis-actionpack (~> 4)
  411 + redis-activesupport (~> 4)
396 412 redis-store (~> 1.1.0)
397   - redis-namespace (1.3.1)
398   - redis (~> 3.0.0)
399   - redis-rack (1.4.4)
400   - rack (~> 1.4.0)
401   - redis-store (~> 1.1.4)
402   - redis-rails (3.2.4)
403   - redis-actionpack (~> 3.2.4)
404   - redis-activesupport (~> 3.2.4)
405   - redis-store (~> 1.1.4)
406 413 redis-store (1.1.4)
407 414 redis (>= 2.2)
408 415 ref (1.0.5)
409   - require_all (1.3.1)
  416 + require_all (1.3.2)
410 417 rest-client (1.6.7)
411 418 mime-types (>= 1.16)
412   - rspec (2.13.0)
413   - rspec-core (~> 2.13.0)
414   - rspec-expectations (~> 2.13.0)
415   - rspec-mocks (~> 2.13.0)
416   - rspec-core (2.13.1)
417   - rspec-expectations (2.13.0)
  419 + rspec (2.14.1)
  420 + rspec-core (~> 2.14.0)
  421 + rspec-expectations (~> 2.14.0)
  422 + rspec-mocks (~> 2.14.0)
  423 + rspec-core (2.14.7)
  424 + rspec-expectations (2.14.4)
418 425 diff-lcs (>= 1.1.3, < 2.0)
419   - rspec-mocks (2.13.1)
420   - rspec-rails (2.13.2)
  426 + rspec-mocks (2.14.4)
  427 + rspec-rails (2.14.0)
421 428 actionpack (>= 3.0)
422 429 activesupport (>= 3.0)
423 430 railties (>= 3.0)
424   - rspec-core (~> 2.13.0)
425   - rspec-expectations (~> 2.13.0)
426   - rspec-mocks (~> 2.13.0)
  431 + rspec-core (~> 2.14.0)
  432 + rspec-expectations (~> 2.14.0)
  433 + rspec-mocks (~> 2.14.0)
427 434 ruby-hmac (0.4.0)
428 435 ruby-progressbar (1.2.0)
429 436 rubyntlm (0.1.1)
430   - rubyzip (0.9.9)
431   - safe_yaml (0.9.3)
432   - sanitize (2.0.3)
433   - nokogiri (>= 1.4.4, < 1.6)
434   - sass (3.2.11)
435   - sass-rails (3.2.6)
436   - railties (~> 3.2.0)
  437 + safe_yaml (0.9.7)
  438 + sanitize (2.0.6)
  439 + nokogiri (>= 1.4.4)
  440 + sass (3.2.12)
  441 + sass-rails (4.0.1)
  442 + railties (>= 4.0.0, < 5.0)
437 443 sass (>= 3.1.10)
438   - tilt (~> 1.3)
  444 + sprockets-rails (~> 2.0.0)
439 445 sdoc (0.3.20)
440 446 json (>= 1.1.3)
441 447 rdoc (~> 3.10)
442   - seed-fu (2.2.0)
443   - activerecord (~> 3.1)
444   - activesupport (~> 3.1)
445   - select2-rails (3.4.2)
446   - sass-rails
  448 + seed-fu (2.3.0)
  449 + activerecord (>= 3.1, < 4.1)
  450 + activesupport (>= 3.1, < 4.1)
  451 + select2-rails (3.5.2)
447 452 thor (~> 0.14)
448   - selenium-webdriver (2.33.0)
449   - childprocess (>= 0.2.5)
450   - multi_json (~> 1.0)
451   - rubyzip
452   - websocket (~> 1.0.4)
453 453 settingslogic (2.0.9)
454   - sexp_processor (4.3.0)
  454 + sexp_processor (4.4.0)
455 455 shoulda-matchers (2.1.0)
456 456 activesupport (>= 3.0.0)
457   - sidekiq (2.14.0)
458   - celluloid (>= 0.14.1)
  457 + sidekiq (2.17.0)
  458 + celluloid (>= 0.15.2)
459 459 connection_pool (>= 1.0.0)
460 460 json
461 461 redis (>= 3.0.4)
462   - redis-namespace
  462 + redis-namespace (>= 1.3.1)
463 463 simple_oauth (0.1.9)
464   - simplecov (0.7.1)
465   - multi_json (~> 1.0)
466   - simplecov-html (~> 0.7.1)
467   - simplecov-html (0.7.1)
468   - sinatra (1.4.3)
  464 + simplecov (0.8.2)
  465 + docile (~> 1.1.0)
  466 + multi_json
  467 + simplecov-html (~> 0.8.0)
  468 + simplecov-html (0.8.0)
  469 + sinatra (1.4.4)
469 470 rack (~> 1.4)
470 471 rack-protection (~> 1.4)
471 472 tilt (~> 1.3, >= 1.3.4)
472 473 six (0.2.0)
473   - slim (2.0.0)
474   - temple (~> 0.6.5)
475   - tilt (~> 1.3, >= 1.3.3)
476   - slop (3.4.5)
477   - spinach (0.8.3)
  474 + slim (2.0.2)
  475 + temple (~> 0.6.6)
  476 + tilt (>= 1.3.3, < 2.1)
  477 + slop (3.4.7)
  478 + spinach (0.8.7)
478 479 colorize (= 0.5.8)
479   - gherkin-ruby (~> 0.3.0)
  480 + gherkin-ruby (>= 0.3.1)
480 481 spinach-rails (0.2.1)
481 482 capybara (>= 2.0.0)
482 483 railties (>= 3)
483 484 spinach (>= 0.4)
484   - spork (1.0.0rc2)
485   - sprockets (2.2.2)
  485 + spork (1.0.0rc4)
  486 + sprockets (2.10.1)
486 487 hike (~> 1.2)
487 488 multi_json (~> 1.0)
488 489 rack (~> 1.0)
489 490 tilt (~> 1.1, != 1.3.0)
  491 + sprockets-rails (2.0.1)
  492 + actionpack (>= 3.0)
  493 + activesupport (>= 3.0)
  494 + sprockets (~> 2.8)
490 495 stamp (0.5.0)
491 496 state_machine (1.2.0)
492 497 stringex (1.5.1)
493   - temple (0.6.5)
  498 + temple (0.6.7)
494 499 term-ansicolor (1.2.2)
495 500 tins (~> 0.8)
496   - test_after_commit (0.2.1)
497   - therubyracer (0.11.4)
498   - libv8 (~> 3.11.8.12)
  501 + test_after_commit (0.2.2)
  502 + therubyracer (0.12.0)
  503 + libv8 (~> 3.16.14.0)
499 504 ref
500   - thin (1.5.1)
  505 + thin (1.6.1)
501 506 daemons (>= 1.0.9)
502   - eventmachine (>= 0.12.6)
  507 + eventmachine (>= 1.0.0)
503 508 rack (>= 1.0.0)
504 509 thor (0.18.1)
  510 + thread_safe (0.1.3)
  511 + atomic
505 512 tilt (1.4.1)
506 513 timers (1.1.0)
507   - tinder (1.9.2)
  514 + tinder (1.9.3)
508 515 eventmachine (~> 1.0)
509 516 faraday (~> 0.8)
510 517 faraday_middleware (~> 0.9)
511   - hashie (~> 1.0)
512   - json (~> 1.7.5)
  518 + hashie (>= 1.0, < 3)
  519 + json (~> 1.8.0)
513 520 mime-types (~> 1.19)
514   - multi_json (~> 1.5)
  521 + multi_json (~> 1.7)
515 522 twitter-stream (~> 0.1)
516   - tins (0.11.0)
  523 + tins (0.13.1)
517 524 treetop (1.4.15)
518 525 polyglot
519 526 polyglot (>= 0.3.1)
520   - turbolinks (1.2.0)
  527 + turbolinks (2.0.0)
521 528 coffee-rails
522 529 twitter-stream (0.1.16)
523 530 eventmachine (>= 0.12.8)
524 531 http_parser.rb (~> 0.5.1)
525 532 simple_oauth (~> 0.1.4)
526 533 tzinfo (0.3.38)
527   - uglifier (2.1.1)
  534 + uglifier (2.3.2)
528 535 execjs (>= 0.3.0)
529   - multi_json (~> 1.0, >= 1.0.2)
  536 + json (>= 1.8.0)
530 537 underscore-rails (1.4.4)
531 538 unicorn (4.6.3)
532 539 kgio (~> 2.6)
533 540 rack
534 541 raindrops (~> 0.7)
535   - virtus (0.5.5)
536   - backports (~> 3.3)
  542 + unicorn-worker-killer (0.4.2)
  543 + unicorn (~> 4)
  544 + virtus (1.0.1)
  545 + axiom-types (~> 0.0.5)
  546 + coercible (~> 1.0)
537 547 descendants_tracker (~> 0.0.1)
  548 + equalizer (~> 0.0.7)
538 549 warden (1.2.3)
539 550 rack (>= 1.0)
540   - webmock (1.11.0)
  551 + webmock (1.16.0)
541 552 addressable (>= 2.2.7)
542 553 crack (>= 0.3.2)
543   - websocket (1.0.7)
544   - websocket-driver (0.3.0)
  554 + websocket-driver (0.3.1)
545 555 xpath (2.0.0)
546 556 nokogiri (~> 1.3)
547 557 yajl-ruby (1.1.0)
... ... @@ -550,42 +560,45 @@ PLATFORMS
550 560 ruby
551 561  
552 562 DEPENDENCIES
  563 + actionpack-action_caching
  564 + actionpack-page_caching
  565 + activerecord-deprecated_finders
553 566 acts-as-taggable-on
554 567 annotate (~> 2.6.0.beta2)
555 568 asciidoctor
556 569 awesome_print
557 570 better_errors
558 571 binding_of_caller
559   - bootstrap-sass
  572 + bootstrap-sass (~> 3.0)
560 573 capybara
561 574 carrierwave
562   - chosen-rails (= 1.0.0)
  575 + chosen-rails (= 1.0.1)
563 576 coffee-rails
564 577 colored
565 578 coveralls
566 579 d3_rails (~> 3.1.4)
567 580 database_cleaner
568   - devise (~> 2.2)
569   - devise-async
  581 + devise (= 3.0.4)
  582 + devise-async (= 0.8.0)
570 583 email_spec
571 584 enumerize
572 585 factory_girl_rails
573 586 ffaker
574 587 fog (~> 1.3.1)
575   - font-awesome-rails
  588 + font-awesome-rails (~> 3.2)
576 589 foreman
577   - gemoji (~> 1.2.1)
578   - github-linguist
579   - github-markup (~> 0.7.4)
  590 + gemoji (~> 1.3.0)
  591 + github-markup (~> 0.7.4)!
580 592 gitlab-flowdock-git-hook (~> 0.4.2)
581   - gitlab-gollum-lib (~> 1.0.1)
582   - gitlab-grack (~> 1.0.1)
583   - gitlab-pygments.rb (~> 0.3.2)
584   - gitlab_git (~> 3.0.0.rc1)
  593 + gitlab-gollum-lib (~> 1.0.2)
  594 + gitlab-grack (~> 2.0.0.pre)
  595 + gitlab-linguist (~> 2.9.6)
  596 + gitlab-pygments.rb (~> 0.5.4)
  597 + gitlab_git (~> 4.0.0)
585 598 gitlab_meta (= 6.0)
586 599 gitlab_omniauth-ldap (= 1.0.3)
587   - gon
588   - grape (~> 0.4.1)
  600 + gon (~> 5.0.0)
  601 + grape (~> 0.6.1)
589 602 grape-entity (~> 0.3.0)
590 603 growl
591 604 guard-rspec
... ... @@ -593,8 +606,8 @@ DEPENDENCIES
593 606 haml-rails
594 607 hipchat (~> 0.9.0)
595 608 httparty
596   - jasmine
597   - jquery-atwho-rails (= 0.3.0)
  609 + jasmine (= 2.0.0.rc5)
  610 + jquery-atwho-rails (~> 0.3.3)
598 611 jquery-rails (= 2.1.3)
599 612 jquery-turbolinks
600 613 jquery-ui-rails (= 2.0.2)
... ... @@ -610,12 +623,14 @@ DEPENDENCIES
610 623 omniauth-twitter
611 624 pg
612 625 poltergeist (~> 1.4.1)
  626 + protected_attributes
613 627 pry
614 628 quiet_assets (~> 1.0.1)
615 629 rack-attack
  630 + rack-cors
616 631 rack-mini-profiler
617   - rails (= 3.2.15)
618   - rails-dev-tweaks
  632 + rails (~> 4.0.0)
  633 + rails-observers
619 634 rails_best_practices
620 635 raphael-rails (~> 2.1.2)
621 636 rb-fsevent
... ... @@ -647,4 +662,5 @@ DEPENDENCIES
647 662 uglifier
648 663 underscore-rails (~> 1.4.4)
649 664 unicorn (~> 4.6.3)
  665 + unicorn-worker-killer
650 666 webmock
... ...
PROCESS.md
... ... @@ -8,25 +8,25 @@ Below we describe the contributing process to GitLab for two reasons. So that co
8 8  
9 9 ### Issue team
10 10 - Looks for issues without workflow labels and triages issue
11   -- Monitors pull requests
12   -- Closes invalid issues and pull requests with a comment (duplicates, [feature requests](#feature-requests), [fixed in newer version](#issue-fixed-in-newer-version), [issue report for old version](#issue-report-for-old-version), not a problem in GitLab, etc.)
  11 +- Monitors merge requests
  12 +- Closes invalid issues and merge requests with a comment (duplicates, [feature requests](#feature-requests), [fixed in newer version](#issue-fixed-in-newer-version), [issue report for old version](#issue-report-for-old-version), not a problem in GitLab, etc.)
13 13 - Assigns appropriate [labels](#how-we-handle-issues)
14   -- Asks for feedback from issue reporter/pull request initiator ([invalid issue reports](#improperly-formatted-issue), [format code](#code-format), etc.)
  14 +- Asks for feedback from issue reporter/merge request initiator ([invalid issue reports](#improperly-formatted-issue), [format code](#code-format), etc.)
15 15 - Asks for feedback from the relevant developer(s) based on the [list of members and their specialities](http://gitlab.org/team/)
16   -- Monitors all issues/pull requests for feedback (but especially ones commented on since automatically watching them):
  16 +- Monitors all issues/merge requests for feedback (but especially ones commented on since automatically watching them):
17 17 - Closes issues with no feedback from the reporter for two weeks
18   -- Closes stale pull requests
  18 +- Closes stale merge requests
19 19  
20 20 ### Development team
21 21  
22   -- Responds to issues and pull requests the issue team mentions them in
  22 +- Responds to issues and merge requests the issue team mentions them in
23 23 - Monitors for new issues in _Awaiting developer action/feedback_ with no developer activity (once a week)
24   -- Monitors for new pull requests (at least once a week)
25   -- Manages their work queue by looking at issues and pull requests assigned to them
  24 +- Monitors for new merge requests (at least once a week)
  25 +- Manages their work queue by looking at issues and merge requests assigned to them
26 26 - Close fixed issues (via commit messages or manually)
27 27 - Codes [new features](http://feedback.gitlab.com/forums/176466-general/filters/top)!
28 28 - Response guidelines
29   -- Be kind to people trying to contribute. Be aware that people can be a non-native or a native English speaker, they might not understand thing or they might be very sensitive to how your word things. Use emoji to express your feelings (heart, star, smile, etc.). Some good tips about giving feedback to pull requests is in the [Thoughtbot code review guide](https://github.com/thoughtbot/guides/tree/master/code-review).
  29 +- Be kind to people trying to contribute. Be aware that people can be a non-native or a native English speaker, they might not understand thing or they might be very sensitive to how your word things. Use emoji to express your feelings (heart, star, smile, etc.). Some good tips about giving feedback to merge requests is in the [Thoughtbot code review guide](https://github.com/thoughtbot/guides/tree/master/code-review).
30 30  
31 31 ## Priorities of the issue team
32 32  
... ... @@ -45,8 +45,8 @@ Workflow labels are purposely not very detailed since that would be hard to keep
45 45  
46 46 - _Awaiting feedback_: Feedback pending from the reporter
47 47 - _Awaiting confirmation of fix_: The issue should already be solved in **master** (generally you can avoid this workflow item and just close the issue right away)
48   -- _Attached PR_: There is a PR attached and the discussion should happen there
49   - - We need to let issues stay in sync with the PR's. We can do this with a "Closing #XXXX" or "Fixes #XXXX" comment in the PR. We can't close the issue when there is a pull request because sometimes a PR is not good and we just close the PR, then the issue must stay.
  48 +- _Attached MR_: There is a MR attached and the discussion should happen there
  49 + - We need to let issues stay in sync with the MR's. We can do this with a "Closing #XXXX" or "Fixes #XXXX" comment in the MR. We can't close the issue when there is a merge request because sometimes a MR is not good and we just close the MR, then the issue must stay.
50 50 - _Awaiting developer action/feedback_: Issue needs to be fixed or clarified by a developer
51 51  
52 52 ## Functional labels
... ... @@ -59,7 +59,7 @@ If an issue is complex and needs the attention of a specific person, assignment
59 59  
60 60 ## Label colors
61 61 - Light orange `#fef2c0`: workflow labels for issue team members (awaiting feedback, awaiting confirmation of fix)
62   -- Bright orange `#eb6420`: workflow labels for core team members (attached PR, awaiting developer action/feedback)
  62 +- Bright orange `#eb6420`: workflow labels for core team members (attached MR, awaiting developer action/feedback)
63 63 - Light blue `#82C5FF`: functional labels
64 64 - Green labels `#009800`: issues that can generally be ignored. For example, issues given the following labels normally can be closed immediately:
65 65 - Feature request (see copy & paste response: [Feature requests](#feature-requests))
... ... @@ -69,19 +69,19 @@ If an issue is complex and needs the attention of a specific person, assignment
69 69  
70 70 ### Improperly formatted issue
71 71  
72   -Thanks for the issue report. Please reformat your issue to conform to the issue tracker guidelines found in our \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
  72 +Thanks for the issue report. Please reformat your issue to conform to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#issue-tracker-guidelines).
73 73  
74 74 ### Feature requests
75 75  
76   -Thanks for your interest in GitLab. We don't use the GitHub issue tracker for feature requests. Please use http://feedback.gitlab.com/ for this purpose or create a pull request implementing this feature. Have a look at the \[contribution guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md) for more information.
  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/masterCONTRIBUTING.md) for more information.
77 77  
78 78 ### Issue report for old version
79 79  
80   -Thanks for the issue report but we only support issues for the latest stable version of GitLab. I'm closing this issue but if you still experience this problem in the latest stable version, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
  80 +Thanks for the issue report but we only support issues for the latest stable version of GitLab. I'm closing this issue but if you still experience this problem in the latest stable version, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#issue-tracker-guidelines).
81 81  
82 82 ### Support requests and configuration questions
83 83  
84   -Thanks for your interest in GitLab. We don't use the GitHub issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the unofficial #gitlab IRC channel on Freenode or the http://www.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md) for more information.
  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/masterCONTRIBUTING.md) for more information.
85 85  
86 86 ### Code format
87 87  
... ... @@ -89,17 +89,17 @@ Please use ``` to format console output, logs, and code as it&#39;s very hard to rea
89 89  
90 90 ### Issue fixed in newer version
91 91  
92   -Thanks for the issue report. This issue has already been fixed in newer versions of GitLab. Due to the size of this project and our limited resources we are only able to support the latest stable release as outlined in our \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#issue-tracker). In order to get this bug fix and enjoy many new features please \[upgrade\]\(http://blog.gitlab.org/). If you still experience issues at that time please open a new issue following our issue tracker guidelines found in the \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
  92 +Thanks for the issue report. This issue has already been fixed in newer versions of GitLab. Due to the size of this project and our limited resources we are only able to support the latest stable release as outlined in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#issue-tracker). In order to get this bug fix and enjoy many new features please \[upgrade\]\(http://blog.gitlab.org/). If you still experience issues at that time please open a new issue following our issue tracker guidelines found in the \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#issue-tracker-guidelines).
93 93  
94   -### Improperly formatted pull request
  94 +### Improperly formatted merge request
95 95  
96   -Thanks for your interest in improving the GitLab codebase! Please update your pull request according to the \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#pull-request-guidelines).
  96 +Thanks for your interest in improving the GitLab codebase! Please update your merge request according to the \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#pull-request-guidelines).
97 97  
98 98 ### Inactivity close of an issue
99 99  
100   -It's been at least 2 weeks (and a new release) since we heard from you. I'm closing this issue but if you still experience this problem, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
  100 +It's been at least 2 weeks (and a new release) since we heard from you. I'm closing this issue but if you still experience this problem, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#issue-tracker-guidelines).
101 101  
102   -### Inactivity close of a pull request
  102 +### Inactivity close of a merge request
103 103  
104   -This pull request has been closed because a request for more information has not been reacted to for more than 2 weeks. If you respond and conform to the pull request guidelines in our \[contributing guidelines\]\(https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md#pull-requests) we will reopen this pull request.
  104 +This merge request has been closed because a request for more information has not been reacted to for more than 2 weeks. If you respond and conform to the merge request guidelines in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/masterCONTRIBUTING.md#pull-requests) we will reopen this merge request.
105 105  
... ...
README.md
1 1 ## GitLab: self hosted Git management software
2 2  
3   -![logo](https://raw.github.com/gitlabhq/gitlabhq/master/public/gitlab_logo.png)
  3 +![logo](https://gitlab.com/gitlab-org/gitlab-ce/raw/master/public/gitlab_logo.png)
4 4  
5 5 ![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif)
6 6  
... ... @@ -32,7 +32,9 @@
32 32  
33 33 * GitLab.com commercial services: [Homepage](http://www.gitlab.com/) | [Subscription](http://www.gitlab.com/subscription/) | [Consultancy](http://www.gitlab.com/consultancy/) | [GitLab Cloud](http://www.gitlab.com/cloud/) | [Blog](http://blog.gitlab.com/)
34 34  
35   -* GitLab CI: [Readme](https://github.com/gitlabhq/gitlab-ci/blob/master/README.md) of the GitLab open-source continuous integration server
  35 +* [GitLab Enterprise Edition](https://www.gitlab.com/features/) offers additional features that are useful for larger organizations (100+ users).
  36 +
  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.
36 38  
37 39 ### Requirements
38 40  
... ... @@ -46,29 +48,24 @@
46 48  
47 49 ### Installation
48 50  
49   -#### Official production installation
50   -
51   -* [Installation guide for a production server](doc/install/installation.md)
  51 +#### Official installation methods
52 52  
  53 +* [Manual installation guide for a production server](doc/install/installation.md)
53 54  
54   -#### Official development installation
  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.
55 56  
56   -If you want to contribute, please first read our [Contributing Guidelines](https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md) and then we suggest you to use the Vagrant virtual machine project to get an environment working with all dependencies.
  57 +#### Third party one-click installers
57 58  
58   -* [Vagrant virtual machine for development](https://github.com/gitlabhq/gitlab-vagrant-vm)
  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.
59 60  
  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.).
60 62  
61   -#### Unofficial production installations
  63 +#### Unofficial installation methods
62 64  
63   -* [GitLab recipes](https://github.com/gitlabhq/gitlab-recipes) repository with unofficial guides for using GitLab with different software (operating systems, webservers, etc.) than the official version.
  65 +* [GitLab recipes](https://gitlab.com/gitlab-org/gitlab-recipes/) repository with unofficial guides for using GitLab with different software (operating systems, webservers, etc.) than the official version.
64 66  
65 67 * [Installation guides](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Unofficial-Installation-Guides) public wiki with unofficial guides to install GitLab on different operating systems.
66 68  
67   -* [BitNami one-click installers](http://bitnami.com/stack/gitlab)
68   -
69   -* [TurnKey Linux virtual appliance](http://www.turnkeylinux.org/gitlab)
70   -
71   -
72 69 ### New versions and upgrading
73 70  
74 71 Since 2011 GitLab is released on the 22nd of every month. Every new release includes an upgrade guide.
... ... @@ -79,7 +76,6 @@ Since 2011 GitLab is released on the 22nd of every month. Every new release incl
79 76  
80 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).
81 78  
82   -
83 79 ### Run in production mode
84 80  
85 81 The Installation guide contains instructions on how to download an init script and run it automatically on boot. You can also start the init script manually:
... ... @@ -99,7 +95,7 @@ Start it with [Foreman](https://github.com/ddollar/foreman)
99 95 or start each component separately
100 96  
101 97 bundle exec rails s
102   - bundle exec rake sidekiq:start
  98 + script/background_jobs start
103 99  
104 100 ### Run the tests
105 101  
... ... @@ -110,7 +106,7 @@ or start each component separately
110 106  
111 107 * Run all tests
112 108  
113   - bundle exec rake gitlab:test
  109 + bundle exec rake gitlab:test RAILS_ENV=test
114 110  
115 111 * [RSpec](http://rspec.info/) unit and functional tests
116 112  
... ... @@ -147,15 +143,17 @@ or start each component separately
147 143  
148 144 * [Mailing list](https://groups.google.com/forum/#!forum/gitlabhq) and [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) are the best places to ask questions. For example you can use it if you have questions about: permission denied errors, invisible repos, can't clone/pull/push or with web hooks that don't fire. Please search for similar issues before posting your own, there's a good chance somebody else had the same issue you have now and has resolved it. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there to a fix.
149 145  
150   -* [Unofficial #gitlab IRC on Freenode](http://www.freenode.net/) is another way to get in touch with other GitLab users who may be able to help you.
151   -
152 146 * [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab.
153 147  
154   -* [Contributing guide](https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md) describes how to submit pull requests and issues. Pull requests and issues not in line with the guidelines in this document will be closed.
  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.
155 149  
156 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.
157 151  
158   -* [Consultancy](http://www.gitlab.com/consultancy/) allows you hire GitLab experts for installations, upgrades and customizations.
  152 +* [Consultancy](http://www.gitlab.com/consultancy/) from the GitLab experts for installations, upgrades and customizations.
  153 +
  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
  155 +
  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.
159 157  
160 158  
161 159 ### Getting in touch
... ...
VERSION
1   -6.3.0.pre
  1 +6.5.0.pre
... ...
app/assets/images/favicon.ico
No preview for this file type
app/assets/images/logo-black.png

2.77 KB | W: | H:

2.95 KB | W: | H:

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

3.95 KB | W: | H:

8.14 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/javascripts/admin.js.coffee
... ... @@ -8,6 +8,23 @@ class Admin
8 8 else
9 9 elems.removeAttr 'disabled'
10 10  
  11 + $('body').on 'click', '.js-toggle-colors-link', (e) ->
  12 + e.preventDefault()
  13 + $('.js-toggle-colors-link').hide()
  14 + $('.js-toggle-colors-container').show()
  15 +
  16 + $('input#broadcast_message_color').on 'input', ->
  17 + previewColor = $('input#broadcast_message_color').val()
  18 + $('div.broadcast-message-preview').css('background-color', previewColor)
  19 +
  20 + $('input#broadcast_message_font').on 'input', ->
  21 + previewColor = $('input#broadcast_message_font').val()
  22 + $('div.broadcast-message-preview').css('color', previewColor)
  23 +
  24 + $('textarea#broadcast_message_message').on 'input', ->
  25 + previewMessage = $('textarea#broadcast_message_message').val()
  26 + $('div.broadcast-message-preview span').text(previewMessage)
  27 +
11 28 $('.log-tabs a').click (e) ->
12 29 e.preventDefault()
13 30 $(this).tab('show')
... ...
app/assets/javascripts/api.js.coffee
... ... @@ -2,6 +2,7 @@
2 2 users_path: "/api/:version/users.json"
3 3 user_path: "/api/:version/users/:id.json"
4 4 notes_path: "/api/:version/projects/:id/notes.json"
  5 + namespaces_path: "/api/:version/namespaces.json"
5 6  
6 7 # Get 20 (depends on api) recent notes
7 8 # and sort the ascending from oldest to newest
... ... @@ -49,6 +50,20 @@
49 50 ).done (users) ->
50 51 callback(users)
51 52  
  53 + # Return namespaces list. Filtered by query
  54 + namespaces: (query, callback) ->
  55 + url = Api.buildUrl(Api.namespaces_path)
  56 +
  57 + $.ajax(
  58 + url: url
  59 + data:
  60 + private_token: gon.api_token
  61 + search: query
  62 + per_page: 20
  63 + dataType: "json"
  64 + ).done (namespaces) ->
  65 + callback(namespaces)
  66 +
52 67 buildUrl: (url) ->
53 68 url = gon.relative_url_root + url if gon.relative_url_root?
54 69 return url.replace(':version', gon.api_version)
... ...
app/assets/javascripts/behaviors/toggler_behavior.coffee
... ... @@ -3,7 +3,7 @@ $ -&gt;
3 3 container = $(@).closest(".js-toggler-container")
4 4  
5 5 container.toggleClass("on")
6   -
  6 +
7 7 $("body").on "click", ".js-toggle-visibility-link", (e) ->
8 8 $(@).find('i').
9 9 toggleClass('icon-chevron-down').
... ... @@ -11,7 +11,7 @@ $ -&gt;
11 11 container = $(".js-toggle-visibility-container")
12 12 container.toggleClass("hide")
13 13 e.preventDefault()
14   -
  14 +
15 15 $("body").on "click", ".js-toggle-button", (e) ->
16 16 $(@).closest(".js-toggle-container").find(".js-toggle-content").toggle()
17 17 e.preventDefault()
... ...
app/assets/javascripts/blob.js.coffee
1 1 class BlobView
2 2 constructor: ->
  3 + # handle multi-line select
  4 + handleMultiSelect = (e) ->
  5 + [ first_line, last_line ] = parseSelectedLines()
  6 + [ line_number ] = parseSelectedLines($(this).attr("id"))
  7 + hash = "L#{line_number}"
  8 +
  9 + if e.shiftKey and not isNaN(first_line) and not isNaN(line_number)
  10 + if line_number < first_line
  11 + last_line = first_line
  12 + first_line = line_number
  13 + else
  14 + last_line = line_number
  15 +
  16 + hash = if first_line == last_line then "L#{first_line}" else "L#{first_line}-#{last_line}"
  17 +
  18 + setHash(hash)
  19 + e.preventDefault()
  20 +
3 21 # See if there are lines selected
4 22 # "#L12" and "#L34-56" supported
5   - highlightBlobLines = ->
6   - if window.location.hash isnt ""
7   - matches = window.location.hash.match(/\#L(\d+)(\-(\d+))?/)
  23 + highlightBlobLines = (e) ->
  24 + [ first_line, last_line ] = parseSelectedLines()
  25 +
  26 + unless isNaN first_line
  27 + $("#tree-content-holder .highlight .line").removeClass("hll")
  28 + $("#LC#{line}").addClass("hll") for line in [first_line..last_line]
  29 + $("#L#{first_line}").ScrollTo() unless e?
  30 +
  31 + # parse selected lines from hash
  32 + # always return first and last line (initialized to NaN)
  33 + parseSelectedLines = (str) ->
  34 + first_line = NaN
  35 + last_line = NaN
  36 + hash = str || window.location.hash
  37 +
  38 + if hash isnt ""
  39 + matches = hash.match(/\#?L(\d+)(\-(\d+))?/)
8 40 first_line = parseInt(matches?[1])
9 41 last_line = parseInt(matches?[3])
  42 + last_line = first_line if isNaN(last_line)
  43 +
  44 + [ first_line, last_line ]
  45 +
  46 + setHash = (hash) ->
  47 + hash = hash.replace(/^\#/, "")
  48 + nodes = $("#" + hash)
  49 + # if any nodes are using this id, they must be temporarily changed
  50 + # also, add a temporary div at the top of the screen to prevent scrolling
  51 + if nodes.length > 0
  52 + scroll_top = $(document).scrollTop()
  53 + nodes.attr("id", "")
  54 + tmp = $("<div></div>")
  55 + .css({ position: "absolute", visibility: "hidden", top: scroll_top + "px" })
  56 + .attr("id", hash)
  57 + .appendTo(document.body)
  58 +
  59 + window.location.hash = hash
  60 +
  61 + # restore the nodes
  62 + if nodes.length > 0
  63 + tmp.remove()
  64 + nodes.attr("id", hash)
10 65  
11   - unless isNaN first_line
12   - last_line = first_line if isNaN(last_line)
13   - $("#tree-content-holder .highlight .line").removeClass("hll")
14   - $("#LC#{line}").addClass("hll") for line in [first_line..last_line]
15   - $("#L#{first_line}").ScrollTo()
  66 + # initialize multi-line select
  67 + $("#tree-content-holder .line_numbers a[id^=L]").on("click", handleMultiSelect)
16 68  
17 69 # Highlight the correct lines on load
18 70 highlightBlobLines()
19 71  
20 72 # Highlight the correct lines when the hash part of the URL changes
21   - $(window).on 'hashchange', highlightBlobLines
  73 + $(window).on("hashchange", highlightBlobLines)
22 74  
23 75  
24 76 @BlobView = BlobView
... ...
app/assets/javascripts/commits.js.coffee
... ... @@ -4,13 +4,13 @@ class CommitsList
4 4 limit: 0
5 5 offset: 0
6 6 @disable = false
7   -
  7 +
8 8 @showProgress: ->
9 9 $('.loading').show()
10   -
  10 +
11 11 @hideProgress: ->
12 12 $('.loading').hide()
13   -
  13 +
14 14 @init: (ref, limit) ->
15 15 $(".day-commits-table li.commit").live 'click', (event) ->
16 16 if event.target.nodeName != "A"
... ... @@ -21,7 +21,7 @@ class CommitsList
21 21 @data.ref = ref
22 22 @data.limit = limit
23 23 @data.offset = limit
24   -
  24 +
25 25 this.initLoadMore()
26 26 this.showProgress()
27 27  
... ... @@ -32,7 +32,9 @@ class CommitsList
32 32 url: location.href
33 33 data: @data
34 34 complete: this.hideProgress
35   - dataType: "script"
  35 + success: (data) ->
  36 + CommitsList.append(data.count, data.html)
  37 + dataType: "json"
36 38  
37 39 @append: (count, html) ->
38 40 $("#commits-list").append(html)
... ... @@ -40,7 +42,7 @@ class CommitsList
40 42 @data.offset += count
41 43 else
42 44 @disable = true
43   -
  45 +
44 46 @initLoadMore: ->
45 47 $(document).unbind('scroll')
46 48 $(document).endlessScroll
... ...
app/assets/javascripts/issues.js.coffee
... ... @@ -22,7 +22,7 @@
22 22 backgroundColor: '#DDD'
23 23 opacity: .4
24 24 )
25   -
  25 +
26 26 reload: ->
27 27 Issues.initSelects()
28 28 Issues.initChecks()
... ... @@ -54,7 +54,16 @@
54 54 unless terms is last_terms
55 55 last_terms = terms
56 56 if terms.length >= 2 or terms.length is 0
57   - form.submit()
  57 + $.ajax
  58 + type: "GET"
  59 + url: location.href
  60 + data: "issue_search=" + terms
  61 + complete: ->
  62 + $(".loading").hide()
  63 + success: (data) ->
  64 + $('.issues-holder').html(data.html)
  65 + Issues.reload()
  66 + dataType: "json"
58 67  
59 68 checkChanged: ->
60 69 checked_issues = $(".selected_issue:checked")
... ... @@ -70,3 +79,9 @@
70 79 $("#update_issues_ids").val []
71 80 $(".issues_bulk_update").hide()
72 81 $(".issues-filters").show()
  82 +
  83 +$ ->
  84 + $('.edit-issue.inline-update input[type="submit"]').hide();
  85 + $("body").on "change", ".edit-issue.inline-update select", ->
  86 + $(this).submit()
  87 +
... ...
app/assets/javascripts/main.js.coffee
1   -window.updatePage = (data) ->
2   - $.ajax({type: "GET", url: location.href, data: data, dataType: "script"})
3   -
4 1 window.slugify = (text) ->
5 2 text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase()
6 3  
... ... @@ -56,7 +53,7 @@ window.unbindEvents = -&gt;
56 53  
57 54 document.addEventListener("page:fetch", startSpinner)
58 55 document.addEventListener("page:fetch", unbindEvents)
59   -document.addEventListener("page:receive", stopSpinner)
  56 +document.addEventListener("page:change", stopSpinner)
60 57  
61 58 $ ->
62 59 # Click a .one_click_select field, select the contents
... ... @@ -84,6 +81,7 @@ $ -&gt;
84 81 $(@).parents('form').submit()
85 82  
86 83 $("abbr.timeago").timeago()
  84 + $('.js-timeago').timeago()
87 85  
88 86 # Flash
89 87 if (flash = $(".flash-container")).length > 0
... ...
app/assets/javascripts/merge_requests.js.coffee
... ... @@ -21,7 +21,7 @@ class MergeRequest
21 21 this.initMergeWidget()
22 22 this.$('.show-all-commits').on 'click', =>
23 23 this.showAllCommits()
24   -
  24 +
25 25 modal = $('#modal_merge_info').modal(show: false)
26 26  
27 27 # Local jQuery finder
... ... @@ -83,12 +83,12 @@ class MergeRequest
83 83 url: this.$('.nav-tabs .diffs-tab a').attr('href')
84 84 beforeSend: =>
85 85 this.$('.status').addClass 'loading'
86   -
87 86 complete: =>
88 87 @diffs_loaded = true
89 88 this.$('.status').removeClass 'loading'
90   -
91   - dataType: 'script'
  89 + success: (data) =>
  90 + this.$(".diffs").html(data.html)
  91 + dataType: 'json'
92 92  
93 93 showAllCommits: ->
94 94 this.$('.first-commits').remove()
... ...
app/assets/javascripts/namespace_select.js.coffee 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +$ ->
  2 + namespaceFormatResult = (namespace) ->
  3 + markup = "<div class='namespace-result'>"
  4 + markup += "<span class='namespace-kind'>" + namespace.kind + "</span>"
  5 + markup += "<span class='namespace-path'>" + namespace.path + "</span>"
  6 + markup += "</div>"
  7 + markup
  8 +
  9 + formatSelection = (namespace) ->
  10 + namespace.kind + ": " + namespace.path
  11 +
  12 + $('.ajax-namespace-select').each (i, select) ->
  13 + $(select).select2
  14 + placeholder: "Search for namespace"
  15 + multiple: $(select).hasClass('multiselect')
  16 + minimumInputLength: 0
  17 + query: (query) ->
  18 + Api.namespaces query.term, (namespaces) ->
  19 + data = { results: namespaces }
  20 + query.callback(data)
  21 +
  22 + dropdownCssClass: "ajax-namespace-dropdown"
  23 + formatResult: namespaceFormatResult
  24 + formatSelection: formatSelection
... ...
app/assets/javascripts/notes.js
... ... @@ -1,580 +0,0 @@
1   -var NoteList = {
2   - id: null,
3   - notes_path: null,
4   - target_params: null,
5   - target_id: 0,
6   - target_type: null,
7   -
8   - init: function(tid, tt, path) {
9   - NoteList.notes_path = path + ".js";
10   - NoteList.target_id = tid;
11   - NoteList.target_type = tt;
12   - NoteList.target_params = "target_type=" + NoteList.target_type + "&target_id=" + NoteList.target_id;
13   -
14   - NoteList.setupMainTargetNoteForm();
15   -
16   - // get initial set of notes
17   - NoteList.getContent();
18   -
19   - // Unbind events to prevent firing twice
20   - $(document).off("click", ".js-add-diff-note-button");
21   - $(document).off("click", ".js-discussion-reply-button");
22   - $(document).off("click", ".js-note-preview-button");
23   - $(document).off("click", ".js-note-attachment-input");
24   - $(document).off("click", ".js-close-discussion-note-form");
25   - $(document).off("click", ".js-note-delete");
26   - $(document).off("click", ".js-note-edit");
27   - $(document).off("click", ".js-note-edit-cancel");
28   - $(document).off("click", ".js-note-attachment-delete");
29   - $(document).off("click", ".js-choose-note-attachment-button");
30   - $(document).off("click", ".js-show-outdated-discussion");
31   -
32   - $(document).off("ajax:complete", ".js-main-target-form");
33   -
34   -
35   - // add a new diff note
36   - $(document).on("click",
37   - ".js-add-diff-note-button",
38   - NoteList.addDiffNote);
39   -
40   - // reply to diff/discussion notes
41   - $(document).on("click",
42   - ".js-discussion-reply-button",
43   - NoteList.replyToDiscussionNote);
44   -
45   - // setup note preview
46   - $(document).on("click",
47   - ".js-note-preview-button",
48   - NoteList.previewNote);
49   -
50   - // update the file name when an attachment is selected
51   - $(document).on("change",
52   - ".js-note-attachment-input",
53   - NoteList.updateFormAttachment);
54   -
55   - // hide diff note form
56   - $(document).on("click",
57   - ".js-close-discussion-note-form",
58   - NoteList.removeDiscussionNoteForm);
59   -
60   - // remove a note (in general)
61   - $(document).on("click",
62   - ".js-note-delete",
63   - NoteList.removeNote);
64   -
65   - // show the edit note form
66   - $(document).on("click",
67   - ".js-note-edit",
68   - NoteList.showEditNoteForm);
69   -
70   - // cancel note editing
71   - $(document).on("click",
72   - ".note-edit-cancel",
73   - NoteList.cancelNoteEdit);
74   -
75   - // delete note attachment
76   - $(document).on("click",
77   - ".js-note-attachment-delete",
78   - NoteList.deleteNoteAttachment);
79   -
80   - // update the note after editing
81   - $(document).on("ajax:complete",
82   - "form.edit_note",
83   - NoteList.updateNote);
84   -
85   - // reset main target form after submit
86   - $(document).on("ajax:complete",
87   - ".js-main-target-form",
88   - NoteList.resetMainTargetForm);
89   -
90   -
91   - $(document).on("click",
92   - ".js-choose-note-attachment-button",
93   - NoteList.chooseNoteAttachment);
94   -
95   - $(document).on("click",
96   - ".js-show-outdated-discussion",
97   - function(e) { $(this).next('.outdated-discussion').show(); e.preventDefault() });
98   - },
99   -
100   -
101   - /**
102   - * When clicking on buttons
103   - */
104   -
105   - /**
106   - * Called when clicking on the "add a comment" button on the side of a diff line.
107   - *
108   - * Inserts a temporary row for the form below the line.
109   - * Sets up the form and shows it.
110   - */
111   - addDiffNote: function(e) {
112   - e.preventDefault();
113   -
114   - // find the form
115   - var form = $(".js-new-note-form");
116   - var row = $(this).closest("tr");
117   - var nextRow = row.next();
118   -
119   - // does it already have notes?
120   - if (nextRow.is(".notes_holder")) {
121   - $.proxy(NoteList.replyToDiscussionNote,
122   - nextRow.find(".js-discussion-reply-button")
123   - ).call();
124   - } else {
125   - // add a notes row and insert the form
126   - row.after('<tr class="notes_holder js-temp-notes-holder"><td class="notes_line" colspan="2"></td><td class="notes_content"></td></tr>');
127   - form.clone().appendTo(row.next().find(".notes_content"));
128   -
129   - // show the form
130   - NoteList.setupDiscussionNoteForm($(this), row.next().find("form"));
131   - }
132   - },
133   -
134   - /**
135   - * Called when clicking the "Choose File" button.
136   - *
137   - * Opens the file selection dialog.
138   - */
139   - chooseNoteAttachment: function() {
140   - var form = $(this).closest("form");
141   -
142   - form.find(".js-note-attachment-input").click();
143   - },
144   -
145   - /**
146   - * Shows the note preview.
147   - *
148   - * Lets the server render GFM into Html and displays it.
149   - *
150   - * Note: uses the Toggler behavior to toggle preview/edit views/buttons
151   - */
152   - previewNote: function(e) {
153   - e.preventDefault();
154   -
155   - var form = $(this).closest("form");
156   - var preview = form.find('.js-note-preview');
157   - var noteText = form.find('.js-note-text').val();
158   -
159   - if(noteText.trim().length === 0) {
160   - preview.text('Nothing to preview.');
161   - } else {
162   - preview.text('Loading...');
163   - $.post($(this).data('url'), {note: noteText})
164   - .success(function(previewData) {
165   - preview.html(previewData);
166   - });
167   - }
168   - },
169   -
170   - /**
171   - * Called in response to "cancel" on a diff note form.
172   - *
173   - * Shows the reply button again.
174   - * Removes the form and if necessary it's temporary row.
175   - */
176   - removeDiscussionNoteForm: function() {
177   - var form = $(this).closest("form");
178   - var row = form.closest("tr");
179   -
180   - // show the reply button (will only work for replies)
181   - form.prev(".js-discussion-reply-button").show();
182   -
183   - if (row.is(".js-temp-notes-holder")) {
184   - // remove temporary row for diff lines
185   - row.remove();
186   - } else {
187   - // only remove the form
188   - form.remove();
189   - }
190   - },
191   -
192   - /**
193   - * Called in response to deleting a note of any kind.
194   - *
195   - * Removes the actual note from view.
196   - * Removes the whole discussion if the last note is being removed.
197   - */
198   - removeNote: function() {
199   - var note = $(this).closest(".note");
200   - var notes = note.closest(".notes");
201   -
202   - // check if this is the last note for this line
203   - if (notes.find(".note").length === 1) {
204   - // for discussions
205   - notes.closest(".discussion").remove();
206   -
207   - // for diff lines
208   - notes.closest("tr").remove();
209   - }
210   -
211   - note.remove();
212   - NoteList.updateVotes();
213   - },
214   -
215   - /**
216   - * Called in response to clicking the edit note link
217   - *
218   - * Replaces the note text with the note edit form
219   - * Adds a hidden div with the original content of the note to fill the edit note form with
220   - * if the user cancels
221   - */
222   - showEditNoteForm: function(e) {
223   - e.preventDefault();
224   - var note = $(this).closest(".note");
225   - note.find(".note-text").hide();
226   -
227   - // Show the attachment delete link
228   - note.find(".js-note-attachment-delete").show();
229   -
230   - GitLab.GfmAutoComplete.setup();
231   -
232   - var form = note.find(".note-edit-form");
233   - form.show();
234   -
235   - var textarea = form.find("textarea");
236   - var p = $("<p></p>").text(textarea.val());
237   - var hidden_div = $('<div class="note-original-content"></div>').append(p);
238   - form.append(hidden_div);
239   - hidden_div.hide();
240   - textarea.focus();
241   - },
242   -
243   - /**
244   - * Called in response to clicking the cancel button when editing a note
245   - *
246   - * Resets and hides the note editing form
247   - */
248   - cancelNoteEdit: function(e) {
249   - e.preventDefault();
250   - var note = $(this).closest(".note");
251   - NoteList.resetNoteEditing(note);
252   - },
253   -
254   -
255   - /**
256   - * Called in response to clicking the delete attachment link
257   - *
258   - * Removes the attachment wrapper view, including image tag if it exists
259   - * Resets the note editing form
260   - */
261   - deleteNoteAttachment: function() {
262   - var note = $(this).closest(".note");
263   - note.find(".note-attachment").remove();
264   - NoteList.resetNoteEditing(note);
265   - NoteList.rewriteTimestamp(note.find(".note-last-update"));
266   - },
267   -
268   -
269   - /**
270   - * Called when clicking on the "reply" button for a diff line.
271   - *
272   - * Shows the note form below the notes.
273   - */
274   - replyToDiscussionNote: function() {
275   - // find the form
276   - var form = $(".js-new-note-form");
277   -
278   - // hide reply button
279   - $(this).hide();
280   - // insert the form after the button
281   - form.clone().insertAfter($(this));
282   -
283   - // show the form
284   - NoteList.setupDiscussionNoteForm($(this), $(this).next("form"));
285   - },
286   -
287   -
288   - /**
289   - * Helper for inserting and setting up note forms.
290   - */
291   -
292   -
293   - /**
294   - * Called in response to creating a note failing validation.
295   - *
296   - * Adds the rendered errors to the respective form.
297   - * If "discussionId" is null or undefined, the main target form is assumed.
298   - */
299   - errorsOnForm: function(errorsHtml, discussionId) {
300   - // find the form
301   - if (discussionId) {
302   - var form = $("form[rel='"+discussionId+"']");
303   - } else {
304   - var form = $(".js-main-target-form");
305   - }
306   -
307   - form.find(".js-errors").remove();
308   - form.prepend(errorsHtml);
309   -
310   - form.find(".js-note-text").focus();
311   - },
312   -
313   -
314   - /**
315   - * Shows the diff/discussion form and does some setup on it.
316   - *
317   - * Sets some hidden fields in the form.
318   - *
319   - * Note: dataHolder must have the "discussionId", "lineCode", "noteableType"
320   - * and "noteableId" data attributes set.
321   - */
322   - setupDiscussionNoteForm: function(dataHolder, form) {
323   - // setup note target
324   - form.attr("rel", dataHolder.data("discussionId"));
325   - form.find("#note_commit_id").val(dataHolder.data("commitId"));
326   - form.find("#note_line_code").val(dataHolder.data("lineCode"));
327   - form.find("#note_noteable_type").val(dataHolder.data("noteableType"));
328   - form.find("#note_noteable_id").val(dataHolder.data("noteableId"));
329   -
330   - NoteList.setupNoteForm(form);
331   -
332   - form.find(".js-note-text").focus();
333   - },
334   -
335   - /**
336   - * Shows the main form and does some setup on it.
337   - *
338   - * Sets some hidden fields in the form.
339   - */
340   - setupMainTargetNoteForm: function() {
341   - // find the form
342   - var form = $(".js-new-note-form");
343   - // insert the form after the button
344   - form.clone().replaceAll($(".js-main-target-form"));
345   -
346   - form = form.prev("form");
347   -
348   - // show the form
349   - NoteList.setupNoteForm(form);
350   -
351   - // fix classes
352   - form.removeClass("js-new-note-form");
353   - form.addClass("js-main-target-form");
354   -
355   - // remove unnecessary fields and buttons
356   - form.find("#note_line_code").remove();
357   - form.find(".js-close-discussion-note-form").remove();
358   - },
359   -
360   - /**
361   - * General note form setup.
362   - *
363   - * * deactivates the submit button when text is empty
364   - * * hides the preview button when text is empty
365   - * * setup GFM auto complete
366   - * * show the form
367   - */
368   - setupNoteForm: function(form) {
369   - disableButtonIfEmptyField(form.find(".js-note-text"), form.find(".js-comment-button"));
370   -
371   - form.removeClass("js-new-note-form");
372   -
373   - // setup preview buttons
374   - form.find(".js-note-edit-button, .js-note-preview-button")
375   - .tooltip({ placement: 'left' });
376   -
377   - previewButton = form.find(".js-note-preview-button");
378   - form.find(".js-note-text").on("input", function() {
379   - if ($(this).val().trim() !== "") {
380   - previewButton.removeClass("turn-off").addClass("turn-on");
381   - } else {
382   - previewButton.removeClass("turn-on").addClass("turn-off");
383   - }
384   - });
385   -
386   - // remove notify commit author checkbox for non-commit notes
387   - if (form.find("#note_noteable_type").val() !== "Commit") {
388   - form.find(".js-notify-commit-author").remove();
389   - }
390   -
391   - GitLab.GfmAutoComplete.setup();
392   -
393   - form.show();
394   - },
395   -
396   -
397   - /**
398   - * Handle loading the initial set of notes.
399   - * And set up loading more notes when scrolling to the bottom of the page.
400   - */
401   -
402   -
403   - /**
404   - * Gets an initial set of notes.
405   - */
406   - getContent: function() {
407   - $.ajax({
408   - url: NoteList.notes_path,
409   - data: NoteList.target_params,
410   - complete: function(){ $('.js-notes-busy').removeClass("loading")},
411   - beforeSend: function() { $('.js-notes-busy').addClass("loading") },
412   - dataType: "script"
413   - });
414   - },
415   -
416   - /**
417   - * Called in response to getContent().
418   - * Replaces the content of #notes-list with the given html.
419   - */
420   - setContent: function(newNoteIds, html) {
421   - $("#notes-list").html(html);
422   - },
423   -
424   -
425   - /**
426   - * Adds a single common note to #notes-list.
427   - */
428   - appendNewNote: function(id, html) {
429   - $("#notes-list").append(html);
430   - NoteList.updateVotes();
431   - },
432   -
433   - /**
434   - * Adds a single discussion note to #notes-list.
435   - *
436   - * Also removes the corresponding form.
437   - */
438   - appendNewDiscussionNote: function(discussionId, diffRowHtml, noteHtml) {
439   - var form = $("form[rel='"+discussionId+"']");
440   - var row = form.closest("tr");
441   -
442   - // is this the first note of discussion?
443   - if (row.is(".js-temp-notes-holder")) {
444   - // insert the note and the reply button after the temp row
445   - row.after(diffRowHtml);
446   - // remove the note (will be added again below)
447   - row.next().find(".note").remove();
448   - }
449   -
450   - // append new note to all matching discussions
451   - $(".notes[rel='"+discussionId+"']").append(noteHtml);
452   -
453   - // cleanup after successfully creating a diff/discussion note
454   - $.proxy(NoteList.removeDiscussionNoteForm, form).call();
455   - },
456   -
457   - /**
458   - * Called in response the main target form has been successfully submitted.
459   - *
460   - * Removes any errors.
461   - * Resets text and preview.
462   - * Resets buttons.
463   - */
464   - resetMainTargetForm: function(){
465   - var form = $(this);
466   -
467   - // remove validation errors
468   - form.find(".js-errors").remove();
469   -
470   - // reset text and preview
471   - var previewContainer = form.find(".js-toggler-container.note_text_and_preview");
472   - if (previewContainer.is(".on")) {
473   - previewContainer.removeClass("on");
474   - }
475   - form.find(".js-note-text").val("").trigger("input");
476   - },
477   -
478   - /**
479   - * Called after an attachment file has been selected.
480   - *
481   - * Updates the file name for the selected attachment.
482   - */
483   - updateFormAttachment: function() {
484   - var form = $(this).closest("form");
485   -
486   - // get only the basename
487   - var filename = $(this).val().replace(/^.*[\\\/]/, '');
488   -
489   - form.find(".js-attachment-filename").text(filename);
490   - },
491   -
492   - /**
493   - * Recalculates the votes and updates them (if they are displayed at all).
494   - *
495   - * Assumes all relevant notes are displayed (i.e. there are no more notes to
496   - * load via getMore()).
497   - * Might produce inaccurate results when not all notes have been loaded and a
498   - * recalculation is triggered (e.g. when deleting a note).
499   - */
500   - updateVotes: function() {
501   - var votes = $("#votes .votes");
502   - var notes = $("#notes-list .note .vote");
503   -
504   - // only update if there is a vote display
505   - if (votes.size()) {
506   - var upvotes = notes.filter(".upvote").size();
507   - var downvotes = notes.filter(".downvote").size();
508   - var votesCount = upvotes + downvotes;
509   - var upvotesPercent = votesCount ? (100.0 / votesCount * upvotes) : 0;
510   - var downvotesPercent = votesCount ? (100.0 - upvotesPercent) : 0;
511   -
512   - // change vote bar lengths
513   - votes.find(".bar-success").css("width", upvotesPercent+"%");
514   - votes.find(".bar-danger").css("width", downvotesPercent+"%");
515   - // replace vote numbers
516   - votes.find(".upvotes").text(votes.find(".upvotes").text().replace(/\d+/, upvotes));
517   - votes.find(".downvotes").text(votes.find(".downvotes").text().replace(/\d+/, downvotes));
518   - }
519   - },
520   -
521   - /**
522   - * Called in response to the edit note form being submitted
523   - *
524   - * Updates the current note field.
525   - * Hides the edit note form
526   - */
527   - updateNote: function(e, xhr, settings) {
528   - response = JSON.parse(xhr.responseText);
529   - if (response.success) {
530   - var note_li = $("#note_" + response.id);
531   - var note_text = note_li.find(".note-text");
532   - note_text.html(response.note).show();
533   -
534   - var note_form = note_li.find(".note-edit-form");
535   - note_form.hide();
536   - note_form.find(".btn-save").enableButton();
537   -
538   - // Update the "Edited at xxx label" on the note to show it's just been updated
539   - NoteList.rewriteTimestamp(note_li.find(".note-last-update"));
540   - }
541   - },
542   -
543   - /**
544   - * Called in response to the 'cancel note' link clicked, or after deleting a note attachment
545   - *
546   - * Hides the edit note form and shows the note
547   - * Resets the edit note form textarea with the original content of the note
548   - */
549   - resetNoteEditing: function(note) {
550   - note.find(".note-text").show();
551   -
552   - // Hide the attachment delete link
553   - note.find(".js-note-attachment-delete").hide();
554   -
555   - // Put the original content of the note back into the edit form textarea
556   - var form = note.find(".note-edit-form");
557   - var original_content = form.find(".note-original-content");
558   - form.find("textarea").val(original_content.text());
559   - original_content.remove();
560   -
561   - note.find(".note-edit-form").hide();
562   - },
563   -
564   - /**
565   - * Utility function to generate new timestamp text for a note
566   - *
567   - */
568   - rewriteTimestamp: function(element) {
569   - // Strip all newlines from the existing timestamp
570   - var ts = element.text().replace(/\n/g, ' ').trim();
571   -
572   - // If the timestamp already has '(Edited xxx ago)' text, remove it
573   - ts = ts.replace(new RegExp("\\(Edited [A-Za-z0-9 ]+\\)$", "gi"), "");
574   -
575   - // Append "(Edited just now)"
576   - ts = (ts + " <small>(Edited just now)</small>");
577   -
578   - element.html(ts);
579   - }
580   -};
app/assets/javascripts/notes.js.coffee 0 → 100644
... ... @@ -0,0 +1,432 @@
  1 +class Notes
  2 + @interval: null
  3 +
  4 + constructor: (notes_url, note_ids) ->
  5 + @notes_url = notes_url
  6 + @notes_url = gon.relative_url_root + @notes_url if gon.relative_url_root?
  7 + @note_ids = note_ids
  8 + @initRefresh()
  9 + @setupMainTargetNoteForm()
  10 + @cleanBinding()
  11 + @addBinding()
  12 +
  13 + addBinding: ->
  14 + # add note to UI after creation
  15 + $(document).on "ajax:success", ".js-main-target-form", @addNote
  16 + $(document).on "ajax:success", ".js-discussion-note-form", @addDiscussionNote
  17 +
  18 + # change note in UI after update
  19 + $(document).on "ajax:success", "form.edit_note", @updateNote
  20 +
  21 + # Edit note link
  22 + $(document).on "click", ".js-note-edit", @showEditForm
  23 + $(document).on "click", ".note-edit-cancel", @cancelEdit
  24 +
  25 + # remove a note (in general)
  26 + $(document).on "click", ".js-note-delete", @removeNote
  27 +
  28 + # delete note attachment
  29 + $(document).on "click", ".js-note-attachment-delete", @removeAttachment
  30 +
  31 + # Preview button
  32 + $(document).on "click", ".js-note-preview-button", @previewNote
  33 +
  34 + # reset main target form after submit
  35 + $(document).on "ajax:complete", ".js-main-target-form", @resetMainTargetForm
  36 +
  37 + # attachment button
  38 + $(document).on "click", ".js-choose-note-attachment-button", @chooseNoteAttachment
  39 +
  40 + # reply to diff/discussion notes
  41 + $(document).on "click", ".js-discussion-reply-button", @replyToDiscussionNote
  42 +
  43 + # add diff note
  44 + $(document).on "click", ".js-add-diff-note-button", @addDiffNote
  45 +
  46 + # hide diff note form
  47 + $(document).on "click", ".js-close-discussion-note-form", @cancelDiscussionForm
  48 +
  49 + cleanBinding: ->
  50 + $(document).off "ajax:success", ".js-main-target-form"
  51 + $(document).off "ajax:success", ".js-discussion-note-form"
  52 + $(document).off "ajax:success", "form.edit_note"
  53 + $(document).off "click", ".js-note-edit"
  54 + $(document).off "click", ".note-edit-cancel"
  55 + $(document).off "click", ".js-note-delete"
  56 + $(document).off "click", ".js-note-attachment-delete"
  57 + $(document).off "click", ".js-note-preview-button"
  58 + $(document).off "ajax:complete", ".js-main-target-form"
  59 + $(document).off "click", ".js-choose-note-attachment-button"
  60 + $(document).off "click", ".js-discussion-reply-button"
  61 + $(document).off "click", ".js-add-diff-note-button"
  62 +
  63 +
  64 + initRefresh: ->
  65 + clearInterval(Notes.interval)
  66 + Notes.interval = setInterval =>
  67 + @refresh()
  68 + , 15000
  69 +
  70 + refresh: ->
  71 + @getContent()
  72 +
  73 + getContent: ->
  74 + $.ajax
  75 + url: @notes_url
  76 + dataType: "json"
  77 + success: (data) =>
  78 + notes = data.notes
  79 + $.each notes, (i, note) =>
  80 + @renderNote(note)
  81 +
  82 +
  83 + ###
  84 + Render note in main comments area.
  85 +
  86 + Note: for rendering inline notes use renderDiscussionNote
  87 + ###
  88 + renderNote: (note) ->
  89 + # render note if it not present in loaded list
  90 + # or skip if rendered
  91 + if @isNewNote(note)
  92 + @note_ids.push(note.id)
  93 + $('ul.main-notes-list').append(note.html)
  94 +
  95 +
  96 + ###
  97 + Check if note does not exists on page
  98 + ###
  99 + isNewNote: (note) ->
  100 + $.inArray(note.id, @note_ids) == -1
  101 +
  102 +
  103 + ###
  104 + Render note in discussion area.
  105 +
  106 + Note: for rendering inline notes use renderDiscussionNote
  107 + ###
  108 + renderDiscussionNote: (note) ->
  109 + @note_ids.push(note.id)
  110 + form = $("form[rel='" + note.discussion_id + "']")
  111 + row = form.closest("tr")
  112 +
  113 + # is this the first note of discussion?
  114 + if row.is(".js-temp-notes-holder")
  115 + # insert the note and the reply button after the temp row
  116 + row.after note.discussion_html
  117 +
  118 + # remove the note (will be added again below)
  119 + row.next().find(".note").remove()
  120 +
  121 + # append new note to all matching discussions
  122 + $(".notes[rel='" + note.discussion_id + "']").append note.html
  123 +
  124 + # cleanup after successfully creating a diff/discussion note
  125 + @removeDiscussionNoteForm(form)
  126 +
  127 + ###
  128 + Shows the note preview.
  129 +
  130 + Lets the server render GFM into Html and displays it.
  131 +
  132 + Note: uses the Toggler behavior to toggle preview/edit views/buttons
  133 + ###
  134 + previewNote: (e) ->
  135 + e.preventDefault()
  136 + form = $(this).closest("form")
  137 + preview = form.find(".js-note-preview")
  138 + noteText = form.find(".js-note-text").val()
  139 + if noteText.trim().length is 0
  140 + preview.text "Nothing to preview."
  141 + else
  142 + preview.text "Loading..."
  143 + $.post($(this).data("url"),
  144 + note: noteText
  145 + ).success (previewData) ->
  146 + preview.html previewData
  147 +
  148 + ###
  149 + Called in response the main target form has been successfully submitted.
  150 +
  151 + Removes any errors.
  152 + Resets text and preview.
  153 + Resets buttons.
  154 + ###
  155 + resetMainTargetForm: ->
  156 + form = $(".js-main-target-form")
  157 +
  158 + # remove validation errors
  159 + form.find(".js-errors").remove()
  160 +
  161 + # reset text and preview
  162 + previewContainer = form.find(".js-toggler-container.note_text_and_preview")
  163 + previewContainer.removeClass "on" if previewContainer.is(".on")
  164 + form.find(".js-note-text").val("").trigger "input"
  165 +
  166 + ###
  167 + Called when clicking the "Choose File" button.
  168 +
  169 + Opens the file selection dialog.
  170 + ###
  171 + chooseNoteAttachment: ->
  172 + form = $(this).closest("form")
  173 + form.find(".js-note-attachment-input").click()
  174 +
  175 + ###
  176 + Shows the main form and does some setup on it.
  177 +
  178 + Sets some hidden fields in the form.
  179 + ###
  180 + setupMainTargetNoteForm: ->
  181 +
  182 + # find the form
  183 + form = $(".js-new-note-form")
  184 +
  185 + # insert the form after the button
  186 + form.clone().replaceAll $(".js-main-target-form")
  187 + form = form.prev("form")
  188 +
  189 + # show the form
  190 + @setupNoteForm(form)
  191 +
  192 + # fix classes
  193 + form.removeClass "js-new-note-form"
  194 + form.addClass "js-main-target-form"
  195 +
  196 + # remove unnecessary fields and buttons
  197 + form.find("#note_line_code").remove()
  198 + form.find(".js-close-discussion-note-form").remove()
  199 +
  200 + ###
  201 + General note form setup.
  202 +
  203 + deactivates the submit button when text is empty
  204 + hides the preview button when text is empty
  205 + setup GFM auto complete
  206 + show the form
  207 + ###
  208 + setupNoteForm: (form) ->
  209 + disableButtonIfEmptyField form.find(".js-note-text"), form.find(".js-comment-button")
  210 + form.removeClass "js-new-note-form"
  211 +
  212 + # setup preview buttons
  213 + form.find(".js-note-edit-button, .js-note-preview-button").tooltip placement: "left"
  214 + previewButton = form.find(".js-note-preview-button")
  215 + form.find(".js-note-text").on "input", ->
  216 + if $(this).val().trim() isnt ""
  217 + previewButton.removeClass("turn-off").addClass "turn-on"
  218 + else
  219 + previewButton.removeClass("turn-on").addClass "turn-off"
  220 +
  221 +
  222 + # remove notify commit author checkbox for non-commit notes
  223 + form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit"
  224 + GitLab.GfmAutoComplete.setup()
  225 + form.show()
  226 +
  227 +
  228 + ###
  229 + Called in response to the new note form being submitted
  230 +
  231 + Adds new note to list.
  232 + ###
  233 + addNote: (xhr, note, status) =>
  234 + @renderNote(note)
  235 + @updateVotes()
  236 +
  237 + ###
  238 + Called in response to the new note form being submitted
  239 +
  240 + Adds new note to list.
  241 + ###
  242 + addDiscussionNote: (xhr, note, status) =>
  243 + @renderDiscussionNote(note)
  244 +
  245 + ###
  246 + Called in response to the edit note form being submitted
  247 +
  248 + Updates the current note field.
  249 + ###
  250 + updateNote: (xhr, note, status) =>
  251 + note_li = $("#note_" + note.id)
  252 + note_li.replaceWith(note.html)
  253 +
  254 + ###
  255 + Called in response to clicking the edit note link
  256 +
  257 + Replaces the note text with the note edit form
  258 + Adds a hidden div with the original content of the note to fill the edit note form with
  259 + if the user cancels
  260 + ###
  261 + showEditForm: (e) ->
  262 + e.preventDefault()
  263 + note = $(this).closest(".note")
  264 + note.find(".note-text").hide()
  265 +
  266 + # Show the attachment delete link
  267 + note.find(".js-note-attachment-delete").show()
  268 + GitLab.GfmAutoComplete.setup()
  269 + form = note.find(".note-edit-form")
  270 + form.show()
  271 + form.find("textarea").focus()
  272 +
  273 + ###
  274 + Called in response to clicking the edit note link
  275 +
  276 + Hides edit form
  277 + ###
  278 + cancelEdit: (e) ->
  279 + e.preventDefault()
  280 + note = $(this).closest(".note")
  281 + note.find(".note-text").show()
  282 + note.find(".js-note-attachment-delete").hide()
  283 + note.find(".note-edit-form").hide()
  284 +
  285 + ###
  286 + Called in response to deleting a note of any kind.
  287 +
  288 + Removes the actual note from view.
  289 + Removes the whole discussion if the last note is being removed.
  290 + ###
  291 + removeNote: ->
  292 + note = $(this).closest(".note")
  293 + notes = note.closest(".notes")
  294 +
  295 + # check if this is the last note for this line
  296 + if notes.find(".note").length is 1
  297 +
  298 + # for discussions
  299 + notes.closest(".discussion").remove()
  300 +
  301 + # for diff lines
  302 + notes.closest("tr").remove()
  303 +
  304 + note.remove()
  305 +
  306 + ###
  307 + Called in response to clicking the delete attachment link
  308 +
  309 + Removes the attachment wrapper view, including image tag if it exists
  310 + Resets the note editing form
  311 + ###
  312 + removeAttachment: ->
  313 + note = $(this).closest(".note")
  314 + note.find(".note-attachment").remove()
  315 + note.find(".note-text").show()
  316 + note.find(".js-note-attachment-delete").hide()
  317 + note.find(".note-edit-form").hide()
  318 +
  319 + ###
  320 + Called when clicking on the "reply" button for a diff line.
  321 +
  322 + Shows the note form below the notes.
  323 + ###
  324 + replyToDiscussionNote: (e) =>
  325 + form = $(".js-new-note-form")
  326 + replyLink = $(e.target)
  327 + replyLink.hide()
  328 +
  329 + # insert the form after the button
  330 + form.clone().insertAfter replyLink
  331 +
  332 + # show the form
  333 + @setupDiscussionNoteForm(replyLink, replyLink.next("form"))
  334 +
  335 + ###
  336 + Shows the diff or discussion form and does some setup on it.
  337 +
  338 + Sets some hidden fields in the form.
  339 +
  340 + Note: dataHolder must have the "discussionId", "lineCode", "noteableType"
  341 + and "noteableId" data attributes set.
  342 + ###
  343 + setupDiscussionNoteForm: (dataHolder, form) =>
  344 + # setup note target
  345 + form.attr "rel", dataHolder.data("discussionId")
  346 + form.find("#note_commit_id").val dataHolder.data("commitId")
  347 + form.find("#note_line_code").val dataHolder.data("lineCode")
  348 + form.find("#note_noteable_type").val dataHolder.data("noteableType")
  349 + form.find("#note_noteable_id").val dataHolder.data("noteableId")
  350 + @setupNoteForm form
  351 + form.find(".js-note-text").focus()
  352 + form.addClass "js-discussion-note-form"
  353 +
  354 + ###
  355 + General note form setup.
  356 +
  357 + deactivates the submit button when text is empty
  358 + hides the preview button when text is empty
  359 + setup GFM auto complete
  360 + show the form
  361 + ###
  362 + setupNoteForm: (form) =>
  363 + disableButtonIfEmptyField form.find(".js-note-text"), form.find(".js-comment-button")
  364 + form.removeClass "js-new-note-form"
  365 + form.removeClass "js-new-note-form"
  366 + GitLab.GfmAutoComplete.setup()
  367 +
  368 + # setup preview buttons
  369 + previewButton = form.find(".js-note-preview-button")
  370 + form.find(".js-note-text").on "input", ->
  371 + if $(this).val().trim() isnt ""
  372 + previewButton.removeClass("turn-off").addClass "turn-on"
  373 + else
  374 + previewButton.removeClass("turn-on").addClass "turn-off"
  375 +
  376 + form.show()
  377 +
  378 + ###
  379 + Called when clicking on the "add a comment" button on the side of a diff line.
  380 +
  381 + Inserts a temporary row for the form below the line.
  382 + Sets up the form and shows it.
  383 + ###
  384 + addDiffNote: (e) =>
  385 + e.preventDefault()
  386 + link = e.target
  387 + form = $(".js-new-note-form")
  388 + row = $(link).closest("tr")
  389 + nextRow = row.next()
  390 +
  391 + # does it already have notes?
  392 + if nextRow.is(".notes_holder")
  393 + replyButton = nextRow.find(".js-discussion-reply-button")
  394 + if replyButton.length > 0
  395 + $.proxy(@replyToDiscussionNote, replyButton).call()
  396 + else
  397 + # add a notes row and insert the form
  398 + row.after "<tr class=\"notes_holder js-temp-notes-holder\"><td class=\"notes_line\" colspan=\"2\"></td><td class=\"notes_content\"></td></tr>"
  399 + form.clone().appendTo row.next().find(".notes_content")
  400 +
  401 + # show the form
  402 + @setupDiscussionNoteForm $(link), row.next().find("form")
  403 +
  404 + ###
  405 + Called in response to "cancel" on a diff note form.
  406 +
  407 + Shows the reply button again.
  408 + Removes the form and if necessary it's temporary row.
  409 + ###
  410 + removeDiscussionNoteForm: (form)->
  411 + row = form.closest("tr")
  412 +
  413 + # show the reply button (will only work for replies)
  414 + form.prev(".js-discussion-reply-button").show()
  415 + if row.is(".js-temp-notes-holder")
  416 + # remove temporary row for diff lines
  417 + row.remove()
  418 + else
  419 + # only remove the form
  420 + form.remove()
  421 +
  422 +
  423 + cancelDiscussionForm: (e) =>
  424 + e.preventDefault()
  425 + form = $(".js-new-note-form")
  426 + form = $(e.target).closest(".js-discussion-note-form")
  427 + @removeDiscussionNoteForm(form)
  428 +
  429 + updateVotes: ->
  430 + (new NotesVotes).updateVotes()
  431 +
  432 +@Notes = Notes
... ...
app/assets/javascripts/notes_votes.js.coffee 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class NotesVotes
  2 + updateVotes: ->
  3 + votes = $("#votes .votes")
  4 + notes = $("#notes-list .note .vote")
  5 +
  6 + # only update if there is a vote display
  7 + if votes.size()
  8 + upvotes = notes.filter(".upvote").size()
  9 + downvotes = notes.filter(".downvote").size()
  10 + votesCount = upvotes + downvotes
  11 + upvotesPercent = (if votesCount then (100.0 / votesCount * upvotes) else 0)
  12 + downvotesPercent = (if votesCount then (100.0 - upvotesPercent) else 0)
  13 +
  14 + # change vote bar lengths
  15 + votes.find(".bar-success").css "width", upvotesPercent + "%"
  16 + votes.find(".bar-danger").css "width", downvotesPercent + "%"
  17 +
  18 + # replace vote numbers
  19 + votes.find(".upvotes").text votes.find(".upvotes").text().replace(/\d+/, upvotes)
  20 + votes.find(".downvotes").text votes.find(".downvotes").text().replace(/\d+/, downvotes)
  21 +
  22 +@NotesVotes = NotesVotes
... ...
app/assets/javascripts/pager.js.coffee
... ... @@ -19,8 +19,9 @@
19 19 data: "limit=" + @limit + "&offset=" + @offset
20 20 complete: ->
21 21 $(".loading").hide()
22   -
23   - dataType: "script"
  22 + success: (data) ->
  23 + Pager.append(data.count, data.html)
  24 + dataType: "json"
24 25  
25 26 append: (count, html) ->
26 27 $(".content_list").append html
... ...
app/assets/javascripts/project.js.coffee
... ... @@ -40,3 +40,9 @@ $ -&gt;
40 40 # Ref switcher
41 41 $('.project-refs-select').on 'change', ->
42 42 $(@).parents('form').submit()
  43 +
  44 + $('.hide-no-ssh-message').on 'click', (e) ->
  45 + path = '/'
  46 + $.cookie('hide_no_ssh_message', 'false', { path: path })
  47 + $(@).parents('.no-ssh-key-message').hide()
  48 + e.preventDefault()
... ...
app/assets/javascripts/stat_graph_contributors_graph.js.coffee
... ... @@ -46,11 +46,7 @@ class window.ContributorsGraph
46 46  
47 47 class window.ContributorsMasterGraph extends ContributorsGraph
48 48 constructor: (@data) ->
49   - if $(window).width() > 1214
50   - @width = 1100
51   - else
52   - @width = 870
53   -
  49 + @width = $('.container').width() - 70
54 50 @height = 200
55 51 @x = null
56 52 @y = null
... ... @@ -88,7 +84,6 @@ class window.ContributorsMasterGraph extends ContributorsGraph
88 84 x(d.date)
89 85 ).y0(@height).y1((d) ->
90 86 xa = d.commits = d.commits ? d.additions ? d.deletions
91   - console.log(xa)
92 87 y(xa)
93 88 ).interpolate("basis")
94 89 create_brush: ->
... ... @@ -124,11 +119,7 @@ class window.ContributorsMasterGraph extends ContributorsGraph
124 119  
125 120 class window.ContributorsAuthorGraph extends ContributorsGraph
126 121 constructor: (@data) ->
127   - if $(window).width() > 1214
128   - @width = 490
129   - else
130   - @width = 380
131   -
  122 + @width = $('.container').width()/2 - 100
132 123 @height = 200
133 124 @x = null
134 125 @y = null
... ...
app/assets/javascripts/users_select.js.coffee
... ... @@ -6,12 +6,12 @@ $ -&gt;
6 6 avatar = gon.gravatar_url
7 7 avatar = avatar.replace('%{hash}', md5(user.email))
8 8 avatar = avatar.replace('%{size}', '24')
9   - markup = "<div class='user-result'>"
10   - markup += "<div class='user-image'><img class='avatar s24' src='" + avatar + "'></div>"
11   - markup += "<div class='user-name'>" + user.name + "</div>"
12   - markup += "<div class='user-username'>" + user.username + "</div>"
13   - markup += "</div>"
14   - markup
  9 +
  10 + "<div class='user-result'>
  11 + <div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
  12 + <div class='user-name'>#{user.name}</div>
  13 + <div class='user-username'>#{user.username}</div>
  14 + </div>"
15 15  
16 16 userFormatSelection = (user) ->
17 17 user.name
... ...
app/assets/stylesheets/application.scss
... ... @@ -9,36 +9,41 @@
9 9 *= require_self
10 10 */
11 11  
  12 +@import "main/variables.scss";
  13 +@import "main/mixins.scss";
  14 +@import "main/fonts.scss";
  15 +
12 16 /**
13   - * GitLab bootstrap:
  17 + * Customized Twitter bootstrap
14 18 */
15   -@import "gitlab_bootstrap.scss";
  19 +@import 'gl_bootstrap';
16 20  
  21 +/**
  22 + * Font icons
  23 + *
  24 + */
  25 +@import "font-awesome";
  26 +
  27 +/**
  28 + * Generic css (forms, nav etc):
  29 + */
  30 +@import "generic.scss";
  31 +
  32 +
  33 +/**
  34 + * Unrefactored css
  35 + */
17 36 @import "common.scss";
18   -@import "selects.scss";
19   -
20   -@import "sections/header.scss";
21   -@import "sections/nav.scss";
22   -@import "sections/commits.scss";
23   -@import "sections/issues.scss";
24   -@import "sections/projects.scss";
25   -@import "sections/snippets.scss";
26   -@import "sections/votes.scss";
27   -@import "sections/merge_requests.scss";
28   -@import "sections/graph.scss";
29   -@import "sections/events.scss";
30   -@import "sections/themes.scss";
31   -@import "sections/tree.scss";
32   -@import "sections/notes.scss";
33   -@import "sections/profile.scss";
34   -@import "sections/login.scss";
35   -@import "sections/editor.scss";
36   -@import "sections/admin.scss";
37   -@import "sections/wiki.scss";
38   -@import "sections/wall.scss";
39   -@import "sections/dashboard.scss";
40   -@import "sections/stat_graph.scss";
41 37  
  38 +
  39 +/**
  40 + * Page specific styles (issues, projects etc):
  41 + */
  42 +@import "sections.scss";
  43 +
  44 +/**
  45 + * Code ighlight
  46 + */
42 47 @import "highlight/white.scss";
43 48 @import "highlight/dark.scss";
44 49 @import "highlight/solarized_dark.scss";
... ... @@ -57,4 +62,3 @@
57 62 * Styles for JS behaviors.
58 63 */
59 64 @import "behaviors.scss";
60   -
... ...
app/assets/stylesheets/common.scss
... ... @@ -5,6 +5,8 @@ html {
5 5 /** LAYOUT **/
6 6  
7 7 body {
  8 + -webkit-font-smoothing: antialiased;
  9 + -moz-osx-font-smoothing: grayscale;
8 10 margin-bottom: 20px;
9 11 }
10 12  
... ... @@ -117,18 +119,6 @@ p.time {
117 119 margin: 30px 3px 3px 2px;
118 120 }
119 121  
120   -.search-holder {
121   - label, input {
122   - height: 30px;
123   - padding: 0;
124   - font-size: 14px;
125   - }
126   - label {
127   - line-height: 30px;
128   - color: #666;
129   - }
130   -}
131   -
132 122 .highlight {
133 123 text-shadow: none;
134 124 }
... ... @@ -207,7 +197,7 @@ li.note {
207 197 }
208 198  
209 199 .git_error_tips {
210   - @extend .span6;
  200 + @extend .col-md-6;
211 201 text-align: left;
212 202 margin-top: 40px;
213 203 pre {
... ... @@ -220,7 +210,6 @@ li.note {
220 210 .error-message {
221 211 padding: 10px;
222 212 background: #C67;
223   - padding-left: 20px;
224 213 margin: 0;
225 214 color: #FFF;
226 215  
... ... @@ -228,8 +217,18 @@ li.note {
228 217 color: #fff;
229 218 text-decoration: underline;
230 219 }
231   - &.centered {
232   - text-align: center;
  220 +}
  221 +
  222 +.no-ssh-key-message {
  223 + padding: 10px 0;
  224 + background: #C67;
  225 + margin: 0;
  226 + color: #FFF;
  227 + text-align: center;
  228 +
  229 + a {
  230 + color: #fff;
  231 + text-decoration: underline;
233 232 }
234 233 }
235 234  
... ... @@ -317,11 +316,6 @@ img.emoji {
317 316 margin-bottom: 10px;
318 317 }
319 318  
320   -.group-name {
321   - font-size: 14px;
322   - line-height: 24px;
323   -}
324   -
325 319 table {
326 320 td.permission-x {
327 321 background: #D9EDF7 !important;
... ... @@ -341,4 +335,57 @@ table {
341 335 .navbar-gitlab .navbar-inner .nav > li .btn-sign-in {
342 336 @extend .btn-new;
343 337 padding: 5px 15px;
  338 + text-shadow: none;
  339 +}
  340 +
  341 +.broadcast-message {
  342 + padding: 10px;
  343 + text-align: center;
  344 + background: #555;
  345 + color: #BBB;
  346 +}
  347 +
  348 +.broadcast-message-preview {
  349 + @extend .broadcast-message;
  350 + margin-bottom: 20px;
  351 +}
  352 +
  353 +.ajax-users-select {
  354 + width: 400px;
  355 +
  356 + &.input-large {
  357 + width: 210px;
  358 + }
  359 +
  360 + &.input-clamp {
  361 + max-width: 100%;
  362 + }
  363 +}
  364 +
  365 +.user-result {
  366 + .user-image {
  367 + float: left;
  368 + }
  369 + .user-name {
  370 + }
  371 + .user-username {
  372 + color: #999;
  373 + }
  374 +}
  375 +
  376 +.namespace-result {
  377 + .namespace-kind {
  378 + color: #AAA;
  379 + font-weight: normal;
  380 + }
  381 + .namespace-path {
  382 + margin-left: 10px;
  383 + font-weight: bolder;
  384 + }
  385 +}
  386 +
  387 +.side-filters {
  388 + fieldset {
  389 + margin-bottom: 15px;
  390 + }
344 391 }
... ...
app/assets/stylesheets/generic.scss 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +@import "generic/avatar.scss";
  2 +@import "generic/nav.scss";
  3 +@import "generic/common.scss";
  4 +@import "generic/typography.scss";
  5 +@import "generic/buttons.scss";
  6 +@import "generic/blocks.scss";
  7 +@import "generic/ui_box.scss";
  8 +@import "generic/issue_box.scss";
  9 +@import "generic/files.scss";
  10 +@import "generic/lists.scss";
  11 +@import "generic/forms.scss";
  12 +@import "generic/selects.scss";
... ...
app/assets/stylesheets/generic/avatar.scss 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +.avatar {
  2 + float: left;
  3 + margin-right: 12px;
  4 + width: 40px;
  5 + padding: 1px;
  6 + @include border-radius(4px);
  7 +
  8 + &.avatar-inline {
  9 + float: none;
  10 + margin-left: 3px;
  11 +
  12 + &.s16 { margin-right: 2px; }
  13 + &.s24 { margin-right: 2px; }
  14 + }
  15 +
  16 + &.s16 { width: 16px; height: 16px; margin-right: 6px; }
  17 + &.s24 { width: 24px; height: 24px; margin-right: 8px; }
  18 + &.s26 { width: 26px; height: 26px; margin-right: 8px; }
  19 + &.s32 { width: 32px; height: 32px; margin-right: 10px; }
  20 + &.s60 { width: 60px; height: 60px; margin-right: 12px; }
  21 + &.s90 { width: 90px; height: 90px; margin-right: 15px; }
  22 + &.s160 { width: 160px; height: 160px; margin-right: 20px; }
  23 +}
... ...
app/assets/stylesheets/generic/blocks.scss 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 +.light-well {
  2 + background: #f9f9f9;
  3 + padding: 15px;
  4 +}
... ...
app/assets/stylesheets/generic/buttons.scss 0 → 100644
... ... @@ -0,0 +1,158 @@
  1 +.btn {
  2 + display: inline-block;
  3 + margin-bottom: 0;
  4 + font-weight: normal;
  5 + text-align: center;
  6 + vertical-align: middle;
  7 + cursor: pointer;
  8 + background-image: none;
  9 + border: 1px solid transparent;
  10 + white-space: nowrap;
  11 + padding: 6px 12px;
  12 + font-size: 13px;
  13 + line-height: 18px;
  14 + border-radius: 4px;
  15 + -webkit-user-select: none;
  16 + -moz-user-select: none;
  17 + -ms-user-select: none;
  18 + -o-user-select: none;
  19 + user-select: none;
  20 + color: #444444;
  21 + background-color: #fff;
  22 + border-color: #ccc;
  23 + text-shadow: none;
  24 +
  25 + &.hover,
  26 + &:hover {
  27 + color: #444444;
  28 + text-decoration: none;
  29 + background-color: #ebebeb;
  30 + border-color: #adadad;
  31 + }
  32 +
  33 + &.focus,
  34 + &:focus {
  35 + color: #444444;
  36 + text-decoration: none;
  37 + outline: thin dotted #333;
  38 + outline: 5px auto -webkit-focus-ring-color;
  39 + outline-offset: -2px;
  40 + }
  41 +
  42 + &.active,
  43 + &:active {
  44 + outline: 0;
  45 + background-image: none;
  46 + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
  47 + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
  48 + }
  49 +
  50 + &.disabled,
  51 + &[disabled] {
  52 + cursor: not-allowed;
  53 + pointer-events: none;
  54 + opacity: 0.65;
  55 + filter: alpha(opacity=65);
  56 + -webkit-box-shadow: none;
  57 + box-shadow: none;
  58 + }
  59 +
  60 + &.btn-primary {
  61 + color: #ffffff;
  62 + background-color: #429bca;
  63 + border-color: #358ebd;
  64 +
  65 + &.hover,
  66 + &:hover,
  67 + &.disabled,
  68 + &[disabled] {
  69 + color: #ffffff;
  70 + background-color: #3286b1;
  71 + border-color: #286e8e;
  72 + }
  73 + }
  74 +
  75 + &.btn-success {
  76 + color: #ffffff;
  77 + background-color: #5cb85c;
  78 + border-color: #4cae4c;
  79 +
  80 +
  81 + &.hover,
  82 + &:hover,
  83 + &.disabled,
  84 + &[disabled] {
  85 + color: #ffffff;
  86 + background-color: #47a447;
  87 + border-color: #398439;
  88 + }
  89 + }
  90 +
  91 + &.btn-danger {
  92 + color: #ffffff;
  93 + background-color: #d9534f;
  94 + border-color: #d43f3a;
  95 +
  96 +
  97 + &.hover,
  98 + &:hover,
  99 + &.disabled,
  100 + &[disabled] {
  101 + color: #ffffff;
  102 + background-color: #d2322d;
  103 + border-color: #ac2925;
  104 + }
  105 + }
  106 +
  107 + &.btn-new {
  108 + @extend .btn-success;
  109 + }
  110 +
  111 + &.btn-create {
  112 + @extend .wide;
  113 + @extend .btn-success;
  114 + }
  115 +
  116 + &.btn-save {
  117 + @extend .wide;
  118 + @extend .btn-primary;
  119 + }
  120 +
  121 + &.btn-close,
  122 + &.btn-remove {
  123 + @extend .btn-danger;
  124 + }
  125 +
  126 + &.btn-cancel {
  127 + float: right;
  128 + }
  129 +
  130 + &.wide {
  131 + padding-left: 20px;
  132 + padding-right: 20px;
  133 + }
  134 +
  135 + &.btn-small {
  136 + padding: 2px 10px;
  137 + font-size: 12px;
  138 + }
  139 +
  140 + &.btn-tiny {
  141 + font-size: 11px;
  142 + padding: 2px 6px;
  143 + line-height: 16px;
  144 + margin: 2px;
  145 + }
  146 +
  147 + &.grouped {
  148 + margin-right: 7px;
  149 + float: left;
  150 + }
  151 +
  152 + &.btn-block {
  153 + width: 100%;
  154 + margin: 0;
  155 + padding: 6px 0;
  156 + margin-bottom: 15px;
  157 + }
  158 +}
... ...
app/assets/stylesheets/generic/common.scss 0 → 100644
... ... @@ -0,0 +1,121 @@
  1 +/** COLORS **/
  2 +.cgray { color: gray }
  3 +.clgray { color: #BBB }
  4 +.cred { color: #D12F19 }
  5 +.cgreen { color: #4a2 }
  6 +.cblue { color: #29A }
  7 +.cblack { color: #111 }
  8 +.cdark { color: #444 }
  9 +.camber { color: #ffc000 }
  10 +.cwhite { color: #fff!important }
  11 +.bgred { background: #F2DEDE!important }
  12 +
  13 +/** COMMON CLASSES **/
  14 +.left { float:left }
  15 +
  16 +.prepend-top-10 { margin-top:10px }
  17 +.prepend-top-20 { margin-top:20px }
  18 +.prepend-left-10 { margin-left:10px }
  19 +.prepend-left-20 { margin-left:20px }
  20 +.append-right-10 { margin-right:10px }
  21 +.append-right-20 { margin-right:20px }
  22 +.append-bottom-10 { margin-bottom:10px }
  23 +.append-bottom-15 { margin-bottom:15px }
  24 +.append-bottom-20 { margin-bottom:20px }
  25 +.inline { display: inline-block }
  26 +
  27 +.padded { padding:20px }
  28 +.ipadded { padding:20px!important }
  29 +.lborder { border-left:1px solid #eee }
  30 +.underlined_link { text-decoration: underline; }
  31 +.hint { font-style: italic; color: #999; }
  32 +.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 +
  54 +.slead {
  55 + color: #666;
  56 + font-size: 14px;
  57 + margin-bottom: 12px;
  58 + font-weight: normal;
  59 + line-height: 24px;
  60 +}
  61 +
  62 +
  63 +.tab-content {
  64 + overflow: visible;
  65 +}
  66 +
  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;
  100 + }
  101 +
  102 + &.state-label-red {
  103 + background: #DA4E49;
  104 + color: #FFF;
  105 + }
  106 +}
  107 +
  108 +.dropdown-menu > li > a {
  109 + text-shadow: none;
  110 +}
  111 +
  112 +.dropdown-menu > li > a:hover,
  113 +.dropdown-menu > li > a:focus {
  114 + background: #29b;
  115 +}
  116 +
  117 +.breadcrumb > li + li:before {
  118 + content: "/";
  119 + padding: 0;
  120 + color: #666;
  121 +}
... ...
app/assets/stylesheets/generic/files.scss 0 → 100644
... ... @@ -0,0 +1,218 @@
  1 +/**
  2 + * File content holder
  3 + *
  4 + */
  5 +.file-holder {
  6 + border: 1px solid #CCC;
  7 + margin-bottom: 1em;
  8 +
  9 + table {
  10 + @extend .table;
  11 + }
  12 +
  13 + .file-title {
  14 + background: #DDD;
  15 + border-bottom: 1px solid #CCC;
  16 + text-shadow: 0 1px 1px #fff;
  17 + margin: 0;
  18 + font-weight: normal;
  19 + font-weight: bold;
  20 + text-align: left;
  21 + color: $style_color;
  22 + padding: 9px 10px;
  23 +
  24 + .options {
  25 + float: right;
  26 + margin-top: -5px;
  27 + }
  28 +
  29 + .file_name {
  30 + color: $style_color;
  31 + font-size: 14px;
  32 + text-shadow: 0 1px 1px #fff;
  33 + small {
  34 + color: #999;
  35 + font-size: 13px;
  36 + }
  37 + }
  38 + }
  39 + .file-content {
  40 + background: #fff;
  41 + font-size: 11px;
  42 +
  43 + &.image_file {
  44 + background: #eee;
  45 + text-align: center;
  46 + img {
  47 + padding: 100px;
  48 + max-width: 300px;
  49 + }
  50 + }
  51 +
  52 + &.wiki {
  53 + padding: 20px;
  54 + font-size: 14px;
  55 + line-height: 1.6;
  56 +
  57 + .highlight {
  58 + margin-bottom: 9px;
  59 + @include border-radius(4px);
  60 +
  61 + > pre {
  62 + margin: 0;
  63 + }
  64 + }
  65 + }
  66 +
  67 + &.blob_file {
  68 +
  69 + }
  70 +
  71 + &.blob-no-preview {
  72 + background: #eee;
  73 + text-shadow: 0 1px 2px #FFF;
  74 + padding: 100px 0;
  75 + }
  76 +
  77 + /**
  78 + * Blame file
  79 + */
  80 + &.blame {
  81 + table {
  82 + border: none;
  83 + box-shadow: none;
  84 + margin: 0;
  85 + }
  86 + tr {
  87 + border-bottom: 1px solid #eee;
  88 + }
  89 + td {
  90 + &:first-child {
  91 + border-left: none;
  92 + }
  93 + &:last-child {
  94 + border-right: none;
  95 + }
  96 + background: #fff;
  97 + padding: 5px;
  98 + }
  99 + .author,
  100 + .blame_commit {
  101 + background: #f5f5f5;
  102 + vertical-align: top;
  103 + }
  104 + .lines {
  105 + pre {
  106 + padding: 0;
  107 + margin: 0;
  108 + background: none;
  109 + border: none;
  110 + }
  111 + }
  112 + }
  113 +
  114 + &.logs {
  115 + background: #eee;
  116 + max-height: 700px;
  117 + overflow-y: auto;
  118 +
  119 + ol {
  120 + margin-left: 40px;
  121 + padding: 10px 0;
  122 + border-left: 1px solid #CCC;
  123 + margin-bottom: 0;
  124 + background: white;
  125 + li {
  126 + color: #888;
  127 + p {
  128 + margin: 0;
  129 + color: #333;
  130 + line-height: 24px;
  131 + padding-left: 10px;
  132 + }
  133 +
  134 + &:hover {
  135 + background: $hover;
  136 + }
  137 + }
  138 + }
  139 + }
  140 +
  141 + /**
  142 + * Code file
  143 + */
  144 + &.code {
  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 + }
  216 + }
  217 +}
  218 +
... ...
app/assets/stylesheets/generic/forms.scss 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +input[type='search'].search-text-input {
  2 + background-image: url("icon-search.png");
  3 + background-repeat: no-repeat;
  4 + background-position: 10px;
  5 + padding-left: 25px;
  6 +}
  7 +
  8 +input[type='text'].danger {
  9 + background: #F2DEDE!important;
  10 + border-color: #D66;
  11 + text-shadow: 0 1px 1px #fff
  12 +}
  13 +
  14 +fieldset legend {
  15 + font-size: 16px;
  16 +}
  17 +
  18 +.datetime-controls {
  19 + select {
  20 + width: 100px;
  21 + }
  22 +}
  23 +
  24 +.form-actions {
  25 + padding: 17px 20px 18px;
  26 + margin-top: 18px;
  27 + margin-bottom: 18px;
  28 + background-color: whitesmoke;
  29 + border-top: 1px solid #e5e5e5;
  30 + padding-left: 17%;
  31 +}
  32 +
  33 +label {
  34 + &.control-label {
  35 + @extend .col-sm-2;
  36 + }
  37 +
  38 + &.inline-label {
  39 + margin: 0;
  40 + }
  41 +}
  42 +
  43 +.inline-input-group {
  44 + width: 250px;
  45 +}
  46 +
  47 +.input-mx-250 {
  48 + max-width: 250px;
  49 +}
... ...
app/assets/stylesheets/generic/issue_box.scss 0 → 100644
... ... @@ -0,0 +1,46 @@
  1 +/**
  2 + * Issue box:
  3 + * Huge block (one per page) for storing title, descripion and other information.
  4 + * Used for Issue#show page, MergeRequest#show page etc
  5 + *
  6 + * CLasses:
  7 + * .issue-box - Regular box
  8 + */
  9 +
  10 +.issue-box {
  11 + color: #666;
  12 + margin:20px 0;
  13 + background: #FAFAFA;
  14 + border: 1px solid #DDD;
  15 +
  16 + .control-group {
  17 + margin-bottom: 0;
  18 + }
  19 +
  20 + .title {
  21 + font-size: 20px;
  22 + font-weight: 500;
  23 + line-height: 28px;
  24 + margin: 0;
  25 + color: #444;
  26 + }
  27 +
  28 + .context {
  29 + border: none;
  30 + background-color: #f5f5f5;
  31 + border: none;
  32 + border-top: 1px solid #eee;
  33 + }
  34 +
  35 + .description {
  36 + border-top: 1px solid #eee;
  37 + }
  38 +
  39 + .title, .context, .description {
  40 + padding: 15px;
  41 +
  42 + .clearfix {
  43 + margin: 0;
  44 + }
  45 + }
  46 +}
... ...
app/assets/stylesheets/generic/lists.scss 0 → 100644
... ... @@ -0,0 +1,97 @@
  1 +/**
  2 + * Well styled list
  3 + *
  4 + */
  5 +.well-list {
  6 + margin: 0;
  7 + padding: 0;
  8 + list-style: none;
  9 +
  10 + li {
  11 + padding: 10px;
  12 + min-height: 20px;
  13 + border-bottom: 1px solid #eee;
  14 + border-bottom: 1px solid rgba(0, 0, 0, 0.05);
  15 +
  16 + &.disabled {
  17 + color: #888;
  18 + }
  19 +
  20 + &.unstyled {
  21 + &:hover {
  22 + background: none;
  23 + }
  24 + }
  25 +
  26 + &.smoke { background-color: #f5f5f5; }
  27 +
  28 + &:hover {
  29 + background: $hover;
  30 + border-bottom: 1px solid #ADF;
  31 + }
  32 +
  33 + &:last-child {
  34 + border-bottom: none;
  35 +
  36 + &.bottom {
  37 + background: #f5f5f5;
  38 + }
  39 + }
  40 +
  41 + .author { color: #999; }
  42 +
  43 + p {
  44 + padding-top: 1px;
  45 + margin: 0;
  46 + color: #222;
  47 + img {
  48 + position: relative;
  49 + top: 3px;
  50 + }
  51 + }
  52 +
  53 + .well-title {
  54 + font-size: 14px;
  55 + line-height: 18px;
  56 + }
  57 + }
  58 +}
  59 +
  60 +ol, ul {
  61 + &.styled {
  62 + li {
  63 + padding: 2px;
  64 + }
  65 + }
  66 +}
  67 +
  68 +/** light list with border-bottom between li **/
  69 +ul.bordered-list {
  70 + margin: 5px 0px;
  71 + padding: 0px;
  72 + li {
  73 + padding: 5px 0;
  74 + border-bottom: 1px solid #EEE;
  75 + overflow: hidden;
  76 + display: block;
  77 + margin: 0px;
  78 + &:last-child { border:none }
  79 + &.active {
  80 + background: #f9f9f9;
  81 + a { font-weight: bold; }
  82 + }
  83 +
  84 + &.light {
  85 + a { color: #777; }
  86 + }
  87 + }
  88 +
  89 + &.top-list {
  90 + li:first-child {
  91 + padding-top: 0;
  92 + h4, h5 {
  93 + margin-top: 0;
  94 + }
  95 + }
  96 + }
  97 +}
... ...
app/assets/stylesheets/generic/nav.scss 0 → 100644
... ... @@ -0,0 +1,64 @@
  1 +/**
  2 + * nav-pills
  3 + *
  4 + */
  5 +.nav-pills {
  6 + .active a {
  7 + background: $primary_color;
  8 + }
  9 +
  10 + > li > a {
  11 + @include border-radius(0);
  12 + }
  13 +
  14 + &.nav-stacked {
  15 + > li > a {
  16 + border-left: 4px solid #EEE;
  17 + padding: 12px;
  18 + color: #777;
  19 + }
  20 + > .active > a {
  21 + border-color: $primary_color;
  22 + background: none;
  23 + color: #333;
  24 + font-weight: bolder;
  25 +
  26 + &:hover {
  27 + background: none;
  28 + color: #333;
  29 + }
  30 + }
  31 +
  32 + &.nav-stacked-menu {
  33 + li > a {
  34 + padding: 16px;
  35 + }
  36 + }
  37 + }
  38 +
  39 + &.nav-pills-small {
  40 + > li > a {
  41 + padding: 8px 12px;
  42 + font-size: 12px;
  43 + }
  44 + }
  45 +}
  46 +
  47 +.nav-pills > .active > a > i[class^="icon-"] { background: inherit; }
  48 +
  49 +
  50 +
  51 +/**
  52 + * nav-tabs
  53 + *
  54 + */
  55 +.nav-tabs > li > a, .nav-pills > li > a { color: $style_color; }
  56 +
  57 +/**
  58 + * fix to keep tooltips position in top navigation bar
  59 + *
  60 + */
  61 +.navbar .nav > li {
  62 + position: relative;
  63 + white-space: nowrap;
  64 +}
... ...
app/assets/stylesheets/generic/selects.scss 0 → 100644
... ... @@ -0,0 +1,103 @@
  1 +/** Chosen.js selectbox style override **/
  2 +.chosen-container {
  3 + min-width: 100px;
  4 +
  5 + .chosen-single {
  6 + height: 26px;
  7 + background: #EEE !important;
  8 + border: 1px solid #DDD !important;
  9 + @include box-shadow(none !important);
  10 + @include border-radius(4px !important);
  11 + }
  12 +
  13 + .chosen-results li.highlighted {
  14 + background: #29b;
  15 + }
  16 +
  17 + .chosen-drop {
  18 + margin-top: 10px;
  19 + border: 1px solid #DDD !important;
  20 + @include border-radius(4px !important);
  21 + }
  22 +
  23 + .chosen-search input {
  24 + border: 1px solid #CCC !important;
  25 + @include box-shadow(none !important);
  26 + }
  27 +}
  28 +
  29 +/** Select2 styling **/
  30 +.select2-container .select2-choice {
  31 + @include bg-light-gray-gradient;
  32 +}
  33 +
  34 +.select2-container .select2-choice div {
  35 + border: none;
  36 + background: none;
  37 +}
  38 +
  39 +.select2-drop {
  40 + padding-top: 8px;
  41 +}
  42 +
  43 +.select2-no-results, .select2-searching {
  44 + padding: 7px;
  45 + color: #666;
  46 +}
  47 +
  48 +.chosen-container .chosen-single div b {
  49 + background-position-y: 0px !important;
  50 +}
  51 +
  52 +.chosen-container .chosen-drop .chosen-search input {
  53 + background-position-y: -24px !important;
  54 +}
  55 +
  56 +.chosen-compact {
  57 + max-width: 170px !important;
  58 +}
  59 +
  60 +select {
  61 + &.chosen {
  62 + width: 100px;
  63 + }
  64 +
  65 + &.chosen-sm {
  66 + width: 100px;
  67 + }
  68 +}
  69 +
  70 +@media (min-width: $screen-sm-min) {
  71 + select {
  72 + &.chosen {
  73 + width: 150px;
  74 + }
  75 + &.chosen-sm {
  76 + width: 120px;
  77 + }
  78 + }
  79 +}
  80 +
  81 +/* Medium devices (desktops, 992px and up) */
  82 +@media (min-width: $screen-md-min) {
  83 + select {
  84 + &.chosen {
  85 + width: 170px;
  86 + }
  87 + &.chosen-sm {
  88 + width: 140px;
  89 + }
  90 + }
  91 +}
  92 +
  93 +/* Large devices (large desktops, 1200px and up) */
  94 +@media (min-width: $screen-lg-min) {
  95 + select {
  96 + &.chosen {
  97 + width: 200px;
  98 + }
  99 + &.chosen-sm {
  100 + width: 150px;
  101 + }
  102 + }
  103 +}
... ...
app/assets/stylesheets/generic/typography.scss 0 → 100644
... ... @@ -0,0 +1,104 @@
  1 +/**
  2 + * Headers
  3 + *
  4 + */
  5 +h1.page-title {
  6 + @include page-title;
  7 + font-size: 28px;
  8 +}
  9 +
  10 +h2.page-title {
  11 + @include page-title;
  12 + font-size: 24px;
  13 +}
  14 +
  15 +h3.page-title {
  16 + @include page-title;
  17 +}
  18 +
  19 +h6 {
  20 + color: #888;
  21 + text-transform: uppercase;
  22 +}
  23 +
  24 +/** CODE **/
  25 +pre {
  26 + font-family: $monospace_font;
  27 +
  28 + &.dark {
  29 + background: #333;
  30 + color: #f5f5f5;
  31 + }
  32 +}
  33 +
  34 +/**
  35 + * Links
  36 + *
  37 + */
  38 +a {
  39 + outline: none;
  40 + color: $link_color;
  41 + &:hover {
  42 + text-decoration: none;
  43 + color: $primary_color;
  44 + }
  45 +
  46 + &:focus {
  47 + text-decoration: underline;
  48 + }
  49 +
  50 + &.dark {
  51 + color: $style_color;
  52 + }
  53 +
  54 + &.lined {
  55 + text-decoration: underline;
  56 + &:hover { text-decoration: underline; }
  57 + }
  58 +
  59 + &.gray {
  60 + color: gray;
  61 + }
  62 +
  63 + &.supp_diff_link {
  64 + text-align: center;
  65 + padding: 20px 0;
  66 + background: #f1f1f1;
  67 + width: 100%;
  68 + float: left;
  69 + }
  70 +
  71 + &.neib {
  72 + margin-right: 15px;
  73 + }
  74 +}
  75 +
  76 +a:focus {
  77 + outline: none;
  78 +}
  79 +
  80 +.monospace {
  81 + font-family: $monospace_font;
  82 +}
  83 +
  84 +/**
  85 + * Wiki typography
  86 + *
  87 + */
  88 +.wiki {
  89 + @include md-typography;
  90 +
  91 + font-size: 14px;
  92 + line-height: 1.6;
  93 + .white .highlight pre {
  94 + background: #f5f5f5;
  95 + }
  96 + ul {
  97 + padding: 0;
  98 + margin: 0 0 9px 25px !important;
  99 + }
  100 +}
  101 +
  102 +.md {
  103 + @include md-typography;
  104 +}
... ...
app/assets/stylesheets/generic/ui_box.scss 0 → 100644
... ... @@ -0,0 +1,173 @@
  1 +/**
  2 + * UI box:
  3 + * Block element for separating information on page.
  4 + * Used for storing issues lists, grouped data.
  5 + * You can have multiple ui boxes on one page
  6 + *
  7 + * Classes:
  8 + * .ui-box - for any block & widgets
  9 + * .ui-box.ui-box-small - same but with smaller title
  10 + * .ui-box.ui-box-danger - with red title
  11 + *
  12 + * Ex. 1: List
  13 + * .ui-box
  14 + * .title
  15 + * # title here
  16 + * %ul
  17 + * # content here
  18 + *
  19 + * Ex. 2: Block data
  20 + * .ui-box
  21 + * .title
  22 + * # title here
  23 + * .body
  24 + * # content here
  25 + *
  26 + */
  27 +
  28 +.ui-box {
  29 + background: #FFF;
  30 + margin-bottom: 20px;
  31 + border: 1px solid #DDD;
  32 + word-wrap: break-word;
  33 +
  34 + img {
  35 + max-width: 100%;
  36 + }
  37 +
  38 + pre {
  39 + code {
  40 + background: none !important;
  41 + }
  42 + }
  43 +
  44 + ul {
  45 + margin: 0;
  46 + padding: 0;
  47 + }
  48 +
  49 + .title {
  50 + background-color: #EEE;
  51 + border-bottom: 1px solid #DDD;
  52 + color: #666;
  53 + font-size: 16px;
  54 + text-shadow: 0 1px 1px #fff;
  55 + padding: 0 10px;
  56 + font-size: 14px;
  57 + line-height: 40px;
  58 + font-weight: normal;
  59 + margin: 0;
  60 +
  61 + > a {
  62 + text-shadow: 0 1px 1px #fff;
  63 + }
  64 +
  65 + form {
  66 + margin-bottom: 0;
  67 + margin-top: 0;
  68 + }
  69 +
  70 + .btn {
  71 + vertical-align: middle;
  72 + padding: 4px 12px;
  73 + @include box-shadow(0 0px 1px 1px #f2f2f2);
  74 + }
  75 +
  76 + .nav-pills {
  77 + > li {
  78 + > a {
  79 + padding: 13px;
  80 + margin: 0;
  81 + font-size: 13px;
  82 + }
  83 + &.active {
  84 + > a {
  85 + background: #D5D5D5;
  86 + color: $style_color;
  87 + @include border-radius(0);
  88 + border-radius: 0;
  89 + border-left: 1px solid #CCC;
  90 + border-right: 1px solid #CCC;
  91 + }
  92 + }
  93 + }
  94 + }
  95 + }
  96 +
  97 + .body {
  98 + padding: 10px;
  99 + }
  100 +
  101 + &.padded {
  102 + h5, .title {
  103 + margin: -20px;
  104 + margin-bottom: 0;
  105 + padding: 5px 20px;
  106 + }
  107 + }
  108 +
  109 + .row_title {
  110 + font-weight: 500;
  111 + color: #444;
  112 + &:hover {
  113 + color: #444;
  114 + text-decoration: underline;
  115 + }
  116 + }
  117 +
  118 + .form-holder {
  119 + padding-top: 20px;
  120 + form {
  121 + margin-bottom: 0;
  122 + legend {
  123 + text-indent: 10px;
  124 + }
  125 + .form-actions {
  126 + margin-bottom: 0;
  127 + }
  128 + }
  129 + }
  130 +}
  131 +
  132 +/*
  133 + * Small box
  134 + */
  135 +.ui-box.ui-box-small {
  136 + margin-bottom: 10px;
  137 +
  138 + .title {
  139 + font-size: 13px;
  140 + line-height: 30px;
  141 +
  142 + a {
  143 + color: #666;
  144 + &:hover {
  145 + text-decoration: underline;
  146 + }
  147 + }
  148 + }
  149 +}
  150 +
  151 +/*
  152 + * Danger box
  153 + */
  154 +.ui-box.ui-box-danger {
  155 + background: #f7f7f7;
  156 + border: none;
  157 +
  158 + .title {
  159 + background: #D65;
  160 + color: #fff;
  161 + text-shadow: none;
  162 + font-weight: 500;
  163 + }
  164 +}
  165 +
  166 +/*
  167 + * Block under tw-bootstrap tabs
  168 + */
  169 +.tab-pane {
  170 + .ui-box {
  171 + margin: 3px 3px 25px 3px;
  172 + }
  173 +}
... ...
app/assets/stylesheets/gitlab_bootstrap.scss
... ... @@ -1,66 +0,0 @@
1   -/** Override bootstrap variables **/
2   -$baseFontSize: 13px !default;
3   -$baseLineHeight: 18px !default;
4   -
5   -/**
6   - * BOOTSTRAP
7   - */
8   -@import "bootstrap/variables";
9   -@import "bootstrap/mixins";
10   -@import "bootstrap/reset";
11   -@import "bootstrap/scaffolding";
12   -@import "bootstrap/grid";
13   -@import "bootstrap/layouts";
14   -@import "bootstrap/type";
15   -@import "bootstrap/code";
16   -@import "bootstrap/forms";
17   -@import "bootstrap/tables";
18   -@import "bootstrap/sprites";
19   -@import "bootstrap/dropdowns";
20   -@import "bootstrap/wells";
21   -@import "bootstrap/component-animations";
22   -@import "bootstrap/close";
23   -@import "bootstrap/button-groups";
24   -@import "bootstrap/alerts";
25   -@import "bootstrap/navs";
26   -@import "bootstrap/navbar";
27   -@import "bootstrap/breadcrumbs";
28   -@import "bootstrap/pagination";
29   -@import "bootstrap/pager";
30   -@import "bootstrap/modals";
31   -@import "bootstrap/tooltip";
32   -@import "bootstrap/popovers";
33   -@import "bootstrap/thumbnails";
34   -@import "bootstrap/media";
35   -@import "bootstrap/labels-badges";
36   -@import "bootstrap/progress-bars";
37   -@import "bootstrap/accordion";
38   -@import "bootstrap/carousel";
39   -@import "bootstrap/hero-unit";
40   -@import "bootstrap/utilities";
41   -@import "bootstrap/responsive-utilities";
42   -@import "bootstrap/responsive-1200px-min";
43   -
44   -/**
45   - * Font icons
46   - *
47   - */
48   -@import "font-awesome";
49   -
50   -/**
51   - * GitLab bootstrap.
52   - * Overrides some styles of twitter bootstrap.
53   - * Also give some common classes for GitLab app
54   - */
55   -@import "gitlab_bootstrap/variables.scss";
56   -@import "gitlab_bootstrap/fonts.scss";
57   -@import "gitlab_bootstrap/mixins.scss";
58   -@import "gitlab_bootstrap/avatar.scss";
59   -@import "gitlab_bootstrap/nav.scss";
60   -@import "gitlab_bootstrap/common.scss";
61   -@import "gitlab_bootstrap/typography.scss";
62   -@import "gitlab_bootstrap/buttons.scss";
63   -@import "gitlab_bootstrap/blocks.scss";
64   -@import "gitlab_bootstrap/files.scss";
65   -@import "gitlab_bootstrap/lists.scss";
66   -@import "gitlab_bootstrap/forms.scss";
app/assets/stylesheets/gitlab_bootstrap/avatar.scss
... ... @@ -1,23 +0,0 @@
1   -.avatar {
2   - float: left;
3   - margin-right: 12px;
4   - width: 40px;
5   - padding: 1px;
6   - @include border-radius(4px);
7   -
8   - &.avatar-inline {
9   - float: none;
10   - margin-left: 3px;
11   -
12   - &.s16 { margin-right: 2px; }
13   - &.s24 { margin-right: 2px; }
14   - }
15   -
16   - &.s16 { width: 16px; height: 16px; margin-right: 6px; }
17   - &.s24 { width: 24px; height: 24px; margin-right: 8px; }
18   - &.s26 { width: 26px; height: 26px; margin-right: 8px; }
19   - &.s32 { width: 32px; height: 32px; margin-right: 10px; }
20   - &.s60 { width: 60px; height: 60px; margin-right: 12px; }
21   - &.s90 { width: 90px; height: 90px; margin-right: 15px; }
22   - &.s160 { width: 160px; height: 160px; margin-right: 20px; }
23   -}
app/assets/stylesheets/gitlab_bootstrap/blocks.scss
... ... @@ -1,188 +0,0 @@
1   -/**
2   - * ===================================
3   - * Contain UI block elements:
4   - * .ui-box - for any block & widgets
5   - * ===================================
6   - */
7   -
8   -/**
9   - * UI Block
10   - *
11   - */
12   -.ui-box {
13   - background: #FFF;
14   - margin-bottom: 20px;
15   - border: 1px solid #DDD;
16   - word-wrap: break-word;
17   -
18   - &.small-box {
19   - margin-bottom: 10px;
20   -
21   - .title {
22   - font-size: 13px;
23   - line-height: 30px;
24   -
25   - a {
26   - color: #666;
27   - &:hover {
28   - text-decoration: underline;
29   - }
30   - }
31   - }
32   - }
33   -
34   - &.ui-box-show {
35   - color: #666;
36   - margin:20px 0;
37   - background: #FFF;
38   - box-shadow: inset 0 1px 0 #fff, 0 1px 5px #f1f1f1;
39   - @include linear-gradient(#fafafa, #f1f1f1);
40   -
41   - .control-group {
42   - margin-bottom: 0;
43   - }
44   - }
45   -
46   - &.ui-box-danger {
47   - .title {
48   - @include linear-gradient(#F26E5E, #bd362f);
49   - color: #fff;
50   - text-shadow: 0 1px 1px #900;
51   - font-weight: bold;
52   - }
53   - }
54   -
55   - img { max-width: 100%; }
56   -
57   - pre {
58   - code {
59   - background: none !important;
60   - }
61   - }
62   -
63   - .ui-box-head,
64   - .ui-box-body,
65   - .ui-box-bottom {
66   - padding: 15px;
67   -
68   - .clearfix {
69   - margin: 0;
70   - }
71   - }
72   -
73   - .ui-box-head {
74   - .box-title {
75   - font-size: 18px;
76   - font-weight: normal;
77   - line-height: 28px;
78   - margin: 0;
79   - }
80   - h3 {
81   - margin: 0;
82   - }
83   - }
84   -
85   - .ui-box-body {
86   - border: none;
87   - background-color: #f5f5f5;
88   - border: none;
89   - border-top: 1px solid #eee;
90   - }
91   -
92   - .ui-box-bottom {
93   - border-top: 1px solid #eee;
94   - }
95   -
96   - ul {
97   - margin: 0;
98   - }
99   -
100   - .title {
101   - @include bg-gray-gradient;
102   - border-bottom: 1px solid #CCC;
103   - color: #456;
104   - font-size: 16px;
105   - text-shadow: 0 1px 1px #fff;
106   - padding: 0 10px;
107   - font-size: 14px;
108   - line-height: 40px;
109   - font-weight: normal;
110   - margin: 0;
111   -
112   - > a {
113   - text-shadow: 0 1px 1px #fff;
114   - }
115   -
116   - form {
117   - margin-bottom: 0;
118   - margin-top: 0;
119   - }
120   -
121   - .btn {
122   - vertical-align: middle;
123   - padding: 4px 12px;
124   - @include box-shadow(0 0px 1px 1px #f2f2f2);
125   - }
126   -
127   - .nav-pills {
128   - > li {
129   - > a {
130   - padding: 13px;
131   - margin: 0;
132   - font-size: 13px;
133   - }
134   - &.active {
135   - > a {
136   - background: #D5D5D5;
137   - color: $style_color;
138   - @include border-radius(0);
139   - border-radius: 0;
140   - border-left: 1px solid #CCC;
141   - border-right: 1px solid #CCC;
142   - }
143   - }
144   - }
145   - }
146   - }
147   -
148   - &.padded {
149   - h5, .title {
150   - margin: -20px;
151   - margin-bottom: 0;
152   - padding: 5px 20px;
153   - }
154   - }
155   -
156   - .row_title {
157   - font-weight: bold;
158   - color: #444;
159   - &:hover {
160   - color: #444;
161   - text-decoration: underline;
162   - }
163   - }
164   -
165   - .form-holder {
166   - padding-top: 20px;
167   - form {
168   - margin-bottom: 0;
169   - legend {
170   - text-indent: 10px;
171   - }
172   - .form-actions {
173   - margin-bottom: 0;
174   - }
175   - }
176   - }
177   -}
178   -
179   -.tab-pane {
180   - .ui-box {
181   - margin: 3px 3px 25px 3px;
182   - }
183   -}
184   -
185   -.light-well {
186   - background: #f9f9f9;
187   - padding: 15px;
188   -}
app/assets/stylesheets/gitlab_bootstrap/buttons.scss
... ... @@ -1,148 +0,0 @@
1   -.btn {
2   - display: inline-block;
3   - padding: 6px 12px;
4   - margin-bottom: 0;
5   - font-size: 13px;
6   - line-height: $baseLineHeight;
7   - text-align: center;
8   - vertical-align: middle;
9   - cursor: pointer;
10   - border: 1px solid #BBB;
11   - color: $style_color;
12   - @include border-radius($baseBorderRadius);
13   - @include box-shadow(inset 0 1px 0 rgba(255,255,255,.2));
14   - @include linear-gradient(#f1f1f1, #e1e1e1);
15   - text-shadow: 0 1px 1px #FFF;
16   - text-decoration: none;
17   -
18   - &.hover,
19   - &:hover {
20   - color: $style_color;
21   - background: #f1f1f1;
22   - border-color: #AAA;
23   - text-decoration: none;
24   - @include linear-gradient(#fAfAfA, #f1f1f1);
25   - }
26   -
27   - &.focus,
28   - &:focus {
29   - text-decoration: none;
30   - @include box-shadow(inset 0 2px 4px rgba(0,0,0,.15));
31   - }
32   -
33   - &.active,
34   - &:active {
35   - background-image: none;
36   - outline: 0;
37   - text-decoration: none;
38   - @include box-shadow(inset 0 2px 4px rgba(0,0,0,.15));
39   - }
40   -
41   - &.disabled,
42   - &[disabled] {
43   - cursor: default;
44   - background-image: none;
45   - @include opacity(65);
46   - @include box-shadow(none);
47   - }
48   -
49   - &.btn-primary {
50   - color: #FFF;
51   - border-color: #189;
52   - text-shadow: 0 1px 1px #189;
53   - @include linear-gradient(#4AC, #289);
54   -
55   - &.hover,
56   - &:hover,
57   - &.disabled,
58   - &[disabled] {
59   - color: #FFF;
60   - background: #389;
61   - }
62   - }
63   -
64   - &.btn-success {
65   - color: #FFF;
66   - border-color: #1A1;
67   - text-shadow: 0 1px 1px #FFF;
68   - text-shadow: 0 1px 1px #181;
69   - @include linear-gradient(#62C452, #51a351);
70   -
71   -
72   - &.hover,
73   - &:hover,
74   - &.disabled,
75   - &[disabled] {
76   - color: #FFF;
77   - background: #2A2;
78   - }
79   - }
80   -
81   - &.btn-danger {
82   - color: #FFF;
83   - text-shadow: 0 1px 1px #811;
84   - border-color: #BD362F;
85   - @include linear-gradient(#EE5F5B, #BD362F);
86   -
87   -
88   - &.hover,
89   - &:hover,
90   - &.disabled,
91   - &[disabled] {
92   - color: #FFF;
93   - background: #A22;
94   - }
95   - }
96   -
97   - &.btn-new {
98   - @extend .btn-success;
99   - }
100   -
101   - &.btn-create {
102   - @extend .wide;
103   - @extend .btn-success;
104   - }
105   -
106   - &.btn-save {
107   - @extend .wide;
108   - @extend .btn-primary;
109   - }
110   -
111   - &.btn-close,
112   - &.btn-remove {
113   - @extend .btn-danger;
114   - }
115   -
116   - &.btn-cancel {
117   - float: right;
118   - }
119   -
120   - &.wide {
121   - padding-left: 20px;
122   - padding-right: 20px;
123   - }
124   -
125   - &.btn-small {
126   - padding: 2px 10px;
127   - font-size: 12px;
128   - }
129   -
130   - &.btn-tiny {
131   - font-size: 11px;
132   - padding: 2px 6px;
133   - line-height: 16px;
134   - margin: 2px;
135   - }
136   -
137   - &.grouped {
138   - margin-right: 7px;
139   - float: left;
140   - }
141   -
142   - &.btn-block {
143   - width: 100%;
144   - margin: 0;
145   - padding: 6px 0;
146   - margin-bottom: 15px;
147   - }
148   -}
app/assets/stylesheets/gitlab_bootstrap/common.scss
... ... @@ -1,118 +0,0 @@
1   -/** COLORS **/
2   -.cgray { color: gray }
3   -.cred { color: #D12F19 }
4   -.cgreen { color: #4a2 }
5   -.cblue { color: #29A }
6   -.cblack { color: #111 }
7   -.cdark { color: #444 }
8   -.cwhite { color: #fff!important }
9   -.bgred { background: #F2DEDE!important }
10   -
11   -/** COMMON CLASSES **/
12   -.left { float:left }
13   -
14   -.prepend-top-10 { margin-top:10px }
15   -.prepend-top-20 { margin-top:20px }
16   -.prepend-left-10 { margin-left:10px }
17   -.prepend-left-20 { margin-left:20px }
18   -.append-right-10 { margin-right:10px }
19   -.append-right-20 { margin-right:20px }
20   -.append-bottom-10 { margin-bottom:10px }
21   -.append-bottom-20 { margin-bottom:20px }
22   -.inline { display: inline-block }
23   -
24   -.padded { padding:20px }
25   -.ipadded { padding:20px!important }
26   -.lborder { border-left:1px solid #eee }
27   -.underlined_link { text-decoration: underline; }
28   -.hint { font-style: italic; color: #999; }
29   -.light { color: #888 }
30   -.tiny { font-weight: normal }
31   -.vtop { vertical-align: top !important; }
32   -
33   -
34   -/** ALERT MESSAGES **/
35   -.alert.alert-disabled {
36   - background: #EEE;
37   - color: #777;
38   - border-color: #DDD;
39   -}
40   -
41   -/** HELPERS **/
42   -.nothing_here_message {
43   - text-align: center;
44   - padding: 20px;
45   - color: #666;
46   - font-weight: normal;
47   - font-size: 16px;
48   - line-height: 36px;
49   -}
50   -
51   -.slead {
52   - color: #666;
53   - font-size: 14px;
54   - margin-bottom: 12px;
55   - font-weight: normal;
56   - line-height: 24px;
57   -}
58   -
59   -
60   -.tab-content {
61   - overflow: visible;
62   -}
63   -
64   -@media (max-width: 1200px) {
65   - .only-wide {
66   - display: none;
67   - }
68   -}
69   -
70   -.pagination ul > li > a, .pagination ul > li >span {
71   - @include linear-gradient(#f1f1f1, #e1e1e1);
72   - color: #333;
73   - text-shadow: 0 1px 1px #FFF;
74   -}
75   -
76   -pre.well-pre {
77   - border: 1px solid #EEE;
78   - background: #f9f9f9;
79   - border-radius: 0;
80   - color: #555;
81   -}
82   -
83   -.input-append .btn.active, .input-prepend .btn.active {
84   - background: #CCC;
85   - border-color: #BBB;
86   - text-shadow: 0 1px 1px #fff;
87   - font-weight: bold;
88   - @include box-shadow(inset 0 2px 4px rgba(0,0,0,.15));
89   -}
90   -
91   -.label {
92   - padding: 2px 4px;
93   - font-size: 12px;
94   - font-style: normal;
95   - font-weight: normal;
96   -}
97   -
98   -/** Big Labels **/
99   -.state-label {
100   - font-size: 14px;
101   - padding: 5px 15px;
102   - text-align: center;
103   - float: right;
104   - position: relative;
105   - top: -5px;
106   - @include border-radius(4px);
107   - text-shadow: none;
108   -
109   - &.state-label-green {
110   - background: #4A4;
111   - color: #FFF;
112   - }
113   -
114   - &.state-label-red {
115   - background: #DA4E49;
116   - color: #FFF;
117   - }
118   -}
app/assets/stylesheets/gitlab_bootstrap/files.scss
... ... @@ -1,219 +0,0 @@
1   -/**
2   - * File content holder
3   - *
4   - */
5   -.file-holder {
6   - border: 1px solid #CCC;
7   - margin-bottom: 1em;
8   -
9   - table {
10   - @extend .table;
11   - }
12   -
13   - .file-title {
14   - border-bottom: 1px solid #bbb;
15   - @include bg-dark-gray-gradient;
16   - text-shadow: 0 1px 1px #fff;
17   - margin: 0;
18   - font-weight: normal;
19   - font-weight: bold;
20   - text-align: left;
21   - color: $style_color;
22   - padding: 9px 10px;
23   - height: 18px;
24   -
25   - .options {
26   - float: right;
27   - margin-top: -5px;
28   - }
29   -
30   - .file_name {
31   - color: $style_color;
32   - font-size: 14px;
33   - text-shadow: 0 1px 1px #fff;
34   - small {
35   - color: #999;
36   - font-size: 13px;
37   - }
38   - }
39   - }
40   - .file-content {
41   - background: #fff;
42   - font-size: 11px;
43   -
44   - &.image_file {
45   - background: #eee;
46   - text-align: center;
47   - img {
48   - padding: 100px;
49   - max-width: 300px;
50   - }
51   - }
52   -
53   - &.wiki {
54   - padding: 20px;
55   - font-size: 14px;
56   - line-height: 1.6;
57   -
58   - .highlight {
59   - margin-bottom: 9px;
60   - @include border-radius(4px);
61   -
62   - > pre {
63   - margin: 0;
64   - }
65   - }
66   - }
67   -
68   - &.blob_file {
69   -
70   - }
71   -
72   - &.blob-no-preview {
73   - background: #eee;
74   - text-shadow: 0 1px 2px #FFF;
75   - padding: 100px 0;
76   - }
77   -
78   - /**
79   - * Blame file
80   - */
81   - &.blame {
82   - table {
83   - border: none;
84   - box-shadow: none;
85   - margin: 0;
86   - }
87   - tr {
88   - border-bottom: 1px solid #eee;
89   - }
90   - td {
91   - &:first-child {
92   - border-left: none;
93   - }
94   - &:last-child {
95   - border-right: none;
96   - }
97   - background: #fff;
98   - padding: 5px;
99   - }
100   - .author,
101   - .blame_commit {
102   - background: #f5f5f5;
103   - vertical-align: top;
104   - }
105   - .lines {
106   - pre {
107   - padding: 0;
108   - margin: 0;
109   - background: none;
110   - border: none;
111   - }
112   - }
113   - }
114   -
115   - &.logs {
116   - background: #eee;
117   - max-height: 700px;
118   - overflow-y: auto;
119   -
120   - ol {
121   - margin-left: 40px;
122   - padding: 10px 0;
123   - border-left: 1px solid #CCC;
124   - margin-bottom: 0;
125   - background: white;
126   - li {
127   - color: #888;
128   - p {
129   - margin: 0;
130   - color: #333;
131   - line-height: 24px;
132   - padding-left: 10px;
133   - }
134   -
135   - &:hover {
136   - background: $hover;
137   - }
138   - }
139   - }
140   - }
141   -
142   - /**
143   - * Code file
144   - */
145   - &.code {
146   - padding: 0;
147   -
148   - table.lines {
149   - border: none;
150   - box-shadow: none;
151   - margin: 0px;
152   - padding: 0px;
153   - table-layout: fixed;
154   -
155   - pre {
156   - border: none;
157   - border-radius: 0;
158   - font-family: $monospace_font;
159   - font-size: 12px !important;
160   - line-height: 16px !important;
161   - margin: 0;
162   - padding: 10px 0;
163   - }
164   - td {
165   - border: none;
166   - margin: 0;
167   - padding: 0;
168   - vertical-align: top;
169   -
170   - &:first-child {
171   - background: #eee;
172   - width: 50px;
173   - }
174   - &:last-child {
175   - }
176   - }
177   - tr:hover {
178   - background: none;
179   - }
180   -
181   - pre.line_numbers {
182   - color: #666;
183   - padding: 10px 6px 10px 0;
184   - text-align: right;
185   - background: #EEE;
186   -
187   - a {
188   - color: #666;
189   -
190   - i {
191   - display: none;
192   - font-size: 14px;
193   - line-height: 14px;
194   - }
195   - &:hover i {
196   - display: inherit;
197   - }
198   - }
199   - }
200   -
201   - .highlight {
202   - border-left: 1px solid #DEE2E3;
203   - overflow: auto;
204   - overflow-y: hidden;
205   -
206   - pre {
207   - white-space: pre;
208   - word-wrap: normal;
209   -
210   - .line {
211   - padding: 0 10px;
212   - }
213   - }
214   - }
215   - }
216   - }
217   - }
218   -}
219   -
app/assets/stylesheets/gitlab_bootstrap/fonts.scss
... ... @@ -1,2 +0,0 @@
1   -/** Typo **/
2   -$monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono', 'lucida console', monospace;
app/assets/stylesheets/gitlab_bootstrap/forms.scss
... ... @@ -1,51 +0,0 @@
1   -form {
2   - @extend .form-horizontal;
3   -
4   - label {
5   - @extend .control-label;
6   - }
7   -}
8   -
9   -input.input-xpadding,
10   -.add-on.input-xpadding {
11   - padding: 6px 10px;
12   -}
13   -
14   -.control-group {
15   - .control-label {
16   - padding-top: 6px;
17   - }
18   - .controls {
19   - input, textarea {
20   - padding: 6px 10px;
21   - }
22   -
23   - input[type="radio"], input[type="checkbox"] {
24   - margin-top: 6px;
25   - }
26   -
27   - .add-on {
28   - padding: 6px;
29   - }
30   - }
31   -}
32   -
33   -input[type='search'].search-text-input {
34   - background-image: url("icon-search.png");
35   - background-repeat: no-repeat;
36   - background-position: 10px;
37   - padding-left: 25px;
38   - @include border-radius(4px);
39   - border: 1px solid #ccc;
40   -}
41   -
42   -input[type='text'].danger {
43   - background: #F2DEDE!important;
44   - border-color: #D66;
45   - text-shadow: 0 1px 1px #fff
46   -}
47   -
48   -fieldset legend {
49   - font-size: 16px;
50   - margin-bottom: 10px;
51   -}
app/assets/stylesheets/gitlab_bootstrap/lists.scss
... ... @@ -1,95 +0,0 @@
1   -/**
2   - * Well styled list
3   - *
4   - */
5   -.well-list {
6   - margin: 0;
7   - list-style: none;
8   - li {
9   - padding: 10px;
10   - min-height: 20px;
11   - border-bottom: 1px solid #eee;
12   - border-bottom: 1px solid rgba(0, 0, 0, 0.05);
13   -
14   - &.disabled {
15   - color: #888;
16   - }
17   -
18   - &.unstyled {
19   - &:hover {
20   - background: none;
21   - }
22   - }
23   -
24   - &.smoke { background-color: #f5f5f5; }
25   -
26   - &:hover {
27   - background: $hover;
28   - border-bottom: 1px solid #ADF;
29   - }
30   -
31   - &:last-child {
32   - border-bottom: none;
33   -
34   - &.bottom {
35   - background: #f5f5f5;
36   - }
37   - }
38   -
39   - .author { color: #999; }
40   -
41   - p {
42   - padding-top: 1px;
43   - margin: 0;
44   - color: #222;
45   - img {
46   - position: relative;
47   - top: 3px;
48   - }
49   - }
50   -
51   - .well-title {
52   - font-size: 14px;
53   - line-height: 18px;
54   - }
55   - }
56   -}
57   -
58   -ol, ul {
59   - &.styled {
60   - li {
61   - padding: 2px;
62   - }
63   - }
64   -}
65   -
66   -/** light list with border-bottom between li **/
67   -ul.bordered-list {
68   - margin: 5px 0px;
69   - padding: 0px;
70   - li {
71   - padding: 5px 0;
72   - border-bottom: 1px solid #EEE;
73   - overflow: hidden;
74   - display: block;
75   - margin: 0px;
76   - &:last-child { border:none }
77   - &.active {
78   - background: #f9f9f9;
79   - a { font-weight: bold; }
80   - }
81   -
82   - &.light {
83   - a { color: #777; }
84   - }
85   - }
86   -
87   - &.top-list {
88   - li:first-child {
89   - padding-top: 0;
90   - h4, h5 {
91   - margin-top: 0;
92   - }
93   - }
94   - }
95   -}
app/assets/stylesheets/gitlab_bootstrap/mixins.scss
... ... @@ -1,114 +0,0 @@
1   -/**
2   - * Generic mixins
3   - */
4   - @mixin box-shadow($shadow) {
5   - -webkit-box-shadow: $shadow;
6   - -moz-box-shadow: $shadow;
7   - -ms-box-shadow: $shadow;
8   - -o-box-shadow: $shadow;
9   - box-shadow: $shadow;
10   -}
11   -
12   -@mixin border-radius($radius) {
13   - -webkit-border-radius: $radius;
14   - -moz-border-radius: $radius;
15   - -ms-border-radius: $radius;
16   - -o-border-radius: $radius;
17   - border-radius: $radius;
18   -}
19   -
20   -@mixin border-radius-left($radius) {
21   - @include border-radius($radius 0 0 $radius)
22   -}
23   -
24   -@mixin linear-gradient($from, $to) {
25   - background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to));
26   - background-image: -webkit-linear-gradient($from, $to);
27   - background-image: -moz-linear-gradient($from, $to);
28   - background-image: -o-linear-gradient($from, $to);
29   -}
30   -
31   -@mixin transition($transition) {
32   - -webkit-transition: $transition;
33   - -moz-transition: $transition;
34   - -ms-transition: $transition;
35   - -o-transition: $transition;
36   - transition: $transition;
37   -}
38   -
39   -/**
40   - * Prefilled mixins
41   - * Mixins with fixed values
42   - */
43   -@mixin bg-light-gray-gradient {
44   - background: #f1f1f1;
45   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #f5f5f5), to(#e1e1e1));
46   - background-image: -webkit-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
47   - background-image: -moz-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
48   - background-image: -o-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
49   -}
50   -
51   -@mixin bg-gray-gradient {
52   - background: #eee;
53   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
54   - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
55   - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
56   - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
57   -}
58   -
59   -@mixin bg-dark-gray-gradient {
60   - background: #eee;
61   - background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7);
62   - background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7);
63   - background-image: -o-linear-gradient(#e9e9e9, #d7d7d7);
64   -}
65   -
66   -@mixin shade {
67   - @include box-shadow(0 0 3px #ddd);
68   -}
69   -
70   -@mixin solid-shade {
71   - @include box-shadow(0 0 0 3px #f1f1f1);
72   -}
73   -
74   -@mixin header-font {
75   - color: $style_color;
76   - text-shadow: 0 1px 1px #FFF;
77   - font-size: 16px;
78   - line-height: 40px;
79   - font-weight: normal;
80   -}
81   -
82   -@mixin md-typography {
83   - *:first-child {
84   - margin-top: 0;
85   - }
86   -
87   - code { padding: 0 4px; }
88   - h1 { margin-top: 30px;}
89   - h2 { margin-top: 25px;}
90   - h3 { margin-top: 20px;}
91   - h4 { margin-top: 15px;}
92   -
93   - blockquote p {
94   - color: #888;
95   - font-size: 14px;
96   - line-height: 1.5;
97   - }
98   -
99   - table {
100   - @extend .table;
101   - @extend .table-bordered;
102   - th {
103   - background: #EEE;
104   - }
105   - }
106   -}
107   -
108   -@mixin page-title {
109   - color: $style_color;
110   - font-size: 20px;
111   - line-height: 1.5;
112   - margin-top: 0px;
113   - margin-bottom: 15px;
114   -}
app/assets/stylesheets/gitlab_bootstrap/nav.scss
... ... @@ -1,92 +0,0 @@
1   -/**
2   - * nav-pills
3   - *
4   - */
5   -.nav-pills {
6   - .active a {
7   - background: $primary_color;
8   - }
9   -
10   - > li > a {
11   - @include border-radius(0);
12   - }
13   -
14   - &.nav-stacked {
15   - > li > a {
16   - border-left: 4px solid #EEE;
17   - padding: 12px;
18   - }
19   - > .active > a {
20   - border-color: $primary_color;
21   - border-radius: 0;
22   - background: #F1F1F1;
23   - color: $style_color;
24   - font-weight: bold;
25   - text-shadow: 0 1px 1px #fff;
26   - }
27   -
28   - &.nav-stacked-menu {
29   - background: #FAFAFA;
30   - li > a {
31   - padding: 16px;
32   - }
33   - }
34   - }
35   -
36   - &.nav-pills-small {
37   - > li > a {
38   - padding: 8px 12px;
39   - }
40   - }
41   -}
42   -
43   -.nav-pills > .active > a > i[class^="icon-"] { background: inherit; }
44   -
45   -
46   -
47   -/**
48   - * nav-tabs
49   - *
50   - */
51   -.nav-tabs > li > a, .nav-pills > li > a { color: $style_color; }
52   -.nav.nav-tabs {
53   - li {
54   - > a {
55   - padding: 8px 20px;
56   - margin-right: 7px;
57   - line-height: 20px;
58   - border-color: #EEE;
59   - color: #888;
60   - border-bottom: 1px solid #ddd;
61   - .badge {
62   - background-color: #eee;
63   - color: #888;
64   - text-shadow: 0 1px 1px #fff;
65   - }
66   - i[class^="icon-"] {
67   - line-height: 14px;
68   - }
69   - }
70   - &.active {
71   - > a {
72   - border-color: #CCC;
73   - border-bottom: 1px solid #fff;
74   - color: #333;
75   - font-weight: bold;
76   - }
77   - }
78   - }
79   -
80   - &.nav-small-tabs > li > a { padding: 6px 9px; }
81   -}
82   -
83   -
84   -
85   -/**
86   - * fix to keep tooltips position in top navigation bar
87   - *
88   - */
89   -.navbar .nav > li {
90   - position: relative;
91   - white-space: nowrap;
92   -}
app/assets/stylesheets/gitlab_bootstrap/typography.scss
... ... @@ -1,108 +0,0 @@
1   -/**
2   - * Headers
3   - *
4   - */
5   -h1, h2, h3, h4, h5, h6 {
6   - font-weight: 500;
7   - line-height: 1.1;
8   -}
9   -
10   -h1.page-title {
11   - @include page-title;
12   - font-size: 28px;
13   -}
14   -
15   -h2.page-title {
16   - @include page-title;
17   - font-size: 24px;
18   -}
19   -
20   -h3.page-title {
21   - @include page-title;
22   -}
23   -
24   -h6 {
25   - color: #888;
26   - text-transform: uppercase;
27   -}
28   -
29   -/** CODE **/
30   -pre {
31   - font-family: $monospace_font;
32   -
33   - &.dark {
34   - background: #333;
35   - color: #f5f5f5;
36   - }
37   -}
38   -
39   -/**
40   - * Links
41   - *
42   - */
43   -a {
44   - outline: none;
45   - color: $link_color;
46   - &:hover {
47   - text-decoration: none;
48   - color: $primary_color;
49   - }
50   -
51   - &:focus {
52   - text-decoration: underline;
53   - }
54   -
55   - &.dark {
56   - color: $style_color;
57   - }
58   -
59   - &.lined {
60   - text-decoration: underline;
61   - &:hover { text-decoration: underline; }
62   - }
63   -
64   - &.gray {
65   - color: gray;
66   - }
67   -
68   - &.supp_diff_link {
69   - text-align: center;
70   - padding: 20px 0;
71   - background: #f1f1f1;
72   - width: 100%;
73   - float: left;
74   - }
75   -
76   - &.neib {
77   - margin-right: 15px;
78   - }
79   -}
80   -
81   -a:focus {
82   - outline: none;
83   -}
84   -
85   -.monospace {
86   - font-family: $monospace_font;
87   -}
88   -
89   -/**
90   - * Wiki typography
91   - *
92   - */
93   -.wiki {
94   - @include md-typography;
95   -
96   - font-size: 14px;
97   - line-height: 1.6;
98   - .white .highlight pre {
99   - background: #f5f5f5;
100   - }
101   - ul {
102   - margin: 0 0 9px 25px !important;
103   - }
104   -}
105   -
106   -.md {
107   - @include md-typography;
108   -}
app/assets/stylesheets/gitlab_bootstrap/variables.scss
... ... @@ -1,13 +0,0 @@
1   -/**
2   - * General Colors
3   - */
4   -$primary_color: #2FA0BB;
5   -$link_color: #3A89A3;
6   -$style_color: #474D57;
7   -$hover: #D9EDF7;
8   -
9   -/**
10   - * Commit Diff Colors
11   - */
12   -$added: #63c363;
13   -$deleted: #f77;
app/assets/stylesheets/gl_bootstrap.scss 0 → 100644
... ... @@ -0,0 +1,129 @@
  1 +// Core variables and mixins
  2 +@import "bootstrap/variables";
  3 +@import "bootstrap/mixins";
  4 +
  5 +// Reset
  6 +@import "bootstrap/normalize";
  7 +@import "bootstrap/print";
  8 +
  9 +// Core CSS
  10 +@import "bootstrap/scaffolding";
  11 +@import "bootstrap/type";
  12 +@import "bootstrap/code";
  13 +@import "bootstrap/grid";
  14 +@import "bootstrap/tables";
  15 +@import "bootstrap/forms";
  16 +
  17 +// Components
  18 +@import "bootstrap/component-animations";
  19 +@import "bootstrap/dropdowns";
  20 +@import "bootstrap/button-groups";
  21 +@import "bootstrap/input-groups";
  22 +@import "bootstrap/navs";
  23 +@import "bootstrap/navbar";
  24 +@import "bootstrap/breadcrumbs";
  25 +@import "bootstrap/pagination";
  26 +@import "bootstrap/pager";
  27 +@import "bootstrap/labels";
  28 +@import "bootstrap/badges";
  29 +@import "bootstrap/jumbotron";
  30 +@import "bootstrap/thumbnails";
  31 +@import "bootstrap/alerts";
  32 +@import "bootstrap/progress-bars";
  33 +@import "bootstrap/list-group";
  34 +@import "bootstrap/wells";
  35 +@import "bootstrap/close";
  36 +
  37 +// Components w/ JavaScript
  38 +@import "bootstrap/modals";
  39 +@import "bootstrap/tooltip";
  40 +@import "bootstrap/popovers";
  41 +@import "bootstrap/carousel";
  42 +
  43 +// Utility classes
  44 +.clearfix {
  45 + @include clearfix();
  46 +}
  47 +.center-block {
  48 + @include center-block();
  49 +}
  50 +.pull-right {
  51 + float: right !important;
  52 +}
  53 +.pull-left {
  54 + float: left !important;
  55 +}
  56 +.hide {
  57 + display: none;
  58 +}
  59 +.show {
  60 + display: block !important;
  61 +}
  62 +.invisible {
  63 + visibility: hidden;
  64 +}
  65 +.text-hide {
  66 + @include text-hide();
  67 +}
  68 +.hidden {
  69 + display: none !important;
  70 + visibility: hidden !important;
  71 +}
  72 +.affix {
  73 + position: fixed;
  74 +}
  75 +
  76 +@import "bootstrap/responsive-utilities";
  77 +
  78 +// Labels
  79 +.label {
  80 + padding: 2px 4px;
  81 + font-size: 12px;
  82 + font-style: normal;
  83 + font-weight: normal;
  84 + display: inline-block;
  85 +
  86 + &.label-gray {
  87 + background-color: #eee;
  88 + color: #999;
  89 + text-shadow: none;
  90 + }
  91 +
  92 + &.label-inverse {
  93 + background-color: #333333;
  94 + }
  95 +}
  96 +
  97 +// Nav tabs
  98 +.nav.nav-tabs {
  99 + li {
  100 + > a {
  101 + padding: 8px 20px;
  102 + margin-right: 7px;
  103 + line-height: 20px;
  104 + border-color: #EEE;
  105 + color: #888;
  106 + border-bottom: 1px solid #ddd;
  107 + .badge {
  108 + background-color: #eee;
  109 + color: #888;
  110 + text-shadow: 0 1px 1px #fff;
  111 + }
  112 + i[class^="icon-"] {
  113 + line-height: 14px;
  114 + }
  115 + }
  116 + &.active {
  117 + > a {
  118 + border-color: #CCC;
  119 + border-bottom: 1px solid #fff;
  120 + color: #333;
  121 + font-weight: bold;
  122 + }
  123 + }
  124 + }
  125 +
  126 + &.nav-small-tabs > li > a {
  127 + padding: 6px 9px;
  128 + }
  129 +}
... ...
app/assets/stylesheets/main/fonts.scss 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +/** Typo **/
  2 +$monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'Courier New', 'andale mono', 'lucida console', monospace;
... ...
app/assets/stylesheets/main/mixins.scss 0 → 100644
... ... @@ -0,0 +1,148 @@
  1 +/**
  2 + * Generic mixins
  3 + */
  4 + @mixin box-shadow($shadow) {
  5 + -webkit-box-shadow: $shadow;
  6 + -moz-box-shadow: $shadow;
  7 + -ms-box-shadow: $shadow;
  8 + -o-box-shadow: $shadow;
  9 + box-shadow: $shadow;
  10 +}
  11 +
  12 +@mixin border-radius($radius) {
  13 + -webkit-border-radius: $radius;
  14 + -moz-border-radius: $radius;
  15 + -ms-border-radius: $radius;
  16 + -o-border-radius: $radius;
  17 + border-radius: $radius;
  18 +}
  19 +
  20 +@mixin border-radius-left($radius) {
  21 + @include border-radius($radius 0 0 $radius)
  22 +}
  23 +
  24 +@mixin linear-gradient($from, $to) {
  25 + background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to));
  26 + background-image: -webkit-linear-gradient($from, $to);
  27 + background-image: -moz-linear-gradient($from, $to);
  28 + background-image: -ms-linear-gradient($from, $to);
  29 + background-image: -o-linear-gradient($from, $to);
  30 +}
  31 +
  32 +@mixin transition($transition) {
  33 + -webkit-transition: $transition;
  34 + -moz-transition: $transition;
  35 + -ms-transition: $transition;
  36 + -o-transition: $transition;
  37 + transition: $transition;
  38 +}
  39 +
  40 +/**
  41 + * Prefilled mixins
  42 + * Mixins with fixed values
  43 + */
  44 +@mixin bg-light-gray-gradient {
  45 + background: #f1f1f1;
  46 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #f5f5f5), to(#e1e1e1));
  47 + background-image: -webkit-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  48 + background-image: -moz-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  49 + background-image: -ms-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  50 + background-image: -o-linear-gradient(#f5f5f5 6.6%, #e1e1e1);
  51 +}
  52 +
  53 +@mixin bg-gray-gradient {
  54 + background: #eee;
  55 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
  56 + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
  57 + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  58 + background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
  59 + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
  60 +}
  61 +
  62 +@mixin bg-dark-gray-gradient {
  63 + background: #eee;
  64 + background-image: -webkit-linear-gradient(#e9e9e9, #d7d7d7);
  65 + background-image: -moz-linear-gradient(#e9e9e9, #d7d7d7);
  66 + background-image: -ms-linear-gradient(#e9e9e9, #d7d7d7);
  67 + background-image: -o-linear-gradient(#e9e9e9, #d7d7d7);
  68 +}
  69 +
  70 +@mixin shade {
  71 + @include box-shadow(0 0 3px #ddd);
  72 +}
  73 +
  74 +@mixin solid-shade {
  75 + @include box-shadow(0 0 0 3px #f1f1f1);
  76 +}
  77 +
  78 +@mixin header-font {
  79 + color: $style_color;
  80 + text-shadow: 0 1px 1px #FFF;
  81 + font-size: 16px;
  82 + line-height: 44px;
  83 + font-weight: normal;
  84 +}
  85 +
  86 +@mixin md-typography {
  87 + img {
  88 + max-width: 100%;
  89 + }
  90 +
  91 + *:first-child {
  92 + margin-top: 0;
  93 + }
  94 +
  95 + code { padding: 0 4px; }
  96 +
  97 + h1 {
  98 + margin-top: 45px;
  99 + font-size: 2.5em;
  100 + }
  101 +
  102 + h2 {
  103 + margin-top: 40px;
  104 + font-size: 2em;
  105 + }
  106 +
  107 + h3 {
  108 + margin-top: 35px;
  109 + font-size: 2em;
  110 + }
  111 +
  112 + h4 {
  113 + margin-top: 30px;
  114 + font-size: 1.5em;
  115 + }
  116 +
  117 + blockquote p {
  118 + color: #888;
  119 + font-size: 14px;
  120 + line-height: 1.5;
  121 + }
  122 +
  123 + table {
  124 + @extend .table;
  125 + @extend .table-bordered;
  126 + th {
  127 + background: #EEE;
  128 + }
  129 + }
  130 +
  131 + code {
  132 + font-size: inherit;
  133 + font-weight: inherit;
  134 + color: #555;
  135 + }
  136 +
  137 + li {
  138 + line-height: 1.5;
  139 + }
  140 +}
  141 +
  142 +@mixin page-title {
  143 + color: #333;
  144 + font-size: 20px;
  145 + line-height: 1.5;
  146 + margin-top: 0px;
  147 + margin-bottom: 15px;
  148 +}
... ...
app/assets/stylesheets/main/variables.scss 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/** Override bootstrap variables **/
  2 +$font-size-base: 13px !default;
  3 +
  4 +/**
  5 + * General Colors
  6 + */
  7 +$primary_color: #2FA0BB;
  8 +$link_color: #3A89A3;
  9 +$style_color: #474D57;
  10 +$hover: #D9EDF7;
  11 +
  12 +/**
  13 + * Commit Diff Colors
  14 + */
  15 +$added: #63c363;
  16 +$deleted: #f77;
... ...
app/assets/stylesheets/sections.scss 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +@import "sections/header.scss";
  2 +@import "sections/nav.scss";
  3 +@import "sections/commits.scss";
  4 +@import "sections/issues.scss";
  5 +@import "sections/projects.scss";
  6 +@import "sections/snippets.scss";
  7 +@import "sections/votes.scss";
  8 +@import "sections/merge_requests.scss";
  9 +@import "sections/graph.scss";
  10 +@import "sections/events.scss";
  11 +@import "sections/themes.scss";
  12 +@import "sections/tree.scss";
  13 +@import "sections/notes.scss";
  14 +@import "sections/profile.scss";
  15 +@import "sections/login.scss";
  16 +@import "sections/editor.scss";
  17 +@import "sections/admin.scss";
  18 +@import "sections/wiki.scss";
  19 +@import "sections/wall.scss";
  20 +@import "sections/dashboard.scss";
  21 +@import "sections/stat_graph.scss";
... ...
app/assets/stylesheets/sections/admin.scss
... ... @@ -20,4 +20,19 @@
20 20 label { width: 110px; }
21 21 .controls { margin-left: 130px; }
22 22 .form-actions { padding-left: 130px; background: #fff }
  23 + .visibility-levels {
  24 + .controls {
  25 + margin-bottom: 9px;
  26 + }
  27 +
  28 + i {
  29 + color: inherit;
  30 + }
  31 + }
  32 +}
  33 +
  34 +.broadcast-messages {
  35 + .message {
  36 + line-height: 2;
  37 + }
23 38 }
... ...
app/assets/stylesheets/sections/commits.scss
... ... @@ -16,36 +16,29 @@
16 16  
17 17 .header {
18 18 @extend .clearfix;
  19 + background: #DDD;
  20 + border-bottom: 1px solid #CCC;
19 21 padding: 5px 5px 5px 10px;
20 22 color: #555;
21   - border-bottom: 1px solid #CCC;
22   - background: #eee;
23   - // TODO Replace with linear-gradient mixin
24   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
25   - background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
26   - background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
27   - background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
28   -
29   - a{
30   - color: $style_color;
31   - }
32 23  
33 24 > span {
34 25 font-family: $monospace_font;
35 26 font-size: 14px;
36   - line-height: 30px;
  27 + line-height: 2;
37 28 }
38 29  
39   - a.view-file{
  30 + .view-file {
40 31 font-weight: bold;
  32 + float: right;
  33 + background-color: #EEE;
41 34 }
42 35  
43   - .commit-short-id{
  36 + .commit-short-id {
44 37 font-family: $monospace_font;
45 38 font-size: smaller;
46 39 }
47 40  
48   - .file-mode{
  41 + .file-mode {
49 42 font-family: $monospace_font;
50 43 }
51 44 }
... ... @@ -55,13 +48,13 @@
55 48 background: #FFF;
56 49 color: #333;
57 50 font-size: 12px;
58   - .old{
59   - span.idiff{
  51 + .old {
  52 + span.idiff {
60 53 background-color: #FAA;
61 54 }
62 55 }
63   - .new{
64   - span.idiff{
  56 + .new {
  57 + span.idiff {
65 58 background-color: #AFA;
66 59 }
67 60 }
... ... @@ -77,7 +70,7 @@
77 70 font-size: 12px;
78 71 }
79 72 }
80   - .old_line, .new_line {
  73 + .old_line, .new_line, .diff_line {
81 74 margin: 0px;
82 75 padding: 0px;
83 76 border: none;
... ... @@ -87,7 +80,7 @@
87 80 border-right: 1px solid #ccc;
88 81 text-align: right;
89 82 min-width: 35px;
90   - max-width: 35px;
  83 + max-width: 50px;
91 84 width: 35px;
92 85 @include user-select(none);
93 86 a {
... ... @@ -99,6 +92,15 @@
99 92 text-decoration: underline;
100 93 }
101 94 }
  95 + &.new {
  96 + background: #CFD;
  97 + }
  98 + &.old {
  99 + background: #FDD;
  100 + }
  101 + }
  102 + .diff_line {
  103 + padding: 0;
102 104 }
103 105 .line_holder {
104 106 &.old .old_line,
... ... @@ -129,6 +131,11 @@
129 131 color: #ccc;
130 132 background: #fafafa;
131 133 }
  134 + &.parallel {
  135 + display: table-cell;
  136 + overflow: hidden;
  137 + width: 50%;
  138 + }
132 139 }
133 140 }
134 141 .image {
... ... @@ -293,6 +300,7 @@
293 300 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
294 301 background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
295 302 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  303 + background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
296 304 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
297 305  
298 306 ul, li{
... ... @@ -391,8 +399,8 @@
391 399  
392 400 .commits-compare-switch{
393 401 background: url("switch_icon.png") no-repeat center center;
394   - width: 22px;
395   - height: 22px;
  402 + width: 32px;
  403 + height: 32px;
396 404 text-indent: -9999px;
397 405 float: left;
398 406 margin-right: 9px;
... ... @@ -474,8 +482,8 @@ li.commit {
474 482 }
475 483  
476 484 .commit-row-message {
477   - color: #555;
478   - font-weight: bolder;
  485 + color: #333;
  486 + font-weight: 500;
479 487 &:hover {
480 488 color: #444;
481 489 text-decoration: underline;
... ... @@ -484,13 +492,14 @@ li.commit {
484 492 }
485 493  
486 494 .commit-row-info {
  495 + color: #777;
  496 +
487 497 a {
488 498 color: #777;
489 499 }
490 500  
491 501 .committed_ago {
492 502 float: right;
493   - @extend .cgray;
494 503 }
495 504 }
496 505  
... ...
app/assets/stylesheets/sections/dashboard.scss
1 1 .dashboard {
2   - @extend .row;
3   - .activities {
4   - }
5   -
6 2 .side {
7   - @extend .pull-right;
8   -
9 3 .ui-box {
10 4 margin: 0px;
11 5 box-shadow: none;
... ... @@ -20,7 +14,7 @@
20 14  
21 15 .search-text-input {
22 16 float:left;
23   - @extend .span2;
  17 + @extend .col-md-2;
24 18 }
25 19 .btn {
26 20 margin-left: 5px;
... ... @@ -32,14 +26,15 @@
32 26 .dash-filter {
33 27 margin: 7px 0;
34 28 padding: 4px 6px;
35   - width: 202px;
  29 + width: 220px;
36 30 float: left;
  31 + height: inherit;
37 32 }
38 33 }
39 34  
40 35 @media (max-width: 1200px) {
41 36 .dashboard .dash-filter {
42   - width: 132px;
  37 + width: 150px;
43 38 }
44 39 }
45 40  
... ... @@ -51,7 +46,7 @@
51 46 li {
52 47 &.active {
53 48 a {
54   - @include linear-gradient(#f5f5f5, #eee);
  49 + background-color: #EEE;
55 50 border-bottom: 1px solid #EEE !important;
56 51 &:hover {
57 52 background: #eee;
... ... @@ -66,37 +61,58 @@
66 61 }
67 62  
68 63 .project-row, .group-row {
69   - padding: 10px 15px !important;
  64 + padding: 10px 12px !important;
  65 + font-size: 14px;
  66 + line-height: 24px;
70 67  
71   - .namespace-name {
72   - color: #666;
73   - font-weight: bold;
  68 + a {
  69 + display: block;
74 70 }
75 71  
76 72 .project-name, .group-name {
77   - font-size: 15px;
  73 + font-weight: 500;
78 74 }
79 75  
80 76 .arrow {
81 77 float: right;
82   - padding: 10px 5px;
  78 + padding: 0px 5px;
83 79 margin: 0;
84 80 font-size: 20px;
85 81 color: #666;
86 82 }
87 83  
88 84 .last-activity {
  85 + float: right;
  86 + font-size: 12px;
89 87 color: #AAA;
90 88 display: block;
91   - margin-top: 5px;
92 89 .date {
93 90 color: #777;
94 91 }
95 92 }
96 93 }
97 94  
98   -.group-row {
99   - .arrow {
100   - padding: 2px 5px;
  95 +.project-access-icon {
  96 + margin-left: 10px;
  97 + float: left;
  98 + margin-right: 15px;
  99 + font-size: 20px;
  100 + margin-bottom: 15px;
  101 + border: 1px solid #EEE;
  102 + padding: 8px 12px;
  103 + border-radius: 50px;
  104 + background: #f5f5f5;
  105 + text-align: center;
  106 +
  107 + i {
  108 + color: #BBB;
101 109 }
102 110 }
  111 +
  112 +.dash-project-access-icon {
  113 + float: left;
  114 + margin-right: 3px;
  115 + color: #999;
  116 + margin-bottom: 10px;
  117 + width: 16px;
  118 +}
... ...
app/assets/stylesheets/sections/editor.scss
... ... @@ -42,7 +42,7 @@
42 42 line-height: 20px;
43 43 }
44 44 textarea {
45   - @extend .span8;
  45 + @extend .col-md-8;
46 46 }
47 47 }
48 48 }
... ...
app/assets/stylesheets/sections/events.scss
... ... @@ -75,6 +75,7 @@
75 75 margin-top: 4px;
76 76 margin-left: 0px;
77 77 max-width: 200px;
  78 + float: none;
78 79 }
79 80  
80 81 p:last-child {
... ... @@ -147,7 +148,7 @@
147 148 float: left;
148 149 padding: 9px 6px;
149 150 font-size: 18px;
150   - width: 26px;
  151 + width: 40px;
151 152 @include border-radius(3px);
152 153 }
153 154  
... ...
app/assets/stylesheets/sections/header.scss
... ... @@ -4,17 +4,24 @@
4 4 */
5 5 header {
6 6 &.navbar-gitlab {
  7 + margin-bottom: 0;
  8 + min-height: 40px;
  9 +
7 10 .navbar-inner {
8   - height: 40px;
9   - padding: 3px;
10 11 background: #F1F1F1;
  12 + border-bottom: 1px solid #DDD;
11 13 filter: none;
12 14  
13 15 .nav > li > a {
14 16 color: $style_color;
15 17 text-shadow: 0 1px 0 #fff;
16 18 font-size: 14px;
17   - padding: 10px;
  19 + line-height: 32px;
  20 + padding: 6px 10px;
  21 +
  22 + &:hover {
  23 + background: none;
  24 + }
18 25 }
19 26  
20 27 /** NAV block with links and profile **/
... ... @@ -35,9 +42,6 @@ header {
35 42 .app_logo {
36 43 float: left;
37 44 margin-right: 9px;
38   - position: relative;
39   - top: -5px;
40   - padding-top: 5px;
41 45  
42 46 a {
43 47 float: left;
... ... @@ -46,10 +50,10 @@ header {
46 50  
47 51 h1 {
48 52 margin: 0;
49   - background: url('logo-black.png') no-repeat center 1px;
50   - background-size: 38px;
  53 + background: url('logo-black.png') no-repeat center center;
  54 + background-size: 32px;
51 55 float: left;
52   - height: 40px;
  56 + height: 46px;
53 57 width: 40px;
54 58 @include header-font;
55 59 text-indent: -9999px;
... ... @@ -75,7 +79,7 @@ header {
75 79  
76 80 .profile-pic {
77 81 position: relative;
78   - top: -4px;
  82 + top: -1px;
79 83 img {
80 84 width: 26px;
81 85 height: 26px;
... ... @@ -91,21 +95,25 @@ header {
91 95 .search {
92 96 margin-right: 10px;
93 97 margin-left: 10px;
  98 + margin-top: 8px;
  99 +
  100 + form {
  101 + margin: 0;
  102 + padding: 0;
  103 + }
94 104  
95 105 .search-input {
96   - @extend .span3;
97 106 background-image: url("icon-search.png");
98 107 background-repeat: no-repeat;
99 108 background-position: 10px;
  109 + height: inherit;
  110 + padding: 4px 6px;
100 111 padding-left: 25px;
101 112 font-size: 13px;
102 113 @include border-radius(3px);
103 114 border: 1px solid #c6c6c6;
104 115 box-shadow: none;
105 116 @include transition(all 0.15s ease-in 0s);
106   - &:focus {
107   - @extend .span4;
108   - }
109 117 }
110 118 }
111 119  
... ... @@ -152,8 +160,8 @@ header {
152 160 .app_logo {
153 161 a {
154 162 h1 {
155   - background: url('logo-white.png') no-repeat center 1px;
156   - background-size: 38px;
  163 + background: url('logo-white.png') no-repeat center center;
  164 + background-size: 32px;
157 165 color: #fff;
158 166 text-shadow: 0 1px 1px #444;
159 167 }
... ... @@ -181,12 +189,26 @@ header {
181 189 .separator {
182 190 float: left;
183 191 height: 46px;
184   - width: 1px;
  192 + width: 2px;
185 193 background: white;
186 194 border-left: 1px solid #DDD;
187   - margin-top: -3px;
188 195 margin-left: 10px;
189 196 margin-right: 10px;
190 197 }
191 198 }
192 199  
  200 +.search .search-input {
  201 + width: 300px;
  202 + &:focus {
  203 + width: 400px;
  204 + }
  205 +}
  206 +
  207 +@media (max-width: 1200px) {
  208 + .search .search-input {
  209 + width: 200px;
  210 + &:focus {
  211 + width: 300px;
  212 + }
  213 + }
  214 +}
... ...
app/assets/stylesheets/sections/issues.scss
... ... @@ -77,8 +77,8 @@ input.check_all_issues {
77 77 @media (min-width: 800px) { .issues_filters select { width: 160px; } }
78 78 @media (min-width: 1200px) { .issues_filters select { width: 220px; } }
79 79  
80   -@media (min-width: 800px) { .issues_bulk_update select { width: 120px; } }
81   -@media (min-width: 1200px) { .issues_bulk_update select { width: 160px; } }
  80 +@media (min-width: 800px) { .issues_bulk_update .chosen-container { min-width: 120px; } }
  81 +@media (min-width: 1200px) { .issues_bulk_update .chosen-container { min-width: 160px; } }
82 82  
83 83 .issues-holder {
84 84 .issues_filters {
... ... @@ -103,3 +103,27 @@ input.check_all_issues {
103 103 .participants {
104 104 margin-bottom: 10px;
105 105 }
  106 +
  107 +.issues_bulk_update {
  108 + .chosen-container {
  109 + text-shadow: none;
  110 + }
  111 +}
  112 +
  113 +.issue-search-form {
  114 + margin: 0;
  115 + height: 24px;
  116 +
  117 + .issue_search {
  118 + border: 1px solid #DDD !important;
  119 + background-color: #f4f4f4;
  120 + }
  121 +}
  122 +
  123 +.issue-show-labels .label {
  124 + padding: 6px 10px;
  125 +}
  126 +
  127 +form.edit-issue {
  128 + margin: 0;
  129 +}
... ...
app/assets/stylesheets/sections/login.scss
1 1 /* Login Page */
2   -body.login-page{
3   - .container > .content {
4   - padding-top: 20px;
  2 +.login-page {
  3 + h1 {
  4 + font-size: 3em;
  5 + font-weight: 200;
5 6 }
6   -}
7   -
8   -.login-box{
9   - width: 304px;
10   - position: relative;
11   - @include border-radius(5px);
12   - margin: auto;
13   - padding: 20px;
14   - background: white;
15   -}
16   -
17   -.login-box .login-logo{
18   - margin: 10px 0 30px 0;
19   - display: block;
20   -}
21   -
22   -.login-box input.text{background-color: #f1f1f1; font-size: 16px; @include border-radius(0); padding: 14px 10px; width: 280px}
23   -
24   -.login-box input.text.top{
25   - @include border-radius(5px 5px 0 0);
26   - margin-bottom: 0px;
27   -}
28 7  
29   -.login-box input.text.bottom{
30   - @include border-radius(0 0 5px 5px);
31   - border-top: 0;
32   - margin-bottom: 20px;
33   -}
  8 + .login-box{
  9 + width: 304px;
  10 + position: relative;
  11 + @include border-radius(5px);
  12 + margin: auto;
  13 + padding: 20px;
  14 + background: white;
  15 + }
34 16  
35   -.login-box input.text.middle{
36   - border-top: 0;
37   - margin-bottom:0px;
38   -}
  17 + .login-logo{
  18 + margin: 10px 0 30px 0;
  19 + display: block;
  20 + }
39 21  
40   -.login-box a.forgot{float: right; padding-top: 6px}
  22 + .form-control {
  23 + background-color: #f1f1f1;
  24 + font-size: 16px;
  25 + padding: 14px 10px;
  26 + width: 280px;
  27 + height: auto;
  28 +
  29 + &.top {
  30 + @include border-radius(5px 5px 0 0);
  31 + margin-bottom: 0px;
  32 + }
  33 +
  34 + &.bottom {
  35 + @include border-radius(0 0 5px 5px);
  36 + border-top: 0;
  37 + margin-bottom: 20px;
  38 + }
  39 +
  40 + &.middle {
  41 + border-top: 0;
  42 + margin-bottom:0px;
  43 + @include border-radius(0);
  44 + }
  45 + }
41 46  
42   -.remember_me {
43   - text-align: left;
  47 + .login-box a.forgot {
  48 + float: right;
  49 + padding-top: 6px
  50 + }
44 51  
45   - input {
46   - margin: 2px;
  52 + .devise-errors {
  53 + h2 {
  54 + font-size: 14px;
  55 + color: #a00;
  56 + }
47 57 }
48 58 }
... ...
app/assets/stylesheets/sections/merge_requests.scss
... ... @@ -15,29 +15,9 @@
15 15 }
16 16 }
17 17  
18   - .accept_group {
19   - float: left;
20   - border: 1px solid #ADA;
21   - padding: 2px;
22   - @include border-radius(5px);
23   - background: #CEB;
24   -
25   - .accept_merge_request {
26   - font-size: 13px;
27   - float: left;
28   - }
29   - .remove_branch_holder {
30   - margin-left: 20px;
31   - margin-right: 10px;
32   - float: left;
33   - }
34   - label {
35   - color: #444;
36   - text-align: left
37   - }
  18 + .accept-group {
38 19 }
39 20  
40   -
41 21 .how_to_merge_link {
42 22 @extend .primary;
43 23 }
... ... @@ -110,9 +90,24 @@
110 90  
111 91 .merge-request-angle {
112 92 text-align: center;
113   - margin: 0;
  93 + margin: 0 auto;
  94 + font-size: 2em;
  95 + line-height: 1.1;
114 96 }
115 97  
116 98 .merge-request-form-info {
117   - padding: 15px 0;
  99 + padding-top: 15px;
  100 +}
  101 +
  102 +.merge-request-branches {
  103 + .commit-row-message {
  104 + font-weight: normal !important;
  105 + }
  106 +
  107 + .chosen-container .chosen-single {
  108 + span {
  109 + font-weight: bold;
  110 + color: #555;
  111 + }
  112 + }
118 113 }
... ...
app/assets/stylesheets/sections/nav.scss
... ... @@ -6,6 +6,7 @@
6 6 border-bottom: 1px solid #E1E1E1;
7 7  
8 8 ul {
  9 + padding: 0;
9 10 margin: auto;
10 11 height: 40px;
11 12 overflow: hidden;
... ...
app/assets/stylesheets/sections/notes.scss
... ... @@ -2,7 +2,7 @@
2 2 * Notes
3 3 */
4 4  
5   -@-webkit-keyframes target-note {
  5 +@-webkit-keyframes targe3-note {
6 6 from { background:#fffff0; }
7 7 50% { background:#ffffd3; }
8 8 to { background:#fffff0; }
... ... @@ -119,9 +119,9 @@ ul.notes {
119 119 }
120 120  
121 121 .file .notes_holder {
122   - font-family: $sansFontFamily;
123 122 font-size: 13px;
124 123 line-height: 18px;
  124 + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
125 125  
126 126 td {
127 127 border: 1px solid #ddd;
... ... @@ -130,9 +130,15 @@ ul.notes {
130 130 &.notes_line {
131 131 text-align: center;
132 132 padding: 10px 0;
  133 + background: #eee;
  134 + }
  135 + &.notes_line2 {
  136 + text-align: center;
  137 + padding: 10px 0;
  138 + border-left: 1px solid #ddd !important;
133 139 }
134 140 &.notes_content {
135   - background-color: $white;
  141 + background-color: #fff;
136 142 border-width: 1px 0;
137 143 padding-top: 0;
138 144  
... ... @@ -251,12 +257,12 @@ ul.notes {
251 257 .file,
252 258 .discussion {
253 259 .new_note {
254   - margin: 8px 5px 8px 0;
  260 + margin: 0;
  261 + border: none;
255 262 }
256 263 }
257 264 .new_note {
258 265 display: none;
259   -
260 266 .buttons {
261 267 float: left;
262 268 margin-top: 8px;
... ... @@ -270,10 +276,9 @@ ul.notes {
270 276  
271 277 // preview/edit buttons
272 278 > a {
273   - font-size: 24px;
274   - padding: 4px;
275 279 position: absolute;
276   - right: 10px;
  280 + right: 5px;
  281 + bottom: -60px;
277 282 }
278 283 .note_preview {
279 284 background: #f5f5f5;
... ... @@ -298,7 +303,7 @@ ul.notes {
298 303 }
299 304  
300 305 .note-image-attach {
301   - @extend .span4;
  306 + @extend .col-md-4;
302 307 @extend .thumbnail;
303 308 margin-left: 45px;
304 309 }
... ... @@ -306,10 +311,8 @@ ul.notes {
306 311  
307 312 .common-note-form {
308 313 margin: 0;
309   - height: 140px;
310 314 background: #F9F9F9;
311 315 padding: 3px;
312   - padding-bottom: 25px;
313 316 border: 1px solid #DDD;
314 317 }
315 318  
... ... @@ -320,7 +323,7 @@ ul.notes {
320 323 padding: 0 5px;
321 324  
322 325 .note-form-option {
323   - margin-top: 10px;
  326 + margin-top: 8px;
324 327 margin-left: 30px;
325 328 @extend .pull-left;
326 329 }
... ... @@ -358,3 +361,7 @@ ul.notes {
358 361 .js-note-attachment-delete {
359 362 display: none;
360 363 }
  364 +
  365 +.parallel-comment {
  366 + padding: 6px;
  367 +}
... ...
app/assets/stylesheets/sections/profile.scss
1 1 .update-notifications {
2   - margin-bottom: 0;
3   - label {
4   - margin-bottom: 0;
  2 + .radio-inline {
  3 + margin-right: 30px;
5 4 }
6 5 }
7 6  
... ... @@ -17,7 +16,7 @@
17 16  
18 17 legend {
19 18 border: none;
20   - margin: 0;
  19 + margin-bottom: 10px;
21 20 }
22 21 }
23 22 }
... ... @@ -42,3 +41,8 @@
42 41 margin-right: 12px;
43 42 }
44 43  
  44 +.profile-avatar-form-option {
  45 + hr {
  46 + margin: 10px 0;
  47 + }
  48 +}
... ...
app/assets/stylesheets/sections/projects.scss
... ... @@ -16,12 +16,18 @@
16 16  
17 17 .project-home-panel {
18 18 border-bottom: 1px solid #DDD;
19   - padding-bottom: 30px;
  19 + padding-bottom: 25px;
20 20 margin-bottom: 30px;
21 21  
  22 + &.empty-project {
  23 + border-bottom: 0px;
  24 + padding-bottom: 15px;
  25 + margin-bottom: 0px;
  26 + }
  27 +
22 28 .project-home-title {
23 29 font-size: 18px;
24   - color: #777;
  30 + color: #444;
25 31 margin: 0;
26 32 line-height: 32px;
27 33 }
... ... @@ -34,7 +40,7 @@
34 40  
35 41 .project-home-desc {
36 42 float: left;
37   - color: #999;
  43 + color: #777;
38 44 }
39 45  
40 46 .project-home-links {
... ... @@ -45,29 +51,47 @@
45 51 }
46 52 }
47 53  
48   - .public-label {
49   - font-size: 14px;
  54 + .visibility-level-label {
  55 + font-size: 17px;
50 56 background: #f1f1f1;
51   - padding: 8px 10px;
52 57 border-radius: 4px;
53   - margin-left: 10px;
54 58 color: #888;
  59 + position: absolute;
  60 + margin-left: -55px;
55 61 text-shadow: 0 1px 1px #FFF;
  62 + width: 40px;
  63 + text-align: center;
  64 + padding: 6px;
  65 +
  66 + i {
  67 + color: inherit;
  68 + }
56 69 }
57 70 }
58 71  
59 72 .git-clone-holder {
60   - float: right;
  73 + margin-right: 45px;
61 74 border: 1px solid #E1E1E1;
62 75 @include border-radius(4px);
63 76  
  77 + input[type="text"],
64 78 .btn {
65   - margin-left: 3px;
66 79 border: none;
67   - background: none;
  80 + @include border-radius(0px);
  81 + border-left: 1px solid #E1E1E1;
68 82 box-shadow: none;
  83 + padding: 6px 9px;
  84 + }
  85 +
  86 + .btn {
  87 + float: left;
  88 + background: none;
69 89 color: #29b;
70   - padding: 6px;
  90 +
  91 + &:first-child {
  92 + @include border-radius-left(4px);
  93 + border-left: 0px;
  94 + }
71 95  
72 96 &.active {
73 97 color: #333;
... ... @@ -76,20 +100,51 @@
76 100 }
77 101  
78 102 input[type="text"] {
79   - margin-left: 2px;
80   - border: none;
81   - border-radius: 0;
82   - border-left: 1px solid #E1E1E1;
  103 + cursor: auto;
83 104 @extend .monospace;
84   - box-shadow: none;
85 105 background: #FAFAFA;
86   - padding: 6px 10px;
  106 + width: 100%;
  107 + }
  108 +
  109 + .protocol-clone {
  110 + overflow: hidden;
87 111 }
88 112 }
89 113  
90   -.project-public-holder {
91   - .help-inline {
92   - padding-top: 7px;
  114 +.project-visibility-level-holder {
  115 + .controls {
  116 + padding-bottom: 9px;
  117 + }
  118 +
  119 + .controls {
  120 + input {
  121 + float: left;
  122 + }
  123 + .descr {
  124 + display: block;
  125 + margin-left: 1.5em;
  126 + &.restricted {
  127 + color: #888;
  128 + }
  129 +
  130 + label {
  131 + float: none;
  132 + padding: 0;
  133 + margin: 0;
  134 + text-align: left;
  135 + }
  136 + }
  137 + .info {
  138 + display: block;
  139 + margin-top: 5px;
  140 + }
  141 + strong {
  142 + display: inline-block;
  143 + width: 4em;
  144 + }
  145 + }
  146 + i {
  147 + color: inherit;
93 148 }
94 149 }
95 150  
... ... @@ -130,7 +185,8 @@ ul.nav.nav-projects-tabs {
130 185 margin: 0px;
131 186 }
132 187  
133   -.my-projects {
  188 +.my-projects,
  189 +.public-projects {
134 190 li {
135 191 .project-info {
136 192 margin-bottom: 10px;
... ... @@ -166,3 +222,62 @@ ul.nav.nav-projects-tabs {
166 222 color: #777;
167 223 }
168 224 }
  225 +
  226 +.project-side {
  227 + .btn-block {
  228 + background-image: none;
  229 + background-color: #F1f1f1;
  230 + border-color: #EEE;
  231 + &:hover {
  232 + background-color: #eee;
  233 + border-color: #DDD;
  234 + }
  235 + }
  236 + .project-fork-icon {
  237 + float: left;
  238 + font-size: 26px;
  239 + margin-right: 10px;
  240 + line-height: 1.5;
  241 + }
  242 +}
  243 +
  244 +.transfer-project .chosen-container {
  245 + min-width: 200px;
  246 +}
  247 +
  248 +/** Branch/tag selector **/
  249 +.project-refs-form {
  250 + margin: 0;
  251 + span {
  252 + background:none !important;
  253 + position:static !important;
  254 + width:auto !important;
  255 + height:auto !important;
  256 + }
  257 +}
  258 +
  259 +.project-refs-form .chosen-container {
  260 + position: relative;
  261 + top: 0;
  262 + left: 0;
  263 + margin-right: 10px;
  264 +
  265 + .chosen-single span {
  266 + font-weight: bold;
  267 + color: #555;
  268 + }
  269 +
  270 + &.chosen-container-active {
  271 + .chosen-drop {
  272 + min-width: 400px;
  273 + }
  274 +
  275 + .chosen-results {
  276 + max-height: 400px;
  277 + }
  278 + }
  279 +}
  280 +
  281 +.deploy-project-label {
  282 + margin: 1px;
  283 +}
... ...
app/assets/stylesheets/sections/tree.scss
... ... @@ -24,10 +24,10 @@
24 24 th {
25 25 font-weight: normal;
26 26 font-size: 15px;
27   - border-bottom: 1px solid #CCC;
  27 + border-bottom: 1px solid #CCC !important;
28 28 }
29 29 td {
30   - border-color: #F1F1F1;
  30 + border-color: #F1F1F1 !important;
31 31 }
32 32 &:hover {
33 33 td {
... ... @@ -111,5 +111,16 @@
111 111  
112 112 .tree-ref-holder {
113 113 float: left;
114   - margin-top: 5px;
  114 + margin-top: 8px;
  115 +}
  116 +
  117 +.readme-holder {
  118 + border-top: 1px dashed #CCC;
  119 + padding-top: 10px;
  120 +
  121 + h4 {
  122 + font-size: 14px;
  123 + margin-bottom: 20px;
  124 + color: #777;
  125 + }
115 126 }
... ...
app/assets/stylesheets/sections/votes.scss
... ... @@ -36,3 +36,8 @@
36 36 display: inline-block;
37 37 margin: 0 8px;
38 38 }
  39 +
  40 +.votes-holder {
  41 + float: right;
  42 + width: 250px;
  43 +}
... ...
app/assets/stylesheets/sections/wall.scss
1 1 .wall-page {
2 2 .wall-note-form {
3   - @extend .span12;
  3 + @extend .col-md-12;
4 4  
5 5 margin: 0;
6 6 height: 140px;
... ...
app/assets/stylesheets/sections/wiki.scss
1   -h3.page-title .edit-wiki-header {
  1 +.title .edit-wiki-header {
2 2 width: 780px;
3 3 margin-left: auto;
4 4 margin-right: auto;
... ...
app/assets/stylesheets/selects.scss
... ... @@ -1,153 +0,0 @@
1   -/* CHZN reset few styles */
2   -.chosen-container-single .chosen-single {
3   - background: #FFF;
4   - border: 1px solid #bbb;
5   - box-shadow: none;
6   -}
7   -.chosen-container-active .chosen-single {
8   - background: #fff;
9   -}
10   -
11   -.ajax-users-select {
12   - width: 400px;
13   -
14   - &.input-large {
15   - width: 210px;
16   - }
17   -}
18   -
19   -.user-result {
20   - .user-image {
21   - float: left;
22   - }
23   - .user-name {
24   - }
25   - .user-username {
26   - color: #999;
27   - }
28   -}
29   -
30   -/** Branch/tag selector **/
31   -.project-refs-form {
32   - margin: 0;
33   - span {
34   - background:none !important;
35   - position:static !important;
36   - width:auto !important;
37   - height:auto !important;
38   - }
39   -}
40   -.project-refs-select {
41   - width: 120px;
42   -}
43   -
44   -.project-refs-form .chosen-container {
45   - position: relative;
46   - top: 0;
47   - left: 0;
48   - margin-right: 10px;
49   -
50   - .chosen-drop {
51   - min-width: 400px;
52   - .chosen-results {
53   - max-height: 300px;
54   - }
55   - .chosen-search input {
56   - min-width: 365px;
57   - }
58   - }
59   -}
60   -
61   -/** Fix for Search Dropdown Border **/
62   -.chosen-container {
63   - min-width: 100px;
64   -
65   - .chosen-search {
66   - input:focus {
67   - @include box-shadow(none);
68   - }
69   - }
70   -
71   - .chosen-drop {
72   - margin: 7px 0;
73   - min-width: 200px;
74   - border: 1px solid #bbb;
75   - @include border-radius(0);
76   -
77   - .chosen-results {
78   - margin-top: 5px;
79   - max-height: 300px;
80   -
81   - .group-result {
82   - color: $style_color;
83   - border-bottom: 1px solid #EEE;
84   - padding: 8px;
85   - }
86   - .active-result {
87   - @include border-radius(0);
88   -
89   - &.highlighted {
90   - background: $hover;
91   - color: $style_color;
92   - }
93   - &.result-selected {
94   - background: #EEE;
95   - border-left: 4px solid #CCC;
96   - }
97   - }
98   - }
99   -
100   - .chosen-search {
101   - @include bg-gray-gradient;
102   - input {
103   - min-width: 165px;
104   - border-color: #CCC;
105   - }
106   - }
107   - }
108   -}
109   -
110   -.chosen-container .chosen-single,
111   -.chosen-container.chosen-with-drop .chosen-single {
112   - @include bg-light-gray-gradient;
113   -
114   - div {
115   - background: transparent;
116   - border-left: none;
117   - }
118   -
119   - span {
120   - font-weight: normal;
121   - }
122   -}
123   -
124   -/** Select2 styling **/
125   -.select2-container .select2-choice {
126   - background: #f1f1f1;
127   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, whitesmoke), to(#e1e1e1));
128   - background-image: -webkit-linear-gradient(whitesmoke 6.6%, #e1e1e1);
129   - background-image: -moz-linear-gradient(whitesmoke 6.6%, #e1e1e1);
130   - background-image: -o-linear-gradient(whitesmoke 6.6%, #e1e1e1);
131   -}
132   -
133   -.select2-container .select2-choice div {
134   - border: none;
135   - background: none;
136   -}
137   -
138   -.select2-drop {
139   - padding-top: 8px;
140   -}
141   -
142   -.select2-no-results, .select2-searching {
143   - padding: 7px;
144   - color: #666;
145   -}
146   -
147   -.chosen-container .chosen-single div b {
148   - background-position-y: 0px !important;
149   -}
150   -
151   -.chosen-container .chosen-drop .chosen-search input {
152   - background-position-y: -24px !important;
153   -}
app/assets/stylesheets/themes/ui_color.scss
... ... @@ -27,6 +27,12 @@
27 27 background: #435;
28 28 border-left: 1px solid #658;
29 29 }
  30 + .nav > li > a {
  31 + color: #98B;
  32 + }
  33 + .search-input {
  34 + border-color: #98B;
  35 + }
30 36 }
31 37 }
32 38 }
... ...
app/assets/stylesheets/themes/ui_mars.scss
... ... @@ -23,12 +23,17 @@
23 23 background-color: #373D47;
24 24 }
25 25 }
  26 + .separator {
  27 + background: #373D47;
  28 + border-left: 1px solid #575D67;
  29 + }
  30 + .nav > li > a {
  31 + color: #979DA7;
  32 + }
  33 + .search-input {
  34 + border-color: #979DA7;
  35 + }
26 36 }
27 37 }
28   -
29   - .separator {
30   - background: #31363E;
31   - border-left: 1px solid #666;
32   - }
33 38 }
34 39 }
... ...
app/assets/stylesheets/themes/ui_modern.scss
... ... @@ -27,6 +27,12 @@
27 27 background: #234;
28 28 border-left: 1px solid #456;
29 29 }
  30 + .nav > li > a {
  31 + color: #89A;
  32 + }
  33 + .search-input {
  34 + border-color: #89A;
  35 + }
30 36 }
31 37 }
32 38 }
... ...
app/contexts/base_context.rb
... ... @@ -17,4 +17,3 @@ class BaseContext
17 17 abilities.allowed?(object, action, subject)
18 18 end
19 19 end
20   -
... ...
app/contexts/files/base_context.rb 0 → 100644
... ... @@ -0,0 +1,31 @@
  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 0 → 100644
... ... @@ -0,0 +1,46 @@
  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 0 → 100644
... ... @@ -0,0 +1,40 @@
  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 0 → 100644
... ... @@ -0,0 +1,39 @@
  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 1 class FilterContext
2   - attr_accessor :items, :params
  2 + attr_accessor :klass, :current_user, :params
3 3  
4   - def initialize(items, params)
5   - @items = items
  4 + def initialize(klass, current_user, params)
  5 + @klass = klass
  6 + @current_user = current_user
6 7 @params = params
7 8 end
8 9  
9 10 def execute
10   - apply_filter(items)
  11 + items = by_scope
  12 + items = by_state(items)
  13 + items = by_project(items)
  14 + items = by_search(items)
11 15 end
12 16  
13   - def apply_filter items
14   - if params[:project_id].present?
15   - items = items.of_projects(params[:project_id])
16   - end
  17 + private
17 18  
18   - if params[:search].present?
19   - items = items.search(params[:search])
  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}")
20 29 end
  30 + end
21 31  
  32 + def by_state(items)
22 33 case params[:status]
23 34 when 'closed'
24 35 items.closed
... ... @@ -28,4 +39,20 @@ class FilterContext
28 39 items.opened
29 40 end
30 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
31 58 end
... ...
app/contexts/issues/bulk_update_context.rb
... ... @@ -22,7 +22,7 @@ module Issues
22 22 opts[:milestone_id] = milestone_id if milestone_id.present?
23 23 opts[:assignee_id] = assignee_id if assignee_id.present?
24 24  
25   - issues = Issue.where(id: issues_ids).all
  25 + issues = Issue.where(id: issues_ids)
26 26 issues = issues.select { |issue| can?(current_user, :modify_issue, issue) }
27 27  
28 28 issues.each do |issue|
... ...
app/contexts/issues/list_context.rb
... ... @@ -30,7 +30,24 @@ module Issues
30 30 @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
31 31 end
32 32  
  33 + # Sort by :sort param
  34 + @issues = sort(@issues, params[:sort])
  35 +
33 36 @issues
34 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
35 52 end
36 53 end
... ...
app/contexts/projects/create_context.rb
... ... @@ -8,6 +8,11 @@ module Projects
8 8 # get namespace id
9 9 namespace_id = params.delete(:namespace_id)
10 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 +
11 16 # Load default feature settings
12 17 default_features = Gitlab.config.gitlab.default_projects_features
13 18  
... ... @@ -17,7 +22,7 @@ module Projects
17 22 wall_enabled: default_features.wall,
18 23 snippets_enabled: default_features.snippets,
19 24 merge_requests_enabled: default_features.merge_requests,
20   - public: default_features.public
  25 + visibility_level: default_features.visibility_level
21 26 }.stringify_keys
22 27  
23 28 @project = Project.new(default_opts.merge(params))
... ... @@ -47,8 +52,6 @@ module Projects
47 52 @project.creator = current_user
48 53  
49 54 if @project.save
50   - @project.discover_default_branch
51   -
52 55 unless @project.group
53 56 @project.users_projects.create(
54 57 project_access: UsersProject::MASTER,
... ...
app/contexts/projects/update_context.rb
... ... @@ -2,7 +2,17 @@ module Projects
2 2 class UpdateContext < BaseContext
3 3 def execute(role = :default)
4 4 params[:project].delete(:namespace_id)
5   - params[:project].delete(:public) unless can?(current_user, :change_public_mode, project)
  5 + # check that user is allowed to set specified visibility_level
  6 + unless can?(current_user, :change_visibility_level, project) && Gitlab::VisibilityLevel.allowed_for?(current_user, params[:project][:visibility_level])
  7 + params[:project].delete(:visibility_level)
  8 + end
  9 +
  10 + new_branch = params[:project].delete(:default_branch)
  11 +
  12 + if project.repository.exists? && new_branch && new_branch != project.default_branch
  13 + project.change_head(new_branch)
  14 + end
  15 +
6 16 project.update_attributes(params[:project], as: role)
7 17 end
8 18 end
... ...
app/contexts/search_context.rb
1 1 class SearchContext
2   - attr_accessor :project_ids, :params
  2 + attr_accessor :project_ids, :current_user, :params
3 3  
4   - def initialize(project_ids, params)
5   - @project_ids, @params = project_ids, params.dup
  4 + def initialize(project_ids, user, params)
  5 + @project_ids, @current_user, @params = project_ids, user, params.dup
6 6 end
7 7  
8 8 def execute
9 9 query = params[:search]
  10 + query = Shellwords.shellescape(query) if query.present?
10 11  
11 12 return result unless query.present?
12   -
13   - projects = Project.where(id: project_ids)
14   - result[:projects] = projects.search(query).limit(20)
  13 + visibility_levels = @current_user ? [ Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::PUBLIC ] : [ Gitlab::VisibilityLevel::PUBLIC ]
  14 + result[:projects] = Project.where("projects.id in (?) OR projects.visibility_level in (?)", project_ids, visibility_levels).search(query).limit(20)
15 15  
16 16 # Search inside single project
  17 + single_project_search(Project.where(id: project_ids), query)
  18 + result
  19 + end
  20 +
  21 + def single_project_search(projects, query)
17 22 project = projects.first if projects.length == 1
18 23  
19 24 if params[:search_code].present?
... ... @@ -23,7 +28,6 @@ class SearchContext
23 28 result[:issues] = Issue.where(project_id: project_ids).search(query).order('updated_at DESC').limit(20)
24 29 result[:wiki_pages] = []
25 30 end
26   - result
27 31 end
28 32  
29 33 def result
... ...
app/controllers/admin/broadcast_messages_controller.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +class Admin::BroadcastMessagesController < Admin::ApplicationController
  2 + before_filter :broadcast_messages
  3 +
  4 + def index
  5 + @broadcast_message = BroadcastMessage.new
  6 + end
  7 +
  8 + def create
  9 + @broadcast_message = BroadcastMessage.new(params[:broadcast_message])
  10 +
  11 + if @broadcast_message.save
  12 + redirect_to admin_broadcast_messages_path, notice: 'Broadcast Message was successfully created.'
  13 + else
  14 + render :index
  15 + end
  16 + end
  17 +
  18 + def destroy
  19 + BroadcastMessage.find(params[:id]).destroy
  20 +
  21 + respond_to do |format|
  22 + format.html { redirect_to :back }
  23 + format.js { render nothing: true }
  24 + end
  25 + end
  26 +
  27 + protected
  28 +
  29 + def broadcast_messages
  30 + @broadcast_messages ||= BroadcastMessage.order("starts_at DESC").page(params[:page])
  31 + end
  32 +end
... ...
app/controllers/admin/dashboard_controller.rb
... ... @@ -2,5 +2,6 @@ class Admin::DashboardController &lt; Admin::ApplicationController
2 2 def index
3 3 @projects = Project.order("created_at DESC").limit(10)
4 4 @users = User.order("created_at DESC").limit(10)
  5 + @groups = Group.order("created_at DESC").limit(10)
5 6 end
6 7 end
... ...
app/controllers/admin/projects_controller.rb
1 1 class Admin::ProjectsController < Admin::ApplicationController
2   - before_filter :project, only: [:edit, :show, :update, :destroy, :team_update]
  2 + before_filter :project, only: [:show, :transfer]
  3 + before_filter :group, only: [:show, :transfer]
  4 + before_filter :repository, only: [:show, :transfer]
3 5  
4 6 def index
5 7 owner_id = params[:owner_id]
6 8 user = User.find_by_id(owner_id)
7 9  
8   - @projects = user ? user.owned_projects : Project.scoped
9   - @projects = @projects.where(public: true) if params[:public_only].present?
  10 + @projects = user ? user.owned_projects : Project.all
  11 + @projects = @projects.where("visibility_level IN (?)", params[:visibility_levels]) if params[:visibility_levels].present?
10 12 @projects = @projects.with_push if params[:with_push].present?
11 13 @projects = @projects.abandoned if params[:abandoned].present?
12 14 @projects = @projects.search(params[:name]) if params[:name].present?
... ... @@ -14,8 +16,16 @@ class Admin::ProjectsController &lt; Admin::ApplicationController
14 16 end
15 17  
16 18 def show
17   - @repository = @project.repository
18   - @group = @project.group
  19 + end
  20 +
  21 + def transfer
  22 + result = ::Projects::TransferContext.new(@project, current_user, project: params).execute(:admin)
  23 +
  24 + if result
  25 + redirect_to [:admin, @project]
  26 + else
  27 + render :show
  28 + end
19 29 end
20 30  
21 31 protected
... ... @@ -26,4 +36,12 @@ class Admin::ProjectsController &lt; Admin::ApplicationController
26 36 @project = Project.find_with_namespace(id)
27 37 @project || render_404
28 38 end
  39 +
  40 + def group
  41 + @group ||= project.group
  42 + end
  43 +
  44 + def repository
  45 + @repository ||= project.repository
  46 + end
29 47 end
... ...
app/controllers/admin/users_controller.rb
... ... @@ -2,8 +2,7 @@ class Admin::UsersController &lt; Admin::ApplicationController
2 2 before_filter :user, only: [:show, :edit, :update, :destroy]
3 3  
4 4 def index
5   - @users = User.scoped
6   - @users = @users.filter(params[:filter])
  5 + @users = User.filter(params[:filter])
7 6 @users = @users.search(params[:name]) if params[:name].present?
8 7 @users = @users.alphabetically.page(params[:page])
9 8 end
... ... @@ -48,7 +47,7 @@ class Admin::UsersController &lt; Admin::ApplicationController
48 47 @user.admin = (admin && admin.to_i > 0)
49 48 @user.created_by_id = current_user.id
50 49 @user.generate_password
51   - @user.confirm!
  50 + @user.skip_confirmation!
52 51  
53 52 respond_to do |format|
54 53 if @user.save
... ...
app/controllers/application_controller.rb
  1 +require 'gon'
  2 +
1 3 class ApplicationController < ActionController::Base
2 4 before_filter :authenticate_user!
3 5 before_filter :reject_blocked!
... ... @@ -7,6 +9,7 @@ class ApplicationController &lt; ActionController::Base
7 9 before_filter :dev_tools if Rails.env == 'development'
8 10 before_filter :default_headers
9 11 before_filter :add_gon_variables
  12 + before_filter :configure_permitted_parameters, if: :devise_controller?
10 13  
11 14 protect_from_forgery
12 15  
... ... @@ -81,6 +84,9 @@ class ApplicationController &lt; ActionController::Base
81 84  
82 85 if @project and can?(current_user, :read_project, @project)
83 86 @project
  87 + elsif current_user.nil?
  88 + @project = nil
  89 + authenticate_user!
84 90 else
85 91 @project = nil
86 92 render_404 and return
... ... @@ -102,7 +108,7 @@ class ApplicationController &lt; ActionController::Base
102 108 end
103 109  
104 110 def authorize_code_access!
105   - return access_denied! unless can?(current_user, :download_code, project) or project.public?
  111 + return access_denied! unless can?(current_user, :download_code, project)
106 112 end
107 113  
108 114 def authorize_push!
... ... @@ -154,6 +160,9 @@ class ApplicationController &lt; ActionController::Base
154 160 def default_headers
155 161 headers['X-Frame-Options'] = 'DENY'
156 162 headers['X-XSS-Protection'] = '1; mode=block'
  163 + headers['X-UA-Compatible'] = 'IE=edge'
  164 + headers['X-Content-Type-Options'] = 'nosniff'
  165 + headers['Strict-Transport-Security'] = 'max-age=31536000' if Gitlab.config.gitlab.https
157 166 end
158 167  
159 168 def add_gon_variables
... ... @@ -174,4 +183,31 @@ class ApplicationController &lt; ActionController::Base
174 183 filters = cookies['event_filter'].split(',') if cookies['event_filter'].present?
175 184 @event_filter ||= EventFilter.new(filters)
176 185 end
  186 +
  187 + # JSON for infinite scroll via Pager object
  188 + def pager_json(partial, count)
  189 + html = render_to_string(
  190 + partial,
  191 + layout: false,
  192 + formats: [:html]
  193 + )
  194 +
  195 + render json: {
  196 + html: html,
  197 + count: count
  198 + }
  199 + end
  200 +
  201 + def view_to_html_string(partial)
  202 + render_to_string(
  203 + partial,
  204 + layout: false,
  205 + formats: [:html]
  206 + )
  207 + end
  208 +
  209 + def configure_permitted_parameters
  210 + devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email, :password) }
  211 + devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :name, :password, :password_confirmation) }
  212 + end
177 213 end
... ...
app/controllers/dashboard_controller.rb
... ... @@ -22,7 +22,7 @@ class DashboardController &lt; ApplicationController
22 22  
23 23 respond_to do |format|
24 24 format.html
25   - format.js
  25 + format.json { pager_json("events/_events", @events.count) }
26 26 format.atom { render layout: false }
27 27 end
28 28 end
... ... @@ -40,26 +40,23 @@ class DashboardController &lt; ApplicationController
40 40 end
41 41  
42 42 @projects = @projects.where(namespace_id: Group.find_by_name(params[:group])) if params[:group].present?
43   - @projects = @projects.includes(:namespace).sorted_by_activity
  43 + @projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present?
  44 + @projects = @projects.includes(:namespace)
  45 + @projects = @projects.tagged_with(params[:label]) if params[:label].present?
  46 + @projects = @projects.sort(@sort = params[:sort])
  47 + @projects = @projects.page(params[:page]).per(30)
44 48  
45 49 @labels = current_user.authorized_projects.tags_on(:labels)
46 50 @groups = current_user.authorized_groups
47   -
48   - @projects = @projects.tagged_with(params[:label]) if params[:label].present?
49   - @projects = @projects.page(params[:page]).per(30)
50 51 end
51 52  
52   - # Get authored or assigned open merge requests
53 53 def merge_requests
54   - @merge_requests = current_user.cared_merge_requests
55   - @merge_requests = FilterContext.new(@merge_requests, params).execute
  54 + @merge_requests = FilterContext.new(MergeRequest, current_user, params).execute
56 55 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
57 56 end
58 57  
59   - # Get only assigned issues
60 58 def issues
61   - @issues = current_user.assigned_issues
62   - @issues = FilterContext.new(@issues, params).execute
  59 + @issues = FilterContext.new(Issue, current_user, params).execute
63 60 @issues = @issues.recent.page(params[:page]).per(20)
64 61 @issues = @issues.includes(:author, :project)
65 62  
... ... @@ -72,6 +69,6 @@ class DashboardController &lt; ApplicationController
72 69 protected
73 70  
74 71 def load_projects
75   - @projects = current_user.authorized_projects.sorted_by_activity
  72 + @projects = current_user.authorized_projects.sorted_by_activity.non_archived
76 73 end
77 74 end
... ...
app/controllers/groups_controller.rb
... ... @@ -38,22 +38,22 @@ class GroupsController &lt; ApplicationController
38 38  
39 39 respond_to do |format|
40 40 format.html
41   - format.js
  41 + format.json { pager_json("events/_events", @events.count) }
42 42 format.atom { render layout: false }
43 43 end
44 44 end
45 45  
46 46 # Get authored or assigned open merge requests
47 47 def merge_requests
48   - @merge_requests = current_user.cared_merge_requests.of_group(@group)
49   - @merge_requests = FilterContext.new(@merge_requests, params).execute
  48 + @merge_requests = FilterContext.new(MergeRequest, current_user, params).execute
  49 + @merge_requests = @merge_requests.of_group(@group)
50 50 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
51 51 end
52 52  
53 53 # Get only assigned issues
54 54 def issues
55   - @issues = current_user.assigned_issues.of_group(@group)
56   - @issues = FilterContext.new(@issues, params).execute
  55 + @issues = FilterContext.new(Issue, current_user, params).execute
  56 + @issues = @issues.of_group(@group)
57 57 @issues = @issues.recent.page(params[:page]).per(20)
58 58 @issues = @issues.includes(:author, :project)
59 59  
... ... @@ -102,7 +102,7 @@ class GroupsController &lt; ApplicationController
102 102  
103 103 # Dont allow unauthorized access to group
104 104 def authorize_read_group!
105   - unless projects.present? or can?(current_user, :read_group, @group)
  105 + unless @group and (projects.present? or can?(current_user, :read_group, @group))
106 106 return render_404
107 107 end
108 108 end
... ...
app/controllers/profiles/avatars_controller.rb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +class Profiles::AvatarsController < ApplicationController
  2 + layout "profile"
  3 +
  4 + def destroy
  5 + @user = current_user
  6 + @user.remove_avatar!
  7 +
  8 + @user.save
  9 + @user.reset_events_cache
  10 +
  11 + redirect_to profile_path
  12 + end
  13 +end
... ...