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.

1 language: ruby 1 language: ruby
2 env: 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 before_install: 10 before_install:
5 - sudo apt-get install libicu-dev -y 11 - sudo apt-get install libicu-dev -y
6 - - gem install charlock_holmes -v="0.6.9"  
7 branches: 12 branches:
8 only: 13 only:
9 - 'master' 14 - 'master'
@@ -11,8 +16,12 @@ rvm: @@ -11,8 +16,12 @@ rvm:
11 - 2.0.0 16 - 2.0.0
12 services: 17 services:
13 - mysql 18 - mysql
14 - - postgresql 19 + - redis-server
15 before_script: 20 before_script:
16 - "cp config/database.yml.$DB config/database.yml" 21 - "cp config/database.yml.$DB config/database.yml"
17 - "cp config/gitlab.yml.example config/gitlab.yml" 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
  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 v 6.3.0 49 v 6.3.0
2 - API for adding gitlab-ci service 50 - API for adding gitlab-ci service
3 - Init script now waits for pids to appear after (re)starting before reporting status (Rovanion Luckey) 51 - Init script now waits for pids to appear after (re)starting before reporting status (Rovanion Luckey)
4 - Restyle project home page 52 - Restyle project home page
5 - Grammar fixes 53 - Grammar fixes
6 - Show branches list (which branches contains commit) on commit page (Andrew Kumanyaev) 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 v 6.2.0 89 v 6.2.0
9 - Public project pages are now visible to everyone (files, issues, wik, etc.) 90 - Public project pages are now visible to everyone (files, issues, wik, etc.)
@@ -25,7 +106,7 @@ v 6.2.0 @@ -25,7 +106,7 @@ v 6.2.0
25 - Avatar upload on profile page with a maximum of 100KB (Steven Thonus) 106 - Avatar upload on profile page with a maximum of 100KB (Steven Thonus)
26 - Store the sessions in Redis instead of the cookie store 107 - Store the sessions in Redis instead of the cookie store
27 - Fixed relative links in markdown 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 - User must confirm changed email 110 - User must confirm changed email
30 111
31 v 6.1.0 112 v 6.1.0
@@ -47,7 +128,7 @@ v 6.1.0 @@ -47,7 +128,7 @@ v 6.1.0
47 - Add links to create branch/tag from project home page 128 - Add links to create branch/tag from project home page
48 - Add public-project? checkbox to new-project view 129 - Add public-project? checkbox to new-project view
49 - Improved compare page. Added link to proceed into Merge Request 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 - New landing page when you have 0 projects 132 - New landing page when you have 0 projects
52 133
53 v 6.0.0 134 v 6.0.0
@@ -90,6 +171,14 @@ v 6.0.0 @@ -90,6 +171,14 @@ v 6.0.0
90 - Improved MR comments logic 171 - Improved MR comments logic
91 - Render readme file for projects in public area 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 v 5.4.0 182 v 5.4.0
94 - Ability to edit own comments 183 - Ability to edit own comments
95 - Documentation improvements 184 - Documentation improvements
CONTRIBUTING.md
1 # Contribute to GitLab 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 If you want to know how the GitLab team handles contributions have a look at [the GitLab contributing process](PROCESS.md). 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 Please treat our volunteers with courtesy and respect, it will go a long way towards getting your issue resolved. 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 ## Issue tracker 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 Do not use the issue tracker for feature requests. We have a specific [feedback and suggestions forum](http://feedback.gitlab.com) for this purpose. 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 ### Issue tracker guidelines 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 1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen) 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 3. **Expected behavior:** Describe your issue in detail 39 3. **Expected behavior:** Describe your issue in detail
37 4. **Observed behavior** 40 4. **Observed behavior**
38 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. 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,37 +46,37 @@ Please send a pull request with a tested solution or a pull request with a faili
43 * Describe your setup (use relevant parts from `sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production`) 46 * Describe your setup (use relevant parts from `sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production`)
44 7. **Possible fixes**: If you can, link to the line of code that might be responsible for the problem 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 1. Create a feature branch 58 1. Create a feature branch
56 1. Write [tests](README.md#run-the-tests) and code 59 1. Write [tests](README.md#run-the-tests) and code
57 1. Add your changes to the [CHANGELOG](CHANGELOG) 60 1. Add your changes to the [CHANGELOG](CHANGELOG)
58 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) 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 1. Push the commit to your fork 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 * The code has proper tests and all tests pass (or it is a test exposing a failure in existing code) 73 * The code has proper tests and all tests pass (or it is a test exposing a failure in existing code)
66 * It can be merged without problems (if not please use: `git rebase master`) 74 * It can be merged without problems (if not please use: `git rebase master`)
67 * It does not break any existing functionality 75 * It does not break any existing functionality
68 * 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 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 * It keeps the GitLab code base clean and well structured 78 * It keeps the GitLab code base clean and well structured
72 * We think other users will benefit from the same functionality 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 * It is a single commit (please use `git rebase -i` to squash commits) 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).
@@ -8,15 +8,21 @@ def linux_only(require_as) @@ -8,15 +8,21 @@ def linux_only(require_as)
8 RUBY_PLATFORM.include?('linux') && require_as 8 RUBY_PLATFORM.include?('linux') && require_as
9 end 9 end
10 10
11 -gem "rails", "3.2.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 # Supported DBs 19 # Supported DBs
14 gem "mysql2", group: :mysql 20 gem "mysql2", group: :mysql
15 gem "pg", group: :postgres 21 gem "pg", group: :postgres
16 22
17 # Auth 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 gem 'omniauth', "~> 1.1.3" 26 gem 'omniauth', "~> 1.1.3"
21 gem 'omniauth-google-oauth2' 27 gem 'omniauth-google-oauth2'
22 gem 'omniauth-twitter' 28 gem 'omniauth-twitter'
@@ -24,26 +30,27 @@ gem 'omniauth-github' @@ -24,26 +30,27 @@ gem 'omniauth-github'
24 30
25 # Extracting information from a git repository 31 # Extracting information from a git repository
26 # Provide access to Gitlab::Git library 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 # Ruby/Rack Git Smart-HTTP Server Handler 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 # LDAP Auth 38 # LDAP Auth
33 gem 'gitlab_omniauth-ldap', '1.0.3', require: "omniauth-ldap" 39 gem 'gitlab_omniauth-ldap', '1.0.3', require: "omniauth-ldap"
34 40
35 # Syntax highlighter 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 # Git Wiki 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 # Language detection 47 # Language detection
42 -gem "github-linguist", require: "linguist" 48 +gem "gitlab-linguist", "~> 2.9.6", require: "linguist"
43 49
44 # API 50 # API
45 -gem "grape", "~> 0.4.1" 51 +gem "grape", "~> 0.6.1"
46 gem "grape-entity", "~> 0.3.0" 52 gem "grape-entity", "~> 0.3.0"
  53 +gem 'rack-cors', require: 'rack/cors'
47 54
48 # Format dates and times 55 # Format dates and times
49 # based on human-friendly examples 56 # based on human-friendly examples
@@ -72,13 +79,16 @@ gem "seed-fu" @@ -72,13 +79,16 @@ gem "seed-fu"
72 79
73 # Markdown to HTML 80 # Markdown to HTML
74 gem "redcarpet", "~> 2.2.2" 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 # Asciidoc to HTML 84 # Asciidoc to HTML
78 gem "asciidoctor" 85 gem "asciidoctor"
79 86
80 # Application server 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 # State machine 93 # State machine
84 gem "state_machine" 94 gem "state_machine"
@@ -127,26 +137,24 @@ gem "sanitize" @@ -127,26 +137,24 @@ gem "sanitize"
127 # Protect against bruteforcing 137 # Protect against bruteforcing
128 gem "rack-attack" 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 group :development do 159 group :development do
152 gem "annotate", "~> 2.6.0.beta2" 160 gem "annotate", "~> 2.6.0.beta2"
@@ -169,7 +177,7 @@ end @@ -169,7 +177,7 @@ end
169 177
170 group :development, :test do 178 group :development, :test do
171 gem 'coveralls', require: false 179 gem 'coveralls', require: false
172 - gem 'rails-dev-tweaks' 180 + # gem 'rails-dev-tweaks'
173 gem 'spinach-rails' 181 gem 'spinach-rails'
174 gem "rspec-rails" 182 gem "rspec-rails"
175 gem "capybara" 183 gem "capybara"
@@ -198,7 +206,7 @@ group :development, :test do @@ -198,7 +206,7 @@ group :development, :test do
198 gem 'poltergeist', '~> 1.4.1' 206 gem 'poltergeist', '~> 1.4.1'
199 207
200 gem 'spork', '~> 1.0rc' 208 gem 'spork', '~> 1.0rc'
201 - gem 'jasmine' 209 + gem 'jasmine', '2.0.0.rc5'
202 end 210 end
203 211
204 group :test do 212 group :test do
  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 GEM 8 GEM
2 remote: https://rubygems.org/ 9 remote: https://rubygems.org/
3 specs: 10 specs:
4 - actionmailer (3.2.15)  
5 - actionpack (= 3.2.15) 11 + actionmailer (4.0.2)
  12 + actionpack (= 4.0.2)
6 mail (~> 2.5.4) 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 erubis (~> 2.7.0) 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 i18n (~> 0.6, >= 0.6.4) 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 acts-as-taggable-on (2.4.1) 39 acts-as-taggable-on (2.4.1)
32 rails (>= 3, < 5) 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 activerecord (>= 2.3.0) 43 activerecord (>= 2.3.0)
36 rake (>= 0.8.7) 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 awesome_print (1.2.0) 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 better_errors (1.0.1) 53 better_errors (1.0.1)
43 coderay (>= 1.0.0) 54 coderay (>= 1.0.0)
44 erubis (>= 2.6.6) 55 erubis (>= 2.6.6)
45 binding_of_caller (0.7.2) 56 binding_of_caller (0.7.2)
46 debug_inspector (>= 0.0.1) 57 debug_inspector (>= 0.0.1)
47 - bootstrap-sass (2.3.2.2) 58 + bootstrap-sass (3.0.3.0)
48 sass (~> 3.2) 59 sass (~> 3.2)
49 - builder (3.0.4) 60 + builder (3.1.4)
50 capybara (2.1.0) 61 capybara (2.1.0)
51 mime-types (>= 1.16) 62 mime-types (>= 1.16)
52 nokogiri (>= 1.3.3) 63 nokogiri (>= 1.3.3)
53 rack (>= 1.0.0) 64 rack (>= 1.0.0)
54 rack-test (>= 0.5.4) 65 rack-test (>= 0.5.4)
55 xpath (~> 2.0) 66 xpath (~> 2.0)
56 - carrierwave (0.8.0) 67 + carrierwave (0.9.0)
57 activemodel (>= 3.2.0) 68 activemodel (>= 3.2.0)
58 activesupport (>= 3.2.0) 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 charlock_holmes (0.6.9.4) 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 coffee-rails (>= 3.2) 75 coffee-rails (>= 3.2)
66 compass-rails (>= 1.0) 76 compass-rails (>= 1.0)
67 railties (>= 3.0) 77 railties (>= 3.0)
68 sass-rails (>= 3.2) 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 code_analyzer (0.4.3) 81 code_analyzer (0.4.3)
72 sexp_processor 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 coffee-script (>= 2.2.0) 87 coffee-script (>= 2.2.0)
76 - railties (~> 3.2.0) 88 + railties (>= 4.0.0, < 5.0)
77 coffee-script (2.2.0) 89 coffee-script (2.2.0)
78 coffee-script-source 90 coffee-script-source
79 execjs 91 execjs
80 - coffee-script-source (1.6.2) 92 + coffee-script-source (1.6.3)
81 colored (1.2) 93 colored (1.2)
82 colorize (0.5.8) 94 colorize (0.5.8)
83 compass (0.12.2) 95 compass (0.12.2)
84 chunky_png (~> 1.2) 96 chunky_png (~> 1.2)
85 fssm (>= 0.2.7) 97 fssm (>= 0.2.7)
86 sass (~> 3.1) 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 coveralls (0.7.0) 102 coveralls (0.7.0)
91 multi_json (~> 1.3) 103 multi_json (~> 1.3)
92 rest-client 104 rest-client
93 simplecov (>= 0.7) 105 simplecov (>= 0.7)
94 term-ansicolor 106 term-ansicolor
95 thor 107 thor
96 - crack (0.4.0) 108 + crack (0.4.1)
97 safe_yaml (~> 0.9.0) 109 safe_yaml (~> 0.9.0)
98 d3_rails (3.1.10) 110 d3_rails (3.1.10)
99 railties (>= 3.1.0) 111 railties (>= 3.1.0)
100 daemons (1.1.9) 112 daemons (1.1.9)
101 - database_cleaner (1.1.1) 113 + database_cleaner (1.2.0)
102 debug_inspector (0.0.2) 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 bcrypt-ruby (~> 3.0) 117 bcrypt-ruby (~> 3.0)
106 orm_adapter (~> 0.1) 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 devise-async (0.8.0) 121 devise-async (0.8.0)
110 devise (>= 2.2, < 3.2) 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 launchy (~> 2.1) 127 launchy (~> 2.1)
115 mail (~> 2.2) 128 mail (~> 2.2)
116 - enumerize (0.6.1) 129 + enumerize (0.7.0)
117 activesupport (>= 3.2) 130 activesupport (>= 3.2)
  131 + equalizer (0.0.8)
