]> code.delx.au - offlineimap/blobdiff - head/offlineimap.py
Step 1 of converting tree to Arch layout
[offlineimap] / head / offlineimap.py
index 79f970e54c271feeea8dd82cbdc6b84e95dee9f6..294e586808cb9e35e4c8c6e847cdff38dc10a99c 100644 (file)
@@ -1,6 +1,6 @@
-#!/usr/bin/python2.2
-
-# Copyright (C) 2002 John Goerzen
+#!/usr/bin/env python2.3
+# Startup from single-user installation
+# Copyright (C) 2002, 2003, 2004 John Goerzen
 # <jgoerzen@complete.org>
 #
 #    This program is free software; you can redistribute it and/or modify
 #    along with this program; if not, write to the Free Software
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from offlineimap import imaplib, imaputil, imapserver, repository, folder, mbnames, threadutil
-from offlineimap.threadutil import InstanceLimitedThread
-import re, os, os.path, offlineimap, sys
-from ConfigParser import ConfigParser
-from threading import *
-
-# imaplib.Debug = 5
-
-ui = offlineimap.ui.TTY.TTYUI()
-ui.init_banner()
-
-config = ConfigParser()
-configfilename = os.path.expanduser("~/.offlineimaprc")
-if not os.path.exists(configfilename):
-    sys.stderr.write(" *** Config file %s does not exist; aborting!\n" % configfilename)
-    sys.exit(1)
-    
-config.read(configfilename)
-
-metadatadir = os.path.expanduser(config.get("general", "metadata"))
-if not os.path.exists(metadatadir):
-    os.mkdir(metadatadir, 0700)
-
-accounts = config.get("general", "accounts")
-accounts = accounts.replace(" ", "")
-accounts = accounts.split(",")
-
-server = None
-remoterepos = None
-localrepos = None
-passwords = {}
-
-threadutil.initInstanceLimit("ACCOUNTLIMIT", config.getint("general",
-                                                           "maxsyncaccounts"))
-
-# We have to gather passwords here -- don't want to have two threads
-# asking for passwords simultaneously.
-
-for account in accounts:
-    if config.has_option(account, "remotepass"):
-        passwords[account] = config.get(account, "remotepass")
-    else:
-        passwords[account] = ui.getpass(account, config)
-    for instancename in ["FOLDER_" + account, "MSGCOPY_" + account]:
-        threadutil.initInstanceLimit(instancename,
-                                     config.getint(account, "maxconnections"))
-
-mailboxes = []
-mailboxlock = Lock()
-def addmailbox(accountname, remotefolder):
-    mailboxlock.acquire()
-    mailboxes.append({'accountname' : accountname,
-                      'foldername': remotefolder.getvisiblename()})
-    mailboxlock.release()    
-    
-def syncaccount(accountname, *args):
-    print args
-    # We don't need an account lock because syncitall() goes through
-    # each account once, then waits for all to finish.
-    try:
-        ui.acct(accountname)
-        accountmetadata = os.path.join(metadatadir, accountname)
-        if not os.path.exists(accountmetadata):
-            os.mkdir(accountmetadata, 0700)
-        host = config.get(accountname, "remotehost")
-        user = config.get(accountname, "remoteuser")
-        port = None
-        if config.has_option(accountname, "remoteport"):
-            port = config.getint(accountname, "remoteport")
-        ssl = config.getboolean(accountname, "ssl")
-
-        # Connect to the remote server.
-        server = imapserver.IMAPServer(user, passwords[accountname],
-                                       host, port, ssl,
-                                       config.getint(accountname, "maxconnections"))
-        remoterepos = repository.IMAP.IMAPRepository(config, accountname, server)
-
-        # Connect to the Maildirs.
-        localrepos = repository.Maildir.MaildirRepository(os.path.expanduser(config.get(accountname, "localfolders")))
-
-        # Connect to the local cache.
-        statusrepos = repository.LocalStatus.LocalStatusRepository(accountmetadata)
-
-        ui.syncfolders(remoterepos, localrepos)
-        remoterepos.syncfoldersto(localrepos)
-
-        folderthreads = []
-        for remotefolder in remoterepos.getfolders():
-            server.connectionwait()
-            thread = InstanceLimitedThread(\
-                instancename = 'FOLDER_' + accountname,
-                target = syncfolder,
-                name = "syncfolder-%s-%s" % \
-                (accountname, remotefolder.getvisiblename()),
-                args = (accountname, remoterepos, remotefolder, localrepos,
-                        statusrepos))
-            thread.start()
-            folderthreads.append(thread)
-        threadutil.threadsreset(folderthreads)
-        server.close()
-    finally:
-        pass
-
-def syncfolder(accountname, remoterepos, remotefolder, localrepos,
-               statusrepos):
-    mailboxes.append({'accountname': accountname,
-                      'foldername': remotefolder.getvisiblename()})
-    # Load local folder.
-    localfolder = localrepos.getfolder(remotefolder.getvisiblename())
-    if not localfolder.isuidvalidityok(remotefolder):
-        ui.validityproblem(remotefolder)
-        return
-    ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder)
-    ui.loadmessagelist(localrepos, localfolder)
-    localfolder.cachemessagelist()
-    ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys()))
-
-    # Load remote folder.
-    ui.loadmessagelist(remoterepos, remotefolder)
-    remotefolder.cachemessagelist()
-    ui.messagelistloaded(remoterepos, remotefolder,
-                         len(remotefolder.getmessagelist().keys()))
-
-    # Load status folder.
-    statusfolder = statusrepos.getfolder(remotefolder.getvisiblename())
-    statusfolder.cachemessagelist()
-
-    #
-
-    if not statusfolder.isnewfolder():
-        # Delete local copies of remote messages.  This way,
-        # if a message's flag is modified locally but it has been
-        # deleted remotely, we'll delete it locally.  Otherwise, we
-        # try to modify a deleted message's flags!  This step
-        # need only be taken if a statusfolder is present; otherwise,
-        # there is no action taken *to* the remote repository.
-
-        remotefolder.syncmessagesto_delete(localfolder, [localfolder,
-                                                         statusfolder])
-        ui.syncingmessages(localrepos, localfolder, remoterepos, remotefolder)
-        localfolder.syncmessagesto(statusfolder, [remotefolder, statusfolder])
-
-    # Synchronize remote changes.
-    ui.syncingmessages(remoterepos, remotefolder, localrepos, localfolder)
-    remotefolder.syncmessagesto(localfolder)
-
-    # Make sure the status folder is up-to-date.
-    ui.syncingmessages(localrepos, localfolder, statusrepos, statusfolder)
-    localfolder.syncmessagesto(statusfolder)
-    statusfolder.save()
-    
-
-def syncitall():
-    mailboxes = []                      # Reset.
-    threads = []
-    for accountname in accounts:        
-        thread = InstanceLimitedThread(instancename = 'ACCOUNTLIMIT',
-                                       target = syncaccount,
-                                       name = "syncaccount-%s" % accountname,
-                                       args = (accountname,))
-        thread.start()
-        threads.append(thread)
-    # Wait for the threads to finish.
-    threadutil.threadsreset(threads)
-
-    mbnames.genmbnames(config, mailboxes)
-
-syncitall()
-if config.has_option('general', 'autorefresh'):
-    refreshperiod = config.getint('general', 'autorefresh') * 60
-    while 1:
-        if ui.sleep(refreshperiod) == 2:
-            break
-        else:
-            syncitall()
-        
+from offlineimap import init
+init.startup('4.0.7')