def diff_helper(commit=None, ref=None, endref=None, filename=None, cached=True, head=None, amending=False, with_diff_header=False, suppress_header=True, reverse=False, git=git): "Invokes git diff on a filepath." encode = core.encode if commit: ref, endref = commit+'^', commit argv = [] if ref and endref: argv.append('%s..%s' % (ref, endref)) elif ref: for r in utils.shell_split(ref.strip()): argv.append(r) elif head and amending and cached: argv.append(head) if filename: argv.append('--') if type(filename) is list: argv.extend(filename) else: argv.append(filename) start = False del_tag = 'deleted file mode ' headers = [] if filename is not None: deleted = cached and not os.path.exists(encode(filename)) else: deleted = False status, diffoutput = git.diff(R=reverse, M=True, cached=cached, with_status=True, *argv, **_common_diff_opts()) if status != 0: # git init if with_diff_header: return ('', '') else: return '' if diffoutput.startswith('Submodule'): if with_diff_header: return ('', diffoutput) else: return diffoutput output = StringIO() diff = core.decode(diffoutput).split('\n') for line in diff: if not start and '@@' == line[:2] and '@@' in line[2:]: start = True if start or (deleted and del_tag in line): output.write(encode(line) + '\n') else: if with_diff_header: headers.append(encode(line)) elif not suppress_header: output.write(encode(line) + '\n') result = core.decode(output.getvalue()) output.close() if with_diff_header: return('\n'.join(headers), result) else: return result
def renamed_files(start, end, git=git): difflines = git.diff('%s..%s' % (start, end), M=True, **_common_diff_opts()).splitlines() return [eval_path(r[12:].rstrip()) for r in difflines if r.startswith('rename from ')]
def sha1_diff(sha1, git=git): return core.decode(git.diff(sha1 + '^!', **_common_diff_opts()))