-
Notifications
You must be signed in to change notification settings - Fork 3
Semester report
Anton Lamtev edited this page Jul 11, 2020
·
21 revisions
- Авторизация через GitHub
- OAuth2 GitHub access token хранится в БД
- JSON Web Token используется для идентификации клиента сервером (модель c short lifetime access_token и long-lived refresh_token)
- Создание проекта с помощью ссылки на GitHub репозиторий
- Проверка прав на создание (только админскими+ правами в GitHub репозитории можно создавать проект в нашем сервисе)
- Подтягивание существующих PR
- Установка web-хука, который срабатывает при обновлении PR
- Обработка на сервере web-хука, с последующими обновлением данных в БД и запуском детектирования клонов. Информация о клонах так же помещается в БД.
- Отображение на главной странице созданных проектов
- Отображение списка PR для каждого из проектов (в порядке убывания даты обновления)
- Для каждого PR можно посмотреть
- Сводную информацию
- Дифф (Исходный код загружается с помощью JGit)
- Найденных клонов (Клоны ищутся с помощью сжатого суффиксного дерева А. Сухинина)
- Дифф с другим PR из этого проекта
- Для read-only доступа авторизация не требуется
- Конфигурирование отслеживаемых репозиториев
- Извлечение исходного кода потенциальных кандидатов из решений прошлых лет
- Определение степени заимствований между кандидатами и исследуемым PR
- Ранжирование источников заимствований
- Формирование отчёта о заимствованиях (пока только список клонов в виде диффа)
- Публикация отчёта в PR
- Аналитический отчет
- Граф pull request’ов с метаинформацией и весами дуг-заимствований (есть наработки на стороне UI)
- Diff по клику на дугу
- Отсутствие возможности поиска клонов "по кнопке", а также при создании проекта для уже существующих ПР.
- При постановке детектору клонов задачи, в качестве источников поиска клонов ему передаются файлы, которые находятся в репозиториях с состоянием коммитов, которые соответствуют Пулл-реквестам, обновленным раньше исследуемого на плагиат. То есть не происходит поиск клонов среди промежуточных коммитов пулл-реквестов.
- Повторный запуск клон детектора не является идемпотентной операцией, то есть дубликаты клонов будут записываться в БД
- Суффиксное дерево строится каждый раз заново на каждый триггер веб хуком. Количество используемой памяти тут никак не контролируется. Более того это так же неэффективно по времени. Наверное, стоит иметь по 1 суффиксному дереву на 1 проект
- Дифф между 2 ПР часто бесполезен, т.к. плохо распознает переименования/перемещения.
- Мы используем JGit, который не дает возможности гибкой настройки
- unix git позволяет указывать пороговое значение для обнаружения переименований, надо будет попробовать с ним. Кажется, должно сработать
- Обзор GitHub API - страница на wiki
- В том числе был рассмотрен GraphQL API, но он не вошел в обзор, т.к. "не обеспечивал получение нужных данных"
- Изучение Java, Spring, Webflux
- Изучение JGit, решение множества возникших с ним проблем
- Невлитый в develop PR "Pull-requests parser"
- В теории - обработка веб хука и выполнение запросов к GitHub API для получения данных об PR без сохранения в БД, а также загрузка захардкоженых файлов с помощью JGit без дальшейших действий с ними.
- 313 ++ | 5 --
- Не все замечания инспекций Code-climate исправлены
- Не все замечания от коллег исправлены
- 19 коммитов с 16 апреля по 27 мая
- Перед промежуточным дедлайном заявленная в этом ПР функциональность была реализована другим разработчиком
- За семестр затрачено 90+ часов на проект
- Выбор технологического стека для фронтенда - wiki
- Изучение выбранных для фронтенда технологий (React, ts..)
- Создание базового React-приложения - PR
- Фронтенд для авторизации + небольшие доработки на стороне бекенда для интеграции - PR
- Фронтенд для отображения информации о пользователях + рефакторинг - PR
- Фронтенд для создания и отображения проектов + небольшая доработка на стороне бекенда для интеграции - PR
- Модуль загрузки исходного кода из гит репозитория с помощью JGit на бекенде - PR
- Фронтенд для отображения пулл-реквестов + небольшая доработка на стороне бекенда для интеграции - PR
- Примитивный клон детектор и триггер детектора по веб хуку на бекенде - PR
- Дифф на бекенде, отображение диффа и клонов на фронтенде - PR
- Добавление хука при создании проекта на бекенде - PR
- Фронтенд для диффа между 2-мя ПР - PR
- Написание Dockerfile и docker-compose.yml для развертывания приложения
- 18 commits | 27,943 ++ (~15,000 ++ without
yarn.lock
) | 7,467 -- (коммиты - это мерджи ПР со сквошем всех коммитов: добавления/удаления относительно основной ветки) - Затраченное время не отслеживалось, трудно оценить. Но много)
- Изучение предметной области Code Clone Detection
- Чтение отечественных и иностранных публикаций
- Обсуждение деталей с М.Х. Ахиным
- Изучение СД "Суффиксное дерево", алгоритмов эффективного построения (алгоритм Укконена)
- Невлитая ветка с модулем простой токенизации кода на языке Java 8 (с помощью Antlr4) - Branch
- 347 ++ | 1 --
- Невлитый PR "Project creation based on GitHub repo"
- Создание проекта для репозитория
- 342 ++ | 9 --
- Не все замечания инспекций Code-climate исправлены
- Функциональность реализована не полностью, были замечания по коду
- Не хватило опыта в Webflux и Reactor для доведения PR до mergeable состояния за адекватное время, поэтому задача была передана другому разработчику. Переключился на свою основную задачу - детектор клонов с помощью суффиксного дерева.
- Разработка клон детектора на основе суффиксного дерева
- Изучение реализации сжатого суффиксного дерева А. Сухинина
- Изучение реализации плагина для Intellij Idea А. Сухинина
- Модификация кода плагина для использования в качестве клон детектора - Repo
- ~130 ++ | 2500 -- (изменения относительно исходного кода Сухинина)
- Разработка тестовой клиентской программы, использующей клон детектор на основе суффиксного дерева - Branch
- постпроцессинг клонов из дерева для сопоставления с участками файлов исходного кода
- ~1000 ++ | ~250 -- (изменения по всем коммитам суммарно)
- Интеграция клон детектора в основное приложение - Branch
- ~ 300 ++
- Затраченное время:
На какой то неделе тратил все время на аккулу, на какой то - вообще не прикасался
- Выбор технологического стека для бекенда - Wiki
- Создание базового Gradle + Spring Boot Webflux проекта - PR
- Настройка CI с прогоном тестов средствами GitHub Actions - PR
- Автоматизация подсчета покрытия кода тестами (JaCoCo, Codecov.io, GitHub actions) - PR
- Автоматизация статического анализа кода (codeclimate.io, pmd, sonar, checkstyle) - PR
- Авторизация и вход с помощью GitHub аккаунта (без пароля, OAuth2, JWT, Elliptic curves signature) - PR1 PR2
- Реализация Http метода, возвращающего информацию о пользователе - PR
- Релизация CRUD для проектов - PR
- Подготовка бекенда к развертыванию - PR
- Реализация АПИ с пулл реквестами (все GET методы ходят за информацией об ПР на GitHub, в БД многое не сохраняется) - PR
- Обработчик GitHub веб-хука - PR
- Реализация метода для отдачи клонов из БД - PR
- Некоторые доработки и фиксы - PR1 PR2 PR3 PR4 PR5 PR6 PR7
- Полное переосмысление модели данных, нормализация БД, оптимизация количества запросов в БД, сохранение всей необходимой инофрмации в БД - PR1 PR2
- Дифф между 2-мя ПР - PR
- Ускорение и оптимизация загрузчика кода - PR1 PR2
- 26 commits | 8,726 ++ | 3,276 --
- Полистал книгу по Antlr4, разобрался более менее как разбивать java код на токены с помощью этой библиотеки
- Изучение предметной области обнаружения клонов в коде
- изучение СД Бор (Trie), Суффиксного дерева, Сжатого СД, алгоритма Укконена
- изучения принципа поиска клонов с помощью Сжатого СД
- Потратил на это пару-тройку вечеров (~ 10 часов)
- Затраченное время: много
- Формирование первоначальной модели данных - Wiki
- Добавление Spring Security в проект с авторизацией через пароль (заглушка - захардкоженные пользователи) - PR
- 155 ++ | 2 --
- Изучение предметной области Code Clone Detection (CCD)
- чтение научных публикаций о CCD
- изучение Индекса Жаккарда
- изучение Суффиксного дерева (в том числе реализации А. Сухинина)
- Рассмотрение Antlr4 для токенизации испходного кода
- Реализация утилиты-примера с клон-детектором на основе индекса Жаккарда - PR
- Start file stream from all PR in the repository.
- Parse it using ANTLR (Java grammar) and build AST.
- Using the Jaccard index look for similarities in the AST nodes.
- Calculate metrics.
- 2244 ++ | 4 --
- Реализация полноценной токенизации кода на Java 9 (с анонимизацией) - Branch
- ~ 500 ++
- Интеграция токенизации в основное приложение - Branch
- ~ 200 ++
- Затраченное время: ~ 40 часов