本文整理汇总了Python中snapcraft.common.get_snapdir函数的典型用法代码示例。如果您正苦于以下问题:Python get_snapdir函数的具体用法?Python get_snapdir怎么用?Python get_snapdir使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了get_snapdir函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: test_strip_one_part_only_from_3
def test_strip_one_part_only_from_3(self):
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
self.useFixture(fake_logger)
parts = self.make_snapcraft_yaml(n=3)
strip.main(['strip1', ])
self.assertFalse(
os.path.exists(
os.path.join(common.get_snapdir(), 'meta', 'snap.yaml')),
'There should not be a snap.yaml')
self.assertTrue(os.path.exists(common.get_snapdir()),
'Expected a snap directory')
self.assertTrue(os.path.exists(common.get_stagedir()),
'Expected a stage directory')
self.assertTrue(os.path.exists(common.get_partsdir()),
'Expected a parts directory')
self.assertTrue(os.path.exists(parts[1]['part_dir']),
'Expected a part directory for the strip1 part')
self.assertTrue(os.path.exists(parts[1]['state_file']),
'Expected a state file for the strip1 part')
with open(parts[1]['state_file']) as sf:
state = sf.readlines()
self.assertEqual(len(state), 1, 'Expected only one line in the state '
'file for the strip1 part')
self.assertEqual(state[0], 'strip', "Expected the state file for "
" strip1 to be 'strip'")
for i in [0, 2]:
self.assertFalse(os.path.exists(parts[i]['part_dir']),
'Pulled wrong part')
self.assertFalse(os.path.exists(parts[i]['state_file']),
'Expected for only to be a state file for build1')
开发者ID:LefterisJP,项目名称:snapcraft,代码行数:34,代码来源:test_commands_strip.py
示例2: test_strip_defaults
def test_strip_defaults(self):
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
self.useFixture(fake_logger)
parts = self.make_snapcraft_yaml()
strip.main()
self.assertTrue(os.path.exists(common.get_snapdir()),
'Expected a snap directory')
self.assertTrue(
os.path.exists(
os.path.join(common.get_snapdir(), 'meta', 'snap.yaml')),
'Expected a snap.yaml')
self.assertTrue(os.path.exists(common.get_stagedir()),
'Expected a stage directory')
self.assertTrue(os.path.exists(common.get_partsdir()),
'Expected a parts directory')
self.assertTrue(os.path.exists(parts[0]['part_dir']),
'Expected a part directory for the build0 part')
self.assertTrue(os.path.exists(parts[0]['state_file']),
'Expected a state file for the build0 part')
with open(parts[0]['state_file']) as sf:
state = sf.readlines()
self.assertEqual(len(state), 1, 'Expected only one line in the state '
'file for the build0 part')
self.assertEqual(state[0], 'strip', "Expected the state file for "
"build0 to be 'strip'")
开发者ID:LefterisJP,项目名称:snapcraft,代码行数:28,代码来源:test_commands_strip.py
示例3: test_partial_clean
def test_partial_clean(self):
parts = self.make_snapcraft_yaml(n=3)
main(["clean", "clean0", "clean2"])
for i in [0, 2]:
self.assertFalse(
os.path.exists(parts[i]["part_dir"]), "Expected for {!r} to be wiped".format(parts[i]["part_dir"])
)
self.assertTrue(os.path.exists(parts[1]["part_dir"]), "Expected a part directory for the clean1 part")
self.assertTrue(os.path.exists(common.get_partsdir()))
self.assertTrue(os.path.exists(common.get_stagedir()))
self.assertTrue(os.path.exists(common.get_snapdir()))
# Now clean it the rest of the way
main(["clean", "clean1"])
for i in range(0, 3):
self.assertFalse(
os.path.exists(parts[i]["part_dir"]), "Expected for {!r} to be wiped".format(parts[i]["part_dir"])
)
self.assertFalse(os.path.exists(common.get_partsdir()))
self.assertFalse(os.path.exists(common.get_stagedir()))
self.assertFalse(os.path.exists(common.get_snapdir()))
开发者ID:fallen,项目名称:snapcraft,代码行数:27,代码来源:test_commands_clean.py
示例4: test_clean_all
def test_clean_all(self):
cmds.clean({})
self.mock_exists.assert_has_calls([
mock.call('partdir1'),
mock.call().__bool__(),
mock.call('partdir2'),
mock.call().__bool__(),
mock.call('partdir3'),
mock.call().__bool__(),
mock.call(common.get_partsdir()),
mock.call().__bool__(),
mock.call(common.get_stagedir()),
mock.call().__bool__(),
mock.call(common.get_snapdir()),
mock.call().__bool__(),
])
self.mock_rmtree.assert_has_calls([
mock.call('partdir1'),
mock.call('partdir2'),
mock.call('partdir3'),
mock.call(common.get_stagedir()),
mock.call(common.get_snapdir()),
])
self.mock_rmdir.assert_called_once_with(common.get_partsdir())
开发者ID:svijee,项目名称:snapcraft,代码行数:27,代码来源:test_cmds.py
示例5: main
def main(argv=None):
argv = argv if argv else []
args = docopt(__doc__, argv=argv)
config = snapcraft.yaml.load_config()
if args['PART']:
config.validate_parts(args['PART'])
for part in config.all_parts:
if not args['PART'] or part.name in args['PART']:
part.clean()
# parts dir does not contain only generated code.
if (os.path.exists(common.get_partsdir()) and
not os.listdir(common.get_partsdir())):
os.rmdir(common.get_partsdir())
parts_match = set(config.part_names) == set(args['PART'])
# Only clean stage if all the parts were cleaned up.
clean_stage = not args['PART'] or parts_match
if clean_stage and os.path.exists(common.get_stagedir()):
logger.info('Cleaning up staging area')
shutil.rmtree(common.get_stagedir())
if os.path.exists(common.get_snapdir()):
logger.info('Cleaning up snapping area')
shutil.rmtree(common.get_snapdir())
开发者ID:asac,项目名称:snapcraft,代码行数:28,代码来源:clean.py
示例6: test_partial_clean
def test_partial_clean(self):
parts = self.make_snapcraft_yaml(n=3)
clean.main(['clean0', 'clean2'])
for i in [0, 2]:
self.assertFalse(
os.path.exists(parts[i]['part_dir']),
'Expected for {!r} to be wiped'.format(parts[i]['part_dir']))
self.assertTrue(os.path.exists(parts[1]['part_dir']),
'Expected a part directory for the clean1 part')
self.assertTrue(os.path.exists(common.get_partsdir()))
self.assertTrue(os.path.exists(common.get_stagedir()))
self.assertTrue(os.path.exists(common.get_snapdir()))
# Now clean it the rest of the way
clean.main(['clean1'])
for i in range(0, 3):
self.assertFalse(
os.path.exists(parts[i]['part_dir']),
'Expected for {!r} to be wiped'.format(parts[i]['part_dir']))
self.assertFalse(os.path.exists(common.get_partsdir()))
self.assertFalse(os.path.exists(common.get_stagedir()))
self.assertFalse(os.path.exists(common.get_snapdir()))
开发者ID:dplanella,项目名称:snapcraft,代码行数:28,代码来源:test_commands_clean.py
示例7: test_strip_one_part_only_from_3
def test_strip_one_part_only_from_3(self):
fake_logger = fixtures.FakeLogger(level=logging.ERROR)
self.useFixture(fake_logger)
parts = self.make_snapcraft_yaml(n=3)
main(['strip', 'strip1'])
self.assertFalse(
os.path.exists(
os.path.join(common.get_snapdir(), 'meta', 'snap.yaml')),
'There should not be a snap.yaml')
self.assertTrue(os.path.exists(common.get_snapdir()),
'Expected a snap directory')
self.assertTrue(os.path.exists(common.get_stagedir()),
'Expected a stage directory')
self.assertTrue(os.path.exists(common.get_partsdir()),
'Expected a parts directory')
self.assertTrue(os.path.exists(parts[1]['part_dir']),
'Expected a part directory for the strip1 part')
self.verify_state('strip1', parts[1]['state_dir'], 'strip')
for i in [0, 2]:
self.assertFalse(os.path.exists(parts[i]['part_dir']),
'Pulled wrong part')
self.assertFalse(os.path.exists(parts[i]['state_dir']),
'Expected for only to be a state file for build1')
开发者ID:fallen,项目名称:snapcraft,代码行数:27,代码来源:test_commands_strip.py
示例8: clean
def clean(args):
config = _load_config()
part_names = {part.name for part in config.all_parts}
for part_name in args.parts:
if part_name not in part_names:
logger.error('The part named {!r} is not defined in '
'\'snapcraft.yaml\''.format(part_name))
sys.exit(1)
for part in config.all_parts:
if not args.parts or part.name in args.parts:
part.clean()
# parts dir does not contain only generated code.
if (os.path.exists(common.get_partsdir()) and
not os.listdir(common.get_partsdir())):
os.rmdir(common.get_partsdir())
clean_stage = not args.parts or part_names == set(args.parts)
if clean_stage and os.path.exists(common.get_stagedir()):
logger.info('Cleaning up staging area')
shutil.rmtree(common.get_stagedir())
if os.path.exists(common.get_snapdir()):
logger.info('Cleaning up snapping area')
shutil.rmtree(common.get_snapdir())
开发者ID:kightlygeorge,项目名称:snapcraft,代码行数:27,代码来源:cmds.py
示例9: _cleanup_common_directories
def _cleanup_common_directories(config):
_remove_directory_if_empty(common.get_partsdir())
_remove_directory_if_empty(common.get_stagedir())
_remove_directory_if_empty(common.get_snapdir())
max_index = -1
for part in config.all_parts:
step = part.last_step()
if step:
index = common.COMMAND_ORDER.index(step)
if index > max_index:
max_index = index
# If no parts have been pulled, remove the parts directory. In most cases
# this directory should have already been cleaned, but this handles the
# case of a failed pull.
should_remove_partsdir = max_index < common.COMMAND_ORDER.index('pull')
if should_remove_partsdir and os.path.exists(common.get_partsdir()):
logger.info('Cleaning up parts directory')
shutil.rmtree(common.get_partsdir())
# If no parts have been staged, remove staging area.
should_remove_stagedir = max_index < common.COMMAND_ORDER.index('stage')
if should_remove_stagedir and os.path.exists(common.get_stagedir()):
logger.info('Cleaning up staging area')
shutil.rmtree(common.get_stagedir())
# If no parts have been stripped, remove snapping area.
should_remove_snapdir = max_index < common.COMMAND_ORDER.index('strip')
if should_remove_snapdir and os.path.exists(common.get_snapdir()):
logger.info('Cleaning up snapping area')
shutil.rmtree(common.get_snapdir())
开发者ID:dplanella,项目名称:snapcraft,代码行数:32,代码来源:clean.py
示例10: test_clean_strip_after_fileset_change
def test_clean_strip_after_fileset_change(self):
# Create part1 and get it through the "build" step.
handler = pluginhandler.load_plugin('part1', 'nil')
handler.makedirs()
bindir = os.path.join(handler.code.installdir, 'bin')
os.makedirs(bindir)
open(os.path.join(bindir, '1'), 'w').close()
open(os.path.join(bindir, '2'), 'w').close()
handler.mark_done('build')
handler.stage()
handler.strip()
# Verify that both files have been stripped
self.assertTrue(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '1')))
self.assertTrue(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '2')))
# Now update the `snap` fileset to only snap one of these files
handler.code.options.snap = ['bin/1']
# Now clean the strip step for part1
handler.clean_strip({})
# Verify that part1's file is no longer stripped
self.assertFalse(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '1')),
'Expected bin/1 to be cleaned')
self.assertFalse(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '2')),
'Expected bin/2 to be cleaned as well, even though the filesets '
'changed since it was stripped.')
开发者ID:fallen,项目名称:snapcraft,代码行数:34,代码来源:test_pluginhandler.py
示例11: clear_common_directories
def clear_common_directories(self):
if os.path.exists(common.get_partsdir()):
shutil.rmtree(common.get_partsdir())
if os.path.exists(common.get_stagedir()):
shutil.rmtree(common.get_stagedir())
if os.path.exists(common.get_snapdir()):
shutil.rmtree(common.get_snapdir())
开发者ID:fallen,项目名称:snapcraft,代码行数:9,代码来源:test_pluginhandler.py
示例12: test_clean_nested_dependent_parts
def test_clean_nested_dependent_parts(self):
yaml = """name: clean-test
version: 1.0
summary: test clean
description: test clean
parts:
main:
plugin: nil
source: .
dependent:
plugin: nil
source: .
after: [main]
dependent-dependent:
plugin: nil
source: .
after: [dependent]"""
super().make_snapcraft_yaml(yaml)
part_dirs = {}
for part in ['main', 'dependent', 'dependent-dependent']:
part_dirs[part] = os.path.join(common.get_partsdir(), part)
os.makedirs(part_dirs[part])
os.makedirs(common.get_stagedir())
os.makedirs(common.get_snapdir())
# Cleaning only `main`. Since `dependent` depends upon main, we expect
# that it will be cleaned as well. Otherwise it won't be using the new
# `main` when it is built.
clean.main(['main'])
self.assertFalse(os.path.exists(part_dirs['main']),
'Expected part directory for main to be cleaned')
self.assertFalse(
os.path.exists(part_dirs['dependent']),
'Expected part directory for dependent to be cleaned as it '
'depends upon main')
self.assertFalse(
os.path.exists(part_dirs['dependent-dependent']),
'Expected part directory for dependent-dependent to be cleaned as '
'it depends upon dependent, which depends upon main')
self.assertFalse(os.path.exists(common.get_partsdir()))
self.assertFalse(os.path.exists(common.get_stagedir()))
self.assertFalse(os.path.exists(common.get_snapdir()))
开发者ID:dplanella,项目名称:snapcraft,代码行数:51,代码来源:test_commands_clean.py
示例13: test_clean_strip
def test_clean_strip(self):
filesets = {
'all': {
'fileset': ['*'],
},
'no1': {
'fileset': ['-1'],
},
'onlya': {
'fileset': ['a'],
},
'onlybase': {
'fileset': ['*', '-*/*'],
},
'nostara': {
'fileset': ['-*/a'],
},
}
for key, value in filesets.items():
with self.subTest(key=key):
self.clear_common_directories()
handler = pluginhandler.load_plugin('test_part', 'nil', {
'snap': value['fileset']
})
handler.makedirs()
installdir = handler.code.installdir
os.makedirs(installdir + '/1/1a/1b')
os.makedirs(installdir + '/2/2a')
os.makedirs(installdir + '/3')
open(installdir + '/a', mode='w').close()
open(installdir + '/b', mode='w').close()
open(installdir + '/1/a', mode='w').close()
open(installdir + '/3/a', mode='w').close()
handler.mark_done('build')
# Stage the installed files
handler.stage()
# Now strip them
handler.strip()
self.assertTrue(os.listdir(common.get_snapdir()))
handler.clean_strip({})
self.assertFalse(os.listdir(common.get_snapdir()),
'Expected snapdir to be completely cleaned')
开发者ID:fallen,项目名称:snapcraft,代码行数:51,代码来源:test_pluginhandler.py
示例14: test_cleanbuild
def test_cleanbuild(self, mock_installed, mock_call):
mock_installed.return_value = True
fake_logger = fixtures.FakeLogger(level=logging.INFO)
self.useFixture(fake_logger)
self.make_snapcraft_yaml()
# simulate build artifacts
dirs = [
os.path.join(common.get_partsdir(), 'part1', 'src'),
common.get_stagedir(),
common.get_snapdir(),
os.path.join(common.get_partsdir(), 'plugins'),
]
files_tar = [
os.path.join(common.get_partsdir(), 'plugins', 'x-plugin.py'),
'main.c',
]
files_no_tar = [
os.path.join(common.get_stagedir(), 'binary'),
os.path.join(common.get_snapdir(), 'binary'),
'snap-test.snap',
'snap-test_1.0_source.tar.bz2',
]
for d in dirs:
os.makedirs(d)
for f in files_tar + files_no_tar:
open(f, 'w').close()
cleanbuild.main()
self.assertEqual(
'Setting up container with project assets\n'
'Waiting for a network connection...\n'
'Network connection established\n'
'Retrieved snap-test_1.0_amd64.snap\n',
fake_logger.output)
with tarfile.open('snap-test_1.0_source.tar.bz2') as tar:
tar_members = tar.getnames()
for f in files_no_tar:
f = os.path.relpath(f)
self.assertFalse('./{}'.format(f) in tar_members,
'{} should not be in {}'.format(f, tar_members))
for f in files_tar:
f = os.path.relpath(f)
self.assertTrue('./{}'.format(f) in tar_members,
'{} should be in {}'.format(f, tar_members))
开发者ID:dplanella,项目名称:snapcraft,代码行数:50,代码来源:test_commands_cleanbuild.py
示例15: test_clean_strip_multiple_independent_parts
def test_clean_strip_multiple_independent_parts(self):
# Create part1 and get it through the "build" step.
handler1 = pluginhandler.load_plugin('part1', 'nil')
handler1.makedirs()
bindir = os.path.join(handler1.code.installdir, 'bin')
os.makedirs(bindir)
open(os.path.join(bindir, '1'), 'w').close()
handler1.mark_done('build')
# Now create part2 and get it through the "build" step.
handler2 = pluginhandler.load_plugin('part2', 'nil')
handler2.makedirs()
bindir = os.path.join(handler2.code.installdir, 'bin')
os.makedirs(bindir)
open(os.path.join(bindir, '2'), 'w').close()
handler2.mark_done('build')
# Now stage both parts
handler1.stage()
handler2.stage()
# And strip both parts
handler1.strip()
handler2.strip()
# Verify that part1's file has been stripped
self.assertTrue(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '1')))
# Verify that part2's file has been stripped
self.assertTrue(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '2')))
# Now clean the strip step for part1
handler1.clean_strip({})
# Verify that part1's file is no longer stripped
self.assertFalse(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '1')),
"Expected part1's stripped files to be cleaned")
# Verify that part2's file is still there
self.assertTrue(
os.path.exists(os.path.join(common.get_snapdir(), 'bin', '2')),
"Expected part2's stripped files to be untouched")
开发者ID:fallen,项目名称:snapcraft,代码行数:49,代码来源:test_pluginhandler.py
示例16: test_snap_defaults
def test_snap_defaults(self, mock_call):
fake_logger = fixtures.FakeLogger(level=logging.INFO)
self.useFixture(fake_logger)
self.make_snapcraft_yaml()
snap.main()
self.assertEqual(
'Pulling part1 \n'
'Building part1 \n'
'Staging part1 \n'
'Stripping part1 \n'
'Snapping snap-test_1.0_amd64.snap\n'
'Snapped snap-test_1.0_amd64.snap\n',
fake_logger.output)
self.assertTrue(os.path.exists(common.get_stagedir()),
'Expected a stage directory')
self.assertTrue(self.state_file,
'Expected a state file for the part1 part')
with open(self.state_file) as sf:
state = sf.readlines()
self.assertEqual(len(state), 1, 'Expected only one line in the state '
'file for the part1 part')
self.assertEqual(state[0], 'strip', "Expected the state file for "
"part1 to be 'strip'")
mock_call.assert_called_once_with([
'mksquashfs', common.get_snapdir(), 'snap-test_1.0_amd64.snap',
'-noappend', '-comp', 'xz'])
开发者ID:asac,项目名称:snapcraft,代码行数:31,代码来源:test_commands_snap.py
示例17: _wrap_exe
def _wrap_exe(relexepath):
snap_dir = common.get_snapdir()
exepath = os.path.join(snap_dir, relexepath)
wrappath = exepath + '.wrapper'
# TODO talk to original author if the exception to be captured here is
# FileNotFoundError, the original code was a general catch all
try:
os.remove(wrappath)
except FileNotFoundError:
pass
wrapexec = '$SNAP_APP_PATH/{}'.format(relexepath)
if not os.path.exists(exepath) and '/' not in relexepath:
# If it doesn't exist it might be in the path
logger.debug('Checking to see if "{}" is in the $PATH'.format(
relexepath))
with tempfile.NamedTemporaryFile('w+') as tempf:
script = ('#!/bin/sh\n' +
'{}\n'.format(common.assemble_env()) +
'which "{}"\n'.format(relexepath))
tempf.write(script)
tempf.flush()
common.run(['/bin/sh', tempf.name], cwd=snap_dir)
wrapexec = relexepath
_write_wrap_exe(wrapexec, wrappath)
return os.path.relpath(wrappath, snap_dir)
开发者ID:General-Beck,项目名称:snapcraft,代码行数:29,代码来源:meta.py
示例18: test_non_shebang_binaries_ignored
def test_non_shebang_binaries_ignored(self):
"""Native binaries are ignored.
If the executable is a native binary, and thus not have a
shebang, it's ignored.
"""
snapdir = common.get_snapdir()
os.mkdir(snapdir)
relative_exe_path = 'test_relexepath'
# Choose a content which can't be decoded with utf-8, to make
# sure no decoding errors happen.
exe_contents = b'\xf0\xf1'
with open(os.path.join(snapdir, relative_exe_path), 'wb') as exe:
exe.write(exe_contents)
relative_wrapper_path = meta._wrap_exe(relative_exe_path)
wrapper_path = os.path.join(snapdir, relative_wrapper_path)
expected = ('#!/bin/sh\n'
'\n\n'
'exec "$SNAP/test_relexepath" $*\n')
with open(wrapper_path) as wrapper_file:
wrapper_contents = wrapper_file.read()
self.assertEqual(expected, wrapper_contents)
with open(os.path.join(snapdir, relative_exe_path), 'rb') as exe:
self.assertEqual(exe_contents, exe.read())
开发者ID:sergiusens,项目名称:snapcraft,代码行数:28,代码来源:test_meta.py
示例19: create
def create(config_data, arches=None):
'''
Create the meta directory and provision it with package.yaml and readme.md
in the snap dir using information from config_data and arches.
If provided arches, is a list of arches.
Returns meta_dir.
'''
# TODO keys for using apparmor, setting an icon missing.
meta_dir = os.path.join(common.get_snapdir(), 'meta')
os.makedirs(meta_dir, exist_ok=True)
config_data['icon'] = _copy(meta_dir, config_data['icon'])
if 'framework-policy' in config_data:
_copy(meta_dir, config_data['framework-policy'], 'framework-policy')
_write_package_yaml(meta_dir, config_data, arches)
_write_readme_md(meta_dir, config_data)
if 'config' in config_data:
_setup_config_hook(meta_dir, config_data['config'])
return meta_dir
开发者ID:kightlygeorge,项目名称:snapcraft,代码行数:25,代码来源:meta.py
示例20: test_wrap_exe_writes_wrapper_with_basename
def test_wrap_exe_writes_wrapper_with_basename(self, mock_assemble_env):
mock_assemble_env.return_value = """\
PATH={0}/part1/install/usr/bin:{0}/part1/install/bin
""".format(common.get_partsdir())
snapdir = common.get_snapdir()
os.mkdir(snapdir)
relative_exe_path = 'test_relexepath'
open(os.path.join(snapdir, relative_exe_path), 'w').close()
relative_wrapper_path = meta._wrap_exe(
relative_exe_path, basename='new-name')
wrapper_path = os.path.join(snapdir, relative_wrapper_path)
self.assertEqual(relative_wrapper_path, 'new-name.wrapper')
expected = ('#!/bin/sh\n'
'PATH=$SNAP/usr/bin:$SNAP/bin\n'
'\n\n'
'exec "$SNAP/test_relexepath" $*\n')
with open(wrapper_path) as wrapper_file:
wrapper_contents = wrapper_file.read()
self.assertEqual(expected, wrapper_contents)
开发者ID:sergiusens,项目名称:snapcraft,代码行数:25,代码来源:test_meta.py
注:本文中的snapcraft.common.get_snapdir函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论