Skip to content

Commit d3ce88b

Browse files
authored
Merge pull request #3371 from SwiftPackageIndex/add-forked-from-ui
Add forked from feature UI
2 parents c1eeb17 + c9fa38c commit d3ce88b

17 files changed

+250
-11
lines changed

FrontEnd/styles/images.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
--image-download: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzJmMmYyZiI+PHBhdGggZD0ibTM3LjkzIDI1LjAxLTIuOTgtNC4wMS03LjQ1IDUuNTN2LTIzLjA5aC01djIzLjA5bC03LjQ1LTUuNTMtMi45OCA0LjAxIDEyLjkzIDkuNjF6Ii8+PHBhdGggZD0ibTQyLjMxIDMzLjA5djguNDdoLTM0LjYydi04LjQ3aC01djEzLjQ3aDQ0LjYydi0xMy40N3oiLz48L2c+PC9zdmc+');
3535
--image-error: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTI1IDFjLTEzLjI1IDAtMjQgMTAuNzUtMjQgMjRzMTAuNzUgMjQgMjQgMjQgMjQtMTAuNzUgMjQtMjQtMTAuNzUtMjQtMjQtMjR6bTIuNjYgMzYuMThjLS42NC41OS0xLjUzLjg5LTIuNjguODlzLTIuMDctLjMtMi43Mi0uODktLjk4LTEuNDItLjk4LTIuNDcuMzItMS45Ljk1LTIuNDkgMS41NS0uODkgMi43Ni0uODkgMi4xLjMgMi43Mi44OWMuNjEuNTkuOTIgMS40Mi45MiAyLjQ5cy0uMzIgMS44OC0uOTYgMi40N3ptLjI0LTguNjJoLTUuOGwtLjktMTYuNjNoNy41OWwtLjkgMTYuNjN6IiBmaWxsPSIjYzQ0Ii8+PC9zdmc+');
3636
--image-executables: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTI1IDFjLTEzLjI1IDAtMjQgMTAuNzUtMjQgMjRzMTAuNzUgMjQgMjQgMjQgMjQtMTAuNzUgMjQtMjQtMTAuNzUtMjQtMjQtMjR6bS0xMi45NCAzMy45NSA3LjM5LTkuOTUtNy4zOS05Ljk1IDQuMDEtMi45OCA5LjYxIDEyLjkzLTkuNjEgMTIuOTN6bTI0Ljg4IDMuODNoLTEyLjV2LTVoMTIuNXoiIGZpbGw9IiMyZjJmMmYiLz48L3N2Zz4=');
37+
--image-fork: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQzLjUgMTEuODdjMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAyLjkxLTYuNSA2LjVjMCAyLjQgMS4zMSA0LjUgMy4yNSA1LjYydjExLjM3bC0yMC4xNiA1Ljg1IDEuODEgNi4yNCAyNC44NS03LjIxdi0xNi4yNWMxLjk0LTEuMTIgMy4yNS0zLjIyIDMuMjUtNS42MnoiIGZpbGw9IiMyYjJiMmIiLz48cGF0aCBkPSJtMjIuNSAzNy45M2MwLTMuMjYtMS45NS02LjA2LTQuNzUtNy4zMXYtMjkuNjJoLTYuNXYyOS42M2MtMi44IDEuMjUtNC43NSA0LjA1LTQuNzUgNy4zMXMxLjk1IDYuMDYgNC43NSA3LjMxdjMuNzZoNi41di0zLjc2YzIuOC0xLjI1IDQuNzUtNC4wNSA0Ljc1LTcuMzF6IiBmaWxsPSIjNmI2YjZiIi8+PC9zdmc+');
3738
--image-ghcta-header: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDUwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yNSAxLjU5Yy0xMy4yNSAwLTI0IDEwLjc1LTI0IDI0IDAgMTAuNiA2Ljg4IDE5LjYgMTYuNDEgMjIuNzcgMS4yLjIyIDEuNjQtLjUyIDEuNjQtMS4xNiAwLS41Ny0uMDItMi4wOC0uMDMtNC4wOC02LjY4IDEuNDUtOC4wOC0zLjIyLTguMDgtMy4yMi0xLjA5LTIuNzctMi42Ni0zLjUxLTIuNjYtMy41MS0yLjE4LTEuNDkuMTYtMS40Ni4xNi0xLjQ2IDIuNDEuMTcgMy42OCAyLjQ3IDMuNjggMi40NyAyLjE0IDMuNjcgNS42MiAyLjYxIDYuOTggMS45OS4yMi0xLjU1Ljg0LTIuNjEgMS41Mi0zLjIxLTUuMzMtLjYxLTEwLjkzLTIuNjYtMTAuOTMtMTEuODYgMC0yLjYyLjk0LTQuNzYgMi40Ny02LjQ0LS4yNS0uNjEtMS4wNy0zLjA1LjI0LTYuMzUgMCAwIDIuMDItLjY1IDYuNiAyLjQ2IDEuOTEtLjUzIDMuOTctLjggNi4wMS0uODEgMi4wNCAwIDQuMDkuMjggNi4wMS44MSA0LjU4LTMuMTEgNi41OS0yLjQ2IDYuNTktMi40NiAxLjMxIDMuMy40OSA1Ljc0LjI0IDYuMzUgMS41NCAxLjY4IDIuNDcgMy44MiAyLjQ3IDYuNDQgMCA5LjIyLTUuNjEgMTEuMjUtMTAuOTYgMTEuODQuODYuNzQgMS42MyAyLjIxIDEuNjMgNC40NCAwIDMuMjEtLjAzIDUuOC0uMDMgNi41OCAwIC42NC40MyAxLjM5IDEuNjUgMS4xNSA5LjUzLTMuMTggMTYuNC0xMi4xNyAxNi40LTIyLjc3IDAtMTMuMjYtMTAuNzUtMjQtMjQtMjR6IiBmaWxsPSIjMmYyZjJmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48Y2lyY2xlIGN4PSI5NSIgY3k9IjI1IiBmaWxsPSIjMmYyZjJmIiByPSIyNCIvPjxwYXRoIGQ9Im0xMDIuNjIgMTMuNTFjLTMuMTctLjItNS45OSAxLjMzLTcuNjIgMy43My0xLjY0LTIuNC00LjQ2LTMuOTMtNy42Mi0zLjczLTQuODEuMy04LjM0IDQuNzYtNy45NyA5LjU2LjE5IDIuNDcgMS41NCA3LjIzIDExLjE5IDEzLjQ3bDQuNCAyLjg1IDQuNC0yLjg1YzkuNjQtNi4yMyAxMS0xMSAxMS4xOS0xMy40Ny4zNy00LjgtMy4xNi05LjI2LTcuOTctOS41NnoiIGZpbGw9IiNmNDRlYjIiLz48cGF0aCBkPSJtNTQuNDMgMjMuN2g0LjI2di0zLjk1aDIuNjF2My45NWg0LjI3djIuNjJoLTQuMjd2My45NGgtMi42MXYtMy45NGgtNC4yNnoiIGZpbGw9IiMyZjJmMmYiLz48L3N2Zz4=');
3839
--image-github: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTI1IDEuNTljLTEzLjI1IDAtMjQgMTAuNzUtMjQgMjQgMCAxMC42IDYuODggMTkuNiAxNi40MSAyMi43NyAxLjIuMjIgMS42NC0uNTIgMS42NC0xLjE2IDAtLjU3LS4wMi0yLjA4LS4wMy00LjA4LTYuNjggMS40NS04LjA4LTMuMjItOC4wOC0zLjIyLTEuMDktMi43Ny0yLjY2LTMuNTEtMi42Ni0zLjUxLTIuMTgtMS40OS4xNi0xLjQ2LjE2LTEuNDYgMi40MS4xNyAzLjY4IDIuNDcgMy42OCAyLjQ3IDIuMTQgMy42NyA1LjYyIDIuNjEgNi45OCAxLjk5LjIyLTEuNTUuODQtMi42MSAxLjUyLTMuMjEtNS4zMy0uNjEtMTAuOTMtMi42Ni0xMC45My0xMS44NiAwLTIuNjIuOTQtNC43NiAyLjQ3LTYuNDQtLjI1LS42MS0xLjA3LTMuMDUuMjQtNi4zNSAwIDAgMi4wMi0uNjUgNi42IDIuNDYgMS45MS0uNTMgMy45Ny0uOCA2LjAxLS44MSAyLjA0IDAgNC4wOS4yOCA2LjAxLjgxIDQuNTgtMy4xMSA2LjU5LTIuNDYgNi41OS0yLjQ2IDEuMzEgMy4zLjQ5IDUuNzQuMjQgNi4zNSAxLjU0IDEuNjggMi40NyAzLjgyIDIuNDcgNi40NCAwIDkuMjItNS42MSAxMS4yNS0xMC45NiAxMS44NC44Ni43NCAxLjYzIDIuMjEgMS42MyA0LjQ0IDAgMy4yMS0uMDMgNS44LS4wMyA2LjU4IDAgLjY0LjQzIDEuMzkgMS42NSAxLjE1IDkuNTMtMy4xOCAxNi40LTEyLjE3IDE2LjQtMjIuNzcgMC0xMy4yNi0xMC43NS0yNC0yNC0yNHoiIGZpbGw9IiMyZjJmMmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==');
3940
--image-heart: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTM2LjgyIDQuOTZjLTQuOTEtLjMxLTkuMjggMi4wNi0xMS44MiA1Ljc4LTIuNTQtMy43Mi02LjkxLTYuMDktMTEuODItNS43OC03LjQ1LjQ2LTEyLjkzIDcuMzctMTIuMzUgMTQuODIuMjkgMy44MyAyLjM5IDExLjIxIDE3LjM1IDIwLjg4bDYuODMgNC40MSA2LjgzLTQuNDFjMTQuOTUtOS42NiAxNy4wNS0xNy4wNSAxNy4zNS0yMC44OC41Ny03LjQ0LTQuOS0xNC4zNS0xMi4zNS0xNC44MnoiIGZpbGw9IiNmNDRlYjIiLz48L3N2Zz4=');
@@ -73,6 +74,7 @@
7374
--image-download: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2YxZjFmMSI+PHBhdGggZD0ibTM3LjkzIDI1LjAxLTIuOTgtNC4wMS03LjQ1IDUuNTN2LTIzLjA5aC01djIzLjA5bC03LjQ1LTUuNTMtMi45OCA0LjAxIDEyLjkzIDkuNjF6Ii8+PHBhdGggZD0ibTQyLjMxIDMzLjA5djguNDdoLTM0LjYydi04LjQ3aC01djEzLjQ3aDQ0LjYydi0xMy40N3oiLz48L2c+PC9zdmc+');
7475
--image-error: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTI1IDFjLTEzLjI1IDAtMjQgMTAuNzUtMjQgMjRzMTAuNzUgMjQgMjQgMjQgMjQtMTAuNzUgMjQtMjQtMTAuNzUtMjQtMjQtMjR6bTIuNjYgMzYuMThjLS42NC41OS0xLjUzLjg5LTIuNjguODlzLTIuMDctLjMtMi43Mi0uODktLjk4LTEuNDItLjk4LTIuNDcuMzItMS45Ljk1LTIuNDkgMS41NS0uODkgMi43Ni0uODkgMi4xLjMgMi43Mi44OWMuNjEuNTkuOTIgMS40Mi45MiAyLjQ5cy0uMzIgMS44OC0uOTYgMi40N3ptLjI0LTguNjJoLTUuOGwtLjktMTYuNjNoNy41OWwtLjkgMTYuNjN6IiBmaWxsPSIjZmY0MzQzIi8+PC9zdmc+');
7576
--image-executables: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTI1IDFjLTEzLjI1IDAtMjQgMTAuNzUtMjQgMjRzMTAuNzUgMjQgMjQgMjQgMjQtMTAuNzUgMjQtMjQtMTAuNzUtMjQtMjQtMjR6bS0xMi45NCAzMy45NSA3LjM5LTkuOTUtNy4zOS05Ljk1IDQuMDEtMi45OCA5LjYxIDEyLjkzLTkuNjEgMTIuOTN6bTI0Ljg4IDMuODNoLTEyLjV2LTVoMTIuNXoiIGZpbGw9IiNmMWYxZjEiLz48L3N2Zz4=');
77+
--image-fork: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQzLjUgMTEuODdjMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAyLjkxLTYuNSA2LjVjMCAyLjQgMS4zMSA0LjUgMy4yNSA1LjYydjExLjM3bC0yMC4xNiA1Ljg1IDEuODEgNi4yNCAyNC44NS03LjIxdi0xNi4yNWMxLjk0LTEuMTIgMy4yNS0zLjIyIDMuMjUtNS42MnoiIGZpbGw9IiNmMWYxZjEiLz48cGF0aCBkPSJtMjIuNSAzNy45M2MwLTMuMjYtMS45NS02LjA2LTQuNzUtNy4zMXYtMjkuNjJoLTYuNXYyOS42M2MtMi44IDEuMjUtNC43NSA0LjA1LTQuNzUgNy4zMXMxLjk1IDYuMDYgNC43NSA3LjMxdjMuNzZoNi41di0zLjc2YzIuOC0xLjI1IDQuNzUtNC4wNSA0Ljc1LTcuMzF6IiBmaWxsPSIjYjFiMWIxIi8+PC9zdmc+');
7678
--image-ghcta-header: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDUwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yNSAxLjU5Yy0xMy4yNSAwLTI0IDEwLjc1LTI0IDI0IDAgMTAuNiA2Ljg4IDE5LjYgMTYuNDEgMjIuNzcgMS4yLjIyIDEuNjQtLjUyIDEuNjQtMS4xNiAwLS41Ny0uMDItMi4wOC0uMDMtNC4wOC02LjY4IDEuNDUtOC4wOC0zLjIyLTguMDgtMy4yMi0xLjA5LTIuNzctMi42Ni0zLjUxLTIuNjYtMy41MS0yLjE4LTEuNDkuMTYtMS40Ni4xNi0xLjQ2IDIuNDEuMTcgMy42OCAyLjQ3IDMuNjggMi40NyAyLjE0IDMuNjcgNS42MiAyLjYxIDYuOTggMS45OS4yMi0xLjU1Ljg0LTIuNjEgMS41Mi0zLjIxLTUuMzMtLjYxLTEwLjkzLTIuNjYtMTAuOTMtMTEuODYgMC0yLjYyLjk0LTQuNzYgMi40Ny02LjQ0LS4yNS0uNjEtMS4wNy0zLjA1LjI0LTYuMzUgMCAwIDIuMDItLjY1IDYuNiAyLjQ2IDEuOTEtLjUzIDMuOTctLjggNi4wMS0uODEgMi4wNCAwIDQuMDkuMjggNi4wMS44MSA0LjU4LTMuMTEgNi41OS0yLjQ2IDYuNTktMi40NiAxLjMxIDMuMy40OSA1Ljc0LjI0IDYuMzUgMS41NCAxLjY4IDIuNDcgMy44MiAyLjQ3IDYuNDQgMCA5LjIyLTUuNjEgMTEuMjUtMTAuOTYgMTEuODQuODYuNzQgMS42MyAyLjIxIDEuNjMgNC40NCAwIDMuMjEtLjAzIDUuOC0uMDMgNi41OCAwIC42NC40MyAxLjM5IDEuNjUgMS4xNSA5LjUzLTMuMTggMTYuNC0xMi4xNyAxNi40LTIyLjc3IDAtMTMuMjYtMTAuNzUtMjQtMjQtMjR6IiBmaWxsPSIjZjFmMWYxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48Y2lyY2xlIGN4PSI5NSIgY3k9IjI1IiBmaWxsPSIjZjFmMWYxIiByPSIyNCIvPjxwYXRoIGQ9Im0xMDIuNjIgMTMuNTFjLTMuMTctLjItNS45OSAxLjMzLTcuNjIgMy43My0xLjY0LTIuNC00LjQ2LTMuOTMtNy42Mi0zLjczLTQuODEuMy04LjM0IDQuNzYtNy45NyA5LjU2LjE5IDIuNDcgMS41NCA3LjIzIDExLjE5IDEzLjQ3bDQuNCAyLjg1IDQuNC0yLjg1YzkuNjQtNi4yMyAxMS0xMSAxMS4xOS0xMy40Ny4zNy00LjgtMy4xNi05LjI2LTcuOTctOS41NnoiIGZpbGw9IiNmNDRlYjIiLz48cGF0aCBkPSJtNTQuNDMgMjMuN2g0LjI2di0zLjk1aDIuNjF2My45NWg0LjI3djIuNjJoLTQuMjd2My45NGgtMi42MXYtMy45NGgtNC4yNnoiIGZpbGw9IiNmMWYxZjEiLz48L3N2Zz4=');
7779
--image-github: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTI1IDEuNTljLTEzLjI1IDAtMjQgMTAuNzUtMjQgMjQgMCAxMC42IDYuODggMTkuNiAxNi40MSAyMi43NyAxLjIuMjIgMS42NC0uNTIgMS42NC0xLjE2IDAtLjU3LS4wMi0yLjA4LS4wMy00LjA4LTYuNjggMS40NS04LjA4LTMuMjItOC4wOC0zLjIyLTEuMDktMi43Ny0yLjY2LTMuNTEtMi42Ni0zLjUxLTIuMTgtMS40OS4xNi0xLjQ2LjE2LTEuNDYgMi40MS4xNyAzLjY4IDIuNDcgMy42OCAyLjQ3IDIuMTQgMy42NyA1LjYyIDIuNjEgNi45OCAxLjk5LjIyLTEuNTUuODQtMi42MSAxLjUyLTMuMjEtNS4zMy0uNjEtMTAuOTMtMi42Ni0xMC45My0xMS44NiAwLTIuNjIuOTQtNC43NiAyLjQ3LTYuNDQtLjI1LS42MS0xLjA3LTMuMDUuMjQtNi4zNSAwIDAgMi4wMi0uNjUgNi42IDIuNDYgMS45MS0uNTMgMy45Ny0uOCA2LjAxLS44MSAyLjA0IDAgNC4wOS4yOCA2LjAxLjgxIDQuNTgtMy4xMSA2LjU5LTIuNDYgNi41OS0yLjQ2IDEuMzEgMy4zLjQ5IDUuNzQuMjQgNi4zNSAxLjU0IDEuNjggMi40NyAzLjgyIDIuNDcgNi40NCAwIDkuMjItNS42MSAxMS4yNS0xMC45NiAxMS44NC44Ni43NCAxLjYzIDIuMjEgMS42MyA0LjQ0IDAgMy4yMS0uMDMgNS44LS4wMyA2LjU4IDAgLjY0LjQzIDEuMzkgMS42NSAxLjE1IDkuNTMtMy4xOCAxNi40LTEyLjE3IDE2LjQtMjIuNzcgMC0xMy4yNi0xMC43NS0yNC0yNC0yNHoiIGZpbGw9IiNmMWYxZjEiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==');
7880
--image-heart: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTAgNTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTM2LjgyIDQuOTZjLTQuOTEtLjMxLTkuMjggMi4wNi0xMS44MiA1Ljc4LTIuNTQtMy43Mi02LjkxLTYuMDktMTEuODItNS43OC03LjQ1LjQ2LTEyLjkzIDcuMzctMTIuMzUgMTQuODIuMjkgMy44MyAyLjM5IDExLjIxIDE3LjM1IDIwLjg4bDYuODMgNC40MSA2LjgzLTQuNDFjMTQuOTUtOS42NiAxNy4wNS0xNy4wNSAxNy4zNS0yMC44OC41Ny03LjQ0LTQuOS0xNC4zNS0xMi4zNS0xNC44MnoiIGZpbGw9IiNmNDRlYjIiLz48L3N2Zz4=');

