Commit 0625b15a authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch '7-10-rc5' into '7-10-stable'

7.10.0.rc5

cc @job

See merge request !1787
parents 81112b54 abdc4cbe
...@@ -42,7 +42,7 @@ gem "browser" ...@@ -42,7 +42,7 @@ gem "browser"
gem "gitlab_git", '~> 7.1.10' gem "gitlab_git", '~> 7.1.10'
# Ruby/Rack Git Smart-HTTP Server Handler # Ruby/Rack Git Smart-HTTP Server Handler
gem 'gitlab-grack', '~> 2.0.0.rc2', require: 'grack' gem 'gitlab-grack', '~> 2.0.1', require: 'grack'
# LDAP Auth # LDAP Auth
gem 'gitlab_omniauth-ldap', '1.2.1', require: "omniauth-ldap" gem 'gitlab_omniauth-ldap', '1.2.1', require: "omniauth-ldap"
......
...@@ -199,7 +199,7 @@ GEM ...@@ -199,7 +199,7 @@ GEM
gitlab-flowdock-git-hook (0.4.2.2) gitlab-flowdock-git-hook (0.4.2.2)
gitlab-grit (>= 2.4.1) gitlab-grit (>= 2.4.1)
multi_json multi_json
gitlab-grack (2.0.0) gitlab-grack (2.0.1)
rack (~> 1.5.1) rack (~> 1.5.1)
gitlab-grit (2.7.2) gitlab-grit (2.7.2)
charlock_holmes (~> 0.6) charlock_holmes (~> 0.6)
...@@ -700,7 +700,7 @@ DEPENDENCIES ...@@ -700,7 +700,7 @@ DEPENDENCIES
gemnasium-gitlab-service (~> 0.2) gemnasium-gitlab-service (~> 0.2)
github-markup github-markup
gitlab-flowdock-git-hook (~> 0.4.2) gitlab-flowdock-git-hook (~> 0.4.2)
gitlab-grack (~> 2.0.0.rc2) gitlab-grack (~> 2.0.1)
gitlab-linguist (~> 3.0.1) gitlab-linguist (~> 3.0.1)
gitlab_emoji (~> 0.1) gitlab_emoji (~> 0.1)
gitlab_git (~> 7.1.10) gitlab_git (~> 7.1.10)
......
...@@ -3,40 +3,54 @@ class HelpController < ApplicationController ...@@ -3,40 +3,54 @@ class HelpController < ApplicationController
end end
def show def show
@filepath = clean_path_info(params[:filepath]) category = clean_path_info(path_params[:category])
@format = params[:format] file = path_params[:file]
respond_to do |format| respond_to do |format|
format.md { render_doc } format.any(:markdown, :md, :html) do
format.all { send_file_data } path = Rails.root.join('doc', category, "#{file}.md")
end
end
def shortcuts if File.exist?(path)
end @markdown = File.read(path)
private render 'show.html.haml'
else
# Force template to Haml
render 'errors/not_found.html.haml', layout: 'errors', status: 404
end
end
# Allow access to images in the doc folder
format.any(:png, :gif, :jpeg) do
path = Rails.root.join('doc', category, "#{file}.#{params[:format]}")
if File.exist?(path)
send_file(path, disposition: 'inline')
else
head :not_found
end
end
def render_doc # Any other format we don't recognize, just respond 404
if File.exists?(Rails.root.join('doc', @filepath + '.md')) format.any { head :not_found }
render 'show.html.haml'
else
not_found!
end end
end end
def send_file_data def shortcuts
path = Rails.root.join('doc', "#{@filepath}.#{@format}")
if File.exists?(path)
send_file(path, disposition: 'inline')
else
head :not_found
end
end end
def ui def ui
end end
private
def path_params
params.require(:category)
params.require(:file)
params
end
PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact) PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact)
# Taken from ActionDispatch::FileHandler # Taken from ActionDispatch::FileHandler
......
...@@ -68,7 +68,7 @@ class Import::GoogleCodeController < Import::BaseController ...@@ -68,7 +68,7 @@ class Import::GoogleCodeController < Import::BaseController
def status def status
unless client.valid? unless client.valid?
return redirect_to new_import_google_path return redirect_to new_import_google_code_path
end end
@repos = client.repos @repos = client.repos
......
.documentation.wiki .documentation.wiki
= markdown File.read(Rails.root.join('doc', @filepath + '.md')).gsub("$your_email", current_user.email) = markdown @markdown.gsub('$your_email', current_user.email)
...@@ -8,9 +8,31 @@ ...@@ -8,9 +8,31 @@
Customize how Google Code email addresses and usernames are imported into GitLab. Customize how Google Code email addresses and usernames are imported into GitLab.
In the next step, you'll be able to select the projects you want to import. In the next step, you'll be able to select the projects you want to import.
%p %p
The user map is a JSON document mapping Google Code users (as keys) to the way they will be imported into GitLab (as values). By default the username is masked to ensure users' privacy. The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.
%p %ul
To map a Google Code user to a full name or GitLab user, simply replace the value, e.g. <code>"johnsmith@gmail.com": "John Smith"</code> or <code>"johnsmith@gmail.com": "@johnsmith"</code>. Be sure to preserve the surrounding double quotes and other punctuation. %li
%strong Default: Directly import the Google Code email address or username
%p
<code>"johnsmith@example.com": "johnsm...@example.com"</code>
will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com.
The email address or username is masked to ensure the user's privacy.
%li
%strong Map a Google Code user to a GitLab user
%p
<code>"johnsmith@example.com": "@johnsmith"</code>
will add "By <a href="#">@johnsmith</a>" to all issues and comments originally created by johnsmith@example.com,
and will set <a href="#">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.
%li
%strong Map a Google Code user to a full name
%p
<code>"johnsmith@example.com": "John Smith"</code>
will add "By John Smith" to all issues and comments originally created by johnsmith@example.com.
%li
%strong Map a Google Code user to a full email address
%p
<code>"johnsmith@example.com": "johnsmith@example.com"</code>
will add "By <a href="#">johnsmith@example.com</a>" to all issues and comments originally created by johnsmith@example.com.
By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address.
.form-group .form-group
.col-sm-12 .col-sm-12
......
...@@ -6,4 +6,5 @@ ...@@ -6,4 +6,5 @@
Mime::Type.register_alias "text/plain", :diff Mime::Type.register_alias "text/plain", :diff
Mime::Type.register_alias "text/plain", :patch Mime::Type.register_alias "text/plain", :patch
Mime::Type.register_alias 'text/html', :md Mime::Type.register_alias 'text/html', :markdown
Mime::Type.register_alias 'text/html', :md
...@@ -39,9 +39,9 @@ Gitlab::Application.routes.draw do ...@@ -39,9 +39,9 @@ Gitlab::Application.routes.draw do
# Help # Help
get 'help' => 'help#index' get 'help' => 'help#index'
get 'help/:category/:file' => 'help#show', as: :help_page, constraints: { category: /.*/, file: /[^\/\.]+/ }
get 'help/shortcuts' get 'help/shortcuts'
get 'help/ui' => 'help#ui' get 'help/ui' => 'help#ui'
get 'help/:filepath' => 'help#show', as: :help_page, constraints: { filepath: /[^\.]+/ }
# #
# Global snippets # Global snippets
......
...@@ -126,7 +126,7 @@ sudo apt-get install nodejs ...@@ -126,7 +126,7 @@ sudo apt-get install nodejs
```bash ```bash
cd /home/git/gitlab-shell cd /home/git/gitlab-shell
sudo -u git -H git fetch sudo -u git -H git fetch
sudo -u git -H git checkout v2.6.0 sudo -u git -H git checkout v2.6.2
``` ```
## 7. Install libs, migrations, etc. ## 7. Install libs, migrations, etc.
......
...@@ -8,7 +8,7 @@ class Spinach::Features::DashboardHelp < Spinach::FeatureSteps ...@@ -8,7 +8,7 @@ class Spinach::Features::DashboardHelp < Spinach::FeatureSteps
end end
step 'I visit the "Rake Tasks" help page' do step 'I visit the "Rake Tasks" help page' do
visit help_page_path('raketasks/maintenance', format: 'md') visit help_page_path("raketasks", "maintenance")
end end
step 'I should see "Rake Tasks" page markdown rendered' do step 'I should see "Rake Tasks" page markdown rendered' do
......
...@@ -30,7 +30,10 @@ module Gitlab ...@@ -30,7 +30,10 @@ module Gitlab
def user_map def user_map
@user_map ||= begin @user_map ||= begin
user_map = Hash.new { |hash, user| Client.mask_email(user) } user_map = Hash.new do |hash, user|
# Replace ... by \.\.\., so `johnsm...@gmail.com` isn't autolinked.
Client.mask_email(user).sub("...", "\\.\\.\\.")
end
import_data = project.import_data.try(:data) import_data = project.import_data.try(:data)
stored_user_map = import_data["user_map"] if import_data stored_user_map = import_data["user_map"] if import_data
...@@ -203,25 +206,25 @@ module Gitlab ...@@ -203,25 +206,25 @@ module Gitlab
end end
def linkify_issues(s) def linkify_issues(s)
s.gsub(/([Ii]ssue) ([0-9]+)/, '\1 #\2') s = s.gsub(/([Ii]ssue) ([0-9]+)/, '\1 #\2')
s = s.gsub(/([Cc]omment) #([0-9]+)/, '\1 \2')
s
end end
def escape_for_markdown(s) def escape_for_markdown(s)
s = s.gsub("*", "\\*") # No headings and lists
s = s.gsub("#", "\\#") s = s.gsub(/^#/, "\\#")
s = s.gsub(/^-/, "\\-")
# No inline code
s = s.gsub("`", "\\`") s = s.gsub("`", "\\`")
s = s.gsub(":", "\\:")
s = s.gsub("-", "\\-") # Carriage returns make me sad
s = s.gsub("+", "\\+")
s = s.gsub("_", "\\_")
s = s.gsub("(", "\\(")
s = s.gsub(")", "\\)")
s = s.gsub("[", "\\[")
s = s.gsub("]", "\\]")
s = s.gsub("<", "\\<")
s = s.gsub(">", "\\>")
s = s.gsub("\r", "") s = s.gsub("\r", "")
# Markdown ignores single newlines, but we need them as <br />.
s = s.gsub("\n", " \n") s = s.gsub("\n", " \n")
s s
end end
...@@ -276,11 +279,18 @@ module Gitlab ...@@ -276,11 +279,18 @@ module Gitlab
if raw_updates.has_key?("blockedOn") if raw_updates.has_key?("blockedOn")
blocked_ons = raw_updates["blockedOn"].map do |raw_blocked_on| blocked_ons = raw_updates["blockedOn"].map do |raw_blocked_on|
name, id = raw_blocked_on.split(":", 2) name, id = raw_blocked_on.split(":", 2)
if name == project.import_source
"##{id}" deleted = name.start_with?("-")
else name = name[1..-1] if deleted
"#{project.namespace.path}/#{name}##{id}"
end text =
if name == project.import_source
"##{id}"
else
"#{project.namespace.path}/#{name}##{id}"
end
text = "~~#{text}~~" if deleted
text
end end
updates << "*Blocked on: #{blocked_ons.join(", ")}*" updates << "*Blocked on: #{blocked_ons.join(", ")}*"
end end
...@@ -288,11 +298,18 @@ module Gitlab ...@@ -288,11 +298,18 @@ module Gitlab
if raw_updates.has_key?("blocking") if raw_updates.has_key?("blocking")
blockings = raw_updates["blocking"].map do |raw_blocked_on| blockings = raw_updates["blocking"].map do |raw_blocked_on|
name, id = raw_blocked_on.split(":", 2) name, id = raw_blocked_on.split(":", 2)
if name == project.import_source
"##{id}" deleted = name.start_with?("-")
else name = name[1..-1] if deleted
"#{project.namespace.path}/#{name}##{id}"
end text =
if name == project.import_source
"##{id}"
else
"#{project.namespace.path}/#{name}##{id}"
end
text = "~~#{text}~~" if deleted
text
end end
updates << "*Blocking: #{blockings.join(", ")}*" updates << "*Blocking: #{blockings.join(", ")}*"
end end
...@@ -340,7 +357,7 @@ module Gitlab ...@@ -340,7 +357,7 @@ module Gitlab
def format_issue_body(author, date, content, attachments) def format_issue_body(author, date, content, attachments)
body = [] body = []
body << "*By #{author} on #{date}*" body << "*By #{author} on #{date} (imported from Google Code)*"
body << "---" body << "---"
if content.blank? if content.blank?
......
require 'spec_helper'
describe HelpController do
let(:user) { create(:user) }
before do
sign_in(user)
end
describe 'GET #show' do
context 'for Markdown formats' do
context 'when requested file exists' do
before do
get :show, category: 'ssh', file: 'README', format: :md
end
it 'assigns to @markdown' do
expect(assigns[:markdown]).not_to be_empty
end
it 'renders HTML' do
expect(response).to render_template('show.html.haml')
expect(response.content_type).to eq 'text/html'
end
end
context 'when requested file is missing' do
it 'renders not found' do
get :show, category: 'foo', file: 'bar', format: :md
expect(response).to be_not_found
end
end
end
context 'for image formats' do
context 'when requested file exists' do
it 'renders the raw file' do
get :show, category: 'workflow/protected_branches',
file: 'protected_branches1', format: :png
expect(response).to be_success
expect(response.content_type).to eq 'image/png'
expect(response.headers['Content-Disposition']).to match(/^inline;/)
end
end
context 'when requested file is missing' do
it 'renders not found' do
get :show, category: 'foo', file: 'bar', format: :png
expect(response).to be_not_found
end
end
end
context 'for other formats' do
it 'always renders not found' do
get :show, category: 'ssh', file: 'README', format: :foo
expect(response).to be_not_found
end
end
end
end
...@@ -6,7 +6,7 @@ describe 'Help Pages', feature: true do ...@@ -6,7 +6,7 @@ describe 'Help Pages', feature: true do
login_as :user login_as :user
end end
it 'replace the variable $your_email with the email of the user' do it 'replace the variable $your_email with the email of the user' do
visit help_page_path(filepath: 'ssh/README', format: 'md') visit help_page_path('ssh', 'README')
expect(page).to have_content("ssh-keygen -t rsa -C \"#{@user.email}\"") expect(page).to have_content("ssh-keygen -t rsa -C \"#{@user.email}\"")
end end
end end
......
...@@ -57,10 +57,11 @@ describe Gitlab::GoogleCodeImport::Importer do ...@@ -57,10 +57,11 @@ describe Gitlab::GoogleCodeImport::Importer do
expect(issue.label_names).to include("Type: Enhancement") expect(issue.label_names).to include("Type: Enhancement")
expect(issue.title).to eq("Scrolling through tasks") expect(issue.title).to eq("Scrolling through tasks")
expect(issue.state).to eq("closed") expect(issue.state).to eq("closed")
expect(issue.description).to include("schattenpr...") expect(issue.description).to include("schattenpr\\.\\.\\.")
expect(issue.description).to include("November 18, 2009 00:20") expect(issue.description).to include("November 18, 2009 00:20")
expect(issue.description).to include('I like to scroll through the tasks with my scrollwheel \(like in fluxbox\).') expect(issue.description).to include("Google Code")
expect(issue.description).to include('Patch is attached that adds two new mouse\-actions \(next\_taskprev\_task\)') expect(issue.description).to include('I like to scroll through the tasks with my scrollwheel (like in fluxbox).')
expect(issue.description).to include('Patch is attached that adds two new mouse-actions (next_task+prev_task)')
expect(issue.description).to include('that can be used for exactly that purpose.') expect(issue.description).to include('that can be used for exactly that purpose.')
expect(issue.description).to include('all the best!') expect(issue.description).to include('all the best!')
expect(issue.description).to include('[tint2_task_scrolling.diff](https://storage.googleapis.com/google-code-attachments/tint2/issue-169/comment-0/tint2_task_scrolling.diff)') expect(issue.description).to include('[tint2_task_scrolling.diff](https://storage.googleapis.com/google-code-attachments/tint2/issue-169/comment-0/tint2_task_scrolling.diff)')
......
...@@ -64,50 +64,35 @@ describe SnippetsController, "routing" do ...@@ -64,50 +64,35 @@ describe SnippetsController, "routing" do
end end
end end
# help GET /help(.:format) help#index # help GET /help(.:format) help#index
# help_permissions GET /help/permissions(.:format) help#permissions # help_page GET /help/:category/:file(.:format) help#show {:category=>/.*/, :file=>/[^\/\.]+/}
# help_workflow GET /help/workflow(.:format) help#workflow # help_shortcuts GET /help/shortcuts(.:format) help#shortcuts
# help_api GET /help/api(.:format) help#api # help_ui GET /help/ui(.:format) help#ui
# help_web_hooks GET /help/web_hooks(.:format) help#web_hooks describe HelpController, "routing" do
# help_system_hooks GET /help/system_hooks(.:format) help#system_hooks it "to #index" do
# help_markdown GET /help/markdown(.:format) help#markdown expect(get("/help")).to route_to('help#index')
# help_ssh GET /help/ssh(.:format) help#ssh
# help_raketasks GET /help/raketasks(.:format) help#raketasks
describe HelpController, 'routing' do
it 'to #index' do
expect(get('/help')).to route_to('help#index')
end
it 'to #permissions' do
expect(get('/help/permissions/permissions')).to route_to('help#show', filepath: 'permissions/permissions')
end
it 'to #workflow' do
expect(get('/help/workflow/README')).to route_to('help#show', filepath: 'workflow/README')
end
it 'to #api' do
expect(get('/help/api/README')).to route_to('help#show', filepath: 'api/README')
end
it 'to #web_hooks' do
expect(get('/help/web_hooks/web_hooks')).to route_to('help#show', filepath: 'web_hooks/web_hooks')
end end
it 'to #system_hooks' do it 'to #show' do
expect(get('/help/system_hooks/system_hooks')).to route_to('help#show', filepath: 'system_hooks/system_hooks') path = '/help/markdown/markdown.md'
end expect(get(path)).to route_to('help#show',
category: 'markdown',
file: 'markdown',
format: 'md')
it 'to #markdown' do path = '/help/workflow/protected_branches/protected_branches1.png'
expect(get('/help/markdown/markdown')).to route_to('help#show',filepath: 'markdown/markdown') expect(get(path)).to route_to('help#show',
category: 'workflow/protected_branches',
file: 'protected_branches1',
format: 'png')
end end
it 'to #ssh' do it 'to #shortcuts' do
expect(get('/help/ssh/README')).to route_to('help#show', filepath: 'ssh/README') expect(get('/help/shortcuts')).to route_to('help#shortcuts')
end end
it 'to #raketasks' do it 'to #ui' do
expect(get('/help/raketasks/README')).to route_to('help#show', filepath: 'raketasks/README') expect(get('/help/ui')).to route_to('help#ui')
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment