BenjaminLind

PkgDepNet.jl

Jul 25th, 2014
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. #####
  2. ### The code below is written by Benjamin Lind under CC: BY-NC-SA 3.0
  3. ### If you use or develop this code, please provide proper attribution.
  4. ### You may contact me at lind.benjamin//at//gmail//d0t//com
  5. ### You may also find me @benjaminlind on Twitter
  6. #####
  7.  
  8. #####
  9. ### The code that follows builds a graph (i.e., a network) from Julia package dependencies
  10. ### I am sure it can be run more efficiently, however it's not important given the number of packages at the moment.
  11. ### IMPORTANT: Be sure to set 'jdir' to the directory where Julia lives.
  12. ### For me, on an OpenSuse system, it's on my home directory in a folder called ".julia".
  13. ### It might be different for you
  14. ### Inspired by http://iaindunning.com/2014/pkg-deps.html
  15. ### For an R version, see
  16. ### http://blog.revolutionanalytics.com/2014/07/dependencies-of-popular-r-packages.html
  17. ### http://pastebin.com/2Fa2Uz0N
  18. #####
  19.  
  20. using Graphs
  21. #####
  22. ### Be sure this next line is set properly to your Julia folder.
  23. jdir = string(homedir(), "/.julia")
  24. #####
  25. metadatadir = string(jdir, "/METADATA")
  26. curdir = pwd()
  27. cd(metadatadir)
  28.  
  29. mddirfiles = readdir()
  30. exampleind = find(mddirfiles .== "Example")[1]
  31. deleteat!(mddirfiles, exampleind) # Throw out that one. It's misleading.
  32. mddirfiles = mddirfiles[find(map(isdir, mddirfiles))]
  33. nfiles = length(mddirfiles)
  34. ispackage = Array(Bool{}, nfiles)
  35. npackages = 0
  36.  
  37. for i = 1:nfiles # Find out which folders are packages
  38. if contains(mddirfiles[i], ".") == false # Ignore hidden folders
  39. tempfiles = readdir(mddirfiles[i])
  40. ispackage[i] = in("versions", tempfiles)
  41. if ispackage[i]
  42. npackages += 1
  43. end
  44. else
  45. ispackage[i] = false
  46. end
  47. end
  48.  
  49. mddirfiles = mddirfiles[find(ispackage)] # Throw out those folders that aren't packages
  50. hasreqfile = Array(Bool{}, npackages)
  51. reqfile = Array(ASCIIString{}, npackages)
  52.  
  53. for i = 1:npackages # Find out which packages have require files and their locations
  54. newdir = string(mddirfiles[i], "/", "versions")
  55. filesindir = readdir(newdir)
  56. maxvers = maximum(filesindir)
  57. newdir = string(newdir, "/", maxvers)
  58. hasreqfile[i] = in("requires", readdir(newdir))
  59. reqfile[i] = string(newdir, "/requires")
  60. end
  61.  
  62. deppack = Array(Array{ASCIIString}, npackages)
  63.  
  64. # For string handling, see: http://docs.julialang.org/en/release-0.2/stdlib/base/?highlight=pwd#strings
  65.  
  66. for i = 1:npackages # Read and clean the dependencies
  67. if hasreqfile[i]
  68. newio = open(reqfile[i])
  69. deppack[i] = readlines(newio)
  70. close(newio)
  71. keepitems = Array(Bool{}, length(deppack[i]))
  72. for j = 1:length(deppack[i])
  73. deppack[i][j] = replace(deppack[i][j], "\n", "")
  74. deppack[i][j] = split(deppack[i][j], " ")[1]
  75. if (deppack[i][j] == "") | (deppack[i][j] == "julia") | (in(deppack[i][j], mddirfiles) == false)
  76. keepitems[j] = false
  77. else
  78. keepitems[j] = true
  79. end
  80. end
  81. deppack[i] = deppack[i][find(keepitems)]
  82. else
  83. deppack[i] = Array(ASCIIString{}, 0)
  84. end
  85. end
  86.  
  87. ndeps = sum(map(length, deppack))
  88. depel = Array(ASCIIString, ndeps, 2)
  89. depelcounter = 1
  90. vlist = Array(KeyVertex{ASCIIString}, npackages)
  91.  
  92. for i = 1:npackages # Create an array of vertices
  93. if length(deppack[i]) > 0
  94. for j = 1:length(deppack[i])
  95. depel[depelcounter, 1] = deppack[i][j]
  96. depel[depelcounter, 2] = mddirfiles[i]
  97. depelcounter += 1
  98. end
  99. end
  100. vlist[i] = KeyVertex(i, mddirfiles[i])
  101. end
  102.  
  103. elist = Array(Edge{typeof(vlist[1])}, size(depel, 1))
  104.  
  105. for i = 1:size(depel, 1) # Create an array of edges
  106. sender = vlist[find(mddirfiles .== depel[i, 1])[1]]
  107. receiver = vlist[find(mddirfiles .== depel[i, 2])[1]]
  108. elist[i] = Edge(i, sender, receiver)
  109. end
  110.  
  111. depgraph = graph(vlist, elist, is_directed = true) # I get an error here.
  112. # ERROR: assertion failed: edge_index(e) == num_edges(g) + 1
  113. # in add_edge! at /home/.../.julia/Graphs/src/graph.jl:83
  114. # in add_edge! at /home/.../.julia/Graphs/src/graph.jl:99
  115. # in graph at /home/.../.julia/Graphs/src/graph.jl:42
  116.  
  117. cd(curdir)
  118.  
  119. # writedlm("JuliaPackDepVNames.tsv", map((x)->x.rce.key, x.target.key), elist)
  120. # writedlm("JuliaPackDepVNames.tsv", map((x)->x.key, vlist))
Advertisement
Add Comment
Please, Sign In to add comment