118 erubis (2.7.0) 132 erubis (2.7.0)
119 escape_utils (0.2.4) 133 escape_utils (0.2.4)
120 eventmachine (1.0.3) 134 eventmachine (1.0.3)
121 excon (0.13.4) 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 activesupport (>= 3.0.0) 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 railties (>= 3.0.0) 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 faraday_middleware (0.9.0) 144 faraday_middleware (0.9.0)
132 faraday (>= 0.7.4, < 0.9) 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 fog (1.3.1) 148 fog (1.3.1)
136 builder 149 builder
137 excon (~> 0.13.0) 150 excon (~> 0.13.0)
@@ -149,50 +162,51 @@ GEM @@ -149,50 +162,51 @@ GEM
149 thor (>= 0.13.6) 162 thor (>= 0.13.6)
150 formatador (0.2.4) 163 formatador (0.2.4)
151 fssm (0.2.10) 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 gitlab-flowdock-git-hook (0.4.2.2) 169 gitlab-flowdock-git-hook (0.4.2.2)
162 gitlab-grit (>= 2.4.1) 170 gitlab-grit (>= 2.4.1)
163 multi_json 171 multi_json
164 - gitlab-gollum-lib (1.0.1) 172 + gitlab-gollum-lib (1.0.2)
165 github-markdown (~> 0.5.3) 173 github-markdown (~> 0.5.3)
166 github-markup (>= 0.7.5, < 1.0.0) 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 nokogiri (~> 1.5.9) 177 nokogiri (~> 1.5.9)
169 - pygments.rb (~> 0.4.2)  
170 sanitize (~> 2.0.3) 178 sanitize (~> 2.0.3)
171 stringex (~> 1.5.1) 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 charlock_holmes (~> 0.6.9) 183 charlock_holmes (~> 0.6.9)
176 diff-lcs (~> 1.1) 184 diff-lcs (~> 1.1)
177 mime-types (~> 1.15) 185 mime-types (~> 1.15)
178 posix-spawn (~> 0.3.6) 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 posix-spawn (~> 0.3.6) 193 posix-spawn (~> 0.3.6)
181 yajl-ruby (~> 1.1.0) 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 gitlab_meta (6.0) 200 gitlab_meta (6.0)
187 gitlab_omniauth-ldap (1.0.3) 201 gitlab_omniauth-ldap (1.0.3)
188 net-ldap (~> 0.3.1) 202 net-ldap (~> 0.3.1)
189 omniauth (~> 1.0) 203 omniauth (~> 1.0)
190 pyu-ruby-sasl (~> 0.0.3.1) 204 pyu-ruby-sasl (~> 0.0.3.1)
191 rubyntlm (~> 0.1.1) 205 rubyntlm (~> 0.1.1)
192 - gon (4.1.1) 206 + gon (5.0.1)
193 actionpack (>= 2.3.0) 207 actionpack (>= 2.3.0)
194 json 208 json
195 - grape (0.4.1) 209 + grape (0.6.1)
196 activesupport 210 activesupport
197 builder 211 builder
198 hashie (>= 1.2.0) 212 hashie (>= 1.2.0)
@@ -201,91 +215,91 @@ GEM @@ -201,91 +215,91 @@ GEM
201 rack (>= 1.3.0) 215 rack (>= 1.3.0)
202 rack-accept 216 rack-accept
203 rack-mount 217 rack-mount
204 - virtus 218 + virtus (>= 1.0.0)
205 grape-entity (0.3.0) 219 grape-entity (0.3.0)
206 activesupport 220 activesupport
207 multi_json (>= 1.3.2) 221 multi_json (>= 1.3.2)
208 growl (1.0.3) 222 growl (1.0.3)
209 - guard (1.8.1) 223 + guard (2.2.4)
210 formatador (>= 0.2.4) 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 guard-spinach (0.0.2) 232 guard-spinach (0.0.2)
219 guard (>= 1.1) 233 guard (>= 1.1)
220 spinach 234 spinach
221 - haml (4.0.3) 235 + haml (4.0.4)
222 tilt 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 hike (1.2.3) 243 hike (1.2.3)
230 hipchat (0.9.0) 244 hipchat (0.9.0)
231 httparty 245 httparty
232 httparty 246 httparty
233 http_parser.rb (0.5.3) 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 multi_xml (>= 0.5.2) 250 multi_xml (>= 0.5.2)
237 httpauth (0.2.0) 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 jquery-rails (2.1.3) 261 jquery-rails (2.1.3)
248 railties (>= 3.1.0, < 5.0) 262 railties (>= 3.1.0, < 5.0)
249 thor (~> 0.14) 263 thor (~> 0.14)
250 - jquery-turbolinks (1.0.0) 264 + jquery-turbolinks (2.0.1)
251 railties (>= 3.1.0) 265 railties (>= 3.1.0)
252 turbolinks 266 turbolinks
253 jquery-ui-rails (2.0.2) 267 jquery-ui-rails (2.0.2)
254 jquery-rails 268 jquery-rails
255 railties (>= 3.1.0) 269 railties (>= 3.1.0)
256 - json (1.7.7) 270 + json (1.8.1)
257 jwt (0.1.8) 271 jwt (0.1.8)
258 multi_json (>= 1.5) 272 multi_json (>= 1.5)
259 kaminari (0.14.1) 273 kaminari (0.14.1)
260 actionpack (>= 3.0.0) 274 actionpack (>= 3.0.0)
261 activesupport (>= 3.0.0) 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 addressable (~> 2.3) 278 addressable (~> 2.3)
265 - letter_opener (1.1.1) 279 + letter_opener (1.1.2)
266 launchy (~> 2.2) 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 rb-fsevent (>= 0.9.3) 284 rb-fsevent (>= 0.9.3)
270 rb-inotify (>= 0.9) 285 rb-inotify (>= 0.9)
271 - rb-kqueue (>= 0.2)  
272 - lumberjack (1.0.3) 286 + lumberjack (1.0.4)
273 mail (2.5.4) 287 mail (2.5.4)
274 mime-types (~> 1.16) 288 mime-types (~> 1.16)
275 treetop (~> 1.4.8) 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 modernizr (2.6.2) 293 modernizr (2.6.2)
280 sprockets (~> 2.0) 294 sprockets (~> 2.0)
281 multi_json (1.8.2) 295 multi_json (1.8.2)
282 - multi_xml (0.5.4) 296 + multi_xml (0.5.5)
283 multipart-post (1.2.0) 297 multipart-post (1.2.0)
284 mysql2 (0.3.11) 298 mysql2 (0.3.11)
285 net-ldap (0.3.1) 299 net-ldap (0.3.1)
286 net-scp (1.0.4) 300 net-scp (1.0.4)
287 net-ssh (>= 1.99.1) 301 net-ssh (>= 1.99.1)
288 - net-ssh (2.6.8) 302 + net-ssh (2.7.0)
289 nokogiri (1.5.10) 303 nokogiri (1.5.10)
290 oauth (0.4.7) 304 oauth (0.4.7)
291 oauth2 (0.8.1) 305 oauth2 (0.8.1)
@@ -297,10 +311,10 @@ GEM @@ -297,10 +311,10 @@ GEM
297 omniauth (1.1.4) 311 omniauth (1.1.4)
298 hashie (>= 1.2, < 3) 312 hashie (>= 1.2, < 3)
299 rack 313 rack
300 - omniauth-github (1.1.0) 314 + omniauth-github (1.1.1)
301 omniauth (~> 1.0) 315 omniauth (~> 1.0)
302 omniauth-oauth2 (~> 1.1) 316 omniauth-oauth2 (~> 1.1)
303 - omniauth-google-oauth2 (0.1.19) 317 + omniauth-google-oauth2 (0.2.1)
304 omniauth (~> 1.0) 318 omniauth (~> 1.0)
305 omniauth-oauth2 319 omniauth-oauth2
306 omniauth-oauth (1.0.1) 320 omniauth-oauth (1.0.1)
@@ -309,11 +323,12 @@ GEM @@ -309,11 +323,12 @@ GEM
309 omniauth-oauth2 (1.1.1) 323 omniauth-oauth2 (1.1.1)
310 oauth2 (~> 0.8.0) 324 oauth2 (~> 0.8.0)
311 omniauth (~> 1.0) 325 omniauth (~> 1.0)
312 - omniauth-twitter (0.0.17) 326 + omniauth-twitter (1.0.1)
313 multi_json (~> 1.3) 327 multi_json (~> 1.3)
314 omniauth-oauth (~> 1.0) 328 omniauth-oauth (~> 1.0)
315 - orm_adapter (0.4.0) 329 + orm_adapter (0.5.0)
316 pg (0.15.1) 330 pg (0.15.1)
  331 + phantomjs (1.9.2.0)
317 poltergeist (1.4.1) 332 poltergeist (1.4.1)
318 capybara (~> 2.1.0) 333 capybara (~> 2.1.0)
319 cliver (~> 0.2.1) 334 cliver (~> 0.2.1)
@@ -321,44 +336,40 @@ GEM @@ -321,44 +336,40 @@ GEM
321 websocket-driver (>= 0.2.0) 336 websocket-driver (>= 0.2.0)
322 polyglot (0.3.3) 337 polyglot (0.3.3)
323 posix-spawn (0.3.6) 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 method_source (~> 0.8) 343 method_source (~> 0.8)
327 slop (~> 3.4) 344 slop (~> 3.4)
328 - pygments.rb (0.4.2)  
329 - posix-spawn (~> 0.3.6)  
330 - yajl-ruby (~> 1.1.0)  
331 pyu-ruby-sasl (0.0.3.3) 345 pyu-ruby-sasl (0.0.3.3)
332 quiet_assets (1.0.2) 346 quiet_assets (1.0.2)
333 railties (>= 3.1, < 5.0) 347 railties (>= 3.1, < 5.0)
334 - rack (1.4.5) 348 + racc (1.4.10)
  349 + rack (1.5.2)
335 rack-accept (0.4.5) 350 rack-accept (0.4.5)
336 rack (>= 0.4) 351 rack (>= 0.4)
337 - rack-attack (2.2.1) 352 + rack-attack (2.3.0)
338 rack 353 rack
339 - rack-cache (1.2)  
340 - rack (>= 0.4) 354 + rack-cors (0.2.9)
341 rack-mini-profiler (0.1.31) 355 rack-mini-profiler (0.1.31)
342 rack (>= 1.1.3) 356 rack (>= 1.1.3)
343 rack-mount (0.8.3) 357 rack-mount (0.8.3)
344 rack (>= 1.0.0) 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 rack 360 rack
349 rack-test (0.6.2) 361 rack-test (0.6.2)
350 rack (>= 1.0) 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 rails_best_practices (1.14.4) 373 rails_best_practices (1.14.4)
363 activesupport 374 activesupport
364 awesome_print 375 awesome_print
@@ -368,180 +379,179 @@ GEM @@ -368,180 +379,179 @@ GEM
368 i18n 379 i18n
369 require_all 380 require_all
370 ruby-progressbar 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 rake (>= 0.8.7) 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 rake (10.1.0) 388 rake (10.1.0)
380 raphael-rails (2.1.2) 389 raphael-rails (2.1.2)
381 rb-fsevent (0.9.3) 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 ffi (>= 0.5.0) 392 ffi (>= 0.5.0)
386 rdoc (3.12.2) 393 rdoc (3.12.2)
387 json (~> 1.4) 394 json (~> 1.4)
388 redcarpet (2.2.2) 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 redis-store (~> 1.1.0) 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 redis-store (1.1.4) 413 redis-store (1.1.4)
407 redis (>= 2.2) 414 redis (>= 2.2)
408 ref (1.0.5) 415 ref (1.0.5)
409 - require_all (1.3.1) 416 + require_all (1.3.2)
410 rest-client (1.6.7) 417 rest-client (1.6.7)
411 mime-types (>= 1.16) 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 diff-lcs (>= 1.1.3, < 2.0) 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 actionpack (>= 3.0) 428 actionpack (>= 3.0)
422 activesupport (>= 3.0) 429 activesupport (>= 3.0)
423 railties (>= 3.0) 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 ruby-hmac (0.4.0) 434 ruby-hmac (0.4.0)
428 ruby-progressbar (1.2.0) 435 ruby-progressbar (1.2.0)
429 rubyntlm (0.1.1) 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 sass (>= 3.1.10) 443 sass (>= 3.1.10)
438 - tilt (~> 1.3) 444 + sprockets-rails (~> 2.0.0)
439 sdoc (0.3.20) 445 sdoc (0.3.20)
440 json (>= 1.1.3) 446 json (>= 1.1.3)
441 rdoc (~> 3.10) 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 thor (~> 0.14) 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 settingslogic (2.0.9) 453 settingslogic (2.0.9)
454 - sexp_processor (4.3.0) 454 + sexp_processor (4.4.0)
455 shoulda-matchers (2.1.0) 455 shoulda-matchers (2.1.0)
456 activesupport (>= 3.0.0) 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 connection_pool (>= 1.0.0) 459 connection_pool (>= 1.0.0)
460 json 460 json
461 redis (>= 3.0.4) 461 redis (>= 3.0.4)
462 - redis-namespace 462 + redis-namespace (>= 1.3.1)
463 simple_oauth (0.1.9) 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 rack (~> 1.4) 470 rack (~> 1.4)
470 rack-protection (~> 1.4) 471 rack-protection (~> 1.4)
471 tilt (~> 1.3, >= 1.3.4) 472 tilt (~> 1.3, >= 1.3.4)
472 six (0.2.0) 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 colorize (= 0.5.8) 479 colorize (= 0.5.8)
479 - gherkin-ruby (~> 0.3.0) 480 + gherkin-ruby (>= 0.3.1)
480 spinach-rails (0.2.1) 481 spinach-rails (0.2.1)
481 capybara (>= 2.0.0) 482 capybara (>= 2.0.0)
482 railties (>= 3) 483 railties (>= 3)
483 spinach (>= 0.4) 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 hike (~> 1.2) 487 hike (~> 1.2)
487 multi_json (~> 1.0) 488 multi_json (~> 1.0)
488 rack (~> 1.0) 489 rack (~> 1.0)
489 tilt (~> 1.1, != 1.3.0) 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 stamp (0.5.0) 495 stamp (0.5.0)
491 state_machine (1.2.0) 496 state_machine (1.2.0)
492 stringex (1.5.1) 497 stringex (1.5.1)
493 - temple (0.6.5) 498 + temple (0.6.7)
494 term-ansicolor (1.2.2) 499 term-ansicolor (1.2.2)
495 tins (~> 0.8) 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 ref 504 ref
500 - thin (1.5.1) 505 + thin (1.6.1)
501 daemons (>= 1.0.9) 506 daemons (>= 1.0.9)
502 - eventmachine (>= 0.12.6) 507 + eventmachine (>= 1.0.0)
503 rack (>= 1.0.0) 508 rack (>= 1.0.0)
504 thor (0.18.1) 509 thor (0.18.1)
  510 + thread_safe (0.1.3)
  511 + atomic
505 tilt (1.4.1) 512 tilt (1.4.1)
506 timers (1.1.0) 513 timers (1.1.0)
507 - tinder (1.9.2) 514 + tinder (1.9.3)
508 eventmachine (~> 1.0) 515 eventmachine (~> 1.0)
509 faraday (~> 0.8) 516 faraday (~> 0.8)
510 faraday_middleware (~> 0.9) 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 mime-types (~> 1.19) 520 mime-types (~> 1.19)
514 - multi_json (~> 1.5) 521 + multi_json (~> 1.7)
515 twitter-stream (~> 0.1) 522 twitter-stream (~> 0.1)
516 - tins (0.11.0) 523 + tins (0.13.1)
517 treetop (1.4.15) 524 treetop (1.4.15)
518 polyglot 525 polyglot
519 polyglot (>= 0.3.1) 526 polyglot (>= 0.3.1)
520 - turbolinks (1.2.0) 527 + turbolinks (2.0.0)
521 coffee-rails 528 coffee-rails
522 twitter-stream (0.1.16) 529 twitter-stream (0.1.16)
523 eventmachine (>= 0.12.8) 530 eventmachine (>= 0.12.8)
524 http_parser.rb (~> 0.5.1) 531 http_parser.rb (~> 0.5.1)
525 simple_oauth (~> 0.1.4) 532 simple_oauth (~> 0.1.4)
526 tzinfo (0.3.38) 533 tzinfo (0.3.38)
527 - uglifier (2.1.1) 534 + uglifier (2.3.2)
528 execjs (>= 0.3.0) 535 execjs (>= 0.3.0)
529 - multi_json (~> 1.0, >= 1.0.2) 536 + json (>= 1.8.0)
530 underscore-rails (1.4.4) 537 underscore-rails (1.4.4)
531 unicorn (4.6.3) 538 unicorn (4.6.3)
532 kgio (~> 2.6) 539 kgio (~> 2.6)
533 rack 540 rack
534 raindrops (~> 0.7) 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 descendants_tracker (~> 0.0.1) 547 descendants_tracker (~> 0.0.1)
  548 + equalizer (~> 0.0.7)
538 warden (1.2.3) 549 warden (1.2.3)
539 rack (>= 1.0) 550 rack (>= 1.0)
540 - webmock (1.11.0) 551 + webmock (1.16.0)
541 addressable (>= 2.2.7) 552 addressable (>= 2.2.7)
542 crack (>= 0.3.2) 553 crack (>= 0.3.2)
543 - websocket (1.0.7)  
544 - websocket-driver (0.3.0) 554 + websocket-driver (0.3.1)
545 xpath (2.0.0) 555 xpath (2.0.0)
546 nokogiri (~> 1.3) 556 nokogiri (~> 1.3)
547 yajl-ruby (1.1.0) 557 yajl-ruby (1.1.0)
@@ -550,42 +560,45 @@ PLATFORMS @@ -550,42 +560,45 @@ PLATFORMS
550 ruby 560 ruby
551 561
552 DEPENDENCIES 562 DEPENDENCIES
  563 + actionpack-action_caching
  564 + actionpack-page_caching
  565 + activerecord-deprecated_finders
553 acts-as-taggable-on 566 acts-as-taggable-on
554 annotate (~> 2.6.0.beta2) 567 annotate (~> 2.6.0.beta2)
555 asciidoctor 568 asciidoctor
556 awesome_print 569 awesome_print
557 better_errors 570 better_errors
558 binding_of_caller 571 binding_of_caller
559 - bootstrap-sass 572 + bootstrap-sass (~> 3.0)
560 capybara 573 capybara
561 carrierwave 574 carrierwave
562 - chosen-rails (= 1.0.0) 575 + chosen-rails (= 1.0.1)
563 coffee-rails 576 coffee-rails
564 colored 577 colored
565 coveralls 578 coveralls
566 d3_rails (~> 3.1.4) 579 d3_rails (~> 3.1.4)
567 database_cleaner 580 database_cleaner
568 - devise (~> 2.2)  
569 - devise-async 581 + devise (= 3.0.4)
  582 + devise-async (= 0.8.0)
570 email_spec 583 email_spec
571 enumerize 584 enumerize
572 factory_girl_rails 585 factory_girl_rails
573 ffaker 586 ffaker
574 fog (~> 1.3.1) 587 fog (~> 1.3.1)
575 - font-awesome-rails 588 + font-awesome-rails (~> 3.2)
576 foreman 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 gitlab-flowdock-git-hook (~> 0.4.2) 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 gitlab_meta (= 6.0) 598 gitlab_meta (= 6.0)
586 gitlab_omniauth-ldap (= 1.0.3) 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 grape-entity (~> 0.3.0) 602 grape-entity (~> 0.3.0)
590 growl 603 growl
591 guard-rspec 604 guard-rspec
@@ -593,8 +606,8 @@ DEPENDENCIES @@ -593,8 +606,8 @@ DEPENDENCIES
593 haml-rails 606 haml-rails
594 hipchat (~> 0.9.0) 607 hipchat (~> 0.9.0)
595 httparty 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 jquery-rails (= 2.1.3) 611 jquery-rails (= 2.1.3)
599 jquery-turbolinks 612 jquery-turbolinks
600 jquery-ui-rails (= 2.0.2) 613 jquery-ui-rails (= 2.0.2)
@@ -610,12 +623,14 @@ DEPENDENCIES @@ -610,12 +623,14 @@ DEPENDENCIES
610 omniauth-twitter 623 omniauth-twitter
611 pg 624 pg
612 poltergeist (~> 1.4.1) 625 poltergeist (~> 1.4.1)
  626 + protected_attributes
613 pry 627 pry
614 quiet_assets (~> 1.0.1) 628 quiet_assets (~> 1.0.1)
615 rack-attack 629 rack-attack
  630 + rack-cors
616 rack-mini-profiler 631 rack-mini-profiler
617 - rails (= 3.2.15)  
618 - rails-dev-tweaks 632 + rails (~> 4.0.0)
  633 + rails-observers
619 rails_best_practices 634 rails_best_practices
620 raphael-rails (~> 2.1.2) 635 raphael-rails (~> 2.1.2)
621 rb-fsevent 636 rb-fsevent
@@ -647,4 +662,5 @@ DEPENDENCIES @@ -647,4 +662,5 @@ DEPENDENCIES
647 uglifier 662 uglifier
648 underscore-rails (~> 1.4.4) 663 underscore-rails (~> 1.4.4)
649 unicorn (~> 4.6.3) 664 unicorn (~> 4.6.3)
  665 + unicorn-worker-killer
650 webmock 666 webmock
@@ -8,25 +8,25 @@ Below we describe the contributing process to GitLab for two reasons. So that co @@ -8,25 +8,25 @@ Below we describe the contributing process to GitLab for two reasons. So that co
8 8
9 ### Issue team 9 ### Issue team
10 - Looks for issues without workflow labels and triages issue 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 - Assigns appropriate [labels](#how-we-handle-issues) 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 - Asks for feedback from the relevant developer(s) based on the [list of members and their specialities](http://gitlab.org/team/) 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 - Closes issues with no feedback from the reporter for two weeks 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 ### Development team 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 - Monitors for new issues in _Awaiting developer action/feedback_ with no developer activity (once a week) 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 - Close fixed issues (via commit messages or manually) 26 - Close fixed issues (via commit messages or manually)
27 - Codes [new features](http://feedback.gitlab.com/forums/176466-general/filters/top)! 27 - Codes [new features](http://feedback.gitlab.com/forums/176466-general/filters/top)!
28 - Response guidelines 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 ## Priorities of the issue team 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,8 +45,8 @@ Workflow labels are purposely not very detailed since that would be hard to keep
45 45
46 - _Awaiting feedback_: Feedback pending from the reporter 46 - _Awaiting feedback_: Feedback pending from the reporter
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) 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 - _Awaiting developer action/feedback_: Issue needs to be fixed or clarified by a developer 50 - _Awaiting developer action/feedback_: Issue needs to be fixed or clarified by a developer
51 51
52 ## Functional labels 52 ## Functional labels
@@ -59,7 +59,7 @@ If an issue is complex and needs the attention of a specific person, assignment @@ -59,7 +59,7 @@ If an issue is complex and needs the attention of a specific person, assignment
59 59
60 ## Label colors 60 ## Label colors
61 - Light orange `#fef2c0`: workflow labels for issue team members (awaiting feedback, awaiting confirmation of fix) 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 - Light blue `#82C5FF`: functional labels 63 - Light blue `#82C5FF`: functional labels
64 - Green labels `#009800`: issues that can generally be ignored. For example, issues given the following labels normally can be closed immediately: 64 - Green labels `#009800`: issues that can generally be ignored. For example, issues given the following labels normally can be closed immediately:
65 - Feature request (see copy & paste response: [Feature requests](#feature-requests)) 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,19 +69,19 @@ If an issue is complex and needs the attention of a specific person, assignment
69 69
70 ### Improperly formatted issue 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 ### Feature requests 74 ### Feature requests
75 75
76 -Thanks for your interest in GitLab. We don't use the GitHub issue tracker for feature requests. Please use http://feedback.gitlab.com/ for this purpose or create a 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 ### Issue report for old version 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 ### Support requests and configuration questions 82 ### Support requests and configuration questions
83 83
84 -Thanks for your interest in GitLab. We don't use the GitHub issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the unofficial #gitlab IRC channel on Freenode or the http://www.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://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 ### Code format 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,17 +89,17 @@ Please use ``` to format console output, logs, and code as it&#39;s very hard to rea
89 89
90 ### Issue fixed in newer version 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 ### Inactivity close of an issue 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
1 ## GitLab: self hosted Git management software 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 ![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif) 5 ![animated-screenshots](https://gist.github.com/fnkr/2f9badd56bfe0ed04ee7/raw/4f48806fbae97f556c2f78d8c2d299c04500cb0d/compiled.gif)
6 6
@@ -32,7 +32,9 @@ @@ -32,7 +32,9 @@
32 32
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/) 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 ### Requirements 39 ### Requirements
38 40
@@ -46,29 +48,24 @@ @@ -46,29 +48,24 @@
46 48
47 ### Installation 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 * [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. 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 ### New versions and upgrading 69 ### New versions and upgrading
73 70
74 Since 2011 GitLab is released on the 22nd of every month. Every new release includes an upgrade guide. 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,7 +76,6 @@ Since 2011 GitLab is released on the 22nd of every month. Every new release incl
79 76
80 * 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). 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 ### Run in production mode 79 ### Run in production mode
84 80
85 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: 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,7 +95,7 @@ Start it with [Foreman](https://github.com/ddollar/foreman)
99 or start each component separately 95 or start each component separately
100 96
101 bundle exec rails s 97 bundle exec rails s
102 - bundle exec rake sidekiq:start 98 + script/background_jobs start
103 99
104 ### Run the tests 100 ### Run the tests
105 101
@@ -110,7 +106,7 @@ or start each component separately @@ -110,7 +106,7 @@ or start each component separately
110 106
111 * Run all tests 107 * Run all tests
112 108
113 - bundle exec rake gitlab:test 109 + bundle exec rake gitlab:test RAILS_ENV=test
114 110
115 * [RSpec](http://rspec.info/) unit and functional tests 111 * [RSpec](http://rspec.info/) unit and functional tests
116 112
@@ -147,15 +143,17 @@ or start each component separately @@ -147,15 +143,17 @@ or start each component separately
147 143
148 * [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. 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 * [Feedback and suggestions forum](http://feedback.gitlab.com) is the place to propose and discuss new features for GitLab. 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 * [Support subscription](http://www.gitlab.com/subscription/) connects you to the knowledge of GitLab experts that will resolve your issues and answer your questions. 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 ### Getting in touch 159 ### Getting in touch
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,6 +8,23 @@ class Admin
8 else 8 else
9 elems.removeAttr 'disabled' 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 $('.log-tabs a').click (e) -> 28 $('.log-tabs a').click (e) ->
12 e.preventDefault() 29 e.preventDefault()
13 $(this).tab('show') 30 $(this).tab('show')
app/assets/javascripts/api.js.coffee
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 users_path: "/api/:version/users.json" 2 users_path: "/api/:version/users.json"
3 user_path: "/api/:version/users/:id.json" 3 user_path: "/api/:version/users/:id.json"
4 notes_path: "/api/:version/projects/:id/notes.json" 4 notes_path: "/api/:version/projects/:id/notes.json"
  5 + namespaces_path: "/api/:version/namespaces.json"
5 6
6 # Get 20 (depends on api) recent notes 7 # Get 20 (depends on api) recent notes
7 # and sort the ascending from oldest to newest 8 # and sort the ascending from oldest to newest
@@ -49,6 +50,20 @@ @@ -49,6 +50,20 @@
49 ).done (users) -> 50 ).done (users) ->
50 callback(users) 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 buildUrl: (url) -> 67 buildUrl: (url) ->
53 url = gon.relative_url_root + url if gon.relative_url_root? 68 url = gon.relative_url_root + url if gon.relative_url_root?
54 return url.replace(':version', gon.api_version) 69 return url.replace(':version', gon.api_version)
app/assets/javascripts/behaviors/toggler_behavior.coffee
@@ -3,7 +3,7 @@ $ -&gt; @@ -3,7 +3,7 @@ $ -&gt;
3 container = $(@).closest(".js-toggler-container") 3 container = $(@).closest(".js-toggler-container")
4 4
5 container.toggleClass("on") 5 container.toggleClass("on")
6 - 6 +
7 $("body").on "click", ".js-toggle-visibility-link", (e) -> 7 $("body").on "click", ".js-toggle-visibility-link", (e) ->
8 $(@).find('i'). 8 $(@).find('i').
9 toggleClass('icon-chevron-down'). 9 toggleClass('icon-chevron-down').
@@ -11,7 +11,7 @@ $ -&gt; @@ -11,7 +11,7 @@ $ -&gt;
11 container = $(".js-toggle-visibility-container") 11 container = $(".js-toggle-visibility-container")
12 container.toggleClass("hide") 12 container.toggleClass("hide")
13 e.preventDefault() 13 e.preventDefault()
14 - 14 +
15 $("body").on "click", ".js-toggle-button", (e) -> 15 $("body").on "click", ".js-toggle-button", (e) ->
16 $(@).closest(".js-toggle-container").find(".js-toggle-content").toggle() 16 $(@).closest(".js-toggle-container").find(".js-toggle-content").toggle()
17 e.preventDefault() 17 e.preventDefault()
app/assets/javascripts/blob.js.coffee
1 class BlobView 1 class BlobView
2 constructor: -> 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 # See if there are lines selected 21 # See if there are lines selected
4 # "#L12" and "#L34-56" supported 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 first_line = parseInt(matches?[1]) 40 first_line = parseInt(matches?[1])
9 last_line = parseInt(matches?[3]) 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 # Highlight the correct lines on load 69 # Highlight the correct lines on load
18 highlightBlobLines() 70 highlightBlobLines()
19 71
20 # Highlight the correct lines when the hash part of the URL changes 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 @BlobView = BlobView 76 @BlobView = BlobView
app/assets/javascripts/commits.js.coffee
@@ -4,13 +4,13 @@ class CommitsList @@ -4,13 +4,13 @@ class CommitsList
4 limit: 0 4 limit: 0
5 offset: 0 5 offset: 0
6 @disable = false 6 @disable = false
7 - 7 +
8 @showProgress: -> 8 @showProgress: ->
9 $('.loading').show() 9 $('.loading').show()
10 - 10 +
11 @hideProgress: -> 11 @hideProgress: ->
12 $('.loading').hide() 12 $('.loading').hide()
13 - 13 +
14 @init: (ref, limit) -> 14 @init: (ref, limit) ->
15 $(".day-commits-table li.commit").live 'click', (event) -> 15 $(".day-commits-table li.commit").live 'click', (event) ->
16 if event.target.nodeName != "A" 16 if event.target.nodeName != "A"
@@ -21,7 +21,7 @@ class CommitsList @@ -21,7 +21,7 @@ class CommitsList
21 @data.ref = ref 21 @data.ref = ref
22 @data.limit = limit 22 @data.limit = limit
23 @data.offset = limit 23 @data.offset = limit
24 - 24 +
25 this.initLoadMore() 25 this.initLoadMore()
26 this.showProgress() 26 this.showProgress()
27 27
@@ -32,7 +32,9 @@ class CommitsList @@ -32,7 +32,9 @@ class CommitsList
32 url: location.href 32 url: location.href
33 data: @data 33 data: @data
34 complete: this.hideProgress 34 complete: this.hideProgress
35 - dataType: "script" 35 + success: (data) ->
  36 + CommitsList.append(data.count, data.html)
  37 + dataType: "json"
36 38
37 @append: (count, html) -> 39 @append: (count, html) ->
38 $("#commits-list").append(html) 40 $("#commits-list").append(html)
@@ -40,7 +42,7 @@ class CommitsList @@ -40,7 +42,7 @@ class CommitsList
40 @data.offset += count 42 @data.offset += count
41 else 43 else
42 @disable = true 44 @disable = true
43 - 45 +
44 @initLoadMore: -> 46 @initLoadMore: ->
45 $(document).unbind('scroll') 47 $(document).unbind('scroll')
46 $(document).endlessScroll 48 $(document).endlessScroll
app/assets/javascripts/issues.js.coffee
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 backgroundColor: '#DDD' 22 backgroundColor: '#DDD'
23 opacity: .4 23 opacity: .4
24 ) 24 )
25 - 25 +
26 reload: -> 26 reload: ->
27 Issues.initSelects() 27 Issues.initSelects()
28 Issues.initChecks() 28 Issues.initChecks()
@@ -54,7 +54,16 @@ @@ -54,7 +54,16 @@
54 unless terms is last_terms 54 unless terms is last_terms
55 last_terms = terms 55 last_terms = terms
56 if terms.length >= 2 or terms.length is 0 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 checkChanged: -> 68 checkChanged: ->
60 checked_issues = $(".selected_issue:checked") 69 checked_issues = $(".selected_issue:checked")
@@ -70,3 +79,9 @@ @@ -70,3 +79,9 @@
70 $("#update_issues_ids").val [] 79 $("#update_issues_ids").val []
71 $(".issues_bulk_update").hide() 80 $(".issues_bulk_update").hide()
72 $(".issues-filters").show() 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 window.slugify = (text) -> 1 window.slugify = (text) ->
5 text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() 2 text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase()
6 3
@@ -56,7 +53,7 @@ window.unbindEvents = -&gt; @@ -56,7 +53,7 @@ window.unbindEvents = -&gt;
56 53
57 document.addEventListener("page:fetch", startSpinner) 54 document.addEventListener("page:fetch", startSpinner)
58 document.addEventListener("page:fetch", unbindEvents) 55 document.addEventListener("page:fetch", unbindEvents)
59 -document.addEventListener("page:receive", stopSpinner) 56 +document.addEventListener("page:change", stopSpinner)
60 57
61 $ -> 58 $ ->
62 # Click a .one_click_select field, select the contents 59 # Click a .one_click_select field, select the contents
@@ -84,6 +81,7 @@ $ -&gt; @@ -84,6 +81,7 @@ $ -&gt;
84 $(@).parents('form').submit() 81 $(@).parents('form').submit()
85 82
86 $("abbr.timeago").timeago() 83 $("abbr.timeago").timeago()
  84 + $('.js-timeago').timeago()
87 85
88 # Flash 86 # Flash
89 if (flash = $(".flash-container")).length > 0 87 if (flash = $(".flash-container")).length > 0
app/assets/javascripts/merge_requests.js.coffee
@@ -21,7 +21,7 @@ class MergeRequest @@ -21,7 +21,7 @@ class MergeRequest
21 this.initMergeWidget() 21 this.initMergeWidget()
22 this.$('.show-all-commits').on 'click', => 22 this.$('.show-all-commits').on 'click', =>
23 this.showAllCommits() 23 this.showAllCommits()
24 - 24 +
25 modal = $('#modal_merge_info').modal(show: false) 25 modal = $('#modal_merge_info').modal(show: false)
26 26
27 # Local jQuery finder 27 # Local jQuery finder
@@ -83,12 +83,12 @@ class MergeRequest @@ -83,12 +83,12 @@ class MergeRequest
83 url: this.$('.nav-tabs .diffs-tab a').attr('href') 83 url: this.$('.nav-tabs .diffs-tab a').attr('href')
84 beforeSend: => 84 beforeSend: =>
85 this.$('.status').addClass 'loading' 85 this.$('.status').addClass 'loading'
86 -  
87 complete: => 86 complete: =>
88 @diffs_loaded = true 87 @diffs_loaded = true
89 this.$('.status').removeClass 'loading' 88 this.$('.status').removeClass 'loading'
90 -  
91 - dataType: 'script' 89 + success: (data) =>
  90 + this.$(".diffs").html(data.html)
  91 + dataType: 'json'
92 92
93 showAllCommits: -> 93 showAllCommits: ->
94 this.$('.first-commits').remove() 94 this.$('.first-commits').remove()
app/assets/javascripts/namespace_select.js.coffee 0 → 100644
@@ -0,0 +1,24 @@ @@ -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,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 @@ @@ -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 @@ @@ -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,8 +19,9 @@
19 data: "limit=" + @limit + "&offset=" + @offset 19 data: "limit=" + @limit + "&offset=" + @offset
20 complete: -> 20 complete: ->
21 $(".loading").hide() 21 $(".loading").hide()
22 -  
23 - dataType: "script" 22 + success: (data) ->
  23 + Pager.append(data.count, data.html)
  24 + dataType: "json"
24 25
25 append: (count, html) -> 26 append: (count, html) ->
26 $(".content_list").append html 27 $(".content_list").append html
app/assets/javascripts/project.js.coffee
@@ -40,3 +40,9 @@ $ -&gt; @@ -40,3 +40,9 @@ $ -&gt;
40 # Ref switcher 40 # Ref switcher
41 $('.project-refs-select').on 'change', -> 41 $('.project-refs-select').on 'change', ->
42 $(@).parents('form').submit() 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,11 +46,7 @@ class window.ContributorsGraph
46 46
47 class window.ContributorsMasterGraph extends ContributorsGraph 47 class window.ContributorsMasterGraph extends ContributorsGraph
48 constructor: (@data) -> 48 constructor: (@data) ->
49 - if $(window).width() > 1214  
50 - @width = 1100  
51 - else  
52 - @width = 870  
53 - 49 + @width = $('.container').width() - 70
54 @height = 200 50 @height = 200
55 @x = null 51 @x = null
56 @y = null 52 @y = null
@@ -88,7 +84,6 @@ class window.ContributorsMasterGraph extends ContributorsGraph @@ -88,7 +84,6 @@ class window.ContributorsMasterGraph extends ContributorsGraph
88 x(d.date) 84 x(d.date)
89 ).y0(@height).y1((d) -> 85 ).y0(@height).y1((d) ->
90 xa = d.commits = d.commits ? d.additions ? d.deletions 86 xa = d.commits = d.commits ? d.additions ? d.deletions
91 - console.log(xa)  
92 y(xa) 87 y(xa)
93 ).interpolate("basis") 88 ).interpolate("basis")
94 create_brush: -> 89 create_brush: ->
@@ -124,11 +119,7 @@ class window.ContributorsMasterGraph extends ContributorsGraph @@ -124,11 +119,7 @@ class window.ContributorsMasterGraph extends ContributorsGraph
124 119
125 class window.ContributorsAuthorGraph extends ContributorsGraph 120 class window.ContributorsAuthorGraph extends ContributorsGraph
126 constructor: (@data) -> 121 constructor: (@data) ->
127 - if $(window).width() > 1214  
128 - @width = 490  
129 - else  
130 - @width = 380  
131 - 122 + @width = $('.container').width()/2 - 100
132 @height = 200 123 @height = 200
133 @x = null 124 @x = null
134 @y = null 125 @y = null
app/assets/javascripts/users_select.js.coffee
@@ -6,12 +6,12 @@ $ -&gt; @@ -6,12 +6,12 @@ $ -&gt;
6 avatar = gon.gravatar_url 6 avatar = gon.gravatar_url
7 avatar = avatar.replace('%{hash}', md5(user.email)) 7 avatar = avatar.replace('%{hash}', md5(user.email))
8 avatar = avatar.replace('%{size}', '24') 8 avatar = avatar.replace('%{size}', '24')
9 - 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 userFormatSelection = (user) -> 16 userFormatSelection = (user) ->
17 user.name 17 user.name
app/assets/stylesheets/application.scss
@@ -9,36 +9,41 @@ @@ -9,36 +9,41 @@
9 *= require_self 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 @import "common.scss"; 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 @import "highlight/white.scss"; 47 @import "highlight/white.scss";
43 @import "highlight/dark.scss"; 48 @import "highlight/dark.scss";
44 @import "highlight/solarized_dark.scss"; 49 @import "highlight/solarized_dark.scss";
@@ -57,4 +62,3 @@ @@ -57,4 +62,3 @@
57 * Styles for JS behaviors. 62 * Styles for JS behaviors.
58 */ 63 */
59 @import "behaviors.scss"; 64 @import "behaviors.scss";
60 -  
app/assets/stylesheets/common.scss
@@ -5,6 +5,8 @@ html { @@ -5,6 +5,8 @@ html {
5 /** LAYOUT **/ 5 /** LAYOUT **/
6 6
7 body { 7 body {
  8 + -webkit-font-smoothing: antialiased;
  9 + -moz-osx-font-smoothing: grayscale;
8 margin-bottom: 20px; 10 margin-bottom: 20px;
9 } 11 }
10 12
@@ -117,18 +119,6 @@ p.time { @@ -117,18 +119,6 @@ p.time {
117 margin: 30px 3px 3px 2px; 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 .highlight { 122 .highlight {
133 text-shadow: none; 123 text-shadow: none;
134 } 124 }
@@ -207,7 +197,7 @@ li.note { @@ -207,7 +197,7 @@ li.note {
207 } 197 }
208 198
209 .git_error_tips { 199 .git_error_tips {
210 - @extend .span6; 200 + @extend .col-md-6;
211 text-align: left; 201 text-align: left;
212 margin-top: 40px; 202 margin-top: 40px;
213 pre { 203 pre {
@@ -220,7 +210,6 @@ li.note { @@ -220,7 +210,6 @@ li.note {
220 .error-message { 210 .error-message {
221 padding: 10px; 211 padding: 10px;
222 background: #C67; 212 background: #C67;
223 - padding-left: 20px;  
224 margin: 0; 213 margin: 0;
225 color: #FFF; 214 color: #FFF;
226 215
@@ -228,8 +217,18 @@ li.note { @@ -228,8 +217,18 @@ li.note {
228 color: #fff; 217 color: #fff;
229 text-decoration: underline; 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,11 +316,6 @@ img.emoji {
317 margin-bottom: 10px; 316 margin-bottom: 10px;
318 } 317 }
319 318
320 -.group-name {  
321 - font-size: 14px;  
322 - line-height: 24px;  
323 -}  
324 -  
325 table { 319 table {
326 td.permission-x { 320 td.permission-x {
327 background: #D9EDF7 !important; 321 background: #D9EDF7 !important;
@@ -341,4 +335,57 @@ table { @@ -341,4 +335,57 @@ table {
341 .navbar-gitlab .navbar-inner .nav > li .btn-sign-in { 335 .navbar-gitlab .navbar-inner .nav > li .btn-sign-in {
342 @extend .btn-new; 336 @extend .btn-new;
343 padding: 5px 15px; 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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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,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,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,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,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,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,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,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,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,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,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,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,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,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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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,4 +20,19 @@
20 label { width: 110px; } 20 label { width: 110px; }
21 .controls { margin-left: 130px; } 21 .controls { margin-left: 130px; }
22 .form-actions { padding-left: 130px; background: #fff } 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,36 +16,29 @@
16 16
17 .header { 17 .header {
18 @extend .clearfix; 18 @extend .clearfix;
  19 + background: #DDD;
  20 + border-bottom: 1px solid #CCC;
19 padding: 5px 5px 5px 10px; 21 padding: 5px 5px 5px 10px;
20 color: #555; 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 > span { 24 > span {
34 font-family: $monospace_font; 25 font-family: $monospace_font;
35 font-size: 14px; 26 font-size: 14px;
36 - line-height: 30px; 27 + line-height: 2;
37 } 28 }
38 29
39 - a.view-file{ 30 + .view-file {
40 font-weight: bold; 31 font-weight: bold;
  32 + float: right;
  33 + background-color: #EEE;
41 } 34 }
42 35
43 - .commit-short-id{ 36 + .commit-short-id {
44 font-family: $monospace_font; 37 font-family: $monospace_font;
45 font-size: smaller; 38 font-size: smaller;
46 } 39 }
47 40
48 - .file-mode{ 41 + .file-mode {
49 font-family: $monospace_font; 42 font-family: $monospace_font;
50 } 43 }
51 } 44 }
@@ -55,13 +48,13 @@ @@ -55,13 +48,13 @@
55 background: #FFF; 48 background: #FFF;
56 color: #333; 49 color: #333;
57 font-size: 12px; 50 font-size: 12px;
58 - .old{  
59 - span.idiff{ 51 + .old {
  52 + span.idiff {
60 background-color: #FAA; 53 background-color: #FAA;
61 } 54 }
62 } 55 }
63 - .new{  
64 - span.idiff{ 56 + .new {
  57 + span.idiff {
65 background-color: #AFA; 58 background-color: #AFA;
66 } 59 }
67 } 60 }
@@ -77,7 +70,7 @@ @@ -77,7 +70,7 @@
77 font-size: 12px; 70 font-size: 12px;
78 } 71 }
79 } 72 }
80 - .old_line, .new_line { 73 + .old_line, .new_line, .diff_line {
81 margin: 0px; 74 margin: 0px;
82 padding: 0px; 75 padding: 0px;
83 border: none; 76 border: none;
@@ -87,7 +80,7 @@ @@ -87,7 +80,7 @@
87 border-right: 1px solid #ccc; 80 border-right: 1px solid #ccc;
88 text-align: right; 81 text-align: right;
89 min-width: 35px; 82 min-width: 35px;
90 - max-width: 35px; 83 + max-width: 50px;
91 width: 35px; 84 width: 35px;
92 @include user-select(none); 85 @include user-select(none);
93 a { 86 a {
@@ -99,6 +92,15 @@ @@ -99,6 +92,15 @@
99 text-decoration: underline; 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 .line_holder { 105 .line_holder {
104 &.old .old_line, 106 &.old .old_line,
@@ -129,6 +131,11 @@ @@ -129,6 +131,11 @@
129 color: #ccc; 131 color: #ccc;
130 background: #fafafa; 132 background: #fafafa;
131 } 133 }
  134 + &.parallel {
  135 + display: table-cell;
  136 + overflow: hidden;
  137 + width: 50%;
  138 + }
132 } 139 }
133 } 140 }
134 .image { 141 .image {
@@ -293,6 +300,7 @@ @@ -293,6 +300,7 @@
293 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); 300 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
294 background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); 301 background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
295 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); 302 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  303 + background-image: -ms-linear-gradient(#eee 6.6%, #dfdfdf);
296 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); 304 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
297 305
298 ul, li{ 306 ul, li{
@@ -391,8 +399,8 @@ @@ -391,8 +399,8 @@
391 399
392 .commits-compare-switch{ 400 .commits-compare-switch{
393 background: url("switch_icon.png") no-repeat center center; 401 background: url("switch_icon.png") no-repeat center center;
394 - width: 22px;  
395 - height: 22px; 402 + width: 32px;
  403 + height: 32px;
396 text-indent: -9999px; 404 text-indent: -9999px;
397 float: left; 405 float: left;
398 margin-right: 9px; 406 margin-right: 9px;
@@ -474,8 +482,8 @@ li.commit { @@ -474,8 +482,8 @@ li.commit {
474 } 482 }
475 483
476 .commit-row-message { 484 .commit-row-message {
477 - color: #555;  
478 - font-weight: bolder; 485 + color: #333;
  486 + font-weight: 500;
479 &:hover { 487 &:hover {
480 color: #444; 488 color: #444;
481 text-decoration: underline; 489 text-decoration: underline;
@@ -484,13 +492,14 @@ li.commit { @@ -484,13 +492,14 @@ li.commit {
484 } 492 }
485 493
486 .commit-row-info { 494 .commit-row-info {
  495 + color: #777;
  496 +
487 a { 497 a {
488 color: #777; 498 color: #777;
489 } 499 }
490 500
491 .committed_ago { 501 .committed_ago {
492 float: right; 502 float: right;
493 - @extend .cgray;  
494 } 503 }
495 } 504 }
496 505
app/assets/stylesheets/sections/dashboard.scss
1 .dashboard { 1 .dashboard {
2 - @extend .row;  
3 - .activities {  
4 - }  
5 -  
6 .side { 2 .side {
7 - @extend .pull-right;  
8 -  
9 .ui-box { 3 .ui-box {
10 margin: 0px; 4 margin: 0px;
11 box-shadow: none; 5 box-shadow: none;
@@ -20,7 +14,7 @@ @@ -20,7 +14,7 @@
20 14
21 .search-text-input { 15 .search-text-input {
22 float:left; 16 float:left;
23 - @extend .span2; 17 + @extend .col-md-2;
24 } 18 }
25 .btn { 19 .btn {
26 margin-left: 5px; 20 margin-left: 5px;
@@ -32,14 +26,15 @@ @@ -32,14 +26,15 @@
32 .dash-filter { 26 .dash-filter {
33 margin: 7px 0; 27 margin: 7px 0;
34 padding: 4px 6px; 28 padding: 4px 6px;
35 - width: 202px; 29 + width: 220px;
36 float: left; 30 float: left;
  31 + height: inherit;
37 } 32 }
38 } 33 }
39 34
40 @media (max-width: 1200px) { 35 @media (max-width: 1200px) {
41 .dashboard .dash-filter { 36 .dashboard .dash-filter {
42 - width: 132px; 37 + width: 150px;
43 } 38 }
44 } 39 }
45 40
@@ -51,7 +46,7 @@ @@ -51,7 +46,7 @@
51 li { 46 li {
52 &.active { 47 &.active {
53 a { 48 a {
54 - @include linear-gradient(#f5f5f5, #eee); 49 + background-color: #EEE;
55 border-bottom: 1px solid #EEE !important; 50 border-bottom: 1px solid #EEE !important;
56 &:hover { 51 &:hover {
57 background: #eee; 52 background: #eee;
@@ -66,37 +61,58 @@ @@ -66,37 +61,58 @@
66 } 61 }
67 62
68 .project-row, .group-row { 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 .project-name, .group-name { 72 .project-name, .group-name {
77 - font-size: 15px; 73 + font-weight: 500;
78 } 74 }
79 75
80 .arrow { 76 .arrow {
81 float: right; 77 float: right;
82 - padding: 10px 5px; 78 + padding: 0px 5px;
83 margin: 0; 79 margin: 0;
84 font-size: 20px; 80 font-size: 20px;
85 color: #666; 81 color: #666;
86 } 82 }
87 83
88 .last-activity { 84 .last-activity {
  85 + float: right;
  86 + font-size: 12px;
89 color: #AAA; 87 color: #AAA;
90 display: block; 88 display: block;
91 - margin-top: 5px;  
92 .date { 89 .date {
93 color: #777; 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,7 +42,7 @@
42 line-height: 20px; 42 line-height: 20px;
43 } 43 }
44 textarea { 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,6 +75,7 @@
75 margin-top: 4px; 75 margin-top: 4px;
76 margin-left: 0px; 76 margin-left: 0px;
77 max-width: 200px; 77 max-width: 200px;
  78 + float: none;
78 } 79 }
79 80
80 p:last-child { 81 p:last-child {
@@ -147,7 +148,7 @@ @@ -147,7 +148,7 @@
147 float: left; 148 float: left;
148 padding: 9px 6px; 149 padding: 9px 6px;
149 font-size: 18px; 150 font-size: 18px;
150 - width: 26px; 151 + width: 40px;
151 @include border-radius(3px); 152 @include border-radius(3px);
152 } 153 }
153 154
app/assets/stylesheets/sections/header.scss
@@ -4,17 +4,24 @@ @@ -4,17 +4,24 @@
4 */ 4 */
5 header { 5 header {
6 &.navbar-gitlab { 6 &.navbar-gitlab {
  7 + margin-bottom: 0;
  8 + min-height: 40px;
  9 +
7 .navbar-inner { 10 .navbar-inner {
8 - height: 40px;  
9 - padding: 3px;  
10 background: #F1F1F1; 11 background: #F1F1F1;
  12 + border-bottom: 1px solid #DDD;
11 filter: none; 13 filter: none;
12 14
13 .nav > li > a { 15 .nav > li > a {
14 color: $style_color; 16 color: $style_color;
15 text-shadow: 0 1px 0 #fff; 17 text-shadow: 0 1px 0 #fff;
16 font-size: 14px; 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 /** NAV block with links and profile **/ 27 /** NAV block with links and profile **/
@@ -35,9 +42,6 @@ header { @@ -35,9 +42,6 @@ header {
35 .app_logo { 42 .app_logo {
36 float: left; 43 float: left;
37 margin-right: 9px; 44 margin-right: 9px;
38 - position: relative;  
39 - top: -5px;  
40 - padding-top: 5px;  
41 45
42 a { 46 a {
43 float: left; 47 float: left;
@@ -46,10 +50,10 @@ header { @@ -46,10 +50,10 @@ header {
46 50
47 h1 { 51 h1 {
48 margin: 0; 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 float: left; 55 float: left;
52 - height: 40px; 56 + height: 46px;
53 width: 40px; 57 width: 40px;
54 @include header-font; 58 @include header-font;
55 text-indent: -9999px; 59 text-indent: -9999px;
@@ -75,7 +79,7 @@ header { @@ -75,7 +79,7 @@ header {
75 79
76 .profile-pic { 80 .profile-pic {
77 position: relative; 81 position: relative;
78 - top: -4px; 82 + top: -1px;
79 img { 83 img {
80 width: 26px; 84 width: 26px;
81 height: 26px; 85 height: 26px;
@@ -91,21 +95,25 @@ header { @@ -91,21 +95,25 @@ header {
91 .search { 95 .search {
92 margin-right: 10px; 96 margin-right: 10px;
93 margin-left: 10px; 97 margin-left: 10px;
  98 + margin-top: 8px;
  99 +
  100 + form {
  101 + margin: 0;
  102 + padding: 0;
  103 + }
94 104
95 .search-input { 105 .search-input {
96 - @extend .span3;  
97 background-image: url("icon-search.png"); 106 background-image: url("icon-search.png");
98 background-repeat: no-repeat; 107 background-repeat: no-repeat;
99 background-position: 10px; 108 background-position: 10px;
  109 + height: inherit;
  110 + padding: 4px 6px;
100 padding-left: 25px; 111 padding-left: 25px;
101 font-size: 13px; 112 font-size: 13px;
102 @include border-radius(3px); 113 @include border-radius(3px);
103 border: 1px solid #c6c6c6; 114 border: 1px solid #c6c6c6;
104 box-shadow: none; 115 box-shadow: none;
105 @include transition(all 0.15s ease-in 0s); 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,8 +160,8 @@ header {
152 .app_logo { 160 .app_logo {
153 a { 161 a {
154 h1 { 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 color: #fff; 165 color: #fff;
158 text-shadow: 0 1px 1px #444; 166 text-shadow: 0 1px 1px #444;
159 } 167 }
@@ -181,12 +189,26 @@ header { @@ -181,12 +189,26 @@ header {
181 .separator { 189 .separator {
182 float: left; 190 float: left;
183 height: 46px; 191 height: 46px;
184 - width: 1px; 192 + width: 2px;
185 background: white; 193 background: white;
186 border-left: 1px solid #DDD; 194 border-left: 1px solid #DDD;
187 - margin-top: -3px;  
188 margin-left: 10px; 195 margin-left: 10px;
189 margin-right: 10px; 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,8 +77,8 @@ input.check_all_issues {
77 @media (min-width: 800px) { .issues_filters select { width: 160px; } } 77 @media (min-width: 800px) { .issues_filters select { width: 160px; } }
78 @media (min-width: 1200px) { .issues_filters select { width: 220px; } } 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 .issues-holder { 83 .issues-holder {
84 .issues_filters { 84 .issues_filters {
@@ -103,3 +103,27 @@ input.check_all_issues { @@ -103,3 +103,27 @@ input.check_all_issues {
103 .participants { 103 .participants {
104 margin-bottom: 10px; 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 /* Login Page */ 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,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 .how_to_merge_link { 21 .how_to_merge_link {
42 @extend .primary; 22 @extend .primary;
43 } 23 }
@@ -110,9 +90,24 @@ @@ -110,9 +90,24 @@
110 90
111 .merge-request-angle { 91 .merge-request-angle {
112 text-align: center; 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 .merge-request-form-info { 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 +6,7 @@
6 border-bottom: 1px solid #E1E1E1; 6 border-bottom: 1px solid #E1E1E1;
7 7
8 ul { 8 ul {
  9 + padding: 0;
9 margin: auto; 10 margin: auto;
10 height: 40px; 11 height: 40px;
11 overflow: hidden; 12 overflow: hidden;
app/assets/stylesheets/sections/notes.scss
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 * Notes 2 * Notes
3 */ 3 */
4 4
5 -@-webkit-keyframes target-note { 5 +@-webkit-keyframes targe3-note {
6 from { background:#fffff0; } 6 from { background:#fffff0; }
7 50% { background:#ffffd3; } 7 50% { background:#ffffd3; }
8 to { background:#fffff0; } 8 to { background:#fffff0; }
@@ -119,9 +119,9 @@ ul.notes { @@ -119,9 +119,9 @@ ul.notes {
119 } 119 }
120 120
121 .file .notes_holder { 121 .file .notes_holder {
122 - font-family: $sansFontFamily;  
123 font-size: 13px; 122 font-size: 13px;
124 line-height: 18px; 123 line-height: 18px;
  124 + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
125 125
126 td { 126 td {
127 border: 1px solid #ddd; 127 border: 1px solid #ddd;
@@ -130,9 +130,15 @@ ul.notes { @@ -130,9 +130,15 @@ ul.notes {
130 &.notes_line { 130 &.notes_line {
131 text-align: center; 131 text-align: center;
132 padding: 10px 0; 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 &.notes_content { 140 &.notes_content {
135 - background-color: $white; 141 + background-color: #fff;
136 border-width: 1px 0; 142 border-width: 1px 0;
137 padding-top: 0; 143 padding-top: 0;
138 144
@@ -251,12 +257,12 @@ ul.notes { @@ -251,12 +257,12 @@ ul.notes {
251 .file, 257 .file,
252 .discussion { 258 .discussion {
253 .new_note { 259 .new_note {
254 - margin: 8px 5px 8px 0; 260 + margin: 0;
  261 + border: none;
255 } 262 }
256 } 263 }
257 .new_note { 264 .new_note {
258 display: none; 265 display: none;
259 -  
260 .buttons { 266 .buttons {
261 float: left; 267 float: left;
262 margin-top: 8px; 268 margin-top: 8px;
@@ -270,10 +276,9 @@ ul.notes { @@ -270,10 +276,9 @@ ul.notes {
270 276
271 // preview/edit buttons 277 // preview/edit buttons
272 > a { 278 > a {
273 - font-size: 24px;  
274 - padding: 4px;  
275 position: absolute; 279 position: absolute;
276 - right: 10px; 280 + right: 5px;
  281 + bottom: -60px;
277 } 282 }
278 .note_preview { 283 .note_preview {
279 background: #f5f5f5; 284 background: #f5f5f5;
@@ -298,7 +303,7 @@ ul.notes { @@ -298,7 +303,7 @@ ul.notes {
298 } 303 }
299 304
300 .note-image-attach { 305 .note-image-attach {
301 - @extend .span4; 306 + @extend .col-md-4;
302 @extend .thumbnail; 307 @extend .thumbnail;
303 margin-left: 45px; 308 margin-left: 45px;
304 } 309 }
@@ -306,10 +311,8 @@ ul.notes { @@ -306,10 +311,8 @@ ul.notes {
306 311
307 .common-note-form { 312 .common-note-form {
308 margin: 0; 313 margin: 0;
309 - height: 140px;  
310 background: #F9F9F9; 314 background: #F9F9F9;
311 padding: 3px; 315 padding: 3px;
312 - padding-bottom: 25px;  
313 border: 1px solid #DDD; 316 border: 1px solid #DDD;
314 } 317 }
315 318
@@ -320,7 +323,7 @@ ul.notes { @@ -320,7 +323,7 @@ ul.notes {
320 padding: 0 5px; 323 padding: 0 5px;
321 324
322 .note-form-option { 325 .note-form-option {
323 - margin-top: 10px; 326 + margin-top: 8px;
324 margin-left: 30px; 327 margin-left: 30px;
325 @extend .pull-left; 328 @extend .pull-left;
326 } 329 }
@@ -358,3 +361,7 @@ ul.notes { @@ -358,3 +361,7 @@ ul.notes {
358 .js-note-attachment-delete { 361 .js-note-attachment-delete {
359 display: none; 362 display: none;
360 } 363 }
  364 +
  365 +.parallel-comment {
  366 + padding: 6px;
  367 +}
app/assets/stylesheets/sections/profile.scss
1 .update-notifications { 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,7 +16,7 @@
17 16
18 legend { 17 legend {
19 border: none; 18 border: none;
20 - margin: 0; 19 + margin-bottom: 10px;
21 } 20 }
22 } 21 }
23 } 22 }
@@ -42,3 +41,8 @@ @@ -42,3 +41,8 @@
42 margin-right: 12px; 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,12 +16,18 @@
16 16
17 .project-home-panel { 17 .project-home-panel {
18 border-bottom: 1px solid #DDD; 18 border-bottom: 1px solid #DDD;
19 - padding-bottom: 30px; 19 + padding-bottom: 25px;
20 margin-bottom: 30px; 20 margin-bottom: 30px;
21 21
  22 + &.empty-project {
  23 + border-bottom: 0px;
  24 + padding-bottom: 15px;
  25 + margin-bottom: 0px;
  26 + }
  27 +
22 .project-home-title { 28 .project-home-title {
23 font-size: 18px; 29 font-size: 18px;
24 - color: #777; 30 + color: #444;
25 margin: 0; 31 margin: 0;
26 line-height: 32px; 32 line-height: 32px;
27 } 33 }
@@ -34,7 +40,7 @@ @@ -34,7 +40,7 @@
34 40
35 .project-home-desc { 41 .project-home-desc {
36 float: left; 42 float: left;
37 - color: #999; 43 + color: #777;
38 } 44 }
39 45
40 .project-home-links { 46 .project-home-links {
@@ -45,29 +51,47 @@ @@ -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 background: #f1f1f1; 56 background: #f1f1f1;
51 - padding: 8px 10px;  
52 border-radius: 4px; 57 border-radius: 4px;
53 - margin-left: 10px;  
54 color: #888; 58 color: #888;
  59 + position: absolute;
  60 + margin-left: -55px;
55 text-shadow: 0 1px 1px #FFF; 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 .git-clone-holder { 72 .git-clone-holder {
60 - float: right; 73 + margin-right: 45px;
61 border: 1px solid #E1E1E1; 74 border: 1px solid #E1E1E1;
62 @include border-radius(4px); 75 @include border-radius(4px);
63 76
  77 + input[type="text"],
64 .btn { 78 .btn {
65 - margin-left: 3px;  
66 border: none; 79 border: none;
67 - background: none; 80 + @include border-radius(0px);
  81 + border-left: 1px solid #E1E1E1;
68 box-shadow: none; 82 box-shadow: none;
  83 + padding: 6px 9px;
  84 + }
  85 +
  86 + .btn {
  87 + float: left;
  88 + background: none;
69 color: #29b; 89 color: #29b;
70 - padding: 6px; 90 +
  91 + &:first-child {
  92 + @include border-radius-left(4px);
  93 + border-left: 0px;
  94 + }
71 95
72 &.active { 96 &.active {
73 color: #333; 97 color: #333;
@@ -76,20 +100,51 @@ @@ -76,20 +100,51 @@
76 } 100 }
77 101
78 input[type="text"] { 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 @extend .monospace; 104 @extend .monospace;
84 - box-shadow: none;  
85 background: #FAFAFA; 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,7 +185,8 @@ ul.nav.nav-projects-tabs {
130 margin: 0px; 185 margin: 0px;
131 } 186 }
132 187
133 -.my-projects { 188 +.my-projects,
  189 +.public-projects {
134 li { 190 li {
135 .project-info { 191 .project-info {
136 margin-bottom: 10px; 192 margin-bottom: 10px;
@@ -166,3 +222,62 @@ ul.nav.nav-projects-tabs { @@ -166,3 +222,62 @@ ul.nav.nav-projects-tabs {
166 color: #777; 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,10 +24,10 @@
24 th { 24 th {
25 font-weight: normal; 25 font-weight: normal;
26 font-size: 15px; 26 font-size: 15px;
27 - border-bottom: 1px solid #CCC; 27 + border-bottom: 1px solid #CCC !important;
28 } 28 }
29 td { 29 td {
30 - border-color: #F1F1F1; 30 + border-color: #F1F1F1 !important;
31 } 31 }
32 &:hover { 32 &:hover {
33 td { 33 td {
@@ -111,5 +111,16 @@ @@ -111,5 +111,16 @@
111 111
112 .tree-ref-holder { 112 .tree-ref-holder {
113 float: left; 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,3 +36,8 @@
36 display: inline-block; 36 display: inline-block;
37 margin: 0 8px; 37 margin: 0 8px;
38 } 38 }
  39 +
  40 +.votes-holder {
  41 + float: right;
  42 + width: 250px;
  43 +}
app/assets/stylesheets/sections/wall.scss
1 .wall-page { 1 .wall-page {
2 .wall-note-form { 2 .wall-note-form {
3 - @extend .span12; 3 + @extend .col-md-12;
4 4
5 margin: 0; 5 margin: 0;
6 height: 140px; 6 height: 140px;
app/assets/stylesheets/sections/wiki.scss
1 -h3.page-title .edit-wiki-header { 1 +.title .edit-wiki-header {
2 width: 780px; 2 width: 780px;
3 margin-left: auto; 3 margin-left: auto;
4 margin-right: auto; 4 margin-right: auto;
app/assets/stylesheets/selects.scss
@@ -1,153 +0,0 @@ @@ -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,6 +27,12 @@
27 background: #435; 27 background: #435;
28 border-left: 1px solid #658; 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,12 +23,17 @@
23 background-color: #373D47; 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,6 +27,12 @@
27 background: #234; 27 background: #234;
28 border-left: 1px solid #456; 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,4 +17,3 @@ class BaseContext
17 abilities.allowed?(object, action, subject) 17 abilities.allowed?(object, action, subject)
18 end 18 end
19 end 19 end
20 -  
app/contexts/files/base_context.rb 0 → 100644
@@ -0,0 +1,31 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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 class FilterContext 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 @params = params 7 @params = params
7 end 8 end
8 9
9 def execute 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 end 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 end 29 end
  30 + end
21 31
  32 + def by_state(items)
22 case params[:status] 33 case params[:status]
23 when 'closed' 34 when 'closed'
24 items.closed 35 items.closed
@@ -28,4 +39,20 @@ class FilterContext @@ -28,4 +39,20 @@ class FilterContext
28 items.opened 39 items.opened
29 end 40 end
30 end 41 end
  42 +
  43 + def by_project(items)
  44 + if params[:project_id].present?
  45 + items = items.of_projects(params[:project_id])
  46 + end
  47 +
  48 + items
  49 + end
  50 +
  51 + def by_search(items)
  52 + if params[:search].present?
  53 + items = items.search(params[:search])
  54 + end
  55 +
  56 + items
  57 + end
31 end 58 end
app/contexts/issues/bulk_update_context.rb
@@ -22,7 +22,7 @@ module Issues @@ -22,7 +22,7 @@ module Issues
22 opts[:milestone_id] = milestone_id if milestone_id.present? 22 opts[:milestone_id] = milestone_id if milestone_id.present?
23 opts[:assignee_id] = assignee_id if assignee_id.present? 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 issues = issues.select { |issue| can?(current_user, :modify_issue, issue) } 26 issues = issues.select { |issue| can?(current_user, :modify_issue, issue) }
27 27
28 issues.each do |issue| 28 issues.each do |issue|
app/contexts/issues/list_context.rb
@@ -30,7 +30,24 @@ module Issues @@ -30,7 +30,24 @@ module Issues
30 @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) 30 @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
31 end 31 end
32 32
  33 + # Sort by :sort param
  34 + @issues = sort(@issues, params[:sort])
  35 +
33 @issues 36 @issues
34 end 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 end 52 end
36 end 53 end
app/contexts/projects/create_context.rb
@@ -8,6 +8,11 @@ module Projects @@ -8,6 +8,11 @@ module Projects
8 # get namespace id 8 # get namespace id
9 namespace_id = params.delete(:namespace_id) 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 # Load default feature settings 16 # Load default feature settings
12 default_features = Gitlab.config.gitlab.default_projects_features 17 default_features = Gitlab.config.gitlab.default_projects_features
13 18
@@ -17,7 +22,7 @@ module Projects @@ -17,7 +22,7 @@ module Projects
17 wall_enabled: default_features.wall, 22 wall_enabled: default_features.wall,
18 snippets_enabled: default_features.snippets, 23 snippets_enabled: default_features.snippets,
19 merge_requests_enabled: default_features.merge_requests, 24 merge_requests_enabled: default_features.merge_requests,
20 - public: default_features.public 25 + visibility_level: default_features.visibility_level
21 }.stringify_keys 26 }.stringify_keys
22 27
23 @project = Project.new(default_opts.merge(params)) 28 @project = Project.new(default_opts.merge(params))
@@ -47,8 +52,6 @@ module Projects @@ -47,8 +52,6 @@ module Projects
47 @project.creator = current_user 52 @project.creator = current_user
48 53
49 if @project.save 54 if @project.save
50 - @project.discover_default_branch  
51 -  
52 unless @project.group 55 unless @project.group
53 @project.users_projects.create( 56 @project.users_projects.create(
54 project_access: UsersProject::MASTER, 57 project_access: UsersProject::MASTER,
app/contexts/projects/update_context.rb
@@ -2,7 +2,17 @@ module Projects @@ -2,7 +2,17 @@ module Projects
2 class UpdateContext < BaseContext 2 class UpdateContext < BaseContext
3 def execute(role = :default) 3 def execute(role = :default)
4 params[:project].delete(:namespace_id) 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 project.update_attributes(params[:project], as: role) 16 project.update_attributes(params[:project], as: role)
7 end 17 end
8 end 18 end
app/contexts/search_context.rb
1 class SearchContext 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 end 6 end
7 7
8 def execute 8 def execute
9 query = params[:search] 9 query = params[:search]
  10 + query = Shellwords.shellescape(query) if query.present?
10 11
11 return result unless query.present? 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 # Search inside single project 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 project = projects.first if projects.length == 1 22 project = projects.first if projects.length == 1
18 23
19 if params[:search_code].present? 24 if params[:search_code].present?
@@ -23,7 +28,6 @@ class SearchContext @@ -23,7 +28,6 @@ class SearchContext
23 result[:issues] = Issue.where(project_id: project_ids).search(query).order('updated_at DESC').limit(20) 28 result[:issues] = Issue.where(project_id: project_ids).search(query).order('updated_at DESC').limit(20)
24 result[:wiki_pages] = [] 29 result[:wiki_pages] = []
25 end 30 end
26 - result  
27 end 31 end
28 32
29 def result 33 def result
app/controllers/admin/broadcast_messages_controller.rb 0 → 100644
@@ -0,0 +1,32 @@ @@ -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,5 +2,6 @@ class Admin::DashboardController &lt; Admin::ApplicationController
2 def index 2 def index
3 @projects = Project.order("created_at DESC").limit(10) 3 @projects = Project.order("created_at DESC").limit(10)
4 @users = User.order("created_at DESC").limit(10) 4 @users = User.order("created_at DESC").limit(10)
  5 + @groups = Group.order("created_at DESC").limit(10)
5 end 6 end
6 end 7 end
app/controllers/admin/projects_controller.rb
1 class Admin::ProjectsController < Admin::ApplicationController 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 def index 6 def index
5 owner_id = params[:owner_id] 7 owner_id = params[:owner_id]
6 user = User.find_by_id(owner_id) 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 @projects = @projects.with_push if params[:with_push].present? 12 @projects = @projects.with_push if params[:with_push].present?
11 @projects = @projects.abandoned if params[:abandoned].present? 13 @projects = @projects.abandoned if params[:abandoned].present?
12 @projects = @projects.search(params[:name]) if params[:name].present? 14 @projects = @projects.search(params[:name]) if params[:name].present?
@@ -14,8 +16,16 @@ class Admin::ProjectsController &lt; Admin::ApplicationController @@ -14,8 +16,16 @@ class Admin::ProjectsController &lt; Admin::ApplicationController
14 end 16 end
15 17
16 def show 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 end 29 end
20 30
21 protected 31 protected
@@ -26,4 +36,12 @@ class Admin::ProjectsController &lt; Admin::ApplicationController @@ -26,4 +36,12 @@ class Admin::ProjectsController &lt; Admin::ApplicationController
26 @project = Project.find_with_namespace(id) 36 @project = Project.find_with_namespace(id)
27 @project || render_404 37 @project || render_404
28 end 38 end
  39 +
  40 + def group
  41 + @group ||= project.group
  42 + end
  43 +
  44 + def repository
  45 + @repository ||= project.repository
  46 + end
29 end 47 end
app/controllers/admin/users_controller.rb
@@ -2,8 +2,7 @@ class Admin::UsersController &lt; Admin::ApplicationController @@ -2,8 +2,7 @@ class Admin::UsersController &lt; Admin::ApplicationController
2 before_filter :user, only: [:show, :edit, :update, :destroy] 2 before_filter :user, only: [:show, :edit, :update, :destroy]
3 3
4 def index 4 def index
5 - @users = User.scoped  
6 - @users = @users.filter(params[:filter]) 5 + @users = User.filter(params[:filter])
7 @users = @users.search(params[:name]) if params[:name].present? 6 @users = @users.search(params[:name]) if params[:name].present?
8 @users = @users.alphabetically.page(params[:page]) 7 @users = @users.alphabetically.page(params[:page])
9 end 8 end
@@ -48,7 +47,7 @@ class Admin::UsersController &lt; Admin::ApplicationController @@ -48,7 +47,7 @@ class Admin::UsersController &lt; Admin::ApplicationController
48 @user.admin = (admin && admin.to_i > 0) 47 @user.admin = (admin && admin.to_i > 0)
49 @user.created_by_id = current_user.id 48 @user.created_by_id = current_user.id
50 @user.generate_password 49 @user.generate_password
51 - @user.confirm! 50 + @user.skip_confirmation!
52 51
53 respond_to do |format| 52 respond_to do |format|
54 if @user.save 53 if @user.save
app/controllers/application_controller.rb
  1 +require 'gon'
  2 +
1 class ApplicationController < ActionController::Base 3 class ApplicationController < ActionController::Base
2 before_filter :authenticate_user! 4 before_filter :authenticate_user!
3 before_filter :reject_blocked! 5 before_filter :reject_blocked!
@@ -7,6 +9,7 @@ class ApplicationController &lt; ActionController::Base @@ -7,6 +9,7 @@ class ApplicationController &lt; ActionController::Base
7 before_filter :dev_tools if Rails.env == 'development' 9 before_filter :dev_tools if Rails.env == 'development'
8 before_filter :default_headers 10 before_filter :default_headers
9 before_filter :add_gon_variables 11 before_filter :add_gon_variables
  12 + before_filter :configure_permitted_parameters, if: :devise_controller?
10 13
11 protect_from_forgery 14 protect_from_forgery
12 15
@@ -81,6 +84,9 @@ class ApplicationController &lt; ActionController::Base @@ -81,6 +84,9 @@ class ApplicationController &lt; ActionController::Base
81 84
82 if @project and can?(current_user, :read_project, @project) 85 if @project and can?(current_user, :read_project, @project)
83 @project 86 @project
  87 + elsif current_user.nil?
  88 + @project = nil
  89 + authenticate_user!
84 else 90 else
85 @project = nil 91 @project = nil
86 render_404 and return 92 render_404 and return
@@ -102,7 +108,7 @@ class ApplicationController &lt; ActionController::Base @@ -102,7 +108,7 @@ class ApplicationController &lt; ActionController::Base
102 end 108 end
103 109
104 def authorize_code_access! 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 end 112 end
107 113
108 def authorize_push! 114 def authorize_push!
@@ -154,6 +160,9 @@ class ApplicationController &lt; ActionController::Base @@ -154,6 +160,9 @@ class ApplicationController &lt; ActionController::Base
154 def default_headers 160 def default_headers
155 headers['X-Frame-Options'] = 'DENY' 161 headers['X-Frame-Options'] = 'DENY'
156 headers['X-XSS-Protection'] = '1; mode=block' 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 end 166 end
158 167
159 def add_gon_variables 168 def add_gon_variables
@@ -174,4 +183,31 @@ class ApplicationController &lt; ActionController::Base @@ -174,4 +183,31 @@ class ApplicationController &lt; ActionController::Base
174 filters = cookies['event_filter'].split(',') if cookies['event_filter'].present? 183 filters = cookies['event_filter'].split(',') if cookies['event_filter'].present?
175 @event_filter ||= EventFilter.new(filters) 184 @event_filter ||= EventFilter.new(filters)
176 end 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 end 213 end
app/controllers/dashboard_controller.rb
@@ -22,7 +22,7 @@ class DashboardController &lt; ApplicationController @@ -22,7 +22,7 @@ class DashboardController &lt; ApplicationController
22 22
23 respond_to do |format| 23 respond_to do |format|
24 format.html 24 format.html
25 - format.js 25 + format.json { pager_json("events/_events", @events.count) }
26 format.atom { render layout: false } 26 format.atom { render layout: false }
27 end 27 end
28 end 28 end
@@ -40,26 +40,23 @@ class DashboardController &lt; ApplicationController @@ -40,26 +40,23 @@ class DashboardController &lt; ApplicationController
40 end 40 end
41 41
42 @projects = @projects.where(namespace_id: Group.find_by_name(params[:group])) if params[:group].present? 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 @labels = current_user.authorized_projects.tags_on(:labels) 49 @labels = current_user.authorized_projects.tags_on(:labels)
46 @groups = current_user.authorized_groups 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 end 51 end
51 52
52 - # Get authored or assigned open merge requests  
53 def merge_requests 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 @merge_requests = @merge_requests.recent.page(params[:page]).per(20) 55 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
57 end 56 end
58 57
59 - # Get only assigned issues  
60 def issues 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 @issues = @issues.recent.page(params[:page]).per(20) 60 @issues = @issues.recent.page(params[:page]).per(20)
64 @issues = @issues.includes(:author, :project) 61 @issues = @issues.includes(:author, :project)
65 62
@@ -72,6 +69,6 @@ class DashboardController &lt; ApplicationController @@ -72,6 +69,6 @@ class DashboardController &lt; ApplicationController
72 protected 69 protected
73 70
74 def load_projects 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 end 73 end
77 end 74 end
app/controllers/groups_controller.rb
@@ -38,22 +38,22 @@ class GroupsController &lt; ApplicationController @@ -38,22 +38,22 @@ class GroupsController &lt; ApplicationController
38 38
39 respond_to do |format| 39 respond_to do |format|
40 format.html 40 format.html
41 - format.js 41 + format.json { pager_json("events/_events", @events.count) }
42 format.atom { render layout: false } 42 format.atom { render layout: false }
43 end 43 end
44 end 44 end
45 45
46 # Get authored or assigned open merge requests 46 # Get authored or assigned open merge requests
47 def merge_requests 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 @merge_requests = @merge_requests.recent.page(params[:page]).per(20) 50 @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
51 end 51 end
52 52
53 # Get only assigned issues 53 # Get only assigned issues
54 def issues 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 @issues = @issues.recent.page(params[:page]).per(20) 57 @issues = @issues.recent.page(params[:page]).per(20)
58 @issues = @issues.includes(:author, :project) 58 @issues = @issues.includes(:author, :project)
59 59
@@ -102,7 +102,7 @@ class GroupsController &lt; ApplicationController @@ -102,7 +102,7 @@ class GroupsController &lt; ApplicationController
102 102
103 # Dont allow unauthorized access to group 103 # Dont allow unauthorized access to group
104 def authorize_read_group! 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 return render_404 106 return render_404
107 end 107 end
108 end 108 end
app/controllers/profiles/avatars_controller.rb 0 → 100644
@@ -0,0 +1,13 @@ @@ -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