├── .gitignore ├── README.md ├── analyze.sh ├── analyze_deps.sh ├── analyze_features.sh ├── clone.sh ├── dl-cargo-packages.py ├── extract_deps.sh ├── extract_deps_from_world.sh ├── extract_deps_sources.sh ├── extract_deps_sources_from_world.sh ├── extract_features.sh ├── extract_features_from_world.sh ├── extract_package_deps.py ├── extract_package_name.sh ├── extract_package_names_from_world.sh ├── find_new_sources.sh ├── gen_package_deps.sh ├── gen_package_features.sh ├── gen_transitive_features.sh ├── packages.txt └── rank_deps.sh /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | crates.io-index 3 | repos 4 | data 5 | tmp 6 | sources 7 | crates 8 | *.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a set of shell scripts for analyzing Rust/Cargo repositories 2 | en-masse. 3 | 4 | # Basic usage 5 | 6 | ``` 7 | > ./dl-cargo-packages.py crates.io-index crates sources 8 | > ./analyze.sh crates.io-index sources data 9 | > cat data/analysis_features.txt 10 | > cat data/analysis_deps.txt 11 | ``` 12 | 13 | # What's here? 14 | 15 | * `dl-cargo-packages.py` Downloads and extracts the most recent 16 | version of all registered Cargo packages. 17 | * `clone.sh` - Clone a list of repositories into a directory 18 | * `extract_features.sh` - Extract the features used by a local 19 | repository in the form 'repo: feature*' 20 | * `extract_features_from_world.sh` - As above but for a directory of 21 | local repos 22 | * `extract_deps.sh` - Extract the package names of transitive 23 | dependencies used by a local cargo repository in the form 'repo: 24 | package*'. Requires cargo-dot[1]. 25 | * `extract_deps_from_world.sh` - As above but for a directory of local 26 | repos 27 | * `extract_deps_sources.sh` - Extract the package sources of transitive 28 | dependencies used by a local cargo repository in the form 'repo: 29 | source*'. Requires cargo-dot[1]. 30 | * `extract_deps_sources_from_world.sh` - As above but for a directory 31 | of local repos 32 | * `extract_package_name.sh` - Extract the cargo package name of a local 33 | cargo repository in the form 'repo: package' 34 | * `extract_package_names_from_world.sh` - As above but for a directory 35 | of local repos 36 | * `find_new_sources.sh` - Creates a list of source repos based 37 | the output of `extract_deps_sources_from_world.sh`. 38 | * `gen_package_features.sh` - Combines the output of 39 | `extract_features_from_world.sh` (a list of 'repo: feature*') and 40 | the output of `extract_package_names_from_world.sh` (a list of 41 | 'repo: package') to create a list of packages and the features they 42 | use (a list of 'package: feature*') 43 | * `rank_deps.sh` - Ranks the most popular packages based on the 44 | output of `extract_deps_from_world.sh` 45 | * `analyze_features.sh` - Does some basic analysis on feature usage 46 | based on the output of `extract_features_from_world.sh` 47 | * `analyze_deps.sh` - Combines the output of 48 | `rank_deps.sh` with the output of `gen_package_features.sh` to create 49 | a list of the most popular packages along with the features they 50 | require 51 | 52 | 53 | [1]: https://github.com/maxsnew/cargo-dot 54 | 55 | # TODO 56 | 57 | * Analyze stability 58 | -------------------------------------------------------------------------------- /analyze.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | index=$1 4 | sources=$2 5 | data=$3 6 | 7 | mkdir -p data 8 | 9 | # First extract features 10 | echo "\n# extracting package deps\n" 11 | ./extract_package_deps.py $index | tee $data/package_deps.txt 12 | echo "\n# extracting features\n" 13 | ./extract_features_from_world.sh $sources | tee $data/features.txt 14 | #echo "\n# extracting deps\n" 15 | #./extract_deps_from_world.sh $sources | tee $data/deps.txt 16 | #echo "\n# extracting deps sources\n" 17 | #./extract_deps_sources_from_world.sh $sources | tee $data/deps_sources.txt 18 | echo "\n# extracting package_names\n" 19 | ./extract_package_names_from_world.sh $sources | tee $data/package_names.txt 20 | echo "\n# generating package features\n" 21 | ./gen_package_features.sh $data/package_names.txt $data/features.txt | tee $data/package_features.txt 22 | #echo "\n# generating package deps\n" 23 | #./gen_package_deps.sh $data/package_names.txt $data/deps.txt | tee $data/package_deps.txt 24 | echo "\n generating transitive features\n" 25 | ./gen_transitive_features.sh $data/package_deps.txt $data/package_features.txt | tee $data/package_transitive_features.txt 26 | echo "\n# ranking deps\n" 27 | ./rank_deps.sh $data/package_deps.txt | tee $data/ranked_deps.txt 28 | #echo "\n# finding new sources\n" 29 | #./find_new_sources.sh $data/deps_sources.txt | tee $data/new_sources.txt 30 | echo "\n# analyzing features\n" 31 | ./analyze_features.sh $data/features.txt | tee $data/analysis_features.txt 32 | echo "\n# analyzing deps\n" 33 | ./analyze_deps.sh $data/ranked_deps.txt $data/package_transitive_features.txt | tee $data/analysis_deps.txt 34 | 35 | echo "\n# done\n" 36 | -------------------------------------------------------------------------------- /analyze_deps.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Combines the output of analyze_deps.sh with the output of 4 | # gen_package_features.sh to create a ranked list of popular 5 | # packages with the features they require 6 | 7 | ranked_deps_file=$1 8 | package_features_file=$2 9 | 10 | package_features=`cat $package_features_file` 11 | 12 | while read line; do 13 | name=`echo "$line" | cut -f2 -d" "` 14 | feature_line=`echo "$package_features" | grep "^$name:"` 15 | features=`echo "$feature_line" | sed "s/^.*:\(.*\)/\1/"` 16 | echo "$line:$features" 17 | done <$ranked_deps_file 18 | -------------------------------------------------------------------------------- /analyze_features.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Analyzes the output of extract_features_from_world.sh 4 | 5 | feature_file=$1 6 | 7 | features=`cat $1` 8 | 9 | total_repos=`echo "$features" | wc -l` 10 | 11 | repos_using_features=`echo "$features" | sed '/^.*: $/d' | wc -l` 12 | repos_not_using_features=$((total_repos - repos_using_features)) 13 | repos_using_macro_rules=`echo "$features" | grep macro_rules | wc -l` 14 | repos_using_globs=`echo "$features" | grep globs | wc -l` 15 | repos_not_using_only_macro_rules_or_nothing=`echo "$features" | sed 's/ macro_rules//' | sed '/^.*: *$/d' | wc -l` 16 | repos_using_only_macro_rules_or_nothing=$((total_repos - repos_not_using_only_macro_rules_or_nothing)) 17 | repos_not_using_only_macro_rules_globs_or_nothing=`echo "$features" | sed 's/ macro_rules//' | sed 's/ globs//' | sed '/^.*: *$/d' | wc -l` 18 | repos_using_only_macro_rules_globs_or_nothing=$((total_repos - repos_not_using_only_macro_rules_globs_or_nothing)) 19 | 20 | echo 21 | 22 | echo "repos analyzed: $total_repos" 23 | echo "repos using features: $repos_using_features" 24 | echo "repos using macro rules: $repos_using_macro_rules" 25 | echo "repos using globs: $repos_using_globs" 26 | echo "repos using no features: $repos_not_using_features" 27 | echo "repos using only macro_rules or nothing: $repos_using_only_macro_rules_or_nothing" 28 | echo "repos using only macro_rules, globs or nothing: $repos_using_only_macro_rules_globs_or_nothing" 29 | 30 | features_only=`echo "$features" | sed 's/^.*: //' | sed '/^$/d'` 31 | feature_instances=`echo "$features_only" | tr " " "\n" | sort | uniq -c | sort -nr` 32 | 33 | echo 34 | echo "# Feature occurances" 35 | echo "$feature_instances" 36 | -------------------------------------------------------------------------------- /clone.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Clone all the repos on packages.txt 4 | 5 | packages_file=$1 6 | repo_dir=$2 7 | 8 | mkdir -p $repo_dir 9 | 10 | for i in `cat $packages_file` 11 | do 12 | d=`echo $i | sed 's/https:\/\///'` 13 | d=`echo $d | sed 's/\//\./g'` 14 | mkdir -p $repo_dir/$d 15 | git clone $i $repo_dir/$d --depth 1 16 | if [ $? != 0 ] 17 | then 18 | (cd $repo_dir/$d && git checkout -f && git pull) 19 | fi 20 | done 21 | -------------------------------------------------------------------------------- /dl-cargo-packages.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os, sys, shutil, subprocess, json 4 | 5 | errors = 0 6 | 7 | def run(args): 8 | print ' '.join(args) 9 | retval = subprocess.call(args) 10 | if retval != 0: 11 | print "call failed: " + str(args) 12 | sys.exit(1) 13 | 14 | def run_but_ignore_errors(args): 15 | global errors 16 | print ' '.join(args) 17 | retval = subprocess.call(args) 18 | if retval != 0: 19 | errors += 1 20 | print "call failed: " + str(args) 21 | 22 | def clone_or_update(repo, local): 23 | 24 | if not os.path.isdir(local): 25 | run(["git", "clone", "--depth", "1", repo, local]) 26 | else: 27 | cwd = os.getcwd() 28 | os.chdir(local) 29 | run(["git", "checkout", "-f"]) 30 | run(["git", "pull"]) 31 | os.chdir(cwd) 32 | 33 | index_dir = sys.argv[1] 34 | crate_dir = sys.argv[2] 35 | source_dir = sys.argv[3] 36 | 37 | cargo_index_repo = "https://github.com/rust-lang/crates.io-index.git" 38 | crate_server = "http://crates-io.s3-us-west-1.amazonaws.com/crates" 39 | 40 | clone_or_update(cargo_index_repo, index_dir) 41 | 42 | crates = [] 43 | for (dirpath, dirnames, filenames) in os.walk(index_dir): 44 | for filename in filenames: 45 | if ".git" in dirpath: 46 | continue 47 | if filename == "config.json": 48 | continue 49 | print filename 50 | revisions = [] 51 | with open(os.path.join(dirpath, filename)) as f: 52 | for line in f: 53 | data = json.loads(line) 54 | revisions += [data] 55 | 56 | most_recent_data = revisions[-1] 57 | name = most_recent_data["name"] 58 | version = most_recent_data["vers"] 59 | yanked = most_recent_data["yanked"] 60 | if not most_recent_data["yanked"]: 61 | crates += [{ "name": name, "version": version, "yanked": yanked, "json": most_recent_data, "dirpath": dirpath }] 62 | 63 | if not os.path.isdir(crate_dir): 64 | os.mkdir(crate_dir) 65 | 66 | if not os.path.isdir(source_dir): 67 | os.mkdir(source_dir) 68 | 69 | for crate in crates: 70 | crate_name = crate["name"] 71 | crate_version = crate["version"] 72 | yanked = crate["yanked"] 73 | file_name = crate_name + "-" + crate_version + ".crate" 74 | source_name = crate_name + "-" + crate_version 75 | remote_file_name = crate_server + "/" + crate_name + "/" + file_name 76 | 77 | cwd = os.getcwd() 78 | os.chdir(crate_dir) 79 | abs_crate_dir = os.getcwd() 80 | if not os.path.isfile(file_name): 81 | print crate_name + "-" + crate_version + " yanked: " + str(yanked) 82 | print crate["json"] 83 | print crate["dirpath"] 84 | run_but_ignore_errors(["curl", "-f", "-O", remote_file_name]) 85 | else: 86 | print "already have " + crate_name + "-" + crate_version 87 | os.chdir(cwd) 88 | 89 | os.chdir(source_dir) 90 | if not os.path.isdir(source_name): 91 | run_but_ignore_errors(["tar", "xzf", abs_crate_dir + "/" + file_name]) 92 | os.chdir(cwd) 93 | 94 | print "errors: " + str(errors) 95 | -------------------------------------------------------------------------------- /extract_deps.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extract a list of cargo deps used by a git repo 4 | 5 | dir=$1 6 | cd $dir 7 | bash -c 'cargo generate-lockfile &> /dev/null' 8 | if [ $? != 0 ] 9 | then 10 | echo "$dir: [cargo_generate-lockfile_failed]" 11 | exit 1 12 | fi 13 | 14 | dot=`cargo dot` 15 | if [ $? != 0 ] 16 | then 17 | echo "$dir: [cargo_dot_failed]" 18 | fi 19 | 20 | # extract #[label="..." lines 21 | label_lines=`echo "$dot" | egrep '\[label=".+"'` 22 | # extract from inside quotes 23 | labels=`echo "$label_lines" | sed 's/.*label="\(.*\)".*/\1/'` 24 | # merge lines 25 | labels=`echo $labels` 26 | echo "$dir: $labels" 27 | -------------------------------------------------------------------------------- /extract_deps_from_world.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extracts cargo deps from a directory containing directories of repos 4 | 5 | repo_dir=$1 6 | 7 | for package_dir in `ls $repo_dir` 8 | do 9 | deps=`sh ./extract_deps.sh $repo_dir/$package_dir` 10 | echo "$deps" 11 | done 12 | -------------------------------------------------------------------------------- /extract_deps_sources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extract a list of cargo deps used by a git repo 4 | 5 | dir=$1 6 | cd $dir 7 | bash -c 'cargo generate-lockfile &> /dev/null' 8 | if [ $? != 0 ] 9 | then 10 | echo "$dir: [cargo_generate-lockfile_failed]" 11 | exit 1 12 | fi 13 | 14 | dot=`cargo dot --source-labels` 15 | if [ $? != 0 ] 16 | then 17 | echo "$dir: [cargo_dot_failed]" 18 | fi 19 | 20 | # extract #[label="..." lines 21 | label_lines=`echo "$dot" | egrep '\[label=".+"'` 22 | # extract from inside quotes 23 | labels=`echo "$label_lines" | sed 's/.*label="\(.*\)".*/\1/'` 24 | # merge lines 25 | labels=`echo $labels` 26 | echo "$dir: $labels" 27 | -------------------------------------------------------------------------------- /extract_deps_sources_from_world.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extracts cargo deps from a directory containing directories of repos 4 | 5 | repo_dir=$1 6 | 7 | for package_dir in `ls $repo_dir` 8 | do 9 | deps=`sh ./extract_deps_sources.sh $repo_dir/$package_dir` 10 | echo "$deps" 11 | done 12 | -------------------------------------------------------------------------------- /extract_features.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extract a list of features used by git repos 4 | 5 | dir=$1 6 | all_features="" 7 | for rsfile in `find $dir -name "*.rs" -type f` 8 | do 9 | feature_lines=`grep "#!\[feature" $rsfile` 10 | # capture only betwen ( ... ) 11 | features=`echo "$feature_lines" | sed "s/.*(\(.*\)).*/\1/"` 12 | if [ "$features" != "" ] 13 | then 14 | all_features="$features, $all_features" 15 | fi 16 | done 17 | 18 | # get rid of commas 19 | all_features=`echo "$all_features" | sed 's/, / /g'` 20 | all_features=`echo "$all_features" | sed 's/,/ /g'` 21 | 22 | # split into lines 23 | all_features=`echo "$all_features" | tr " " "\n"` 24 | 25 | # sort | uniq 26 | all_features=`echo "$all_features" | sort | uniq` 27 | 28 | # merge lines 29 | all_features=`echo $all_features` 30 | 31 | echo "$dir: $all_features" 32 | -------------------------------------------------------------------------------- /extract_features_from_world.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extracts features from a directory containing directories of repos 4 | 5 | repo_dir=$1 6 | 7 | for package_dir in `ls $repo_dir` 8 | do 9 | if [ ! -d "$repo_dir/$package_dir" ]; then 10 | continue 11 | fi 12 | features=`sh ./extract_features.sh $repo_dir/$package_dir` 13 | echo "$features" 14 | done 15 | -------------------------------------------------------------------------------- /extract_package_deps.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os, sys, json, shutil 4 | 5 | index_dir = sys.argv[1] 6 | 7 | crates = [] 8 | for (dirpath, dirnames, filenames) in os.walk(index_dir): 9 | for filename in filenames: 10 | if ".git" in dirpath: 11 | continue 12 | if filename == "config.json": 13 | continue 14 | 15 | with open(os.path.join(dirpath, filename)) as f: 16 | revisions = [] 17 | for line in f: 18 | data = json.loads(line) 19 | revisions += [data] 20 | 21 | most_recent_data = revisions[-1] 22 | name = most_recent_data["name"] 23 | deps = most_recent_data["deps"] 24 | if not most_recent_data["yanked"]: 25 | crates += [{ "name": name, "deps": deps }] 26 | 27 | for crate in crates: 28 | crate_name = crate["name"] 29 | deps = crate["deps"] 30 | 31 | dep_names = "" 32 | for dep in deps: 33 | dep_names += " " + dep["name"] 34 | 35 | dep_names.strip() 36 | 37 | print crate_name + ": " + dep_names 38 | -------------------------------------------------------------------------------- /extract_package_name.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Extracts the cargo package name from a repo 4 | 5 | dir=$1 6 | if [ ! -f $dir/Cargo.toml ] 7 | then 8 | echo "$dir: [no_Cargo.toml]" 9 | exit 1 10 | fi 11 | 12 | nameline=`grep 'name.*=' $dir/Cargo.toml` 13 | # There may be multiple names, the first one is likely the package name 14 | nameline=`echo "$nameline" | head -n1` 15 | name=`echo "$nameline" | sed 's/.*"\(.*\)".*/\1/'` 16 | echo "$dir: $name" 17 | -------------------------------------------------------------------------------- /extract_package_names_from_world.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | repo_dir=$1 4 | 5 | for package_dir in `ls $repo_dir` 6 | do 7 | if [ ! -d "$repo_dir/$package_dir" ]; then 8 | continue 9 | fi 10 | name=`sh ./extract_package_name.sh $repo_dir/$package_dir` 11 | echo "$name" 12 | done 13 | -------------------------------------------------------------------------------- /find_new_sources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Gets a list of package sources from the output of 4 | # `extract_deps_sources_from_world.sh` 5 | 6 | deps_file=$1 7 | deps=`cat "$deps_file"` 8 | 9 | # remove the key 10 | deps=`echo "$deps" | cut -f1 -d ":" --complement` 11 | # trim leading space 12 | deps=`echo "$deps" | sed "s/^ *//"` 13 | # remove the leading local repo name 14 | deps=`echo "$deps" | sed "s/^file.* //"` 15 | # remove the leading local repo name if it's the only thing on the line 16 | deps=`echo "$deps" | sed "s/^file.*$//"` 17 | # remove error lines 18 | deps=`echo "$deps" | sed "s/\[cargo_generate-lockfile_failed\]//"` 19 | # remove blank lines 20 | deps=`echo "$deps" | sed "/^$/d"` 21 | # remove trailing '.git' for canonicalization 22 | deps=`echo "$deps" | sed "s/\.git$//"` 23 | # sort and uniq 24 | deps=`echo "$deps" | sort | uniq` 25 | 26 | echo "$deps" 27 | -------------------------------------------------------------------------------- /gen_package_deps.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Combines the output of extract_deps_from_world.sh and 4 | # extract_package_names_from_world.sh to create a list of 5 | # package names and their deps 6 | 7 | package_names_file=$1 8 | deps_file=$2 9 | 10 | package_names=`cat $package_names_file` 11 | 12 | while read line; do 13 | repo=`echo "$line" | sed "s/\(.*\):.*/\1/"` 14 | deps=`echo "$line" | sed "s/.*:\(.*\)/\1/"` 15 | deps=`echo "$deps" | sed "s/^ //"` 16 | package_name=`echo "$package_names" | grep "$repo:" | sed "s/.*: \(.*\)/\1/"` 17 | echo "$package_name: $deps" 18 | done <$deps_file 19 | -------------------------------------------------------------------------------- /gen_package_features.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Combines the output of extract_features_from_world.sh and 4 | # extract_package_names_from_world.sh to create a list of 5 | # package names and their features 6 | 7 | package_names_file=$1 8 | features_file=$2 9 | 10 | package_names=`cat $package_names_file` 11 | 12 | while read line; do 13 | repo=`echo "$line" | sed "s/\(.*\):.*/\1/"` 14 | features=`echo "$line" | sed "s/.*:\(.*\)/\1/"` 15 | features=`echo "$features" | sed "s/^ //"` 16 | package_name=`echo "$package_names" | grep "$repo:" | sed "s/.*: \(.*\)/\1/"` 17 | echo "$package_name: $features" 18 | done <$features_file 19 | -------------------------------------------------------------------------------- /gen_transitive_features.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Combines the output of extract_deps_from_world.sh and 4 | # extract_package_names_from_world.sh to create a list of 5 | # package names and their deps 6 | 7 | deps_file=$1 8 | features_file=$2 9 | 10 | features=`cat $features_file` 11 | 12 | while read line; do 13 | package=`echo "$line" | sed "s/\(.*\):.*/\1/"` 14 | deps=`echo "$line" | sed "s/.*:\(.*\)/\1/"` 15 | # Get the features from all the deps. Note that packages are 16 | # listed as a dep of themselves so this pulls in the feature from 17 | # the root package as well 18 | package_features=" " 19 | for dep in $deps 20 | do 21 | new_features=`echo "$features" | grep "$dep:" | sed "s/.*: \(.*\)/\1/"` 22 | package_features="$package_features$new_features " 23 | done 24 | # split into lines 25 | package_features=`echo "$package_features" | tr " " "\n"` 26 | # sort | uniq 27 | package_features=`echo "$package_features" | sort | uniq` 28 | # merge lines 29 | package_features=`echo "$package_features" | tr "\n" " "` 30 | echo "$package:$package_features" 31 | done <$deps_file 32 | -------------------------------------------------------------------------------- /packages.txt: -------------------------------------------------------------------------------- 1 | https://github.com/aaronweiss74/dnd 2 | https://github.com/aaronweiss74/irc 3 | https://github.com/AdrianArroyoCalle/perin 4 | https://github.com/adrianObel/rust-projectEuler 5 | https://github.com/aeqwa/aeq 6 | https://github.com/alexchandel/array-rs 7 | https://github.com/alexchandel/rust-gravity-worm 8 | https://github.com/alexcrichton/bzip2-rs 9 | https://github.com/alexcrichton/cookie-rs 10 | https://github.com/alexcrichton/flate2-rs 11 | https://github.com/alexcrichton/git2-rs 12 | https://github.com/alexcrichton/jba 13 | https://github.com/alexcrichton/libssh2-static-sys 14 | https://github.com/alexcrichton/openssl-static-sys 15 | https://github.com/alexcrichton/rust-compress 16 | https://github.com/alexcrichton/splay-rs 17 | https://github.com/alexcrichton/ssh2-rs 18 | https://github.com/alexcrichton/tar-rs 19 | https://github.com/alexcrichton/toml-rs 20 | https://github.com/am0d/rust-projects 21 | https://github.com/am0d/rust-web 22 | https://github.com/amousset/rust-smtp 23 | https://github.com/andelf/rust-2048 24 | https://github.com/andelf/rust-httpc 25 | https://github.com/andelf/rust-sdl2_gfx 26 | https://github.com/andelf/rust-sdl2_mixer 27 | https://github.com/andrew-d/leveldb-rs 28 | https://github.com/andrew-d/tinycdb-rs 29 | https://github.com/AngryLawyer/rust-sdl2 30 | https://github.com/Antti/rust-amqp 31 | https://github.com/apoelstra/bitcoin-secp256k1-rs 32 | https://github.com/apoelstra/rust-bitcoin 33 | https://github.com/apoelstra/rust-jsonrpc 34 | https://github.com/apoelstra/secretdata 35 | https://github.com/Arcterus/game-of-life 36 | https://github.com/Arcterus/iron 37 | https://github.com/Arcterus/rust-jit 38 | https://github.com/Arcterus/rust-snake 39 | https://github.com/arjantop/rust-bencode 40 | https://github.com/arjantop/rust-tabular 41 | https://github.com/atheriel/grunge 42 | https://github.com/atheriel/trig-rs 43 | https://github.com/bbrodriges/rusty-gears 44 | https://github.com/benw/resonance 45 | https://github.com/bjeanes/lifx-rust 46 | https://github.com/bjz/cgmath-rs 47 | https://github.com/bjz/color-rs 48 | https://github.com/bjz/glfw-rs 49 | https://github.com/bjz/gl-rs 50 | https://github.com/bjz/noise-rs 51 | https://github.com/bjz/num-rs 52 | https://github.com/bjz/openal-rs 53 | https://github.com/bjz/sax-rs 54 | https://github.com/bkoropoff/rust-jlens 55 | https://github.com/bkoropoff/rust-viewbox 56 | https://github.com/blackbeam/rust-mysql-simple 57 | https://github.com/bluss/rust-itertools 58 | https://github.com/bluss/rust-ndarray 59 | https://github.com/bobbo/roslin 60 | https://github.com/bonifaido/rust-zookeeper 61 | https://github.com/brandonson/evict 62 | https://github.com/brson/rust-chamber 63 | https://github.com/brson/rust-sdl 64 | https://github.com/brycefisher/defaulterrors 65 | https://github.com/brycefisher/htaccess2json.rs 66 | https://github.com/bsteinb/rust-iteratorcomprehensions 67 | https://github.com/BurntSushi/quickcheck 68 | https://github.com/cacteye/noise 69 | https://github.com/cadencemarseille/rust-pcre 70 | https://github.com/carllerche/curl-rust 71 | https://github.com/carllerche/hamcrest-rust 72 | https://github.com/carols10cents/rust-stem-porter2 73 | https://github.com/catharsis/purple.rs 74 | https://github.com/cgaebel/cloq 75 | https://github.com/cgaebel/graph 76 | https://github.com/chris-morgan/anymap 77 | https://github.com/chris-morgan/diffbot-rust-client 78 | https://github.com/chris-morgan/phantom-enum 79 | https://github.com/chris-morgan/rust-http 80 | https://github.com/chris-pe/Rustic 81 | https://github.com/cjqed/rs-natural 82 | https://github.com/cjqed/rust-stem 83 | https://github.com/cmr/bitmap-rs 84 | https://github.com/cmr/breakpad-rs 85 | https://github.com/cmr/nice_glfw 86 | https://github.com/cmr/rust-cgroup 87 | https://github.com/conradkleinespel/rustastic-smtp 88 | https://github.com/crabtw/rust-bindgen 89 | https://github.com/csherratt/collision-rs 90 | https://github.com/csherratt/cow-rs 91 | https://github.com/csherratt/genmesh 92 | https://github.com/csherratt/glfw 93 | https://github.com/csherratt/obj-rs 94 | https://github.com/csherratt/snowmew 95 | https://github.com/csherratt/vr-rs 96 | https://github.com/cuviper/rust-git-fs 97 | https://github.com/cuviper/rust-libprobe 98 | https://github.com/cyndis/rust-alsa 99 | https://github.com/cyndis/taskset 100 | https://github.com/dagenix/rust-crypto 101 | https://github.com/DaGenix/rust-crypto 102 | https://github.com/danburkert/bytekey 103 | https://github.com/DanielFath/xml-parser 104 | https://github.com/dckc/rust-sqlite3 105 | https://github.com/devyn/Paws.rs 106 | https://github.com/dguenther/rustchip 107 | https://github.com/dguenther/rust-lzma 108 | https://github.com/Divius/rust-dht 109 | https://github.com/docopt/docopt.rs 110 | https://github.com/doomsplayer/matrixrs 111 | https://github.com/doy/rust-irc 112 | https://github.com/dpc/hex2d-rs 113 | https://github.com/dpc/rdu 114 | https://github.com/dpc/rustyhex 115 | https://github.com/dradtke/rust-dominion 116 | https://github.com/dschatzberg/genesis 117 | https://github.com/dschatzberg/intrusive 118 | https://github.com/dwrensha/capnproto-rust 119 | https://github.com/ehsanul/rust-ws 120 | https://github.com/eliovir/rust-examples 121 | https://github.com/eliovir/rust-ini 122 | https://github.com/emk/heroku-rust-cargo-hello 123 | https://github.com/erickt/rust-elasticsearch 124 | https://github.com/erickt/rust-mongrel2 125 | https://github.com/erickt/rust-mustache 126 | https://github.com/erickt/rust-tnetstring 127 | https://github.com/erickt/rust-zmq 128 | https://github.com/erik/knuckle 129 | https://github.com/erik/mittens 130 | https://github.com/farcaller/shiny 131 | https://github.com/faultier/albino 132 | https://github.com/faultier/whitebase 133 | https://github.com/Florob/RustyXML 134 | https://github.com/FranklinChen/merry-fxmas-rust 135 | https://github.com/FranklinChen/type-directed-tdd-rust 136 | https://github.com/freiguy1/phant-rust 137 | https://github.com/frewsxcv/geojson 138 | https://github.com/garrison/arpack.rs 139 | https://github.com/Geal/rust-csv 140 | https://github.com/Geal/rust-syslog 141 | https://github.com/Geal/typedopts 142 | https://github.com/gfx-rs/gfx-rs 143 | https://github.com/gifnksm/man-sysnopsis-tools 144 | https://github.com/gifnksm/ProjectEulerRust 145 | https://github.com/globin/rust-string-match 146 | https://github.com/godfryd/crowd 147 | https://github.com/gsingh93/24-solver 148 | https://github.com/gsingh93/rust-graph 149 | https://github.com/gsingh93/xstrings 150 | https://github.com/GuillaumeGomez/rust-fmod 151 | https://github.com/GuillaumeGomez/rust-GSL 152 | https://github.com/GuillaumeGomez/rust-music-player 153 | https://github.com/hansjorg/rustci-test-project 154 | https://github.com/hansjorg/rust-doctest 155 | https://github.com/hirschenberger/k8055.rs 156 | https://github.com/hjr3/rust-hal 157 | https://github.com/hoeppnertill/vecmath 158 | https://github.com/huonw/boehm-rs 159 | https://github.com/huonw/brainfuck_macros 160 | https://github.com/huonw/cfor 161 | https://github.com/huonw/compile_msg 162 | https://github.com/huonw/copypasteck 163 | https://github.com/huonw/fileinput 164 | https://github.com/huonw/fractran_macros 165 | https://github.com/huonw/multibuilder 166 | https://github.com/huonw/random-tests 167 | https://github.com/huonw/slow_primes 168 | https://github.com/huonw/spellck 169 | https://github.com/huonw/stable_vec 170 | https://github.com/huonw/unicode_names 171 | https://github.com/huonw/unsafe_ls 172 | https://github.com/hyperium/hyper 173 | https://github.com/Indiv0/paste 174 | https://github.com/Indiv0/rust-adt 175 | https://github.com/Indiv0/rust-ssb 176 | https://github.com/iron/iron 177 | https://github.com/iron/logger 178 | https://github.com/iterion/cql-rust 179 | https://github.com/jakub-/a8282cf2 180 | https://github.com/jakub-/rust-instrumentation 181 | https://github.com/jakub-/rust-persistent-vector 182 | https://github.com/jansegre/rust-protobuf 183 | https://github.com/japaric/bb.rs 184 | https://github.com/japaric/criterion.rs 185 | https://github.com/japaric/euler_criterion.rs 186 | https://github.com/japaric/linalg.rs 187 | https://github.com/japaric/rust-by-example 188 | https://github.com/japaric/rustic 189 | https://github.com/japaric/seq.rs 190 | https://github.com/japaric/serial.rs 191 | https://github.com/japaric/simplot.rs 192 | https://github.com/japaric/stats.rs 193 | https://github.com/jbcrail/beanstalk-rs 194 | https://github.com/jeaye/ncurses-rs 195 | https://github.com/jeremyletang/colorize 196 | https://github.com/jeremyletang/ears 197 | https://github.com/jeremyletang/rgtk 198 | https://github.com/jeremyletang/route_macros 199 | https://github.com/jeremyletang/rust-portaudio 200 | https://github.com/jeremyletang/rust-sfml 201 | https://github.com/jeremyletang/rust-sndfile 202 | https://github.com/jeremyletang/svg 203 | https://github.com/jeremyletang/web_dispatcher 204 | https://github.com/jmesmon/rust-systemd 205 | https://github.com/jxv/vindinium-starter-rust 206 | https://github.com/kaini/noise 207 | https://github.com/kballard/rust-lua 208 | https://github.com/kennytm/qrcode-rust 209 | https://github.com/KevinKelley/nanovg-rs 210 | https://github.com/kevinmehall/rust-peg 211 | https://github.com/kevinmehall/rust-usb 212 | https://github.com/kimhyunkang/libyaml-rust 213 | https://github.com/Kimundi/apply-pub-rs 214 | https://github.com/Kimundi/lazy-static.rs 215 | https://github.com/kmcallister/html5ever 216 | https://github.com/kmcallister/syscall.rs 217 | https://github.com/kmcallister/vgrs 218 | https://github.com/lee-b/rust_market_data 219 | https://github.com/libpnet/libpnet 220 | https://github.com/lifthrasiir/angolmois-rust 221 | https://github.com/lifthrasiir/cson-rust 222 | https://github.com/lifthrasiir/rust-chrono 223 | https://github.com/lifthrasiir/rust-encoding 224 | https://github.com/lifthrasiir/rust-natord 225 | https://github.com/lifthrasiir/rust-sdl 226 | https://github.com/lifthrasiir/rust-zip 227 | https://github.com/linuxfood/rustsqlite 228 | https://github.com/lucidd/rust-promise 229 | https://github.com/lukemetz/rustpy 230 | https://github.com/lulf/rustyraft 231 | https://github.com/mavdi/ms 232 | https://github.com/Mayflower/rust-puppetfile 233 | https://github.com/metallirc/irccp-rs 234 | https://github.com/mgax/rust-gdal 235 | https://github.com/michaelsproul/rust-generic-trie 236 | https://github.com/michaelwoerister/rs-persistent-datastructures 237 | https://github.com/MrFloya/bitio.rs 238 | https://github.com/MrFloya/enigma.rs 239 | https://github.com/MrFloya/rs-gzip 240 | https://github.com/m-r-r/rust-i3ipc 241 | https://github.com/muggenhor/rudoku 242 | https://github.com/musitdev/rust-portmidi 243 | https://github.com/mvdnes/element76 244 | https://github.com/mvdnes/flatestream-rs 245 | https://github.com/mvdnes/portaudio-rs 246 | https://github.com/mvdnes/rboy 247 | https://github.com/mvdnes/spinlock-rs 248 | https://github.com/mvdnes/zip-rs 249 | https://github.com/nathanrosspowell/rust_guessing_game 250 | https://github.com/nathansizemore/rustic-io 251 | https://github.com/nathantypanski/rtop 252 | https://github.com/nathantypanski/rust-algorithms 253 | https://github.com/nathantypanski/rustdown 254 | https://github.com/netvl/rust-xml 255 | https://github.com/nham/radicle 256 | https://github.com/niax/rust-graph 257 | https://github.com/nickel-org/nickel.rs 258 | https://github.com/NoLifeDev/nx-rs 259 | https://github.com/nwin/chatIRC 260 | https://github.com/o11c/rust-xdg 261 | https://github.com/o11c/termkey-rs 262 | https://github.com/o11c/tickit-rs 263 | https://github.com/Ogeon/fragments 264 | https://github.com/Ogeon/rustful 265 | https://github.com/ogham/exa 266 | https://github.com/ogham/rust-ansi-term 267 | https://github.com/omasanori/mesquite 268 | https://github.com/oschwald/maxminddb-rust 269 | https://github.com/ozkriff/error-context 270 | https://github.com/ozkriff/marauder 271 | https://github.com/phildawes/racer 272 | https://github.com/pietro/rust-sha 273 | https://github.com/pinyin-tools/librustpinyin 274 | https://github.com/PistonDevelopers/cam 275 | https://github.com/PistonDevelopers/conrod 276 | https://github.com/PistonDevelopers/freetype-rs 277 | https://github.com/PistonDevelopers/gfx_graphics 278 | https://github.com/PistonDevelopers/glfw_game_window 279 | https://github.com/PistonDevelopers/hematite 280 | https://github.com/pistondevelopers/image 281 | https://github.com/pistondevelopers/input 282 | https://github.com/PistonDevelopers/input 283 | https://github.com/PistonDevelopers/opengl_graphics 284 | https://github.com/PistonDevelopers/physfs-rs 285 | https://github.com/PistonDevelopers/piston 286 | https://github.com/PistonDevelopers/piston-examples 287 | https://github.com/PistonDevelopers/Piston-Tutorials 288 | https://github.com/PistonDevelopers/rust-dsp 289 | https://github.com/PistonDevelopers/rust-event 290 | https://github.com/PistonDevelopers/rust-graphics 291 | https://github.com/PistonDevelopers/rust-graphics-lab 292 | https://github.com/PistonDevelopers/rust-image 293 | https://github.com/PistonDevelopers/sdl2_game_window 294 | https://github.com/pistondevelopers/shader_version 295 | https://github.com/PistonDevelopers/shader_version 296 | https://github.com/pistondevelopers/sprite 297 | https://github.com/PistonDevelopers/sprite 298 | https://github.com/PistonDevelopers/vecmath 299 | https://github.com/PistonDevelopers/wavefront-obj 300 | https://github.com/PistonDevelopers/xpath-rs 301 | https://github.com/polyfractal/quicksilver 302 | https://github.com/polyfractal/Turbine 303 | https://github.com/potan/dual.rs 304 | https://github.com/pshc/brainrust 305 | https://github.com/rail44/docker-rust 306 | https://github.com/rail44/msgpack-rs 307 | https://github.com/rail44/rust-memcached 308 | https://github.com/ralph-tice/polarbear 309 | https://github.com/rcatolino/rbtree-rust 310 | https://github.com/reem/iron 311 | https://github.com/reem/rust-http-content-type 312 | https://github.com/reem/rust-replace-map 313 | https://github.com/reem/rust-unsafe-any 314 | https://github.com/reima/rustboy 315 | https://github.com/retep998/colors-rs 316 | https://github.com/retep998/euler-rs 317 | https://github.com/retep998/ircbutt-rs 318 | https://github.com/retep998/mlpccg-rs 319 | https://github.com/rgawdzik/rust_testrunner 320 | https://github.com/rust-lang/glob 321 | https://github.com/rust-lang/num 322 | https://github.com/rust-lang/semver 323 | https://github.com/rustless/rustless 324 | https://github.com/rustless/rust-query 325 | https://github.com/rustless/valico 326 | https://github.com/saati/memoize-rs 327 | https://github.com/saati/skiplist-rs 328 | https://github.com/samyatchmenoff/commander 329 | https://github.com/samyatchmenoff/openal-rs 330 | https://github.com/sebcrozet/kiss3d 331 | https://github.com/sebcrozet/nalgebra 332 | https://github.com/sebcrozet/nphysics 333 | https://github.com/seb-m/common.rs 334 | https://github.com/seb-m/crypto.rs 335 | https://github.com/seb-m/curve41417.rs 336 | https://github.com/sellibitze/rustaudio 337 | https://github.com/servo/glfw 338 | https://github.com/servo/libfreetype2 339 | https://github.com/servo/libpng 340 | https://github.com/servo/rust-cocoa 341 | https://github.com/servo/rust-core-foundation 342 | https://github.com/servo/rust-core-graphics 343 | https://github.com/servo/rust-core-text 344 | https://github.com/servo/rust-cssparser 345 | https://github.com/servo/rust-fontconfig 346 | https://github.com/servo/rust-freetype 347 | https://github.com/servo/rust-geom 348 | https://github.com/servo/rust-glut 349 | https://github.com/servo/rust-harfbuzz 350 | https://github.com/servo/rust-io-surface 351 | https://github.com/servo/rust-layers 352 | https://github.com/servo/rust-opengles 353 | https://github.com/servo/rust-png 354 | https://github.com/servo/rust-stb-image 355 | https://github.com/servo/rust-url 356 | https://github.com/servo/rust-xlib 357 | https://github.com/servo/string-cache 358 | https://github.com/sfackler/r2d2 359 | https://github.com/sfackler/rust-openssl 360 | https://github.com/sfackler/rust-phf 361 | https://github.com/sfackler/rust-postgres 362 | https://github.com/sfackler/rust-postgres-macros 363 | https://github.com/shamansir/cayley-rust 364 | https://github.com/SiegeLord/Kwarg 365 | https://github.com/SiegeLord/RustAlgebloat 366 | https://github.com/SiegeLord/RustAllegro 367 | https://github.com/SiegeLord/RustCMake 368 | https://github.com/SiegeLord/RustGnuplot 369 | https://github.com/SiegeLord/SLRConfig 370 | https://github.com/slogsdon/http 371 | https://github.com/snrs/sonorous 372 | https://github.com/stepancheg/rust-protobuf 373 | https://github.com/steveklabnik/adventure 374 | https://github.com/steveklabnik/cryptopals 375 | https://github.com/steveklabnik/dining_philosophers 376 | https://github.com/steveklabnik/edges 377 | https://github.com/steveklabnik/rainfuck 378 | https://github.com/suhr/rust-efl 379 | https://github.com/tailhook/rust-argparse 380 | https://github.com/talevy/multimap 381 | https://github.com/tari/audiostream.rs 382 | https://github.com/tari/rust-ao 383 | https://github.com/tari/vorbisfile.rs 384 | https://github.com/teepee/teepee 385 | https://github.com/TeXitoi/1wT 386 | https://github.com/TeXitoi/rust-mdo 387 | https://github.com/TheHydroImpulse/rust-nanomsg 388 | https://github.com/TimDumol/rust-otp 389 | https://github.com/tomaka/from_json 390 | https://github.com/tomaka/gl-init-rs 391 | https://github.com/tomaka/glium 392 | https://github.com/tomaka/rust-hl-lua 393 | https://github.com/tomaka/rust-package 394 | https://github.com/tomaka/tiny-http 395 | https://github.com/tomassedovic/tcod-rs 396 | https://github.com/TomBebbington/jit.rs 397 | https://github.com/TomBebbington/js.rs 398 | https://github.com/tomjakubowski/restink 399 | https://github.com/txus/ract 400 | https://github.com/TyOverby/asset_store 401 | https://github.com/TyOverby/binary-encode 402 | https://github.com/TyOverby/irc-message 403 | https://github.com/TyOverby/iter_nd 404 | https://github.com/TyOverby/Piston-Tutorial 405 | https://github.com/TyOverby/rust-termbox 406 | https://github.com/TyOverby/try_or 407 | https://github.com/ueliem/tarnish 408 | https://github.com/ujh/iomrascalai 409 | https://github.com/uorbe001/rustspec 410 | https://github.com/uorbe001/rustspec-assertions 411 | https://github.com/uutils/coreutils 412 | https://github.com/Valve/heliotrope 413 | https://github.com/vberger/ircc-rs 414 | https://github.com/veddan/rust-bsdnt 415 | https://github.com/vhbit/base32-rs 416 | https://github.com/vhbit/curl-rs 417 | https://github.com/vhbit/lmdb-rs 418 | https://github.com/vincom2/echoserver.rs 419 | https://github.com/vsv/rustulator 420 | https://github.com/yjerem/cykas 421 | https://github.com/zeromq/zmq.rs 422 | https://github.com/zsiciarz/euler.rs 423 | https://github.com/zsiciarz/rust-cpuid 424 | https://github.com/zslayton/stomp-rs 425 | -------------------------------------------------------------------------------- /rank_deps.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Analyzes the output of extract_deps_from_world.sh 4 | 5 | deps_file=$1 6 | 7 | deps=`cat $1` 8 | 9 | # Remove lines where cargo failed 10 | deps=`echo "$deps" | grep -v "cargo_generate-lockfile_failed"` 11 | stripped=`echo "$deps" | sed "s/^.*: //"` 12 | # Put everything on its own line 13 | lined=`echo "$stripped" | tr " " "\n"` 14 | sorted=`echo "$lined" | sort | uniq -c | sort -nr` 15 | 16 | echo "$sorted" 17 | --------------------------------------------------------------------------------