Показаны сообщения с ярлыком настройки. Показать все сообщения
Показаны сообщения с ярлыком настройки. Показать все сообщения

воскресенье, 21 марта 2010 г.

Использование внешнего редактора для команды bzr shelve

Одной из очень полезных функций в bzr является пара команд shelve/unshelve. Эти команды позволяют временно удалить из рабочих файлов часть изменений, чтобы зафиксировать остальные изменения без них. Часто это бывает нужно для логического разделения разных правок. Например, вы начали реализовывать новую функцию в своей программе и попутно обнаружили и исправили старый баг. Имеет смысл зафиксировать исправление ошибки отдельно и затем продолжить работу над новой функцией. В этом случае помогает shelve/unshelve.
Подобная функциональность присутствует в других системах контроля версий. Так, в git для этого используется команда stash, а в hg для этого используется расширение shelve.
Подробный рассказ об использовании shelve/unshelve заслуживает отдельной статьи. Вкратце процесс отбора изменений для удаления их "на полочку" выглядит следующим образом:
  • вы запускаете команду shelve, опционально указывая список файлов, в которых нужно отобрать изменения.
  • для каждого файла с изменениями bzr вам показывает отдельные блоки изменений (diff hunks), аналогично тому как блоками показывает изменения команда diff.
  • для каждого блока вы указываете: хотите ли вы убрать это изменение "на полочку" либо оставить в рабочей копии.
  • после того, как вы ответите на вопрос по каждому блоку каждого файла с изменениями, отобранные изменения удаляются из рабочей копии и сохраняются в специальном хранилище ("на полочке").
Подробнее об использовании shelve смотрите справку по этой команде.

Одним из неудобств при использовании shelve является гранулярность отбора изменений. Вы не можете так просто удалить одну строку с изменениями из целого блока (hunks). Вам приходится или убирать весь блок или оставлять весь блок. Что было не очень удобно.

Однако, к нашей радости, в bzr 2.1.0 у shelve появилась новая функция: теперь можно использовать внешний редактор для правки и отбора изменений. В качестве редактора имеет смысл использовать программу для просмотра и редактирования изменений в 2х файлах. Например, vimdiff, WinMerge и проч.

Для того, чтобы использовать внешний редактор в команде shelve его следует предварительно задать в файле конфигурации bazaar.conf. Для этого в секции [DEFAULT] добавьте строку вида:
change_editor = vimdiff -fo @new_path @old_path
Здесь: @new_path @old_path — это специальные параметры, вместо которых в реальности bzr будет подставлять полный путь к редактируемому файлу (@new_path) и полный путь к файлу с последним зафиксированным состоянием (@old_path).

Так, например, я для использования WinMerge указал следующую строку в bazaar.conf:
change_editor = '"C:/Program Files/WinMerge/WinMergeU.exe" @old_path @new_path'
После того, как вы настроите change_editor, при вызовах shelve в строке выбора для каждого блока изменений вам будет доступен дополнительный выбор ("e"). По нажатию на клавишу "e" (editor) будет запущена указанная вами программа для редактирования текущего файла. Ваша задача: отредактировать @new_path до состояния, в котором вы хотите, чтобы он был на диске. Команда shelve сама определит какие изменения нужно убрать из текущей рабочей копии конкретного файла, чтобы в итоге получилось то, что вы хотите.

Приятной работы!

понедельник, 30 ноября 2009 г.

Пользовательские псевдонимы команд bzr (aliases)

Bazaar имеет весьма интересную и полезную функцию тонкого тюнинга: поддержку для определяемых пользователем псевдонимов для команд (aliases). Псевдонимы позволяют  определять команды с нужными опциями и параметрами по умолчанию, и даже переопределять встроенные команды. При умелом использовании псевдонимы могут значительно упростить повседневное использование bzr из командной строки.

Отличие пользовательских псевдонимов от встроенных псевдонимов команд

Большинство стандартных команд bzr и даже команд, добавляемых плагинами, имеют заранее предопределенный набор альтернативных имен (псевдонимов) для вызова этих команд. Так, команда commit имеет псевдонимы ci и checkin, а statusst и stat, и т.п. Эти псевдонимы выводятся при запросе справки на конкретную команду (bzr xxx --help или bzr xxx --usage).

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

Как работают пользовательские псевдонимы

Пользователь может определить псевдоним, как некоторое имя, и связать с этим именем существующую команду bzr и дополнительно какие-то опции и параметры. Тогда при вызове команды как:
bzr имя_псевдонима [опции аргументы]
вместо имени псевдонима будет подставляться значение псевдонима: определенная ранее реальная команда bzr + дополнительные параметры.

При этом опции псевдонима могут переопределяться в конкретной командной строке: просто укажите новое значение и bzr будет использовать последнее определенное значение опции при запуске команды. Для отмены действия булевой опции используйте префикс no, например: --short => --no-short.

У псевдонимов есть еще одно интересное свойство: вы можете в качестве имени псевдонима использовать имя существующей команды bzr. Это особенно полезно в тех случаях, когда вы хотите "навсегда" поменять поведение какой-то команды по умолчанию. Например, чтобы вывод команды status имел компактный вид применяется опция --short или -S. Если вы предпочитаете всегда использовать такую форму вывода информации, то можете определить псевдоним
status = status --short
Следует однако помнить, что все встроенные альтернативные имена команд (о которых упоминалось ранее) автоматически не переопределяются при переопределении команды. Поэтому если вы определили псевдоним для status как описано выше, то запуск bzr st будет производиться обычным (не переопределенным) способом.

Как определить свой псевдоним

Определения пользовательских псевдонимов хранятся в файле bazaar.conf (~/.bazaar/bazaar.conf на Linux и C:\Documents and Settings\USERNAME\Application Data\bazaar\2.0\bazaar.conf на Windows) внутри секции [ALIASES]. Определения псевдонимов имеют простую форму:
имя_псевдонима = имя_команды [опции]
Для определения новых псевдонимов или редактирования старых вы можете как напрямую редактировать файл bazaar.conf, так и использовать встроенную команду alias, либо воспользоваться GUI диалогами из плагинов QBzr (команда qconfig) или bzr-gtk (команда gpreferences).

Использование команды bzr alias

Запуск команды bzr alias без параметров выведет список уже определенных вами псевдонимов.

Для определения нового псевдонима используйте синтаксис:
bzr alias имя_псевдонима="значение"
(Не забывайте использовать кавычки если значение псевдонима состоит из имени команды bzr и набора опций по умолчанию).

Например:
bzr alias st="status --short"

Для удаления ранее определенного псевдонима используйте опцию --remove:
bzr alias st --remove

Примеры псевдонимов

Кроме уже упомянутого ранее псевдонима для status --short рассмотрим еще несколько примеров полезных псевдонимов.

Получать вывод команды missing в формате в максимально сжатом виде (1 ревизия на строку):
miss = missing --line
Получить список десяти последних ревизий в компактном виде:
last = log -l10 --short
Вывод максимальной информации в аннотации файла:
ann = annotate --long
Всегда удалять файлы из-под контроля bzr без удаления их с диска:
forget = remove --keep
Матерые пользователи darcs могут захотеть определить псевдоним:
whatsnew = diff
Примечание: примеры выше даны в нотации, подходящей для помещения в конфигурационный файл bazaar.conf. Для установки их в командной строке через команду bzr alias используйте форму имя="команда опции".

Вредные советы

bzr никак не проверяет смысл и содержание псевдонимов, поэтому вполне реально определить что-нибудь неожиданно деструктивное, например:
ci = revert --no-backup
Я, впрочем, надеюсь наши читатели такими диверсиями заниматься не будут.

Временное отключение пользовательских псевдонимов

Иногда может оказаться полезным отключить псевдонимы. Например, когда возникают непонятные ошибки.

