Commit 5ffc90d9 authored by Jack Weeden's avatar Jack Weeden

Merge remote-tracking branch 'upstream/master'

parents 52feefb8 315d4cc8
...@@ -4,11 +4,15 @@ This guide details how to use issues and pull requests to improve GitLab. ...@@ -4,11 +4,15 @@ This guide details how to use issues and pull requests to improve GitLab.
## Closing policy for issues and pull requests ## Closing policy for issues and pull requests
Issues and pull requests not in line with the guidelines listed in this document will be closed. GitLab is a popular open source project and the capacity to deal with issues and pull requests is limited. To get support for your problems please use other channels as detailed in [the getting help section of the readme](https://github.com/gitlabhq/gitlabhq#getting-help). Professional [support subscriptions](http://www.gitlab.com/subscription/) and [consulting services](http://www.gitlab.com/consultancy/) are available from [GitLab.com](http://www.gitlab.com/). GitLab is a popular open source project and the capacity to deal with issues and pull requests is limited. Out of respect for our volunteers, issues and pull requests not in line with the guidelines listed in this document may be closed without notice.
Please treat our volunteers with courtesy and respect, it will go a long way towards getting your issue resolved.
## Issue tracker ## Issue tracker
The [issue tracker](https://github.com/gitlabhq/gitlabhq/issues) is only for obvious bugs or misbehavior in the latest [stable or development release of GitLab](MAINTENANCE.md). When submitting an issue please conform to the issue submission guidelines listed below. To get support for your particular problem please use the channels as detailed in [the getting help section of the readme](https://github.com/gitlabhq/gitlabhq#getting-help). Professional [support subscriptions](http://www.gitlab.com/subscription/) and [consulting services](http://www.gitlab.com/consultancy/) are available from [GitLab.com](http://www.gitlab.com/).
The [issue tracker](https://github.com/gitlabhq/gitlabhq/issues) is only for obvious bugs or misbehavior in the latest [stable or development release of GitLab](MAINTENANCE.md). When submitting an issue please conform to the issue submission guidelines listed below. Not all issues will be addressed and your issue is more likely to be addressed if you submit a pull request which partially or fully addresses the issue.
Do not use the issue tracker for feature requests. We have a specific [feedback and suggestions forum](http://feedback.gitlab.com) for this purpose. Do not use the issue tracker for feature requests. We have a specific [feedback and suggestions forum](http://feedback.gitlab.com) for this purpose.
...@@ -16,7 +20,7 @@ Please send a pull request with a tested solution or a pull request with a faili ...@@ -16,7 +20,7 @@ Please send a pull request with a tested solution or a pull request with a faili
### Issue tracker guidelines ### Issue tracker guidelines
**[Search](https://github.com/gitlabhq/gitlabhq/search?q=&ref=cmdform&type=Issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format: **[Search](https://github.com/gitlabhq/gitlabhq/search?q=&ref=cmdform&type=Issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format (as the first post):
1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen) 1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen)
2. **Steps to reproduce:** How can we reproduce the issue, preferably on the [GitLab Vagrant virtual machine](https://github.com/gitlabhq/gitlab-vagrant-vm) (start with: `vagrant destroy && vagrant up && vagrant ssh`) 2. **Steps to reproduce:** How can we reproduce the issue, preferably on the [GitLab Vagrant virtual machine](https://github.com/gitlabhq/gitlab-vagrant-vm) (start with: `vagrant destroy && vagrant up && vagrant ssh`)
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
&.s16 { width: 16px; height: 16px; margin-right: 6px; } &.s16 { width: 16px; height: 16px; margin-right: 6px; }
&.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s24 { width: 24px; height: 24px; margin-right: 8px; }
&.s26 { width: 26px; height: 26px; margin-right: 8px; }
&.s32 { width: 32px; height: 32px; margin-right: 10px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; }
&.s90 { width: 90px; height: 90px; margin-right: 15px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; }
} }
......
...@@ -9,7 +9,7 @@ class MergeRequestsLoadContext < BaseContext ...@@ -9,7 +9,7 @@ class MergeRequestsLoadContext < BaseContext
merge_requests = case type merge_requests = case type
when 'all' then merge_requests when 'all' then merge_requests
when 'closed' then merge_requests.closed when 'closed' then merge_requests.closed
when 'assigned-to-me' then merge_requests.opened.assigned(current_user) when 'assigned-to-me' then merge_requests.opened.assigned_to(current_user)
else merge_requests.opened else merge_requests.opened
end end
......
...@@ -12,7 +12,7 @@ class Admin::Teams::ProjectsController < Admin::Teams::ApplicationController ...@@ -12,7 +12,7 @@ class Admin::Teams::ProjectsController < Admin::Teams::ApplicationController
user_team.assign_to_projects(project_ids, access) user_team.assign_to_projects(project_ids, access)
end end
redirect_to admin_team_path(user_team), notice: 'Team of users was successfully assgned to projects.' redirect_to admin_team_path(user_team), notice: 'Team of users was successfully assigned to projects.'
end end
def edit def edit
......
...@@ -15,7 +15,7 @@ module IssuesHelper ...@@ -15,7 +15,7 @@ module IssuesHelper
# to allow filtering issues by an unassigned User or Milestone # to allow filtering issues by an unassigned User or Milestone
def unassigned_filter def unassigned_filter
# Milestone uses :title, Issue uses :name # Milestone uses :title, Issue uses :name
OpenStruct.new(id: 0, title: 'Unspecified', name: 'Unassigned') OpenStruct.new(id: 0, title: 'None (backlog)', name: 'Unassigned')
end end
def issues_filter def issues_filter
......
...@@ -25,7 +25,7 @@ module ProjectsHelper ...@@ -25,7 +25,7 @@ module ProjectsHelper
author_html = "" author_html = ""
# Build avatar image tag # Build avatar image tag
author_html << image_tag(gravatar_icon(author.try(:email), opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}") if opts[:avatar] author_html << image_tag(gravatar_icon(author.try(:email), opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}", alt:'') if opts[:avatar]
# Build name span tag # Build name span tag
author_html << content_tag(:span, sanitize(author.name), class: 'author') if opts[:name] author_html << content_tag(:span, sanitize(author.name), class: 'author') if opts[:name]
...@@ -62,7 +62,7 @@ module ProjectsHelper ...@@ -62,7 +62,7 @@ module ProjectsHelper
def get_project_nav_tabs(project, current_user) def get_project_nav_tabs(project, current_user)
nav_tabs = [:home] nav_tabs = [:home]
if project.repo_exists? && can?(current_user, :download_code, project) if !project.empty_repo? && can?(current_user, :download_code, project)
nav_tabs << [:files, :commits, :network, :graphs] nav_tabs << [:files, :commits, :network, :graphs]
end end
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
%h5.title %h5.title
Account: Account:
.pull-right .pull-right
= image_tag gravatar_icon(@admin_user.email, 32), class: "avatar s32" = image_tag gravatar_icon(@admin_user.email, 32), class:"avatar s32", alt:""
%ul.well-list %ul.well-list
%li %li
%span.light Name: %span.light Name:
...@@ -62,7 +62,6 @@ ...@@ -62,7 +62,6 @@
%span.light Created by: %span.light Created by:
%strong %strong
= link_to @admin_user.created_by.name, [:admin, @admin_user.created_by] = link_to @admin_user.created_by.name, [:admin, @admin_user.created_by]
%hr %hr
%h5 %h5
Add User to Projects Add User to Projects
......
%li.commit %li.commit
%p %p
= link_to commit[:id][0..8], project_commit_path(project, commit[:id]), class: "commit_short_id" = link_to commit[:id][0..8], project_commit_path(project, commit[:id]), class: "commit_short_id", alt: ''
%span= commit[:author][:name] %span= commit[:author][:name]
&ndash; &ndash;
= image_tag gravatar_icon(commit[:author][:email]), class: "avatar", width: 16 = image_tag gravatar_icon(commit[:author][:email]), class: "avatar", width: 16
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#{time_ago_in_words(event.created_at)} ago. #{time_ago_in_words(event.created_at)} ago.
= cache event do = cache event do
= image_tag gravatar_icon(event.author_email), class: "avatar s24" = image_tag gravatar_icon(event.author_email), class: "avatar s24", alt:''
- if event.push? - if event.push?
= render "events/event/push", event: event = render "events/event/push", event: event
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
%ul.well-list %ul.well-list
- @users.each do |user| - @users.each do |user|
%li %li
= image_tag gravatar_icon(user.email, 16), class: "avatar s16" = image_tag gravatar_icon(user.email, 16), class: "avatar s16" , alt: ''
%strong= user.name %strong= user.name
%span.cgray= user.email %span.cgray= user.email
- if @group.owner == user - if @group.owner == user
......
...@@ -2,126 +2,6 @@ ...@@ -2,126 +2,6 @@
%h3.page_title GitLab Flavored Markdown %h3.page_title GitLab Flavored Markdown
%br %br
.row .help_body
.span8 = preserve do
%p = markdown File.read(Rails.root.join("doc", "markdown", "markdown.md"))
For GitLab we developed something we call "GitLab Flavored Markdown" (GFM).
It extends the standard Markdown in a few significant ways adds some useful functionality.
%p You can use GFM in:
%ul
%li commit messages
%li comments
%li wall posts
%li issues
%li merge requests
%li milestones
%li wiki pages
.span4
.alert.alert-info
%p
If you're not already familiar with Markdown, you should spend 15 minutes and go over the excellent
%strong= link_to "Markdown Syntax Guide", "http://daringfireball.net/projects/markdown/syntax"
at Daring Fireball.
.row
.span8
%h3 Differences from traditional Markdown
%h4 Newlines
%p
The biggest difference that GFM introduces is in the handling of linebreaks.
With traditional Markdown you can hard wrap paragraphs of text and they will be combined into a single paragraph. We find this to be the cause of a huge number of unintentional formatting errors.
GFM treats newlines in paragraph-like content as real line breaks, which is probably what you intended.
%p The next paragraph contains two phrases separated by a single newline character:
%pre= "Roses are red\nViolets are blue"
%p becomes
= markdown "Roses are red\nViolets are blue"
%h4 Multiple underscores in words
%p
It is not reasonable to italicize just <em>part</em> of a word, especially when you're dealing with code and names often appear with multiple underscores.
Therefore, GFM ignores multiple underscores in words.
%pre= "perform_complicated_task\ndo_this_and_do_that_and_another_thing"
%p becomes
= markdown "perform_complicated_task\ndo_this_and_do_that_and_another_thing"
%h4 URL autolinking
%p
GFM will autolink standard URLs you copy and paste into your text.
So if you want to link to a URL (instead of a textual link), you can simply put the URL in verbatim and it will be turned into a link to that URL.
%h4 Fenced code blocks
%p
Markdown converts text with four spaces at the front of each line to code blocks.
GFM supports that, but we also support fenced blocks.
Just wrap your code blocks in <code>```</code> and you won't need to indent manually to trigger a code block.
%pre= %Q{```ruby\nrequire 'redcarpet'\nmarkdown = Redcarpet.new("Hello World!")\nputs markdown.to_html\n```}
%p becomes
= markdown %Q{```ruby\nrequire 'redcarpet'\nmarkdown = Redcarpet.new("Hello World!")\nputs markdown.to_html\n```}
%h4 Emoji
.row
.span8
:ruby
puts markdown %Q{Sometimes you want to be :cool: and add some :sparkles: to your :speech_balloon:. Well we have a :gift: for you:
:exclamation: You can use emoji anywhere GFM is supported. :sunglasses:
You can use it to point out a :bug: or warn about :monkey:patches. And if someone improves your really :snail: code, send them a :bouquet: or some :candy:. People will :heart: you for that.
If you are :new: to this, don't be :fearful:. You can easily join the emoji :circus_tent:. All you need to do is to :book: up on the supported codes.
}
.span4
.alert.alert-info
%p
Consult the
%strong= link_to "Emoji Cheat Sheet", "http://www.emoji-cheat-sheet.com/"
for a list of all supported emoji codes.
.row
.span8
%h4 Special GitLab references
%p
GFM recognizes special references.
You can easily reference e.g. a team member, an issue or a commit within a project.
GFM will turn that reference into a link so you can navigate between them easily.
%p GFM will recognize the following references:
%ul
%li
%code @foo
for team members
%li
%code #123
for issues
%li
%code !123
for merge request
%li
%code $123
for snippets
%li
%code 1234567
for commits
-# this example will only be shown if the user has a project with at least one issue
- if @project = current_user.authorized_projects.first
- if issue = @project.issues.first
%p For example in your #{link_to @project.name, project_path(@project)} project, writing:
%pre= "This is related to ##{issue.id}. @#{current_user.username} is working on solving it."
%p becomes:
= markdown "This is related to ##{issue.id}. @#{current_user.username} is working on solving it."
- @project = nil # Prevent this from bubbling up to page title
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
- @project.users.sort_by(&:name).each do |user| - @project.users.sort_by(&:name).each do |user|
%li %li
= link_to project_issues_with_filter_path(@project, assignee_id: user.id) do = link_to project_issues_with_filter_path(@project, assignee_id: user.id) do
= image_tag gravatar_icon(user.email), class: "avatar s16" = image_tag gravatar_icon(user.email), class: "avatar s16", alt: ''
= user.name = user.name
.dropdown.inline.prepend-left-10 .dropdown.inline.prepend-left-10
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
- if @milestone.present? - if @milestone.present?
%strong= @milestone.title %strong= @milestone.title
- elsif params[:milestone_id] == "0" - elsif params[:milestone_id] == "0"
Unspecified None (backlog)
- else - else
Any Any
%b.caret %b.caret
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
= link_to project_issues_with_filter_path(@project, milestone_id: nil) do = link_to project_issues_with_filter_path(@project, milestone_id: nil) do
Any Any
= link_to project_issues_with_filter_path(@project, milestone_id: 0) do = link_to project_issues_with_filter_path(@project, milestone_id: 0) do
Unspecified None (backlog)
- issues_active_milestones.each do |milestone| - issues_active_milestones.each do |milestone|
%li %li
= link_to project_issues_with_filter_path(@project, milestone_id: milestone.id) do = link_to project_issues_with_filter_path(@project, milestone_id: milestone.id) do
......
...@@ -37,5 +37,4 @@ ...@@ -37,5 +37,4 @@
%i.icon-signout %i.icon-signout
%li %li
= link_to current_user, class: "profile-pic" do = link_to current_user, class: "profile-pic" do
= image_tag gravatar_icon(current_user.email, 26) = image_tag(gravatar_icon(current_user.email, 26),alt: '',class: "avatar s26")
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
= link_to "javascript:;", class: "js-details-target turn-off js-toggler-target" do = link_to "javascript:;", class: "js-details-target turn-off js-toggler-target" do
%i.icon-eye-open %i.icon-eye-open
Show discussion Show discussion
= image_tag gravatar_icon(note.author.email), class: "avatar s32" = image_tag gravatar_icon(note.author.email), class: "avatar s32", alt: ''
%div %div
= link_to_member(@project, note.author, avatar: false) = link_to_member(@project, note.author, avatar: false)
- if note.for_merge_request? - if note.for_merge_request?
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
- if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project) - if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project)
= link_to project_note_path(@project, note), title: "Remove comment", method: :delete, confirm: 'Are you sure you want to remove comment?', remote: true, class: "danger js-note-delete" do = link_to project_note_path(@project, note), title: "Remove comment", method: :delete, confirm: 'Are you sure you want to remove comment?', remote: true, class: "danger js-note-delete" do
%i.icon-trash.cred %i.icon-trash.cred
= image_tag gravatar_icon(note.author.email), class: "avatar s32" = image_tag gravatar_icon(note.author.email), class: "avatar s32", alt: ''
= link_to_member(@project, note.author, avatar: false) = link_to_member(@project, note.author, avatar: false)
%span.note-last-update %span.note-last-update
= time_ago_in_words(note.updated_at) = time_ago_in_words(note.updated_at)
......
.profile_avatar_holder .profile_avatar_holder
= image_tag gravatar_icon(@user.email, 90) = image_tag gravatar_icon(@user.email, 90), alt: ''
%h3.page_title %h3.page_title
= @user.name = @user.name
%br %br
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
%td %td
= link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do
= commit.short_id = commit.short_id
= image_tag gravatar_icon(commit.author_email), class: "avatar s16" = image_tag gravatar_icon(commit.author_email), class: "avatar s16", alt: ''
%span.light %span.light
= gfm escape_once(truncate(commit.title, length: 40)) = gfm escape_once(truncate(commit.title, length: 40))
%span %span
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
%div %div
= link_to project_commits_path(@project, commit.id) do = link_to project_commits_path(@project, commit.id) do
%code= commit.short_id %code= commit.short_id
= image_tag gravatar_icon(commit.author_email), class: "", width: 16 = image_tag gravatar_icon(commit.author_email), class: "", width: 16, alt: ''
= gfm escape_once(truncate(commit.title, length: 40)) = gfm escape_once(truncate(commit.title, length: 40))
%td %td
%span.pull-right.cgray %span.pull-right.cgray
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
%ol.styled %ol.styled
- @stats.authors[0...50].each do |author| - @stats.authors[0...50].each do |author|
%li %li
= image_tag gravatar_icon(author.email, 16), class: 'avatar s16' = image_tag gravatar_icon(author.email, 16), class: 'avatar s16', alt: ''
= author.name = author.name
%small.light= author.email %small.light= author.email
.pull-right .pull-right
......
...@@ -25,6 +25,6 @@ ...@@ -25,6 +25,6 @@
= "##{snippet.id}" = "##{snippet.id}"
%span.light %span.light
by by
= image_tag gravatar_icon(snippet.author_email), class: "avatar avatar-inline s16" = image_tag gravatar_icon(snippet.author_email), class: "avatar avatar-inline s16", alt: ''
= snippet.author_name = snippet.author_name
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.row .row
.span4 .span4
= link_to user, title: user.name, class: "dark" do = link_to user, title: user.name, class: "dark" do
= image_tag gravatar_icon(user.email, 32), class: "avatar s32" = image_tag gravatar_icon(user.email, 32), class: "avatar s32", alt: ''
%strong= truncate(user.name, lenght: 40) %strong= truncate(user.name, lenght: 40)
%br %br
%small.cgray= user.username %small.cgray= user.username
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.row .row
.span3 .span3
= link_to user_path(user.username), title: user.name, class: "dark" do = link_to user_path(user.username), title: user.name, class: "dark" do
= image_tag gravatar_icon(user.email, 40), class: "avatar s32" = image_tag gravatar_icon(user.email, 40), class: "avatar s32", alt: ''
= link_to user_path(user.username), title: user.name, class: "dark" do = link_to user_path(user.username), title: user.name, class: "dark" do
%strong= truncate(user.name, lenght: 40) %strong= truncate(user.name, lenght: 40)
%br %br
......
.row .row
.span8 .span8
%h3.page_title %h3.page_title
= image_tag gravatar_icon(@user.email, 90), class: "avatar s90" = image_tag gravatar_icon(@user.email, 90), class: "avatar s90", alt: ''
= @user.name = @user.name
- if @user == current_user - if @user == current_user
.pull-right .pull-right
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20130326142630) do ActiveRecord::Schema.define(:version => 20130614132337) do
create_table "deploy_keys_projects", :force => true do |t| create_table "deploy_keys_projects", :force => true do |t|
t.integer "deploy_key_id", :null => false t.integer "deploy_key_id", :null => false
......
...@@ -173,6 +173,9 @@ You can change `5-3-stable` to `master` if you want the *bleeding edge* version, ...@@ -173,6 +173,9 @@ You can change `5-3-stable` to `master` if you want the *bleeding edge* version,
# Create directory for satellites # Create directory for satellites
sudo -u git -H mkdir /home/git/gitlab-satellites sudo -u git -H mkdir /home/git/gitlab-satellites
# Make config/database.yml readable to git only
sudo -u git -H chmod o-rwx config/database.yml
# Create directories for sockets/pids and make sure GitLab can write to them # Create directories for sockets/pids and make sure GitLab can write to them
sudo -u git -H mkdir tmp/pids/ sudo -u git -H mkdir tmp/pids/
sudo -u git -H mkdir tmp/sockets/ sudo -u git -H mkdir tmp/sockets/
......
This diff is collapsed.
...@@ -52,17 +52,26 @@ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production ...@@ -52,17 +52,26 @@ sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
### 6. Update Init script ### 6. Update Init script
```bash ```bash
cd /home/git/gitlab
sudo rm /etc/init.d/gitlab sudo rm /etc/init.d/gitlab
sudo curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlabhq/5-2-stable/lib/support/init.d/gitlab sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
sudo chmod +x /etc/init.d/gitlab sudo chmod +x /etc/init.d/gitlab
``` ```
### 6. Start application ### 7. Create uploads directory
```bash
cd /home/git/gitlab
sudo -u git -H mkdir public/uploads
sudo chmod -R u+rwX public/uploads
```
### 8. Start application
sudo service gitlab start sudo service gitlab start
sudo service nginx restart sudo service nginx restart
### 7. Check application status ### 9. Check application status
Check if GitLab and its environment are configured correctly: Check if GitLab and its environment are configured correctly:
......
...@@ -262,7 +262,7 @@ end ...@@ -262,7 +262,7 @@ end
# project_snippet GET /:project_id/snippets/:id(.:format) snippets#show # project_snippet GET /:project_id/snippets/:id(.:format) snippets#show
# PUT /:project_id/snippets/:id(.:format) snippets#update # PUT /:project_id/snippets/:id(.:format) snippets#update
# DELETE /:project_id/snippets/:id(.:format) snippets#destroy # DELETE /:project_id/snippets/:id(.:format) snippets#destroy
describe Project::SnippetsController, "routing" do describe Projects::SnippetsController, "routing" do
it "to #raw" do it "to #raw" do
get("/gitlabhq/snippets/1/raw").should route_to('projects/snippets#raw', project_id: 'gitlabhq', id: '1') get("/gitlabhq/snippets/1/raw").should route_to('projects/snippets#raw', project_id: 'gitlabhq', id: '1')
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