Upstream version 7.14.3
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJV8pqnAAoJEM4fnGdFEsIqiaYP/j/21twWTENpUxImQ6+nWGiE ba41+E34MtiXzrRZOGVpKe7otCyvemZsUbOG8VwzK5ErNSeaBtCwxz9kT7uTpB8v Wqt9sevFiRyiLLkn3iG1xct2hxx9WNldmC55tUZz3jjvnLVDK4wh3AncQaN5mG19 3UG5nSyxzFbAbmLlwR196MbAlJg4GLOw+HfuPT1XC/+RTYPVoNsM2ULiL3iamdpG 5JSQLW2QN3cs7tyMAf4ZwrikJNa47Gi/Sat1VYSMA4EyI3y+HFJTu7CkwUzbJYTv Li288SirPuLv/sfjDYaUCGLVQmRaLFih5VLRJZ6R+jNKkesbKGgiNyOc/qY4uCCm ySPSlQU9nYwnTAacU+C9az0MOo4mj/b6JlHGKkUzjP2j6WGY5UR1PeyNSTIIxpvv gEDUNW9FQp5HiHh/ss1O54Li8hBo2/tnJmIEWynX904eNbHMzHsr5d1LAp0T99SE Z8NtxSMz+w4ZS4XXlVM3z6j+GJKmsUIyyHoQawvlBGi2WyozYwdR+vw8Jlz02++V 2g4NJMarOI/xlc7ApIMb7v9cTOWuhkdvE7QkLxefXWF6UmvWl71Q2GPgipvoK59U U9bjEAIbR1XbQPF+0MEc4DJEfI8OHkUFBJStqrAVeMd/fKPqXwyr+L07rCRInhf4 bq2MZvptAH6vFMREqUQ0 =hNPU -----END PGP SIGNATURE----- Merge tag 'upstream/7.14.3' Upstream version 7.14.3 # gpg: Signature made Friday 11 September 2015 02:41:03 PM IST using RSA key ID 4512C22A # gpg: Good signature from "Praveen Arimbrathodiyil (piratepin) <praveen@debian.org>" # gpg: aka "Pirate Praveen (pirates.org.in) <praveen@onenetbeyond.org>" # gpg: aka "Pirate Praveen (piratesin) <me@j4v4m4n.in>" # gpg: aka "Pirate Praveen (PP) <praveen@privacyrequired.com>" # gpg: aka "Praveen Arimbrathodiyil (j4v4m4n) <pravi.a@gmail.com>"
2
.gitignore
vendored
|
@ -37,6 +37,6 @@ public/assets/
|
|||
public/uploads.*
|
||||
public/uploads/
|
||||
rails_best_practices_output.html
|
||||
tags
|
||||
/tags
|
||||
tmp/
|
||||
vendor/bundle/*
|
||||
|
|
67
.gitlab-ci.yml
Normal file
|
@ -0,0 +1,67 @@
|
|||
# This file is generated by GitLab CI
|
||||
before_script:
|
||||
- ./scripts/prepare_build.sh
|
||||
- ruby -v
|
||||
- which ruby
|
||||
- gem install bundler --no-ri --no-rdoc
|
||||
- cp config/gitlab.yml.example config/gitlab.yml
|
||||
- touch log/application.log
|
||||
- touch log/test.log
|
||||
- bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}"
|
||||
- bundle exec rake db:create RAILS_ENV=test
|
||||
|
||||
spec:feature:
|
||||
script:
|
||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
spec:api:
|
||||
script:
|
||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
spec:other:
|
||||
script:
|
||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
spinach:project:
|
||||
script:
|
||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
spinach:other:
|
||||
script:
|
||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
teaspoon:
|
||||
script:
|
||||
- RAILS_ENV=test bundle exec teaspoon
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
rubocop:
|
||||
script:
|
||||
- bundle exec rubocop
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
||||
|
||||
brakeman:
|
||||
script:
|
||||
- bundle exec rake brakeman
|
||||
tags:
|
||||
- ruby
|
||||
- mysql
|
1
.rspec
|
@ -1 +1,2 @@
|
|||
--color
|
||||
--format Fuubar
|
||||
|
|
|
@ -954,7 +954,7 @@ Lint/Void:
|
|||
|
||||
Rails/ActionFilter:
|
||||
Description: 'Enforces consistent use of action filter methods.'
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
|
||||
Rails/DefaultScope:
|
||||
Description: 'Checks if the argument passed to default_scope is a block.'
|
||||
|
@ -993,8 +993,6 @@ Rails/Validation:
|
|||
AllCops:
|
||||
RunRailsCops: true
|
||||
Exclude:
|
||||
- 'spec/**/*'
|
||||
- 'features/**/*'
|
||||
- 'vendor/**/*'
|
||||
- 'db/**/*'
|
||||
- 'tmp/**/*'
|
||||
|
|
343
CHANGELOG
|
@ -1,17 +1,334 @@
|
|||
Please view this file on the master branch, on stable branches it's out of date.
|
||||
|
||||
v 7.11.0 (unreleased)
|
||||
v 7.14.2
|
||||
- Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu)
|
||||
|
||||
v 7.14.1
|
||||
- Only include base URL in OmniAuth full_host parameter (Stan Hu)
|
||||
- Fix Error 500 in API when accessing a group that has an avatar (Stan Hu)
|
||||
- Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
|
||||
- Improve abuse reports management from admin area
|
||||
|
||||
v 7.14.0
|
||||
- Fix bug where non-project members of the target project could set labels on new merge requests.
|
||||
- Update default robots.txt rules to disallow crawling of irrelevant pages (Ben Bodenmiller)
|
||||
- Fix redirection after sign in when using auto_sign_in_with_provider
|
||||
- Upgrade gitlab_git to 7.2.14 to ignore CRLFs in .gitmodules (Stan Hu)
|
||||
- Clear cache to prevent listing deleted branches after MR removes source branch (Stan Hu)
|
||||
- Provide more feedback what went wrong if HipChat service failed test (Stan Hu)
|
||||
- Fix bug where backslashes in inline diffs could be dropped (Stan Hu)
|
||||
- Disable turbolinks when linking to Bitbucket import status (Stan Hu)
|
||||
- Fix broken code import and display error messages if something went wrong with creating project (Stan Hu)
|
||||
- Fix corrupted binary files when using API files endpoint (Stan Hu)
|
||||
- Bump Haml to 4.0.7 to speed up textarea rendering (Stan Hu)
|
||||
- Show incompatible projects in Bitbucket import status (Stan Hu)
|
||||
- Fix coloring of diffs on MR Discussion-tab (Gert Goet)
|
||||
- Fix "Network" and "Graphs" pages for branches with encoded slashes (Stan Hu)
|
||||
- Fix errors deleting and creating branches with encoded slashes (Stan Hu)
|
||||
- Always add current user to autocomplete controller to support filter by "Me" (Stan Hu)
|
||||
- Fix multi-line syntax highlighting (Stan Hu)
|
||||
- Fix network graph when branch name has single quotes (Stan Hu)
|
||||
- Add "Confirm user" button in user admin page (Stan Hu)
|
||||
- Upgrade gitlab_git to version 7.2.6 to fix Error 500 when creating network graphs (Stan Hu)
|
||||
- Add support for Unicode filenames in relative links (Hiroyuki Sato)
|
||||
- Fix URL used for refreshing notes if relative_url is present (Bartłomiej Święcki)
|
||||
- Fix commit data retrieval when branch name has single quotes (Stan Hu)
|
||||
- Check that project was actually created rather than just validated in import:repos task (Stan Hu)
|
||||
- Fix full screen mode for snippet comments (Daniel Gerhardt)
|
||||
- Fix 404 error in files view after deleting the last file in a repository (Stan Hu)
|
||||
- Fix the "Reload with full diff" URL button (Stan Hu)
|
||||
- Fix label read access for unauthenticated users (Daniel Gerhardt)
|
||||
- Fix access to disabled features for unauthenticated users (Daniel Gerhardt)
|
||||
- Fix OAuth provider bug where GitLab would not go return to the redirect_uri after sign-in (Stan Hu)
|
||||
- Fix file upload dialog for comment editing (Daniel Gerhardt)
|
||||
- Set OmniAuth full_host parameter to ensure redirect URIs are correct (Stan Hu)
|
||||
- Return comments in created order in merge request API (Stan Hu)
|
||||
- Disable internal issue tracker controller if external tracker is used (Stan Hu)
|
||||
- Expire Rails cache entries after two weeks to prevent endless Redis growth
|
||||
- Add support for destroying project milestones (Stan Hu)
|
||||
- Allow custom backup archive permissions
|
||||
- Add project star and fork count, group avatar URL and user/group web URL attributes to API
|
||||
- Show who last edited a comment if it wasn't the original author
|
||||
- Send notification to all participants when MR is merged.
|
||||
- Add ability to manage user email addresses via the API.
|
||||
- Show buttons to add license, changelog and contribution guide if they're missing.
|
||||
- Tweak project page buttons.
|
||||
- Disabled autocapitalize and autocorrect on login field (Daryl Chan)
|
||||
- Mention group and project name in creation, update and deletion notices (Achilleas Pipinellis)
|
||||
- Update gravatar link on profile page to link to configured gravatar host (Ben Bodenmiller)
|
||||
- Remove redis-store TTL monkey patch
|
||||
- Add support for CI skipped status
|
||||
- Fetch code from forks to refs/merge-requests/:id/head when merge request created
|
||||
- Remove comments and email addresses when publicly exposing ssh keys (Zeger-Jan van de Weg)
|
||||
- Add "Check out branch" button to the MR page.
|
||||
- Improve MR merge widget text and UI consistency.
|
||||
- Improve text in MR "How To Merge" modal.
|
||||
- Cache all events
|
||||
- Order commits by date when comparing branches
|
||||
- Fix bug causing error when the target branch of a symbolic ref was deleted
|
||||
- Include branch/tag name in archive file and directory name
|
||||
- Add dropzone upload progress
|
||||
- Add a label for merged branches on branches page (Florent Baldino)
|
||||
- Detect .mkd and .mkdn files as markdown (Ben Boeckel)
|
||||
- Fix: User search feature in admin area does not respect filters
|
||||
- Set max-width for README, issue and merge request description for easier read on big screens
|
||||
- Update Flowdock integration to support new Flowdock API (Boyan Tabakov)
|
||||
- Remove author from files view (Sven Strickroth)
|
||||
- Fix infinite loop when SAML was incorrectly configured.
|
||||
|
||||
v 7.13.5
|
||||
- Satellites reverted
|
||||
|
||||
v 7.13.4
|
||||
- Allow users to send abuse reports
|
||||
|
||||
v 7.13.3
|
||||
- Fix bug causing Bitbucket importer to crash when OAuth application had been removed.
|
||||
- Allow users to send abuse reports
|
||||
- Remove satellites
|
||||
- Link username to profile on Group Members page (Tom Webster)
|
||||
|
||||
v 7.13.2
|
||||
- Fix randomly failed spec
|
||||
- Create project services on Project creation
|
||||
- Add admin_merge_request ability to Developer level and up
|
||||
- Fix Error 500 when browsing projects with no HEAD (Stan Hu)
|
||||
- Fix labels / assignee / milestone for the merge requests when issues are disabled
|
||||
- Show the first tab automatically on MergeRequests#new
|
||||
- Add rake task 'gitlab:update_commit_count' (Daniel Gerhardt)
|
||||
- Fix Gmail Actions
|
||||
|
||||
v 7.13.1
|
||||
- Fix: Label modifications are not reflected in existing notes and in the issue list
|
||||
- Fix: Label not shown in the Issue list, although it's set through web interface
|
||||
- Fix: Group/project references are linked incorrectly
|
||||
- Improve documentation
|
||||
- Fix of migration: Check if session_expire_delay column exists before adding the column
|
||||
- Fix: ActionView::Template::Error
|
||||
- Fix: "Create Merge Request" isn't always shown in event for newly pushed branch
|
||||
- Fix bug causing "Remove source-branch" option not to work for merge requests from the same project.
|
||||
- Render Note field hints consistently for "new" and "edit" forms
|
||||
|
||||
v 7.13.0
|
||||
- Remove repository graph log to fix slow cache updates after push event (Stan Hu)
|
||||
- Only enable HSTS header for HTTPS and port 443 (Stan Hu)
|
||||
- Fix user autocomplete for unauthenticated users accessing public projects (Stan Hu)
|
||||
- Fix redirection to home page URL for unauthorized users (Daniel Gerhardt)
|
||||
- Add branch switching support for graphs (Daniel Gerhardt)
|
||||
- Fix external issue tracker hook/test for HTTPS URLs (Daniel Gerhardt)
|
||||
- Remove link leading to a 404 error in Deploy Keys page (Stan Hu)
|
||||
- Add support for unlocking users in admin settings (Stan Hu)
|
||||
- Add Irker service configuration options (Stan Hu)
|
||||
- Fix order of issues imported from GitHub (Hiroyuki Sato)
|
||||
- Bump rugments to 1.0.0beta8 to fix C prototype function highlighting (Jonathon Reinhart)
|
||||
- Fix Merge Request webhook to properly fire "merge" action when accepted from the web UI
|
||||
- Add `two_factor_enabled` field to admin user API (Stan Hu)
|
||||
- Fix invalid timestamps in RSS feeds (Rowan Wookey)
|
||||
- Fix downloading of patches on public merge requests when user logged out (Stan Hu)
|
||||
- Fix Error 500 when relative submodule resolves to a namespace that has a different name from its path (Stan Hu)
|
||||
- Extract the longest-matching ref from a commit path when multiple matches occur (Stan Hu)
|
||||
- Update maintenance documentation to explain no need to recompile asssets for omnibus installations (Stan Hu)
|
||||
- Support commenting on diffs in side-by-side mode (Stan Hu)
|
||||
- Fix JavaScript error when clicking on the comment button on a diff line that has a comment already (Stan Hu)
|
||||
- Return 40x error codes if branch could not be deleted in UI (Stan Hu)
|
||||
- Remove project visibility icons from dashboard projects list
|
||||
- Rename "Design" profile settings page to "Preferences".
|
||||
- Allow users to customize their default Dashboard page.
|
||||
- Update ssl_ciphers in Nginx example to remove DHE settings. This will deny forward secrecy for Android 2.3.7, Java 6 and OpenSSL 0.9.8
|
||||
- Admin can edit and remove user identities
|
||||
- Convert CRLF newlines to LF when committing using the web editor.
|
||||
- API request /projects/:project_id/merge_requests?state=closed will return only closed merge requests without merged one. If you need ones that were merged - use state=merged.
|
||||
- Allow Administrators to filter the user list by those with or without Two-factor Authentication enabled.
|
||||
- Show a user's Two-factor Authentication status in the administration area.
|
||||
- Explicit error when commit not found in the CI
|
||||
- Improve performance for issue and merge request pages
|
||||
- Users with guest access level can not set assignee, labels or milestones for issue and merge request
|
||||
- Reporter role can manage issue tracker now: edit any issue, set assignee or milestone and manage labels
|
||||
- Better performance for pages with events list, issues list and commits list
|
||||
- Faster automerge check and merge itself when source and target branches are in same repository
|
||||
- Correctly show anonymous authorized applications under Profile > Applications.
|
||||
- Query Optimization in MySQL.
|
||||
- Allow users to be blocked and unblocked via the API
|
||||
- Use native Postgres database cleaning during backup restore
|
||||
- Redesign project page. Show README as default instead of activity. Move project activity to separate page
|
||||
- Make left menu more hierarchical and less contextual by adding back item at top
|
||||
- A fork can’t have a visibility level that is greater than the original project.
|
||||
- Faster code search in repository and wiki. Fixes search page timeout for big repositories
|
||||
- Allow administrators to disable 2FA for a specific user
|
||||
- Add error message for SSH key linebreaks
|
||||
- Store commits count in database (will populate with valid values only after first push)
|
||||
- Rebuild cache after push to repository in background job
|
||||
- Fix transferring of project to another group using the API.
|
||||
|
||||
v 7.12.2
|
||||
- Correctly show anonymous authorized applications under Profile > Applications.
|
||||
- Faster automerge check and merge itself when source and target branches are in same repository
|
||||
- Audit log for user authentication
|
||||
- Allow custom label to be set for authentication providers.
|
||||
|
||||
v 7.12.1
|
||||
- Fix error when deleting a user who has projects (Stan Hu)
|
||||
- Fix post-receive errors on a push when an external issue tracker is configured (Stan Hu)
|
||||
- Add SAML to list of social_provider (Matt Firtion)
|
||||
- Fix merge requests API scope to keep compatibility in 7.12.x patch release (Dmitriy Zaporozhets)
|
||||
- Fix closed merge request scope at milestone page (Dmitriy Zaporozhets)
|
||||
- Revert merge request states renaming
|
||||
- Fix hooks for web based events with external issue references (Daniel Gerhardt)
|
||||
- Improve performance for issue and merge request pages
|
||||
- Compress database dumps to reduce backup size
|
||||
|
||||
v 7.12.0
|
||||
- Fix Error 500 when one user attempts to access a personal, internal snippet (Stan Hu)
|
||||
- Disable changing of target branch in new merge request page when a branch has already been specified (Stan Hu)
|
||||
- Fix post-receive errors on a push when an external issue tracker is configured (Stan Hu)
|
||||
- Update oauth button logos for Twitter and Google to recommended assets
|
||||
- Update browser gem to version 0.8.0 for IE11 support (Stan Hu)
|
||||
- Fix timeout when rendering file with thousands of lines.
|
||||
- Add "Remember me" checkbox to LDAP signin form.
|
||||
- Add session expiration delay configuration through UI application settings
|
||||
- Don't notify users mentioned in code blocks or blockquotes.
|
||||
- Omit link to generate labels if user does not have access to create them (Stan Hu)
|
||||
- Show warning when a comment will add 10 or more people to the discussion.
|
||||
- Disable changing of the source branch in merge request update API (Stan Hu)
|
||||
- Shorten merge request WIP text.
|
||||
- Add option to disallow users from registering any application to use GitLab as an OAuth provider
|
||||
- Support editing target branch of merge request (Stan Hu)
|
||||
- Refactor permission checks with issues and merge requests project settings (Stan Hu)
|
||||
- Fix Markdown preview not working in Edit Milestone page (Stan Hu)
|
||||
- Fix Zen Mode not closing with ESC key (Stan Hu)
|
||||
- Allow HipChat API version to be blank and default to v2 (Stan Hu)
|
||||
- Add file attachment support in Milestone description (Stan Hu)
|
||||
- Fix milestone "Browse Issues" button.
|
||||
- Set milestone on new issue when creating issue from index with milestone filter active.
|
||||
- Make namespace API available to all users (Stan Hu)
|
||||
- Add web hook support for note events (Stan Hu)
|
||||
- Disable "New Issue" and "New Merge Request" buttons when features are disabled in project settings (Stan Hu)
|
||||
- Remove Rack Attack monkey patches and bump to version 4.3.0 (Stan Hu)
|
||||
- Fix clone URL losing selection after a single click in Safari and Chrome (Stan Hu)
|
||||
- Fix git blame syntax highlighting when different commits break up lines (Stan Hu)
|
||||
- Add "Resend confirmation e-mail" link in profile settings (Stan Hu)
|
||||
- Allow to configure location of the `.gitlab_shell_secret` file. (Jakub Jirutka)
|
||||
- Disabled expansion of top/bottom blobs for new file diffs
|
||||
- Update Asciidoctor gem to version 1.5.2. (Jakub Jirutka)
|
||||
- Fix resolving of relative links to repository files in AsciiDoc documents. (Jakub Jirutka)
|
||||
- Use the user list from the target project in a merge request (Stan Hu)
|
||||
- Default extention for wiki pages is now .md instead of .markdown (Jeroen van Baarsen)
|
||||
- Add validation to wiki page creation (only [a-zA-Z0-9/_-] are allowed) (Jeroen van Baarsen)
|
||||
- Fix new/empty milestones showing 100% completion value (Jonah Bishop)
|
||||
- Add a note when an Issue or Merge Request's title changes
|
||||
- Consistently refer to MRs as either Merged or Closed.
|
||||
- Add Merged tab to MR lists.
|
||||
- Prefix EmailsOnPush email subject with `[Git]`.
|
||||
- Group project contributions by both name and email.
|
||||
- Clarify navigation labels for Project Settings and Group Settings.
|
||||
- Move user avatar and logout button to sidebar
|
||||
- You can not remove user if he/she is an only owner of group
|
||||
- User should be able to leave group. If not - show him proper message
|
||||
- User has ability to leave project
|
||||
- Add SAML support as an omniauth provider
|
||||
- Allow to configure a URL to show after sign out
|
||||
- Add an option to automatically sign-in with an Omniauth provider
|
||||
- GitLab CI service sends .gitlab-ci.yml in each push call
|
||||
- When remove project - move repository and schedule it removal
|
||||
- Improve group removing logic
|
||||
- Trigger create-hooks on backup restore task
|
||||
- Add option to automatically link omniauth and LDAP identities
|
||||
- Allow special character in users bio. I.e.: I <3 GitLab
|
||||
|
||||
v 7.11.4
|
||||
- Fix missing bullets when creating lists
|
||||
- Set rel="nofollow" on external links
|
||||
|
||||
v 7.11.3
|
||||
- no changes
|
||||
- Fix upgrader script (Martins Polakovs)
|
||||
|
||||
v 7.11.2
|
||||
- no changes
|
||||
|
||||
v 7.11.1
|
||||
- no changes
|
||||
|
||||
v 7.11.0
|
||||
- Fall back to Plaintext when Syntaxhighlighting doesn't work. Fixes some buggy lexers (Hannes Rosenögger)
|
||||
- Get editing comments to work in Chrome 43 again.
|
||||
- Fix broken view when viewing history of a file that includes a path that used to be another file (Stan Hu)
|
||||
- Don't show duplicate deploy keys
|
||||
- Fix commit time being displayed in the wrong timezone in some cases (Hannes Rosenögger)
|
||||
- Make the first branch pushed to an empty repository the default HEAD (Stan Hu)
|
||||
- Fix broken view when using a tag to display a tree that contains git submodules (Stan Hu)
|
||||
- Make Reply-To config apply to change e-mail confirmation and other Devise notifications (Stan Hu)
|
||||
- Add application setting to restrict user signups to e-mail domains (Stan Hu)
|
||||
- Don't allow a merge request to be merged when its title starts with "WIP".
|
||||
- Add a page title to every page.
|
||||
- Allow primary email to be set to an email that you've already added.
|
||||
- Fix clone URL field and X11 Primary selection (Dmitry Medvinsky)
|
||||
- Ignore invalid lines in .gitmodules
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
- Fix "Cannot move project" error message from popping up after a successful transfer (Stan Hu)
|
||||
- Redirect to sign in page after signing out.
|
||||
- Fix "Hello @username." references not working by no longer allowing usernames to end in period.
|
||||
- Fix "Revspec not found" errors when viewing diffs in a forked project with submodules (Stan Hu)
|
||||
- Improve project page UI
|
||||
- Fix broken file browsing with relative submodule in personal projects (Stan Hu)
|
||||
- Add "Reply quoting selected text" shortcut key (`r`)
|
||||
- Fix bug causing `@whatever` inside an issue's first code block to be picked up as a user mention.
|
||||
- Fix bug causing `@whatever` inside an inline code snippet (backtick-style) to be picked up as a user mention.
|
||||
- When use change branches link at MR form - save source branch selection instead of target one
|
||||
- Improve handling of large diffs
|
||||
- Added GitLab Event header for project hooks
|
||||
- Add Two-factor authentication (2FA) for GitLab logins
|
||||
- Show Atom feed buttons everywhere where applicable.
|
||||
- Add project activity atom feed.
|
||||
- Don't crash when an MR from a fork has a cross-reference comment from the target project on one of its commits.
|
||||
- Explain how to get a new password reset token in welcome emails
|
||||
- Include commit comments in MR from a forked project.
|
||||
- Group milestones by title in the dashboard and all other issue views.
|
||||
- Query issues, merge requests and milestones with their IID through API (Julien Bianchi)
|
||||
- Add default project and snippet visibility settings to the admin web UI.
|
||||
- Show incompatible projects in Google Code import status (Stan Hu)
|
||||
- Fix bug where commit data would not appear in some subdirectories (Stan Hu)
|
||||
- Task lists are now usable in comments, and will show up in Markdown previews.
|
||||
- Fix bug where avatar filenames were not actually deleted from the database during removal (Stan Hu)
|
||||
- Fix bug where Slack service channel was not saved in admin template settings. (Stan Hu)
|
||||
- Protect OmniAuth request phase against CSRF.
|
||||
- Don't send notifications to mentioned users that don't have access to the project in question.
|
||||
- Add search issues/MR by number
|
||||
- Move snippets UI to fluid layout
|
||||
- Improve UI for sidebar. Increase separation between navigation and content
|
||||
- Improve new project command options (Ben Bodenmiller)
|
||||
- Add common method to force UTF-8 and use it to properly handle non-ascii OAuth user properties (Onur Küçük)
|
||||
- Prevent sending empty messages to HipChat (Chulki Lee)
|
||||
- Improve UI for mobile phones on dashboard and project pages
|
||||
- Add room notification and message color option for HipChat
|
||||
- Allow to use non-ASCII letters and dashes in project and namespace name. (Jakub Jirutka)
|
||||
- Add footnotes support to Markdown (Guillaume Delbergue)
|
||||
- Add current_sign_in_at to UserFull REST api.
|
||||
- Make Sidekiq MemoryKiller shutdown signal configurable
|
||||
- Add "Create Merge Request" buttons to commits and branches pages and push event.
|
||||
- Show user roles by comments.
|
||||
- Fix automatic blocking of auto-created users from Active Directory.
|
||||
- Call merge request web hook for each new commits (Arthur Gautier)
|
||||
- Use SIGKILL by default in Sidekiq::MemoryKiller
|
||||
- Fix mentioning of private groups.
|
||||
- Add style for <kbd> element in markdown
|
||||
- Spin spinner icon next to "Checking for CI status..." on MR page.
|
||||
- Fix reference links in dashboard activity and ATOM feeds.
|
||||
- Ensure that the first added admin performs repository imports
|
||||
|
||||
v 7.10.0 (unreleased)
|
||||
v 7.10.4
|
||||
- Fix migrations broken in 7.10.2
|
||||
- Make tags for GitLab installations running on MySQL case sensitive
|
||||
- Get Gitorious importer to work again.
|
||||
- Fix adding new group members from admin area
|
||||
- Fix DB error when trying to tag a repository (Stan Hu)
|
||||
- Fix Error 500 when searching Wiki pages (Stan Hu)
|
||||
- Unescape branch names in compare commit (Stan Hu)
|
||||
- Order commit comments chronologically in API.
|
||||
|
||||
v 7.10.2
|
||||
- Fix CI links on MR page
|
||||
|
||||
v 7.10.0
|
||||
- Ignore submodules that are defined in .gitmodules but are checked in as directories.
|
||||
- Allow projects to be imported from Google Code.
|
||||
- Remove access control for uploaded images to fix broken images in emails (Hannes Rosenögger)
|
||||
|
@ -37,7 +354,6 @@ v 7.10.0 (unreleased)
|
|||
- Allow HTML tags in Markdown input
|
||||
- Fix code unfold not working on Compare commits page (Stan Hu)
|
||||
- Fix generating SSH key fingerprints with OpenSSH 6.8. (Sašo Stanovnik)
|
||||
- Include missing events and fix save functionality in admin service template settings form (Stan Hu)
|
||||
- Fix "Import projects from" button to show the correct instructions (Stan Hu)
|
||||
- Fix dots in Wiki slugs causing errors (Stan Hu)
|
||||
- Make maximum attachment size configurable via Application Settings (Stan Hu)
|
||||
|
@ -93,7 +409,6 @@ v 7.10.0 (unreleased)
|
|||
- Fixed link paths for HTTP and SSH on the admin project view (Jeremy Maziarz)
|
||||
- Fix and improve help rendering (Sullivan Sénéchal)
|
||||
- Fix final line in EmailsOnPush email diff being rendered as error.
|
||||
- Authometic setup GitLab CI project for forks if origin project has GitLab CI enabled
|
||||
- Prevent duplicate Buildkite service creation.
|
||||
- Fix git over ssh errors 'fatal: protocol error: bad line length character'
|
||||
- Automatically setup GitLab CI project for forks if origin project has GitLab CI enabled
|
||||
|
@ -409,6 +724,12 @@ v 7.5.0
|
|||
- Use secret token with GitLab internal API.
|
||||
- Add missing timestamps to 'members' table
|
||||
|
||||
v 7.4.5
|
||||
- Bump gitlab_git to 7.0.0.rc12 (includes Rugged 0.21.2)
|
||||
|
||||
v 7.4.4
|
||||
- No changes
|
||||
|
||||
v 7.4.3
|
||||
- Fix raw snippets view
|
||||
- Fix security issue for member api
|
||||
|
|
|
@ -29,11 +29,9 @@ You can also sign up on [CodeTriage](http://www.codetriage.com/gitlabhq/gitlabhq
|
|||
|
||||
## Issue tracker
|
||||
|
||||
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#getting-help). Professional [support subscriptions](http://about.gitlab.com/subscription/) and [consulting services](http://about.gitlab.com/consultancy/) are available from [GitLab.com](http://about.gitlab.com/).
|
||||
To get support for your particular problem please use the [getting help channels](https://about.gitlab.com/getting-help/).
|
||||
|
||||
The [issue tracker](https://gitlab.com/gitlab-org/gitlab-ce/issues) is only for obvious errors in the latest [stable or development release of GitLab](MAINTENANCE.md). If something is wrong but it is not a regression compared to older versions of GitLab please do not open an issue but a feature request. 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.
|
||||
|
||||
Issues can be filed either at [gitlab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues) or [github.com](https://github.com/gitlabhq/gitlabhq/issues).
|
||||
The [GitLab CE issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues) is only for obvious errors in the latest [stable or development release of GitLab](MAINTENANCE.md). If something is wrong but it is not a regression compared to older versions of GitLab please do not open an issue but a feature request. 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.
|
||||
|
||||
Do not use the issue tracker for feature requests. We have a specific [feature request forum](http://feedback.gitlab.com) for this purpose. Please keep feature requests as small and simple as possible, complex ones might be edited to make them small and simple.
|
||||
|
||||
|
@ -69,7 +67,7 @@ To start with GitLab download the [GitLab Development Kit](https://gitlab.com/gi
|
|||
|
||||
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:
|
||||
|
||||
1. Fork the project on GitLab Cloud
|
||||
1. Fork the project into your personal space on GitLab.com
|
||||
1. Create a feature branch
|
||||
1. Write [tests](https://gitlab.com/gitlab-org/gitlab-development-kit#running-the-tests) and code
|
||||
1. Add your changes to the [CHANGELOG](CHANGELOG)
|
||||
|
@ -86,7 +84,9 @@ If you can, please submit a merge request with the fix or improvements including
|
|||
1. If your MR touches code that executes shell commands, make sure it adheres to the [shell command guidelines]( doc/development/shell_commands.md).
|
||||
1. Also have a look at the [shell command guidelines](doc/development/shell_commands.md) if your code reads or opens files, or handles paths to files on disk.
|
||||
|
||||
The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast. Before this time the GitLab B.V. team is still dealing with work that is created by the monthly release such as assisting subscribers with upgrade issues, the release of Enterprise Edition and the upgrade of GitLab Cloud. After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features.
|
||||
The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast.
|
||||
Before this time the GitLab B.V. team is still dealing with work that is created by the monthly release such as regressions requiring patch releases.
|
||||
After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features.
|
||||
|
||||
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? Can you do part of the refactor? The increased reviewability of small MR's that leads to higher code quality is more important to us than having a minimal commit log. The smaller a MR is the more likely it is it will be merged (quickly), after that you can send more MR's to enhance it.
|
||||
|
||||
|
@ -160,20 +160,24 @@ If you add a dependency in GitLab (such as an operating system package) please c
|
|||
1. [CoffeeScript](https://github.com/thoughtbot/guides/tree/master/style#coffeescript)
|
||||
1. [Shell commands](doc/development/shell_commands.md) created by GitLab contributors to enhance security
|
||||
1. [Markdown](http://www.cirosantilli.com/markdown-styleguide)
|
||||
1. [Database Migrations](doc/development/migration_style_guide.md)
|
||||
1. [Documentation styleguide](doc_styleguide.md)
|
||||
1. Interface text should be written subjectively instead of objectively. It should be the gitlab core team addressing a person. It should be written in present time and never use past tense (has been/was). For example instead of "prohibited this user from being saved due to the following errors:" the text should be "sorry, we could not create your account because:". Also these [excellent writing guidelines](https://github.com/NARKOZ/guides#writing).
|
||||
|
||||
This is also the style used by linting tools such as [RuboCop](https://github.com/bbatsov/rubocop), [PullReview](https://www.pullreview.com/) and [Hound CI](https://houndci.com).
|
||||
|
||||
## Code of conduct
|
||||
|
||||
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
||||
|
||||
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
|
||||
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
|
||||
|
||||
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior can be
|
||||
reported by emailing contact@gitlab.com
|
||||
This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior can be reported by emailing contact@gitlab.com
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.1.0, available at [http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/)
|
||||
|
|
|
@ -1 +1 @@
|
|||
2.6.2
|
||||
2.6.5
|
||||
|
|
152
Gemfile
|
@ -1,17 +1,10 @@
|
|||
source "https://rubygems.org"
|
||||
|
||||
def darwin_only(require_as)
|
||||
RUBY_PLATFORM.include?('darwin') && require_as
|
||||
end
|
||||
gem 'rails', '4.1.11'
|
||||
|
||||
def linux_only(require_as)
|
||||
RUBY_PLATFORM.include?('linux') && require_as
|
||||
end
|
||||
|
||||
gem "rails", "~> 4.1.0"
|
||||
|
||||
# Make links from text
|
||||
gem 'rails_autolink', '~> 1.1'
|
||||
# Specify a sprockets version due to security issue
|
||||
# See https://groups.google.com/forum/#!topic/rubyonrails-security/doAVp0YaTqY
|
||||
gem 'sprockets', '~> 2.12.3'
|
||||
|
||||
# Default values for AR models
|
||||
gem "default_value_for", "~> 3.0.0"
|
||||
|
@ -20,37 +13,51 @@ gem "default_value_for", "~> 3.0.0"
|
|||
gem "mysql2", group: :mysql
|
||||
gem "pg", group: :postgres
|
||||
|
||||
# Auth
|
||||
# Authentication libraries
|
||||
gem "devise", '3.2.4'
|
||||
gem "devise-async", '0.9.0'
|
||||
gem 'omniauth', "~> 1.1.3"
|
||||
gem 'omniauth', "~> 1.2.2"
|
||||
gem 'omniauth-google-oauth2'
|
||||
gem 'omniauth-twitter'
|
||||
gem 'omniauth-github'
|
||||
gem 'omniauth-shibboleth'
|
||||
gem 'omniauth-kerberos'
|
||||
gem 'omniauth-kerberos', group: :kerberos
|
||||
gem 'omniauth-gitlab'
|
||||
gem 'omniauth-bitbucket'
|
||||
gem 'omniauth-saml', '~> 1.4.0'
|
||||
gem 'doorkeeper', '2.1.3'
|
||||
gem "rack-oauth2", "~> 1.0.5"
|
||||
|
||||
# Two-factor authentication
|
||||
gem 'devise-two-factor'
|
||||
gem 'rqrcode-rails3'
|
||||
gem 'attr_encrypted', '1.3.4'
|
||||
|
||||
# Browser detection
|
||||
gem "browser"
|
||||
gem "browser", '~> 0.8.0'
|
||||
|
||||
# Extracting information from a git repository
|
||||
# Provide access to Gitlab::Git library
|
||||
gem "gitlab_git", '~> 7.1.10'
|
||||
gem "gitlab_git", '~> 7.2.15'
|
||||
|
||||
# Ruby/Rack Git Smart-HTTP Server Handler
|
||||
# GitLab fork with a lot of changes (improved thread-safety, better memory usage etc)
|
||||
# For full list of changes see https://github.com/SaitoWu/grack/compare/master...gitlabhq:master
|
||||
gem 'gitlab-grack', '~> 2.0.2', require: 'grack'
|
||||
|
||||
# LDAP Auth
|
||||
# GitLab fork with several improvements to original library. For full list of changes
|
||||
# see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master
|
||||
gem 'gitlab_omniauth-ldap', '1.2.1', require: "omniauth-ldap"
|
||||
|
||||
# Git Wiki
|
||||
gem 'gollum-lib', '~> 4.0.2'
|
||||
|
||||
# Language detection
|
||||
# GitLab fork of linguist does not require pygments/python dependency.
|
||||
# New version of original gem also dropped pygments support but it has strict
|
||||
# dependency to unstable rugged version. We have internal issue for replacing
|
||||
# fork with original gem when we meet on same rugged version - https://dev.gitlab.org/gitlab/gitlabhq/issues/2052.
|
||||
gem "gitlab-linguist", "~> 3.0.1", require: "linguist"
|
||||
|
||||
# API
|
||||
|
@ -78,7 +85,7 @@ gem "carrierwave"
|
|||
gem 'dropzonejs-rails'
|
||||
|
||||
# for aws storage
|
||||
gem "fog", "~> 1.14"
|
||||
gem "fog", "~> 1.25.0"
|
||||
gem "unf"
|
||||
|
||||
# Authorization
|
||||
|
@ -87,20 +94,17 @@ gem "six"
|
|||
# Seed data
|
||||
gem "seed-fu"
|
||||
|
||||
# Markup pipeline for GitLab
|
||||
gem 'html-pipeline-gitlab', '~> 0.1'
|
||||
|
||||
# Markdown to HTML
|
||||
gem "github-markup"
|
||||
|
||||
# Required markup gems by github-markdown
|
||||
gem 'redcarpet', '~> 3.2.3'
|
||||
# Markdown and HTML processing
|
||||
gem 'html-pipeline', '~> 1.11.0'
|
||||
gem 'task_list', '1.0.2', require: 'task_list/railtie'
|
||||
gem 'github-markup'
|
||||
gem 'redcarpet', '~> 3.3.2'
|
||||
gem 'RedCloth'
|
||||
gem 'rdoc', '~>3.6'
|
||||
gem 'org-ruby', '= 0.9.12'
|
||||
gem 'creole', '~>0.3.6'
|
||||
gem 'wikicloth', '=0.8.1'
|
||||
gem 'asciidoctor', '= 0.1.4'
|
||||
gem 'asciidoctor', '~> 1.5.2'
|
||||
|
||||
# Diffs
|
||||
gem 'diffy', '~> 3.0.3'
|
||||
|
@ -143,10 +147,10 @@ gem "redis-rails"
|
|||
gem 'tinder', '~> 1.9.2'
|
||||
|
||||
# HipChat integration
|
||||
gem "hipchat", "~> 1.4.0"
|
||||
gem 'hipchat', '~> 1.5.0'
|
||||
|
||||
# Flowdock integration
|
||||
gem "gitlab-flowdock-git-hook", "~> 0.4.2"
|
||||
gem "gitlab-flowdock-git-hook", "~> 1.0.1"
|
||||
|
||||
# Gemnasium integration
|
||||
gem "gemnasium-gitlab-service", "~> 0.2"
|
||||
|
@ -158,7 +162,7 @@ gem "slack-notifier", "~> 1.0.0"
|
|||
gem 'asana', '~> 0.0.6'
|
||||
|
||||
# d3
|
||||
gem "d3_rails", "~> 3.1.4"
|
||||
gem 'd3_rails', '~> 3.5.5'
|
||||
|
||||
#cal-heatmap
|
||||
gem "cal-heatmap-rails", "~> 0.0.1"
|
||||
|
@ -170,7 +174,7 @@ gem "underscore-rails", "~> 1.4.4"
|
|||
gem "sanitize", '~> 2.0'
|
||||
|
||||
# Protect against bruteforcing
|
||||
gem "rack-attack"
|
||||
gem "rack-attack", '~> 4.3.0'
|
||||
|
||||
# Ace editor
|
||||
gem 'ace-rails-ap'
|
||||
|
@ -181,26 +185,26 @@ gem 'mousetrap-rails'
|
|||
# Detect and convert string character encoding
|
||||
gem 'charlock_holmes'
|
||||
|
||||
gem "sass-rails", '~> 4.0.2'
|
||||
gem "sass-rails", '~> 4.0.5'
|
||||
gem "coffee-rails"
|
||||
gem "uglifier"
|
||||
gem 'turbolinks'
|
||||
gem 'turbolinks', '~> 2.5.0'
|
||||
gem 'jquery-turbolinks'
|
||||
|
||||
gem 'select2-rails'
|
||||
gem 'jquery-atwho-rails', "~> 0.3.3"
|
||||
gem "jquery-rails"
|
||||
gem "jquery-ui-rails"
|
||||
gem "jquery-scrollto-rails"
|
||||
gem "raphael-rails", "~> 2.1.2"
|
||||
gem 'bootstrap-sass', '~> 3.0'
|
||||
gem "font-awesome-rails", '~> 4.2'
|
||||
gem "gitlab_emoji", "~> 0.1"
|
||||
gem "gon", '~> 5.0.0'
|
||||
gem 'nprogress-rails'
|
||||
gem 'request_store'
|
||||
gem "virtus"
|
||||
gem 'addressable'
|
||||
gem 'bootstrap-sass', '~> 3.0'
|
||||
gem 'font-awesome-rails', '~> 4.2'
|
||||
gem 'gitlab_emoji', '~> 0.1'
|
||||
gem 'gon', '~> 5.0.0'
|
||||
gem 'jquery-atwho-rails', '~> 1.0.0'
|
||||
gem 'jquery-rails', '3.1.3'
|
||||
gem 'jquery-scrollto-rails'
|
||||
gem 'jquery-ui-rails'
|
||||
gem 'nprogress-rails'
|
||||
gem 'raphael-rails', '~> 2.1.2'
|
||||
gem 'request_store'
|
||||
gem 'select2-rails', '~> 3.5.9'
|
||||
gem 'virtus'
|
||||
|
||||
group :development do
|
||||
gem 'brakeman', require: false
|
||||
|
@ -208,6 +212,7 @@ group :development do
|
|||
gem "letter_opener"
|
||||
gem 'quiet_assets', '~> 1.0.1'
|
||||
gem 'rack-mini-profiler', require: false
|
||||
gem 'rerun', '~> 0.10.0'
|
||||
|
||||
# Better errors handler
|
||||
gem 'better_errors'
|
||||
|
@ -221,50 +226,42 @@ group :development do
|
|||
end
|
||||
|
||||
group :development, :test do
|
||||
gem 'coveralls', require: false
|
||||
gem 'rubocop', '0.28.0', require: false
|
||||
# gem 'rails-dev-tweaks'
|
||||
gem 'spinach-rails'
|
||||
gem "rspec-rails", '2.99'
|
||||
gem "capybara", '~> 2.2.1'
|
||||
gem "pry-rails"
|
||||
gem "awesome_print"
|
||||
gem "database_cleaner"
|
||||
gem "launchy"
|
||||
gem 'awesome_print'
|
||||
gem 'byebug', platform: :mri
|
||||
gem 'fuubar', '~> 2.0.0'
|
||||
gem 'pry-rails'
|
||||
|
||||
gem 'coveralls', '~> 0.8.2', require: false
|
||||
gem 'database_cleaner', '~> 1.4.0'
|
||||
gem 'factory_girl_rails'
|
||||
gem 'rspec-rails', '~> 3.3.0'
|
||||
gem 'rubocop', '0.28.0', require: false
|
||||
gem 'spinach-rails'
|
||||
|
||||
# Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826)
|
||||
gem 'minitest', '~> 5.3.0'
|
||||
|
||||
# Generate Fake data
|
||||
gem "ffaker"
|
||||
gem 'ffaker', '~> 2.0.0'
|
||||
|
||||
# Guard
|
||||
gem 'guard-rspec'
|
||||
gem 'guard-spinach'
|
||||
gem 'capybara', '~> 2.4.0'
|
||||
gem 'capybara-screenshot', '~> 1.0.0'
|
||||
gem 'poltergeist', '~> 1.6.0'
|
||||
|
||||
# Notification
|
||||
gem 'rb-fsevent', require: darwin_only('rb-fsevent')
|
||||
gem 'growl', require: darwin_only('growl')
|
||||
gem 'rb-inotify', require: linux_only('rb-inotify')
|
||||
gem 'teaspoon', '~> 1.0.0'
|
||||
gem 'teaspoon-jasmine'
|
||||
|
||||
# PhantomJS driver for Capybara
|
||||
gem 'poltergeist', '~> 1.5.1'
|
||||
|
||||
gem 'jasmine', '2.0.2'
|
||||
|
||||
gem "spring", '~> 1.3.1'
|
||||
gem "spring-commands-rspec", '1.0.4'
|
||||
gem "spring-commands-spinach", '1.0.0'
|
||||
|
||||
gem "byebug"
|
||||
gem 'spring', '~> 1.3.1'
|
||||
gem 'spring-commands-rspec', '~> 1.0.0'
|
||||
gem 'spring-commands-spinach', '~> 1.0.0'
|
||||
gem 'spring-commands-teaspoon', '~> 0.0.2'
|
||||
end
|
||||
|
||||
group :test do
|
||||
gem "simplecov", require: false
|
||||
gem "shoulda-matchers", "~> 2.7.0"
|
||||
gem 'email_spec'
|
||||
gem "webmock"
|
||||
gem 'simplecov', require: false
|
||||
gem 'shoulda-matchers', '~> 2.8.0', require: false
|
||||
gem 'email_spec', '~> 1.6.0'
|
||||
gem 'webmock', '~> 1.21.0'
|
||||
gem 'test_after_commit'
|
||||
end
|
||||
|
||||
|
@ -275,4 +272,3 @@ end
|
|||
gem "newrelic_rpm"
|
||||
|
||||
gem 'octokit', '3.7.0'
|
||||
gem "rugments"
|
||||
|
|
496
Gemfile.lock
|
@ -1,33 +1,34 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (2.3.1)
|
||||
RedCloth (4.2.9)
|
||||
ace-rails-ap (2.0.1)
|
||||
actionmailer (4.1.9)
|
||||
actionpack (= 4.1.9)
|
||||
actionview (= 4.1.9)
|
||||
actionmailer (4.1.11)
|
||||
actionpack (= 4.1.11)
|
||||
actionview (= 4.1.11)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
actionpack (4.1.9)
|
||||
actionview (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
actionpack (4.1.11)
|
||||
actionview (= 4.1.11)
|
||||
activesupport (= 4.1.11)
|
||||
rack (~> 1.5.2)
|
||||
rack-test (~> 0.6.2)
|
||||
actionview (4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
actionview (4.1.11)
|
||||
activesupport (= 4.1.11)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
activemodel (4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
activemodel (4.1.11)
|
||||
activesupport (= 4.1.11)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.1.9)
|
||||
activemodel (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
activerecord (4.1.11)
|
||||
activemodel (= 4.1.11)
|
||||
activesupport (= 4.1.11)
|
||||
arel (~> 5.0.0)
|
||||
activeresource (4.0.0)
|
||||
activemodel (~> 4.0)
|
||||
activesupport (~> 4.0)
|
||||
rails-observers (~> 0.1.1)
|
||||
activesupport (4.1.9)
|
||||
activesupport (4.1.11)
|
||||
i18n (~> 0.6, >= 0.6.9)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
|
@ -35,19 +36,21 @@ GEM
|
|||
tzinfo (~> 1.1)
|
||||
acts-as-taggable-on (3.5.0)
|
||||
activerecord (>= 3.2, < 5)
|
||||
addressable (2.3.5)
|
||||
addressable (2.3.8)
|
||||
annotate (2.6.0)
|
||||
activerecord (>= 2.3.0)
|
||||
rake (>= 0.8.7)
|
||||
arel (5.0.1.20140414130214)
|
||||
asana (0.0.6)
|
||||
activeresource (>= 3.2.3)
|
||||
asciidoctor (0.1.4)
|
||||
asciidoctor (1.5.2)
|
||||
ast (2.0.0)
|
||||
astrolabe (1.3.0)
|
||||
parser (>= 2.2.0.pre.3, < 3.0)
|
||||
attr_encrypted (1.3.4)
|
||||
encryptor (>= 1.3.0)
|
||||
attr_required (1.0.0)
|
||||
autoprefixer-rails (5.1.6)
|
||||
autoprefixer-rails (5.1.11)
|
||||
execjs
|
||||
json
|
||||
awesome_print (1.2.0)
|
||||
|
@ -60,7 +63,7 @@ GEM
|
|||
erubis (>= 2.6.6)
|
||||
binding_of_caller (0.7.2)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bootstrap-sass (3.3.3)
|
||||
bootstrap-sass (3.3.4.1)
|
||||
autoprefixer-rails (>= 5.0.0.1)
|
||||
sass (>= 3.2.19)
|
||||
brakeman (3.0.1)
|
||||
|
@ -73,18 +76,21 @@ GEM
|
|||
ruby_parser (~> 3.5.0)
|
||||
sass (~> 3.0)
|
||||
terminal-table (~> 1.4)
|
||||
browser (0.7.2)
|
||||
browser (0.8.0)
|
||||
builder (3.2.2)
|
||||
byebug (3.2.0)
|
||||
columnize (~> 0.8)
|
||||
debugger-linecache (~> 1.2)
|
||||
cal-heatmap-rails (0.0.1)
|
||||
capybara (2.2.1)
|
||||
capybara (2.4.4)
|
||||
mime-types (>= 1.16)
|
||||
nokogiri (>= 1.3.3)
|
||||
rack (>= 1.0.0)
|
||||
rack-test (>= 0.5.4)
|
||||
xpath (~> 2.0)
|
||||
capybara-screenshot (1.0.9)
|
||||
capybara (>= 1.0, < 3)
|
||||
launchy
|
||||
carrierwave (0.9.0)
|
||||
activemodel (>= 3.2.0)
|
||||
activesupport (>= 3.2.0)
|
||||
|
@ -96,30 +102,30 @@ GEM
|
|||
coderay (1.1.0)
|
||||
coercible (1.0.0)
|
||||
descendants_tracker (~> 0.0.1)
|
||||
coffee-rails (4.0.1)
|
||||
coffee-rails (4.1.0)
|
||||
coffee-script (>= 2.2.0)
|
||||
railties (>= 4.0.0, < 5.0)
|
||||
coffee-script (2.2.0)
|
||||
coffee-script (2.4.1)
|
||||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.6.3)
|
||||
coffee-script-source (1.9.1.1)
|
||||
colored (1.2)
|
||||
colorize (0.5.8)
|
||||
columnize (0.9.0)
|
||||
connection_pool (2.1.0)
|
||||
coveralls (0.7.0)
|
||||
multi_json (~> 1.3)
|
||||
rest-client
|
||||
simplecov (>= 0.7)
|
||||
term-ansicolor
|
||||
thor
|
||||
crack (0.4.1)
|
||||
safe_yaml (~> 0.9.0)
|
||||
coveralls (0.8.2)
|
||||
json (~> 1.8)
|
||||
rest-client (>= 1.6.8, < 2)
|
||||
simplecov (~> 0.10.0)
|
||||
term-ansicolor (~> 1.3)
|
||||
thor (~> 0.19.1)
|
||||
crack (0.4.2)
|
||||
safe_yaml (~> 1.0.0)
|
||||
creole (0.3.8)
|
||||
d3_rails (3.1.10)
|
||||
d3_rails (3.5.5)
|
||||
railties (>= 3.1.0)
|
||||
daemons (1.1.9)
|
||||
database_cleaner (1.3.0)
|
||||
database_cleaner (1.4.1)
|
||||
debug_inspector (0.0.2)
|
||||
debugger-linecache (1.2.0)
|
||||
default_value_for (3.0.0)
|
||||
|
@ -133,25 +139,35 @@ GEM
|
|||
warden (~> 1.2.3)
|
||||
devise-async (0.9.0)
|
||||
devise (~> 3.2)
|
||||
devise-two-factor (1.0.1)
|
||||
activemodel
|
||||
activesupport
|
||||
attr_encrypted (~> 1.3.2)
|
||||
devise (~> 3.2.4)
|
||||
rails
|
||||
rotp (~> 1.6.1)
|
||||
diff-lcs (1.2.5)
|
||||
diffy (3.0.3)
|
||||
docile (1.1.5)
|
||||
domain_name (0.5.24)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
doorkeeper (2.1.3)
|
||||
railties (>= 3.2)
|
||||
dotenv (0.9.0)
|
||||
dropzonejs-rails (0.4.14)
|
||||
dropzonejs-rails (0.7.1)
|
||||
rails (> 3.1)
|
||||
email_spec (1.5.0)
|
||||
email_spec (1.6.0)
|
||||
launchy (~> 2.1)
|
||||
mail (~> 2.2)
|
||||
encryptor (1.3.0)
|
||||
enumerize (0.7.0)
|
||||
activesupport (>= 3.2)
|
||||
equalizer (0.0.8)
|
||||
erubis (2.7.0)
|
||||
escape_utils (0.2.4)
|
||||
eventmachine (1.0.4)
|
||||
excon (0.32.1)
|
||||
execjs (2.0.2)
|
||||
excon (0.45.3)
|
||||
execjs (2.5.2)
|
||||
expression_parser (0.9.0)
|
||||
factory_girl (4.3.0)
|
||||
activesupport (>= 3.0.0)
|
||||
|
@ -163,31 +179,77 @@ GEM
|
|||
faraday_middleware (0.9.0)
|
||||
faraday (>= 0.7.4, < 0.9)
|
||||
fastercsv (1.5.5)
|
||||
ffaker (1.22.1)
|
||||
ffi (1.9.3)
|
||||
fog (1.21.0)
|
||||
fog-brightbox
|
||||
fog-core (~> 1.21, >= 1.21.1)
|
||||
ffaker (2.0.0)
|
||||
ffi (1.9.8)
|
||||
fission (0.5.0)
|
||||
CFPropertyList (~> 2.2)
|
||||
flowdock (0.7.0)
|
||||
httparty (~> 0.7)
|
||||
multi_json
|
||||
fog (1.25.0)
|
||||
fog-brightbox (~> 0.4)
|
||||
fog-core (~> 1.25)
|
||||
fog-json
|
||||
fog-profitbricks
|
||||
fog-radosgw (>= 0.0.2)
|
||||
fog-sakuracloud (>= 0.0.4)
|
||||
fog-softlayer
|
||||
fog-terremark
|
||||
fog-vmfusion
|
||||
fog-voxel
|
||||
fog-xml (~> 0.1.1)
|
||||
ipaddress (~> 0.5)
|
||||
nokogiri (~> 1.5, >= 1.5.11)
|
||||
fog-brightbox (0.0.1)
|
||||
fog-core
|
||||
opennebula
|
||||
fog-brightbox (0.7.1)
|
||||
fog-core (~> 1.22)
|
||||
fog-json
|
||||
fog-core (1.21.1)
|
||||
inflecto (~> 0.0.2)
|
||||
fog-core (1.30.0)
|
||||
builder
|
||||
excon (~> 0.32)
|
||||
formatador (~> 0.2.0)
|
||||
excon (~> 0.45)
|
||||
formatador (~> 0.2)
|
||||
mime-types
|
||||
net-scp (~> 1.1)
|
||||
net-ssh (>= 2.1.3)
|
||||
fog-json (1.0.0)
|
||||
multi_json (~> 1.0)
|
||||
fog-json (1.0.2)
|
||||
fog-core (~> 1.0)
|
||||
multi_json (~> 1.10)
|
||||
fog-profitbricks (0.0.3)
|
||||
fog-core
|
||||
fog-xml
|
||||
nokogiri
|
||||
fog-radosgw (0.0.4)
|
||||
fog-core (>= 1.21.0)
|
||||
fog-json
|
||||
fog-xml (>= 0.0.1)
|
||||
fog-sakuracloud (1.0.1)
|
||||
fog-core
|
||||
fog-json
|
||||
fog-softlayer (0.4.6)
|
||||
fog-core
|
||||
fog-json
|
||||
fog-terremark (0.1.0)
|
||||
fog-core
|
||||
fog-xml
|
||||
fog-vmfusion (0.1.0)
|
||||
fission
|
||||
fog-core
|
||||
fog-voxel (0.1.0)
|
||||
fog-core
|
||||
fog-xml
|
||||
fog-xml (0.1.2)
|
||||
fog-core
|
||||
nokogiri (~> 1.5, >= 1.5.11)
|
||||
font-awesome-rails (4.2.0.0)
|
||||
railties (>= 3.2, < 5.0)
|
||||
foreman (0.63.0)
|
||||
dotenv (>= 0.7)
|
||||
thor (>= 0.13.6)
|
||||
formatador (0.2.4)
|
||||
formatador (0.2.5)
|
||||
fuubar (2.0.0)
|
||||
rspec (~> 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
gemnasium-gitlab-service (0.2.6)
|
||||
rugged (~> 0.21)
|
||||
gemojione (2.0.0)
|
||||
|
@ -196,7 +258,8 @@ GEM
|
|||
racc
|
||||
github-markup (1.3.1)
|
||||
posix-spawn (~> 0.3.8)
|
||||
gitlab-flowdock-git-hook (0.4.2.2)
|
||||
gitlab-flowdock-git-hook (1.0.1)
|
||||
flowdock (~> 0.7)
|
||||
gitlab-grit (>= 2.4.1)
|
||||
multi_json
|
||||
gitlab-grack (2.0.2)
|
||||
|
@ -212,11 +275,11 @@ GEM
|
|||
mime-types (~> 1.19)
|
||||
gitlab_emoji (0.1.0)
|
||||
gemojione (~> 2.0)
|
||||
gitlab_git (7.1.10)
|
||||
gitlab_git (7.2.15)
|
||||
activesupport (~> 4.0)
|
||||
charlock_holmes (~> 0.6)
|
||||
gitlab-linguist (~> 3.0)
|
||||
rugged (~> 0.21.2)
|
||||
rugged (~> 0.22.2)
|
||||
gitlab_meta (7.0)
|
||||
gitlab_omniauth-ldap (1.2.1)
|
||||
net-ldap (~> 0.9)
|
||||
|
@ -229,7 +292,7 @@ GEM
|
|||
github-markup (~> 1.3.1)
|
||||
gollum-grit_adapter (~> 0.1, >= 0.1.1)
|
||||
nokogiri (~> 1.6.4)
|
||||
rouge (~> 1.7.4)
|
||||
rouge (~> 1.9)
|
||||
sanitize (~> 2.1.0)
|
||||
stringex (~> 2.5.1)
|
||||
gon (5.0.1)
|
||||
|
@ -248,20 +311,7 @@ GEM
|
|||
grape-entity (0.4.2)
|
||||
activesupport
|
||||
multi_json (>= 1.3.2)
|
||||
growl (1.0.3)
|
||||
guard (2.2.4)
|
||||
formatador (>= 0.2.4)
|
||||
listen (~> 2.1)
|
||||
lumberjack (~> 1.0)
|
||||
pry (>= 0.9.12)
|
||||
thor (>= 0.18.1)
|
||||
guard-rspec (4.2.0)
|
||||
guard (>= 2.1.1)
|
||||
rspec (>= 2.14, < 4.0)
|
||||
guard-spinach (0.0.2)
|
||||
guard (>= 1.1)
|
||||
spinach
|
||||
haml (4.0.5)
|
||||
haml (4.0.7)
|
||||
tilt
|
||||
haml-rails (0.5.3)
|
||||
actionpack (>= 4.0.1)
|
||||
|
@ -271,20 +321,17 @@ GEM
|
|||
hashie (2.1.2)
|
||||
highline (1.6.21)
|
||||
hike (1.2.3)
|
||||
hipchat (1.4.0)
|
||||
hipchat (1.5.0)
|
||||
httparty
|
||||
mimemagic
|
||||
hitimes (1.2.2)
|
||||
html-pipeline (1.11.0)
|
||||
activesupport (>= 2)
|
||||
nokogiri (~> 1.4)
|
||||
html-pipeline-gitlab (0.2.0)
|
||||
actionpack (~> 4)
|
||||
gitlab_emoji (~> 0.1)
|
||||
html-pipeline (~> 1.11.0)
|
||||
mime-types
|
||||
sanitize (~> 2.1)
|
||||
http-cookie (1.0.2)
|
||||
domain_name (~> 0.5)
|
||||
http_parser.rb (0.5.3)
|
||||
httparty (0.13.0)
|
||||
httparty (0.13.3)
|
||||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
httpauth (0.2.1)
|
||||
|
@ -292,14 +339,10 @@ GEM
|
|||
i18n (0.7.0)
|
||||
ice_cube (0.11.1)
|
||||
ice_nine (0.10.0)
|
||||
jasmine (2.0.2)
|
||||
jasmine-core (~> 2.0.0)
|
||||
phantomjs
|
||||
rack (>= 1.2.1)
|
||||
rake
|
||||
jasmine-core (2.0.0)
|
||||
jquery-atwho-rails (0.3.3)
|
||||
jquery-rails (3.1.0)
|
||||
inflecto (0.0.2)
|
||||
ipaddress (0.8.0)
|
||||
jquery-atwho-rails (1.0.1)
|
||||
jquery-rails (3.1.3)
|
||||
railties (>= 3.0, < 5.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
jquery-scrollto-rails (1.4.3)
|
||||
|
@ -309,39 +352,42 @@ GEM
|
|||
turbolinks
|
||||
jquery-ui-rails (4.2.1)
|
||||
railties (>= 3.2.16)
|
||||
json (1.8.2)
|
||||
json (1.8.3)
|
||||
jwt (0.1.13)
|
||||
multi_json (>= 1.5)
|
||||
kaminari (0.15.1)
|
||||
actionpack (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
kgio (2.9.2)
|
||||
launchy (2.4.2)
|
||||
launchy (2.4.3)
|
||||
addressable (~> 2.3)
|
||||
letter_opener (1.1.2)
|
||||
launchy (~> 2.2)
|
||||
listen (2.3.1)
|
||||
celluloid (>= 0.15.2)
|
||||
listen (2.10.0)
|
||||
celluloid (~> 0.16.0)
|
||||
rb-fsevent (>= 0.9.3)
|
||||
rb-inotify (>= 0.9)
|
||||
lumberjack (1.0.4)
|
||||
macaddr (1.7.1)
|
||||
systemu (~> 2.6.2)
|
||||
mail (2.6.3)
|
||||
mime-types (>= 1.16, < 3)
|
||||
method_source (0.8.2)
|
||||
mime-types (1.25.1)
|
||||
mini_portile (0.6.1)
|
||||
mimemagic (0.3.0)
|
||||
mini_portile (0.6.2)
|
||||
minitest (5.3.5)
|
||||
mousetrap-rails (1.4.6)
|
||||
multi_json (1.10.1)
|
||||
multi_json (1.11.2)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (1.2.0)
|
||||
mysql2 (0.3.16)
|
||||
net-ldap (0.11)
|
||||
net-scp (1.1.2)
|
||||
net-scp (1.2.1)
|
||||
net-ssh (>= 2.6.5)
|
||||
net-ssh (2.8.0)
|
||||
net-ssh (2.9.2)
|
||||
netrc (0.10.3)
|
||||
newrelic_rpm (3.9.4.245)
|
||||
nokogiri (1.6.5)
|
||||
nokogiri (1.6.6.2)
|
||||
mini_portile (~> 0.6.0)
|
||||
nprogress-rails (0.1.2.3)
|
||||
oauth (0.4.7)
|
||||
|
@ -353,9 +399,9 @@ GEM
|
|||
rack (~> 1.2)
|
||||
octokit (3.7.0)
|
||||
sawyer (~> 0.6.0, >= 0.5.3)
|
||||
omniauth (1.1.4)
|
||||
hashie (>= 1.2, < 3)
|
||||
rack
|
||||
omniauth (1.2.2)
|
||||
hashie (>= 1.2, < 4)
|
||||
rack (~> 1.0)
|
||||
omniauth-bitbucket (0.0.2)
|
||||
multi_json (~> 1.7)
|
||||
omniauth (~> 1.1)
|
||||
|
@ -380,19 +426,25 @@ GEM
|
|||
omniauth-oauth2 (1.1.1)
|
||||
oauth2 (~> 0.8.0)
|
||||
omniauth (~> 1.0)
|
||||
omniauth-saml (1.4.1)
|
||||
omniauth (~> 1.1)
|
||||
ruby-saml (~> 1.0.0)
|
||||
omniauth-shibboleth (1.1.1)
|
||||
omniauth (>= 1.0.0)
|
||||
omniauth-twitter (1.0.1)
|
||||
multi_json (~> 1.3)
|
||||
omniauth-oauth (~> 1.0)
|
||||
opennebula (4.12.1)
|
||||
json
|
||||
nokogiri
|
||||
rbvmomi
|
||||
org-ruby (0.9.12)
|
||||
rubypants (~> 0.2)
|
||||
orm_adapter (0.5.0)
|
||||
parser (2.2.0.2)
|
||||
ast (>= 1.1, < 3.0)
|
||||
pg (0.15.1)
|
||||
phantomjs (1.9.2.0)
|
||||
poltergeist (1.5.1)
|
||||
pg (0.18.2)
|
||||
poltergeist (1.6.0)
|
||||
capybara (~> 2.1)
|
||||
cliver (~> 0.3.1)
|
||||
multi_json (~> 1.0)
|
||||
|
@ -409,10 +461,10 @@ GEM
|
|||
quiet_assets (1.0.2)
|
||||
railties (>= 3.1, < 5.0)
|
||||
racc (1.4.10)
|
||||
rack (1.5.2)
|
||||
rack (1.5.5)
|
||||
rack-accept (0.4.5)
|
||||
rack (>= 0.4)
|
||||
rack-attack (4.2.0)
|
||||
rack-attack (4.3.0)
|
||||
rack
|
||||
rack-cors (0.2.9)
|
||||
rack-mini-profiler (0.9.0)
|
||||
|
@ -429,36 +481,38 @@ GEM
|
|||
rack
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.1.9)
|
||||
actionmailer (= 4.1.9)
|
||||
actionpack (= 4.1.9)
|
||||
actionview (= 4.1.9)
|
||||
activemodel (= 4.1.9)
|
||||
activerecord (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
rails (4.1.11)
|
||||
actionmailer (= 4.1.11)
|
||||
actionpack (= 4.1.11)
|
||||
actionview (= 4.1.11)
|
||||
activemodel (= 4.1.11)
|
||||
activerecord (= 4.1.11)
|
||||
activesupport (= 4.1.11)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.1.9)
|
||||
railties (= 4.1.11)
|
||||
sprockets-rails (~> 2.0)
|
||||
rails-observers (0.1.2)
|
||||
activemodel (~> 4.0)
|
||||
rails_autolink (1.1.6)
|
||||
rails (> 3.1)
|
||||
railties (4.1.9)
|
||||
actionpack (= 4.1.9)
|
||||
activesupport (= 4.1.9)
|
||||
railties (4.1.11)
|
||||
actionpack (= 4.1.11)
|
||||
activesupport (= 4.1.11)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rainbow (2.0.0)
|
||||
raindrops (0.13.0)
|
||||
rake (10.4.2)
|
||||
raphael-rails (2.1.2)
|
||||
rb-fsevent (0.9.3)
|
||||
rb-inotify (0.9.2)
|
||||
rb-fsevent (0.9.4)
|
||||
rb-inotify (0.9.5)
|
||||
ffi (>= 0.5.0)
|
||||
rbvmomi (1.8.2)
|
||||
builder
|
||||
nokogiri (>= 1.4.1)
|
||||
trollop
|
||||
rdoc (3.12.2)
|
||||
json (~> 1.4)
|
||||
redcarpet (3.2.3)
|
||||
redis (3.1.0)
|
||||
redcarpet (3.3.2)
|
||||
redis (3.2.1)
|
||||
redis-actionpack (4.0.0)
|
||||
actionpack (~> 4)
|
||||
redis-rack (~> 1.5.0)
|
||||
|
@ -475,32 +529,42 @@ GEM
|
|||
redis-actionpack (~> 4)
|
||||
redis-activesupport (~> 4)
|
||||
redis-store (~> 1.1.0)
|
||||
redis-store (1.1.4)
|
||||
redis-store (1.1.6)
|
||||
redis (>= 2.2)
|
||||
request_store (1.0.5)
|
||||
rest-client (1.6.7)
|
||||
mime-types (>= 1.16)
|
||||
rerun (0.10.0)
|
||||
listen (~> 2.7, >= 2.7.3)
|
||||
rest-client (1.8.0)
|
||||
http-cookie (>= 1.0.2, < 2.0)
|
||||
mime-types (>= 1.16, < 3.0)
|
||||
netrc (~> 0.7)
|
||||
rinku (1.7.3)
|
||||
rouge (1.7.7)
|
||||
rspec (2.99.0)
|
||||
rspec-core (~> 2.99.0)
|
||||
rspec-expectations (~> 2.99.0)
|
||||
rspec-mocks (~> 2.99.0)
|
||||
rspec-collection_matchers (1.1.2)
|
||||
rspec-expectations (>= 2.99.0.beta1)
|
||||
rspec-core (2.99.2)
|
||||
rspec-expectations (2.99.2)
|
||||
diff-lcs (>= 1.1.3, < 2.0)
|
||||
rspec-mocks (2.99.3)
|
||||
rspec-rails (2.99.0)
|
||||
actionpack (>= 3.0)
|
||||
activemodel (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
railties (>= 3.0)
|
||||
rspec-collection_matchers
|
||||
rspec-core (~> 2.99.0)
|
||||
rspec-expectations (~> 2.99.0)
|
||||
rspec-mocks (~> 2.99.0)
|
||||
rotp (1.6.1)
|
||||
rouge (1.9.1)
|
||||
rqrcode (0.4.2)
|
||||
rqrcode-rails3 (0.1.7)
|
||||
rqrcode (>= 0.4.2)
|
||||
rspec (3.3.0)
|
||||
rspec-core (~> 3.3.0)
|
||||
rspec-expectations (~> 3.3.0)
|
||||
rspec-mocks (~> 3.3.0)
|
||||
rspec-core (3.3.1)
|
||||
rspec-support (~> 3.3.0)
|
||||
rspec-expectations (3.3.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.3.0)
|
||||
rspec-mocks (3.3.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.3.0)
|
||||
rspec-rails (3.3.2)
|
||||
actionpack (>= 3.0, < 4.3)
|
||||
activesupport (>= 3.0, < 4.3)
|
||||
railties (>= 3.0, < 4.3)
|
||||
rspec-core (~> 3.3.0)
|
||||
rspec-expectations (~> 3.3.0)
|
||||
rspec-mocks (~> 3.3.0)
|
||||
rspec-support (~> 3.3.0)
|
||||
rspec-support (3.3.0)
|
||||
rubocop (0.28.0)
|
||||
astrolabe (~> 1.3)
|
||||
parser (>= 2.2.0.pre.7, < 3.0)
|
||||
|
@ -508,6 +572,9 @@ GEM
|
|||
rainbow (>= 1.99.1, < 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
ruby-progressbar (1.7.1)
|
||||
ruby-saml (1.0.0)
|
||||
nokogiri (>= 1.5.10)
|
||||
uuid (~> 2.3)
|
||||
ruby2ruby (2.1.3)
|
||||
ruby_parser (~> 3.1)
|
||||
sexp_processor (~> 4.0)
|
||||
|
@ -515,16 +582,15 @@ GEM
|
|||
sexp_processor (~> 4.1)
|
||||
rubyntlm (0.5.0)
|
||||
rubypants (0.2.0)
|
||||
rugged (0.21.4)
|
||||
rugments (1.0.0.beta6)
|
||||
safe_yaml (0.9.7)
|
||||
rugged (0.22.2)
|
||||
safe_yaml (1.0.4)
|
||||
sanitize (2.1.0)
|
||||
nokogiri (>= 1.4.4)
|
||||
sass (3.2.19)
|
||||
sass-rails (4.0.3)
|
||||
sass-rails (4.0.5)
|
||||
railties (>= 4.0.0, < 5.0)
|
||||
sass (~> 3.2.0)
|
||||
sprockets (~> 2.8, <= 2.11.0)
|
||||
sass (~> 3.2.2)
|
||||
sprockets (~> 2.8, < 3.0)
|
||||
sprockets-rails (~> 2.0)
|
||||
sawyer (0.6.0)
|
||||
addressable (~> 2.3.5)
|
||||
|
@ -532,14 +598,14 @@ GEM
|
|||
sdoc (0.3.20)
|
||||
json (>= 1.1.3)
|
||||
rdoc (~> 3.10)
|
||||
seed-fu (2.3.1)
|
||||
activerecord (>= 3.1, < 4.2)
|
||||
activesupport (>= 3.1, < 4.2)
|
||||
select2-rails (3.5.2)
|
||||
seed-fu (2.3.5)
|
||||
activerecord (>= 3.1, < 4.3)
|
||||
activesupport (>= 3.1, < 4.3)
|
||||
select2-rails (3.5.9.3)
|
||||
thor (~> 0.14)
|
||||
settingslogic (2.0.9)
|
||||
sexp_processor (4.4.5)
|
||||
shoulda-matchers (2.7.0)
|
||||
shoulda-matchers (2.8.0)
|
||||
activesupport (>= 3.0.0)
|
||||
sidekiq (3.3.0)
|
||||
celluloid (>= 0.16.0)
|
||||
|
@ -552,11 +618,11 @@ GEM
|
|||
ice_cube (= 0.11.1)
|
||||
sidekiq (>= 3.0.0)
|
||||
simple_oauth (0.1.9)
|
||||
simplecov (0.9.0)
|
||||
simplecov (0.10.0)
|
||||
docile (~> 1.1.0)
|
||||
multi_json
|
||||
simplecov-html (~> 0.8.0)
|
||||
simplecov-html (0.8.0)
|
||||
json (~> 1.8)
|
||||
simplecov-html (~> 0.10.0)
|
||||
simplecov-html (0.10.0)
|
||||
sinatra (1.4.4)
|
||||
rack (~> 1.4)
|
||||
rack-protection (~> 1.4)
|
||||
|
@ -574,26 +640,35 @@ GEM
|
|||
capybara (>= 2.0.0)
|
||||
railties (>= 3)
|
||||
spinach (>= 0.4)
|
||||
spring (1.3.3)
|
||||
spring (1.3.6)
|
||||
spring-commands-rspec (1.0.4)
|
||||
spring (>= 0.9.1)
|
||||
spring-commands-spinach (1.0.0)
|
||||
spring (>= 0.9.1)
|
||||
sprockets (2.11.0)
|
||||
spring-commands-teaspoon (0.0.2)
|
||||
spring (>= 0.9.1)
|
||||
sprockets (2.12.4)
|
||||
hike (~> 1.2)
|
||||
multi_json (~> 1.0)
|
||||
rack (~> 1.0)
|
||||
tilt (~> 1.1, != 1.3.0)
|
||||
sprockets-rails (2.2.4)
|
||||
sprockets-rails (2.3.2)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
stamp (0.5.0)
|
||||
state_machine (1.2.0)
|
||||
stringex (2.5.2)
|
||||
systemu (2.6.5)
|
||||
task_list (1.0.2)
|
||||
html-pipeline
|
||||
teaspoon (1.0.2)
|
||||
railties (>= 3.2.5, < 5)
|
||||
teaspoon-jasmine (2.2.0)
|
||||
teaspoon (>= 1.0.0)
|
||||
temple (0.6.7)
|
||||
term-ansicolor (1.2.2)
|
||||
tins (~> 0.8)
|
||||
term-ansicolor (1.3.2)
|
||||
tins (~> 1.0)
|
||||
terminal-table (1.4.5)
|
||||
test_after_commit (0.2.2)
|
||||
thin (1.6.1)
|
||||
|
@ -615,8 +690,9 @@ GEM
|
|||
mime-types (~> 1.19)
|
||||
multi_json (~> 1.7)
|
||||
twitter-stream (~> 0.1)
|
||||
tins (0.13.1)
|
||||
turbolinks (2.0.0)
|
||||
tins (1.5.4)
|
||||
trollop (2.1.2)
|
||||
turbolinks (2.5.3)
|
||||
coffee-rails
|
||||
twitter-stream (0.1.16)
|
||||
eventmachine (>= 0.12.8)
|
||||
|
@ -630,13 +706,15 @@ GEM
|
|||
underscore-rails (1.4.4)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.6)
|
||||
unf_ext (0.0.7.1)
|
||||
unicorn (4.6.3)
|
||||
kgio (~> 2.6)
|
||||
rack
|
||||
raindrops (~> 0.7)
|
||||
unicorn-worker-killer (0.4.2)
|
||||
unicorn (~> 4)
|
||||
uuid (2.3.8)
|
||||
macaddr (~> 1.0)
|
||||
version_sorter (2.0.0)
|
||||
virtus (1.0.1)
|
||||
axiom-types (~> 0.0.5)
|
||||
|
@ -645,10 +723,12 @@ GEM
|
|||
equalizer (~> 0.0.7)
|
||||
warden (1.2.3)
|
||||
rack (>= 1.0)
|
||||
webmock (1.16.0)
|
||||
addressable (>= 2.2.7)
|
||||
webmock (1.21.0)
|
||||
addressable (>= 2.3.6)
|
||||
crack (>= 0.3.2)
|
||||
websocket-driver (0.3.3)
|
||||
websocket-driver (0.5.4)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.2)
|
||||
wikicloth (0.8.1)
|
||||
builder
|
||||
expression_parser
|
||||
|
@ -666,65 +746,64 @@ DEPENDENCIES
|
|||
addressable
|
||||
annotate (~> 2.6.0.beta2)
|
||||
asana (~> 0.0.6)
|
||||
asciidoctor (= 0.1.4)
|
||||
asciidoctor (~> 1.5.2)
|
||||
attr_encrypted (= 1.3.4)
|
||||
awesome_print
|
||||
better_errors
|
||||
binding_of_caller
|
||||
bootstrap-sass (~> 3.0)
|
||||
brakeman
|
||||
browser
|
||||
browser (~> 0.8.0)
|
||||
byebug
|
||||
cal-heatmap-rails (~> 0.0.1)
|
||||
capybara (~> 2.2.1)
|
||||
capybara (~> 2.4.0)
|
||||
capybara-screenshot (~> 1.0.0)
|
||||
carrierwave
|
||||
charlock_holmes
|
||||
coffee-rails
|
||||
colored
|
||||
coveralls
|
||||
coveralls (~> 0.8.2)
|
||||
creole (~> 0.3.6)
|
||||
d3_rails (~> 3.1.4)
|
||||
database_cleaner
|
||||
d3_rails (~> 3.5.5)
|
||||
database_cleaner (~> 1.4.0)
|
||||
default_value_for (~> 3.0.0)
|
||||
devise (= 3.2.4)
|
||||
devise-async (= 0.9.0)
|
||||
devise-two-factor
|
||||
diffy (~> 3.0.3)
|
||||
doorkeeper (= 2.1.3)
|
||||
dropzonejs-rails
|
||||
email_spec
|
||||
email_spec (~> 1.6.0)
|
||||
enumerize
|
||||
factory_girl_rails
|
||||
ffaker
|
||||
fog (~> 1.14)
|
||||
ffaker (~> 2.0.0)
|
||||
fog (~> 1.25.0)
|
||||
font-awesome-rails (~> 4.2)
|
||||
foreman
|
||||
fuubar (~> 2.0.0)
|
||||
gemnasium-gitlab-service (~> 0.2)
|
||||
github-markup
|
||||
gitlab-flowdock-git-hook (~> 0.4.2)
|
||||
gitlab-flowdock-git-hook (~> 1.0.1)
|
||||
gitlab-grack (~> 2.0.2)
|
||||
gitlab-linguist (~> 3.0.1)
|
||||
gitlab_emoji (~> 0.1)
|
||||
gitlab_git (~> 7.1.10)
|
||||
gitlab_git (~> 7.2.15)
|
||||
gitlab_meta (= 7.0)
|
||||
gitlab_omniauth-ldap (= 1.2.1)
|
||||
gollum-lib (~> 4.0.2)
|
||||
gon (~> 5.0.0)
|
||||
grape (~> 0.6.1)
|
||||
grape-entity (~> 0.4.2)
|
||||
growl
|
||||
guard-rspec
|
||||
guard-spinach
|
||||
haml-rails
|
||||
hipchat (~> 1.4.0)
|
||||
html-pipeline-gitlab (~> 0.1)
|
||||
hipchat (~> 1.5.0)
|
||||
html-pipeline (~> 1.11.0)
|
||||
httparty
|
||||
jasmine (= 2.0.2)
|
||||
jquery-atwho-rails (~> 0.3.3)
|
||||
jquery-rails
|
||||
jquery-atwho-rails (~> 1.0.0)
|
||||
jquery-rails (= 3.1.3)
|
||||
jquery-scrollto-rails
|
||||
jquery-turbolinks
|
||||
jquery-ui-rails
|
||||
kaminari (~> 0.15.1)
|
||||
launchy
|
||||
letter_opener
|
||||
minitest (~> 5.3.0)
|
||||
mousetrap-rails
|
||||
|
@ -732,42 +811,41 @@ DEPENDENCIES
|
|||
newrelic_rpm
|
||||
nprogress-rails
|
||||
octokit (= 3.7.0)
|
||||
omniauth (~> 1.1.3)
|
||||
omniauth (~> 1.2.2)
|
||||
omniauth-bitbucket
|
||||
omniauth-github
|
||||
omniauth-gitlab
|
||||
omniauth-google-oauth2
|
||||
omniauth-kerberos
|
||||
omniauth-saml (~> 1.4.0)
|
||||
omniauth-shibboleth
|
||||
omniauth-twitter
|
||||
org-ruby (= 0.9.12)
|
||||
pg
|
||||
poltergeist (~> 1.5.1)
|
||||
poltergeist (~> 1.6.0)
|
||||
pry-rails
|
||||
quiet_assets (~> 1.0.1)
|
||||
rack-attack
|
||||
rack-attack (~> 4.3.0)
|
||||
rack-cors
|
||||
rack-mini-profiler
|
||||
rack-oauth2 (~> 1.0.5)
|
||||
rails (~> 4.1.0)
|
||||
rails_autolink (~> 1.1)
|
||||
rails (= 4.1.11)
|
||||
raphael-rails (~> 2.1.2)
|
||||
rb-fsevent
|
||||
rb-inotify
|
||||
rdoc (~> 3.6)
|
||||
redcarpet (~> 3.2.3)
|
||||
redcarpet (~> 3.3.2)
|
||||
redis-rails
|
||||
request_store
|
||||
rspec-rails (= 2.99)
|
||||
rerun (~> 0.10.0)
|
||||
rqrcode-rails3
|
||||
rspec-rails (~> 3.3.0)
|
||||
rubocop (= 0.28.0)
|
||||
rugments
|
||||
sanitize (~> 2.0)
|
||||
sass-rails (~> 4.0.2)
|
||||
sass-rails (~> 4.0.5)
|
||||
sdoc
|
||||
seed-fu
|
||||
select2-rails
|
||||
select2-rails (~> 3.5.9)
|
||||
settingslogic
|
||||
shoulda-matchers (~> 2.7.0)
|
||||
shoulda-matchers (~> 2.8.0)
|
||||
sidekiq (~> 3.3)
|
||||
sidetiq (= 0.6.3)
|
||||
simplecov
|
||||
|
@ -777,14 +855,19 @@ DEPENDENCIES
|
|||
slim
|
||||
spinach-rails
|
||||
spring (~> 1.3.1)
|
||||
spring-commands-rspec (= 1.0.4)
|
||||
spring-commands-spinach (= 1.0.0)
|
||||
spring-commands-rspec (~> 1.0.0)
|
||||
spring-commands-spinach (~> 1.0.0)
|
||||
spring-commands-teaspoon (~> 0.0.2)
|
||||
sprockets (~> 2.12.3)
|
||||
stamp
|
||||
state_machine
|
||||
task_list (= 1.0.2)
|
||||
teaspoon (~> 1.0.0)
|
||||
teaspoon-jasmine
|
||||
test_after_commit
|
||||
thin
|
||||
tinder (~> 1.9.2)
|
||||
turbolinks
|
||||
turbolinks (~> 2.5.0)
|
||||
uglifier
|
||||
underscore-rails (~> 1.4.4)
|
||||
unf
|
||||
|
@ -792,5 +875,8 @@ DEPENDENCIES
|
|||
unicorn-worker-killer
|
||||
version_sorter
|
||||
virtus
|
||||
webmock
|
||||
webmock (~> 1.21.0)
|
||||
wikicloth (= 0.8.1)
|
||||
|
||||
BUNDLED WITH
|
||||
1.10.6
|
||||
|
|
27
Guardfile
|
@ -1,27 +0,0 @@
|
|||
# A sample Guardfile
|
||||
# More info at https://github.com/guard/guard#readme
|
||||
|
||||
guard 'rspec', cmd: "spring rspec", all_on_start: false, all_after_pass: false do
|
||||
watch(%r{^spec/.+_spec\.rb$})
|
||||
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
||||
watch(%r{^lib/api/(.+)\.rb$}) { |m| "spec/requests/api/#{m[1]}_spec.rb" }
|
||||
watch('spec/spec_helper.rb') { "spec" }
|
||||
|
||||
# Rails example
|
||||
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
||||
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
||||
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
||||
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
||||
watch('config/routes.rb') { "spec/routing" }
|
||||
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
||||
|
||||
# Capybara request specs
|
||||
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
||||
end
|
||||
|
||||
guard 'spinach', command_prefix: 'spring' do
|
||||
watch(%r|^features/(.*)\.feature|)
|
||||
watch(%r|^features/steps/(.*)([^/]+)\.rb|) do |m|
|
||||
"features/#{m[1]}#{m[2]}.feature"
|
||||
end
|
||||
end
|
80
README.md
|
@ -1,8 +1,17 @@
|
|||
# ![logo](https://about.gitlab.com/images/gitlab_logo.png) GitLab
|
||||
# GitLab
|
||||
|
||||
[![build status](https://ci.gitlab.com/projects/1/status.png?ref=master)](https://ci.gitlab.com/projects/1?ref=master)
|
||||
[![Build Status](https://semaphoreci.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/400484/shields_badge.svg)](https://semaphoreci.com/gitlabhq/gitlabhq)
|
||||
[![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq)
|
||||
[![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master)
|
||||
|
||||
## Canonical source
|
||||
|
||||
The source of GitLab Community Edition is [hosted on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/) and there are mirrors to make [contributing](CONTRIBUTING.md) as easy as possible.
|
||||
|
||||
## Open source software to collaborate on code
|
||||
|
||||
![Animated screenshots](https://about.gitlab.com/images/animated/compiled.gif)
|
||||
To see how GitLab looks please see the [features page on our website](https://about.gitlab.com/features/).
|
||||
|
||||
- Manage Git repositories with fine grained access controls that keep your code secure
|
||||
- Perform code reviews and enhance collaboration with merge requests
|
||||
|
@ -13,25 +22,12 @@
|
|||
|
||||
## Editions
|
||||
|
||||
There are two editions of GitLab.
|
||||
*GitLab [Community Edition](https://about.gitlab.com/features/) (CE)* is available without any costs under an MIT license.
|
||||
There are two editions of GitLab:
|
||||
|
||||
*GitLab Enterprise Edition (EE)* includes [extra features](https://about.gitlab.com/features/#compare) that are most useful for organizations with more than 100 users.
|
||||
To get access to the EE and support please [become a subscriber](https://about.gitlab.com/pricing/).
|
||||
- GitLab Community Edition (CE) is available freely under the MIT Expat license.
|
||||
- GitLab Enterprise Edition (EE) includes [extra features](https://about.gitlab.com/features/#compare) that are more useful for organizations with more than 100 users. To use EE and get official support please [become a subscriber](https://about.gitlab.com/pricing/).
|
||||
|
||||
## Canonical source
|
||||
|
||||
The source of GitLab Community Edition is [hosted on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/) and there are mirrors to make [contributing](CONTRIBUTING.md) as easy as possible.
|
||||
|
||||
## Code status
|
||||
|
||||
- [![build status](https://ci.gitlab.org/projects/1/status.png?ref=master)](https://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch)
|
||||
|
||||
- [![Build Status](https://semaphoreapp.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/243338/badge.png)](https://semaphoreapp.com/gitlabhq/gitlabhq)
|
||||
|
||||
- [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq)
|
||||
|
||||
- [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master)
|
||||
Included with the GitLab Omnibus Packages is [GitLab CI](https://about.gitlab.com/gitlab-ci/) that can easily build, test and deploy code.
|
||||
|
||||
## Website
|
||||
|
||||
|
@ -46,24 +42,40 @@ On [about.gitlab.com](https://about.gitlab.com/) you can find more information a
|
|||
|
||||
## Requirements
|
||||
|
||||
GitLab requires the following software:
|
||||
|
||||
- Ubuntu/Debian/CentOS/RHEL
|
||||
- Ruby (MRI) 2.0 or 2.1
|
||||
- Git 1.7.10+
|
||||
- Redis 2.0+
|
||||
- MySQL or PostgreSQL
|
||||
|
||||
Please see the [requirements documentation](doc/install/requirements.md) for system requirements and more information about the supported operating systems.
|
||||
|
||||
## Installation
|
||||
|
||||
The recommended way to install GitLab is using the provided [Omnibus packages](https://about.gitlab.com/downloads/). Compared to an installation from source, this is faster and less error prone. Just select your operating system, download the respective package (Debian or RPM) and install it using the system's package manager.
|
||||
The recommended way to install GitLab is with the [Omnibus packages](https://about.gitlab.com/downloads/) on our package server.
|
||||
Compared to an installation from source, this is faster and less error prone.
|
||||
Just select your operating system, download the respective package (Debian or RPM) and install it using the system's package manager.
|
||||
|
||||
There are various other options to install GitLab, please refer to the [installation page on the GitLab website](https://about.gitlab.com/installation/) for more information.
|
||||
|
||||
You can access a new installation with the login **`root`** and password **`5iveL!fe`**, after login you are required to set a unique password.
|
||||
|
||||
## Install a development environment
|
||||
|
||||
To work on GitLab itself, we recommend setting up your development environment with [the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit).
|
||||
If you do not use the GitLab Development Kit you need to install and setup all the dependencies yourself, this is a lot of work and error prone.
|
||||
One small thing you also have to do when installing it yourself is to copy the example development unicorn configuration file:
|
||||
|
||||
cp config/unicorn.rb.example.development config/unicorn.rb
|
||||
|
||||
Instructions on how to start GitLab and how to run the tests can be found in the [development section of the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit#development).
|
||||
|
||||
## Software stack
|
||||
|
||||
GitLab is a Ruby on Rails application that runs on the following software:
|
||||
|
||||
- Ubuntu/Debian/CentOS/RHEL
|
||||
- Ruby (MRI) 2.1
|
||||
- Git 1.7.10+
|
||||
- Redis 2.0+
|
||||
- MySQL or PostgreSQL
|
||||
|
||||
For more information please see the [architecture documentation](http://doc.gitlab.com/ce/development/architecture.html).
|
||||
|
||||
## Third-party applications
|
||||
|
||||
There are a lot of [third-party applications integrating with GitLab](https://about.gitlab.com/applications/). These include GUI Git clients, mobile applications and API wrappers for various languages.
|
||||
|
@ -74,17 +86,7 @@ Since 2011 a minor or major version of GitLab is released on the 22nd of every m
|
|||
|
||||
## Upgrading
|
||||
|
||||
For updating the Omnibus installation please see the [update documentation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/update.md). For installations from source there is an [upgrader script](doc/update/upgrader.md) and there are [upgrade guides](doc/update) detailing all necessary commands to migrate to the next version.
|
||||
|
||||
## Install a development environment
|
||||
|
||||
To work on GitLab itself, we recommend setting up your development environment with [the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit).
|
||||
If you do not use the GitLab Development Kit you need to install and setup all the dependencies yourself, this is a lot of work and error prone.
|
||||
One small thing you also have to do when installing it yourself is to copy the example development unicorn configuration file:
|
||||
|
||||
cp config/unicorn.rb.example.development config/unicorn.rb
|
||||
|
||||
Instructions on how to start GitLab and how to run the tests can be found in the [development section of the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit#development).
|
||||
For upgrading information please see our [update page](https://about.gitlab.com/update/).
|
||||
|
||||
## Documentation
|
||||
|
||||
|
|
2
VERSION
|
@ -1 +1 @@
|
|||
7.10.0
|
||||
7.14.3
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
BIN
app/assets/images/auth_buttons/github_64.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
app/assets/images/auth_buttons/gitlab_64.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
app/assets/images/auth_buttons/google_64.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
app/assets/images/auth_buttons/twitter_64.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 7.5 KiB |
26
app/assets/images/logo.svg
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="210px" height="210px" viewBox="0 0 210 210" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
||||
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Slice 1</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
||||
<g id="logo" sketch:type="MSLayerGroup" transform="translate(0.000000, 10.000000)">
|
||||
<g id="Page-1" sketch:type="MSShapeGroup">
|
||||
<g id="Fill-1-+-Group-24">
|
||||
<g id="Group-24">
|
||||
<g id="Group">
|
||||
<path d="M105.0614,193.655 L105.0614,193.655 L143.7014,74.734 L66.4214,74.734 L105.0614,193.655 L105.0614,193.655 Z" id="Fill-4" fill="#E24329"></path>
|
||||
<path d="M105.0614,193.6548 L66.4214,74.7338 L12.2684,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-8" fill="#FC6D26"></path>
|
||||
<path d="M12.2685,74.7341 L12.2685,74.7341 L0.5265,110.8731 C-0.5445,114.1691 0.6285,117.7801 3.4325,119.8171 L105.0615,193.6551 L12.2685,74.7341 L12.2685,74.7341 Z" id="Fill-12" fill="#FCA326"></path>
|
||||
<path d="M12.2685,74.7342 L66.4215,74.7342 L43.1485,3.1092 C41.9515,-0.5768 36.7375,-0.5758 35.5405,3.1092 L12.2685,74.7342 L12.2685,74.7342 Z" id="Fill-16" fill="#E24329"></path>
|
||||
<path d="M105.0614,193.6548 L143.7014,74.7338 L197.8544,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-18" fill="#FC6D26"></path>
|
||||
<path d="M197.8544,74.7341 L197.8544,74.7341 L209.5964,110.8731 C210.6674,114.1691 209.4944,117.7801 206.6904,119.8171 L105.0614,193.6551 L197.8544,74.7341 L197.8544,74.7341 Z" id="Fill-20" fill="#FCA326"></path>
|
||||
<path d="M197.8544,74.7342 L143.7014,74.7342 L166.9744,3.1092 C168.1714,-0.5768 173.3854,-0.5758 174.5824,3.1092 L197.8544,74.7342 L197.8544,74.7342 Z" id="Fill-22" fill="#E24329"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
26
app/assets/images/logo_wordmark.svg
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="546px" height="194px" viewBox="0 0 546 194" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
||||
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Fill 1 + Group 24</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
||||
<g id="Fill-1-+-Group-24" sketch:type="MSLayerGroup">
|
||||
<g id="Group-24" sketch:type="MSShapeGroup">
|
||||
<path d="M316.7906,65.3001 C301.5016,65.3001 292.0046,77.4461 292.0046,97.0001 C292.0046,116.5541 301.5016,128.7001 316.7906,128.7001 C322.5346,128.7001 327.8716,127.0711 332.2226,123.9881 L332.4336,123.8391 L332.4336,101.8711 L310.4336,101.8711 L310.4336,94.0711 L341.4336,94.0711 L341.4336,126.8061 C334.8706,133.1501 326.3546,136.5001 316.7906,136.5001 C296.2666,136.5001 283.0046,120.9951 283.0046,97.0001 C283.0046,73.0051 296.2666,57.5001 316.7906,57.5001 C326.7826,57.5001 335.2176,61.1481 341.2206,68.0561 L335.2246,73.0381 C330.6986,67.9041 324.4986,65.3001 316.7906,65.3001 L316.7906,65.3001 Z M489.8836,135.2501 L482.9356,135.2501 L480.6016,128.8021 L480.0486,129.2991 C479.9716,129.3681 472.2196,136.2501 462.4606,136.2501 C452.6096,136.2501 445.4606,129.6961 445.4606,120.6671 C445.4606,107.5951 456.7446,104.8511 466.2096,104.8511 C473.5836,104.8511 480.1886,106.5111 480.2546,106.5281 L480.8776,106.6871 L480.8776,105.1011 C480.8776,97.9861 476.4356,94.3781 467.6726,94.3781 C462.3646,94.3781 456.7556,95.6891 451.4236,98.1701 L447.8206,91.9581 C452.5266,88.8961 459.6726,85.3781 467.6726,85.3781 C481.5806,85.3781 489.8836,92.9341 489.8836,105.5891 L489.8836,135.2501 Z M470.6886,111.7771 C460.0716,111.7771 454.4606,114.8511 454.4606,120.6671 C454.4606,124.7281 457.5256,127.2501 462.4606,127.2501 C470.5906,127.2501 477.7276,123.9181 480.6626,121.9481 L480.8836,121.8001 L480.8836,112.6201 L480.4676,112.5491 C480.4226,112.5411 475.8766,111.7771 470.6886,111.7771 L470.6886,111.7771 Z M440.4576,127.4501 L440.4576,135.2501 L410.4606,135.2501 L410.4606,61.2501 L419.4606,61.2501 L419.4606,127.4501 L440.4576,127.4501 Z M520.9416,136.5001 C515.0966,136.5001 508.6886,135.6961 501.8926,134.1091 L501.8926,61.2501 L510.8926,61.2501 L510.8926,89.3131 L511.6656,88.8111 C511.7146,88.7791 516.7346,85.5711 523.6536,85.5711 C525.0336,85.5711 526.4146,85.7001 527.7486,85.9521 C539.0936,88.2761 545.8666,97.4301 545.8666,110.4391 C545.8666,125.7831 535.6176,136.5001 520.9416,136.5001 L520.9416,136.5001 Z M521.9426,94.3781 C518.3636,94.3781 514.6196,95.6031 511.1166,97.9191 L510.8926,98.0681 L510.8926,127.9021 L511.3196,127.9651 C514.6986,128.4601 517.9356,128.7121 520.9416,128.7121 C530.3176,128.7121 536.8666,121.1971 536.8666,110.4391 C536.8666,100.2321 531.4266,94.3781 521.9426,94.3781 L521.9426,94.3781 Z M398.4516,86.2501 L398.4516,94.0501 L383.4516,94.0501 L383.4516,116.9501 C383.4516,119.7551 384.5436,122.3921 386.5276,124.3741 C388.5096,126.3581 391.1466,127.4501 393.9516,127.4501 L398.4516,127.4501 L398.4516,135.2501 L393.9516,135.2501 C383.1996,135.2501 374.4516,126.5021 374.4516,115.7501 L374.4516,61.2501 L383.4516,61.2501 L383.4516,86.2501 L398.4516,86.2501 Z M353.4426,66.2501 L362.4426,66.2501 L362.4426,75.2501 L353.4426,75.2501 L353.4426,66.2501 Z M353.4426,86.2501 L362.4426,86.2501 L362.4426,135.2501 L353.4426,135.2501 L353.4426,86.2501 Z" id="Fill-2" fill="#8C929D"></path>
|
||||
<g id="Group">
|
||||
<path d="M105.0614,193.655 L105.0614,193.655 L143.7014,74.734 L66.4214,74.734 L105.0614,193.655 L105.0614,193.655 Z" id="Fill-4" fill="#E24329"></path>
|
||||
<path id="Fill-6" fill="#FC6D26"></path>
|
||||
<path d="M105.0614,193.6548 L66.4214,74.7338 L12.2684,74.7338 L105.0614,193.6548 Z" id="Fill-8" fill="#FC6D26"></path>
|
||||
<path id="Fill-10" fill="#FC6D26"></path>
|
||||
<path d="M12.2685,74.7341 L12.2685,74.7341 L0.5265,110.8731 C-0.5445,114.1691 0.6285,117.7801 3.4325,119.8171 L105.0615,193.6551 L12.2685,74.7341 Z" id="Fill-12" fill="#FCA326"></path>
|
||||
<path id="Fill-14" fill="#FC6D26"></path>
|
||||
<path d="M12.2685,74.7342 L66.4215,74.7342 L43.1485,3.1092 C41.9515,-0.5768 36.7375,-0.5758 35.5405,3.1092 L12.2685,74.7342 Z" id="Fill-16" fill="#E24329"></path>
|
||||
<path d="M105.0614,193.6548 L143.7014,74.7338 L197.8544,74.7338 L105.0614,193.6548 Z" id="Fill-18" fill="#FC6D26"></path>
|
||||
<path d="M197.8544,74.7341 L197.8544,74.7341 L209.5964,110.8731 C210.6674,114.1691 209.4944,117.7801 206.6904,119.8171 L105.0614,193.6551 L197.8544,74.7341 Z" id="Fill-20" fill="#FCA326"></path>
|
||||
<path d="M197.8544,74.7342 L143.7014,74.7342 L166.9744,3.1092 C168.1714,-0.5768 173.3854,-0.5758 174.5824,3.1092 L197.8544,74.7342 Z" id="Fill-22" fill="#E24329"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5 KiB |
BIN
app/assets/images/msapplication-tile.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
app/assets/images/touch-icon-ipad-retina.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
app/assets/images/touch-icon-ipad.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
app/assets/images/touch-icon-iphone-retina.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
app/assets/images/touch-icon-iphone.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
|
@ -16,7 +16,6 @@
|
|||
#= require jquery.scrollTo
|
||||
#= require jquery.blockUI
|
||||
#= require jquery.turbolinks
|
||||
#= require jquery.sticky-kit.min
|
||||
#= require turbolinks
|
||||
#= require autosave
|
||||
#= require bootstrap
|
||||
|
@ -38,9 +37,10 @@
|
|||
#= require shortcuts
|
||||
#= require shortcuts_navigation
|
||||
#= require shortcuts_dashboard_navigation
|
||||
#= require shortcuts_issueable
|
||||
#= require shortcuts_issuable
|
||||
#= require shortcuts_network
|
||||
#= require cal-heatmap
|
||||
#= require jquery.nicescroll.min
|
||||
#= require_tree .
|
||||
|
||||
window.slugify = (text) ->
|
||||
|
@ -49,8 +49,6 @@ window.slugify = (text) ->
|
|||
window.ajaxGet = (url) ->
|
||||
$.ajax({type: "GET", url: url, dataType: "script"})
|
||||
|
||||
window.showAndHide = (selector) ->
|
||||
|
||||
window.split = (val) ->
|
||||
return val.split( /,\s*/ )
|
||||
|
||||
|
@ -92,15 +90,7 @@ window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) ->
|
|||
window.sanitize = (str) ->
|
||||
return str.replace(/<(?:.|\n)*?>/gm, '')
|
||||
|
||||
window.linkify = (str) ->
|
||||
exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
|
||||
return str.replace(exp,"<a href='$1'>$1</a>")
|
||||
|
||||
window.simpleFormat = (str) ->
|
||||
linkify(sanitize(str).replace(/\n/g, '<br />'))
|
||||
|
||||
window.unbindEvents = ->
|
||||
$(document).unbind('scroll')
|
||||
$(document).off('scroll')
|
||||
|
||||
window.shiftWindow = ->
|
||||
|
@ -115,12 +105,23 @@ if location.hash
|
|||
window.addEventListener "hashchange", shiftWindow
|
||||
|
||||
$ ->
|
||||
# Click a .one_click_select field, select the contents
|
||||
$(".one_click_select").on 'click', -> $(@).select()
|
||||
$(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF")
|
||||
|
||||
# Click a .js-select-on-focus field, select the contents
|
||||
$(".js-select-on-focus").on "focusin", ->
|
||||
# Prevent a mouseup event from deselecting the input
|
||||
$(this).select().one 'mouseup', (e) ->
|
||||
e.preventDefault()
|
||||
|
||||
$('.remove-row').bind 'ajax:success', ->
|
||||
$(this).closest('li').fadeOut()
|
||||
|
||||
$('.js-remove-tr').bind 'ajax:before', ->
|
||||
$(this).hide()
|
||||
|
||||
$('.js-remove-tr').bind 'ajax:success', ->
|
||||
$(this).closest('tr').fadeOut()
|
||||
|
||||
# Initialize select2 selects
|
||||
$('select.select2').select2(width: 'resolve', dropdownAutoWidth: true)
|
||||
|
||||
|
@ -132,17 +133,23 @@ $ ->
|
|||
), 1
|
||||
|
||||
# Initialize tooltips
|
||||
$('.has_tooltip').tooltip()
|
||||
|
||||
# Bottom tooltip
|
||||
$('.has_bottom_tooltip').tooltip(placement: 'bottom')
|
||||
$('body').tooltip({
|
||||
selector: '.has_tooltip, [data-toggle="tooltip"], .page-sidebar-collapsed .nav-sidebar a'
|
||||
placement: (_, el) ->
|
||||
$el = $(el)
|
||||
if $el.attr('id') == 'js-shortcuts-home'
|
||||
# Place the logo tooltip on the right when collapsed, bottom when expanded
|
||||
$el.parents('header').hasClass('header-collapsed') and 'right' or 'bottom'
|
||||
else
|
||||
# Otherwise use the data-placement attribute, or 'bottom' if undefined
|
||||
$el.data('placement') or 'bottom'
|
||||
})
|
||||
|
||||
# Form submitter
|
||||
$('.trigger-submit').on 'change', ->
|
||||
$(@).parents('form').submit()
|
||||
|
||||
$("abbr.timeago").timeago()
|
||||
$('.js-timeago').timeago()
|
||||
$('abbr.timeago, .js-timeago').timeago()
|
||||
|
||||
# Flash
|
||||
if (flash = $(".flash-container")).length > 0
|
||||
|
@ -163,9 +170,14 @@ $ ->
|
|||
$('.account-box').hover -> $(@).toggleClass('hover')
|
||||
|
||||
# Commit show suppressed diff
|
||||
$(".diff-content").on "click", ".supp_diff_link", ->
|
||||
$(@).next('table').show()
|
||||
$(@).remove()
|
||||
$(document).on 'click', '.diff-content .js-show-suppressed-diff', ->
|
||||
$container = $(@).parent()
|
||||
$container.next('table').show()
|
||||
$container.remove()
|
||||
|
||||
$('.navbar-toggle').on 'click', ->
|
||||
$('.header-content .title').toggle()
|
||||
$('.header-content .navbar-collapse').toggle()
|
||||
|
||||
# Show/hide comments on diff
|
||||
$("body").on "click", ".js-toggle-diff-comments", (e) ->
|
||||
|
@ -173,6 +185,7 @@ $ ->
|
|||
$(@).closest(".diff-file").find(".notes_holder").toggle()
|
||||
e.preventDefault()
|
||||
|
||||
$(document).off "click", '.js-confirm-danger'
|
||||
$(document).on "click", '.js-confirm-danger', (e) ->
|
||||
e.preventDefault()
|
||||
btn = $(e.target)
|
||||
|
@ -181,14 +194,3 @@ $ ->
|
|||
new ConfirmDangerModal(form, text)
|
||||
|
||||
new Aside()
|
||||
|
||||
(($) ->
|
||||
# Disable an element and add the 'disabled' Bootstrap class
|
||||
$.fn.extend disable: ->
|
||||
$(@).attr('disabled', 'disabled').addClass('disabled')
|
||||
|
||||
# Enable an element and remove the 'disabled' Bootstrap class
|
||||
$.fn.extend enable: ->
|
||||
$(@).removeAttr('disabled').removeClass('disabled')
|
||||
|
||||
)(jQuery)
|
||||
|
|
39
app/assets/javascripts/behaviors/requires_input.js.coffee
Normal file
|
@ -0,0 +1,39 @@
|
|||
# Requires Input behavior
|
||||
#
|
||||
# When called on a form with input fields with the `required` attribute, the
|
||||
# form's submit button will be disabled until all required fields have values.
|
||||
#
|
||||
#= require extensions/jquery
|
||||
#
|
||||
# ### Example Markup
|
||||
#
|
||||
# <form class="js-requires-input">
|
||||
# <input type="text" required="required">
|
||||
# <input type="submit" value="Submit">
|
||||
# </form>
|
||||
#
|
||||
$.fn.requiresInput = ->
|
||||
$form = $(this)
|
||||
$button = $('button[type=submit], input[type=submit]', $form)
|
||||
|
||||
required = '[required=required]'
|
||||
fieldSelector = "input#{required}, select#{required}, textarea#{required}"
|
||||
|
||||
requireInput = ->
|
||||
# Collect the input values of *all* required fields
|
||||
values = _.map $(fieldSelector, $form), (field) -> field.value
|
||||
|
||||
# Disable the button if any required fields are empty
|
||||
if values.length && _.any(values, _.isEmpty)
|
||||
$button.disable()
|
||||
else
|
||||
$button.enable()
|
||||
|
||||
# Set initial button state
|
||||
requireInput()
|
||||
|
||||
$form.on 'change input', fieldSelector, requireInput
|
||||
|
||||
# Triggered on standard document `ready` and on Turbolinks `page:load` events
|
||||
$(document).on 'ready page:load', ->
|
||||
$('form.js-requires-input').requiresInput()
|
|
@ -1,21 +0,0 @@
|
|||
window.updateTaskState = (taskableType) ->
|
||||
objType = taskableType.data
|
||||
isChecked = $(this).prop("checked")
|
||||
if $(this).is(":checked")
|
||||
stateEvent = "task_check"
|
||||
else
|
||||
stateEvent = "task_uncheck"
|
||||
|
||||
taskableUrl = $("form.edit-" + objType).first().attr("action")
|
||||
taskableNum = taskableUrl.match(/\d+$/)
|
||||
taskNum = 0
|
||||
$("li.task-list-item input:checkbox").each( (index, e) =>
|
||||
if e == this
|
||||
taskNum = index + 1
|
||||
)
|
||||
|
||||
$.ajax
|
||||
type: "PATCH"
|
||||
url: taskableUrl
|
||||
data: objType + "[state_event]=" + stateEvent +
|
||||
"&" + objType + "[task_num]=" + taskNum
|
|
@ -1,73 +0,0 @@
|
|||
class @BlobView
|
||||
constructor: ->
|
||||
# handle multi-line select
|
||||
handleMultiSelect = (e) ->
|
||||
[ first_line, last_line ] = parseSelectedLines()
|
||||
[ line_number ] = parseSelectedLines($(this).attr("id"))
|
||||
hash = "L#{line_number}"
|
||||
|
||||
if e.shiftKey and not isNaN(first_line) and not isNaN(line_number)
|
||||
if line_number < first_line
|
||||
last_line = first_line
|
||||
first_line = line_number
|
||||
else
|
||||
last_line = line_number
|
||||
|
||||
hash = if first_line == last_line then "L#{first_line}" else "L#{first_line}-#{last_line}"
|
||||
|
||||
setHash(hash)
|
||||
e.preventDefault()
|
||||
|
||||
# See if there are lines selected
|
||||
# "#L12" and "#L34-56" supported
|
||||
highlightBlobLines = (e) ->
|
||||
[ first_line, last_line ] = parseSelectedLines()
|
||||
|
||||
unless isNaN first_line
|
||||
$("#tree-content-holder .highlight .line").removeClass("hll")
|
||||
$("#LC#{line}").addClass("hll") for line in [first_line..last_line]
|
||||
$.scrollTo("#L#{first_line}", offset: -50) unless e?
|
||||
|
||||
# parse selected lines from hash
|
||||
# always return first and last line (initialized to NaN)
|
||||
parseSelectedLines = (str) ->
|
||||
first_line = NaN
|
||||
last_line = NaN
|
||||
hash = str || window.location.hash
|
||||
|
||||
if hash isnt ""
|
||||
matches = hash.match(/\#?L(\d+)(\-(\d+))?/)
|
||||
first_line = parseInt(matches?[1])
|
||||
last_line = parseInt(matches?[3])
|
||||
last_line = first_line if isNaN(last_line)
|
||||
|
||||
[ first_line, last_line ]
|
||||
|
||||
setHash = (hash) ->
|
||||
hash = hash.replace(/^\#/, "")
|
||||
nodes = $("#" + hash)
|
||||
# if any nodes are using this id, they must be temporarily changed
|
||||
# also, add a temporary div at the top of the screen to prevent scrolling
|
||||
if nodes.length > 0
|
||||
scroll_top = $(document).scrollTop()
|
||||
nodes.attr("id", "")
|
||||
tmp = $("<div></div>")
|
||||
.css({ position: "absolute", visibility: "hidden", top: scroll_top + "px" })
|
||||
.attr("id", hash)
|
||||
.appendTo(document.body)
|
||||
|
||||
window.location.hash = hash
|
||||
|
||||
# restore the nodes
|
||||
if nodes.length > 0
|
||||
tmp.remove()
|
||||
nodes.attr("id", hash)
|
||||
|
||||
# initialize multi-line select
|
||||
$("#tree-content-holder .line-numbers a[id^=L]").on("click", handleMultiSelect)
|
||||
|
||||
# Highlight the correct lines on load
|
||||
highlightBlobLines()
|
||||
|
||||
# Highlight the correct lines when the hash part of the URL changes
|
||||
$(window).on("hashchange", highlightBlobLines)
|
|
@ -11,7 +11,6 @@ class @EditBlob
|
|||
if ace_mode
|
||||
editor.getSession().setMode "ace/mode/" + ace_mode
|
||||
|
||||
disableButtonIfEmptyField "#commit_message", ".js-commit-button"
|
||||
$(".js-commit-button").click ->
|
||||
$("#file-content").val editor.getValue()
|
||||
$(".file-editor form").submit()
|
||||
|
|
|
@ -11,7 +11,6 @@ class @NewBlob
|
|||
if ace_mode
|
||||
editor.getSession().setMode "ace/mode/" + ace_mode
|
||||
|
||||
disableButtonIfEmptyField "#commit_message", ".js-commit-button"
|
||||
$(".js-commit-button").click ->
|
||||
$("#file-content").val editor.getValue()
|
||||
$(".file-editor form").submit()
|
||||
|
|
|
@ -214,7 +214,7 @@ class @BranchGraph
|
|||
stroke: @colors[commit.space]
|
||||
"stroke-width": 2
|
||||
)
|
||||
r.image(gon.relative_url_root + commit.author.icon, avatar_box_x, avatar_box_y, 20, 20)
|
||||
r.image(commit.author.icon, avatar_box_x, avatar_box_y, 20, 20)
|
||||
r.text(@offsetX + @unitSpace * @mspace + 35, y, commit.message.split("\n")[0]).attr(
|
||||
"text-anchor": "start"
|
||||
font: "14px Monaco, monospace"
|
||||
|
|
|
@ -25,6 +25,7 @@ class @Calendar
|
|||
30
|
||||
]
|
||||
legendCellPadding: 3
|
||||
cellSize: $('.user-calendar').width() / 80
|
||||
onClick: (date, count) ->
|
||||
formated_date = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate()
|
||||
$.ajax
|
||||
|
|
|
@ -8,11 +8,13 @@ class @ConfirmDangerModal
|
|||
submit = $('.js-confirm-danger-submit')
|
||||
submit.disable()
|
||||
|
||||
$('.js-confirm-danger-input').off 'input'
|
||||
$('.js-confirm-danger-input').on 'input', ->
|
||||
if rstrip($(@).val()) is project_path
|
||||
submit.enable()
|
||||
else
|
||||
submit.disable()
|
||||
|
||||
$('.js-confirm-danger-submit').off 'click'
|
||||
$('.js-confirm-danger-submit').on 'click', =>
|
||||
@form.submit()
|
||||
|
|
|
@ -31,6 +31,10 @@ class @Diff
|
|||
bottom: unfoldBottom
|
||||
offset: offset
|
||||
unfold: unfold
|
||||
# indent is used to compensate for single space indent to fit
|
||||
# '+' and '-' prepended to diff lines,
|
||||
# see https://gitlab.com/gitlab-org/gitlab-ce/issues/707
|
||||
indent: 1
|
||||
|
||||
$.get(link, params, (response) =>
|
||||
target.parent().replaceWith(response)
|
||||
|
|
|
@ -8,7 +8,6 @@ class Dispatcher
|
|||
|
||||
initPageScripts: ->
|
||||
page = $('body').attr('data-page')
|
||||
project_id = $('body').attr('data-project-id')
|
||||
|
||||
unless page
|
||||
return false
|
||||
|
@ -22,32 +21,27 @@ class Dispatcher
|
|||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:issues:show'
|
||||
new Issue()
|
||||
shortcut_handler = new ShortcutsIssueable()
|
||||
shortcut_handler = new ShortcutsIssuable()
|
||||
new ZenMode()
|
||||
when 'projects:milestones:show'
|
||||
new Milestone()
|
||||
when 'projects:milestones:new', 'projects:milestones:edit'
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.milestone-form'))
|
||||
when 'projects:compare:show'
|
||||
new Diff()
|
||||
when 'projects:issues:new','projects:issues:edit'
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.issue-form'))
|
||||
if page == 'projects:issues:new'
|
||||
new IssuableForm($('.issue-form'))
|
||||
when 'projects:merge_requests:new', 'projects:merge_requests:edit'
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
new Diff()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.merge-request-form'))
|
||||
if page == 'projects:merge_requests:new'
|
||||
new IssuableForm($('.merge-request-form'))
|
||||
when 'projects:merge_requests:show'
|
||||
new Diff()
|
||||
shortcut_handler = new ShortcutsIssueable()
|
||||
shortcut_handler = new ShortcutsIssuable()
|
||||
new ZenMode()
|
||||
when "projects:merge_requests:diffs"
|
||||
new Diff()
|
||||
|
@ -55,7 +49,7 @@ class Dispatcher
|
|||
when 'projects:merge_requests:index'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
MergeRequests.init()
|
||||
when 'dashboard:show'
|
||||
when 'dashboard:show', 'root:show'
|
||||
new Dashboard()
|
||||
new Activities()
|
||||
when 'dashboard:projects:starred'
|
||||
|
@ -68,8 +62,9 @@ class Dispatcher
|
|||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:commits:show'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:activity'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:show'
|
||||
new Activities()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'groups:show'
|
||||
new Activities()
|
||||
|
@ -87,7 +82,7 @@ class Dispatcher
|
|||
new TreeView()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:blob:show'
|
||||
new BlobView()
|
||||
new LineHighlighter()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'projects:labels:new', 'projects:labels:edit'
|
||||
new Labels()
|
||||
|
@ -128,14 +123,15 @@ class Dispatcher
|
|||
new ProjectNew()
|
||||
when 'show'
|
||||
new ProjectShow()
|
||||
when 'issues', 'merge_requests'
|
||||
new UsersSelect()
|
||||
when 'wikis'
|
||||
new Wikis()
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode()
|
||||
new DropzoneInput($('.wiki-form'))
|
||||
when 'snippets', 'labels', 'graphs'
|
||||
when 'snippets'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
new ZenMode() if path[2] == 'show'
|
||||
when 'labels', 'graphs'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
when 'project_members', 'deploy_keys', 'hooks', 'services', 'protected_branches'
|
||||
shortcut_handler = new ShortcutsNavigation()
|
||||
|
|
|
@ -8,22 +8,29 @@ class @DropzoneInput
|
|||
divAlert = "<div class=\"" + alertClass + "\"></div>"
|
||||
iconPaperclip = "<i class=\"fa fa-paperclip div-dropzone-icon\"></i>"
|
||||
iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
|
||||
uploadProgress = $("<div class=\"div-dropzone-progress\"></div>")
|
||||
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
||||
project_uploads_path = window.project_uploads_path or null
|
||||
markdown_preview_path = window.markdown_preview_path or null
|
||||
max_file_size = gon.max_file_size or 10
|
||||
|
||||
form_textarea = $(form).find("textarea.markdown-area")
|
||||
form_textarea.wrap "<div class=\"div-dropzone\"></div>"
|
||||
form_textarea.bind 'paste', (event) =>
|
||||
form_textarea.on 'paste', (event) =>
|
||||
handlePaste(event)
|
||||
form_textarea.on "input", ->
|
||||
hideReferencedUsers()
|
||||
form_textarea.on "blur", ->
|
||||
renderMarkdown()
|
||||
|
||||
form_dropzone = $(form).find('.div-dropzone')
|
||||
form_dropzone.parent().addClass "div-dropzone-wrapper"
|
||||
form_dropzone.append divHover
|
||||
$(".div-dropzone-hover").append iconPaperclip
|
||||
form_dropzone.find(".div-dropzone-hover").append iconPaperclip
|
||||
form_dropzone.append divSpinner
|
||||
$(".div-dropzone-spinner").append iconSpinner
|
||||
$(".div-dropzone-spinner").css
|
||||
form_dropzone.find(".div-dropzone-spinner").append iconSpinner
|
||||
form_dropzone.find(".div-dropzone-spinner").append uploadProgress
|
||||
form_dropzone.find(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
|
||||
|
@ -45,16 +52,7 @@ class @DropzoneInput
|
|||
form.find(".md-write-holder").hide()
|
||||
form.find(".md-preview-holder").show()
|
||||
|
||||
preview = form.find(".js-md-preview")
|
||||
mdText = form.find(".markdown-area").val()
|
||||
if mdText.trim().length is 0
|
||||
preview.text "Nothing to preview."
|
||||
else
|
||||
preview.text "Loading..."
|
||||
$.post($(this).data("url"),
|
||||
md_text: mdText
|
||||
).success (previewData) ->
|
||||
preview.html previewData
|
||||
renderMarkdown()
|
||||
|
||||
# Write button
|
||||
$(document).off "click", ".js-md-write-button"
|
||||
|
@ -116,13 +114,18 @@ class @DropzoneInput
|
|||
$(".div-dropzone-alert").append btnAlert + errorMessage
|
||||
return
|
||||
|
||||
totaluploadprogress: (totalUploadProgress) ->
|
||||
uploadProgress.text Math.round(totalUploadProgress) + "%"
|
||||
return
|
||||
|
||||
sending: ->
|
||||
form_dropzone.find(".div-dropzone-spinner").css
|
||||
"opacity": 0.7
|
||||
"display": "inherit"
|
||||
return
|
||||
|
||||
complete: ->
|
||||
queuecomplete: ->
|
||||
uploadProgress.text ""
|
||||
$(".dz-preview").remove()
|
||||
$(".markdown-area").trigger "input"
|
||||
$(".div-dropzone-spinner").css
|
||||
|
@ -133,6 +136,40 @@ class @DropzoneInput
|
|||
|
||||
child = $(dropzone[0]).children("textarea")
|
||||
|
||||
hideReferencedUsers = ->
|
||||
referencedUsers = form.find(".referenced-users")
|
||||
referencedUsers.hide()
|
||||
|
||||
renderReferencedUsers = (users) ->
|
||||
referencedUsers = form.find(".referenced-users")
|
||||
|
||||
if referencedUsers.length
|
||||
if users.length >= 10
|
||||
referencedUsers.show()
|
||||
referencedUsers.find(".js-referenced-users-count").text users.length
|
||||
else
|
||||
referencedUsers.hide()
|
||||
|
||||
renderMarkdown = ->
|
||||
preview = form.find(".js-md-preview")
|
||||
mdText = form.find(".markdown-area").val()
|
||||
if mdText.trim().length is 0
|
||||
preview.text "Nothing to preview."
|
||||
hideReferencedUsers()
|
||||
else
|
||||
preview.text "Loading..."
|
||||
$.ajax(
|
||||
type: "POST",
|
||||
url: markdown_preview_path,
|
||||
data: {
|
||||
text: mdText
|
||||
},
|
||||
dataType: "json"
|
||||
).success (data) ->
|
||||
preview.html data.body
|
||||
|
||||
renderReferencedUsers data.references.users
|
||||
|
||||
formatLink = (link) ->
|
||||
text = "[#{link.alt}](#{link.url})"
|
||||
text = "!#{text}" if link.is_image
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
$.fn.showAndHide = ->
|
||||
$(@).show().
|
||||
delay(3000).
|
||||
fadeOut()
|
||||
|
||||
$.fn.enableButton = ->
|
||||
$(@).removeAttr('disabled').
|
||||
removeClass('disabled')
|
||||
|
||||
$.fn.disableButton = ->
|
||||
$(@).attr('disabled', 'disabled').
|
||||
addClass('disabled')
|
||||
# Disable an element and add the 'disabled' Bootstrap class
|
||||
$.fn.extend disable: ->
|
||||
$(@)
|
||||
.attr('disabled', 'disabled')
|
||||
.addClass('disabled')
|
||||
|
||||
# Enable an element and remove the 'disabled' Bootstrap class
|
||||
$.fn.extend enable: ->
|
||||
$(@)
|
||||
.removeAttr('disabled')
|
||||
.removeClass('disabled')
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
|
||||
window.GitLab ?= {}
|
||||
GitLab.GfmAutoComplete =
|
||||
# private_token: ''
|
||||
dataSource: ''
|
||||
|
||||
# Emoji
|
||||
Emoji:
|
||||
template: '<li data-value="${insert}">${name} <img alt="${name}" height="20" src="${image}" width="20" /></li>'
|
||||
template: '<li>${name} <img alt="${name}" height="20" src="${path}" width="20" /></li>'
|
||||
|
||||
# Team Members
|
||||
Members:
|
||||
template: '<li data-value="${username}">${username} <small>${name}</small></li>'
|
||||
template: '<li>${username} <small>${title}</small></li>'
|
||||
|
||||
# Issues and MergeRequests
|
||||
Issues:
|
||||
template: '<li data-value="${id}"><small>${id}</small> ${title} </li>'
|
||||
template: '<li><small>${id}</small> ${title}</li>'
|
||||
|
||||
# Add GFM auto-completion to all input fields, that accept GFM input.
|
||||
setup: ->
|
||||
|
@ -23,45 +23,58 @@ GitLab.GfmAutoComplete =
|
|||
# Emoji
|
||||
input.atwho
|
||||
at: ':'
|
||||
tpl: @Emoji.template
|
||||
callbacks:
|
||||
before_save: (emojis) =>
|
||||
$.map emojis, (em) => name: em.name, insert: em.name+ ':', image: em.path
|
||||
displayTpl: @Emoji.template
|
||||
insertTpl: ':${name}:'
|
||||
|
||||
# Team Members
|
||||
input.atwho
|
||||
at: '@'
|
||||
tpl: @Members.template
|
||||
search_key: 'search'
|
||||
displayTpl: @Members.template
|
||||
insertTpl: '${atwho-at}${username}'
|
||||
searchKey: 'search'
|
||||
callbacks:
|
||||
before_save: (members) =>
|
||||
$.map members, (m) => name: m.name, username: m.username, search: "#{m.username} #{m.name}"
|
||||
beforeSave: (members) ->
|
||||
$.map members, (m) ->
|
||||
title = m.name
|
||||
title += " (#{m.count})" if m.count
|
||||
|
||||
username: m.username
|
||||
title: sanitize(title)
|
||||
search: sanitize("#{m.username} #{m.name}")
|
||||
|
||||
input.atwho
|
||||
at: '#'
|
||||
alias: 'issues'
|
||||
search_key: 'search'
|
||||
tpl: @Issues.template
|
||||
searchKey: 'search'
|
||||
displayTpl: @Issues.template
|
||||
insertTpl: '${atwho-at}${id}'
|
||||
callbacks:
|
||||
before_save: (issues) ->
|
||||
$.map issues, (i) -> id: i.iid, title: sanitize(i.title), search: "#{i.iid} #{i.title}"
|
||||
beforeSave: (issues) ->
|
||||
$.map issues, (i) ->
|
||||
id: i.iid
|
||||
title: sanitize(i.title)
|
||||
search: "#{i.iid} #{i.title}"
|
||||
|
||||
input.atwho
|
||||
at: '!'
|
||||
alias: 'mergerequests'
|
||||
search_key: 'search'
|
||||
tpl: @Issues.template
|
||||
searchKey: 'search'
|
||||
displayTpl: @Issues.template
|
||||
insertTpl: '${atwho-at}${id}'
|
||||
callbacks:
|
||||
before_save: (merges) ->
|
||||
$.map merges, (m) -> id: m.iid, title: sanitize(m.title), search: "#{m.iid} #{m.title}"
|
||||
beforeSave: (merges) ->
|
||||
$.map merges, (m) ->
|
||||
id: m.iid
|
||||
title: sanitize(m.title)
|
||||
search: "#{m.iid} #{m.title}"
|
||||
|
||||
input.one "focus", =>
|
||||
input.one 'focus', =>
|
||||
$.getJSON(@dataSource).done (data) ->
|
||||
# load members
|
||||
input.atwho 'load', "@", data.members
|
||||
input.atwho 'load', '@', data.members
|
||||
# load issues
|
||||
input.atwho 'load', "issues", data.issues
|
||||
input.atwho 'load', 'issues', data.issues
|
||||
# load merge requests
|
||||
input.atwho 'load', "mergerequests", data.mergerequests
|
||||
input.atwho 'load', 'mergerequests', data.mergerequests
|
||||
# load emojis
|
||||
input.atwho 'load', ":", data.emojis
|
||||
input.atwho 'load', ':', data.emojis
|
||||
|
|
22
app/assets/javascripts/issuable_context.js.coffee
Normal file
|
@ -0,0 +1,22 @@
|
|||
#= require jquery.waitforimages
|
||||
|
||||
class @IssuableContext
|
||||
constructor: ->
|
||||
new UsersSelect()
|
||||
$('select.select2').select2({width: 'resolve', dropdownAutoWidth: true})
|
||||
|
||||
$(".context .inline-update").on "change", "select", ->
|
||||
$(this).submit()
|
||||
$(".context .inline-update").on "change", ".js-assignee", ->
|
||||
$(this).submit()
|
||||
|
||||
$('.issuable-details').waitForImages ->
|
||||
$('.issuable-affix').affix offset:
|
||||
top: ->
|
||||
@top = ($('.issuable-affix').offset().top - 70)
|
||||
bottom: ->
|
||||
@bottom = $('.footer').outerHeight(true)
|
||||
$('.issuable-affix').on 'affix.bs.affix', ->
|
||||
$(@).width($(@).outerWidth())
|
||||
.on 'affixed-top.bs.affix affixed-bottom.bs.affix', ->
|
||||
$(@).width('')
|
|
@ -1,5 +1,9 @@
|
|||
class @IssuableForm
|
||||
constructor: (@form) ->
|
||||
GitLab.GfmAutoComplete.setup()
|
||||
new UsersSelect()
|
||||
new ZenMode()
|
||||
|
||||
@titleField = @form.find("input[name*='[title]']")
|
||||
@descriptionField = @form.find("textarea[name*='[description]']")
|
||||
|
||||
|
|
|
@ -1,24 +1,29 @@
|
|||
#= require jquery.waitforimages
|
||||
#= require task_list
|
||||
|
||||
class @Issue
|
||||
constructor: ->
|
||||
$('.edit-issue.inline-update input[type="submit"]').hide()
|
||||
$(".context .inline-update").on "change", "select", ->
|
||||
$(this).submit()
|
||||
$(".context .inline-update").on "change", "#issue_assignee_id", ->
|
||||
$(this).submit()
|
||||
# Prevent duplicate event bindings
|
||||
@disableTaskList()
|
||||
|
||||
if $("a.btn-close").length
|
||||
$("li.task-list-item input:checkbox").prop("disabled", false)
|
||||
@initTaskList()
|
||||
|
||||
$('.task-list-item input:checkbox').off('change')
|
||||
$('.task-list-item input:checkbox').change('issue', updateTaskState)
|
||||
initTaskList: ->
|
||||
$('.issue-details .js-task-list-container').taskList('enable')
|
||||
$(document).on 'tasklist:changed', '.issue-details .js-task-list-container', @updateTaskList
|
||||
|
||||
$('.issue-details').waitForImages ->
|
||||
$('.issuable-affix').affix offset:
|
||||
top: ->
|
||||
@top = ($('.issuable-affix').offset().top - 70)
|
||||
bottom: ->
|
||||
@bottom = $('.footer').outerHeight(true)
|
||||
$('.issuable-affix').on 'affix.bs.affix', ->
|
||||
$(@).width($(@).outerWidth())
|
||||
.on 'affixed-top.bs.affix affixed-bottom.bs.affix', ->
|
||||
$(@).width('')
|
||||
disableTaskList: ->
|
||||
$('.issue-details .js-task-list-container').taskList('disable')
|
||||
$(document).off 'tasklist:changed', '.issue-details .js-task-list-container'
|
||||
|
||||
# TODO (rspeicher): Make the issue description inline-editable like a note so
|
||||
# that we can re-use its form here
|
||||
updateTaskList: ->
|
||||
patchData = {}
|
||||
patchData['issue'] = {'description': $('.js-task-list-field', this).val()}
|
||||
|
||||
$.ajax
|
||||
type: 'PATCH'
|
||||
url: $('form.js-issuable-update').attr('action')
|
||||
data: patchData
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
class @Labels
|
||||
constructor: ->
|
||||
form = $('.label-form')
|
||||
@setupLabelForm(form)
|
||||
@cleanBinding()
|
||||
@addBinding()
|
||||
@updateColorPreview()
|
||||
|
@ -14,10 +13,6 @@ class @Labels
|
|||
$(document).off 'click', '.suggest-colors a'
|
||||
$(document).off 'input', 'input#label_color'
|
||||
|
||||
# Initializes the form to disable the save button if no color or title is entered
|
||||
setupLabelForm: (form) ->
|
||||
disableButtonIfAnyEmptyField form, '.form-control', form.find('.js-save-button')
|
||||
|
||||
# Updates the the preview color with the hex-color input
|
||||
updateColorPreview: =>
|
||||
previewColor = $('input#label_color').val()
|
||||
|
|
148
app/assets/javascripts/line_highlighter.js.coffee
Normal file
|
@ -0,0 +1,148 @@
|
|||
# LineHighlighter
|
||||
#
|
||||
# Handles single- and multi-line selection and highlight for blob views.
|
||||
#
|
||||
#= require jquery.scrollTo
|
||||
#
|
||||
# ### Example Markup
|
||||
#
|
||||
# <div id="tree-content-holder">
|
||||
# <div class="file-content">
|
||||
# <div class="line-numbers">
|
||||
# <a href="#L1" id="L1" data-line-number="1">1</a>
|
||||
# <a href="#L2" id="L2" data-line-number="2">2</a>
|
||||
# <a href="#L3" id="L3" data-line-number="3">3</a>
|
||||
# <a href="#L4" id="L4" data-line-number="4">4</a>
|
||||
# <a href="#L5" id="L5" data-line-number="5">5</a>
|
||||
# </div>
|
||||
# <pre class="code highlight">
|
||||
# <code>
|
||||
# <span id="LC1" class="line">...</span>
|
||||
# <span id="LC2" class="line">...</span>
|
||||
# <span id="LC3" class="line">...</span>
|
||||
# <span id="LC4" class="line">...</span>
|
||||
# <span id="LC5" class="line">...</span>
|
||||
# </code>
|
||||
# </pre>
|
||||
# </div>
|
||||
# </div>
|
||||
#
|
||||
class @LineHighlighter
|
||||
# CSS class applied to highlighted lines
|
||||
highlightClass: 'hll'
|
||||
|
||||
# Internal copy of location.hash so we're not dependent on `location` in tests
|
||||
_hash: ''
|
||||
|
||||
# Initialize a LineHighlighter object
|
||||
#
|
||||
# hash - String URL hash for dependency injection in tests
|
||||
constructor: (hash = location.hash) ->
|
||||
@_hash = hash
|
||||
|
||||
@bindEvents()
|
||||
|
||||
unless hash == ''
|
||||
range = @hashToRange(hash)
|
||||
|
||||
if range[0]
|
||||
@highlightRange(range)
|
||||
|
||||
# Scroll to the first highlighted line on initial load
|
||||
# Offset -50 for the sticky top bar, and another -100 for some context
|
||||
$.scrollTo("#L#{range[0]}", offset: -150)
|
||||
|
||||
bindEvents: ->
|
||||
$('#tree-content-holder').on 'mousedown', 'a[data-line-number]', @clickHandler
|
||||
|
||||
# While it may seem odd to bind to the mousedown event and then throw away
|
||||
# the click event, there is a method to our madness.
|
||||
#
|
||||
# If not done this way, the line number anchor will sometimes keep its
|
||||
# active state even when the event is cancelled, resulting in an ugly border
|
||||
# around the link and/or a persisted underline text decoration.
|
||||
|
||||
$('#tree-content-holder').on 'click', 'a[data-line-number]', (event) ->
|
||||
event.preventDefault()
|
||||
|
||||
clickHandler: (event) =>
|
||||
event.preventDefault()
|
||||
|
||||
@clearHighlight()
|
||||
|
||||
lineNumber = $(event.target).closest('a').data('line-number')
|
||||
current = @hashToRange(@_hash)
|
||||
|
||||
unless current[0] && event.shiftKey
|
||||
# If there's no current selection, or there is but Shift wasn't held,
|
||||
# treat this like a single-line selection.
|
||||
@setHash(lineNumber)
|
||||
@highlightLine(lineNumber)
|
||||
else if event.shiftKey
|
||||
if lineNumber < current[0]
|
||||
range = [lineNumber, current[0]]
|
||||
else
|
||||
range = [current[0], lineNumber]
|
||||
|
||||
@setHash(range[0], range[1])
|
||||
@highlightRange(range)
|
||||
|
||||
# Unhighlight previously highlighted lines
|
||||
clearHighlight: ->
|
||||
$(".#{@highlightClass}").removeClass(@highlightClass)
|
||||
|
||||
# Convert a URL hash String into line numbers
|
||||
#
|
||||
# hash - Hash String
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# hashToRange('#L5') # => [5, null]
|
||||
# hashToRange('#L5-15') # => [5, 15]
|
||||
# hashToRange('#foo') # => [null, null]
|
||||
#
|
||||
# Returns an Array
|
||||
hashToRange: (hash) ->
|
||||
matches = hash.match(/^#?L(\d+)(?:-(\d+))?$/)
|
||||
|
||||
if matches && matches.length
|
||||
first = parseInt(matches[1])
|
||||
last = if matches[2] then parseInt(matches[2]) else null
|
||||
|
||||
[first, last]
|
||||
else
|
||||
[null, null]
|
||||
|
||||
# Highlight a single line
|
||||
#
|
||||
# lineNumber - Line number to highlight
|
||||
highlightLine: (lineNumber) =>
|
||||
$("#LC#{lineNumber}").addClass(@highlightClass)
|
||||
|
||||
# Highlight all lines within a range
|
||||
#
|
||||
# range - Array containing the starting and ending line numbers
|
||||
highlightRange: (range) ->
|
||||
if range[1]
|
||||
for lineNumber in [range[0]..range[1]]
|
||||
@highlightLine(lineNumber)
|
||||
else
|
||||
@highlightLine(range[0])
|
||||
|
||||
# Set the URL hash string
|
||||
setHash: (firstLineNumber, lastLineNumber) =>
|
||||
if lastLineNumber
|
||||
hash = "#L#{firstLineNumber}-#{lastLineNumber}"
|
||||
else
|
||||
hash = "#L#{firstLineNumber}"
|
||||
|
||||
@_hash = hash
|
||||
@__setLocationHash__(hash)
|
||||
|
||||
# Make the actual hash change in the browser
|
||||
#
|
||||
# This method is stubbed in tests.
|
||||
__setLocationHash__: (value) ->
|
||||
# We're using pushState instead of assigning location.hash directly to
|
||||
# prevent the page from scrolling on the hashchange event
|
||||
history.pushState({turbolinks: false, url: value}, document.title, value)
|
|
@ -1,166 +1,59 @@
|
|||
#= require jquery.waitforimages
|
||||
#= require task_list
|
||||
|
||||
#= require merge_request_tabs
|
||||
|
||||
class @MergeRequest
|
||||
# Initialize MergeRequest behavior
|
||||
#
|
||||
# Options:
|
||||
# action - String, current controller action
|
||||
#
|
||||
constructor: (@opts) ->
|
||||
@initContextWidget()
|
||||
this.$el = $('.merge-request')
|
||||
@diffs_loaded = if @opts.action == 'diffs' then true else false
|
||||
@commits_loaded = false
|
||||
|
||||
this.activateTab(@opts.action)
|
||||
|
||||
this.bindEvents()
|
||||
|
||||
this.initMergeWidget()
|
||||
this.$('.show-all-commits').on 'click', =>
|
||||
this.showAllCommits()
|
||||
|
||||
modal = $('#modal_merge_info').modal(show: false)
|
||||
@initTabs()
|
||||
|
||||
disableButtonIfEmptyField '#commit_message', '.accept_merge_request'
|
||||
# Prevent duplicate event bindings
|
||||
@disableTaskList()
|
||||
|
||||
if $("a.btn-close").length
|
||||
$("li.task-list-item input:checkbox").prop("disabled", false)
|
||||
|
||||
$('.merge-request-details').waitForImages ->
|
||||
$('.issuable-affix').affix offset:
|
||||
top: ->
|
||||
@top = ($('.issuable-affix').offset().top - 70)
|
||||
bottom: ->
|
||||
@bottom = $('.footer').outerHeight(true)
|
||||
$('.issuable-affix').on 'affix.bs.affix', ->
|
||||
$(@).width($(@).outerWidth())
|
||||
.on 'affixed-top.bs.affix affixed-bottom.bs.affix', ->
|
||||
$(@).width('')
|
||||
@initTaskList()
|
||||
|
||||
# Local jQuery finder
|
||||
$: (selector) ->
|
||||
this.$el.find(selector)
|
||||
|
||||
initContextWidget: ->
|
||||
$('.edit-merge_request.inline-update input[type="submit"]').hide()
|
||||
$(".context .inline-update").on "change", "select", ->
|
||||
$(this).submit()
|
||||
$(".context .inline-update").on "change", "#merge_request_assignee_id", ->
|
||||
$(this).submit()
|
||||
|
||||
initMergeWidget: ->
|
||||
this.showState( @opts.current_status )
|
||||
|
||||
if this.$('.automerge_widget').length and @opts.check_enable
|
||||
$.get @opts.url_to_automerge_check, (data) =>
|
||||
this.showState( data.merge_status )
|
||||
, 'json'
|
||||
|
||||
if @opts.ci_enable
|
||||
$.get @opts.url_to_ci_check, (data) =>
|
||||
this.showCiState data.status
|
||||
if data.coverage
|
||||
this.showCiCoverage data.coverage
|
||||
, 'json'
|
||||
|
||||
bindEvents: ->
|
||||
this.$('.merge-request-tabs').on 'click', 'a', (event) =>
|
||||
a = $(event.currentTarget)
|
||||
|
||||
href = a.attr('href')
|
||||
History.replaceState {path: href}, document.title, href
|
||||
|
||||
event.preventDefault()
|
||||
|
||||
this.$('.merge-request-tabs').on 'click', 'li', (event) =>
|
||||
this.activateTab($(event.currentTarget).data('action'))
|
||||
|
||||
this.$('.accept_merge_request').on 'click', ->
|
||||
$('.automerge_widget.can_be_merged').hide()
|
||||
$('.merge-in-progress').show()
|
||||
|
||||
this.$('.remove_source_branch').on 'click', ->
|
||||
$('.remove_source_branch_widget').hide()
|
||||
$('.remove_source_branch_in_progress').show()
|
||||
|
||||
this.$(".remove_source_branch").on "ajax:success", (e, data, status, xhr) ->
|
||||
location.reload()
|
||||
|
||||
this.$(".remove_source_branch").on "ajax:error", (e, data, status, xhr) =>
|
||||
this.$('.remove_source_branch_widget').hide()
|
||||
this.$('.remove_source_branch_in_progress').hide()
|
||||
this.$('.remove_source_branch_widget.failed').show()
|
||||
|
||||
$('.task-list-item input:checkbox').off('change')
|
||||
$('.task-list-item input:checkbox').change('merge_request', updateTaskState)
|
||||
|
||||
activateTab: (action) ->
|
||||
this.$('.merge-request-tabs li').removeClass 'active'
|
||||
this.$('.tab-content').hide()
|
||||
switch action
|
||||
when 'diffs'
|
||||
this.$('.merge-request-tabs .diffs-tab').addClass 'active'
|
||||
this.loadDiff() unless @diffs_loaded
|
||||
this.$('.diffs').show()
|
||||
$(".diff-header").trigger("sticky_kit:recalc")
|
||||
when 'commits'
|
||||
this.$('.merge-request-tabs .commits-tab').addClass 'active'
|
||||
this.$('.commits').show()
|
||||
initTabs: ->
|
||||
if @opts.action != 'new'
|
||||
# `MergeRequests#new` has no tab-persisting or lazy-loading behavior
|
||||
new MergeRequestTabs(@opts)
|
||||
else
|
||||
this.$('.merge-request-tabs .notes-tab').addClass 'active'
|
||||
this.$('.notes').show()
|
||||
|
||||
showState: (state) ->
|
||||
$('.automerge_widget').hide()
|
||||
$('.automerge_widget.' + state).show()
|
||||
|
||||
showCiState: (state) ->
|
||||
$('.ci_widget').hide()
|
||||
allowed_states = ["failed", "canceled", "running", "pending", "success"]
|
||||
if state in allowed_states
|
||||
$('.ci_widget.ci-' + state).show()
|
||||
switch state
|
||||
when "failed", "canceled"
|
||||
@setMergeButtonClass('btn-danger')
|
||||
when "running", "pending"
|
||||
@setMergeButtonClass('btn-warning')
|
||||
else
|
||||
$('.ci_widget.ci-error').show()
|
||||
@setMergeButtonClass('btn-danger')
|
||||
|
||||
showCiCoverage: (coverage) ->
|
||||
cov_html = $('<span>')
|
||||
cov_html.addClass('ci-coverage')
|
||||
cov_html.text('Coverage ' + coverage + '%')
|
||||
$('.ci_widget:visible').append(cov_html)
|
||||
|
||||
loadDiff: (event) ->
|
||||
$.ajax
|
||||
type: 'GET'
|
||||
url: this.$('.merge-request-tabs .diffs-tab a').attr('href') + ".json"
|
||||
beforeSend: =>
|
||||
this.$('.mr-loading-status .loading').show()
|
||||
complete: =>
|
||||
@diffs_loaded = true
|
||||
this.$('.mr-loading-status .loading').hide()
|
||||
success: (data) =>
|
||||
this.$(".diffs").html(data.html)
|
||||
dataType: 'json'
|
||||
# Show the first tab (Commits)
|
||||
$('.merge-request-tabs a[data-toggle="tab"]:first').tab('show')
|
||||
|
||||
showAllCommits: ->
|
||||
this.$('.first-commits').remove()
|
||||
this.$('.all-commits').removeClass 'hide'
|
||||
|
||||
alreadyOrCannotBeMerged: ->
|
||||
this.$('.automerge_widget').hide()
|
||||
this.$('.merge-in-progress').hide()
|
||||
this.$('.automerge_widget.already_cannot_be_merged').show()
|
||||
initTaskList: ->
|
||||
$('.merge-request-details .js-task-list-container').taskList('enable')
|
||||
$(document).on 'tasklist:changed', '.merge-request-details .js-task-list-container', @updateTaskList
|
||||
|
||||
setMergeButtonClass: (css_class) ->
|
||||
$('.accept_merge_request').removeClass("btn-create").addClass(css_class)
|
||||
disableTaskList: ->
|
||||
$('.merge-request-details .js-task-list-container').taskList('disable')
|
||||
$(document).off 'tasklist:changed', '.merge-request-details .js-task-list-container'
|
||||
|
||||
# TODO (rspeicher): Make the merge request description inline-editable like a
|
||||
# note so that we can re-use its form here
|
||||
updateTaskList: ->
|
||||
patchData = {}
|
||||
patchData['merge_request'] = {'description': $('.js-task-list-field', this).val()}
|
||||
|
||||
mergeInProgress: ->
|
||||
$.ajax
|
||||
type: 'GET'
|
||||
url: $('.merge-request').data('url')
|
||||
success: (data) =>
|
||||
switch data.state
|
||||
when 'merged'
|
||||
location.reload()
|
||||
else
|
||||
setTimeout(merge_request.mergeInProgress, 3000)
|
||||
dataType: 'json'
|
||||
type: 'PATCH'
|
||||
url: $('form.js-issuable-update').attr('action')
|
||||
data: patchData
|
||||
|
|
148
app/assets/javascripts/merge_request_tabs.js.coffee
Normal file
|
@ -0,0 +1,148 @@
|
|||
# MergeRequestTabs
|
||||
#
|
||||
# Handles persisting and restoring the current tab selection and lazily-loading
|
||||
# content on the MergeRequests#show page.
|
||||
#
|
||||
# ### Example Markup
|
||||
#
|
||||
# <ul class="nav nav-tabs merge-request-tabs">
|
||||
# <li class="notes-tab active">
|
||||
# <a data-action="notes" data-target="#notes" data-toggle="tab" href="/foo/bar/merge_requests/1">
|
||||
# Discussion
|
||||
# </a>
|
||||
# </li>
|
||||
# <li class="commits-tab">
|
||||
# <a data-action="commits" data-target="#commits" data-toggle="tab" href="/foo/bar/merge_requests/1/commits">
|
||||
# Commits
|
||||
# </a>
|
||||
# </li>
|
||||
# <li class="diffs-tab">
|
||||
# <a data-action="diffs" data-target="#diffs" data-toggle="tab" href="/foo/bar/merge_requests/1/diffs">
|
||||
# Diffs
|
||||
# </a>
|
||||
# </li>
|
||||
# </ul>
|
||||
#
|
||||
# <div class="tab-content">
|
||||
# <div class="notes tab-pane active" id="notes">
|
||||
# Notes Content
|
||||
# </div>
|
||||
# <div class="commits tab-pane" id="commits">
|
||||
# Commits Content
|
||||
# </div>
|
||||
# <div class="diffs tab-pane" id="diffs">
|
||||
# Diffs Content
|
||||
# </div>
|
||||
# </div>
|
||||
#
|
||||
# <div class="mr-loading-status">
|
||||
# <div class="loading">
|
||||
# Loading Animation
|
||||
# </div>
|
||||
# </div>
|
||||
#
|
||||
class @MergeRequestTabs
|
||||
diffsLoaded: false
|
||||
commitsLoaded: false
|
||||
|
||||
constructor: (@opts = {}) ->
|
||||
# Store the `location` object, allowing for easier stubbing in tests
|
||||
@_location = location
|
||||
|
||||
@bindEvents()
|
||||
@activateTab(@opts.action)
|
||||
|
||||
bindEvents: ->
|
||||
$(document).on 'shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', @tabShown
|
||||
|
||||
tabShown: (event) =>
|
||||
$target = $(event.target)
|
||||
action = $target.data('action')
|
||||
|
||||
if action == 'commits'
|
||||
@loadCommits($target.attr('href'))
|
||||
else if action == 'diffs'
|
||||
@loadDiff($target.attr('href'))
|
||||
|
||||
@setCurrentAction(action)
|
||||
|
||||
# Activate a tab based on the current action
|
||||
activateTab: (action) ->
|
||||
action = 'notes' if action == 'show'
|
||||
$(".merge-request-tabs a[data-action='#{action}']").tab('show')
|
||||
|
||||
# Replaces the current Merge Request-specific action in the URL with a new one
|
||||
#
|
||||
# If the action is "notes", the URL is reset to the standard
|
||||
# `MergeRequests#show` route.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# location.pathname # => "/namespace/project/merge_requests/1"
|
||||
# setCurrentAction('diffs')
|
||||
# location.pathname # => "/namespace/project/merge_requests/1/diffs"
|
||||
#
|
||||
# location.pathname # => "/namespace/project/merge_requests/1/diffs"
|
||||
# setCurrentAction('notes')
|
||||
# location.pathname # => "/namespace/project/merge_requests/1"
|
||||
#
|
||||
# location.pathname # => "/namespace/project/merge_requests/1/diffs"
|
||||
# setCurrentAction('commits')
|
||||
# location.pathname # => "/namespace/project/merge_requests/1/commits"
|
||||
#
|
||||
# Returns the new URL String
|
||||
setCurrentAction: (action) =>
|
||||
# Normalize action, just to be safe
|
||||
action = 'notes' if action == 'show'
|
||||
|
||||
# Remove a trailing '/commits' or '/diffs'
|
||||
new_state = @_location.pathname.replace(/\/(commits|diffs)(\.html)?\/?$/, '')
|
||||
|
||||
# Append the new action if we're on a tab other than 'notes'
|
||||
unless action == 'notes'
|
||||
new_state += "/#{action}"
|
||||
|
||||
# Ensure parameters and hash come along for the ride
|
||||
new_state += @_location.search + @_location.hash
|
||||
|
||||
# Replace the current history state with the new one without breaking
|
||||
# Turbolinks' history.
|
||||
#
|
||||
# See https://github.com/rails/turbolinks/issues/363
|
||||
history.replaceState {turbolinks: true, url: new_state}, document.title, new_state
|
||||
|
||||
new_state
|
||||
|
||||
loadCommits: (source) ->
|
||||
return if @commitsLoaded
|
||||
|
||||
@_get
|
||||
url: "#{source}.json"
|
||||
success: (data) =>
|
||||
document.getElementById('commits').innerHTML = data.html
|
||||
$('.js-timeago').timeago()
|
||||
@commitsLoaded = true
|
||||
|
||||
loadDiff: (source) ->
|
||||
return if @diffsLoaded
|
||||
|
||||
@_get
|
||||
url: "#{source}.json" + @_location.search
|
||||
success: (data) =>
|
||||
document.getElementById('diffs').innerHTML = data.html
|
||||
@diffsLoaded = true
|
||||
|
||||
toggleLoading: ->
|
||||
$('.mr-loading-status .loading').toggle()
|
||||
|
||||
_get: (options) ->
|
||||
defaults = {
|
||||
beforeSend: @toggleLoading
|
||||
complete: @toggleLoading
|
||||
dataType: 'json'
|
||||
type: 'GET'
|
||||
}
|
||||
|
||||
options = $.extend({}, defaults, options)
|
||||
|
||||
$.ajax(options)
|
56
app/assets/javascripts/merge_request_widget.js.coffee
Normal file
|
@ -0,0 +1,56 @@
|
|||
class @MergeRequestWidget
|
||||
# Initialize MergeRequestWidget behavior
|
||||
#
|
||||
# check_enable - Boolean, whether to check automerge status
|
||||
# url_to_automerge_check - String, URL to use to check automerge status
|
||||
# current_status - String, current automerge status
|
||||
# ci_enable - Boolean, whether a CI service is enabled
|
||||
# url_to_ci_check - String, URL to use to check CI status
|
||||
#
|
||||
constructor: (@opts) ->
|
||||
modal = $('#modal_merge_info').modal(show: false)
|
||||
|
||||
mergeInProgress: ->
|
||||
$.ajax
|
||||
type: 'GET'
|
||||
url: $('.merge-request').data('url')
|
||||
success: (data) =>
|
||||
switch data.state
|
||||
when 'merged'
|
||||
location.reload()
|
||||
else
|
||||
setTimeout(merge_request_widget.mergeInProgress, 3000)
|
||||
dataType: 'json'
|
||||
|
||||
getMergeStatus: ->
|
||||
$.get @opts.url_to_automerge_check, (data) ->
|
||||
$('.mr-state-widget').replaceWith(data)
|
||||
|
||||
getCiStatus: ->
|
||||
if @opts.ci_enable
|
||||
$.get @opts.url_to_ci_check, (data) =>
|
||||
this.showCiState data.status
|
||||
if data.coverage
|
||||
this.showCiCoverage data.coverage
|
||||
, 'json'
|
||||
|
||||
showCiState: (state) ->
|
||||
$('.ci_widget').hide()
|
||||
allowed_states = ["failed", "canceled", "running", "pending", "success", "skipped", "not_found"]
|
||||
if state in allowed_states
|
||||
$('.ci_widget.ci-' + state).show()
|
||||
switch state
|
||||
when "failed", "canceled", "not_found"
|
||||
@setMergeButtonClass('btn-danger')
|
||||
when "running", "pending"
|
||||
@setMergeButtonClass('btn-warning')
|
||||
else
|
||||
$('.ci_widget.ci-error').show()
|
||||
@setMergeButtonClass('btn-danger')
|
||||
|
||||
showCiCoverage: (coverage) ->
|
||||
text = 'Coverage ' + coverage + '%'
|
||||
$('.ci_widget:visible .ci-coverage').text(text)
|
||||
|
||||
setMergeButtonClass: (css_class) ->
|
||||
$('.accept_merge_request').removeClass("btn-create").addClass(css_class)
|
|
@ -1,16 +1,24 @@
|
|||
#= require autosave
|
||||
#= require dropzone
|
||||
#= require dropzone_input
|
||||
#= require gfm_auto_complete
|
||||
#= require jquery.atwho
|
||||
#= require task_list
|
||||
|
||||
class @Notes
|
||||
@interval: null
|
||||
|
||||
constructor: (notes_url, note_ids, last_fetched_at) ->
|
||||
constructor: (notes_url, note_ids, last_fetched_at, view) ->
|
||||
@notes_url = notes_url
|
||||
@notes_url = gon.relative_url_root + @notes_url if gon.relative_url_root?
|
||||
@note_ids = note_ids
|
||||
@last_fetched_at = last_fetched_at
|
||||
@view = view
|
||||
@noteable_url = document.URL
|
||||
@initRefresh()
|
||||
@setupMainTargetNoteForm()
|
||||
@cleanBinding()
|
||||
@addBinding()
|
||||
@initTaskList()
|
||||
|
||||
addBinding: ->
|
||||
# add note to UI after creation
|
||||
|
@ -55,13 +63,11 @@ class @Notes
|
|||
# fetch notes when tab becomes visible
|
||||
$(document).on "visibilitychange", @visibilityChange
|
||||
|
||||
@notes_forms = '.js-main-target-form textarea, .js-discussion-note-form textarea'
|
||||
# Chrome doesn't fire keypress or keyup for Command+Enter, so we need keydown.
|
||||
$(document).on('keydown', @notes_forms, (e) ->
|
||||
$(document).on 'keydown', '.js-note-text', (e) ->
|
||||
return if e.originalEvent.repeat
|
||||
if e.keyCode == 10 || ((e.metaKey || e.ctrlKey) && e.keyCode == 13)
|
||||
$(@).parents('form').submit()
|
||||
)
|
||||
$(@).closest('form').submit()
|
||||
|
||||
cleanBinding: ->
|
||||
$(document).off "ajax:success", ".js-main-target-form"
|
||||
|
@ -76,11 +82,14 @@ class @Notes
|
|||
$(document).off "click", ".js-discussion-reply-button"
|
||||
$(document).off "click", ".js-add-diff-note-button"
|
||||
$(document).off "visibilitychange"
|
||||
$(document).off "keydown", @notes_forms
|
||||
$(document).off "keydown", ".js-note-text"
|
||||
$(document).off "keyup", ".js-note-text"
|
||||
$(document).off "click", ".js-note-target-reopen"
|
||||
$(document).off "click", ".js-note-target-close"
|
||||
|
||||
$('.note .js-task-list-container').taskList('disable')
|
||||
$(document).off 'tasklist:changed', '.note .js-task-list-container'
|
||||
|
||||
initRefresh: ->
|
||||
clearInterval(Notes.interval)
|
||||
Notes.interval = setInterval =>
|
||||
|
@ -114,6 +123,7 @@ class @Notes
|
|||
if @isNewNote(note)
|
||||
@note_ids.push(note.id)
|
||||
$('ul.main-notes-list').append(note.html)
|
||||
@initTaskList()
|
||||
|
||||
###
|
||||
Check if note does not exists on page
|
||||
|
@ -121,6 +131,8 @@ class @Notes
|
|||
isNewNote: (note) ->
|
||||
$.inArray(note.id, @note_ids) == -1
|
||||
|
||||
isParallelView: ->
|
||||
@view == 'parallel'
|
||||
|
||||
###
|
||||
Render note in discussion area.
|
||||
|
@ -268,6 +280,8 @@ class @Notes
|
|||
note_li.replaceWith(note.html)
|
||||
note_li.find('.note-edit-form').hide()
|
||||
note_li.find('.note-body > .note-text').show()
|
||||
note_li.find('js-task-list-container').taskList('enable')
|
||||
@enableTaskList()
|
||||
|
||||
###
|
||||
Called in response to clicking the edit note link
|
||||
|
@ -283,7 +297,7 @@ class @Notes
|
|||
note.find(".note-header").hide()
|
||||
base_form = note.find(".note-edit-form")
|
||||
form = base_form.clone().insertAfter(base_form)
|
||||
form.addClass('current-note-edit-form')
|
||||
form.addClass('current-note-edit-form gfm-form')
|
||||
form.find('.div-dropzone').remove()
|
||||
|
||||
# Show the attachment delete link
|
||||
|
@ -296,6 +310,14 @@ class @Notes
|
|||
form.show()
|
||||
textarea = form.find("textarea")
|
||||
textarea.focus()
|
||||
|
||||
# HACK (rspeicher/DouweM): Work around a Chrome 43 bug(?).
|
||||
# The textarea has the correct value, Chrome just won't show it unless we
|
||||
# modify it, so let's clear it and re-set it!
|
||||
value = textarea.val()
|
||||
textarea.val ""
|
||||
textarea.val value
|
||||
|
||||
disableButtonIfEmptyField textarea, form.find(".js-comment-button")
|
||||
|
||||
###
|
||||
|
@ -371,6 +393,7 @@ class @Notes
|
|||
setupDiscussionNoteForm: (dataHolder, form) =>
|
||||
# setup note target
|
||||
form.attr "rel", dataHolder.data("discussionId")
|
||||
form.find("#line_type").val dataHolder.data("lineType")
|
||||
form.find("#note_commit_id").val dataHolder.data("commitId")
|
||||
form.find("#note_line_code").val dataHolder.data("lineCode")
|
||||
form.find("#note_noteable_type").val dataHolder.data("noteableType")
|
||||
|
@ -391,19 +414,40 @@ class @Notes
|
|||
form = $(".js-new-note-form")
|
||||
row = $(link).closest("tr")
|
||||
nextRow = row.next()
|
||||
hasNotes = nextRow.is(".notes_holder")
|
||||
addForm = false
|
||||
targetContent = ".notes_content"
|
||||
rowCssToAdd = "<tr class=\"notes_holder js-temp-notes-holder\"><td class=\"notes_line\" colspan=\"2\"></td><td class=\"notes_content\"></td></tr>"
|
||||
|
||||
# does it already have notes?
|
||||
if nextRow.is(".notes_holder")
|
||||
replyButton = nextRow.find(".js-discussion-reply-button")
|
||||
if replyButton.length > 0
|
||||
$.proxy(@replyToDiscussionNote, replyButton).call()
|
||||
# In parallel view, look inside the correct left/right pane
|
||||
if @isParallelView()
|
||||
lineType = $(link).data("lineType")
|
||||
targetContent += "." + lineType
|
||||
rowCssToAdd = "<tr class=\"notes_holder js-temp-notes-holder\"><td class=\"notes_line\"></td><td class=\"notes_content parallel old\"></td><td class=\"notes_line\"></td><td class=\"notes_content parallel new\"></td></tr>"
|
||||
|
||||
if hasNotes
|
||||
notesContent = nextRow.find(targetContent)
|
||||
if notesContent.length
|
||||
replyButton = notesContent.find(".js-discussion-reply-button:visible")
|
||||
if replyButton.length
|
||||
e.target = replyButton[0]
|
||||
$.proxy(@replyToDiscussionNote, replyButton[0], e).call()
|
||||
else
|
||||
# In parallel view, the form may not be present in one of the panes
|
||||
noteForm = notesContent.find(".js-discussion-note-form")
|
||||
if noteForm.length == 0
|
||||
addForm = true
|
||||
else
|
||||
# add a notes row and insert the form
|
||||
row.after "<tr class=\"notes_holder js-temp-notes-holder\"><td class=\"notes_line\" colspan=\"2\"></td><td class=\"notes_content\"></td></tr>"
|
||||
form.clone().appendTo row.next().find(".notes_content")
|
||||
row.after rowCssToAdd
|
||||
addForm = true
|
||||
|
||||
if addForm
|
||||
newForm = form.clone()
|
||||
newForm.appendTo row.next().find(targetContent)
|
||||
|
||||
# show the form
|
||||
@setupDiscussionNoteForm $(link), row.next().find("form")
|
||||
@setupDiscussionNoteForm $(link), newForm
|
||||
|
||||
###
|
||||
Called in response to "cancel" on a diff note form.
|
||||
|
@ -479,3 +523,13 @@ class @Notes
|
|||
else
|
||||
form.find('.js-note-target-reopen').text('Reopen')
|
||||
form.find('.js-note-target-close').text('Close')
|
||||
|
||||
initTaskList: ->
|
||||
@enableTaskList()
|
||||
$(document).on 'tasklist:changed', '.note .js-task-list-container', @updateTaskList
|
||||
|
||||
enableTaskList: ->
|
||||
$('.note .js-task-list-container').taskList('enable')
|
||||
|
||||
updateTaskList: ->
|
||||
$('form', this).submit()
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
@loading.show()
|
||||
$.ajax
|
||||
type: "GET"
|
||||
url: location.href
|
||||
url: $(".content_list").data('href') || location.href
|
||||
data: "limit=" + @limit + "&offset=" + @offset
|
||||
complete: =>
|
||||
@loading.hide()
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
class @Profile
|
||||
constructor: ->
|
||||
$('.edit_user .application-theme input, .edit_user .code-preview-theme input').click ->
|
||||
# Submit the form
|
||||
$('.edit_user').submit()
|
||||
|
||||
new Flash("Appearance settings saved", "notice")
|
||||
# Automatically submit the Preferences form when any of its radio buttons change
|
||||
$('.js-preferences-form').on 'change.preference', 'input[type=radio]', ->
|
||||
$(this).parents('form').submit()
|
||||
|
||||
$('.update-username form').on 'ajax:before', ->
|
||||
$('.loading-gif').show()
|
||||
|
@ -12,12 +10,11 @@ class @Profile
|
|||
$(this).find('.update-failed').hide()
|
||||
|
||||
$('.update-username form').on 'ajax:complete', ->
|
||||
$(this).find('.btn-save').enableButton()
|
||||
$(this).find('.btn-save').enable()
|
||||
$(this).find('.loading-gif').hide()
|
||||
|
||||
$('.update-notifications').on 'ajax:complete', ->
|
||||
$(this).find('.btn-save').enableButton()
|
||||
|
||||
$(this).find('.btn-save').enable()
|
||||
|
||||
$('.js-choose-user-avatar-button').bind "click", ->
|
||||
form = $(this).closest("form")
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
class @Project
|
||||
constructor: ->
|
||||
# Git clone panel switcher
|
||||
scope = $ '.git-clone-holder'
|
||||
if scope.length > 0
|
||||
$('a, button', scope).click ->
|
||||
$('a, button', scope).removeClass 'active'
|
||||
cloneHolder = $('.git-clone-holder')
|
||||
if cloneHolder.length
|
||||
$('a, button', cloneHolder).click ->
|
||||
$('a, button', cloneHolder).removeClass 'active'
|
||||
$(@).addClass 'active'
|
||||
$('#project_clone', scope).val $(@).data 'clone'
|
||||
$('#project_clone', cloneHolder).val $(@).data 'clone'
|
||||
$(".clone").text("").append $(@).data 'clone'
|
||||
|
||||
# Ref switcher
|
||||
|
|
|
@ -3,9 +3,3 @@ class @ProjectNew
|
|||
$('.project-edit-container').on 'ajax:before', =>
|
||||
$('.project-edit-container').hide()
|
||||
$('.save-project-loader').show()
|
||||
|
||||
@initEvents()
|
||||
|
||||
|
||||
initEvents: ->
|
||||
disableButtonIfEmptyField '#project_name', '.project-submit'
|
||||
|
|
|
@ -1,15 +1,3 @@
|
|||
class @ProjectShow
|
||||
constructor: ->
|
||||
$('.project-home-panel .star').on 'ajax:success', (e, data, status, xhr) ->
|
||||
$(@).toggleClass('on').find('.count').html(data.star_count)
|
||||
.on 'ajax:error', (e, xhr, status, error) ->
|
||||
new Flash('Star toggle failed. Try again later.', 'alert')
|
||||
|
||||
$("a[data-toggle='tab']").on "shown.bs.tab", (e) ->
|
||||
$.cookie "default_view", $(e.target).attr("href"), { expires: 30, path: '/' }
|
||||
|
||||
defaultView = $.cookie("default_view")
|
||||
if defaultView
|
||||
$("a[href=" + defaultView + "]").tab "show"
|
||||
else
|
||||
$("a[data-toggle='tab']:first").tab "show"
|
||||
# I kept class for future
|
||||
|
|
46
app/assets/javascripts/shortcuts_issuable.coffee
Normal file
|
@ -0,0 +1,46 @@
|
|||
#= require mousetrap
|
||||
#= require shortcuts_navigation
|
||||
|
||||
class @ShortcutsIssuable extends ShortcutsNavigation
|
||||
constructor: (isMergeRequest) ->
|
||||
super()
|
||||
Mousetrap.bind('a', ->
|
||||
$('.js-assignee').select2('open')
|
||||
return false
|
||||
)
|
||||
Mousetrap.bind('m', ->
|
||||
$('.js-milestone').select2('open')
|
||||
return false
|
||||
)
|
||||
Mousetrap.bind('r', =>
|
||||
@replyWithSelectedText()
|
||||
return false
|
||||
)
|
||||
|
||||
if isMergeRequest
|
||||
@enabledHelp.push('.hidden-shortcut.merge_requests')
|
||||
else
|
||||
@enabledHelp.push('.hidden-shortcut.issues')
|
||||
|
||||
replyWithSelectedText: ->
|
||||
if window.getSelection
|
||||
selected = window.getSelection().toString()
|
||||
replyField = $('.js-main-target-form #note_note')
|
||||
|
||||
return if selected.trim() == ""
|
||||
|
||||
# Put a '>' character before each non-empty line in the selection
|
||||
quote = _.map selected.split("\n"), (val) ->
|
||||
"> #{val}\n" if val.trim() != ''
|
||||
|
||||
# If replyField already has some content, add a newline before our quote
|
||||
separator = replyField.val().trim() != "" and "\n" or ''
|
||||
|
||||
replyField.val (_, current) ->
|
||||
current + separator + quote.join('') + "\n"
|
||||
|
||||
# Trigger autosave for the added text
|
||||
replyField.trigger('input')
|
||||
|
||||
# Focus the input field
|
||||
replyField.focus()
|
|
@ -1,19 +0,0 @@
|
|||
#= require shortcuts_navigation
|
||||
|
||||
class @ShortcutsIssueable extends ShortcutsNavigation
|
||||
constructor: (isMergeRequest) ->
|
||||
super()
|
||||
Mousetrap.bind('a', ->
|
||||
$('.js-assignee').select2('open')
|
||||
return false
|
||||
)
|
||||
Mousetrap.bind('m', ->
|
||||
$('.js-milestone').select2('open')
|
||||
return false
|
||||
)
|
||||
|
||||
if isMergeRequest
|
||||
@enabledHelp.push('.hidden-shortcut.merge_reuests')
|
||||
else
|
||||
@enabledHelp.push('.hidden-shortcut.issues')
|
||||
|
|
@ -4,6 +4,7 @@ class @ShortcutsNavigation extends Shortcuts
|
|||
constructor: ->
|
||||
super()
|
||||
Mousetrap.bind('g p', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-project'))
|
||||
Mousetrap.bind('g e', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-project-activity'))
|
||||
Mousetrap.bind('g f', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-tree'))
|
||||
Mousetrap.bind('g c', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-commits'))
|
||||
Mousetrap.bind('g n', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-network'))
|
||||
|
|
|
@ -4,6 +4,7 @@ $(document).on("click", '.toggle-nav-collapse', (e) ->
|
|||
expanded = 'page-sidebar-expanded'
|
||||
|
||||
$('.page-with-sidebar').toggleClass("#{collapsed} #{expanded}")
|
||||
$('header').toggleClass("header-collapsed header-expanded")
|
||||
$('.toggle-nav-collapse i').toggleClass("fa-angle-right fa-angle-left")
|
||||
$.cookie("collapsed_nav", $('.page-with-sidebar').hasClass(collapsed), { path: '/' })
|
||||
)
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
#= require d3
|
||||
#= require stat_graph_contributors_util
|
||||
|
||||
class @ContributorsStatGraph
|
||||
init: (log) ->
|
||||
@parsed_log = ContributorsStatGraphUtil.parse_log(log)
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
#= require d3
|
||||
#= require jquery
|
||||
#= require underscore
|
||||
|
||||
class @ContributorsGraph
|
||||
MARGIN:
|
||||
top: 20
|
||||
|
@ -46,7 +50,7 @@ class @ContributorsGraph
|
|||
|
||||
class @ContributorsMasterGraph extends ContributorsGraph
|
||||
constructor: (@data) ->
|
||||
@width = $('.container').width() - 345
|
||||
@width = $('.content').width() - 70
|
||||
@height = 200
|
||||
@x = null
|
||||
@y = null
|
||||
|
@ -119,7 +123,7 @@ class @ContributorsMasterGraph extends ContributorsGraph
|
|||
|
||||
class @ContributorsAuthorGraph extends ContributorsGraph
|
||||
constructor: (@data) ->
|
||||
@width = $('.container').width()/2 - 225
|
||||
@width = $('.content').width()/2 - 100
|
||||
@height = 200
|
||||
@x = null
|
||||
@y = null
|
||||
|
|
|
@ -2,11 +2,15 @@ window.ContributorsStatGraphUtil =
|
|||
parse_log: (log) ->
|
||||
total = {}
|
||||
by_author = {}
|
||||
by_email = {}
|
||||
for entry in log
|
||||
@add_date(entry.date, total) unless total[entry.date]?
|
||||
@add_author(entry, by_author) unless by_author[entry.author_name]?
|
||||
@add_date(entry.date, by_author[entry.author_name]) unless by_author[entry.author_name][entry.date]
|
||||
@store_data(entry, total[entry.date], by_author[entry.author_name][entry.date])
|
||||
|
||||
data = by_author[entry.author_name] #|| by_email[entry.author_email]
|
||||
data ?= @add_author(entry, by_author, by_email)
|
||||
|
||||
@add_date(entry.date, data) unless data[entry.date]
|
||||
@store_data(entry, total[entry.date], data[entry.date])
|
||||
total = _.toArray(total)
|
||||
by_author = _.toArray(by_author)
|
||||
total: total, by_author: by_author
|
||||
|
@ -15,10 +19,12 @@ window.ContributorsStatGraphUtil =
|
|||
collection[date] = {}
|
||||
collection[date].date = date
|
||||
|
||||
add_author: (author, by_author) ->
|
||||
by_author[author.author_name] = {}
|
||||
by_author[author.author_name].author_name = author.author_name
|
||||
by_author[author.author_name].author_email = author.author_email
|
||||
add_author: (author, by_author, by_email) ->
|
||||
data = {}
|
||||
data.author_name = author.author_name
|
||||
data.author_email = author.author_email
|
||||
by_author[author.author_name] = data
|
||||
by_email[author.author_email] = data
|
||||
|
||||
store_data: (entry, total, by_author) ->
|
||||
@store_commits(total, by_author)
|
||||
|
|
|
@ -6,6 +6,7 @@ class @UsersSelect
|
|||
$('.ajax-users-select').each (i, select) =>
|
||||
@projectId = $(select).data('project-id')
|
||||
@groupId = $(select).data('group-id')
|
||||
@showCurrentUser = $(select).data('current-user')
|
||||
showNullUser = $(select).data('null-user')
|
||||
showAnyUser = $(select).data('any-user')
|
||||
showEmailUser = $(select).data('email-user')
|
||||
|
@ -108,6 +109,7 @@ class @UsersSelect
|
|||
active: true
|
||||
project_id: @projectId
|
||||
group_id: @groupId
|
||||
current_user: @showCurrentUser
|
||||
dataType: "json"
|
||||
).done (users) ->
|
||||
callback(users)
|
||||
|
|
|
@ -1,9 +1,17 @@
|
|||
class @Wikis
|
||||
constructor: ->
|
||||
$('.build-new-wiki').bind "click", ->
|
||||
$('.build-new-wiki').bind "click", (e) ->
|
||||
$('[data-error~=slug]').addClass("hidden")
|
||||
$('p.hint').show()
|
||||
field = $('#new_wiki_path')
|
||||
slug = field.val()
|
||||
path = field.attr('data-wikis-path')
|
||||
valid_slug_pattern = /^[\w\/-]+$/
|
||||
|
||||
slug = field.val()
|
||||
if slug.match valid_slug_pattern
|
||||
path = field.attr('data-wikis-path')
|
||||
if(slug.length > 0)
|
||||
location.href = path + "/" + slug
|
||||
else
|
||||
e.preventDefault()
|
||||
$('p.hint').hide()
|
||||
$('[data-error~=slug]').removeClass("hidden")
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
class @ZenMode
|
||||
@fullscreen_prefix = 'fullscreen_'
|
||||
#= require dropzone
|
||||
#= require mousetrap
|
||||
#= require mousetrap/pause
|
||||
|
||||
class @ZenMode
|
||||
constructor: ->
|
||||
@active_zen_area = null
|
||||
@active_checkbox = null
|
||||
|
@ -12,34 +14,31 @@ class @ZenMode
|
|||
|
||||
$('body').on 'click', '.zen-enter-link', (e) =>
|
||||
e.preventDefault()
|
||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true)
|
||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true).change()
|
||||
|
||||
$('body').on 'click', '.zen-leave-link', (e) =>
|
||||
e.preventDefault()
|
||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false)
|
||||
$(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false).change()
|
||||
|
||||
$('body').on 'change', '.zen-toggle-comment', (e) =>
|
||||
checkbox = e.currentTarget
|
||||
if checkbox.checked
|
||||
# Disable other keyboard shortcuts in ZEN mode
|
||||
Mousetrap.pause()
|
||||
@udpateActiveZenArea(checkbox)
|
||||
@updateActiveZenArea(checkbox)
|
||||
else
|
||||
@exitZenMode()
|
||||
|
||||
$(document).on 'keydown', (e) =>
|
||||
if e.keyCode is $.ui.keyCode.ESCAPE
|
||||
if e.keyCode is 27 # Esc
|
||||
@exitZenMode()
|
||||
e.preventDefault()
|
||||
|
||||
$(window).on 'hashchange', @updateZenModeFromLocationHash
|
||||
|
||||
udpateActiveZenArea: (checkbox) =>
|
||||
updateActiveZenArea: (checkbox) =>
|
||||
@active_checkbox = $(checkbox)
|
||||
@active_checkbox.prop('checked', true)
|
||||
@active_zen_area = @active_checkbox.parent().find('textarea')
|
||||
@active_zen_area.focus()
|
||||
window.location.hash = ZenMode.fullscreen_prefix + @active_checkbox.prop('id')
|
||||
|
||||
exitZenMode: =>
|
||||
if @active_zen_area isnt null
|
||||
|
@ -47,21 +46,9 @@ class @ZenMode
|
|||
@active_checkbox.prop('checked', false)
|
||||
@active_zen_area = null
|
||||
@active_checkbox = null
|
||||
window.location.hash = ''
|
||||
window.scrollTo(window.pageXOffset, @scroll_position)
|
||||
@restoreScroll(@scroll_position)
|
||||
# Enable dropzone when leaving ZEN mode
|
||||
Dropzone.forElement('.div-dropzone').enable()
|
||||
|
||||
checkboxFromLocationHash: (e) ->
|
||||
id = $.trim(window.location.hash.replace('#' + ZenMode.fullscreen_prefix, ''))
|
||||
if id
|
||||
return $('.zennable input[type=checkbox]#' + id)[0]
|
||||
else
|
||||
return null
|
||||
|
||||
updateZenModeFromLocationHash: (e) =>
|
||||
checkbox = @checkboxFromLocationHash()
|
||||
if checkbox
|
||||
@udpateActiveZenArea(checkbox)
|
||||
else
|
||||
@exitZenMode()
|
||||
restoreScroll: (y) ->
|
||||
window.scrollTo(window.pageXOffset, y)
|
||||
|
|
|
@ -35,26 +35,26 @@
|
|||
*/
|
||||
@import "font-awesome";
|
||||
|
||||
/**
|
||||
* UI themes:
|
||||
*/
|
||||
@import "themes/**/*";
|
||||
|
||||
/**
|
||||
* Generic css (forms, nav etc):
|
||||
*/
|
||||
@import "generic/*";
|
||||
@import "generic/**/*";
|
||||
|
||||
/**
|
||||
* Page specific styles (issues, projects etc):
|
||||
*/
|
||||
|
||||
@import "pages/*";
|
||||
@import "pages/**/*";
|
||||
|
||||
/**
|
||||
* Code highlight
|
||||
*/
|
||||
@import "highlight/*";
|
||||
|
||||
/**
|
||||
* UI themes:
|
||||
*/
|
||||
@import "themes/*";
|
||||
@import "highlight/**/*";
|
||||
|
||||
/**
|
||||
* Styles for JS behaviors.
|
||||
|
|
|
@ -117,7 +117,7 @@
|
|||
color: #888;
|
||||
text-shadow: 0 1px 1px #fff;
|
||||
}
|
||||
i[class~="fa"] {
|
||||
i.fa {
|
||||
line-height: 14px;
|
||||
}
|
||||
}
|
||||
|
@ -137,6 +137,12 @@
|
|||
color: #666;
|
||||
}
|
||||
|
||||
.nav-pills > .active > a > span > .badge {
|
||||
background-color: #fff;
|
||||
color: $gl-primary;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* fix to keep tooltips position in top navigation bar
|
||||
*
|
||||
|
|
|
@ -4,7 +4,7 @@ html {
|
|||
&.touch .tooltip { display: none !important; }
|
||||
|
||||
body {
|
||||
padding-top: 46px;
|
||||
padding-top: $header-height;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,10 @@
|
|||
@include border-radius($radius 0 0 $radius)
|
||||
}
|
||||
|
||||
@mixin border-radius-right($radius) {
|
||||
@include border-radius(0 0 $radius $radius)
|
||||
}
|
||||
|
||||
@mixin linear-gradient($from, $to) {
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to));
|
||||
background-image: -webkit-linear-gradient($from, $to);
|
||||
|
@ -50,13 +54,6 @@
|
|||
@include box-shadow(0 0 0 3px #f1f1f1);
|
||||
}
|
||||
|
||||
@mixin header-font {
|
||||
color: $style_color;
|
||||
font-size: 16px;
|
||||
line-height: 44px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
@mixin md-typography {
|
||||
font-size: 15px;
|
||||
line-height: 1.5;
|
||||
|
@ -73,7 +70,23 @@
|
|||
font-family: $monospace_font;
|
||||
white-space: pre;
|
||||
word-wrap: normal;
|
||||
padding: 0;
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
kbd {
|
||||
display: inline-block;
|
||||
padding: 3px 5px;
|
||||
font-size: 11px;
|
||||
line-height: 10px;
|
||||
color: #555;
|
||||
vertical-align: middle;
|
||||
background-color: #FCFCFC;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #CCC #CCC #BBB;
|
||||
border-image: none;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0px -1px 0px #BBB inset;
|
||||
}
|
||||
|
||||
h1 {
|
||||
|
@ -96,7 +109,7 @@
|
|||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
blockquote p {
|
||||
blockquote {
|
||||
color: #888;
|
||||
font-size: 15px;
|
||||
line-height: 1.5;
|
||||
|
@ -113,7 +126,6 @@
|
|||
p > code {
|
||||
font-size: inherit;
|
||||
font-weight: inherit;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
li {
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
$style_color: #474D57;
|
||||
$hover: #FFF3EB;
|
||||
$hover: #FFFAF1;
|
||||
$gl-text-color: #222222;
|
||||
$gl-link-color: #446e9b;
|
||||
$nprogress-color: #c0392b;
|
||||
$gl-font-size: 14px;
|
||||
$list-font-size: 15px;
|
||||
$sidebar_collapsed_width: 52px;
|
||||
$sidebar_width: 230px;
|
||||
$avatar_radius: 50%;
|
||||
$code_font_size: 13px;
|
||||
$code_line_height: 1.5;
|
||||
$border-color: #E5E5E5;
|
||||
$background-color: #f5f5f5;
|
||||
$header-height: 50px;
|
||||
$readable-width: 1100px;
|
||||
|
||||
|
||||
/*
|
||||
* State colors:
|
||||
|
|
|
@ -184,7 +184,7 @@ li.note {
|
|||
}
|
||||
}
|
||||
|
||||
.supp_diff_link,
|
||||
.show-suppressed-diff,
|
||||
.show-all-commits {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
@ -307,7 +307,7 @@ table {
|
|||
}
|
||||
|
||||
.btn-sign-in {
|
||||
margin-top: 5px;
|
||||
margin-top: 7px;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
|
@ -333,17 +333,8 @@ table {
|
|||
}
|
||||
|
||||
.search_box {
|
||||
position: relative;
|
||||
padding: 30px;
|
||||
@extend .well;
|
||||
text-align: center;
|
||||
background-color: #F9F9F9;
|
||||
border: 1px solid #DDDDDD;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
.search_glyph {
|
||||
color: #555;
|
||||
font-size: 42px;
|
||||
}
|
||||
|
||||
.task-status {
|
||||
|
@ -351,9 +342,8 @@ table {
|
|||
}
|
||||
|
||||
#nprogress .spinner {
|
||||
top: auto !important;
|
||||
bottom: 20px !important;
|
||||
left: 20px !important;
|
||||
top: 15px !important;
|
||||
right: 10px !important;
|
||||
}
|
||||
|
||||
.header-with-avatar {
|
||||
|
@ -374,3 +364,12 @@ table {
|
|||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.profiler-results {
|
||||
top: 50px !important;
|
||||
|
||||
.profiler-button,
|
||||
.profiler-controls {
|
||||
border-color: #EEE !important;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,12 +90,7 @@
|
|||
border-right: none;
|
||||
}
|
||||
background: #fff;
|
||||
padding: 5px;
|
||||
}
|
||||
.author,
|
||||
.blame_commit {
|
||||
background: $background-color;
|
||||
vertical-align: top;
|
||||
padding: 8px;
|
||||
}
|
||||
.lines {
|
||||
pre {
|
||||
|
|
|
@ -49,14 +49,6 @@ label {
|
|||
width: 250px;
|
||||
}
|
||||
|
||||
.input-mx-250 {
|
||||
max-width: 250px;
|
||||
}
|
||||
|
||||
.input-mn-300 {
|
||||
min-width: 300px;
|
||||
}
|
||||
|
||||
.custom-form-control {
|
||||
width: 150px;
|
||||
}
|
||||
|
@ -89,7 +81,6 @@ label {
|
|||
@include box-shadow(none);
|
||||
}
|
||||
|
||||
.issuable-description,
|
||||
.wiki-content {
|
||||
margin-top: 35px;
|
||||
}
|
||||
|
|
|
@ -19,3 +19,7 @@
|
|||
height: 14em;
|
||||
}
|
||||
}
|
||||
|
||||
.gfm-commit, .gfm-commit_range {
|
||||
font-family: $monospace_font;
|
||||
}
|
||||
|
|
226
app/assets/stylesheets/generic/header.scss
Normal file
|
@ -0,0 +1,226 @@
|
|||
/*
|
||||
* Application Header
|
||||
*
|
||||
*/
|
||||
header {
|
||||
transition-duration: .3s;
|
||||
|
||||
&.navbar-empty {
|
||||
background: #FFF;
|
||||
border-bottom: 1px solid #EEE;
|
||||
|
||||
.center-logo {
|
||||
margin: 8px 0;
|
||||
text-align: center;
|
||||
|
||||
img {
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.navbar-gitlab {
|
||||
z-index: 100;
|
||||
margin-bottom: 0;
|
||||
min-height: $header-height;
|
||||
border: none;
|
||||
width: 100%;
|
||||
|
||||
.container {
|
||||
background: #FFF;
|
||||
width: 100% !important;
|
||||
padding: 0;
|
||||
filter: none;
|
||||
|
||||
.nav > li > a {
|
||||
color: #888;
|
||||
font-size: 14px;
|
||||
padding: 0;
|
||||
background-color: #f5f5f5;
|
||||
margin: ($header-height - 28) / 2 0;
|
||||
margin-left: 10px;
|
||||
border-radius: 40px;
|
||||
height: 28px;
|
||||
width: 28px;
|
||||
line-height: 28px;
|
||||
text-align: center;
|
||||
|
||||
&:hover, &:focus, &:active {
|
||||
background-color: #EEE;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-toggle {
|
||||
color: #666;
|
||||
margin: 0;
|
||||
border-radius: 0;
|
||||
position: absolute;
|
||||
right: 2px;
|
||||
|
||||
&:hover {
|
||||
background-color: #EEE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.header-logo {
|
||||
border-bottom: 1px solid transparent;
|
||||
float: left;
|
||||
height: $header-height;
|
||||
width: $sidebar_width;
|
||||
overflow: hidden;
|
||||
transition-duration: .3s;
|
||||
|
||||
a {
|
||||
float: left;
|
||||
height: $header-height;
|
||||
width: 100%;
|
||||
padding: ($header-height - 36 ) / 2 8px;
|
||||
overflow: hidden;
|
||||
|
||||
img {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.gitlab-text-container {
|
||||
width: 230px;
|
||||
|
||||
h3 {
|
||||
width: 158px;
|
||||
float: left;
|
||||
margin: 0;
|
||||
margin-left: 14px;
|
||||
font-size: 18px;
|
||||
line-height: $header-height - 14;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: #EEE;
|
||||
}
|
||||
}
|
||||
|
||||
.header-content {
|
||||
border-bottom: 1px solid #EEE;
|
||||
padding-right: 35px;
|
||||
height: $header-height;
|
||||
|
||||
.title {
|
||||
margin: 0;
|
||||
padding: 0 15px 0 35px;
|
||||
overflow: hidden;
|
||||
font-size: 18px;
|
||||
line-height: $header-height;
|
||||
font-weight: bold;
|
||||
color: #444;
|
||||
text-overflow: ellipsis;
|
||||
vertical-align: top;
|
||||
white-space: nowrap;
|
||||
|
||||
a {
|
||||
color: #444;
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-collapse {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.search {
|
||||
margin-right: 10px;
|
||||
margin-left: 10px;
|
||||
margin-top: ($header-height - 28) / 2;
|
||||
|
||||
form {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
width: 220px;
|
||||
background-image: image-url("icon-search.png");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 10px;
|
||||
height: inherit;
|
||||
padding: 4px 6px;
|
||||
padding-left: 25px;
|
||||
font-size: 13px;
|
||||
background-color: #f5f5f5;
|
||||
border-color: #f5f5f5;
|
||||
|
||||
&:focus {
|
||||
@include box-shadow(none);
|
||||
outline: none;
|
||||
border-color: #DDD;
|
||||
background-color: #FFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin collapsed-header {
|
||||
.header-logo {
|
||||
width: $sidebar_collapsed_width;
|
||||
}
|
||||
|
||||
.header-content {
|
||||
.title {
|
||||
margin-left: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-md-max) {
|
||||
.header-collapsed, .header-expanded {
|
||||
@include collapsed-header;
|
||||
}
|
||||
}
|
||||
|
||||
@media(min-width: $screen-md-max) {
|
||||
.header-collapsed {
|
||||
@include collapsed-header;
|
||||
}
|
||||
|
||||
.header-expanded {
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
header .container {
|
||||
font-size: 18px;
|
||||
|
||||
.title {
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
margin: 0px;
|
||||
float: none !important;
|
||||
|
||||
.visible-xs, .visable-sm {
|
||||
display: table-cell !important;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-collapse {
|
||||
padding-left: 5px;
|
||||
|
||||
li {
|
||||
display: table-cell;
|
||||
width: 1%;
|
||||
|
||||
a {
|
||||
margin-left: 8px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
.issue-box {
|
||||
display: inline-block;
|
||||
padding: 7px 13px;
|
||||
padding: 4px 13px;
|
||||
font-weight: normal;
|
||||
margin-right: 5px;
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
|
||||
&:hover {
|
||||
background: $hover;
|
||||
border-bottom: 1px solid darken($hover, 10%);
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
|
|
|
@ -40,6 +40,15 @@
|
|||
font-size: inherit;
|
||||
}
|
||||
|
||||
.div-dropzone-progress {
|
||||
position: absolute;
|
||||
top: 7px;
|
||||
left: -40px;
|
||||
width: 35px;
|
||||
font-size: 13px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.dz-preview {
|
||||
display: none;
|
||||
}
|
||||
|
@ -52,6 +61,22 @@
|
|||
transition: opacity 200ms ease-in-out;
|
||||
}
|
||||
|
||||
.md-area {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.md-header ul {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.referenced-users {
|
||||
padding: 10px 0;
|
||||
color: #999;
|
||||
margin-left: 10px;
|
||||
margin-top: 1px;
|
||||
margin-right: 130px;
|
||||
}
|
||||
|
||||
.md-preview-holder {
|
||||
background: #FFF;
|
||||
border: 1px solid #ddd;
|
||||
|
|
|
@ -4,6 +4,11 @@
|
|||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.nav.nav-tabs > li > a {
|
||||
padding: 10px;
|
||||
font-size: 12px;
|
||||
|
@ -14,6 +19,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
.referenced-users {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.issues-filters,
|
||||
.dash-projects-filters,
|
||||
.check-all-holder {
|
||||
|
@ -27,6 +36,50 @@
|
|||
.project-home-links {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.project-avatar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.project-home-panel {
|
||||
padding-left: 0 !important;
|
||||
|
||||
.project-avatar {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.project-home-desc {
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
.project-repo-buttons,
|
||||
.git-clone-holder {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.project-stats {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.container .title {
|
||||
padding-left: 15px !important;
|
||||
}
|
||||
|
||||
.issue-info, .merge-request-info {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.issue-details {
|
||||
.creator,
|
||||
.page-title .btn-close {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
%ul.notes .note-role, .note-actions {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-sm-max) {
|
||||
|
|
|
@ -1,193 +0,0 @@
|
|||
.page-with-sidebar {
|
||||
background: $background-color;
|
||||
|
||||
.sidebar-wrapper {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
border-right: 1px solid $border-color;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-wrapper {
|
||||
z-index: 99;
|
||||
background: $background-color;
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.nav-sidebar {
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
|
||||
&.navbar-collapse {
|
||||
padding: 0px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-sidebar li a .count {
|
||||
float: right;
|
||||
background: #eee;
|
||||
padding: 0px 8px;
|
||||
@include border-radius(6px);
|
||||
}
|
||||
|
||||
.nav-sidebar li {
|
||||
&.active a {
|
||||
color: $text-color;
|
||||
background: #FFF !important;
|
||||
font-weight: bold;
|
||||
border: 1px solid #EEE;
|
||||
border-right: 1px solid transparent;
|
||||
border-left: 3px solid $style_color;
|
||||
|
||||
&.no-highlight {
|
||||
background: none !important;
|
||||
border: none;
|
||||
}
|
||||
|
||||
i {
|
||||
color: $text-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-sidebar li {
|
||||
&.separate-item {
|
||||
border-top: 1px solid $border-color;
|
||||
padding-top: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: $gray;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
padding: 8px 15px;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
padding-left: 20px;
|
||||
|
||||
&:hover {
|
||||
text-decoration: none;
|
||||
color: $text-color;
|
||||
background: $border-color;
|
||||
}
|
||||
|
||||
&:active, &:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
i {
|
||||
width: 20px;
|
||||
color: $gray-light;
|
||||
margin-right: 23px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-subnav {
|
||||
margin-left: 0px;
|
||||
padding-left: 0px;
|
||||
|
||||
li {
|
||||
list-style: none;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin expanded-sidebar {
|
||||
padding-left: $sidebar_width;
|
||||
|
||||
.sidebar-wrapper {
|
||||
width: $sidebar_width;
|
||||
|
||||
.nav-sidebar {
|
||||
margin-top: 29px;
|
||||
position: fixed;
|
||||
top: 45px;
|
||||
width: $sidebar_width;
|
||||
}
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin folded-sidebar {
|
||||
padding-left: 50px;
|
||||
|
||||
.sidebar-wrapper {
|
||||
width: 52px;
|
||||
|
||||
.nav-sidebar {
|
||||
margin-top: 29px;
|
||||
position: fixed;
|
||||
top: 45px;
|
||||
width: 52px;
|
||||
|
||||
li a {
|
||||
padding-left: 18px;
|
||||
font-size: 14px;
|
||||
padding: 8px 15px;
|
||||
text-align: center;
|
||||
|
||||
|
||||
& > span {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.collapse-nav a {
|
||||
left: 0px;
|
||||
padding: 7px 23px 3px 22px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.collapse-nav a {
|
||||
position: fixed;
|
||||
top: 46px;
|
||||
padding: 5px 13px 5px 13px;
|
||||
left: 198px;
|
||||
font-size: 13px;
|
||||
background: transparent;
|
||||
color: black;
|
||||
border-left: 1px solid $border-color;
|
||||
border-bottom: 1px solid $border-color;
|
||||
}
|
||||
|
||||
.collapse-nav a:hover {
|
||||
text-decoration: none;
|
||||
background: #f2f6f7;
|
||||
}
|
||||
|
||||
@media (max-width: $screen-md-max) {
|
||||
.page-sidebar-collapsed {
|
||||
@include folded-sidebar;
|
||||
}
|
||||
|
||||
.page-sidebar-expanded {
|
||||
@include folded-sidebar;
|
||||
}
|
||||
|
||||
.collapse-nav {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media(min-width: $screen-md-max) {
|
||||
.page-sidebar-collapsed {
|
||||
@include folded-sidebar;
|
||||
}
|
||||
|
||||
.page-sidebar-expanded {
|
||||
@include expanded-sidebar;
|
||||
}
|
||||
}
|
190
app/assets/stylesheets/generic/sidebar.scss
Normal file
|
@ -0,0 +1,190 @@
|
|||
.page-with-sidebar {
|
||||
.sidebar-wrapper {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
transition-duration: .3s;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-wrapper {
|
||||
z-index: 99;
|
||||
background: $background-color;
|
||||
transition-duration: .3s;
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
background: #FFF;
|
||||
}
|
||||
|
||||
.nav-sidebar {
|
||||
margin-top: 29 + $header-height;
|
||||
margin-bottom: 50px;
|
||||
transition-duration: .3s;
|
||||
list-style: none;
|
||||
overflow: hidden;
|
||||
|
||||
&.navbar-collapse {
|
||||
padding: 0px !important;
|
||||
}
|
||||
|
||||
li {
|
||||
width: $sidebar_width;
|
||||
|
||||
&.separate-item {
|
||||
padding-top: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
a {
|
||||
padding: 8px 15px;
|
||||
font-size: 13px;
|
||||
line-height: 18px;
|
||||
color: $gray;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
padding-left: 16px;
|
||||
|
||||
&:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&:active, &:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
i {
|
||||
width: 20px;
|
||||
color: $gray-light;
|
||||
margin-right: 23px;
|
||||
}
|
||||
|
||||
.count {
|
||||
float: right;
|
||||
background: #eee;
|
||||
padding: 0px 8px;
|
||||
@include border-radius(6px);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-subnav {
|
||||
margin-left: 0px;
|
||||
padding-left: 0px;
|
||||
|
||||
li {
|
||||
list-style: none;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin expanded-sidebar {
|
||||
padding-left: $sidebar_width;
|
||||
transition-duration: .3s;
|
||||
|
||||
.sidebar-wrapper {
|
||||
width: $sidebar_width;
|
||||
|
||||
.nav-sidebar {
|
||||
width: $sidebar_width;
|
||||
}
|
||||
|
||||
.nav-sidebar li a{
|
||||
width: 230px;
|
||||
|
||||
&.back-link {
|
||||
i {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin folded-sidebar {
|
||||
padding-left: 50px;
|
||||
transition-duration: .3s;
|
||||
|
||||
.sidebar-wrapper {
|
||||
width: $sidebar_collapsed_width;
|
||||
|
||||
.nav-sidebar {
|
||||
width: $sidebar_collapsed_width;
|
||||
|
||||
li a {
|
||||
padding-left: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.collapse-nav a {
|
||||
left: 0px;
|
||||
width: $sidebar_collapsed_width;
|
||||
}
|
||||
|
||||
.sidebar-user {
|
||||
width: $sidebar_collapsed_width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.collapse-nav a {
|
||||
position: fixed;
|
||||
top: $header-height;
|
||||
left: 198px;
|
||||
font-size: 13px;
|
||||
background: transparent;
|
||||
width: 32px;
|
||||
height: 28px;
|
||||
text-align: center;
|
||||
line-height: 28px;
|
||||
transition-duration: .3s;
|
||||
}
|
||||
|
||||
.collapse-nav a:hover {
|
||||
text-decoration: none;
|
||||
background: #f2f6f7;
|
||||
}
|
||||
|
||||
@media (max-width: $screen-md-max) {
|
||||
.page-sidebar-collapsed {
|
||||
@include folded-sidebar;
|
||||
}
|
||||
|
||||
.page-sidebar-expanded {
|
||||
@include folded-sidebar;
|
||||
}
|
||||
|
||||
.collapse-nav {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media(min-width: $screen-md-max) {
|
||||
.page-sidebar-collapsed {
|
||||
@include folded-sidebar;
|
||||
}
|
||||
|
||||
.page-sidebar-expanded {
|
||||
@include expanded-sidebar;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-user {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: $sidebar_width;
|
||||
padding: 10px;
|
||||
overflow: hidden;
|
||||
transition-duration: .3s;
|
||||
|
||||
.username {
|
||||
margin-top: 5px;
|
||||
width: $sidebar_width - 2 * 10px;
|
||||
}
|
||||
}
|
|
@ -17,12 +17,31 @@ pre {
|
|||
background: #333;
|
||||
color: $background-color;
|
||||
}
|
||||
|
||||
&.plain-readme {
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.monospace {
|
||||
font-family: $monospace_font;
|
||||
}
|
||||
|
||||
code {
|
||||
&.key-fingerprint {
|
||||
background: $body-bg;
|
||||
color: $text-color;
|
||||
}
|
||||
}
|
||||
|
||||
a > code {
|
||||
color: $link-color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wiki typography
|
||||
*
|
||||
|
@ -35,7 +54,14 @@ pre {
|
|||
/* Link to current header. */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
position: relative;
|
||||
&:hover > :last-child {
|
||||
|
||||
a.anchor {
|
||||
// Setting `display: none` would prevent the anchor being scrolled to, so
|
||||
// instead we set the height to 0 and it gets updated on hover.
|
||||
height: 0;
|
||||
}
|
||||
|
||||
&:hover > a.anchor {
|
||||
$size: 16px;
|
||||
position: absolute;
|
||||
right: 100%;
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
.zennable {
|
||||
position: relative;
|
||||
|
||||
input {
|
||||
.zen-toggle-comment {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.zen-enter-link {
|
||||
color: #888;
|
||||
position: absolute;
|
||||
top: -26px;
|
||||
top: 0px;
|
||||
right: 4px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.zen-leave-link {
|
||||
|
@ -26,10 +25,12 @@
|
|||
}
|
||||
}
|
||||
|
||||
// Hide the Enter link when we're in Zen mode
|
||||
input:checked ~ .zen-backdrop .zen-enter-link {
|
||||
display: none;
|
||||
}
|
||||
|
||||
// Show the Leave link when we're in Zen mode
|
||||
input:checked ~ .zen-backdrop .zen-leave-link {
|
||||
display: block;
|
||||
position: absolute;
|
||||
|
@ -62,37 +63,24 @@
|
|||
}
|
||||
}
|
||||
|
||||
.zen-backdrop textarea::-webkit-input-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea:-moz-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea::-moz-placeholder {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.zen-backdrop textarea:-ms-input-placeholder {
|
||||
color: white;
|
||||
}
|
||||
// Make the color of the placeholder text in the Zenned-out textarea darker,
|
||||
// so it becomes visible
|
||||
|
||||
input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder {
|
||||
color: #999;
|
||||
color: #A8A8A8;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea:-moz-placeholder {
|
||||
color: #999;
|
||||
color: #A8A8A8;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea::-moz-placeholder {
|
||||
color: #999;
|
||||
color: #A8A8A8;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
input:checked ~ .zen-backdrop textarea:-ms-input-placeholder {
|
||||
color: #999;
|
||||
color: #A8A8A8;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,10 +29,6 @@
|
|||
|
||||
.commits-feed-holder {
|
||||
float: right;
|
||||
|
||||
.btn {
|
||||
padding: 4px 12px;
|
||||
}
|
||||
}
|
||||
|
||||
li.commit {
|
||||
|
|
|
@ -28,10 +28,6 @@
|
|||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
|
||||
.str-truncated {
|
||||
max-width: 72%;
|
||||
}
|
||||
|
||||
a {
|
||||
display: block;
|
||||
padding: 8px 15px;
|
||||
|
|
|
@ -65,6 +65,17 @@
|
|||
color: #777;
|
||||
}
|
||||
|
||||
.suppressed-container {
|
||||
padding: ($padding-base-vertical + 5px) $padding-base-horizontal;
|
||||
text-align: center;
|
||||
|
||||
// "Changes suppressed. Click to show." link
|
||||
.show-suppressed-diff {
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
font-family: $monospace_font;
|
||||
|
|
|
@ -1,194 +0,0 @@
|
|||
/*
|
||||
* Application Header
|
||||
*
|
||||
*/
|
||||
header {
|
||||
&.navbar-gitlab {
|
||||
z-index: 100;
|
||||
margin-bottom: 0;
|
||||
min-height: 40px;
|
||||
border: none;
|
||||
width: 100%;
|
||||
|
||||
.navbar-inner {
|
||||
filter: none;
|
||||
|
||||
.nav > li > a {
|
||||
font-size: 14px;
|
||||
line-height: 32px;
|
||||
padding: 6px 10px;
|
||||
|
||||
&:hover, &:focus, &:active {
|
||||
background: none;
|
||||
}
|
||||
}
|
||||
|
||||
/** NAV block with links and profile **/
|
||||
.nav {
|
||||
float: right;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.navbar-toggle {
|
||||
color: $style_color;
|
||||
margin: 0;
|
||||
padding: 10px;
|
||||
border-radius: 0;
|
||||
|
||||
button i { font-size: 22px; }
|
||||
|
||||
&.collapsed { background-color: transparent !important;}
|
||||
|
||||
&:hover {
|
||||
background-color: #EEE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.turbolink-spinner {
|
||||
font-size: 20px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
border-width: 0;
|
||||
font-size: 18px;
|
||||
|
||||
.title {
|
||||
@include str-truncated(70%);
|
||||
}
|
||||
|
||||
.navbar-collapse {
|
||||
margin-top: 47px;
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
margin: 5px 0;
|
||||
|
||||
.visible-xs, .visable-sm {
|
||||
display: table-cell !important;
|
||||
}
|
||||
}
|
||||
|
||||
li {
|
||||
display: table-cell;
|
||||
width: 1%;
|
||||
|
||||
a {
|
||||
text-align: center;
|
||||
font-size: 18px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100% !important;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Logo holder
|
||||
*
|
||||
*/
|
||||
.app_logo {
|
||||
float: left;
|
||||
margin-right: 9px;
|
||||
|
||||
a {
|
||||
float: left;
|
||||
padding: 5px 0;
|
||||
height: 46px;
|
||||
width: 52px;
|
||||
text-align: center;
|
||||
|
||||
img {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
}
|
||||
&:hover {
|
||||
background-color: #EEE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Project / Area name
|
||||
*
|
||||
*/
|
||||
.title {
|
||||
position: relative;
|
||||
float: left;
|
||||
margin: 0;
|
||||
margin-left: 5px;
|
||||
@include header-font;
|
||||
@include str-truncated(37%);
|
||||
}
|
||||
|
||||
.profile-pic {
|
||||
padding: 0px !important;
|
||||
width: 46px;
|
||||
height: 46px;
|
||||
margin-left: 5px;
|
||||
img {
|
||||
width: 46px;
|
||||
height: 46px;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Search box
|
||||
*
|
||||
*/
|
||||
.search {
|
||||
margin-right: 10px;
|
||||
margin-left: 10px;
|
||||
margin-top: 8px;
|
||||
|
||||
form {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
background-image: image-url("icon-search.png");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 10px;
|
||||
height: inherit;
|
||||
padding: 4px 6px;
|
||||
padding-left: 25px;
|
||||
font-size: 13px;
|
||||
@include border-radius(3px);
|
||||
border: 1px solid #c6c6c6;
|
||||
box-shadow: none;
|
||||
@include transition(all 0.15s ease-in 0s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.search .search-input {
|
||||
width: 300px;
|
||||
&:focus {
|
||||
width: 330px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.search .search-input {
|
||||
width: 200px;
|
||||
&:focus {
|
||||
width: 230px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
#nprogress .spinner {
|
||||
right: 35px !important;
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@
|
|||
&.affix {
|
||||
position: fixed;
|
||||
top: 70px;
|
||||
width: 220px;
|
||||
margin-right: 35px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,3 +45,9 @@
|
|||
|
||||
.btn { font-size: 13px; }
|
||||
}
|
||||
|
||||
.issuable-details {
|
||||
.description {
|
||||
max-width: $readable-width;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,17 +25,8 @@
|
|||
display: inline-block;
|
||||
}
|
||||
|
||||
.issue-actions {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 15px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.issue-actions {
|
||||
display: block;
|
||||
}
|
||||
.issue-no-comments {
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,15 @@
|
|||
|
||||
/**
|
||||
* MR -> show: Automerge widget
|
||||
*
|
||||
*/
|
||||
.automerge_widget {
|
||||
.mr-state-widget {
|
||||
background: #FAFAFA;
|
||||
margin-bottom: 20px;
|
||||
color: #666;
|
||||
border: 1px solid #e5e5e5;
|
||||
@include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05));
|
||||
@include border-radius(3px);
|
||||
|
||||
form {
|
||||
margin-bottom: 0;
|
||||
.clearfix {
|
||||
|
@ -20,22 +26,71 @@
|
|||
display: inline-block;
|
||||
margin: 0;
|
||||
margin-left: 20px;
|
||||
padding: 10px 0;
|
||||
padding: 5px;
|
||||
line-height: 20px;
|
||||
font-weight: bold;
|
||||
|
||||
.remove_source_checkbox {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ci_widget {
|
||||
border-bottom: 1px solid #EEE;
|
||||
|
||||
i {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
&.ci-success {
|
||||
color: $gl-success;
|
||||
}
|
||||
|
||||
&.ci-skipped {
|
||||
background-color: #eee;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
&.ci-pending,
|
||||
&.ci-running {
|
||||
color: $gl-warning;
|
||||
}
|
||||
|
||||
&.ci-failed,
|
||||
&.ci-canceled,
|
||||
&.ci-error {
|
||||
color: $gl-danger;
|
||||
}
|
||||
}
|
||||
|
||||
.mr-widget-body,
|
||||
.ci_widget,
|
||||
.mr-widget-footer {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.mr-widget-body {
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.mr-widget-footer {
|
||||
border-top: 1px solid #EEE;
|
||||
}
|
||||
|
||||
.ci-coverage {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
@media(min-width: $screen-sm-max) {
|
||||
.merge-request .merge-request-tabs{
|
||||
margin: 20px 0;
|
||||
|
||||
li {
|
||||
a {
|
||||
padding: 15px 40px;
|
||||
|
@ -45,6 +100,11 @@
|
|||
}
|
||||
}
|
||||
|
||||
.merge-request .merge-request-tabs{
|
||||
margin-top: 30px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.mr_source_commit,
|
||||
.mr_target_commit {
|
||||
.commit {
|
||||
|
@ -58,23 +118,10 @@
|
|||
}
|
||||
|
||||
.label-branch {
|
||||
@include border-radius(4px);
|
||||
padding: 3px 4px;
|
||||
border: none;
|
||||
background: $hover;
|
||||
color: #333;
|
||||
color: #222;
|
||||
font-family: $monospace_font;
|
||||
font-weight: normal;
|
||||
font-weight: bold;
|
||||
overflow: hidden;
|
||||
|
||||
.label-project {
|
||||
@include border-radius-left(4px);
|
||||
padding: 3px 4px;
|
||||
background: #279;
|
||||
position: relative;
|
||||
left: -4px;
|
||||
letter-spacing: -1px;
|
||||
}
|
||||
}
|
||||
|
||||
.mr-list {
|
||||
|
@ -91,11 +138,16 @@
|
|||
.merge-request-info {
|
||||
color: #999;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.merge-request-labels {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.merge-request-no-comments {
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,65 +168,6 @@
|
|||
display: none;
|
||||
}
|
||||
|
||||
.mr-state-widget {
|
||||
font-size: 13px;
|
||||
background: #F9F9F9;
|
||||
margin-bottom: 20px;
|
||||
color: #666;
|
||||
border: 1px solid #EEE;
|
||||
@include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09));
|
||||
|
||||
.ci_widget {
|
||||
padding: 10px 15px;
|
||||
font-size: 15px;
|
||||
border-bottom: 1px solid #BBB;
|
||||
color: #777;
|
||||
background-color: $background-color;
|
||||
|
||||
&.ci-success {
|
||||
color: $gl-success;
|
||||
border-color: $gl-success;
|
||||
background-color: #F1FAF1;
|
||||
}
|
||||
|
||||
&.ci-pending,
|
||||
&.ci-running {
|
||||
color: $gl-warning;
|
||||
border-color: $gl-warning;
|
||||
background-color: #FAF5F1;
|
||||
}
|
||||
|
||||
&.ci-failed,
|
||||
&.ci-canceled,
|
||||
&.ci-error {
|
||||
color: $gl-danger;
|
||||
border-color: $gl-danger;
|
||||
background-color: #FAF1F1;
|
||||
}
|
||||
}
|
||||
|
||||
.mr-widget-body {
|
||||
padding: 10px 15px;
|
||||
|
||||
h4 {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.mr-widget-footer {
|
||||
padding: 10px 15px;
|
||||
border-top: 1px solid #EEE;
|
||||
}
|
||||
|
||||
.ci-coverage {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.merge-request-show-labels {
|
||||
a {
|
||||
margin-right: 5px;
|
||||
|
@ -189,3 +182,11 @@
|
|||
.merge-request-form .select2-container {
|
||||
width: 250px !important;
|
||||
}
|
||||
|
||||
#modal_merge_info .modal-dialog {
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
.mr-source-target {
|
||||
line-height: 31px;
|
||||
}
|
||||
|
|
|
@ -39,11 +39,8 @@
|
|||
|
||||
.new_note, .edit_note {
|
||||
.buttons {
|
||||
float: left;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.clearfix {
|
||||
margin-bottom: 0;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.note-preview-holder {
|
||||
|
@ -82,7 +79,6 @@
|
|||
|
||||
.note-form-actions {
|
||||
background: #F9F9F9;
|
||||
height: 45px;
|
||||
|
||||
.note-form-option {
|
||||
margin-top: 8px;
|
||||
|
|
|
@ -33,7 +33,16 @@ ul.notes {
|
|||
&:before {
|
||||
content: "\00b7";
|
||||
}
|
||||
|
||||
font-size: 13px;
|
||||
|
||||
a {
|
||||
@extend .cgray;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
.author {
|
||||
color: #333;
|
||||
|
@ -44,6 +53,14 @@ ul.notes {
|
|||
}
|
||||
.author-username {
|
||||
}
|
||||
|
||||
.note-role {
|
||||
float: right;
|
||||
margin-top: 1px;
|
||||
border: 1px solid #bbb;
|
||||
background-color: transparent;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
.discussion {
|
||||
|
@ -55,18 +72,46 @@ ul.notes {
|
|||
.note {
|
||||
display: block;
|
||||
position:relative;
|
||||
|
||||
.note-body {
|
||||
overflow: auto;
|
||||
|
||||
.note-text {
|
||||
overflow: auto;
|
||||
word-wrap: break-word;
|
||||
@include md-typography;
|
||||
|
||||
// Reset ul style types since we're nested inside a ul already
|
||||
& > ul {
|
||||
list-style-type: disc;
|
||||
|
||||
ul {
|
||||
list-style-type: circle;
|
||||
|
||||
ul {
|
||||
list-style-type: square;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reduce left padding of first task list ul element
|
||||
ul.task-list:first-child {
|
||||
padding-left: 10px;
|
||||
|
||||
// sub-tasks should be padded normally
|
||||
ul {
|
||||
padding-left: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
// Darken 'whitesmoke' a bit to make it more visible in note bodies
|
||||
border-color: darken(#F5F5F5, 8%);
|
||||
margin: 10px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.note-header {
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
|
@ -124,28 +169,23 @@ ul.notes {
|
|||
|
||||
.discussion,
|
||||
.note {
|
||||
&.note:hover {
|
||||
.note-actions { display: block; }
|
||||
}
|
||||
.discussion-header:hover {
|
||||
.discussion-actions { display: block; }
|
||||
}
|
||||
|
||||
.discussion-actions,
|
||||
.note-actions {
|
||||
display: none;
|
||||
float: right;
|
||||
|
||||
[class~="fa"] {
|
||||
font-size: 16px;
|
||||
line-height: 16px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
margin-left: 10px;
|
||||
|
||||
a {
|
||||
@extend .cgray;
|
||||
margin-left: 5px;
|
||||
|
||||
color: #999;
|
||||
|
||||
i.fa {
|
||||
font-size: 16px;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@extend .cgray;
|
||||
&.danger { @extend .cred; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,75 +17,15 @@
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Appearance settings
|
||||
*
|
||||
*/
|
||||
.themes_opts {
|
||||
label {
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
|
||||
.prev {
|
||||
height: 80px;
|
||||
width: 160px;
|
||||
margin-bottom: 10px;
|
||||
@include border-radius(4px);
|
||||
|
||||
&.classic {
|
||||
background: #31363e;
|
||||
}
|
||||
|
||||
&.default {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
&.modern {
|
||||
background: #009871;
|
||||
}
|
||||
|
||||
&.gray {
|
||||
background: #373737;
|
||||
}
|
||||
|
||||
&.violet {
|
||||
background: #548;
|
||||
}
|
||||
|
||||
&.blue {
|
||||
background: #2980b9;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.code_highlight_opts {
|
||||
margin-top: 10px;
|
||||
|
||||
label {
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
|
||||
.prev {
|
||||
width: 160px;
|
||||
margin-bottom: 10px;
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
@include border-radius(4px);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.oauth-buttons {
|
||||
.btn-group {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
line-height: 36px;
|
||||
height: 56px;
|
||||
line-height: 40px;
|
||||
height: 42px;
|
||||
padding: 0px 12px;
|
||||
|
||||
img {
|
||||
width: 32px;
|
||||
|
@ -93,3 +33,17 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Profile > Account > Two Factor Authentication
|
||||
.two-factor-new {
|
||||
.manual-instructions {
|
||||
h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
// Slightly increase the size of the details so they're easier to read
|
||||
dl {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
56
app/assets/stylesheets/pages/profiles/preferences.scss
Normal file
|
@ -0,0 +1,56 @@
|
|||
.application-theme {
|
||||
label {
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
|
||||
.preview {
|
||||
@include border-radius(4px);
|
||||
|
||||
height: 80px;
|
||||
margin-bottom: 10px;
|
||||
width: 160px;
|
||||
|
||||
&.ui_blue {
|
||||
background: $theme-blue;
|
||||
}
|
||||
|
||||
&.ui_charcoal {
|
||||
background: $theme-charcoal;
|
||||
}
|
||||
|
||||
&.ui_graphite {
|
||||
background: $theme-graphite;
|
||||
}
|
||||
|
||||
&.ui_gray {
|
||||
background: $theme-gray;
|
||||
}
|
||||
|
||||
&.ui_green {
|
||||
background: $theme-green;
|
||||
}
|
||||
|
||||
&.ui_violet {
|
||||
background: $theme-violet;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.syntax-theme {
|
||||
label {
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
|
||||
.preview {
|
||||
margin-bottom: 10px;
|
||||
width: 160px;
|
||||
|
||||
img {
|
||||
@include border-radius(4px);
|
||||
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -15,61 +15,38 @@
|
|||
}
|
||||
|
||||
.project-home-panel {
|
||||
margin-bottom: 20px;
|
||||
position: relative;
|
||||
padding-left: 85px;
|
||||
|
||||
&.empty-project {
|
||||
border-bottom: 0px;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
text-align: center;
|
||||
|
||||
.project-identicon-holder {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
margin-bottom: 15px;
|
||||
|
||||
.avatar {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
.avatar, .identicon {
|
||||
margin: 0 auto;
|
||||
float: none;
|
||||
}
|
||||
|
||||
.identicon {
|
||||
font-size: 45px;
|
||||
line-height: 1.6;
|
||||
@include border-radius(50%);
|
||||
}
|
||||
|
||||
.avatar, .identicon {
|
||||
@include border-radius(4px);
|
||||
box-shadow: 0 1px 2px #ddd;
|
||||
}
|
||||
}
|
||||
|
||||
.project-home-dropdown {
|
||||
margin-left: 10px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.project-home-row {
|
||||
@extend .clearfix;
|
||||
margin-bottom: 15px;
|
||||
|
||||
&.project-home-row-top {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.project-home-desc {
|
||||
font-size: 16px;
|
||||
line-height: 1.3;
|
||||
margin-right: 215px;
|
||||
h1 {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
.project-home-desc {
|
||||
float: left;
|
||||
color: $gray;
|
||||
p {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
|
||||
.git-clone-holder {
|
||||
max-width: 600px;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.visibility-level-label {
|
||||
color: $gray;
|
||||
i {
|
||||
|
@ -78,36 +55,27 @@
|
|||
}
|
||||
|
||||
.project-repo-buttons {
|
||||
margin-top: -3px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 260px;
|
||||
text-align: right;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 25px;
|
||||
|
||||
.btn {
|
||||
@extend .btn-info;
|
||||
|
||||
margin-left: 10px;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
line-height: 16px;
|
||||
padding: 8px 12px;
|
||||
|
||||
.count {
|
||||
padding-left: 10px;
|
||||
border-left: 1px solid #ccc;
|
||||
padding-left: 7px;
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
margin-left: 7px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.project-home-links {
|
||||
padding: 10px 0px;
|
||||
float: right;
|
||||
a {
|
||||
margin-left: 10px;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
.git-clone-holder {
|
||||
.project-home-dropdown + & {
|
||||
margin-right: 45px;
|
||||
|
@ -122,6 +90,15 @@
|
|||
|
||||
.input-group-addon {
|
||||
background: #FAFAFA;
|
||||
|
||||
&.git-protocols {
|
||||
padding: 0;
|
||||
border: none;
|
||||
|
||||
.input-group-btn:last-child > .btn {
|
||||
@include border-radius-right(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,7 +117,7 @@
|
|||
}
|
||||
|
||||
.option-descr {
|
||||
margin-left: 24px;
|
||||
margin-left: 36px;
|
||||
color: $gray;
|
||||
}
|
||||
}
|
||||
|
@ -213,50 +190,41 @@ ul.nav.nav-projects-tabs {
|
|||
}
|
||||
|
||||
.project-side {
|
||||
.btn-block {
|
||||
background-image: none;
|
||||
|
||||
.btn, &.btn {
|
||||
white-space: normal;
|
||||
text-align: left;
|
||||
padding: 10px 15px;
|
||||
|
||||
&.dropdown-toggle {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: #eee;
|
||||
border-color: #DDD;
|
||||
}
|
||||
}
|
||||
|
||||
.count {
|
||||
float: right;
|
||||
font-weight: 500;
|
||||
text-shadow: 0 1px #FFF;
|
||||
}
|
||||
|
||||
&.btn-group-justified {
|
||||
.btn {
|
||||
width: 100%;
|
||||
}
|
||||
.dropdown-toggle {
|
||||
width: 30px;
|
||||
padding: 10px;
|
||||
}
|
||||
ul {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.project-fork-icon {
|
||||
float: left;
|
||||
font-size: 26px;
|
||||
margin-right: 10px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.panel {
|
||||
@include border-radius(3px);
|
||||
|
||||
.panel-heading, .panel-footer {
|
||||
font-weight: normal;
|
||||
background-color: transparent;
|
||||
color: #666;
|
||||
border-color: #EEE;
|
||||
}
|
||||
|
||||
.actions {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.nav-pills a {
|
||||
padding: 10px;
|
||||
font-weight: bold;
|
||||
color: $gl-link-color;
|
||||
}
|
||||
|
||||
.nav {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.ci-status-image {
|
||||
max-height: 22px;
|
||||
}
|
||||
}
|
||||
|
||||
.transfer-project .select2-container {
|
||||
|
@ -280,7 +248,8 @@ ul.nav.nav-projects-tabs {
|
|||
}
|
||||
|
||||
.breadcrumb.repo-breadcrumb {
|
||||
padding: 2px 0;
|
||||
padding: 0;
|
||||
line-height: 34px;
|
||||
background: white;
|
||||
border: none;
|
||||
font-size: 16px;
|
||||
|
@ -326,3 +295,24 @@ table.table.protected-branches-list tr.no-border {
|
|||
float: left;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.project-stats {
|
||||
text-align: center;
|
||||
|
||||
ul.nav-pills { display:inline-block; }
|
||||
li { display:inline; }
|
||||
a { float:left; }
|
||||
|
||||
li.missing a {
|
||||
color: #bbb;
|
||||
border: 1px dashed #ccc;
|
||||
|
||||
&:hover {
|
||||
background-color: #FAFAFA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pre.light-well {
|
||||
border-color: #f1f1f1;
|
||||
}
|
||||
|
|
|
@ -89,6 +89,10 @@
|
|||
td.blame-commit {
|
||||
background: #f9f9f9;
|
||||
min-width: 350px;
|
||||
|
||||
.commit-author-link {
|
||||
color: #888;
|
||||
}
|
||||
}
|
||||
td.blame-numbers {
|
||||
pre {
|
||||
|
@ -106,20 +110,15 @@
|
|||
}
|
||||
}
|
||||
|
||||
.tree-download-holder .btn {
|
||||
padding: 4px 12px;
|
||||
}
|
||||
|
||||
.tree-ref-holder {
|
||||
float: left;
|
||||
margin-right: 15px;
|
||||
|
||||
.select2-container .select2-choice, .select2-container.select2-drop-above .select2-choice {
|
||||
padding: 4px 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.readme-holder {
|
||||
margin: 0 auto;
|
||||
max-width: $readable-width;
|
||||
|
||||
.readme-file-title {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
|
|