Глобальная опция --no-aliases, заданная до имени команды, поможет вам в этом:
bzr --no-aliases xxx
Совет: опции --no-plugins и --no-aliases целесообразно использовать при замерах скорости работы bzr.

Заключение

Если у вас тоже есть парочка любимых псевдонимов, которые могут быть полезны другим, поделитесь ими в комментариях.

воскресенье, 5 апреля 2009 г.

Автоматический whoami при работе через SSH

В статье рассматривается простой пример использования (документированных) возможностей как sshd, так и bzr, для автоматической установки идентификатора пользователя при работе на удаленной машине.

Сценарий

Имеется общий компьютер, на котором могут работать несколько человек под одной учетной записью. Этот компьютер может использоваться как тестовый полигон, либо как машина для компиляции окончательной версии программы, или для сборки инсталляционных пакетов. Либо же это тестовый/боевой сервер, на котором запущен веб-сайт или другое приложение. Разработчики используют SSH для работы на этом общем компьютере.

Для отслеживания изменений, производимых разработчиками на общем компьютере, используется одна или несколько bzr-веток.

Проблема

При такой совместной работе остро стоит вопрос адекватной идентификации разработчиков, которые фиксировали свои изменения. По умолчанию bzr использует автоматический идентификатор, состоящий из имени учетной записи и имени компьютера, например: root@server. А поскольку под одной учетной записью могут работать несколько человек, то нельзя установить глобальный идентификатор через команду bzr whoami.

Способы идентификации

Базар позволяет идентифицировать автора ревизии несколькими способами: глобальная идентификация, идентификация на уровне ветки, или через использование переменных окружения.

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

Остается вариант с использованием переменных окружения. Базар использует значение переменной окружения BZR_EMAIL или EMAIL в качестве идентификатора пользователя. Если одна из этих переменных определена, то она имеет приоритет как над глобальным идентификатором, так и над идентификацией на уровне ветки.

Вариант с использованием переменных окружения тоже имеет свой недостаток: в начале каждой новой SSH-сессии разработчик должен установить переменную окружения BZR_EMAIL. О необходимости установки этой переменной легко забыть. К счастью имеется возможность автоматизировать этот скучный процесс при использовании аутентификации пользователей при помощи SSH-ключей.

Использование файла authorized_keys

При аутентификации при помощи SSH-ключей используется файл ~/.ssh/authorized_keys (или ~/.ssh/authorized_keys2). В этом файле сохраняется список публичных SSH-ключей, которым разрешена аутентификация. Однако кроме самих ключей, дополнительно могут быть указаны различные параметры соединения, либо ограничения доступа, либо директивы запуска некоторой программы при аутентификации конкретным ключом. Либо директива установки переменной окружения при аутентификации конкретным ключем. Именно эта директива нам и нужна.

Директива установки переменной окружения при логине указывается в виде:
environment="ИМЯ=значение"
Подробнее о формате и параметрах в файле authorized_keys читайте в man sshd.

Таким образом для настройки автоматической идентификации пользователей необходимо применить вход на общий компьютер через SSH-ключи, и для каждого пользователя (перед его публичным ключем) указать свою директиву environment, например:

--------------------Файл: authorized_keys-------------------------------------
environment="BZR_EMAIL=Vasya Pupkin <pupkin@mail.ru>" ssh-dss AAAAB3NzaC1kc3MAAACAcdSwa...
------------------------------------------------------------------------------

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

понедельник, 30 марта 2009 г.

Использование WebDAV для доступа к Bazaar-серверу

При совместной работе группы разработчиков над проектом с использованием Bazaar практически всегда необходимо организовывать некоторое центральное хранилище (центральный сервер) для рабочих веток. Имеется несколько вариантов организации такого сервера, поскольку сам Bazaar поддерживает несколько транспортных протоколов для удаленной работы. Кратко рассмотрим имеющиеся варианты.

