hg site extension
 
(Arne Babenhauserheide)
2011-10-21: more ftp caching.

more ftp caching.

diff --git a/site.py b/site.py
--- a/site.py
+++ b/site.py
@@ -351,8 +351,8 @@ def upload(ui, repo, target, ftpstring, 
     #ftp.dir()
     #return
     ftpfeatures = ftp.sendcmd("FEAT")
-
-    _ftpdircache = set()
+    featuremtime = " MDTM" in ftpfeatures.splitlines()
+    _ftplistcache = set()
 
     for d, dirnames, filenames in os.walk(target):
         for filename in filenames:
@@ -363,46 +363,54 @@ def upload(ui, repo, target, ftpstring, 
 #            print serverdirparts, serverfile
             with open(localfile, "rb") as f:
                 sd = serverdirparts[0]
-                if sd and not sd in _ftpdircache and not sd in ftp.nlst():
+                if sd and not sd in _ftplistcache: # should happen only once per superdir
+                    _ftplistcache.update(set(ftp.nlst()))
+                if sd and not sd in _ftplistcache:
                     try:
                         ui.status(_("creating directory "), sd, "\n")
                         ftp.mkd(sd)
-                        _ftpdircache.add(sd)
+                        _ftplistcache.add(sd)
                     except ftplib.error_perm, resp:
                         ui.warn(_("could not create directory "), sd, ": " , resp, "\n")
-                    else: _ftpdircache.add(sd)
+                    else: _ftplistcache.add(sd)
 
                 for sdp in serverdirparts[1:]:
                     sdold = sd
                     sd = join(sd, sdp)
                     #print sd, sdp
                     #print ftp.nlst(sdold)
-                    if sd and not sd in _ftpdircache and not sd in ftp.nlst(sdold):
+                    if sd and not sd in _ftplistcache: # should happen only once per superdir
+                        _ftplistcache.update(set(ftp.nlst(sdold)))
+                    if sd and not sd in _ftplistcache:
                         try:
                             ui.status(_("creating directory "), sd, "\n")
                             ftp.mkd(sd)
-                            _ftpdircache.add(sd)
+                            _ftplistcache.add(sd)
                         except ftplib.error_perm, resp:
-                            ui.warn(_("could not create directory "), sd, ": " , resp, "\n")
-                    else: _ftpdircache.add(sd)
+                            ui.warn(_("could not create directory "),
+                                    sd, ": " , resp, "\n")
 
-
-                if not serverfile in ftp.nlst(serverdir) or force:
+                if not serverfile in _ftplistcache: # should happen only once per dir.
+                    _ftplistcache.update(set(ftp.nlst(serverdir)))
+                if not serverfile in _ftplistcache or force:
                     if force:
-                        ui.status(_("uploading "), serverfile, _(" because I am forced to.\n"))
+                        ui.status(_("uploading "), serverfile,
+                                  _(" because I am forced to.\n"))
                     else:
-                        ui.status(_("uploading "), serverfile, _(" because it is not yet online.\n"))
+                        ui.status(_("uploading "), serverfile,
+                                  _(" because it is not yet online.\n"))
 
                     ftp.storbinary("STOR "+ serverfile, f)
                 else:
                     # reupload the file if the file on the server is older than the local file.
-                    if " MDTM" in ftpfeatures.splitlines():
+                    if featuremtime:
                         ftpmtime = ftp.sendcmd("MDTM " + serverfile).split()[1]
                         localmtime = os.stat(localfile).st_mtime
                         localmtimestr = datetime.datetime.utcfromtimestamp(localmtime).strftime("%Y%m%d%H%M%S")
                         newer = int(localmtimestr) > int(ftpmtime)
                         if newer:
-                            ui.status(_("uploading "), serverfile, _(" because it is newer than the file on the FTP server.\n"))
+                            ui.status(_("uploading "), serverfile,
+                                      _(" because it is newer than the file on the FTP server.\n"))
                             ftp.storbinary("STOR "+ serverfile, f)
 
 
@@ -412,11 +420,11 @@ def staticsite(ui, repo, target=None, **
     if repo.root == target:
         ui.warn(_("static target repo can’t be the current repo"))
         return
+    # add the hg repo to the static site
+    addrepo(ui, repo, target)
     # first: just create the site.
     if not target: target = "static"
     parsesite(ui, repo, target, **opts)
-    # add the hg repo to the static site
-    addrepo(ui, repo, target)
     if opts["upload"]:
         # upload the repo
         upload(ui, repo, target, opts["upload"], opts["force"])