FrontEnd/styles/package.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@
7575
background-image: var(--image-warning);
7676
}
7777

78+
li.forked {
79+
grid-column-start: span 2;
80+
background-image: var(--image-fork);
81+
}
82+
7883
li.authors {
7984
grid-column-start: span 2;
8085
background-image: var(--image-authors);

Resources/SVGs/fork~dark.svg

Lines changed: 1 addition & 0 deletions
Loading

Resources/SVGs/fork~light.svg

Lines changed: 1 addition & 0 deletions
Loading

Sources/App/Controllers/API/API+PackageController+GetRoute+Model.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ extension API.PackageController.GetRoute {
5050
var releaseReferences: [App.Version.Kind: App.Reference]
5151
var fundingLinks: [FundingLink]
5252
var swift6Readiness: Swift6Readiness?
53+
var forkedFromInfo: ForkedFromInfo?
5354

5455
internal init(packageId: Package.Id,
5556
repositoryOwner: String,
@@ -81,7 +82,8 @@ extension API.PackageController.GetRoute {
8182
releaseReference: App.Reference?,
8283
preReleaseReference: App.Reference?,
8384
fundingLinks: [FundingLink] = [],
84-
swift6Readiness: Swift6Readiness?
85+
swift6Readiness: Swift6Readiness?,
86+
forkedFromInfo: ForkedFromInfo?
8587
) {
8688
self.packageId = packageId
8789
self.repositoryOwner = repositoryOwner
@@ -123,6 +125,7 @@ extension API.PackageController.GetRoute {
123125
}()
124126
self.fundingLinks = fundingLinks
125127
self.swift6Readiness = swift6Readiness
128+
self.forkedFromInfo = forkedFromInfo
126129
}
127130

128131
init?(result: API.PackageController.PackageResult,
@@ -132,7 +135,8 @@ extension API.PackageController.GetRoute {
132135
swiftVersionBuildInfo: BuildInfo<CompatibilityMatrix.SwiftVersionCompatibility>?,
133136
platformBuildInfo: BuildInfo<CompatibilityMatrix.PlatformCompatibility>?,
134137
weightedKeywords: [WeightedKeyword] = [],
135-
swift6Readiness: Swift6Readiness?) {
138+
swift6Readiness: Swift6Readiness?,
139+
forkedFromInfo: ForkedFromInfo?) {
136140
// we consider certain attributes as essential and return nil (raising .notFound)
137141
let repository = result.repository
138142
guard
@@ -177,7 +181,8 @@ extension API.PackageController.GetRoute {
177181
releaseReference: result.releaseVersion?.reference,
178182
preReleaseReference: result.preReleaseVersion?.reference,
179183
fundingLinks: result.repository.fundingLinks,
180-
swift6Readiness: swift6Readiness
184+
swift6Readiness: swift6Readiness,
185+
forkedFromInfo: forkedFromInfo
181186
)
182187

183188
}
@@ -348,7 +353,14 @@ extension API.PackageController.GetRoute.Model {
348353
}
349354
}
350355
}
351-
356+
357+
enum ForkedFromInfo: Codable, Equatable {
358+
case fromSPI(originalOwner: String,
359+
originalOwnerName: String,
360+
originalRepo: String,
361+
originalPackageName: String)
362+
case fromGitHub(url: String)
363+
}
352364
}
353365

354366

Sources/App/Controllers/API/API+PackageController+GetRoute.swift

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ extension API.PackageController {
4545
async let buildInfo = API.PackageController.BuildInfo.query(on: database,
4646
owner: owner,
4747
repository: repository)
48+
async let forkedFromInfo = forkedFromInfo(on: database, fork: packageResult.repository.forkedFrom)
4849

4950
guard
5051
let model = try await Self.Model(
@@ -55,7 +56,8 @@ extension API.PackageController {
5556
swiftVersionBuildInfo: buildInfo.swiftVersion,
5657
platformBuildInfo: buildInfo.platform,
5758
weightedKeywords: weightedKeywords,
58-
swift6Readiness: buildInfo.swift6Readiness
59+
swift6Readiness: buildInfo.swift6Readiness,
60+
forkedFromInfo: forkedFromInfo
5961
),
6062
let schema = API.PackageSchema(result: packageResult)
6163
else {
@@ -84,4 +86,34 @@ extension API.PackageController.GetRoute {
8486
beta: links[1],
8587
latest: links[2])
8688
}
89+
90+
static func forkedFromInfo(on database: Database, fork: Fork?) async -> Model.ForkedFromInfo? {
91+
guard let forkedFrom = fork else { return nil }
92+
switch forkedFrom {
93+
case .parentId(let id, let fallbackURL):
94+
return await Model.ForkedFromInfo.query(on: database, packageId: id, fallbackURL: fallbackURL)
95+
case let .parentURL(url):
96+
return .fromGitHub(url: url)
97+
}
98+
}
99+
}
100+
101+
102+
extension API.PackageController.GetRoute.Model.ForkedFromInfo {
103+
static func query(on database: Database, packageId: Package.Id, fallbackURL: String) async -> Self? {
104+
let model = try? await Joined3<Package, Repository, Version>
105+
.query(on: database, packageId: packageId, version: .defaultBranch)
106+
.first()
107+
108+
guard let repoName = model?.repository.name,
109+
let ownerName = model?.repository.ownerName,
110+
let owner = model?.repository.owner else {
111+
return .fromGitHub(url: fallbackURL)
112+
}
113+
114+
return .fromSPI(originalOwner: owner,
115+
originalOwnerName: ownerName,
116+
originalRepo: repoName,
117+
originalPackageName: model?.version.packageName ?? repoName)
118+
}
87119
}

Sources/App/Controllers/API/Types+WithExample.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ extension API.PackageController.GetRoute.Model: WithExample {
247247
defaultBranchReference: .branch("main"),
248248
releaseReference: .tag(1, 2, 3, "1.2.3"),
249249
preReleaseReference: nil,
250-
swift6Readiness: nil)
250+
swift6Readiness: nil,
251+
forkedFromInfo: nil)
251252
}
252253
}
253254

Sources/App/Core/Query+Support/Joined3+Package.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,9 @@ extension Joined3 where M == Package, R1 == Repository, R2 == Version {
4040
.filter(Repository.self, \.$owner, .custom("ilike"), owner)
4141
.filter(Repository.self, \.$name, .custom("ilike"), repository)
4242
}
43+
44+
static func query(on database: Database, packageId: Package.Id, version: Version.Kind) -> JoinedQueryBuilder<Self> {
45+
query(on: database, version: version)
46+
.filter(Package.self, \Package.$id == packageId)
47+
}
4348
}

Sources/App/Models/Repository.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ final class Repository: @unchecked Sendable, Model, Content {
224224
.filter(\.$package.$id == pkgId)
225225
.first() ?? Repository(packageId: pkgId)
226226
}
227+
227228
}
228229

229230

0 commit comments

Comments
 (0)