312
312
return urlparse.urlunsplit(
313
313
(parts.scheme, parts.netloc, parts.path.rstrip("/") + "/xml-rpc/", "", ""))
316
def _strict_server_version(version):
318
Calculate strict server version (as defined by
319
distutils.version.StrictVersion). This works by discarding .candidate
320
and .dev release-levels.
321
>>> XMLRPCCommand._strict_server_version("0.4.0.candidate.5")
323
>>> XMLRPCCommand._strict_server_version("0.4.0.dev.126")
325
>>> XMLRPCCommand._strict_server_version("0.4.0.alpha.1")
327
>>> XMLRPCCommand._strict_server_version("0.4.0.beta.2")
331
major, minor, micro, releaselevel, serial = version.split(".")
334
("version %r does not follow pattern "
335
"'major.minor.micro.releaselevel.serial'") % version)
336
if releaselevel in ["dev", "candidate", "final"]:
337
return "%s.%s.%s" % (major, minor, micro)
338
elif releaselevel == "alpha":
339
return "%s.%s.%sa%s" % (major, minor, micro, serial)
340
elif releaselevel == "beta":
341
return "%s.%s.%sb%s" % (major, minor, micro, serial)
344
("releaselevel %r is not one of 'final', 'alpha', 'beta', "
345
"'candidate' or 'final'") % releaselevel)
315
347
def _check_server_version(self, server_obj, required_version):
317
349
Check that server object has is at least required_version.
318
which must be a tuple of integer (major, minor, micro).
320
351
This method may raise InsufficientServerVersion.
322
353
from distutils.version import StrictVersion, LooseVersion
323
354
# For backwards compatibility the server reports
324
355
# major.minor.micro.releaselevel.serial which is not PEP-386 compliant
325
server_version = LooseVersion(server_obj.version())
326
required_version = LooseVersion(required_version)
356
server_version = StrictVersion(
357
self._strict_server_version(server_obj.version()))
358
required_version = StrictVersion(required_version)
327
359
if server_version < required_version:
328
360
raise InsufficientServerVersion(server_version, required_version)
651
683
help="Name of the bundle stream (description)")
653
685
def invoke_remote(self):
654
self._check_server_version(self.server, "0.3.0.candidate.9")
686
self._check_server_version(self.server, "0.3")
655
687
pathname = self.server.make_stream(self.args.pathname, self.args.name)
656
688
print "Bundle stream {pathname} created".format(pathname=pathname)
699
731
help="Directory to backup from")
701
733
def invoke_remote(self):
702
self._check_server_version(self.server, "0.3.0.candidate.9")
734
self._check_server_version(self.server, "0.3")
703
735
for stream_pathname_quoted in os.listdir(self.args.BACKUP_DIR):
704
736
filesystem_stream_pathname = os.path.join(self.args.BACKUP_DIR, stream_pathname_quoted)
705
737
if not os.path.isdir(filesystem_stream_pathname):
771
803
return "%s GB" % filesize_number_format(num_bytes / (1024 * 1024 * 1024))
773
805
def invoke_remote(self):
774
self._check_server_version(self.server, "0.3.0.candidate.9")
806
self._check_server_version(self.server, "0.3")
775
807
print "Checking local and remote streams"
776
808
remote = self.remote_server.streams()
777
809
if self.args.STREAM:
850
882
Probe the server for information about data views
852
884
with self.safety_net():
853
self._check_server_version(self.server, "0.4.0.dev")
885
self._check_server_version(self.server, "0.4")
854
886
return self.server.data_views()
856
888
def reparse_arguments(self, parser, raw_args):