Naive package manager statistics.

master
vi 2017-12-08 17:43:55 +01:00
commit b27566a380
6 changed files with 116 additions and 0 deletions

24
Makefile Normal file
View File

@ -0,0 +1,24 @@
%.result: %.urls Statistics
grep -E '^http://' $< | ./Statistics > $@
Statistics: Statistics.hs stack.yaml
stack build https-everywhere-rules
stack build foldl
stack exec -- ghc $< -o $@
arch-extra.urls: arch-extra extract-sources.sh
find $< -name PKGBUILD | ./extract-sources.sh | grep -E '^https?://' | tee $@
mirrors.json: nixpkgs
nix-instantiate --eval --json --strict -E 'import ./$</pkgs/build-support/fetchurl/mirrors.nix' | tee $@
expand-mirrors.py: mirrors.json
nixpkgs.urls: nixpkgs expand-mirrors.py
nix-instantiate --eval --json --strict -E '(let pkgs = import ./$< { config.allowBroken = true; config.allowUnfree = true; }; in with pkgs.lib; flatten (mapAttrsToList (_: v: (builtins.tryEval v.src.url or []).value) pkgs))' | jq -r .[] | ./expand-mirrors.py | grep -E '^https?://' | tee $@
arch-extra:
git clone https://git.archlinux.org/svntogit/packages.git $@
nixpkgs:
git clone https://github.com/nixos/nixpkgs

3
README.org Normal file
View File

@ -0,0 +1,3 @@
Of the 11919 HTTP source references in the Nix Packages collection, 2098 (18%) could be upgraded automatically.
Of the 2154 HTTP source references in Arch Linux's primary repository ('extra'), 491 (23%) could be upgraded automatically.

32
Statistics.hs Normal file
View File

@ -0,0 +1,32 @@
module Main (main) where
import Network.URI (URI, parseURI)
import Data.HTTPSEverywhere.Rules (rewriteURL, RuleSet, getRulesets)
import Pipes (Pipe, Producer, lift, yield, await, (>->))
import Pipes.Prelude (stdinLn)
import qualified Pipes.Prelude as Pipes (fold)
import Control.Monad (forever)
import Control.Foldl (Fold(..))
import qualified Control.Foldl as Foldl
import Data.Monoid (Sum(..))
import Data.Bool (bool)
parse :: Monad m => Pipe String URI m ()
parse = forever $ parseURI <$> await >>= maybe (return ()) yield
check :: [RuleSet] -> Pipe URI Bool IO ()
check rules = forever $ do
src <- await
tgt <- lift $ rewriteURL rules src
yield $ src /= tgt
fold :: Monad m => Fold a b -> Producer a m () -> m b
fold (Fold step begin done) = Pipes.fold step begin done
proportion :: Fold Bool (Int, Int)
proportion = (,) <$> Foldl.foldMap (Sum . bool 0 1) getSum <*> Foldl.length
main :: IO ()
main = do
rules <- getRulesets
fold proportion (stdinLn >-> parse >-> check rules) >>= print

35
expand-mirrors.py Normal file
View File

@ -0,0 +1,35 @@
#! /usr/bin/env python
import sys, json, subprocess, logging, urlparse
class Translator:
def __init__(self):
with open('mirrors.json') as mirrors:
self.mirrors = json.load(mirrors)
def interpret(self, url):
parsed_url = urlparse.urlparse(url)
if parsed_url.scheme == 'mirror':
if parsed_url.netloc in self.mirrors:
pidgin = []
for mirror in self.mirrors[parsed_url.netloc]:
parsed_mirror = urlparse.urlparse(mirror)
expansion = urlparse.ParseResult(
parsed_mirror.scheme,
parsed_mirror.netloc,
parsed_url.path,
parsed_url.params,
parsed_url.query,
parsed_url.fragment)
pidgin.append(expansion.geturl())
return pidgin
else:
logging.warning("Unhandled mirror {} ({})".format(parsed_url.netloc, url))
return []
else:
return [ url ]
if __name__ == '__main__':
translator = Translator()
for line in sys.stdin:
for translation in translator.interpret(line.strip()):
print translation

11
extract-sources.sh Normal file
View File

@ -0,0 +1,11 @@
#! /usr/bin/env bash
while read PKGBUILD; do
TMP="$(mktemp)";
awk -F= '
BEGIN {state=0}
(NR > 1 && state == 0){print;if($1 == "source"){state = 1};next;}
(state == 1){ if(match($1,"^[a-zA-Z]")){exit};print}' "$PKGBUILD" > "$TMP";
bash -c "source $TMP; printf '%s\n' \${source[@]} | grep '^http'";
rm "$TMP";
done

11
stack.yaml Normal file
View File

@ -0,0 +1,11 @@
packages:
- location:
git: https://git.yori.cc/https-everywhere-else/https-everywhere-rules.git
commit: ed1933f2c5e28a1faa844f1755a636d58683009b
extra-dep: true
flags:
https-everywhere-rules:
build-examples: false
extra-deps:
- functor-infix-0.0.5
resolver: lts-8.24