Варианты доступа к удаленному серверу

  • bzr:// — "умный" (smart) протокол Bazaar. Это наиболее функциональный и производительный протокол удаленного доступа, использующий встроенный в Bazaar сервер. К сожалению, на данный момент, не имеет возможности аутентифицировать пользователей и управлять доступом. По этим причинам не рекомендуется использовать его самостоятельно, а только в связке с SSH или HTTP/HTTPS:
    • bzr+ssh:// — использует bzr:// протокол через SSH-туннель. Совмещает функциональность и производительность протокола bzr:// с безопасностью протокола SSH. Наиболее часто используемый в среде Unix/Linux и наиболее часто рекомендуемый протокол удаленного доступа.
    • bzr+http:// — использует bzr:// протокол совместно с web-сервером Apache и модулем FastCGI или mod_python. Для авторизации пользователей используются механизмы, встроенные в Apache.
  • sftp:// — для доступа используется протокол SFTP, поддерживаемый большинством SSH серверов. Может быть хорошей альтернативой bzr+ssh://, например, в случае отсутствия на сервере Bazaar.
  • ftp://, aftp:// — доступ с использованием пассивного (и соотв. активного) режимов FTP. Позволяет давать доступ на запись, но имеет проблемы с безопасностью.
  • http://, https:// — доступ только для чтения с использованием протоколов HTTP и HTTPS. Хороший вариант если нужен только доступ на чтение.
Из всех рассмотренных выше протоколов только bzr:// (bzr+ssh:// bzr+http://) поддерживают работу с подключаемыми модулями или плагинами (plugins) Bazaar на сервере, т.к. используют встроенный в Bazaar сервер. Остальные же протоколы только предоставляют доступ локальному клиенту Bazaar к данным на удаленном сервере.

Зачем нужен доступ по протоколу WebDAV?

Достаточно часто встречается ситуация, когда для обеспечения политики безопасности, или по другим причинам, нет возможности использовать ни один из перечисленных выше протоколов. Такая ситуация может возникать в случае если нужен удаленный доступ на запись, но нельзя использовать SSH/SFTP, потому что необходимо создавать системные учетные записи. При этом FTP тоже отпадает, поскольку он считается недостаточно безопасным.
Именно для таких случаев был создан плагин для bzr, который позволяет организовать удаленный доступ по протоколу WebDAV.
WebDAV — это набор расширений для протокола HTTP, позволяющий пользователям совместное редактирование и управление файлами на удаленных WEB-серверах. Таким образом, он, как и HTTP/HTTPS, обеспечивает для Bazaar доступ к данным на удаленном сервере, но предоставляет при этом также и возможность их изменения. Одно из основных преимуществ использования WebDAV — это возможность использования стандартных средств HTTP-сервера для управления аутентификацией и доступом пользователей.
Для работы через WebDAV нам понадобится установить плагин на стороне клиента (на локальной машине) и настроить HTTP сервер (в нашем примере Apache) для работы с WebDAV.

Установка плагина WebDAV

Плагин WebDAV для Bazaar можно найти на сайте Launchpad: https://launchpad.net/bzr.webdav. Для получения плагина сделаем копию ветки с Launchpad и затем установим плагин.

Установка только для текущего пользователя

Наиболее просто установить плагин для текущего пользователя. На Unix/Linux системах плагины устанавливаются в каталог ~/.bazaar/plugins/ (на Windows используется каталог C:\Documents and Settings\USERNAME\Application Data\2.0\bazaar\plugins). Перейдите в каталог plugins и выполните команду branch:
$ cd ~/.bazaar/plugins/ $ bzr branch lp:bzr.webdav webdav Плагин будет установлен в подкаталог webdav.

Установка для всех пользователей

В данном случае модуль устанавливается в системной директории для поиска модулей bzrlib/plugins (на Unix системах это может быть /usr/lib/python2.5/site-packages/bzrlib/plugins/).
$ bzr branch lp:bzr.webdav $ cd bzr.webdav/ $ sudo python setup.py install

Проверка наличия плагина WebDAV

Для проверки наличия плагина необходимо использовать команду plugins. Эта команда выведет список всех установленных плагинов, их версий, и краткое описание каждого плагина. В этом списке должен присутствовать плагин webdav:
$ bzr plugins
...
webdav 1.12
  An http transport, using webdav to allow pushing.
