import os, re
from stgit import basedir
+from stgit.exception import *
+from stgit.run import *
-class GitConfigException(Exception):
+class GitConfigException(StgException):
pass
class GitConfig:
'stgit.autoresolved': 'no',
'stgit.smtpserver': 'localhost:25',
'stgit.smtpdelay': '5',
- 'stgit.pullcmd': 'git-pull',
+ 'stgit.pullcmd': 'git pull',
+ 'stgit.fetchcmd': 'git fetch',
+ 'stgit.pull-policy': 'pull',
'stgit.merger': 'diff3 -L current -L ancestor -L patched -m -E ' \
'"%(branch1)s" "%(ancestor)s" "%(branch2)s" > "%(output)s"',
'stgit.autoimerge': 'no',
'stgit.shortnr': '5'
}
- def __run(self, cmd, args=None):
- """__run: runs cmd using spawnvp.
-
- Runs cmd using spawnvp. The shell is avoided so it won't mess up
- our arguments. If args is very large, the command is run multiple
- times; args is split xargs style: cmd is passed on each
- invocation. Unlike xargs, returns immediately if any non-zero
- return code is received.
- """
-
- args_l=cmd.split()
- if args is None:
- args = []
- for i in range(0, len(args)+1, 100):
- r=os.spawnvp(os.P_WAIT, args_l[0], args_l + args[i:min(i+100, len(args))])
- if r:
- return r
- return 0
-
+ __cache={}
+
def get(self, name):
- stream = os.popen('git repo-config --get %s' % name, 'r')
- value = stream.readline().strip()
- stream.close()
- if len(value) > 0:
- return value
- elif (self.__defaults.has_key(name)):
- return self.__defaults[name]
- else:
- return None
+ if self.__cache.has_key(name):
+ return self.__cache[name]
+ try:
+ value = Run('git', 'config', '--get', name).output_one_line()
+ except RunException:
+ value = self.__defaults.get(name, None)
+ self.__cache[name] = value
+ return value
def getall(self, name):
- stream = os.popen('git repo-config --get-all %s' % name, 'r')
- values = [line.strip() for line in stream]
- stream.close()
+ if self.__cache.has_key(name):
+ return self.__cache[name]
+ values = Run('git', 'config', '--get-all', name
+ ).returns([0, 1]).output_lines()
+ self.__cache[name] = values
return values
def getint(self, name):
else:
raise GitConfigException, 'Value for "%s" is not an integer: "%s"' % (name, value)
+ def rename_section(self, from_name, to_name):
+ """Rename a section in the config file. Silently do nothing if
+ the section doesn't exist."""
+ Run('git', 'config', '--rename-section', from_name, to_name
+ ).returns([0, 1]).run()
+ self.__cache.clear()
+
+ def remove_section(self, name):
+ """Remove a section in the config file. Silently do nothing if
+ the section doesn't exist."""
+ Run('git', 'config', '--remove-section', name
+ ).returns([0, 1]).discard_stderr().discard_output()
+ self.__cache.clear()
+
def set(self, name, value):
- self.__run('git-repo-config', [name, value])
+ Run('git', 'config', name, value).run()
+ self.__cache[name] = value
+
+ def unset(self, name):
+ Run('git', 'config', '--unset', name)
+ self.__cache[name] = None
def sections_matching(self, regexp):
"""Takes a regexp with a single group, matches it against all
group contents, for all variable names matching the regexp.
"""
result = []
- stream = os.popen('git repo-config --get-regexp "^%s$"' % regexp, 'r')
- for line in stream:
+ for line in Run('git', 'config', '--get-regexp', '"^%s$"' % regexp
+ ).returns([0, 1]).output_lines():
m = re.match('^%s ' % regexp, line)
if m:
result.append(m.group(1))
- stream.close()
return result
config=GitConfig()