def test_diff_histories_added_start(self): """Testing diff_histories with a new history that adds commits at the start of the history """ old_history = [ DiffCommit(commit_id='r1'), DiffCommit(commit_id='r2'), ] new_history = [ DiffCommit(commit_id='r0'), DiffCommit(commit_id='r1'), DiffCommit(commit_id='r2'), ] expected_result = [ CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_REMOVED, old_commit=old_history[0]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_REMOVED, old_commit=old_history[1]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_ADDED, new_commit=new_history[0]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_ADDED, new_commit=new_history[1]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_ADDED, new_commit=new_history[2]), ] self.assertEqual(list(diff_histories(old_history, new_history)), expected_result)
def test_diff_histories_removed_middle(self): """Testing diff_histories with a new history that removes commits in the middle of the history """ old_history = [ DiffCommit(commit_id='r0'), DiffCommit(commit_id='r1'), DiffCommit(commit_id='r2'), ] new_history = [ DiffCommit(commit_id='r0'), DiffCommit(commit_id='r2'), ] expected_result = [ CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_UNMODIFIED, old_commit=old_history[0], new_commit=new_history[0]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_REMOVED, old_commit=old_history[1]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_REMOVED, old_commit=old_history[2]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_ADDED, new_commit=new_history[1]), ] self.assertEqual(list(diff_histories(old_history, new_history)), expected_result)
def test_diff_histories_identical(self): """Testing diff_histories with identical histories""" new_history = old_history = [ DiffCommit(commit_id='r0'), DiffCommit(commit_id='r1'), DiffCommit(commit_id='r2'), ] expected_result = [ CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_UNMODIFIED, old_commit=old_history[0], new_commit=new_history[0]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_UNMODIFIED, old_commit=old_history[1], new_commit=new_history[1]), CommitHistoryDiffEntry( entry_type=CommitHistoryDiffEntry.COMMIT_UNMODIFIED, old_commit=old_history[2], new_commit=new_history[2]), ] self.assertEqual(list(diff_histories(old_history, new_history)), expected_result)
def get_context_data(self, diffset, interdiffset, extra_context={}, **kwargs): """Calculates and returns data used for rendering the diff viewer. This handles all the hard work of generating the data backing the side-by-side diff, handling pagination, and more. The data is collected into a context dictionary and returned for rendering. """ try: filename_patterns = \ re.split(',+\s*', self.request.GET['filenames'].strip()) except KeyError: filename_patterns = [] base_commit_id = None base_commit = None tip_commit_id = None tip_commit = None commits_by_diffset_id = {} if diffset.commit_count > 0: diffset_pks = [diffset.pk] if interdiffset: diffset_pks.append(interdiffset.pk) commits = DiffCommit.objects.filter(diffset_id__in=diffset_pks) for commit in commits: commits_by_diffset_id.setdefault(commit.diffset_id, []).append( commit) # Base and tip commit selection is not supported in interdiffs. if not interdiffset: raw_base_commit_id = self.request.GET.get('base-commit-id') raw_tip_commit_id = self.request.GET.get('tip-commit-id') if raw_base_commit_id is not None: try: base_commit_id = int(raw_base_commit_id) except ValueError: pass if raw_tip_commit_id is not None: try: tip_commit_id = int(raw_tip_commit_id) except ValueError: pass base_commit, tip_commit = get_base_and_tip_commits( base_commit_id, tip_commit_id, commits=commits_by_diffset_id[diffset.pk]) files = get_diff_files(diffset=diffset, interdiffset=interdiffset, request=self.request, filename_patterns=filename_patterns, base_commit=base_commit, tip_commit=tip_commit) # Break the list of files into pages siteconfig = SiteConfiguration.objects.get_current() paginator = Paginator(files, siteconfig.get('diffviewer_paginate_by'), siteconfig.get('diffviewer_paginate_orphans')) page_num = int(self.request.GET.get('page', 1)) if self.request.GET.get('file', False): file_id = int(self.request.GET['file']) for i, f in enumerate(files): if f['filediff'].pk == file_id: page_num = i // paginator.per_page + 1 if page_num > paginator.num_pages: page_num = paginator.num_pages break try: page = paginator.page(page_num) except InvalidPage: page = paginator.page(paginator.num_pages) diff_context = { 'commits': None, 'commit_history_diff': None, 'filename_patterns': list(filename_patterns), 'revision': { 'revision': diffset.revision, 'is_interdiff': interdiffset is not None, 'interdiff_revision': (interdiffset.revision if interdiffset else None), }, 'pagination': { 'is_paginated': page.has_other_pages(), 'current_page': page.number, 'pages': paginator.num_pages, 'page_numbers': paginator.page_range, 'has_next': page.has_next(), 'has_previous': page.has_previous(), }, } if page.has_next(): diff_context['pagination']['next_page'] = page.next_page_number() if page.has_previous(): diff_context['pagination']['previous_page'] = \ page.previous_page_number() if diffset.commit_count > 0: if interdiffset: diff_context['commit_history_diff'] = [ entry.serialize() for entry in diff_histories( commits_by_diffset_id[diffset.pk], commits_by_diffset_id[interdiffset.pk]) ] all_commits = [ commit for pk in commits_by_diffset_id for commit in commits_by_diffset_id[pk] ] diff_context['commits'] = [ commit.serialize() for commit in sorted(all_commits, key=lambda commit: commit.pk) ] revision_context = diff_context['revision'] revision_context.update({ 'base_commit_id': base_commit_id, 'tip_commit_id': tip_commit_id, }) context = dict({ 'diff_context': diff_context, 'diffset': diffset, 'interdiffset': interdiffset, 'diffset_pair': (diffset, interdiffset), 'files': page.object_list, 'collapseall': self.collapse_diffs, }, **extra_context) return context