def raw_changeset(self, revision): method = request.GET.get('diff', 'show') try: c.scm_type = c.rhodecode_repo.alias c.changeset = c.rhodecode_repo.get_changeset(revision) except RepositoryError: log.error(traceback.format_exc()) return redirect(url('home')) else: try: c.changeset_parent = c.changeset.parents[0] except IndexError: c.changeset_parent = None c.changes = [] for node in c.changeset.added: filenode_old = FileNode(node.path, '') if filenode_old.is_binary or node.is_binary: diff = _('binary file') + '\n' else: f_gitdiff = differ.get_gitdiff(filenode_old, node) diff = differ.DiffProcessor(f_gitdiff, format='gitdiff').raw_diff() cs1 = None cs2 = node.last_changeset.raw_id c.changes.append(('added', node, diff, cs1, cs2)) for node in c.changeset.changed: filenode_old = c.changeset_parent.get_node(node.path) if filenode_old.is_binary or node.is_binary: diff = _('binary file') else: f_gitdiff = differ.get_gitdiff(filenode_old, node) diff = differ.DiffProcessor(f_gitdiff, format='gitdiff').raw_diff() cs1 = filenode_old.last_changeset.raw_id cs2 = node.last_changeset.raw_id c.changes.append(('changed', node, diff, cs1, cs2)) response.content_type = 'text/plain' if method == 'download': response.content_disposition = 'attachment; filename=%s.patch' \ % revision c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id for x in c.changeset.parents]) c.diffs = '' for x in c.changes: c.diffs += x[2] return render('changeset/raw_changeset.html')
def raw_changeset(self, revision): method = request.GET.get("diff", "show") try: c.scm_type = c.rhodecode_repo.alias c.changeset = c.rhodecode_repo.get_changeset(revision) except RepositoryError: log.error(traceback.format_exc()) return redirect(url("home")) else: try: c.changeset_parent = c.changeset.parents[0] except IndexError: c.changeset_parent = None c.changes = [] for node in c.changeset.added: filenode_old = FileNode(node.path, "") if filenode_old.is_binary or node.is_binary: diff = _("binary file") + "\n" else: f_gitdiff = differ.get_gitdiff(filenode_old, node) diff = differ.DiffProcessor(f_gitdiff, format="gitdiff").raw_diff() cs1 = None cs2 = node.last_changeset.raw_id c.changes.append(("added", node, diff, cs1, cs2)) for node in c.changeset.changed: filenode_old = c.changeset_parent.get_node(node.path) if filenode_old.is_binary or node.is_binary: diff = _("binary file") else: f_gitdiff = differ.get_gitdiff(filenode_old, node) diff = differ.DiffProcessor(f_gitdiff, format="gitdiff").raw_diff() cs1 = filenode_old.last_changeset.raw_id cs2 = node.last_changeset.raw_id c.changes.append(("changed", node, diff, cs1, cs2)) response.content_type = "text/plain" if method == "download": response.content_disposition = "attachment; filename=%s.patch" % revision c.parent_tmpl = "".join(["# Parent %s\n" % x.raw_id for x in c.changeset.parents]) c.diffs = "" for x in c.changes: c.diffs += x[2] return render("changeset/raw_changeset.html")
def test_log_command(self): commits = [self.repo.get_changeset(r) for r in self.repo.revisions] commit1, commit2, commit3 = commits old = commit1.get_node('file1') new = commit2.get_node('file1') result = get_gitdiff(old, new).splitlines() # there are small differences between git and hg output so we explicitly # check only few things self.assertEqual(result[0], 'diff --git a/file1 b/file1') self.assertIn('-Foobar', result) self.assertIn('+...', result)
def show_diff(old_node, new_node): diff = get_gitdiff(old_node, new_node) self.stdout.write(u''.join(diff))
def diff(self, repo_name, f_path): diff1 = request.GET.get('diff1') diff2 = request.GET.get('diff2') c.action = request.GET.get('diff') c.no_changes = diff1 == diff2 c.f_path = f_path c.big_diff = False try: if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]: c.changeset_1 = c.rhodecode_repo.get_changeset(diff1) node1 = c.changeset_1.get_node(f_path) else: c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo) node1 = FileNode('.', '', changeset=c.changeset_1) if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]: c.changeset_2 = c.rhodecode_repo.get_changeset(diff2) node2 = c.changeset_2.get_node(f_path) else: c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo) node2 = FileNode('.', '', changeset=c.changeset_2) except RepositoryError: return redirect(url('files_home', repo_name=c.repo_name, f_path=f_path)) if c.action == 'download': diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2), format='gitdiff') diff_name = '%s_vs_%s.diff' % (diff1, diff2) response.content_type = 'text/plain' response.content_disposition = 'attachment; filename=%s' \ % diff_name return diff.raw_diff() elif c.action == 'raw': diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2), format='gitdiff') response.content_type = 'text/plain' return diff.raw_diff() elif c.action == 'diff': if node1.is_binary or node2.is_binary: c.cur_diff = _('Binary file') elif node1.size > self.cut_off_limit or \ node2.size > self.cut_off_limit: c.cur_diff = '' c.big_diff = True else: diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2), format='gitdiff') c.cur_diff = diff.as_html() else: #default option if node1.is_binary or node2.is_binary: c.cur_diff = _('Binary file') elif node1.size > self.cut_off_limit or \ node2.size > self.cut_off_limit: c.cur_diff = '' c.big_diff = True else: diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2), format='gitdiff') c.cur_diff = diff.as_html() if not c.cur_diff and not c.big_diff: c.no_changes = True return render('files/file_diff.html')