Рекурсивне оновлення mercurial репозитаріїв за допомогою pysh (iPython)

iPython дуже зручний замінник вбудованого інтерпритатора python.exe та командного cmd.exe(в режимі командного інтерпритатора pysh). Проте його розповсюдженню заважає також відсутність прикладів використання. Мені цікаво було автоматизувати за його допомогою невелике реальне завдання.

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

Всі проекти які я відстежую в мене зберігаються наступним чином:
some_drive\repository\svn\proj1
proj2
proj3
\hg\hg_proj1
hg_proj2
hg_proj3
Для рекурсивного оновлення проектів в підпапках я написав такий скрипт:

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

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

<4> 'd:\\old\\repository\\mercurial\\lodgeit-main'
pulling from http://dev.pocoo.org/hg/lodgeit-main
searching for changes
adding changesets
adding manifests
adding file changes
added 42 changesets with 291 changes to 128 files
(run 'hg update' to get a working copy)
105 files updated, 0 files merged, 37 files removed, 0 files unresolved
<4> 'd:\\old\\repository\\mercurial\\neutron-plugins'
pulling from http://hg.dottedmag.net/neutron-plugins/
searching for changes
no changes found
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
<4> 'd:\\old\\repository\\mercurial\\pygments-main'
pulling from http://dev.pocoo.org/hg/pygments-main
searching for changes
adding changesets
adding manifests
adding file changes
added 125 changesets with 215 changes to 68 files
(run 'hg update' to get a working copy)
67 files updated, 0 files merged, 0 files removed, 0 files unresolved
Проте, закінчивши роботу інтерпритатора ми виявимо, що макроси не зберігаються між сесіями. Тому для цього викличемо %store hgrecupdate макрос буде збережено в постійній пам'яті і його можна буде викликати в наступних сесіях.

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