...

Настройка сервера Apache

Теперь рассмотрим настройки HTTP сервера Apache. Прежде всего для Apache должен быть установлен модуль mod_dav. Конфигурация для этого модуля будет выглядеть приблизительно следующим образом:
<IfModule mod_dav.c>

  Alias /bzr /var/www/bzr

  <Directory /var/www/bzr>
    Dav On
    DirectorySlash Off
    DavDepthInfinity On

    AuthType Basic
    AuthName "Bazaar server"
    AuthUserFile /etc/apache2/dav.users
    Require valid-user
  </Directory>
</IfModule>
Рассмотрим настройки подробнее:
  • директива Alias устанавливает связь между путем в URL (/bzr) и каталогом /var/www/bzr, где будут хранится ветки;
  • опция Dav On включает WebDAV для /var/www/bzr;
  • опция DirectorySlash Off выключает перенаправление в случае если в конце URL для каталогов не указан '/'. (Такие перенаправления не очень хорошо работают с Bazaar);
  • опция DavDepthInfinity On включает обработку PROPFIND запросов с заголовком Depth: Infinity;
  • оставшиеся опции настраивают простую HTTP авторизацию;

Работа с сервером

После перезагрузки Apache вы сможете работать с удаленными ветками с помощью протокола http+webdav:// следующим образом: $ bzr branch http+webdav://user@a.site/bzr/branch Кроме использования HTTP можно настроить работу WebDAV и по протоколу HTTPS.

Сохранение пароля

Если вы используете на сервере авторизацию и не хотите каждый раз набирать пароль, то можно воспользоваться клиентским файлом конфигурации authentication.conf. Этот файл должен находится в каталоге с файлами конфигурации Bazaar (по умолчанию на Unix - ~/.bazaar). В файле для WebDAV должна быть следующая информация:
[myprojects] scheme = http host = host.com user = ivan password = secret Обратите внимание, что значение параметра scheme должно быть http для http+webdav:// и https для https+webdav://.
Один из минусов использования файла authentication.conf в том, что (на данный момент) пароли хранятся в виде простого текста.

Резюме

Подытоживая, можно сказать, что WebDAV может быть хорошей альтернативой для bzr+ssh://, в случае если вы не хотите создавать системные учетные записи для каждого пользователя и в то же время предоставлять более безопасный доступ (при использовании HTTPS) чем ftp://.

вторник, 24 февраля 2009 г.

Настройки bzr: whoami или как меня зовут

После установки bzr сразу можно приступать к работе, однако стоит потратить пару минут на настройку некоторых важных параметров. Одним из таких параметров является ваша личная идентификация. Другими словами — ваше имя, ваш идентификатор для bzr. Это имя будет использоваться bzr для подписывания изменений, которые вы будете фиксировать. И поскольку история ваших фиксаций будет оставаться неизменной все время, то стоит позаботиться о том, чтобы ваше имя отображалось правильно. Чтобы узнать ваш текущий идентификатор используйте команду:
bzr whoami
Запущенная без параметров эта команда для типичного Василия Пупкина, работающего на своем домашнем компьютере, выведет нечто похожее на:
vasya@home
Если подобный идентификатор вас устраивает, то можете ничего не менять. Иначе задайте свое настоящее имя при помощи этой же команды whoami, но с соответствующим аргументом:
bzr whoami "Василий Пупкин <vasya.pupkin@gmail.com>"
Здесь в кавычкаx задается имя и дополнительно может задаваться электронный почтовый адрес (в угловых скобках). Проверим установки:
$ bzr whoami Василий Пупкин <vasya.pupkin@gmail.com>
Настройка вашего идентификатора сохраняется в файле глобальных настроек bazaar.conf (в вашем домашнем каталоге). Этот идентификатор будет использоваться для фиксации всех веток. О том, как задать отличающийся идентификатор для некоторых веток будет рассказано в следующих статьях.