summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-07-30 05:03:03 +0000
committerZac Medico <zmedico@gentoo.org>2007-07-30 05:03:03 +0000
commit402b870a6085aaf60bd8c2ea3199de659dd46f66 (patch)
treea13f6cb2a3d8dd14b1253c3bf2af079e818485b9
parentbf1c6c03977b22516623b650c1d2eb512dc07113 (diff)
downloadportage-402b870a6085aaf60bd8c2ea3199de659dd46f66.tar.gz
portage-402b870a6085aaf60bd8c2ea3199de659dd46f66.tar.bz2
portage-402b870a6085aaf60bd8c2ea3199de659dd46f66.zip
dont break when the binhost url doesn't end with a slash (bug #144440, branches/2.1.2 r7003)
svn path=/main/branches/2.1.2.9/; revision=7483
-rw-r--r--pym/getbinpkg.py75
1 files changed, 24 insertions, 51 deletions
diff --git a/pym/getbinpkg.py b/pym/getbinpkg.py
index 9484d1d16..f57dc859e 100644
--- a/pym/getbinpkg.py
+++ b/pym/getbinpkg.py
@@ -141,15 +141,6 @@ def create_conn(baseurl,conn=None):
conn.login(username)
conn.set_pasv(passive)
conn.set_debuglevel(0)
- elif protocol == "sftp":
- try:
- import paramiko
- except ImportError:
- raise NotImplementedError(
- "paramiko must be installed for sftp support")
- t = paramiko.Transport(host)
- t.connect(username=username, password=password)
- conn = paramiko.SFTPClient.from_transport(t)
else:
raise NotImplementedError, "%s is not a supported protocol." % protocol
@@ -316,8 +307,6 @@ def dir_get_list(baseurl,conn=None):
del olddir
else:
listing = conn.nlst(address)
- elif protocol == "sftp":
- listing = conn.listdir(address)
else:
raise TypeError, "Unknown protocol. '%s'" % protocol
@@ -343,13 +332,6 @@ def file_get_metadata(baseurl,conn=None, chunk_size=3000):
data,rc,msg = make_http_request(conn, address, params, headers)
elif protocol in ["ftp"]:
data,rc,msg = make_ftp_request(conn, address, -chunk_size)
- elif protocol == "sftp":
- f = conn.open(address)
- try:
- f.seek(-chunk_size, 2)
- data = f.read()
- finally:
- f.close()
else:
raise TypeError, "Unknown protocol. '%s'" % protocol
@@ -384,19 +366,28 @@ def file_get(baseurl,dest,conn=None,fcmd=None):
if not fcmd:
return file_get_lib(baseurl,dest,conn)
- variables = {
- "DISTDIR": dest,
- "URI": baseurl,
- "FILE": os.path.basename(baseurl)
- }
- import shlex, StringIO
- from portage_util import varexpand
- from portage_exec import spawn
- lexer = shlex.shlex(StringIO.StringIO(fcmd), posix=True)
- lexer.whitespace_split = True
- myfetch = [varexpand(x, mydict=variables) for x in lexer]
- retval = spawn(myfetch, env=os.environ.copy())
- if retval != os.EX_OK:
+ fcmd = fcmd.replace("${DISTDIR}",dest)
+ fcmd = fcmd.replace("${URI}", baseurl)
+ fcmd = fcmd.replace("${FILE}", os.path.basename(baseurl))
+ mysplit = fcmd.split()
+ mycmd = mysplit[0]
+ myargs = [os.path.basename(mycmd)]+mysplit[1:]
+ mypid=os.fork()
+ if mypid == 0:
+ try:
+ os.execv(mycmd,myargs)
+ except OSError:
+ pass
+ sys.stderr.write("!!! Failed to spawn fetcher.\n")
+ sys.stderr.flush()
+ os._exit(1)
+ retval=os.waitpid(mypid,0)[1]
+ if (retval & 0xff) == 0:
+ retval = retval >> 8
+ else:
+ sys.stderr.write("Spawned processes caught a signal.\n")
+ sys.exit(1)
+ if retval != 0:
sys.stderr.write("Fetcher exited with a failure condition.\n")
return 0
return 1
@@ -418,25 +409,6 @@ def file_get_lib(baseurl,dest,conn=None):
data,rc,msg = make_http_request(conn, address, params, headers, dest=dest)
elif protocol in ["ftp"]:
data,rc,msg = make_ftp_request(conn, address, dest=dest)
- elif protocol == "sftp":
- rc = 0
- try:
- f = conn.open(address)
- except SystemExit:
- raise
- except Exception:
- rc = 1
- else:
- try:
- if dest:
- bufsize = 8192
- while True:
- data = f.read(bufsize)
- if not data:
- break
- dest.write(data)
- finally:
- f.close()
else:
raise TypeError, "Unknown protocol. '%s'" % protocol
@@ -549,7 +521,8 @@ def dir_get_metadata(baseurl, conn=None, chunk_size=3000, verbose=1, usingcache=
for x in tbz2list:
x = os.path.basename(x)
binpkg_filenames.add(x)
- if x not in metadata[baseurl]["data"]:
+ if ((not metadata[baseurl]["data"].has_key(x)) or \
+ (x not in metadata[baseurl]["data"].keys())):
sys.stderr.write(yellow("x"))
metadata[baseurl]["modified"] = 1
myid = None