Не совсем в тему блога, но все же, надеюсь, что кому-то предоставленный ниже скрипт и принцип работы будут полезными.
Итак, работая с любым Django проектом я использую целую тучу разнообразнейших reusable apps
. Установка и добавления любого reusable app
'а в свой Django-проект проста и не тривиальна: клонирование репозитория, обновление sys.path
, добавление appname
в INSTALLED_APPS
.
Намного интересней становится, когда приходит время пробежаться по всем склонированным локально репозиториям и проверить наличие обновление в них (сейчас и далее актуально только для тех, кто на передовой). Согласитесь, имея в наличии под 100 svn репозиториев c googlecode, да 20-30 git репозиториев с github'а, а также по паре тройке разнообразных bzr с hg репозиториев, их обновление посредством ручного набора поочередно:
$ svn up /path/to/django $ cd /path/to/werkezeug && hg fetch $ cd /path/to/django-debug-toolbar && git pull
будет очень и очень надоедливо. И именно по-этому, я быстро на коленке написал простой скрипт для обновления всех склонированных репозиториев в текущем или указанном каталоге. Код скрипта, ниже. Сразу предупреждаю, за именование переменных, а также использование os.system, не ругать, так как в час ночи не до жиру ;)
#!/usr/bin/env python import os, sys def run(): if len(sys.argv) == 2: dirname = os.path.expanduser(sys.argv[1]) else: dirname = os.getcwd() if not os.path.isdir(dirname): sys.stderr.write('Directory "%s" was not exists or you ' % dirname + \ 'have not permissions to read from it.\n') sys.exit(1) dirdata = os.listdir(dirname) not_scms = [] scms = ( ('bzr', []), ('git', []), ('git-svn', []), ('hg', []), ('svn', []), ) dirs_len = len(dirdata) scms_len = 0 for name in dirdata: subdirname = os.path.join(dirname, name) if not os.path.isdir(subdirname): continue scms_len += 1 subdirdata = os.listdir(subdirname) if '.bzr' in subdirdata: scms[0][1].append(subdirname) elif '.git' in subdirdata: f = open(os.path.join(subdirname, '.git/config'), 'r') if not 'svn-remote' in f.read(): scms[1][1].append(subdirname) else: scms[2][1].append(subdirname) f.close() elif '.hg' in subdirdata: scms[3][1].append(subdirname) elif '.svn' in subdirdata: scms[4][1].append(subdirname) else: scms_len -= 1 not_scms.append(subdirname) print 'Work directory:', dirname print 'Number of found subdirs:', dirs_len print 'Number of found SCM dirs:', scms_len if dirs_len != scms_len: print 'Not SCM dirs:', not_scms print if not scms_len: sys.exit(0) for protocol, dirs in scms: if protocol == 'bzr': cmd = "cd '%s' && bzr pull" elif protocol == 'git': cmd = "cd '%s' && git pull" elif protocol == 'git-svn': cmd = "cd '%s' && git svn fetch" elif protocol == 'hg': cmd = "cd '%s' && hg fetch" elif protocol == 'svn': cmd = "svn update '%s'" dirs.sort() for d in dirs: print '$', cmd % d os.system(cmd % d) print if __name__ == '__main__': run()
Теперь вы можете сохранить этот код в любой файл (я, например, использую название scm-up-all.py
) и поместить этот файл в PATH
. Таким образом обновление всех репозиториев в /srv/shared
стало плевым делом ;)
UPD: На днях появилось желание чуточку проапдейтить скрипт, потому я решил завести для него проект на GitHub. В ToDo: поддержка CVS, Darcs; вывод информации о последнем коммите (последней ревизии) в репозитории; простой GUI (PyQt4) для управления обновлением.
2 комментариев:
Славно, только founded=основан, а found=найден ;)
@neithere
ваша правда :( на это вообще внимания не обратил, писал на автомате...
Отправить комментарий