from stgit import basedir
from stgit.utils import *
+from stgit.config import config
# git exception class
class GitException(Exception):
self.__id_hash = id_hash
lines = _output_lines('git-cat-file commit %s' % id_hash)
- self.__parents = []
for i in range(len(lines)):
line = lines[i]
if line == '\n':
field = line.strip().split(' ', 1)
if field[0] == 'tree':
self.__tree = field[1]
- elif field[0] == 'parent':
- self.__parents.append(field[1])
if field[0] == 'author':
self.__author = field[1]
if field[0] == 'committer':
return self.__tree
def get_parent(self):
- return self.__parents[0]
+ parents = self.get_parents()
+ if parents:
+ return parents[0]
+ else:
+ return None
def get_parents(self):
- return self.__parents
+ return _output_lines('git-rev-list --parents --max-count=1 %s'
+ % self.__id_hash)[0].split()[1:]
def get_author(self):
return self.__author
def get_log(self):
return self.__log
+ def __str__(self):
+ return self.get_id_hash()
+
# dictionary of Commit objects, used to avoid multiple calls to git
__commits = dict()
raise GitException, 'No changes to commit'
# get the commit message
- if message[-1:] != '\n':
+ if not message:
+ message = '\n'
+ elif message[-1:] != '\n':
message += '\n'
must_switch = True
if __run(checkout_cmd, files) != 0:
raise GitException, 'Failed git-checkout-index'
-def switch(tree_id):
+def switch(tree_id, keep = False):
"""Switch the tree to the given id
"""
- refresh_index()
- if __run('git-read-tree -u -m', [get_head(), tree_id]) != 0:
- raise GitException, 'git-read-tree failed (local changes maybe?)'
+ if not keep:
+ refresh_index()
+ if __run('git-read-tree -u -m', [get_head(), tree_id]) != 0:
+ raise GitException, 'git-read-tree failed (local changes maybe?)'
__set_head(tree_id)
if refspec:
args.append(refspec)
- if __run('git-pull', args) != 0:
+ if __run(config.get('stgit', 'pullcmd'), args) != 0:
raise GitException, 'Failed "git-pull %s"' % repository
-def apply_patch(filename = None, base = None):
+def apply_patch(filename = None, diff = None, base = None):
"""Apply a patch onto the current or given index. There must not
be any local changes in the tree, otherwise the command fails
"""
def __apply_patch():
- if filename:
- return __run('git-apply --index', [filename]) == 0
- else:
- try:
+ try:
+ if filename:
+ return __run('git-apply --index', [filename]) == 0
+ elif diff:
+ _input_str('git-apply --index', diff)
+ else:
_input('git-apply --index', sys.stdin)
- except GitException:
- return False
- return True
+ except GitException:
+ return False
+ return True
if base:
orig_head = get_head()