source file: /home/buildslave/tahoe/edgy/build/src/allmydata/scripts/tahoe_put.py
file stats: 43 lines, 38 executed: 88.4% covered
   1. 
   2. from cStringIO import StringIO
   3. import os.path
   4. import urllib
   5. from allmydata.scripts.common_http import do_http
   6. from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
   7. 
   8. def put(options):
   9.     """
  10.     @param verbosity: 0, 1, or 2, meaning quiet, verbose, or very verbose
  11. 
  12.     @return: a Deferred which eventually fires with the exit code
  13.     """
  14.     nodeurl = options['node-url']
  15.     aliases = options.aliases
  16.     from_file = options.from_file
  17.     to_file = options.to_file
  18.     mutable = options['mutable']
  19.     if options['quiet']:
  20.         verbosity = 0
  21.     else:
  22.         verbosity = 2
  23.     stdin = options.stdin
  24.     stdout = options.stdout
  25.     stderr = options.stderr
  26. 
  27.     if nodeurl[-1] != "/":
  28.         nodeurl += "/"
  29.     if to_file:
  30.         # several possibilities for the TO_FILE argument.
  31.         #  <none> : unlinked upload
  32.         #  foo : TAHOE_ALIAS/foo
  33.         #  subdir/foo : TAHOE_ALIAS/subdir/foo
  34.         #  ALIAS:foo  : aliases[ALIAS]/foo
  35.         #  ALIAS:subdir/foo  : aliases[ALIAS]/subdir/foo
  36.         #  DIRCAP:./foo        : DIRCAP/foo
  37.         #  DIRCAP:./subdir/foo : DIRCAP/subdir/foo
  38.         #  MUTABLE-FILE-WRITECAP : filecap
  39. 
  40.         if to_file.startswith("URI:SSK:"):
  41.             url = nodeurl + "uri/%s" % urllib.quote(to_file)
  42.         else:
  43.             rootcap, path = get_alias(aliases, to_file, DEFAULT_ALIAS)
  44.             url = nodeurl + "uri/%s/" % urllib.quote(rootcap)
  45.             if path:
  46.                 url += escape_path(path)
  47.     else:
  48.         # unlinked upload
  49.         url = nodeurl + "uri"
  50.     if mutable:
  51.         url += "?mutable=true"
  52.     if from_file:
  53.         infileobj = open(os.path.expanduser(from_file), "rb")
  54.     else:
  55.         # do_http() can't use stdin directly: for one thing, we need a
  56.         # Content-Length field. So we currently must copy it.
  57.         if verbosity > 0:
  58.             print >>stderr, "waiting for file data on stdin.."
  59.         data = stdin.read()
  60.         infileobj = StringIO(data)
  61. 
  62.     resp = do_http("PUT", url, infileobj)
  63. 
  64.     if resp.status in (200, 201,):
  65.         print >>stderr, "%s %s" % (resp.status, resp.reason)
  66.         print >>stdout, resp.read()
  67.         return 0
  68. 
  69.     print >>stderr, "error, got %s %s" % (resp.status, resp.reason)
  70.     print >>stderr, resp.read()
  71.     return 1