Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
moodle_rebase10.1.2
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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dmitry Blinov
moodle_rebase10.1.2
Commits
47daf858
Commit
47daf858
authored
Sep 24, 2012
by
Kazuhiko Shiozaki
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/erp5-component' into erp5
parents
3e8e054c
56728231
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
85 additions
and
134 deletions
+85
-134
component/sphinx/README
component/sphinx/README
+2
-0
slapos/recipe/generic_mysql/mysql.py
slapos/recipe/generic_mysql/mysql.py
+40
-42
slapos/recipe/generic_mysql/template/my.cnf.in
slapos/recipe/generic_mysql/template/my.cnf.in
+1
-1
slapos/recipe/haproxy/__init__.py
slapos/recipe/haproxy/__init__.py
+5
-1
slapos/recipe/lamp/template/my.cnf.in
slapos/recipe/lamp/template/my.cnf.in
+1
-1
slapos/recipe/mysql/template/my.cnf.in
slapos/recipe/mysql/template/my.cnf.in
+1
-1
slapos/recipe/tidstorage/__init__.py
slapos/recipe/tidstorage/__init__.py
+17
-9
slapos/recipe/tidstorage/template/tidstorage.py.in
slapos/recipe/tidstorage/template/tidstorage.py.in
+0
-1
slapos/recipe/xwiki/template/my.cnf.in
slapos/recipe/xwiki/template/my.cnf.in
+1
-1
stack/erp5/buildout.cfg
stack/erp5/buildout.cfg
+10
-17
stack/erp5/instance-erp5-cluster.cfg.in
stack/erp5/instance-erp5-cluster.cfg.in
+0
-12
stack/erp5/instance-mariadb.cfg.in
stack/erp5/instance-mariadb.cfg.in
+4
-1
stack/erp5/instance-sphinx.cfg.in
stack/erp5/instance-sphinx.cfg.in
+0
-43
stack/erp5/instance-tidstorage.cfg.in
stack/erp5/instance-tidstorage.cfg.in
+0
-1
stack/erp5/instance.cfg.in
stack/erp5/instance.cfg.in
+0
-1
stack/erp5/zope.conf.in
stack/erp5/zope.conf.in
+3
-2
No files found.
component/sphinx/README
0 → 100644
View file @
47daf858
This component is not used anymore - but might be revived within 4 months.
If not used within 6 months, feel free to delete this.
slapos/recipe/generic_mysql/mysql.py
View file @
47daf858
...
...
@@ -42,52 +42,50 @@ def updateMysql(args):
sleep
=
30
is_succeed
=
False
while
True
:
if
not
is_succeed
:
mysql_upgrade_list
=
[
conf
[
'mysql_upgrade_binary'
],
'--no-defaults'
,
'--user=root'
,
'--socket=%s'
%
conf
[
'socket'
]]
mysql_upgrade
=
subprocess
.
Popen
(
mysql_upgrade_list
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
mysql_upgrade
.
communicate
()[
0
]
if
mysql_upgrade
.
returncode
is
None
:
mysql_upgrade
.
kill
()
if
mysql_upgrade
.
returncode
!=
0
and
not
'is already upgraded'
in
result
:
print
"Command %r failed with result:
\
n
%s"
%
(
mysql_upgrade_list
,
result
)
print
'Sleeping for %ss and retrying'
%
sleep
mysql_upgrade_list
=
[
conf
[
'mysql_upgrade_binary'
],
'--no-defaults'
,
'--user=root'
,
'--socket=%s'
%
conf
[
'socket'
]]
mysql_upgrade
=
subprocess
.
Popen
(
mysql_upgrade_list
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
mysql_upgrade
.
communicate
()[
0
]
if
mysql_upgrade
.
returncode
is
None
:
mysql_upgrade
.
kill
()
if
mysql_upgrade
.
returncode
!=
0
and
not
'is already upgraded'
in
result
:
print
"Command %r failed with result:
\
n
%s"
%
(
mysql_upgrade_list
,
result
)
else
:
if
mysql_upgrade
.
returncode
==
0
:
print
"MySQL database upgraded with result:
\
n
%s"
%
result
else
:
if
mysql_upgrade
.
returncode
==
0
:
print
"MySQL database upgraded with result:
\
n
%s"
%
result
else
:
print
"No need to upgrade MySQL database"
mysql_list
=
[
conf
[
'mysql_binary'
].
strip
(),
'--no-defaults'
,
'-B'
,
'--user=root'
,
'--socket=%s'
%
conf
[
'socket'
]]
mysql
=
subprocess
.
Popen
(
mysql_list
,
stdin
=
subprocess
.
PIPE
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
mysql
.
communicate
(
conf
[
'mysql_script'
])[
0
]
if
mysql
.
returncode
is
None
:
mysql
.
kill
()
print
"No need to upgrade MySQL database"
mysql_list
=
[
conf
[
'mysql_binary'
].
strip
(),
'--no-defaults'
,
'-B'
,
'--user=root'
,
'--socket=%s'
%
conf
[
'socket'
]]
mysql
=
subprocess
.
Popen
(
mysql_list
,
stdin
=
subprocess
.
PIPE
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
mysql
.
communicate
(
conf
[
'mysql_script'
])[
0
]
if
mysql
.
returncode
is
None
:
mysql
.
kill
()
if
mysql
.
returncode
!=
0
:
print
'Command %r failed with:
\
n
%s'
%
(
mysql_list
,
result
)
else
:
# import timezone database
mysql_tzinfo_to_sql_binary
=
os
.
path
.
join
(
os
.
path
.
dirname
(
conf
[
'mysql_binary'
].
strip
()),
'mysql_tzinfo_to_sql'
)
zoneinfo_directory
=
'%s/zoneinfo'
%
os
.
path
.
dirname
(
pytz
.
__file__
)
mysql_tzinfo_to_sql_list
=
[
mysql_tzinfo_to_sql_binary
,
zoneinfo_directory
]
mysql_tzinfo_to_sql
=
subprocess
.
Popen
(
mysql_tzinfo_to_sql_list
,
stdin
=
subprocess
.
PIPE
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
timezone_sql
=
mysql_tzinfo_to_sql
.
communicate
()[
0
]
if
mysql
.
returncode
!=
0
:
print
'Command %r failed with:
\
n
%s'
%
(
mysql_list
,
result
)
print
'Sleeping for %ss and retrying'
%
sleep
print
'Command %r failed with:
\
n
%s'
%
(
mysql_tzinfo_to_sql_list
,
result
)
else
:
# import timezone database
mysql_tzinfo_to_sql_binary
=
os
.
path
.
join
(
os
.
path
.
dirname
(
conf
[
'mysql_binary'
].
strip
()),
'mysql_tzinfo_to_sql'
)
zoneinfo_directory
=
'%s/zoneinfo'
%
os
.
path
.
dirname
(
pytz
.
__file__
)
mysql_tzinfo_to_sql_list
=
[
mysql_tzinfo_to_sql_binary
,
zoneinfo_directory
]
mysql_tzinfo_to_sql
=
subprocess
.
Popen
(
mysql_tzinfo_to_sql_list
,
stdin
=
subprocess
.
PIPE
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
timezone_sql
=
mysql_tzinfo_to_sql
.
communicate
()[
0
]
mysql
=
subprocess
.
Popen
(
mysql_list
+
[
'mysql'
,],
stdin
=
subprocess
.
PIPE
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
mysql
.
communicate
(
timezone_sql
)[
0
]
if
mysql
.
returncode
is
None
:
mysql
.
kill
()
if
mysql
.
returncode
!=
0
:
print
'Command %r failed with:
\
n
%s'
%
(
mysql_tzinfo_to_sql_list
,
result
)
print
'Sleeping for %ss and retrying'
%
sleep
else
:
mysql
=
subprocess
.
Popen
(
mysql_list
+
[
'mysql'
,],
stdin
=
subprocess
.
PIPE
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
mysql
.
communicate
(
timezone_sql
)[
0
]
if
mysql
.
returncode
is
None
:
mysql
.
kill
()
if
mysql
.
returncode
!=
0
:
print
'Command %r failed with:
\
n
%s'
%
(
mysql_list
,
result
)
print
'Sleeping for %ss and retrying'
%
sleep
is_succeed
=
True
print
'SlapOS initialisation script succesfully applied on database.'
print
'Command %r failed with:
\
n
%s'
%
(
mysql_list
,
result
)
is_succeed
=
True
if
is_succeed
:
print
'SlapOS initialisation script succesfully applied on database.'
break
print
'Sleeping for %ss and retrying'
%
sleep
sys
.
stdout
.
flush
()
sys
.
stderr
.
flush
()
time
.
sleep
(
sleep
)
slapos/recipe/generic_mysql/template/my.cnf.in
View file @
47daf858
...
...
@@ -24,7 +24,7 @@ long_query_time = 1
max_allowed_packet = 128M
query_cache_size = 32M
plugin-load = ha_mroonga.so;ha
_sphinx.so;ha
ndlersocket.so
plugin-load = ha_mroonga.so;handlersocket.so
# By default only 100 connections are allowed, when using zeo
# we may have much more connections
...
...
slapos/recipe/haproxy/__init__.py
View file @
47daf858
...
...
@@ -73,7 +73,11 @@ class Recipe(GenericBaseRecipe):
server_snippet
=
""
i
=
0
name
=
self
.
options
[
'name'
]
for
address
in
self
.
options
[
'backend-list'
].
split
():
backend_list
=
self
.
options
[
'backend-list'
]
if
isinstance
(
backend_list
,
str
):
# BBB
backend_list
=
backend_list
.
split
()
for
address
in
backend_list
:
i
+=
1
server_snippet
+=
self
.
substituteTemplate
(
snippet_filename
,
dict
(
...
...
slapos/recipe/lamp/template/my.cnf.in
View file @
47daf858
...
...
@@ -21,7 +21,7 @@ long_query_time = 5
max_allowed_packet = 128M
query_cache_size = 32M
plugin-load = ha_mroonga.so
;ha_sphinx.so
plugin-load = ha_mroonga.so
# The following are important to configure and depend a lot on to the size of
# your database and the available resources.
...
...
slapos/recipe/mysql/template/my.cnf.in
View file @
47daf858
...
...
@@ -19,7 +19,7 @@ long_query_time = 5
max_allowed_packet = 128M
query_cache_size = 32M
plugin-load = ha_mroonga.so
;ha_sphinx.so
plugin-load = ha_mroonga.so
# The following are important to configure and depend a lot on to the size of
# your database and the available resources.
...
...
slapos/recipe/tidstorage/__init__.py
View file @
47daf858
...
...
@@ -29,13 +29,21 @@ from slapos.recipe.librecipe import GenericBaseRecipe
class
Recipe
(
GenericBaseRecipe
):
def
install
(
self
):
path_list
=
[]
a
=
path_list
.
append
configuration_file
=
self
.
createFile
(
self
.
options
[
'configuration-path'
],
self
.
substituteTemplate
(
self
.
getTemplateFilename
(
'tidstorage.py.in'
),
self
.
options
))
a
(
configuration_file
)
tidstorage_wrapper
=
self
.
createPythonScript
(
self
.
options
[
'tidstorage-wrapper'
],
'slapos.recipe.librecipe.execute.execute'
,
[
self
.
options
[
'tidstoraged-binary'
],
'--nofork'
,
'--config'
,
configuration_file
])
a
(
tidstorage_wrapper
)
repozo_wrapper
=
self
.
createPythonScript
(
self
.
options
[
'repozo-wrapper'
],
'slapos.recipe.librecipe.execute.execute'
,
[
self
.
options
[
'tidstorage-repozo-binary'
],
'--config'
,
configuration_file
,
'--repozo'
,
self
.
options
[
'repozo-binary'
],
'-z'
])
a
(
repozo_wrapper
)
configuration_file
=
self
.
createFile
(
self
.
options
[
'configuration-path'
],
self
.
substituteTemplate
(
self
.
getTemplateFilename
(
'tidstorage.py.in'
),
self
.
options
))
return
path_list
tidstorage_wrapper
=
self
.
createPythonScript
(
self
.
options
[
'tidstorage-wrapper'
],
'slapos.recipe.librecipe.execute.execute'
,
[
self
.
options
[
'tidstoraged-binary'
],
'--nofork'
,
'--config'
,
configuration_file
])
repozo_wrapper
=
self
.
createPythonScript
(
self
.
options
[
'repozo-wrapper'
],
'slapos.recipe.librecipe.execute.execute'
,
[
self
.
options
[
'tidstorage-repozo-binary'
],
'--config'
,
configuration_file
,
'--repozo'
,
self
.
options
[
'repozo-binary'
],
'-z'
])
return
[
configuration_file
,
tidstorage_wrapper
,
repozo_wrapper
]
slapos/recipe/tidstorage/template/tidstorage.py.in
View file @
47daf858
known_tid_storage_identifier_dict = %(known-tid-storage-identifier-dict)s
base_url = '%(base-url)s'
address = '%(ip)s'
port = %(port)s
...
...
slapos/recipe/xwiki/template/my.cnf.in
View file @
47daf858
...
...
@@ -21,7 +21,7 @@ long_query_time = 5
max_allowed_packet = 128M
query_cache_size = 32M
plugin-load = ha_mroonga.so
;ha_sphinx.so
plugin-load = ha_mroonga.so
# The following are important to configure and depend a lot on to the size of
# your database and the available resources.
...
...
stack/erp5/buildout.cfg
View file @
47daf858
...
...
@@ -17,7 +17,7 @@ find-links =
extends =
# Exact version of Zope
http://svn.zope.org/repos/main/Zope/tags/2.12.2
3
/versions.cfg
http://svn.zope.org/repos/main/Zope/tags/2.12.2
5
/versions.cfg
../../stack/slapos.cfg
../../component/logrotate/buildout.cfg
../../component/dcron/buildout.cfg
...
...
@@ -48,7 +48,6 @@ extends =
../../component/python-2.7/buildout.cfg
../../component/python-ldap-python/buildout.cfg
../../component/rdiff-backup/buildout.cfg
../../component/sphinx/buildout.cfg
../../component/stunnel/buildout.cfg
../../component/subversion/buildout.cfg
../../component/tesseract/buildout.cfg
...
...
@@ -85,7 +84,6 @@ parts =
ghostscript
mariadb
mroonga-mariadb
sphinx
imagemagick
libdmtx
dmtx-utils
...
...
@@ -186,7 +184,7 @@ context =
[template-mariadb]
< = template-jinja2-base
filename = instance-mariadb.cfg
md5sum =
0e8e9bfc8c8a5f1bd71f5c4f346ef68b
md5sum =
867bd8e3c4f56db2aab2fcad59f2efd8
extra-context =
key coreutils_location coreutils:location
key dcron_location dcron:location
...
...
@@ -200,13 +198,6 @@ extra-context =
key sed_location sed:location
key xtrabackup_location xtrabackup:location
[template-sphinx]
< = template-jinja2-base
filename = instance-sphinx.cfg
md5sum = e3975afd5220f251d6b6e7024a2ca08b
extra-context =
key sphinx_location sphinx:location
[template-zope]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/instance-zope.cfg.in
...
...
@@ -227,7 +218,7 @@ extra-context =
[template-tidstorage]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/instance-tidstorage.cfg.in
md5sum =
520e39f2612a045b42c0ad914bfdc5a9
md5sum =
1f3e7cfc719d3c2eee4860678f6a67df
mode = 640
[template-cloudooo]
...
...
@@ -239,7 +230,7 @@ mode = 640
[template-zope-conf]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/zope.conf.in
md5sum =
599e004c18fd3461aa846ae75bd112f2
md5sum =
bc2154161a1d5baddc4ed4dfaaf94fbe
mode = 640
[template]
...
...
@@ -247,7 +238,7 @@ mode = 640
# XXX: "template.cfg" is hardcoded in instanciation recipe
filename = template.cfg
template = ${:_profile_base_location_}/instance.cfg.in
md5sum =
26d26c357053af48602b5110120bd085
md5sum =
700b8729a4d9a8423ab2a99de486cc31
extra-context =
key apache_location apache:location
key aspell_location aspell:location
...
...
@@ -292,7 +283,6 @@ extra-context =
key template_kumofs template-kumofs:rendered
key template_mariadb template-mariadb:rendered
key template_memcached template-memcached:rendered
key template_sphinx template-sphinx:rendered
key template_tidstorage template-tidstorage:target
key template_varnish template-varnish:target
key template_zope template-zope:target
...
...
@@ -320,7 +310,7 @@ mode = 640
[template-erp5-cluster]
< = template-jinja2-base
filename = instance-erp5-cluster.cfg
md5sum =
3051f3fea39d7409c417dcac26027b56
md5sum =
b4a9688ca7983fac5dd573e66c6e4263
extra-context =
key local_bt5_repository local-bt5-repository:list
...
...
@@ -638,7 +628,7 @@ ply = 3.4
polib = 1.0.0
psutil = 0.6.1
python-ldap = 2.4.10
python-magic = 0.4.
2
python-magic = 0.4.
3
python-memcached = 1.47
restkit = 4.2.0
rtjp-eventlet = 0.3.2
...
...
@@ -657,3 +647,6 @@ uuid = 1.30
validictory = 0.8.3
xml-marshaller = 0.9.7
xupdate-processor = 0.4
mr.developer = 1.21
qrcode = 2.4.1
requests = 0.13.2
stack/erp5/instance-erp5-cluster.cfg.in
View file @
47daf858
...
...
@@ -24,13 +24,6 @@ cert-file = ${slap-connection:cert-file}
computer-id = ${slap-connection:computer-id}
partition-id = ${slap-connection:partition-id}
[request-sphinx]
<=request-common
name = Sphinx Search Engine
software-type = sphinx
sla-computer_guid = ${slap-parameter:sphinx-computer-guid}
return = url-sphinx url-sphinx-sql
[request-mariadb]
<=request-common
name = MariaDB DataBase
...
...
@@ -67,8 +60,6 @@ config =
memcached-url
cloudooo-url
kumofs-url
sphinx-url-sphinx
sphinx-url-sphinx-sql
smtp-url
bt5
bt5-repository-url
...
...
@@ -77,8 +68,6 @@ config-mysql-url = ${request-mariadb:connection-url}
config-memcached-url = ${request-memcached:connection-url}
config-cloudooo-url = ${request-cloudooo:connection-url}
config-kumofs-url = ${request-kumofs:connection-url}
config-sphinx-url-sphinx = ${request-sphinx:connection-url-sphinx}
config-sphinx-url-sphinx-sql = ${request-sphinx:connection-url-sphinx-sql}
config-bt5 = ${slap-parameter:bt5}
config-bt5-repository-url = ${slap-parameter:bt5-repository-url}
config-smtp-url = ${slap-parameter:smtp-url}
...
...
@@ -97,7 +86,6 @@ sla-computer_guid = ${slap-parameter:varnish-computer-guid}
[slap-parameter]
# Default value if no computer_guid is specified for each type
sphinx-computer-guid = ${slap-connection:computer-id}
mariadb-computer-guid = ${slap-connection:computer-id}
cloudooo-computer-guid = ${slap-connection:computer-id}
memcached-computer-guid = ${slap-connection:computer-id}
...
...
stack/erp5/instance-mariadb.cfg.in
View file @
47daf858
...
...
@@ -30,7 +30,7 @@ recipe = slapos.cookbook:generic.mysql
# Options
user = user
parallel-test-database-amount =
100
parallel-test-database-amount =
${slap-parameter:test-database-amount}
port = 45678
ip = ${slap-network-information:local-ipv4}
database = erp5
...
...
@@ -178,3 +178,6 @@ recipe = slapos.cookbook:check_port_listening
path = ${basedirectory:promise}/mariadb
hostname = ${mariadb-instance:ip}
port = ${mariadb-instance:port}
[slap-parameter]
test-database-amount = 100
stack/erp5/instance-sphinx.cfg.in
deleted
100644 → 0
View file @
3e8e054c
[buildout]
parts =
publish-sphinx-url
sphinxd-instance
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
[publish-sphinx-url]
recipe = slapos.cookbook:publish
url-sphinx = sphinx://${sphinxd-instance:ip}:${sphinxd-instance:sphinx-port}
url-sphinx-sql = mysql://${sphinxd-instance:ip}:${sphinxd-instance:sql-port}
[sphinxd-instance]
recipe = slapos.cookbook:sphinx
data-directory = ${directory:sphinx-data}
configuration-file = ${rootdirectory:etc}/sphinx.conf
searchd-log = ${basedirectory:log}/sphinx-searchd.log
query-log = ${basedirectory:log}/sphinx-query.log
pid = ${basedirectory:run}/sphinx-searchd.pid
ip = ${slap-network-information:local-ipv4}
sphinx-port = 9312
sql-port = 9306
wrapper = ${basedirectory:services}/sphinxd
sphinx-searchd-binary = {{ sphinx_location }}/bin/searchd
[rootdirectory]
recipe = slapos.cookbook:mkdirectory
etc = ${buildout:directory}/etc
var = ${buildout:directory}/var
srv = ${buildout:directory}/srv
bin = ${buildout:directory}/bin
[basedirectory]
recipe = slapos.cookbook:mkdirectory
log = ${rootdirectory:var}/log
services = ${rootdirectory:etc}/run
run = ${rootdirectory:var}/run
[directory]
recipe = slapos.cookbook:mkdirectory
sphinx-data = ${rootdirectory:srv}/sphinx
stack/erp5/instance-tidstorage.cfg.in
View file @
47daf858
...
...
@@ -485,7 +485,6 @@ recipe = slapos.cookbook:publish
[tidstorage]
recipe = slapos.cookbook:tidstorage
known-tid-storage-identifier-dict = {{ known_tid_storage_identifier_dict }}
base-url = http://${zope-admin:ip}:${zope-admin:port}/%s/serialize
configuration-path = ${directory:etc}/tidstorage.py
ip = {{ ipv4 }}
port = 6001
...
...
stack/erp5/instance.cfg.in
View file @
47daf858
...
...
@@ -197,7 +197,6 @@ memcached = {{ template_memcached }}
cloudooo = ${dynamic-template-cloudooo:rendered}
zope = ${dynamic-template-zope:rendered}
mariadb = {{ template_mariadb }}
sphinx = {{ template_sphinx }}
tidstorage = ${dynamic-template-tidstorage:rendered}
varnish = ${dynamic-template-varnish:rendered}
...
...
stack/erp5/zope.conf.in
View file @
47daf858
...
...
@@ -43,10 +43,11 @@ products {{ instance_products }}
</product-config>
{% endif -%}
{% if 'timerserver-interval' in parameter_dict -%}
{% set timerserver_interval = parameter_dict.get('timerserver-interval', '0') | int -%}
{% if timerserver_interval -%}
%import timerserver
<timer-server>
interval {{
parameter_dict['timerserver-interval']
}}
interval {{
timerserver_interval
}}
</timer-server>
{% endif -%}
...
...
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