Use shlex for better splitting of PORTAGE_RSYNC_OPTS and PORTAGE_RSYNC_EXTRA_OPTS...
authorZac Medico <zmedico@gentoo.org>
Sun, 6 May 2007 20:13:24 +0000 (20:13 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 6 May 2007 20:13:24 +0000 (20:13 -0000)
svn path=/main/branches/2.1.2/; revision=6493

bin/emerge

index 2de42f5b89a5a8c4a76e6d9789401de9ab7f206c..01506e08cc5fcf428c5ef30c53555530122c7c28 100755 (executable)
@@ -3806,7 +3806,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction):
                mytimeout=180
 
                rsync_opts = []
-
+               import shlex, StringIO
                if settings["PORTAGE_RSYNC_OPTS"] == "":
                        portage.writemsg("PORTAGE_RSYNC_OPTS empty or unset, using hardcoded defaults\n")
                        rsync_opts.extend([
@@ -3833,7 +3833,11 @@ def action_sync(settings, trees, mtimedb, myopts, myaction):
                        # defaults.
 
                        portage.writemsg("Using PORTAGE_RSYNC_OPTS instead of hardcoded defaults\n", 1)
-                       rsync_opts.extend(settings["PORTAGE_RSYNC_OPTS"].split())
+                       lexer = shlex.shlex(StringIO.StringIO(
+                               settings.get("PORTAGE_RSYNC_OPTS","")), posix=True)
+                       lexer.whitespace_split = True
+                       rsync_opts.extend(lexer)
+                       del lexer
 
                        for opt in ("--recursive", "--times"):
                                if opt not in rsync_opts:
@@ -3942,8 +3946,12 @@ def action_sync(settings, trees, mtimedb, myopts, myaction):
                        user_name=""
                updatecache_flg=True
                all_rsync_opts = set(rsync_opts)
-               all_rsync_opts.update(
-                       settings.get("PORTAGE_RSYNC_EXTRA_OPTS","").split())
+               lexer = shlex.shlex(StringIO.StringIO(
+                       settings.get("PORTAGE_RSYNC_EXTRA_OPTS","")), posix=True)
+               lexer.whitespace_split = True
+               extra_rsync_opts = list(lexer)
+               del lexer
+               all_rsync_opts.update(extra_rsync_opts)
                family = socket.AF_INET
                if "-4" in all_rsync_opts or "--ipv4" in all_rsync_opts:
                        family = socket.AF_INET
@@ -4001,8 +4009,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction):
                        if mytimestamp != 0 and "--quiet" not in myopts:
                                print ">>> Checking server timestamp ..."
 
-                       rsynccommand = " ".join(["/usr/bin/rsync", " ".join(rsync_opts),
-                               settings.get("PORTAGE_RSYNC_EXTRA_OPTS","")])
+                       rsynccommand = ["/usr/bin/rsync"] + rsync_opts + extra_rsync_opts
 
                        if "--debug" in myopts:
                                print rsynccommand
@@ -4015,7 +4022,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction):
                        # connection attempt to an unresponsive server which rsync's
                        # --timeout option does not prevent.
                        if True:
-                               mycommand = rsynccommand.split()
+                               mycommand = rsynccommand[:]
                                mycommand.append(dosyncuri.rstrip("/") + \
                                        "/metadata/timestamp.chk")
                                mycommand.append(tmpservertimestampfile)
@@ -4090,8 +4097,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction):
                                        print
                                elif (servertimestamp == 0) or (servertimestamp > mytimestamp):
                                        # actual sync
-                                       mycommand=rsynccommand+" "+dosyncuri+"/ "+myportdir
-                                       mycommand = mycommand.split()
+                                       mycommand = rsynccommand + [dosyncuri+"/", myportdir]
                                        exitcode = portage.portage_exec.spawn(mycommand,
                                                env=settings.environ())
                                        if exitcode in [0,1,3,4,11,14,20,21]: