В этом посте хочу поделиться с вами простым, но весьма полезным скриптом на питоне, который я написал для сравнения директорий тестового и рабочего проектов Django.
На работе для решения внутренних задач я использую Django. Как результат — написан софт, с которым через браузер работает большая часть сотрудников — тех. поддержка, операторы, техническая служба нашей компании (сфера деятельности — телеком).
Довольно часто необходимо вносить изменения, но делать это сразу в рабочем проекте нельзя, т.к. простои вследствие возможных ошибок очень нежелательны. Поэтому была создана копия проекта, в который сначала и вносятся все изменения, а после тестирования измененные файлы копируются в рабочий проект.
Проблема состоит в том, что трудно вспомнить, какие файлы были изменены или добавлены, а записывать каждый раз в блокнот, как я раньше делал, неэффективно.
Было решено написать скрипт, который сравнивает директории тестового и рабочего проектов и выводит на экран консоли список измененных или добавленных файлов. Например, у нас тестовая директория называется myproject, а рабочий проект находится в директории intranet. Запускаем наш скрипт и видим на экране:
Измененные файлы — [*], новые (которых нет в рабочем проекте) — [-]. Очень удобно :)
Как видно из кода, основную работу делает метод os.walk, а для проверки на существование и сравнения файлов используются соответственно os.path.exists и filecmp.cmp.
Вот и все, надеюсь, кому-нибудь пригодится :)
UPD: Прежде чем написать очередной комментарий о системах контроля версий, обратите, пожалуйста, внимание на название блога :) Тем не менее, спасибо всем тем, кто уже затронул эту тему, думаю, для полноты картины будет полезно.
Проблема
На работе для решения внутренних задач я использую Django. Как результат — написан софт, с которым через браузер работает большая часть сотрудников — тех. поддержка, операторы, техническая служба нашей компании (сфера деятельности — телеком).
Довольно часто необходимо вносить изменения, но делать это сразу в рабочем проекте нельзя, т.к. простои вследствие возможных ошибок очень нежелательны. Поэтому была создана копия проекта, в который сначала и вносятся все изменения, а после тестирования измененные файлы копируются в рабочий проект.
Проблема состоит в том, что трудно вспомнить, какие файлы были изменены или добавлены, а записывать каждый раз в блокнот, как я раньше делал, неэффективно.
Решение
Было решено написать скрипт, который сравнивает директории тестового и рабочего проектов и выводит на экран консоли список измененных или добавленных файлов. Например, у нас тестовая директория называется myproject, а рабочий проект находится в директории intranet. Запускаем наш скрипт и видим на экране:
/var/django_projects/myproject$ ./cmp.py
[*] /var/django_projects/myproject/templates/base.html
[-] /var/django_projects/myproject/templates/calls/call_add.html
[*] /var/django_projects/myproject/templates/calls/call_edit.html
[*] /var/django_projects/myproject/site_media/main.css
Измененные файлы — [*], новые (которых нет в рабочем проекте) — [-]. Очень удобно :)
Исходный код скрипта cmp.py
- #!/usr/bin/env python
- #------------------------------------------------------------
- # Compare directories 'myproject' and 'intranet' recursively
- #------------------------------------------------------------
-
- import os, filecmp
-
- # путь к тестовому проекту - с этой директории будем начинать обход
- dir_src = '/var/django_projects/myproject'
-
- # будем сравнивать только файлы и директории из этого списка
- check_list = (
- '/var/django_projects/myproject/apps/',
- '/var/django_projects/myproject/templates/',
- '/var/django_projects/myproject/scripts/',
- '/var/django_projects/myproject/site_media/main.css',
- )
-
- for root, dirs, files in os.walk(dir_src):
- for name in files:
- f_src = os.path.join(root, name)
- need_check = f_src.startswith(check_list)
- if need_check and not f_src.endswith('.pyc'):
- f_dst = f_src.replace("myproject", "intranet")
- if not os.path.exists(f_dst):
- print "[-] ", f_src
- elif not filecmp.cmp(f_src, f_dst):
- print "[*] ", f_src
Как видно из кода, основную работу делает метод os.walk, а для проверки на существование и сравнения файлов используются соответственно os.path.exists и filecmp.cmp.
Вот и все, надеюсь, кому-нибудь пригодится :)
UPD: Прежде чем написать очередной комментарий о системах контроля версий, обратите, пожалуйста, внимание на название блога :) Тем не менее, спасибо всем тем, кто уже затронул эту тему, думаю, для полноты картины будет полезно.