Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
    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