|
@@ -0,0 +1,51 @@
|
|
|
+import argparse
|
|
|
+import re
|
|
|
+
|
|
|
+
|
|
|
+class Location(object):
|
|
|
+
|
|
|
+ loc_re = re.compile(r'^((?:(?P<user>[^@]+)@)?(?P<host>[^:]+):)?'
|
|
|
+ r'(?P<path>[^:]*)(?:::(?P<archive>[^:]+))?$')
|
|
|
+
|
|
|
+ def __init__(self, text):
|
|
|
+ loc = self.loc_re.match(text)
|
|
|
+ loc = loc and loc.groupdict()
|
|
|
+ if not loc:
|
|
|
+ raise ValueError
|
|
|
+ self.user = loc['user']
|
|
|
+ self.host = loc['host']
|
|
|
+ self.path = loc['path']
|
|
|
+ if not self.host and not self.path:
|
|
|
+ raise ValueError
|
|
|
+ self.archive = loc['archive']
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ text = ''
|
|
|
+ if self.user:
|
|
|
+ text += '%s@' % self.user
|
|
|
+ if self.host:
|
|
|
+ text += '%s::' % self.host
|
|
|
+ if self.path:
|
|
|
+ text += self.path
|
|
|
+ if self.archive:
|
|
|
+ text += ':%s' % self.archive
|
|
|
+ return text
|
|
|
+
|
|
|
+ def __repr__(self):
|
|
|
+ return "Location('%s')" % self
|
|
|
+
|
|
|
+
|
|
|
+def location_validator(archive=None):
|
|
|
+ def validator(text):
|
|
|
+ try:
|
|
|
+ loc = Location(text)
|
|
|
+ except ValueError:
|
|
|
+ raise argparse.ArgumentTypeError('Invalid location format: "%s"' % text)
|
|
|
+ if archive is True and not loc.archive:
|
|
|
+ raise argparse.ArgumentTypeError('"%s": No archive specified' % text)
|
|
|
+ elif archive is False and loc.archive:
|
|
|
+ raise argparse.ArgumentTypeError('"%s" No archive can be specified' % text)
|
|
|
+ return loc
|
|
|
+ return validator
|
|
|
+
|
|
|
+
|