summaryrefslogtreecommitdiffstats
path: root/BitTorrent/parseargs.py
diff options
context:
space:
mode:
Diffstat (limited to 'BitTorrent/parseargs.py')
-rw-r--r--BitTorrent/parseargs.py187
1 files changed, 187 insertions, 0 deletions
diff --git a/BitTorrent/parseargs.py b/BitTorrent/parseargs.py
new file mode 100644
index 0000000..2db0b9a
--- /dev/null
+++ b/BitTorrent/parseargs.py
@@ -0,0 +1,187 @@
+# The contents of this file are subject to the BitTorrent Open Source License
+# Version 1.1 (the License). You may not copy or use this file, in either
+# source code or executable form, except in compliance with the License. You
+# may obtain a copy of the License at http://www.bittorrent.com/license/.
+#
+# Software distributed under the License is distributed on an AS IS basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+
+# Written by Bill Bumgarner and Bram Cohen
+
+from types import *
+from cStringIO import StringIO
+
+from BitTorrent.obsoletepythonsupport import *
+
+from BitTorrent.defaultargs import MyBool, MYTRUE
+from BitTorrent import BTFailure
+from BitTorrent.bencode import bdecode
+from BitTorrent.platform import is_frozen_exe
+from BitTorrent.RawServer_magic import switch_rawserver
+
+def makeHelp(uiname, defaults):
+ ret = ''
+ ret += (_("Usage: %s ") % uiname)
+ if uiname.startswith('launchmany'):
+ ret += _("[OPTIONS] [TORRENTDIRECTORY]\n\n")
+ ret += _("If a non-option argument is present it's taken as the value\n"
+ "of the torrent_dir option.\n")
+ elif uiname == 'bittorrent':
+ ret += _("[OPTIONS] [TORRENTFILES]\n")
+ elif uiname.startswith('bittorrent'):
+ ret += _("[OPTIONS] [TORRENTFILE]\n")
+ elif uiname.startswith('maketorrent'):
+ ret += _("[OPTION] TRACKER_URL FILE [FILE]\n")
+ ret += '\n'
+ ret += _("arguments are -\n") + formatDefinitions(defaults, 80)
+ return ret
+
+def printHelp(uiname, defaults):
+ if uiname in ('bittorrent','maketorrent') and is_frozen_exe:
+ from BitTorrent.GUI import HelpWindow
+ HelpWindow(None, makeHelp(uiname, defaults))
+ else:
+ print makeHelp(uiname, defaults)
+
+def formatDefinitions(options, COLS):
+ s = StringIO()
+ indent = " " * 10
+ width = COLS - 11
+
+ if width < 15:
+ width = COLS - 2
+ indent = " "
+
+ for option in options:
+ (longname, default, doc) = option
+ if doc == '':
+ continue
+ s.write('--' + longname)
+ is_boolean = type(default) is MyBool
+ if is_boolean:
+ s.write(', --no_' + longname)
+ else:
+ s.write(' <arg>')
+ s.write('\n')
+ if default is not None:
+ doc += _(" (defaults to ") + repr(default) + ')'
+ i = 0
+ for word in doc.split():
+ if i == 0:
+ s.write(indent + word)
+ i = len(word)
+ elif i + len(word) >= width:
+ s.write('\n' + indent + word)
+ i = len(word)
+ else:
+ s.write(' ' + word)
+ i += len(word) + 1
+ s.write('\n\n')
+ return s.getvalue()
+
+def usage(str):
+ raise BTFailure(str)
+
+def format_key(key):
+ if len(key) == 1:
+ return '-%s'%key
+ else:
+ return '--%s'%key
+
+def parseargs(argv, options, minargs=None, maxargs=None, presets=None):
+ config = {}
+ for option in options:
+ longname, default, doc = option
+ config[longname] = default
+ args = []
+ pos = 0
+ if presets is None:
+ presets = {}
+ else:
+ presets = presets.copy()
+ while pos < len(argv):
+ if argv[pos][:1] != '-': # not a cmdline option
+ args.append(argv[pos])
+ pos += 1
+ else:
+ key, value = None, None
+ if argv[pos].startswith('--'): # --aaa 1
+ if argv[pos].startswith('--no_'):
+ key = argv[pos][5:]
+ boolval = False
+ else:
+ key = argv[pos][2:]
+ boolval = True
+ if key not in config:
+ raise BTFailure(_("unknown key ") + format_key(key))
+ if type(config[key]) is MyBool: # boolean cmd line switch, no value
+ value = boolval
+ pos += 1
+ else: # --argument value
+ if pos == len(argv) - 1:
+ usage(_("parameter passed in at end with no value"))
+ key, value = argv[pos][2:], argv[pos+1]
+ pos += 2
+ elif argv[pos][:1] == '-':
+ key = argv[pos][1:2]
+ if len(argv[pos]) > 2: # -a1
+ value = argv[pos][2:]
+ pos += 1
+ else: # -a 1
+ if pos == len(argv) - 1:
+ usage(_("parameter passed in at end with no value"))
+ value = argv[pos+1]
+ pos += 2
+ else:
+ raise BTFailure(_("command line parsing failed at ")+argv[pos])
+
+ presets[key] = value
+ parse_options(config, presets)
+ config.update(presets)
+ for key, value in config.items():
+ if value is None:
+ usage(_("Option %s is required.") % format_key(key))
+ if minargs is not None and len(args) < minargs:
+ usage(_("Must supply at least %d arguments.") % minargs)
+ if maxargs is not None and len(args) > maxargs:
+ usage(_("Too many arguments - %d maximum.") % maxargs)
+
+ if config.has_key('twisted'):
+ if config['twisted'] == 0:
+ switch_rawserver('untwisted')
+ elif config['twisted'] == 1:
+ switch_rawserver('twisted')
+
+ return (config, args)
+
+def parse_options(defaults, newvalues):
+ for key, value in newvalues.iteritems():
+ if not defaults.has_key(key):
+ raise BTFailure(_("unknown key ") + format_key(key))
+ try:
+ t = type(defaults[key])
+ if t is MyBool:
+ if value in ('True', '1', MYTRUE, True):
+ value = True
+ else:
+ value = False
+ newvalues[key] = value
+ elif t in (StringType, NoneType):
+ newvalues[key] = value
+ elif t in (IntType, LongType):
+ if value == 'False':
+ newvalues[key] == 0
+ elif value == 'True':
+ newvalues[key] == 1
+ else:
+ newvalues[key] = int(value)
+ elif t is FloatType:
+ newvalues[key] = float(value)
+ else:
+ raise TypeError, str(t)
+
+ except ValueError, e:
+ raise BTFailure(_("wrong format of %s - %s") % (format_key(key), str(e)))
+