Communicate syncmode to synchooks
This patch sets the environment variable OFFLINEIMAPSYNCMODE to either full, quick or idle depending on the context of the pre- and postsynchook. Adding the context as an argument was considered but this would break existing configurations and it makes calling a program directly more cumbersome. Some programs (e.g. imapfilter) may not know what to do with this extra argument. Signed-off-by: Mart Lubbers <mart@martlubbers.net>
This commit is contained in:
parent
4ca9c75c6f
commit
7748de52fb
@ -320,6 +320,9 @@ remoterepository = RemoteExample
|
|||||||
#
|
#
|
||||||
# The pre sync script has to complete before a sync to the account will start.
|
# The pre sync script has to complete before a sync to the account will start.
|
||||||
#
|
#
|
||||||
|
# The environment variable OFFLINEIMAPSYNCMODE will be set to either full,
|
||||||
|
# quick or idle to communicate the syncmode to the external command.
|
||||||
|
#
|
||||||
#presynchook = imapfilter -c someotherconfig.lua
|
#presynchook = imapfilter -c someotherconfig.lua
|
||||||
#postsynchook = notifysync.sh
|
#postsynchook = notifysync.sh
|
||||||
|
|
||||||
|
@ -338,18 +338,6 @@ class SyncableAccount(Account):
|
|||||||
|
|
||||||
folderthreads = []
|
folderthreads = []
|
||||||
|
|
||||||
hook = self.getconf('presynchook', '')
|
|
||||||
self.callhook(hook)
|
|
||||||
|
|
||||||
if self.utf_8_support and self.remoterepos.getdecodefoldernames():
|
|
||||||
raise OfflineImapError("Configuration mismatch in account " +
|
|
||||||
"'%s'. " % self.getname() +
|
|
||||||
"\nAccount setting 'utf8foldernames' and repository " +
|
|
||||||
"setting 'decodefoldernames'\nmay not be used at the " +
|
|
||||||
"same time. This account has not been synchronized.\n" +
|
|
||||||
"Please check the configuration and documentation.",
|
|
||||||
OfflineImapError.ERROR.REPO)
|
|
||||||
|
|
||||||
quickconfig = self.getconfint('quick', 0)
|
quickconfig = self.getconfint('quick', 0)
|
||||||
if quickconfig < 0:
|
if quickconfig < 0:
|
||||||
quick = True
|
quick = True
|
||||||
@ -363,6 +351,19 @@ class SyncableAccount(Account):
|
|||||||
else:
|
else:
|
||||||
quick = False
|
quick = False
|
||||||
|
|
||||||
|
|
||||||
|
hook = self.getconf('presynchook', '')
|
||||||
|
self.callhook(hook, "quick" if quick else "full")
|
||||||
|
|
||||||
|
if self.utf_8_support and self.remoterepos.getdecodefoldernames():
|
||||||
|
raise OfflineImapError("Configuration mismatch in account " +
|
||||||
|
"'%s'. " % self.getname() +
|
||||||
|
"\nAccount setting 'utf8foldernames' and repository " +
|
||||||
|
"setting 'decodefoldernames'\nmay not be used at the " +
|
||||||
|
"same time. This account has not been synchronized.\n" +
|
||||||
|
"Please check the configuration and documentation.",
|
||||||
|
OfflineImapError.ERROR.REPO)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
startedThread = False
|
startedThread = False
|
||||||
remoterepos = self.remoterepos
|
remoterepos = self.remoterepos
|
||||||
@ -444,9 +445,9 @@ class SyncableAccount(Account):
|
|||||||
remoterepos.holdordropconnections()
|
remoterepos.holdordropconnections()
|
||||||
|
|
||||||
hook = self.getconf('postsynchook', '')
|
hook = self.getconf('postsynchook', '')
|
||||||
self.callhook(hook)
|
self.callhook(hook, "quick" if quick else "full")
|
||||||
|
|
||||||
def callhook(self, cmd):
|
def callhook(self, cmd, syncmode):
|
||||||
# Check for CTRL-C or SIGTERM and run postsynchook.
|
# Check for CTRL-C or SIGTERM and run postsynchook.
|
||||||
if Account.abort_NOW_signal.is_set():
|
if Account.abort_NOW_signal.is_set():
|
||||||
return
|
return
|
||||||
@ -456,9 +457,11 @@ class SyncableAccount(Account):
|
|||||||
self.ui.callhook("Calling hook: " + cmd)
|
self.ui.callhook("Calling hook: " + cmd)
|
||||||
if self.dryrun:
|
if self.dryrun:
|
||||||
return
|
return
|
||||||
|
environ = os.environ.copy()
|
||||||
|
environ['OFFLINEIMAPSYNCMODE'] = syncmode
|
||||||
p = Popen(cmd, shell=True,
|
p = Popen(cmd, shell=True,
|
||||||
stdin=PIPE, stdout=PIPE, stderr=PIPE,
|
stdin=PIPE, stdout=PIPE, stderr=PIPE,
|
||||||
close_fds=True)
|
close_fds=True, env=environ)
|
||||||
stdout, stderr = p.communicate()
|
stdout, stderr = p.communicate()
|
||||||
self.ui.callhook("Hook stdout: %s\nHook stderr:%s\n"
|
self.ui.callhook("Hook stdout: %s\nHook stderr:%s\n"
|
||||||
% (stdout.decode('utf-8'), stderr.decode('utf-8')))
|
% (stdout.decode('utf-8'), stderr.decode('utf-8')))
|
||||||
|
@ -832,10 +832,10 @@ class IdleThread:
|
|||||||
remotefolder = remoterepos.getfolder(self.folder, decode=False)
|
remotefolder = remoterepos.getfolder(self.folder, decode=False)
|
||||||
|
|
||||||
hook = account.getconf('presynchook', '')
|
hook = account.getconf('presynchook', '')
|
||||||
account.callhook(hook)
|
account.callhook(hook, "idle")
|
||||||
offlineimap.accounts.syncfolder(account, remotefolder, quick=False)
|
offlineimap.accounts.syncfolder(account, remotefolder, quick=False)
|
||||||
hook = account.getconf('postsynchook', '')
|
hook = account.getconf('postsynchook', '')
|
||||||
account.callhook(hook)
|
account.callhook(hook, "idle")
|
||||||
|
|
||||||
ui = getglobalui()
|
ui = getglobalui()
|
||||||
ui.unregisterthread(currentThread()) # syncfolder registered the thread
|
ui.unregisterthread(currentThread()) # syncfolder registered the thread
|
||||||
|
Loading…
Reference in New Issue
Block a user