+import os, subprocess, re
+
+'''A VCS must have an "update" method with an optional "mode" parameter taking one of the three values below,
+ a "version" method returning a version name (or None),
+ and a "newVersions" method which checks for new versions and prints the result to standard output.'''
+MODE_FETCH = 0
+MODE_REBASE = 1
+MODE_RESET = 2
+
+def natural_sort_key(val):
+ return [ (int(c) if c.isdigit() else c) for c in re.split('([0-9]+)', val) ]
+
+def get_non_digit_prefix(val):
+ return re.match('[^0-9]*', val).group(0)
+
+class GitCommand:
+ def __getattr__(self, name):
+ def call(*args, get_stderr = False):
+ cmd = ["git", name.replace('_', '-')] + list(args)
+ output = subprocess.check_output(cmd, stderr=subprocess.STDOUT if get_stderr else None)
+ return output.decode('utf-8').strip('\n')
+ return call
+git = GitCommand()