X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/05c9e6653351bb3c2c2ae822ace38f190288d70d..a622d90bbeccf29319dc2c3142a93ae1010648fe:/stgit/git.py diff --git a/stgit/git.py b/stgit/git.py index a7b1c3f..8306c85 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -82,13 +82,21 @@ __commits = dict() # Functions # +# GIT_DIR value cached +__base_dir = None + def get_base_dir(): """Different start-up variables read from the environment """ - if 'GIT_DIR' in os.environ: - return os.environ['GIT_DIR'] - else: - return _output_one_line('git-rev-parse --git-dir') + global __base_dir + + if not __base_dir: + if 'GIT_DIR' in os.environ: + __base_dir = os.environ['GIT_DIR'] + else: + __base_dir = _output_one_line('git-rev-parse --git-dir') + + return __base_dir def get_commit(id_hash): """Commit objects factory. Save/look-up them in the __commits @@ -253,6 +261,9 @@ def __set_head(val): raise GitException, 'Could not update HEAD to "%s".' % val __head = val + # only allow SHA1 hashes + assert(len(__head) == 40) + def __clear_head_cache(): """Sets the __head to None so that a re-read is forced """ @@ -274,7 +285,7 @@ def rev_parse(git_id): raise GitException, 'Unknown revision: %s' % git_id def branch_exists(branch): - """Existance check for the named branch + """Existence check for the named branch """ for line in _output_lines(['git-rev-parse', '--symbolic', '--all']): if line.strip() == branch: @@ -308,7 +319,7 @@ def switch_branch(name): if not branch_exists(new_head): raise GitException, 'Branch "%s" does not exist' % name - tree_id = rev_parse(new_head + '^0') + tree_id = rev_parse(new_head + '^{commit}') if tree_id != get_head(): refresh_index() if __run('git-read-tree -u -m', [get_head(), tree_id]) != 0: @@ -462,21 +473,27 @@ def commit(message, files = None, parents = None, allowempty = False, return commit_id -def apply_diff(rev1, rev2): +def apply_diff(rev1, rev2, check_index = True): """Apply the diff between rev1 and rev2 onto the current index. This function doesn't need to raise an exception since it is only used for fast-pushing a patch. If this operation fails, the pushing would fall back to the three-way merge. """ - return os.system('git-diff-tree -p %s %s | git-apply --index 2> /dev/null' - % (rev1, rev2)) == 0 + if check_index: + index_opt = '--index' + else: + index_opt = '' + cmd = 'git-diff-tree -p %s %s | git-apply %s 2> /dev/null' \ + % (rev1, rev2, index_opt) + + return os.system(cmd) == 0 def merge(base, head1, head2): """Perform a 3-way merge between base, head1 and head2 into the local tree """ refresh_index() - if __run('git-read-tree -u -m', [base, head1, head2]) != 0: + if __run('git-read-tree -u -m --aggressive', [base, head1, head2]) != 0: raise GitException, 'git-read-tree failed (local changes maybe?)' # this can fail if there are conflicts @@ -603,10 +620,13 @@ def reset(files = None, tree_id = None): """Revert the tree changes relative to the given tree_id. It removes any local changes """ + if not tree_id: + tree_id = get_head() + checkout(files, tree_id, True) # if the reset refers to the whole tree, switch the HEAD as well - if tree_id and not files: + if not files: __set_head(tree_id) def pull(repository = 'origin', refspec = None):