Наваял прототип для синхронизации файлов по разным директориям, включая удаленные ssh и на внешних носителях.
Зафига?
Синхронизировать автоматически произвольное количество папок в произвольных местах (локальные папки, на сервере, на флешке)
требования: git, python
Бага:
Самая главная обнаруженная бага, заключается в том, что если вытащить флешку с синхронизируемой папкой в момент синхронизации, то репозиторий ломается (ORIG_HEAD.lock), пока не придумал как решить.
Чем интереснее дропбокса?
СИнхронизация со своим сервером, возможность локально плодить папки и синхронизироваться с переносными носителями. Неограниченное место и спокойствие для параноиков :)
sync.py (сам скрипт синхронизации, крутится в фоне):
#coding: utf-8-*-
import time
import sys
from sync_inc import *
#Настройки репозиториев (синхронизируемых папок)
reps = list()
#обычные папки
reps.append('/home/max/test/sync3')
reps.append('/home/max/test/sync1')
reps.append('/home/max/test/sync2')
reps.append('/home/max/test/sync5')
#ssh репозиторий должен быть --bare (создается командой git init --bare)
reps.append('ssh://localhost/home/max/test/sync.git')
#реп с флешки, имеет багу
reps.append('/media/NIKON D90/sync4')
while True:
try:
for rep in reps:
getFixMethod(rep)
for dest in reps:
for src in reps:
if src != dest:
getUpdateMethod(dest, src)
time.sleep(3)
except KeyboardInterrupt:
print ' by :('
exit()
sync_inc.py (функции для скрипта синхронизации)
#coding: utf-8-*-
import os
#Ничего не делаем, так как удаленный репозиторий не надо коммитить
def fixStateSSH(folder):
pass
#Пушим в удаленный реп
def updateRepSSH(dest, source):
try:
os.chdir(source)
status = os.system('git push "' + dest + '" master')
if 0 != status and 256 != status:
print ('Error (SSH). conflict detected! Fix it in: ' + source)
exit()
except OSError:
print 'SSH error'
#Коммитим локальные папки
def fixState(folder):
try:
os.chdir(folder)
os.system('git add .')
os.system('git commit -am "-"')
except OSError:
print 'No folder' + folder
#Пуллим локальный реп
def updateRep(dest, source):
try:
os.chdir(dest)
status = os.system('git pull "' + source + '" master')
if 0 != status and 256 != status:
print (str(status) + 'Error. conflict detected! Fix it in: ' + dest + ' ' + source)
exit()
except OSError:
print 'No folder ' + dest
#Проверяем что за реп, локальный или не очень
def isSSH(rep):
return rep.startswith('ssh://')
#Наверно, это и есть так называемый фабричный метод
def getFixMethod(rep):
if isSSH(rep):
fixStateSSH(rep)
else:
fixState(rep)
#Этот метод, наверно, тоже фабричный
def getUpdateMethod(dest, source):
if isSSH(dest):
updateRepSSH(dest, source)
elif False == isSSH(source):
updateRep(dest, source)