Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kazuhiko Shiozaki
gitlab-ce
Commits
f1d8efb7
Commit
f1d8efb7
authored
Mar 05, 2014
by
Dmitriy Zaporozhets
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'shell_new_style' into 'master'
Use new style shell commands
parents
132c1b4c
d6b0ac96
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
66 additions
and
64 deletions
+66
-64
app/controllers/admin/background_jobs_controller.rb
app/controllers/admin/background_jobs_controller.rb
+2
-1
config/initializers/2_app.rb
config/initializers/2_app.rb
+1
-1
lib/backup/manager.rb
lib/backup/manager.rb
+6
-1
lib/gitlab/logger.rb
lib/gitlab/logger.rb
+4
-2
lib/gitlab/upgrader.rb
lib/gitlab/upgrader.rb
+16
-11
lib/tasks/gitlab/check.rake
lib/tasks/gitlab/check.rake
+5
-4
lib/tasks/gitlab/generate_docs.rake
lib/tasks/gitlab/generate_docs.rake
+1
-1
lib/tasks/gitlab/info.rake
lib/tasks/gitlab/info.rake
+6
-6
lib/tasks/gitlab/task_helpers.rake
lib/tasks/gitlab/task_helpers.rake
+6
-7
lib/tasks/gitlab/test.rake
lib/tasks/gitlab/test.rake
+6
-6
lib/tasks/sidekiq.rake
lib/tasks/sidekiq.rake
+4
-4
spec/models/gollum_wiki_spec.rb
spec/models/gollum_wiki_spec.rb
+0
-6
spec/models/wiki_page_spec.rb
spec/models/wiki_page_spec.rb
+0
-6
spec/support/test_env.rb
spec/support/test_env.rb
+9
-8
No files found.
app/controllers/admin/background_jobs_controller.rb
View file @
f1d8efb7
class
Admin::BackgroundJobsController
<
Admin
::
ApplicationController
class
Admin::BackgroundJobsController
<
Admin
::
ApplicationController
def
show
def
show
@sidekiq_processes
=
`ps -U
#{
Settings
.
gitlab
.
user
}
-o euser,pid,pcpu,pmem,stat,start,command | grep sidekiq | grep -v grep`
ps_output
,
_
=
Gitlab
::
Popen
.
popen
(
%W(ps -U
#{
Settings
.
gitlab
.
user
}
-o euser,pid,pcpu,pmem,stat,start,command)
)
@sidekiq_processes
=
ps_output
.
split
(
"
\n
"
).
grep
(
/sidekiq/
)
end
end
end
end
config/initializers/2_app.rb
View file @
f1d8efb7
module
Gitlab
module
Gitlab
VERSION
=
File
.
read
(
Rails
.
root
.
join
(
"VERSION"
)).
strip
VERSION
=
File
.
read
(
Rails
.
root
.
join
(
"VERSION"
)).
strip
REVISION
=
`git log --pretty=format:'%h' -n 1`
REVISION
=
Gitlab
::
Popen
.
popen
(
%W(git log --pretty=format:%h -n 1)
).
first
.
chomp
def
self
.
config
def
self
.
config
Settings
Settings
...
...
lib/backup/manager.rb
View file @
f1d8efb7
...
@@ -8,7 +8,7 @@ module Backup
...
@@ -8,7 +8,7 @@ module Backup
s
[
:db_version
]
=
"
#{
ActiveRecord
::
Migrator
.
current_version
}
"
s
[
:db_version
]
=
"
#{
ActiveRecord
::
Migrator
.
current_version
}
"
s
[
:backup_created_at
]
=
Time
.
now
s
[
:backup_created_at
]
=
Time
.
now
s
[
:gitlab_version
]
=
Gitlab
::
VERSION
s
[
:gitlab_version
]
=
Gitlab
::
VERSION
s
[
:tar_version
]
=
%x{tar --version | head -1}
.
gsub
(
/\n/
,
""
)
s
[
:tar_version
]
=
tar_version
Dir
.
chdir
(
Gitlab
.
config
.
backup
.
path
)
Dir
.
chdir
(
Gitlab
.
config
.
backup
.
path
)
...
@@ -98,5 +98,10 @@ module Backup
...
@@ -98,5 +98,10 @@ module Backup
exit
1
exit
1
end
end
end
end
def
tar_version
tar_version
,
_
=
Gitlab
::
Popen
.
popen
(
%W(tar --version)
)
tar_version
.
split
(
"
\n
"
).
first
end
end
end
end
end
lib/gitlab/logger.rb
View file @
f1d8efb7
...
@@ -11,12 +11,14 @@ module Gitlab
...
@@ -11,12 +11,14 @@ module Gitlab
def
self
.
read_latest
def
self
.
read_latest
path
=
Rails
.
root
.
join
(
"log"
,
file_name
)
path
=
Rails
.
root
.
join
(
"log"
,
file_name
)
self
.
build
unless
File
.
exist?
(
path
)
self
.
build
unless
File
.
exist?
(
path
)
logs
=
`tail -n 2000
#{
path
}
`
.
split
(
"
\n
"
)
tail_output
,
_
=
Gitlab
::
Popen
.
popen
(
%W(tail -n 2000
#{
path
}
)
)
tail_output
.
split
(
"
\n
"
)
end
end
def
self
.
read_latest_for
filename
def
self
.
read_latest_for
filename
path
=
Rails
.
root
.
join
(
"log"
,
filename
)
path
=
Rails
.
root
.
join
(
"log"
,
filename
)
logs
=
`tail -n 2000
#{
path
}
`
.
split
(
"
\n
"
)
tail_output
,
_
=
Gitlab
::
Popen
.
popen
(
%W(tail -n 2000
#{
path
}
)
)
tail_output
.
split
(
"
\n
"
)
end
end
def
self
.
build
def
self
.
build
...
...
lib/gitlab/upgrader.rb
View file @
f1d8efb7
...
@@ -42,28 +42,33 @@ module Gitlab
...
@@ -42,28 +42,33 @@ module Gitlab
end
end
def
latest_version_raw
def
latest_version_raw
git_tags
=
`git ls-remote --tags origin | grep tags
\/
v
#{
current_version
.
major
}
`
remote_tags
,
_
=
Gitlab
::
Popen
.
popen
(
%W(git ls-remote --tags origin)
)
git_tags
=
git_tags
.
lines
.
to_a
.
select
{
|
version
|
version
=~
/v\d\.\d\.\d\Z/
}
git_tags
=
remote_tags
.
split
(
"
\n
"
).
grep
(
/tags\/v
#{
current_version
.
major
}
/
)
git_tags
=
git_tags
.
select
{
|
version
|
version
=~
/v\d\.\d\.\d\Z/
}
last_tag
=
git_tags
.
last
.
match
(
/v\d\.\d\.\d/
).
to_s
last_tag
=
git_tags
.
last
.
match
(
/v\d\.\d\.\d/
).
to_s
end
end
def
update_commands
def
update_commands
{
{
"Stash changed files"
=>
"git stash"
,
"Stash changed files"
=>
%W(git stash)
,
"Get latest code"
=>
"git fetch"
,
"Get latest code"
=>
%W(git fetch)
,
"Switch to new version"
=>
"git checkout v
#{
latest_version
}
"
,
"Switch to new version"
=>
%W(git checkout v
#{
latest_version
}
)
,
"Install gems"
=>
"bundle"
,
"Install gems"
=>
%W(bundle)
,
"Migrate DB"
=>
"bundle exec rake db:migrate RAILS_ENV=production"
,
"Migrate DB"
=>
%W(bundle exec rake db:migrate)
,
"Recompile assets"
=>
"bundle exec rake assets:clean assets:precompile RAILS_ENV=production"
,
"Recompile assets"
=>
%W(bundle exec rake assets:clean assets:precompile)
,
"Clear cache"
=>
"bundle exec rake cache:clear RAILS_ENV=production"
"Clear cache"
=>
%W(bundle exec rake cache:clear)
}
}
end
end
def
env
{
'RAILS_ENV'
=>
'production'
}
end
def
upgrade
def
upgrade
update_commands
.
each
do
|
title
,
cmd
|
update_commands
.
each
do
|
title
,
cmd
|
puts
title
puts
title
puts
" ->
#{
cmd
}
"
puts
" ->
#{
cmd
.
join
(
' '
)
}
"
if
system
(
cmd
)
if
system
(
env
,
*
cmd
)
puts
" -> OK"
puts
" -> OK"
else
else
puts
" -> FAILED"
puts
" -> FAILED"
...
...
lib/tasks/gitlab/check.rake
View file @
f1d8efb7
...
@@ -168,7 +168,7 @@ namespace :gitlab do
...
@@ -168,7 +168,7 @@ namespace :gitlab do
def
check_migrations_are_up
def
check_migrations_are_up
print
"All migrations up? ... "
print
"All migrations up? ... "
migration_status
=
`bundle exec rake db:migrate:status`
migration_status
,
_
=
Gitlab
::
Popen
.
popen
(
%W(bundle exec rake db:migrate:status)
)
unless
migration_status
=~
/down\s+\d{14}/
unless
migration_status
=~
/down\s+\d{14}/
puts
"yes"
.
green
puts
"yes"
.
green
...
@@ -295,7 +295,7 @@ namespace :gitlab do
...
@@ -295,7 +295,7 @@ namespace :gitlab do
"user.email"
=>
Gitlab
.
config
.
gitlab
.
email_from
"user.email"
=>
Gitlab
.
config
.
gitlab
.
email_from
}
}
correct_options
=
options
.
map
do
|
name
,
value
|
correct_options
=
options
.
map
do
|
name
,
value
|
run
(
"git config --global --get
#{
name
}
"
).
try
(
:squish
)
==
value
run
(
%W(git config --global --get
#{
name
}
)
).
try
(
:squish
)
==
value
end
end
if
correct_options
.
all?
if
correct_options
.
all?
...
@@ -628,7 +628,8 @@ namespace :gitlab do
...
@@ -628,7 +628,8 @@ namespace :gitlab do
end
end
def
sidekiq_process_count
def
sidekiq_process_count
`ps ux`
.
scan
(
/sidekiq \d+\.\d+\.\d+/
).
count
ps_ux
,
_
=
Gitlab
::
Popen
.
popen
(
%W(ps ux)
)
ps_ux
.
scan
(
/sidekiq \d+\.\d+\.\d+/
).
count
end
end
end
end
...
@@ -739,7 +740,7 @@ namespace :gitlab do
...
@@ -739,7 +740,7 @@ namespace :gitlab do
def
check_git_version
def
check_git_version
required_version
=
Gitlab
::
VersionInfo
.
new
(
1
,
7
,
10
)
required_version
=
Gitlab
::
VersionInfo
.
new
(
1
,
7
,
10
)
current_version
=
Gitlab
::
VersionInfo
.
parse
(
run
(
"
#{
Gitlab
.
config
.
git
.
bin_path
}
--version"
))
current_version
=
Gitlab
::
VersionInfo
.
parse
(
run
(
%W(
#{
Gitlab
.
config
.
git
.
bin_path
}
--version)
))
puts
"Your git bin path is
\"
#{
Gitlab
.
config
.
git
.
bin_path
}
\"
"
puts
"Your git bin path is
\"
#{
Gitlab
.
config
.
git
.
bin_path
}
\"
"
print
"Git version >=
#{
required_version
}
? ... "
print
"Git version >=
#{
required_version
}
? ... "
...
...
lib/tasks/gitlab/generate_docs.rake
View file @
f1d8efb7
namespace
:gitlab
do
namespace
:gitlab
do
desc
"GITLAB | Generate sdocs for project"
desc
"GITLAB | Generate sdocs for project"
task
generate_docs: :environment
do
task
generate_docs: :environment
do
system
(
"bundle exec sdoc -o doc/code app lib"
)
system
(
*
%W(bundle exec sdoc -o doc/code app lib)
)
end
end
end
end
lib/tasks/gitlab/info.rake
View file @
f1d8efb7
...
@@ -4,20 +4,20 @@ namespace :gitlab do
...
@@ -4,20 +4,20 @@ namespace :gitlab do
task
info: :environment
do
task
info: :environment
do
# check if there is an RVM environment
# check if there is an RVM environment
rvm_version
=
run_and_match
(
"rvm --version"
,
/[\d\.]+/
).
try
(
:to_s
)
rvm_version
=
run_and_match
(
%W(rvm --version)
,
/[\d\.]+/
).
try
(
:to_s
)
# check Ruby version
# check Ruby version
ruby_version
=
run_and_match
(
"ruby --version"
,
/[\d\.p]+/
).
try
(
:to_s
)
ruby_version
=
run_and_match
(
%W(ruby --version)
,
/[\d\.p]+/
).
try
(
:to_s
)
# check Gem version
# check Gem version
gem_version
=
run
(
"gem --version"
)
gem_version
=
run
(
%W(gem --version)
)
# check Bundler version
# check Bundler version
bunder_version
=
run_and_match
(
"bundle --version"
,
/[\d\.]+/
).
try
(
:to_s
)
bunder_version
=
run_and_match
(
%W(bundle --version)
,
/[\d\.]+/
).
try
(
:to_s
)
# check Bundler version
# check Bundler version
rake_version
=
run_and_match
(
"rake --version"
,
/[\d\.]+/
).
try
(
:to_s
)
rake_version
=
run_and_match
(
%W(rake --version)
,
/[\d\.]+/
).
try
(
:to_s
)
puts
""
puts
""
puts
"System information"
.
yellow
puts
"System information"
.
yellow
puts
"System:
\t\t
#{
os_name
||
"unknown"
.
red
}
"
puts
"System:
\t\t
#{
os_name
||
"unknown"
.
red
}
"
puts
"Current User:
\t
#{
`whoami`
}
"
puts
"Current User:
\t
#{
run
(
%W(whoami)
)
}
"
puts
"Using RVM:
\t
#{
rvm_version
.
present?
?
"yes"
.
green
:
"no"
}
"
puts
"Using RVM:
\t
#{
rvm_version
.
present?
?
"yes"
.
green
:
"no"
}
"
puts
"RVM Version:
\t
#{
rvm_version
}
"
if
rvm_version
.
present?
puts
"RVM Version:
\t
#{
rvm_version
}
"
if
rvm_version
.
present?
puts
"Ruby Version:
\t
#{
ruby_version
||
"unknown"
.
red
}
"
puts
"Ruby Version:
\t
#{
ruby_version
||
"unknown"
.
red
}
"
...
...
lib/tasks/gitlab/task_helpers.rake
View file @
f1d8efb7
...
@@ -28,7 +28,7 @@ namespace :gitlab do
...
@@ -28,7 +28,7 @@ namespace :gitlab do
# It will primarily use lsb_relase to determine the OS.
# It will primarily use lsb_relase to determine the OS.
# It has fallbacks to Debian, SuSE, OS X and systems running systemd.
# It has fallbacks to Debian, SuSE, OS X and systems running systemd.
def
os_name
def
os_name
os_name
=
run
(
"lsb_release -irs"
)
os_name
=
run
(
%W(lsb_release -irs)
)
os_name
||=
if
File
.
readable?
(
'/etc/system-release'
)
os_name
||=
if
File
.
readable?
(
'/etc/system-release'
)
File
.
read
(
'/etc/system-release'
)
File
.
read
(
'/etc/system-release'
)
end
end
...
@@ -39,7 +39,7 @@ namespace :gitlab do
...
@@ -39,7 +39,7 @@ namespace :gitlab do
os_name
||=
if
File
.
readable?
(
'/etc/SuSE-release'
)
os_name
||=
if
File
.
readable?
(
'/etc/SuSE-release'
)
File
.
read
(
'/etc/SuSE-release'
)
File
.
read
(
'/etc/SuSE-release'
)
end
end
os_name
||=
if
os_x_version
=
run
(
"sw_vers -productVersion"
)
os_name
||=
if
os_x_version
=
run
(
%W(sw_vers -productVersion)
)
"Mac OS X
#{
os_x_version
}
"
"Mac OS X
#{
os_x_version
}
"
end
end
os_name
||=
if
File
.
readable?
(
'/etc/os-release'
)
os_name
||=
if
File
.
readable?
(
'/etc/os-release'
)
...
@@ -80,13 +80,12 @@ namespace :gitlab do
...
@@ -80,13 +80,12 @@ namespace :gitlab do
#
#
# see also #run_and_match
# see also #run_and_match
def
run
(
command
)
def
run
(
command
)
unless
`
#{
command
}
2>/dev/null`
.
blank?
output
,
_
=
Gitlab
::
Popen
.
popen
(
command
)
`
#{
command
}
`
output
end
end
end
def
uid_for
(
user_name
)
def
uid_for
(
user_name
)
run
(
"id -u
#{
user_name
}
"
).
chomp
.
to_i
run
(
%W(id -u
#{
user_name
}
)
).
chomp
.
to_i
end
end
def
gid_for
(
group_name
)
def
gid_for
(
group_name
)
...
@@ -100,7 +99,7 @@ namespace :gitlab do
...
@@ -100,7 +99,7 @@ namespace :gitlab do
def
warn_user_is_not_gitlab
def
warn_user_is_not_gitlab
unless
@warned_user_not_gitlab
unless
@warned_user_not_gitlab
gitlab_user
=
Gitlab
.
config
.
gitlab
.
user
gitlab_user
=
Gitlab
.
config
.
gitlab
.
user
current_user
=
run
(
"whoami"
).
chomp
current_user
=
run
(
%W(whoami)
).
chomp
unless
current_user
==
gitlab_user
unless
current_user
==
gitlab_user
puts
"
#{
Colored
.
color
(
:black
)
+
Colored
.
color
(
:on_yellow
)
}
Warning
#{
Colored
.
extra
(
:clear
)
}
"
puts
"
#{
Colored
.
color
(
:black
)
+
Colored
.
color
(
:on_yellow
)
}
Warning
#{
Colored
.
extra
(
:clear
)
}
"
puts
" You are running as user
#{
current_user
.
magenta
}
, we hope you know what you are doing."
puts
" You are running as user
#{
current_user
.
magenta
}
, we hope you know what you are doing."
...
...
lib/tasks/gitlab/test.rake
View file @
f1d8efb7
...
@@ -2,15 +2,15 @@ namespace :gitlab do
...
@@ -2,15 +2,15 @@ namespace :gitlab do
desc
"GITLAB | Run all tests"
desc
"GITLAB | Run all tests"
task
:test
do
task
:test
do
cmds
=
[
cmds
=
[
"rake db:setup"
,
%W(rake db:setup)
,
"rake db:seed_fu"
,
%W(rake db:seed_fu)
,
"rake spinach"
,
%W(rake spinach)
,
"rake spec"
,
%W(rake spec)
,
"rake jasmine:ci"
%W(rake jasmine:ci)
]
]
cmds
.
each
do
|
cmd
|
cmds
.
each
do
|
cmd
|
system
(
cmd
+
" RAILS_ENV=test"
)
system
(
{
'RAILS_ENV'
=>
'test'
},
*
cmd
)
raise
"
#{
cmd
}
failed!"
unless
$?
.
exitstatus
.
zero?
raise
"
#{
cmd
}
failed!"
unless
$?
.
exitstatus
.
zero?
end
end
...
...
lib/tasks/sidekiq.rake
View file @
f1d8efb7
namespace
:sidekiq
do
namespace
:sidekiq
do
desc
"GITLAB | Stop sidekiq"
desc
"GITLAB | Stop sidekiq"
task
:stop
do
task
:stop
do
system
"script/background_jobs stop"
system
*
%W(script/background_jobs stop)
end
end
desc
"GITLAB | Start sidekiq"
desc
"GITLAB | Start sidekiq"
task
:start
do
task
:start
do
system
"script/background_jobs start"
system
*
%W(script/background_jobs start)
end
end
desc
'GitLab | Restart sidekiq'
desc
'GitLab | Restart sidekiq'
task
:restart
do
task
:restart
do
system
"script/background_jobs restart"
system
*
%W(script/background_jobs restart)
end
end
desc
"GITLAB | Start sidekiq with launchd on Mac OS X"
desc
"GITLAB | Start sidekiq with launchd on Mac OS X"
task
:launchd
do
task
:launchd
do
system
"script/background_jobs start_no_deamonize"
system
*
%W(script/background_jobs start_no_deamonize)
end
end
end
end
spec/models/gollum_wiki_spec.rb
View file @
f1d8efb7
...
@@ -2,12 +2,6 @@ require "spec_helper"
...
@@ -2,12 +2,6 @@ require "spec_helper"
describe
GollumWiki
do
describe
GollumWiki
do
def
create_temp_repo
(
path
)
FileUtils
.
mkdir_p
path
command
=
"git init --quiet
#{
path
}
;"
system
(
command
)
end
def
remove_temp_repo
(
path
)
def
remove_temp_repo
(
path
)
FileUtils
.
rm_rf
path
FileUtils
.
rm_rf
path
end
end
...
...
spec/models/wiki_page_spec.rb
View file @
f1d8efb7
...
@@ -2,12 +2,6 @@ require "spec_helper"
...
@@ -2,12 +2,6 @@ require "spec_helper"
describe
WikiPage
do
describe
WikiPage
do
def
create_temp_repo
(
path
)
FileUtils
.
mkdir_p
path
command
=
"git init --quiet
#{
path
}
;"
system
(
command
)
end
def
remove_temp_repo
(
path
)
def
remove_temp_repo
(
path
)
FileUtils
.
rm_rf
path
FileUtils
.
rm_rf
path
end
end
...
...
spec/support/test_env.rb
View file @
f1d8efb7
...
@@ -104,10 +104,12 @@ module TestEnv
...
@@ -104,10 +104,12 @@ module TestEnv
def
reset_satellite_dir
def
reset_satellite_dir
setup_stubs
setup_stubs
FileUtils
.
cd
(
seed_satellite_path
)
do
[
`git reset --hard --quiet`
%W(git reset --hard --quiet)
,
`git clean -fx`
%W(git clean -fx)
,
`git checkout --quiet origin/master`
%W(git checkout --quiet origin/master)
].
each
do
|
git_cmd
|
system
(
*
git_cmd
,
chdir:
seed_satellite_path
)
end
end
end
end
...
@@ -117,7 +119,7 @@ module TestEnv
...
@@ -117,7 +119,7 @@ module TestEnv
repo
=
repo
(
namespace
,
name
)
repo
=
repo
(
namespace
,
name
)
# Symlink tmp/repositories/gitlabhq to tmp/test-git-base-path/gitlabhq
# Symlink tmp/repositories/gitlabhq to tmp/test-git-base-path/gitlabhq
system
(
"ln -s -f
#{
seed_repo_path
()
}
#{
repo
}
"
)
FileUtils
.
ln_sf
(
seed_repo_path
,
repo
)
create_satellite
(
repo
,
namespace
,
name
)
create_satellite
(
repo
,
namespace
,
name
)
end
end
...
@@ -181,12 +183,11 @@ module TestEnv
...
@@ -181,12 +183,11 @@ module TestEnv
# Symlink tmp/satellite/gitlabhq to tmp/test-git-base-path/satellite/gitlabhq, create the directory if it doesn't exist already
# Symlink tmp/satellite/gitlabhq to tmp/test-git-base-path/satellite/gitlabhq, create the directory if it doesn't exist already
satellite_dir
=
File
.
dirname
(
satellite_repo
)
satellite_dir
=
File
.
dirname
(
satellite_repo
)
FileUtils
.
mkdir_p
(
satellite_dir
)
unless
File
.
exists?
(
satellite_dir
)
FileUtils
.
mkdir_p
(
satellite_dir
)
unless
File
.
exists?
(
satellite_dir
)
system
(
"ln -s -f
#{
seed_satellite_path
}
#{
satellite_repo
}
"
)
FileUtils
.
ln_sf
(
seed_satellite_path
,
satellite_repo
)
end
end
def
create_temp_repo
(
path
)
def
create_temp_repo
(
path
)
FileUtils
.
mkdir_p
path
FileUtils
.
mkdir_p
path
command
=
"git init --quiet --bare
#{
path
}
;"
system
(
*
%W(git init --quiet --bare --
#{
path
}
)
)
system
(
command
)
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment