SVN-скрипт для переименования переменных-членов при извлечении / обновлении - PullRequest
1 голос
/ 27 мая 2009

Я работаю с парнем, который предпочитает именовать свои переменные-члены, используя соглашение mCamelCase, например: mSomeVar или mSomeOtherVar. Я терпеть не могу этот формат. Я предпочитаю конвекцию m_camelCase, например: m_someVar или m_someOtherVar. Мы сводим друг друга с ума, глядя на код друг друга.

Теперь мы добавили в команду нового парня, и он вообще не предпочитает префиксов. Поскольку мы используем svn, мы подумали, что можем разработать сценарий svn, который переименовывает переменные-члены на лету, когда вы загружаете код с сервера. Таким образом, каждый может получить переменные-члены, названные так, как они хотят.

У кого-нибудь есть примеры svn-скриптов, которые могут делать подобные вещи? Я видел сценарии, которые меняют заголовки комментариев, но нам нужно что-то, что включает в себя процессор C ++.

Ответы [ 3 ]

5 голосов
/ 27 мая 2009

Звучит как рецепт катастрофы. Чтобы это работало, вам нужно выбрать общий стандарт репозитория, в котором каждый файл использует одинаковые соглашения об именах переменных. Если вы можете сделать это, то почему бы просто не сделать так, чтобы каждый код был таким ?! В соглашениях важно не , какое соглашение вы используете, а то, что все на самом деле используют то же самое соглашение!

Найдите кого-нибудь со стажем, чтобы сделать вызов (или, если возможно, получить звание), всем остальным просто придется смириться с этим.

5 голосов
/ 27 мая 2009

Я предполагаю, что вы хотите изменить стиль для исследовательских целей, и вопрос просто гипотетический. Джоэл С., кажется, считает, что ответы, в которых просто говорится, что вы делаете что-то не так, вовсе не являются хорошими ответами, поэтому я попытаюсь дать вам несколько путей для решения вашей проблемы.

Самая близкая вещь, которую svn делает с точки зрения преобразований, это то, что она может изменить строку, заканчивающуюся при оформлении заказа, и изменить ее снова при регистрации. Это позволяет репозиторию иметь единое представление об окончании строки, а для разных клиентов - изменять файлы в соответствии со своими предпочтениями. Хотя эта функция звучит довольно прямо, у многих людей возникают проблемы с ее корректной работой. Просто Google 'svn eol-style' .

Поскольку svn не предоставляет никаких настраиваемых фильтров на стороне клиента, я думаю, было бы безопасно предположить, что вам понадобится изменить клиент svn и скомпилировать его для своих собственных целей. Возможно, вы могли бы отправить патч или расширение обратно в SVN.

Итак, на данный момент вы должны загрузить исходный код svn и иметь возможность получить его для компиляции клиента. На этом этапе обратите ваше внимание на libsvn_subr/subst.c. Этот файл содержит процедуры для перевода в и из различных форматов. В настоящее время он занимается переводом на расширение ключевых слов и eol's.

Вам просто нужно создать новое свойство, которое может называться member-variable-style. Для файлов, для которых установлен этот флаг, вы можете вызвать специальное преобразование в коде subst.c. Вы могли бы отследить ссылку в svn на код преобразования, посмотрев на вызовы svn_subst_translate_stream3.

OK. Это была легкая часть. Теперь вам нужно получить функцию для правильного перевода вашего кода из одной формы в другую. Вы не можете просто вытащить процессор cpp из gcc, потому что нет гарантии, что код будет корректным / скомпилированным. Вы должны приложить все усилия, чтобы создать правила lexing, которые, мы надеемся, будут правильно делать с правильными переменными. Для переменных, начинающихся с m_ или даже m, это довольно просто сделать. К сожалению, для члена вашей команды, который вообще не использует m_, может быть довольно сложно определить, что является переменной-членом в C ++. К счастью, существует немало исследований в этой области, проведенных людьми, которые создают код с подсветкой синтаксиса. Я бы покопался и нашел какой-то код, который хорошо выделяет код C ++.

Наконец, так как эти преобразования могут стать довольно сложными, я бы посоветовал вам использовать оболочку svn для программы фильтрации на этом этапе. Это не было бы большим для производительности, но это сделало бы намного легче написать и отладить ваш фильтр. Затем вы можете написать свой фильтр на Perl или на языке по вашему выбору. Хороший пример использования внешней программы внешнего фильтра см. Sirect redirectors .

.

Удачи!

3 голосов
/ 27 мая 2009

Subversion не имеет хуков, которые работают при обновлении - вы могли бы иметь хук после фиксации *, который позволял бы вам конвертировать из одного соглашения в другое (стандарт репозитория), и вы могли бы использовать скрипт, который вы пишете сами, выполняет проверку, а затем выполняет необходимые корректировки, но это даст вам ложные показания на svn diff и т. д.

Мое предложение - просто сесть с коллегами и договориться о стандарте. Хук после фиксации все равно будет полезен для ловли промахов.

* Я думаю, что-то, что видит, что произошла фиксация, автоматически проверяет и изменяет код в соответствии со стандартным соглашением с репозиторием, а затем фиксирует, если необходимо. Другим вариантом является использование ловушки перед фиксацией, которая запрещает коммит, если код не соответствует стандарту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...