hg site extension
 
(Arne Babenhauserheide)
2014-03-14: use ftp instead of ftps if the URL starts with ftp://.

use ftp instead of ftps if the URL starts with ftp://.

diff --git a/staticsite.py b/staticsite.py
--- a/staticsite.py
+++ b/staticsite.py
@@ -1428,8 +1428,12 @@ def addrepo(ui, repo, target, bookmarks,
 
 def upload(ui, repo, target, ftpstring, force):
     """upload the repo to the FTP server identified by the ftp string."""
+    # assume ftps if no prefix was given (security by default).
+    isftps = not ftpstring.startswith("ftp://")
     if ftpstring.startswith("ftp://"):
         ftpstring = ftpstring[len("ftp://"):]
+    if ftpstring.startswith("ftps://"):
+        ftpstring = ftpstring[len("ftps://"):]
     try:
         user, password = ftpstring.split("@")[0].split(":")
         serverandpath = "@".join(ftpstring.split("@")[1:])
@@ -1440,10 +1444,13 @@ def upload(ui, repo, target, ftpstring, 
     server = serverandpath.split("/")[0]
     ftppath = "/".join(serverandpath.split("/")[1:])
     timeout = 60
-    # TODO: Use FTP instead of FTPS, if the uri is ftp://
+    # Use FTP instead of FTPS, if the uri is ftp://
     try:
-        ftp = ftplib.FTP_TLS(server, user, password, "", timeout=timeout)
-        ftp.prot_p()
+        if isftps:
+            ftp = ftplib.FTP_TLS(server, user, password, "", timeout=timeout)
+            ftp.prot_p()
+        else:
+            ftp = ftplib.FTP(server, user, password, "", timeout=timeout)
     except socket.timeout:
         ui.warn(_("connection to "), server, _(" timed out after "), timeout, _(" seconds.\n"))
         return
@@ -1570,7 +1577,7 @@ cmdtable = {
 
 wrapcmds = { # cmd: generic, target, fixdoc, ppopts, opts
     'push': (False, None, False, False, [
-        ('', 'staticsite', None, 'show parent svn revision instead'),
+        ('', 'staticsite', None, 'upload a static site'),
     ])
 }
 
@@ -1605,11 +1612,9 @@ def ftppush(orig, *args, **opts):
         return orig(*args, **opts)
     # first create the site at ._site
     target = "._site"
-    ftpstring = path.replace("ftp://", "")
-    ftpstring = path.replace("ftps://", "")
     # fix the options to fit those of the site command
     opts["name"] = opts["sitename"]
-    opts["upload"] = ftpstring
+    opts["upload"] = path
     staticsite(ui, repo, target, **opts)
     return 0
         
@@ -1683,7 +1688,7 @@ class FTPRepository(peerrepository):
         raise util.Abort('command findoutgoing unavailable for FTP repositories')
 
 
-class RepoContainer(object):
+class FTPRepoContainer(object):
     def __init__(self):
         pass
 
@@ -1695,8 +1700,20 @@ class RepoContainer(object):
         #context = {}
         return FTPRepository(ui, url, create)
 
-hg.schemes["ftp"] = RepoContainer()
-hg.schemes["ftps"] = RepoContainer()
+class FTPSRepoContainer(object):
+    def __init__(self):
+        pass
+
+    def __repr__(self):
+        return '<FTPRepository>'
+
+    def instance(self, ui, url, create):
+        # Should this use urlmod.url(), or is manual parsing better?
+        #context = {}
+        return FTPRepository(ui, url, create)
+
+hg.schemes["ftp"] = FTPRepoContainer()
+hg.schemes["ftps"] = FTPSRepoContainer()
 
 def test():
     import subprocess as sp