1 """Handles the Stacked GIT configuration files
5 Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 from stgit
import basedir
24 class GitConfigException(Exception):
29 'stgit.autoresolved': 'no',
30 'stgit.smtpserver': 'localhost:25',
31 'stgit.smtpdelay': '5',
32 'stgit.pullcmd': 'git-pull',
33 'stgit.merger': 'diff3 -L current -L ancestor -L patched -m -E ' \
34 '"%(branch1)s" "%(ancestor)s" "%(branch2)s" > "%(output)s"',
35 'stgit.autoimerge': 'no',
36 'stgit.keeporig': 'yes',
37 'stgit.keepoptimized': 'no',
38 'stgit.extensions': '.ancestor .current .patched',
42 def __run(self
, cmd
, args
=None):
43 """__run: runs cmd using spawnvp.
45 Runs cmd using spawnvp. The shell is avoided so it won't mess up
46 our arguments. If args is very large, the command is run multiple
47 times; args is split xargs style: cmd is passed on each
48 invocation. Unlike xargs, returns immediately if any non-zero
49 return code is received.
55 for i
in range(0, len(args
)+1, 100):
56 r
=os
.spawnvp(os
.P_WAIT
, args_l
[0], args_l
+ args
[i
:min(i
+100, len(args
))])
62 stream
= os
.popen('git repo-config --get %s' % name
, 'r')
63 value
= stream
.readline().strip()
67 elif (self
.__defaults
.has_key(name
)):
68 return self
.__defaults
[name
]
72 def getall(self
, name
):
73 stream
= os
.popen('git repo-config --get-all %s' % name
, 'r')
74 values
= [line
.strip() for line
in stream
]
78 def getint(self
, name
):
79 value
= self
.get(name
)
83 raise GitConfigException
, 'Value for "%s" is not an integer: "%s"' %
(name
, value
)
85 def set(self
, name
, value
):
86 self
.__run('git-repo-config', [name
, value
])
88 def sections_matching(self
, regexp
):
89 """Takes a regexp with a single group, matches it against all
90 config variables, and returns a list whose members are the
91 group contents, for all variable names matching the regexp.
94 stream
= os
.popen('git repo-config --get-regexp "^%s$"' % regexp
, 'r')
96 m
= re
.match('^%s ' % regexp
, line
)
98 result
.append(m
.group(1))
107 # Set the PAGER environment to the config value (if any)
108 pager
= config
.get('stgit.pager')
110 os
.environ
['PAGER'] = pager
111 # FIXME: handle EDITOR the same way ?
114 """Delayed cached reading of a configuration option.
116 def __init__(self
, section
, option
):
117 self
.__section
= section
118 self
.__option
= option
123 self
.__value
= config
.get(self
.__section
+ '.' + self
.__option
)
130 def file_extensions():
131 """Returns a dictionary with the conflict file extensions
136 cfg_ext
= config
.get('stgit.extensions').split()
137 if len(cfg_ext
) != 3:
138 raise CmdException
, '"extensions" configuration error'
140 __extensions
= { 'ancestor': cfg_ext
[0],
141 'current': cfg_ext
[1],
142 'patched': cfg_ext
[2] }