#python #parsing #gerrit
#python #синтаксический анализ #gerrit
Вопрос:
У меня возникли некоторые проблемы с написанием некоторого Gerrit http://code.google.com/p/gerrit / хуки.
http://gerrit.googlecode.com/svn/documentation/2.2.0/config-hooks.html
Если я проанализирую командную строку для patchset-created -change -изменить-URL-адрес -проект -ветвь -загрузчик -фиксация -patchset
def main():
if (len(sys.argv) < 2):
showUsage()
exit()
if (sys.argv[1] == 'update-projects'):
updateProjects()
exit()
need = ['action=', 'change=', 'change-url=', 'commit=', 'project=', 'branch=', 'uploader=',
'patchset=', 'abandoner=', 'reason=', 'submitter=', 'comment=', 'CRVW=', 'VRIF=' , 'patchset=' , 'restorer=', 'author=']
print sys.argv[1:]
print '-----'
optlist, args = getopt.getopt(sys.argv[1:], '', need)
id = url = hash = who = comment = reason = codeReview = verified = restorer = ''
print optlist
for o, a in optlist:
if o == '--change': id = a
elif o == '--change-url': url = a
elif o == '--commit': hash = a
elif o == '--action': what = a
elif o == '--uploader': who = a
elif o == '--submitter': who = a
elif o == '--abandoner': who = a
elif o == '--author' : who = a
elif o == '--branch': branch = a
elif o == '--comment': comment = a
elif o == '--CRVW' : codeReview = a
elif o == '--VRIF' : verified = a
elif o == '--patchset' : patchset = a
elif o == '--restorer' : who = a
elif o == '--reason' : reason = a
Ввод в командной строке:
--change I87f7802d438d5640779daa9ac8196aeb3eec8c2a
--change-url http://<hostname>:8080/308
--project private/bar
--branch master
--uploader xxxxxxx-xxxxx xxxxxxx (xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)
--commit 49aae9befaf27a5fede51b498f0660199f47b899 --patchset 1
выведите sys.argv[1:]
['--action', 'new',
'--change','I87f7802d438d5640779daa9ac8196aeb3eec8c2a',
'--change-url',
'http://<hostname>:8080/308',
'--project', 'private/bar',
'--branch', 'master',
'--uploader', 'xxxxxxx-xxxxx', 'xxxxxxx', '(xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)',
'--commit', '49aae9befaf27a5fede51b498f0660199f47b899',
'--patchset', '1']
распечатать список опций
[('--action', 'new'),
('--change', 'I87f7802d438d5640779daa9ac8196aeb3eec8c2a'),
('--change-url', 'http://<hostname>:8080/308'),
('--project', 'private/bar'),
('--branch', 'master'),
('--uploader', 'xxxxxxx-xxxxx')]
Я не знаю, почему скрипт генерирует
'--uploader', 'xxxxxxx-xxxxx', 'xxxxxxx', '(xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)'
and not
'--uploader', 'xxxxxxx-xxxxx xxxxxxx (xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)'
потому что таким образом скрипт не выполняет синтаксический анализ —commit —patchset …
Когда я разбираю добавленный комментарий, все работает:
Ввод в командной строке:
-change I87f7802d438d5640779daa9ac8196aeb3eec8c2a
--change-url http://<hostname>.intra:8080/308
--project private/bar
--branch master
--author xxxxxxx-xxxxx xxxxxxx (xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)
--commit 49aae9befaf27a5fede51b498f0660199f47b899
--comment asdf
--CRVW 0
--VRIF 0
выведите sys.argv[1:]
'--action', 'comment',
'--change', 'I87f7802d438d5640779daa9ac8196aeb3eec8c2a',
'--change-url',
'http://<hostname>:8080/308',
'--project', 'private/bar',
'--branch', 'master',
'--author', 'xxxxxxx-xxxxx xxxxxxx (xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)', <<< That's right!
'--commit', '49aae9befaf27a5fede51b498f0660199f47b899',
'--comment', 'asdf',
'--CRVW', '0',
'--VRIF', '0']
Ответ №1:
Поскольку имена параметров и значения разделены пробелами, вам придется заключить значения в кавычки, если они сами содержат пробелы.
Если вы напишете --uploader xxxxxxx-xxxxx xxxxxxx (xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)
, последние две строки фактически окажутся в args
из строки
optlist, args = getopt.getopt(sys.argv[1:], '', need)
поскольку они не связаны с --uploader
Ответ №2:
Вы должны заключить аргумент в кавычки, если он содержит пробелы, как для всех инструментов командной строки:
--uploader "xxxxxxx-xxxxx xxxxxxx (xxxxxxxxxxxxx.xxxxxxx@xxx-xxxx.xx)"
Комментарии:
1. Я получаю этот поток от Gerrit, но зачем это делать, когда Gerrit использует добавленный комментарий… Вот в чем проблема, чего я не понимаю
2. Почему бы вам просто не сделать
' '.join(a)
с аргументами для--uploader
? Я полагаю, Геррит делает то же самое. Это не так сложно.3. Теперь я меняю аргументы перед запуском скрипта, и это обходное решение работает.
Ответ №3:
Вы также можете рассмотреть возможность использования gnu_getopt(), поскольку это позволило бы вам смешивать аргументы option и non-option. Из документации
Функция getopt() прекращает обработку параметров, как только встречается аргумент, не являющийся параметром
Если вы используете gnu_getopt, остальные параметры, а именно commit и pathset, все равно будут проанализированы правильно, даже если в аргументе uploader отсутствуют кавычки
Комментарии:
1. Спасибо. Это хорошая подсказка, но это не тот вариант, мне нужны все аргументы.