| 1 | """Handles the Stacked GIT configuration files |
| 2 | """ |
| 3 | |
| 4 | __copyright__ = """ |
| 5 | Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com> |
| 6 | |
| 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. |
| 10 | |
| 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. |
| 15 | |
| 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 |
| 19 | """ |
| 20 | |
| 21 | import os, ConfigParser |
| 22 | from StringIO import StringIO |
| 23 | from stgit import basedir |
| 24 | |
| 25 | config = ConfigParser.RawConfigParser() |
| 26 | |
| 27 | def git_config(filename): |
| 28 | """Open a git config file and convert it to be understood by |
| 29 | Python.""" |
| 30 | try: |
| 31 | f = file(filename) |
| 32 | cont = False |
| 33 | lines = [] |
| 34 | for line in f: |
| 35 | line = line.strip() |
| 36 | |
| 37 | if cont: |
| 38 | # continued line, add a space at the beginning |
| 39 | line = ' ' + line |
| 40 | |
| 41 | if line and line[-1] == '\\': |
| 42 | line = line[:-1].rstrip() |
| 43 | cont = True |
| 44 | else: |
| 45 | line = line + '\n' |
| 46 | cont = False |
| 47 | |
| 48 | lines.append(line) |
| 49 | |
| 50 | f.close() |
| 51 | cfg_str = ''.join(lines) |
| 52 | except IOError: |
| 53 | cfg_str = '' |
| 54 | |
| 55 | strio = StringIO(cfg_str) |
| 56 | strio.name = filename |
| 57 | |
| 58 | return strio |
| 59 | |
| 60 | def config_setup(): |
| 61 | global config |
| 62 | |
| 63 | # Set the defaults |
| 64 | config.add_section('stgit') |
| 65 | config.set('stgit', 'autoresolved', 'no') |
| 66 | config.set('stgit', 'smtpserver', 'localhost:25') |
| 67 | config.set('stgit', 'smtpdelay', '5') |
| 68 | config.set('stgit', 'pullcmd', 'git-pull') |
| 69 | config.set('stgit', 'merger', |
| 70 | 'diff3 -L current -L ancestor -L patched -m -E ' \ |
| 71 | '"%(branch1)s" "%(ancestor)s" "%(branch2)s" > "%(output)s"') |
| 72 | config.set('stgit', 'keeporig', 'yes') |
| 73 | config.set('stgit', 'keepoptimized', 'no') |
| 74 | config.set('stgit', 'extensions', '.ancestor .current .patched') |
| 75 | |
| 76 | # Read the configuration files (if any) and override the default settings |
| 77 | # stgitrc are read for backward compatibility |
| 78 | config.read('/etc/stgitrc') |
| 79 | config.read(os.path.expanduser('~/.stgitrc')) |
| 80 | config.read(os.path.join(basedir.get(), 'stgitrc')) |
| 81 | |
| 82 | # GIT configuration files can have a [stgit] section |
| 83 | try: |
| 84 | global_config = os.environ['GIT_CONFIG'] |
| 85 | except KeyError: |
| 86 | global_config = os.path.expanduser('~/.gitconfig') |
| 87 | try: |
| 88 | local_config = os.environ['GIT_CONFIG_LOCAL'] |
| 89 | except KeyError: |
| 90 | local_config = os.path.join(basedir.get(), 'config') |
| 91 | config.readfp(git_config(global_config)) |
| 92 | config.readfp(git_config(local_config)) |
| 93 | |
| 94 | # Set the PAGER environment to the config value (if any) |
| 95 | if config.has_option('stgit', 'pager'): |
| 96 | os.environ['PAGER'] = config.get('stgit', 'pager') |
| 97 | |
| 98 | # [gitmergeonefile] section is deprecated. In case it exists copy the |
| 99 | # options/values to the [stgit] one |
| 100 | if config.has_section('gitmergeonefile'): |
| 101 | for option, value in config.items('gitmergeonefile'): |
| 102 | config.set('stgit', option, value) |
| 103 | |
| 104 | |
| 105 | class ConfigOption: |
| 106 | """Delayed cached reading of a configuration option. |
| 107 | """ |
| 108 | def __init__(self, section, option): |
| 109 | self.__section = section |
| 110 | self.__option = option |
| 111 | self.__value = None |
| 112 | |
| 113 | def __str__(self): |
| 114 | if not self.__value: |
| 115 | self.__value = config.get(self.__section, self.__option) |
| 116 | return self.__value |
| 117 | |
| 118 | |
| 119 | # cached extensions |
| 120 | __extensions = None |
| 121 | |
| 122 | def file_extensions(): |
| 123 | """Returns a dictionary with the conflict file extensions |
| 124 | """ |
| 125 | global __extensions |
| 126 | |
| 127 | if not __extensions: |
| 128 | cfg_ext = config.get('stgit', 'extensions').split() |
| 129 | if len(cfg_ext) != 3: |
| 130 | raise CmdException, '"extensions" configuration error' |
| 131 | |
| 132 | __extensions = { 'ancestor': cfg_ext[0], |
| 133 | 'current': cfg_ext[1], |
| 134 | 'patched': cfg_ext[2] } |
| 135 | |
| 136 | return __extensions |