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