X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/3c6fbd2cb3fd1d2a18585d3c13cd4517021b2f36..aa01a285716ffb29a62cd7d2ef5663fa2b73f568:/stgit/git.py diff --git a/stgit/git.py b/stgit/git.py index ea80be6..7a5c9e4 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -59,7 +59,7 @@ class Commit: self.__author = field[1] if field[0] == 'committer': self.__committer = field[1] - self.__log = ''.join(lines[i:]) + self.__log = ''.join(lines[i+1:]) def get_id_hash(self): return self.__id_hash @@ -113,7 +113,10 @@ def get_conflicts(): def _input(cmd, file_desc): p = popen2.Popen3(cmd) - for line in file_desc: + while True: + line = file_desc.readline() + if not line: + break p.tochild.write(line) p.tochild.close() if p.wait(): @@ -170,7 +173,7 @@ def __tree_status(files = [], tree_id = 'HEAD', unknown = False, noexclude = True): """Returns a list of pairs - [status, filename] """ - os.system('git-update-cache --refresh > /dev/null') + os.system('git-update-index --refresh > /dev/null') cache_files = [] @@ -199,7 +202,7 @@ def __tree_status(files = [], tree_id = 'HEAD', unknown = False, cache_files += [('C', filename) for filename in conflicts] # the rest - for line in _output_lines(['git-diff-cache', '-r', tree_id] + files): + for line in _output_lines(['git-diff-index', '-r', tree_id] + files): fs = tuple(line.rstrip().split(' ',4)[-1].split('\t',1)) if fs[1] not in conflicts: cache_files.append(fs) @@ -211,24 +214,36 @@ def local_changes(): """ return len(__tree_status()) != 0 +# HEAD value cached +__head = None + def get_head(): - """Returns a string representing the HEAD + """Verifies the HEAD and returns the SHA1 id that represents it """ - return read_string(head_link) + global __head + + if not __head: + __head = rev_parse('HEAD') + return __head def get_head_file(): """Returns the name of the file pointed to by the HEAD link """ - # valid link - if os.path.islink(head_link) and os.path.isfile(head_link): - return os.path.basename(os.readlink(head_link)) - else: - raise GitException, 'Invalid .git/HEAD link. Git tree not initialised?' + return os.path.basename(_output_one_line('git-symbolic-ref HEAD')) def __set_head(val): """Sets the HEAD value """ - write_string(head_link, val) + global __head + + __head = val + if __run('git-update-ref HEAD', [val]) != 0: + raise GitException, 'Could not update HEAD to "%s".' % val + +def rev_parse(git_id): + """Parse the string and return a verified SHA1 id + """ + return _output_one_line(['git-rev-parse', '--verify', git_id]) def add(names): """Add the files or recursively add the directory contents @@ -251,7 +266,7 @@ def add(names): raise GitException, '%s is not a file or directory' % i if files: - if __run('git-update-cache --add --', files): + if __run('git-update-index --add --', files): raise GitException, 'Unable to add file' def rm(files, force = False): @@ -267,10 +282,10 @@ def rm(files, force = False): if os.path.exists(f): raise GitException, '%s exists. Remove it first' %f if files: - __run('git-update-cache --remove --', files) + __run('git-update-index --remove --', files) else: if files: - __run('git-update-cache --force-remove --', files) + __run('git-update-index --force-remove --', files) def update_cache(files = [], force = False): """Update the cache information for the given files @@ -291,12 +306,12 @@ def update_cache(files = [], force = False): rm_files = [x[1] for x in cache_files if x[0] in ['D']] m_files = [x[1] for x in cache_files if x[0] in ['M']] - if add_files and __run('git-update-cache --add --', add_files) != 0: - raise GitException, 'Failed git-update-cache --add' - if rm_files and __run('git-update-cache --force-remove --', rm_files) != 0: - raise GitException, 'Failed git-update-cache --rm' - if m_files and __run('git-update-cache --', m_files) != 0: - raise GitException, 'Failed git-update-cache' + if add_files and __run('git-update-index --add --', add_files) != 0: + raise GitException, 'Failed git-update-index --add' + if rm_files and __run('git-update-index --force-remove --', rm_files) != 0: + raise GitException, 'Failed git-update-index --rm' + if m_files and __run('git-update-index --', m_files) != 0: + raise GitException, 'Failed git-update-index' return True @@ -347,6 +362,15 @@ def commit(message, files = [], parents = [], allowempty = False, return commit_id +def apply_diff(rev1, rev2): + """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 + def merge(base, head1, head2): """Perform a 3-way merge between base, head1 and head2 into the local tree @@ -355,7 +379,7 @@ def merge(base, head1, head2): raise GitException, 'git-read-tree failed (local changes maybe?)' # this can fail if there are conflicts - if os.system('git-merge-cache -o -q gitmergeonefile.py -a') != 0: + if os.system('git-merge-index -o -q gitmergeonefile.py -a') != 0: raise GitException, 'git-merge-cache failed (possible conflicts)' def status(files = [], modified = False, new = False, deleted = False, @@ -393,8 +417,8 @@ def diff(files = [], rev1 = 'HEAD', rev2 = None, out_fd = None): if rev2: diff_str = _output(['git-diff-tree', '-p', rev1, rev2] + files) else: - os.system('git-update-cache --refresh > /dev/null') - diff_str = _output(['git-diff-cache', '-p', rev1] + files) + os.system('git-update-index --refresh > /dev/null') + diff_str = _output(['git-diff-index', '-p', rev1] + files) if out_fd: out_fd.write(diff_str) @@ -439,7 +463,7 @@ def checkout(files = [], tree_id = None, force = False): if tree_id and __run('git-read-tree -m', [tree_id]) != 0: raise GitException, 'Failed git-read-tree -m %s' % tree_id - checkout_cmd = 'git-checkout-cache -q -u' + checkout_cmd = 'git-checkout-index -q -u' if force: checkout_cmd += ' -f' if len(files) == 0: @@ -448,7 +472,7 @@ def checkout(files = [], tree_id = None, force = False): checkout_cmd += ' --' if __run(checkout_cmd, files) != 0: - raise GitException, 'Failed git-checkout-cache' + raise GitException, 'Failed git-checkout-index' def switch(tree_id): """Switch the tree to the given id @@ -489,7 +513,7 @@ def apply_patch(filename = None): """Apply a patch onto the current index. There must not be any local changes in the tree, otherwise the command fails """ - os.system('git-update-cache --refresh > /dev/null') + os.system('git-update-index --refresh > /dev/null') if filename: if __run('git-apply --index', [filename]) != 0: