Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #####
- ### The code below is written by Benjamin Lind under CC: BY-NC-SA 3.0
- ### If you use or develop this code, please provide proper attribution.
- ### You may contact me at lind.benjamin//at//gmail//d0t//com
- ### You may also find me @benjaminlind on Twitter
- #####
- #####
- ### The code that follows builds a graph (i.e., a network) from Julia package dependencies
- ### I am sure it can be run more efficiently, however it's not important given the number of packages at the moment.
- ### IMPORTANT: Be sure to set 'jdir' to the directory where Julia lives.
- ### For me, on an OpenSuse system, it's on my home directory in a folder called ".julia".
- ### It might be different for you
- ### Inspired by http://iaindunning.com/2014/pkg-deps.html
- ### For an R version, see
- ### http://blog.revolutionanalytics.com/2014/07/dependencies-of-popular-r-packages.html
- ### http://pastebin.com/2Fa2Uz0N
- #####
- using Graphs
- #####
- ### Be sure this next line is set properly to your Julia folder.
- jdir = string(homedir(), "/.julia")
- #####
- metadatadir = string(jdir, "/METADATA")
- curdir = pwd()
- cd(metadatadir)
- mddirfiles = readdir()
- exampleind = find(mddirfiles .== "Example")[1]
- deleteat!(mddirfiles, exampleind) # Throw out that one. It's misleading.
- mddirfiles = mddirfiles[find(map(isdir, mddirfiles))]
- nfiles = length(mddirfiles)
- ispackage = Array(Bool{}, nfiles)
- npackages = 0
- for i = 1:nfiles # Find out which folders are packages
- if contains(mddirfiles[i], ".") == false # Ignore hidden folders
- tempfiles = readdir(mddirfiles[i])
- ispackage[i] = in("versions", tempfiles)
- if ispackage[i]
- npackages += 1
- end
- else
- ispackage[i] = false
- end
- end
- mddirfiles = mddirfiles[find(ispackage)] # Throw out those folders that aren't packages
- hasreqfile = Array(Bool{}, npackages)
- reqfile = Array(ASCIIString{}, npackages)
- for i = 1:npackages # Find out which packages have require files and their locations
- newdir = string(mddirfiles[i], "/", "versions")
- filesindir = readdir(newdir)
- maxvers = maximum(filesindir)
- newdir = string(newdir, "/", maxvers)
- hasreqfile[i] = in("requires", readdir(newdir))
- reqfile[i] = string(newdir, "/requires")
- end
- deppack = Array(Array{ASCIIString}, npackages)
- # For string handling, see: http://docs.julialang.org/en/release-0.2/stdlib/base/?highlight=pwd#strings
- for i = 1:npackages # Read and clean the dependencies
- if hasreqfile[i]
- newio = open(reqfile[i])
- deppack[i] = readlines(newio)
- close(newio)
- keepitems = Array(Bool{}, length(deppack[i]))
- for j = 1:length(deppack[i])
- deppack[i][j] = replace(deppack[i][j], "\n", "")
- deppack[i][j] = split(deppack[i][j], " ")[1]
- if (deppack[i][j] == "") | (deppack[i][j] == "julia") | (in(deppack[i][j], mddirfiles) == false)
- keepitems[j] = false
- else
- keepitems[j] = true
- end
- end
- deppack[i] = deppack[i][find(keepitems)]
- else
- deppack[i] = Array(ASCIIString{}, 0)
- end
- end
- ndeps = sum(map(length, deppack))
- depel = Array(ASCIIString, ndeps, 2)
- depelcounter = 1
- vlist = Array(KeyVertex{ASCIIString}, npackages)
- for i = 1:npackages # Create an array of vertices
- if length(deppack[i]) > 0
- for j = 1:length(deppack[i])
- depel[depelcounter, 1] = deppack[i][j]
- depel[depelcounter, 2] = mddirfiles[i]
- depelcounter += 1
- end
- end
- vlist[i] = KeyVertex(i, mddirfiles[i])
- end
- elist = Array(Edge{typeof(vlist[1])}, size(depel, 1))
- for i = 1:size(depel, 1) # Create an array of edges
- sender = vlist[find(mddirfiles .== depel[i, 1])[1]]
- receiver = vlist[find(mddirfiles .== depel[i, 2])[1]]
- elist[i] = Edge(i, sender, receiver)
- end
- depgraph = graph(vlist, elist, is_directed = true) # I get an error here.
- # ERROR: assertion failed: edge_index(e) == num_edges(g) + 1
- # in add_edge! at /home/.../.julia/Graphs/src/graph.jl:83
- # in add_edge! at /home/.../.julia/Graphs/src/graph.jl:99
- # in graph at /home/.../.julia/Graphs/src/graph.jl:42
- cd(curdir)
- # writedlm("JuliaPackDepVNames.tsv", map((x)->x.rce.key, x.target.key), elist)
- # writedlm("JuliaPackDepVNames.tsv", map((x)->x.key, vlist))
Advertisement
Add Comment
Please, Sign In to add comment