вівторок, липня 22, 2008

mercurial - нова для мене та поки слабо досліджена система, проте вже є
достатьньо проектів які ведуться в цій CVS і за розвитком яких я стежу.

Якщо для subversion є настільний клієнт Tortoise SVN , який покриває
мої потреби на 100%, то для mercurial прийнятного GUI-клієнта поки
немає. Аналог Tortoise SVN, Tortoise Hg має один неприємний дефект, він
конфліктує з встановленим Wing IDE, тому я від Tortoise Hg відмовився.
Незручність для мене консольного клієнта в тому що мені треба зайти в
кожну папку проекту і там маю виконати команду hg update. Цю задачу
було автоматизовано невеликим скриптом для iPython(інтерактивна консоль длоя Python). Зауважу що я використовую iPython
в режиму роботи командної оболонки , для цього він запускається з
опціями ipython -p sh . Всі дії проводилися на Windows XP проте повинно
працювати без змін і на будь-якому xUnix/Linux де можна встановити
Python та mercurial.



Всі проекти які я відстежую в мене зберігаються наступним чином:

some_drive\repository\svn\proj1
proj2
proj3
\hg\hg_proj1
hg_proj2
hg_proj3

Для рекурсивного оновлення проектів в підпапках я написав такий скрипт:

dirs = %mglob dir:*
for d in dirs:
cd $d
pwd
!hg pull
!hg update
up()

Розберемо по черзі що відбувається:

  1. dirs = %mglob dir:* в змінну dirs поміщається результат роботи вбудованої магічної команди (тут режим автопідстановки не здатен правильно розібратися, тому '%' писати обов'язково). mglob повертає список які підходять під заданий фільтр, а саме всі підпапки в поточній папці.
  2. for d in dirs: - цикл для перебору списку папок, змінній d під час кожної ітерації присвоюватиметься наступний елемент списку dirs
  3. cd $d - команда зміни поточної папки на папку вказану в змінній d. Зверніть увагу на знак '$', він дає вказівку інтерпритатору передати командному інтерпритатору вже результат виконаної команди чи змінну, в даному випадку назви підпапок.
  4. pwd - ще одна вбудована магічна команда, повертає поточну папку в
    якій ми знаходимся.
  5. !hg pull - для отримання змін з головного репозитарію(отримання змінн ззовні), зауважте на знак '!' він означає що викликається зовнішня команда.
  6. !hg update - оновлення локальної копії, тобто злиття змін отриманих на попередньому кроці з вашою копією.
  7. up() - функція еквівалентна cd .. - повернення на рівень вище, в даному випадку дужки () обов'язкові.

В результаті роботи скрипт зайде в кожну підпапку першого підрівня відносно поточної папки, виведе поточну папку, виконає там команду !hg update та повернеться на рівень вверх.

Збережемо як макрос цей код, для наступних використань, для цього виконаємо наступну команду: %macro hgrecupdate 150-151 , де hgrecupdate назва макроса, 150-151 - номери рядків в яких введено код макроса.

Щоб протестувати його роботу виконаємо наступні команди.


cd E:\repository\hg\ - команда зміни поточної директорії (треба зауважити, що системну команду !cd використовувати не рекомендовано, тому тут в реальності викликаєтьсся вбудована магічна команда(magic command) %cd, але оскільки по замовчуванню ввімкнуто режим автопідстановки, то знак '%' писати необов'язково).
hgrecupdate - власне виклик макроса рекурсивного оновлення.

Зразок виконання макроса зображено нижче:

--------------------> hgrecupdate()
<12> 'e:\\repository\\hg\\byteflow'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\colubrid-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\jinja-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\lodgeit-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\pocoo-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\pygments-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\pylons'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\QuickWiki'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\textpress-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<12> 'e:\\repository\\hg\\werkzeug-main'
0 files updated, 0 files merged, 0 files removed, 0 files unresolved


Проте, закінчивши роботу інтерпритатора ми виявимо, що макроси не зберігаються між сесіями. Тому для цього викличемо%store hgrecupdate
макрос буде збережено в постійній пам'яті і його можна буде викликати в наступних сесіях.

Розв'язуючи реальну задачу я показав тільки деякі прості методики роботи з інтерактивним інтерпритатором iPython в режимі командної оболонки. Проте для складніших задач вам прийдеться зануритися в документацію.

Немає коментарів: