Skip to content

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 ПР часто бесполезен, т.к. плохо распознает переименования/перемещения.

Кто что делал

Гапоненко Дарья

  1. Обзор GitHub API - страница на wiki
    • В том числе был рассмотрен GraphQL API, но он не вошел в обзор, т.к. "не обеспечивал получение нужных данных"
  2. Изучение Java, Spring, Webflux
  3. Изучение JGit, решение множества возникших с ним проблем
  4. Невлитый в develop PR "Pull-requests parser"
    • В теории - обработка веб хука и выполнение запросов к GitHub API для получения данных об PR без сохранения в БД, а также загрузка захардкоженых файлов с помощью JGit без дальшейших действий с ними.
    • 313 ++ | 5 --
    • Не все замечания инспекций Code-climate исправлены
    • Не все замечания от коллег исправлены
    • 19 коммитов с 16 апреля по 27 мая
    • Перед промежуточным дедлайном заявленная в этом ПР функциональность была реализована другим разработчиком
  5. За семестр затрачено 90+ часов на проект

Дьячков Вадим

  1. Выбор технологического стека для фронтенда - wiki
  2. Изучение выбранных для фронтенда технологий (React, ts..)
  3. Создание базового React-приложения - PR
  4. Фронтенд для авторизации + небольшие доработки на стороне бекенда для интеграции - PR
  5. Фронтенд для отображения информации о пользователях + рефакторинг - PR
  6. Фронтенд для создания и отображения проектов + небольшая доработка на стороне бекенда для интеграции - PR
  7. Модуль загрузки исходного кода из гит репозитория с помощью JGit на бекенде - PR
  8. Фронтенд для отображения пулл-реквестов + небольшая доработка на стороне бекенда для интеграции - PR
  9. Примитивный клон детектор и триггер детектора по веб хуку на бекенде - PR
  10. Дифф на бекенде, отображение диффа и клонов на фронтенде - PR
  11. Добавление хука при создании проекта на бекенде - PR
  12. Фронтенд для диффа между 2-мя ПР - PR
  13. Написание Dockerfile и docker-compose.yml для развертывания приложения
  14. 18 commits | 27,943 ++ (~15,000 ++ without yarn.lock) | 7,467 -- (коммиты - это мерджи ПР со сквошем всех коммитов: добавления/удаления относительно основной ветки)
  15. Затраченное время не отслеживалось, трудно оценить. Но много)

Крылов Иван

  1. Изучение предметной области Code Clone Detection
    • Чтение отечественных и иностранных публикаций
    • Обсуждение деталей с М.Х. Ахиным
    • Изучение СД "Суффиксное дерево", алгоритмов эффективного построения (алгоритм Укконена)
  2. Невлитая ветка с модулем простой токенизации кода на языке Java 8 (с помощью Antlr4) - Branch
    • 347 ++ | 1 --
  3. Невлитый PR "Project creation based on GitHub repo"
    • Создание проекта для репозитория
    • 342 ++ | 9 --
    • Не все замечания инспекций Code-climate исправлены
    • Функциональность реализована не полностью, были замечания по коду
    • Не хватило опыта в Webflux и Reactor для доведения PR до mergeable состояния за адекватное время, поэтому задача была передана другому разработчику. Переключился на свою основную задачу - детектор клонов с помощью суффиксного дерева.
  4. Разработка клон детектора на основе суффиксного дерева
    • Изучение реализации сжатого суффиксного дерева А. Сухинина
    • Изучение реализации плагина для Intellij Idea А. Сухинина
    • Модификация кода плагина для использования в качестве клон детектора - Repo
      • ~130 ++ | 2500 -- (изменения относительно исходного кода Сухинина)
  5. Разработка тестовой клиентской программы, использующей клон детектор на основе суффиксного дерева - Branch
    • постпроцессинг клонов из дерева для сопоставления с участками файлов исходного кода
    • ~1000 ++ | ~250 -- (изменения по всем коммитам суммарно)
  6. Интеграция клон детектора в основное приложение - Branch
    • ~ 300 ++
  7. Затраченное время:

На какой то неделе тратил все время на аккулу, на какой то - вообще не прикасался

Ламтев Антон

  1. Выбор технологического стека для бекенда - Wiki
  2. Создание базового Gradle + Spring Boot Webflux проекта - PR
  3. Настройка CI с прогоном тестов средствами GitHub Actions - PR
  4. Автоматизация подсчета покрытия кода тестами (JaCoCo, Codecov.io, GitHub actions) - PR
  5. Автоматизация статического анализа кода (codeclimate.io, pmd, sonar, checkstyle) - PR
  6. Авторизация и вход с помощью GitHub аккаунта (без пароля, OAuth2, JWT, Elliptic curves signature) - PR1 PR2
  7. Реализация Http метода, возвращающего информацию о пользователе - PR
  8. Релизация CRUD для проектов - PR
  9. Подготовка бекенда к развертыванию - PR
  10. Реализация АПИ с пулл реквестами (все GET методы ходят за информацией об ПР на GitHub, в БД многое не сохраняется) - PR
  11. Обработчик GitHub веб-хука - PR
  12. Реализация метода для отдачи клонов из БД - PR
  13. Некоторые доработки и фиксы - PR1 PR2 PR3 PR4 PR5 PR6 PR7
  14. Полное переосмысление модели данных, нормализация БД, оптимизация количества запросов в БД, сохранение всей необходимой инофрмации в БД - PR1 PR2
  15. Дифф между 2-мя ПР - PR
  16. Ускорение и оптимизация загрузчика кода - PR1 PR2
  17. 26 commits | 8,726 ++ | 3,276 --
  18. Полистал книгу по Antlr4, разобрался более менее как разбивать java код на токены с помощью этой библиотеки
  19. Изучение предметной области обнаружения клонов в коде
    • изучение СД Бор (Trie), Суффиксного дерева, Сжатого СД, алгоритма Укконена
    • изучения принципа поиска клонов с помощью Сжатого СД
    • Потратил на это пару-тройку вечеров (~ 10 часов)
  20. Затраченное время: много

Ширяев Марк

  1. Формирование первоначальной модели данных - Wiki
  2. Добавление Spring Security в проект с авторизацией через пароль (заглушка - захардкоженные пользователи) - PR
    • 155 ++ | 2 --
  3. Изучение предметной области Code Clone Detection (CCD)
    • чтение научных публикаций о CCD
    • изучение Индекса Жаккарда
    • изучение Суффиксного дерева (в том числе реализации А. Сухинина)
  4. Рассмотрение Antlr4 для токенизации испходного кода
  5. Реализация утилиты-примера с клон-детектором на основе индекса Жаккарда - 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 --
  6. Реализация полноценной токенизации кода на Java 9 (с анонимизацией) - Branch
    • ~ 500 ++
  7. Интеграция токенизации в основное приложение - Branch
    • ~ 200 ++
  8. Затраченное время: ~ 40 часов