Skip to content

Commit 4d0bd17

Browse files
authored
Reverse Dependencies indexed on PackageName (#1082)
* Rebased Reverse Dependencies
1 parent b7b67ee commit 4d0bd17

22 files changed

+1735
-891
lines changed

benchmarks/RevDeps.hs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
{-# LANGUAGE ScopedTypeVariables , TypeApplications #-}
2+
module Main where
3+
4+
import Control.Monad (replicateM)
5+
import Data.Containers.ListUtils (nubOrd)
6+
import qualified Data.Vector as Vector
7+
import Distribution.Package (packageName)
8+
import Distribution.Server.Features.ReverseDependencies.State (constructReverseIndex, getDependenciesFlat)
9+
import Distribution.Server.Packages.PackageIndex as PackageIndex
10+
11+
import Gauge.Benchmark (nfAppIO, bench)
12+
import Gauge.Main (defaultMain)
13+
import System.Random.Stateful
14+
15+
import RevDepCommon (Package(..), packToPkgInfo, TestPackage(..))
16+
17+
randomPacks
18+
:: forall m g. StatefulGen g m
19+
=> g
20+
-> Int
21+
-> Vector.Vector (Package TestPackage)
22+
-> m (Vector.Vector (Package TestPackage))
23+
randomPacks gen limit generated | length generated < limit = do
24+
makeNewPack <- uniformM gen -- if not new pack, just make a new version of an existing
25+
toInsert <-
26+
if makeNewPack || generated == mempty
27+
then
28+
Package
29+
<$> pure (TestPackage (fromIntegral @Int @Word $ Vector.length generated))
30+
<*> uniformRM (0, 10) gen
31+
<*> pure mempty
32+
else do
33+
prevIdx <- uniformRM (0, length generated - 1) gen
34+
let Package { pName = prevName } = generated Vector.! prevIdx
35+
(prevNamePacks, nonPrevName) = Vector.partition ((== prevName) . pName) generated
36+
depPacks <-
37+
if mempty /= nonPrevName
38+
then do
39+
-- TODO this should have an expected amount of deps equal to what is actually on hackage. what is it?
40+
numOfDeps <- uniformRM (1, min (length nonPrevName - 1) 7) gen
41+
indicesMayDuplicate <- replicateM numOfDeps (uniformRM (0, length nonPrevName - 1) gen)
42+
let indices = nubOrd indicesMayDuplicate
43+
pure $ map (nonPrevName Vector.!) indices
44+
else
45+
pure []
46+
let
47+
newVersion =
48+
if mempty /= prevNamePacks
49+
then 1 + maximum (fmap pVersion prevNamePacks)
50+
else 0
51+
pure $
52+
Package
53+
{ pName = prevName
54+
, pVersion = newVersion
55+
, pDeps = map pName depPacks
56+
}
57+
let added = generated <> pure toInsert
58+
randomPacks gen limit added
59+
randomPacks _ _ generated = pure generated
60+
61+
main :: IO ()
62+
main = do
63+
packs :: Vector.Vector (Package TestPackage) <- randomPacks globalStdGen 20000 mempty
64+
let idx = PackageIndex.fromList $ map packToPkgInfo (Vector.toList packs)
65+
Right revs <- pure $ constructReverseIndex idx
66+
let numPacks = length packs
67+
defaultMain $
68+
(:[]) $
69+
bench "get transitive dependencies for one randomly selected package" $
70+
flip nfAppIO revs $ \revs' -> do
71+
select <- uniformRM (0, numPacks - 1) globalStdGen
72+
-- TODO why are there so many transitive deps?
73+
length <$>
74+
getDependenciesFlat
75+
(packageName $ packToPkgInfo (packs Vector.! select))
76+
revs'

datafiles/static/graph/graph.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafiles/static/graph/tmpl.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* JavaScript Templates
3+
* https://github.com/blueimp/JavaScript-Templates
4+
*
5+
* Copyright 2011, Sebastian Tschan
6+
* https://blueimp.net
7+
*
8+
* Licensed under the MIT license:
9+
* http://www.opensource.org/licenses/MIT
10+
*
11+
* Inspired by John Resig's JavaScript Micro-Templating:
12+
* http://ejohn.org/blog/javascript-micro-templating/
13+
*/
14+
15+
/*global document, define, module */
16+
17+
;(function ($) {
18+
'use strict'
19+
var tmpl = function (str, data) {
20+
var f = !/[^\w\-\.:]/.test(str)
21+
? tmpl.cache[str] = tmpl.cache[str] || tmpl(tmpl.load(str))
22+
: new Function(// eslint-disable-line no-new-func
23+
tmpl.arg + ',tmpl',
24+
'var _e=tmpl.encode' + tmpl.helper + ",_s='" +
25+
str.replace(tmpl.regexp, tmpl.func) + "';return _s;"
26+
)
27+
return data ? f(data, tmpl) : function (data) {
28+
return f(data, tmpl)
29+
}
30+
}
31+
tmpl.cache = {}
32+
tmpl.load = function (id) {
33+
return document.getElementById(id).innerHTML
34+
}
35+
tmpl.regexp = /([\s'\\])(?!(?:[^{]|\{(?!%))*%\})|(?:\{%(=|#)([\s\S]+?)%\})|(\{%)|(%\})/g
36+
tmpl.func = function (s, p1, p2, p3, p4, p5) {
37+
if (p1) { // whitespace, quote and backspace in HTML context
38+
return {
39+
'\n': '\\n',
40+
'\r': '\\r',
41+
'\t': '\\t',
42+
' ': ' '
43+
}[p1] || '\\' + p1
44+
}
45+
if (p2) { // interpolation: {%=prop%}, or unescaped: {%#prop%}
46+
if (p2 === '=') {
47+
return "'+_e(" + p3 + ")+'"
48+
}
49+
return "'+(" + p3 + "==null?'':" + p3 + ")+'"
50+
}
51+
if (p4) { // evaluation start tag: {%
52+
return "';"
53+
}
54+
if (p5) { // evaluation end tag: %}
55+
return "_s+='"
56+
}
57+
}
58+
tmpl.encReg = /[<>&"'\x00]/g
59+
tmpl.encMap = {
60+
'<': '&lt;',
61+
'>': '&gt;',
62+
'&': '&amp;',
63+
'"': '&quot;',
64+
"'": '&#39;'
65+
}
66+
tmpl.encode = function (s) {
67+
return (s == null ? '' : '' + s).replace(
68+
tmpl.encReg,
69+
function (c) {
70+
return tmpl.encMap[c] || ''
71+
}
72+
)
73+
}
74+
tmpl.arg = 'o'
75+
tmpl.helper = ",print=function(s,e){_s+=e?(s==null?'':s):_e(s);}" +
76+
',include=function(s,d){_s+=tmpl(s,d);}'
77+
if (typeof define === 'function' && define.amd) {
78+
define(function () {
79+
return tmpl
80+
})
81+
} else if (typeof module === 'object' && module.exports) {
82+
module.exports = tmpl
83+
} else {
84+
$.tmpl = tmpl
85+
}
86+
}(this))

0 commit comments

Comments
 (0)