├── .gitignore ├── LICENSE ├── README.rdoc ├── Rakefile ├── TODO ├── analysis ├── common.rb ├── gnuinlinux.R ├── gnuinlinux.rb ├── sectionsplit.R ├── sectionsplit.rb ├── sectionsplitdata ├── sizevschurn.R └── sizevschurn.rb ├── bin ├── ProcessPopCon ├── TestComparisons └── getsourcebugs.py ├── data ├── all-popcon-results-20101123.txt ├── default_packages │ └── natty └── popcon │ ├── all │ ├── all-popcon-results-debian-20110529.gz │ └── all-popcon-results.txt-20110529.gz ├── generated ├── comparisons │ ├── jaunty_karmic │ ├── karmic_lucid │ ├── lucid_maverick │ └── maverick_natty ├── gnuinlinux │ ├── Rplots.pdf │ ├── data1 │ ├── data2 │ ├── gnusplit.pdf │ ├── gnusplit.png │ ├── output │ ├── totalsplit.pdf │ └── totalsplit.png ├── sectionsplit │ ├── Rplots.pdf │ ├── data1 │ ├── figure.png │ ├── output │ └── sectionsplit.pdf └── sizevschurn │ ├── Rplots.pdf │ ├── data1 │ ├── figure.png │ ├── output │ └── sizevschurn.pdf ├── lib ├── all.rb ├── comparator.rb ├── rule_engine.rb ├── sources_info.rb ├── string_additions.rb └── utils.rb ├── rules ├── general.rules ├── jaunty_karmic.rules ├── karmic_lucid.rules ├── lucid_maverick.rules └── maverick_natty.rules ├── tasks └── masscompare.rb ├── test ├── popcon.test ├── rule_engine_test.rb ├── sources-info.test.bz2 ├── sources_info_test.rb └── utils_test.rb └── writeups ├── .gitignore └── Writeup1.tex /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | /pkgcache/ 3 | /cmpcache/ 4 | /tmpdir/ 5 | /lpcache/ 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.rdoc: -------------------------------------------------------------------------------- 1 | = codecomp 2 | 3 | This is a collection of scripts to do analysis of the evolution of code in open-source packages. Right now the following is working: 4 | 5 | * Matching consecutive versions of the same Ubuntu source packages and doing some simple analysis of the amount of code churn in them. This is basically a diffstat of the total diff -R between two consecutive versions of the same package. A set of rules is used to match packages that should be compared but have changed name (e.g., eglibc and glibc). 6 | * Analysing the Ubuntu popularity contest results to figure out the most popular packages as well as linking the popularity to the code difference 7 | 8 | I have also written two analysis based on these: 9 | 10 | * Evolution of the total changes in each of the last 4 Ubuntu development cycles 11 | * Comparison between the size of a package and its rate of mutation. 12 | 13 | See my first writeup for an explanation: 14 | 15 | http://pedrocr.net/text/preliminary-results-open-source-evolution 16 | 17 | == Dependencies 18 | 19 | You'll need at least: 20 | 21 | * Ruby 22 | * Rake 23 | * R 24 | * convert (from ImageMagick or GraphicsMagick) 25 | * A normal Unix userland (at least diff, patch, diffstat, find, tar). Some of it may use some GNU extensions (particularly tar) 26 | 27 | == Running it 28 | 29 | Running rake anywhere on the tree should build anything that isn't yet built. The generated/ dir can be removed to make the generation start from scratch. 30 | 31 | == License 32 | 33 | The code is licensed under GPLv2. See the LICENSE file for details 34 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | DISTS = ["jaunty","karmic","lucid","maverick","natty"] 2 | DISTPAIRS = DISTS[0..-2].zip(DISTS[1..-1]) 3 | DATADIR = "data/" 4 | GENDIR = "generated/" 5 | TASKSDIR = "tasks/" 6 | ANALYSISDIR = "analysis/" 7 | TMPDIR = "tmpdir/" 8 | FileUtils.mkdir_p [TMPDIR,GENDIR] 9 | 10 | require "lib/all" 11 | require "analysis/common" 12 | 13 | Dir.glob(TASKSDIR+"/*.rb").each{|file| require file} 14 | namespace :analysis do |n| 15 | Dir.glob(ANALYSISDIR+"*.rb").each do |file| 16 | RTask.new(file) if File.basename(file) != "common.rb" 17 | end 18 | task :all => n.tasks.map{|t| t.name} 19 | end 20 | 21 | desc "Run all analysis" 22 | task :analysis => ["analysis:all"] 23 | 24 | desc "Run everything" 25 | task :default => ["analysis"] 26 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | Priority 2 | 3 | Short-Term 4 | 5 | Abstract EXTRA_PACKAGES into a full data structure that includes the safeguards 6 | Use sloccount as another measure instead of my find|wc hack 7 | Obtain per-release or timeseries data on popularity 8 | Do a regression to explain popularity differences (ln(P2) = Rln(P1) + BX + E) where X is the amount of code differences 9 | -------------------------------------------------------------------------------- /analysis/common.rb: -------------------------------------------------------------------------------- 1 | require 'faster_csv' 2 | 3 | class CompResult 4 | # c = CompResult.new(["a"],[1]) 5 | # c.a #=> 1 6 | # 7 | # This is a wrapper to make the code look pretty when iterating the csv files 8 | # it probably has atrocious performance as it creates a new object per row 9 | # and does an instance_eval per cell 10 | def initialize(names,values) 11 | names.zip(values).each do |name, value| 12 | self.instance_eval "def #{name}; #{value.inspect}; end" 13 | end 14 | end 15 | 16 | def self.each(opts={}, &block) 17 | if opts[:dist1] and opts[:dist2] 18 | iterate_dists(opts[:dist1],opts[:dist2],opts, &block) 19 | else 20 | DISTPAIRS.each do |dist1, dist2| 21 | iterate_dists(dist1,dist2,opts, &block) 22 | end 23 | end 24 | end 25 | 26 | private 27 | def self.iterate_dists(dist1,dist2,opts) 28 | names = nil 29 | FasterCSV.foreach(GENDIR+"comparisons/#{dist1}_#{dist2}") do |row| 30 | if !names 31 | names = row 32 | else 33 | if opts[:with_dists] 34 | yield CompResult.new(names,row), dist1, dist2 35 | else 36 | yield CompResult.new(names,row) 37 | end 38 | end 39 | end 40 | end 41 | end 42 | 43 | class RTask 44 | # Defines a task that generates data, runs R scripts to produce plots and 45 | # output text, and generates pngs with convert from the R pdf plots 46 | 47 | def initialize(file) 48 | @filename = file 49 | @name = File.basename(file).split(".")[0] 50 | eval_file(file) 51 | end 52 | 53 | def datafile(num=1) 54 | GENDIR+@name+"/data"+num.to_s 55 | end 56 | 57 | def rfile 58 | ANALYSISDIR+@name+".R" 59 | end 60 | 61 | def desc(str) 62 | @desc = str 63 | end 64 | 65 | def run_R(opts={}) 66 | @ropts = opts 67 | end 68 | 69 | def png(page, name, opts={}) 70 | @png_runs[name] = [page,opts] 71 | end 72 | 73 | def pdf(page, name, opts={}) 74 | @pdf_runs[name] = [page,opts] 75 | end 76 | 77 | def create_data(num=1,&f) 78 | @ndatas = num 79 | @data_proc = f 80 | end 81 | 82 | private 83 | def eval_file(file) 84 | @png_runs = {} 85 | @pdf_runs = {} 86 | eval(File.read(file), binding, file) 87 | 88 | # Data currently depends on "compare_all_dists" although it doesn't have to 89 | @datafiles = [] 90 | (1..@ndatas).each do |i| 91 | @datafiles << datafile(i) 92 | Rake::FileTask.define_task(datafile(i) => [:compare_all_dists, @filename, __FILE__]) do 93 | @data_proc.call 94 | end 95 | end 96 | 97 | # Plots depend on data 98 | @plots = [] 99 | if @ropts 100 | @plots << (output = GENDIR+@name+"/Rplots.pdf") 101 | Rake::FileTask.define_task(output => @datafiles+[rfile,__FILE__]) do 102 | exec_R(rfile) 103 | end 104 | end 105 | 106 | # Pngs depend on plots 107 | @pngs = [] 108 | @png_runs.each do |name, opts| 109 | page,opts = opts 110 | @pngs << (filename = GENDIR+@name+"/"+name+".png") 111 | Rake::FileTask.define_task(filename => @plots+[__FILE__]) do 112 | exec_convert(page,filename,opts) 113 | end 114 | end 115 | 116 | # Pdfs depend on plots 117 | @pdfs = [] 118 | @pdf_runs.each do |name, opts| 119 | page,opts = opts 120 | @pdfs << (filename = GENDIR+@name+"/"+name+".pdf") 121 | Rake::FileTask.define_task(filename => @plots+[__FILE__]) do 122 | exec_pdf(page,filename,opts) 123 | end 124 | end 125 | 126 | # Main tasks 127 | mkdirtask = Rake::Task.define_task("mkdir_"+@name){FileUtils.mkdir_p GENDIR+@name} 128 | @maintask = Rake::Task.define_task(@name => [mkdirtask]+@datafiles+@plots+@pngs+@pdfs) 129 | @maintask.add_description @desc if @desc 130 | end 131 | 132 | def exec_R(rfile) 133 | $stderr.puts "Running #{rfile}" 134 | IO.popen("R --slave --vanilla","w+") do |proc| 135 | proc.puts("pdf(file=\"#{GENDIR}#{@name}/Rplots.pdf\",width=9,height=5)") 136 | @datafiles.each do |dfile| 137 | proc.puts("DATA <- read.table(\"#{dfile}\", header=TRUE)") 138 | proc.puts("attach(DATA)") 139 | end 140 | proc.puts File.read(rfile) 141 | proc.close_write 142 | output = proc.read 143 | File.open(GENDIR+@name+"/output","w"){|f| f.write output} 144 | end 145 | end 146 | 147 | def exec_convert(page, filename, opts) 148 | $stderr.puts "Writing #{filename}" 149 | copts = opts.map{|v| v.split}.flatten 150 | sh *(["convert","-density","1000x1000"]+copts+[@plots[0]+"[#{page}]", filename]) 151 | end 152 | 153 | def exec_pdf(page, filename, opts) 154 | $stderr.puts "Writing #{filename}" 155 | tmpfile = filename+".temp" 156 | sh "pdftk", "A=#{@plots[0]}", "cat", "A#{page+1}", "output", tmpfile 157 | sh "sh /usr/bin/pdfcrop --margins 10 #{tmpfile} #{filename}" #FIXME why do we need sh and /usr/bin ?! 158 | rm tmpfile 159 | end 160 | end 161 | -------------------------------------------------------------------------------- /analysis/gnuinlinux.R: -------------------------------------------------------------------------------- 1 | SIZEPER <- SIZE/sum(SIZE) 2 | CHURNPER <- CHURN/sum(CHURN) 3 | 4 | mycex = 1 5 | par(mar=c(0,0,0,0), cex=mycex) 6 | pct <- round(SIZEPER*100) 7 | labels <- paste(LABEL, " ", pct, "%", sep="") # add percents to labels 8 | pie(SIZEPER,labels=labels,col=c('#dd0000',gray.colors(length(LABEL)-1, end=0.97))) 9 | 10 | PKG_SIZEPER = PKG_SIZE/sum(PKG_SIZE) 11 | 12 | pct <- round(PKG_SIZEPER*100) 13 | labels <- paste(PKG_LABEL, " ", pct, "%", sep="") # add percents to labels 14 | pie(PKG_SIZEPER,labels=labels,col=gray.colors(length(PKG_LABEL)-1, start=0.97, end=0.3)) 15 | 16 | #barplot(SIZEPER,names.arg=LABEL,space=0.5,cex.names=0.4) 17 | -------------------------------------------------------------------------------- /analysis/gnuinlinux.rb: -------------------------------------------------------------------------------- 1 | desc "figure out how much of Ubuntu is GNU" 2 | 3 | run_R 4 | png 0, "totalsplit", ["-trim", "-geometry 9999x300","-bordercolor white","-border 10x10"] 5 | pdf 0, "totalsplit" 6 | png 1, "gnusplit", ["-trim", "-geometry 9999x300","-bordercolor white","-border 10x10"] 7 | pdf 1, "gnusplit" 8 | 9 | create_data(2) do 10 | $stderr.puts "Running gnuinlinux" 11 | dist1 = "maverick" 12 | dist2 = "natty" 13 | sinfo2 = SourcesInfo.new(dist2) 14 | 15 | EXTRA_PACKAGES = { 16 | :gnu => %w{gnutls26 texinfo binutils gdb eglibc coreutils gpgme1.0 gnupg gnupg2 mailman tar 17 | readline6 parted grub}, 18 | :kernel => %w{linux}, 19 | :kernelaid => %w{iptables libvirt qemu-kvm alsa-driver 20 | syslinux util-linux udev e2fsprogs openhpi reiserfsprogs 21 | reiser4progs libusb net-tools strace elfutils jfsutils xfsdump 22 | xfsprogs crash openipmi lvm2 apparmor ocfs2-tools alsa-lib 23 | v4lutils mdadm binfmt-support ecryptfs-utils kexec-tools 24 | linux-ntfs squashfs-tools}, 25 | :bsd => %w{openssh bsdmainutils}, 26 | :gnome => %w{gimp gimp-help gcalctool gnome-vfs gvfs gconf-editor libbonobo 27 | libbonoboui}, 28 | :misc => %w{likewise-open eucalyptus-commons-ext rpm}, 29 | :java => %w{openjdk-6b18}, 30 | :devel => %w{llvm-2.8 boost1.42 gccxml subversion bzr valgrind git tcl8.5 31 | tk8.4 tk8.5 php5 cmake cpu-checker groovy puppet nasm re2c 32 | mono-tools linux86 libsigc++-2.0}, 33 | :kde => %w{k3b ktorrent libktorrent konq-plugins webkit qtwebkit-source}, 34 | :userapps => %w{inkscape digikam ubiquity banshee vim pidgin ghostscript 35 | imagemagick xine-lib libav clamav transmission scribus gftp 36 | fetchmail rsync bogofilter texi2html virt-manager 37 | modemmanager openvpn bouncycastle bacula graphviz avogadro 38 | mutt moin nagios3 lftp cdrkit freeradius tiff vorbis-tools 39 | nano nut tcpdump}, 40 | :baseapps => %w{poppler pulseaudio samba mysql-5.1 bind9 krb5 gstreamer0.10 41 | gst-plugins-good0.10 gst-plugins-base0.10 busybox 42 | sane-backends sudo gpsd postgresql-8.4 gutenprint cups 43 | virtuoso-opensource packagekit lapack dom4j icu openssl 44 | openldap gwt sqlite sqlite3 imlib2 libnih zlib libjpeg8 45 | clutter-1.0 cairo libgphoto2 libxml libxml2 clutter1.0 db4.8 46 | db fftw3 postfix libsdl1.2 directfb ntp flac dovecot 47 | libsamplerate net-snmp saxonb libvigraimpex quagga 48 | wpasupplicant exiv2 libxslt bluez exim4 pam twisted squid 49 | xapian-bindings xapian-core drools openbabel hsqldb curl 50 | ncurses hplip avahi pango1.0 gegl nas blas foomatic-db 51 | libvorbis orbit2 klibc gupnp u-boot}, 52 | :xorg => %w{mesa}, 53 | :ubuntu => %w{installation-guide usb-creator upstart}, 54 | :debian => %w{synaptic apt-setup base-installer debconf gdebi devscripts 55 | aptitude apt tasksel debian-installer}, 56 | :ignore => %w{linux-backports-modules-2.6.38 llvm-2.7 openjdk-6} 57 | } 58 | 59 | # Make sure no package was classified twice and that all lists of packages are 60 | # actually arrays. %w{ is easy to mistake for %{ 61 | reversed = {} 62 | EXTRA_PACKAGES.each do |s, pkgs| 63 | Util.fatal_error "EXTRA_PACKAGES for #{s} not Array" if pkgs.class != Array 64 | pkgs.each do |p| 65 | if reversed[p] 66 | Util.fatal_error "pkg #{p} classified both as #{reversed[p]} and #{s}" 67 | else 68 | reversed[p] = s 69 | end 70 | end 71 | end 72 | 73 | cats = [:other,:misc,:userapps,:libreoffice,:baseapps,:java,:gnome,:kde,:gnu,:debian, 74 | :ubuntu,:apache,:mozilla,:freedesktop,:bsd,:devel,:xorg,:kernelaid,:kernel] 75 | results = {} 76 | gnupkgs = {} 77 | cats.each{|cat| results[cat] = [0,0]} 78 | 79 | others = [] 80 | CompResult.each(:dist1 => dist1, :dist2 => dist2) do |cmp| 81 | section = cmp.to_section||cmp.from_section 82 | sec = nil 83 | if cmp.to == "nil" 84 | sec = nil 85 | else 86 | pkg = sinfo2.package_to_file(cmp.to) 87 | homepage = pkg.homepage||"" 88 | vcsbrowser = pkg.vcsbrowser||"" 89 | maintainer = pkg.maintainer||"" 90 | EXTRA_PACKAGES.each{|s, pkgs| sec = s if pkgs.include? cmp.to} 91 | if sec 92 | # We're done 93 | elsif pkg.priority == "extra" 94 | sec = nil 95 | elsif homepage.include? ".gnu.org" or homepage.include? ".fsf.org" 96 | sec = :gnu 97 | elsif cmp.to.startswith? "openoffice" or cmp.to.startswith? "libreoffice" 98 | sec = :libreoffice 99 | elsif homepage.include? ".gnome.org" 100 | sec = :gnome 101 | elsif homepage.include? ".apache.org" 102 | sec = :apache 103 | elsif homepage.include? ".mozilla.org" or maintainer.include? "mozillateam" 104 | sec = :mozilla 105 | elsif homepage.include? ".freedesktop.org" 106 | sec = :freedesktop 107 | elsif homepage.include? ".debian.org" 108 | sec = :debian 109 | elsif cmp.to.startswith? "partman" 110 | sec = :debian 111 | elsif cmp.to.startswith? "qt4-" or cmp.to.startswith? "qt-" or cmp.to.startswith? "kde" 112 | sec = :kde 113 | elsif cmp.to.startswith? "gtk" or cmp.to.startswith? "gdk" or cmp.to.startswith? "glib" or cmp.to.startswith? "libgnome" 114 | sec = :gnome 115 | elsif cmp.to.startswith? "ubuntu" 116 | sec = :ubuntu 117 | elsif ["vcs","python","perl","interpreters","cli-mono"].include? section 118 | sec = :devel 119 | elsif ["gnome","kde"].include? section 120 | sec = section.to_sym 121 | elsif ["tex"].include? section 122 | sec = :userapps 123 | elsif ["x11"].include? section 124 | sec = :xorg 125 | elsif cmp.to.startswith? "ibus-" or cmp.to == "ibus" 126 | sec = :baseapps 127 | else 128 | sec = :other 129 | others << [cmp.to,cmp.to_loc.to_i,homepage] 130 | end 131 | end 132 | size = cmp.to_loc.to_i 133 | churn = cmp.insertions.to_i+cmp.deletions.to_i 134 | 135 | if sec == :gnu 136 | gnupkgs[cmp.to] = [size,churn] 137 | end 138 | 139 | if sec and sec != :ignore 140 | results[sec][0] += size 141 | results[sec][1] += churn 142 | end 143 | end 144 | 145 | #puts others.sort{|a,b| a[1] <=> b[1]}.reverse.map{|el| el.join(" ")} 146 | #$stdout.flush 147 | #$stderr.puts "#{others.size} package in :others" 148 | 149 | 150 | 151 | finalcats = [:gnu, :kernel, :kde, :mozilla, :gnome, :java, :xorg] 152 | sum2 = Proc.new{|a,b| [a[0]+b[0],a[1]+b[1]]} 153 | 154 | finalresults = {} 155 | finalcats.each {|cat| finalresults[cat]=results[cat]} 156 | finalresults[:kernel] = sum2.call(results[:kernel],results[:kernelaid]) 157 | 158 | total = results.values.reduce(&sum2) 159 | considered = finalresults.values.reduce(&sum2) 160 | finalresults[:other] = [total[0]-considered[0],total[1]-considered[1]] 161 | 162 | File.open(datafile(1), "w") do |f| 163 | f.puts "LABEL SIZE CHURN" 164 | (finalcats+[:other]).each {|cat| f.puts cat.to_s+" "+finalresults[cat].join(" ")} 165 | end 166 | 167 | finalpkgs = {:gcc => ["gcc-4.5","gcj-4.5"], :gdb => "gdb", :binutils => "binutils", 168 | :glibc => "eglibc", :gettext => "gettext", :emacs => "emacs23", 169 | :coreutils => "coreutils", :grub => "grub2", :gnutls => "gnutls26", 170 | :gnupg => ["gnupg2","gpgme1.0"], :gsl => "gsl", 171 | :libunistring => "libunistring",:mailman=>"mailman"} 172 | finalresults = [] 173 | finalpkgs.each do |name, pkg| 174 | pkgs = ((pkg.instance_of? Array) ? pkg : [pkg]) 175 | finalresults << [name, pkgs.map{|pkg| gnupkgs[pkg]}.reduce(&sum2)] 176 | end 177 | total = gnupkgs.values.reduce(&sum2) 178 | considered = finalresults.map{|n,vals| vals}.reduce(&sum2) 179 | finalresults.sort!{|a,b| a[1][0] <=> b[1][0]} 180 | finalresults << [:other, [total[0]-considered[0],total[1]-considered[1]]] 181 | 182 | File.open(datafile(2), "w") do |f| 183 | f.puts "PKG_LABEL PKG_SIZE PKG_CHURN" 184 | finalresults.each{|pkg, values| f.puts pkg.to_s+" "+values.join(" ")} 185 | end 186 | end 187 | -------------------------------------------------------------------------------- /analysis/sectionsplit.R: -------------------------------------------------------------------------------- 1 | mycex = 1.2 2 | par(mar=c(5,7,1,7), cex=mycex) 3 | 4 | total <- CORE+BASE+USER 5 | ymax <- 180*10^6 6 | plot(c(0), type="n", xlim=c(0.85,4.15), ylim=c(0,ymax), yaxs='i', xaxs="i", axes=FALSE, ann=FALSE) 7 | 8 | #title(main="Amount of Change per Release Cycle") 9 | 10 | xmarks = c(-100,1,2,3,4,100) 11 | axis(1, at=xmarks, labels=c("","karmic","lucid","maverick","natty","")) 12 | title(xlab= "Release cycle") 13 | 14 | ymarks = c(-100,10,40,70,100,130,160,2000) 15 | axis(2, las=1, at=ymarks*10^6, labels=ymarks) 16 | title(ylab="Total Changes\n(Millions of Diff Changed Lines)") 17 | 18 | lines(CORE, type="o", col="red") 19 | lines(BASE, type="o", col="blue") 20 | lines(USER, type="o", col="green") 21 | lines(total, type="o", col="black",lty=2) 22 | 23 | legend('topright', c("total","user","base","core"), 24 | col=c("black","green","blue","red"), pch=21, lty=c(2,1,1,1), bty="n"); 25 | -------------------------------------------------------------------------------- /analysis/sectionsplit.rb: -------------------------------------------------------------------------------- 1 | desc "plot sections by code churn" 2 | run_R 3 | png 0, "figure", ["-geometry 550x9999"] 4 | pdf 0, "sectionsplit" 5 | 6 | create_data do 7 | churns = {} 8 | 9 | types = {} 10 | ["cli-mono","devel","embedded","interpreters","java","libdevel","libs", 11 | "metapackages","oldlibs","perl","python","shells"].each{|s| types[s] = :base} 12 | ["kernel","admin","debian-installer"].each{|s| types[s] = :core} 13 | ["comm","database","doc","editors","fonts","games","gnome","graphics","kde", 14 | "mail","math","misc","net","news","otherosfs","science","sound","tex","text", 15 | "utils","vcs","video","web","x11","zope"].each{|s| types[s] = :user} 16 | 17 | CompResult.each(:with_dists => :true) do |cmp, dist1, dist2| 18 | if cmp.from_section && cmp.to_section and cmp.from_section != cmp.to_section 19 | Util.warn "#{cmp.from} has section #{cmp.from_section} and #{cmp.to} has section #{cmp.to_section}" 20 | end 21 | section = cmp.to_section||cmp.from_section 22 | type = types[section] 23 | Util.fatal_error("No such section #{section} in correspondence") if !type 24 | churns[type] ||= {} 25 | churns[type]["#{dist1}_#{dist2}"] ||= 0 26 | churns[type]["#{dist1}_#{dist2}"] += (cmp.insertions.to_i+cmp.deletions.to_i) 27 | end 28 | 29 | File.open(datafile, "w") do |f| 30 | f.puts "CORE BASE USER" 31 | DISTPAIRS.each do |d1, d2| 32 | f.puts([:core,:base,:user].map{|t| churns[t]["#{d1}_#{d2}"]||0}.join(" ")) 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /analysis/sectionsplitdata: -------------------------------------------------------------------------------- 1 | CORE BASE USER 2 | 7241749 95982377 63521786 3 | 6182934 59848438 84940277 4 | 5275165 65228903 45189188 5 | 8598174 51187833 37710278 6 | -------------------------------------------------------------------------------- /analysis/sizevschurn.R: -------------------------------------------------------------------------------- 1 | par(mar=c(4.5,5,1,5),cex=1.2) 2 | 3 | reg1 <- lm(log(CHURN) ~ log(SIZE)) 4 | plot(log(SIZE),log(CHURN),cex=0.7) 5 | abline(reg1) 6 | 7 | reg2 <- lm(CHURN ~ log(SIZE)) 8 | plot(log(SIZE),CHURN,ann=FALSE,bty="n",cex=0.7) 9 | title(xlab="log(LOC)",ylab="Churn") 10 | abline(reg2, col="red", lwd=2) 11 | 12 | 13 | plot(SIZE, type="n") 14 | lines(sort(SIZE, decreasing=TRUE)) 15 | 16 | plot(CHURN, type="n") 17 | lines(sort(CHURN, decreasing=TRUE)) 18 | 19 | plot(GROWTH, type="n") 20 | lines(sort(GROWTH, decreasing=TRUE)) 21 | plot(density(GROWTH),ylim=c(0,0.04)) 22 | 23 | print(summary(reg2)) 24 | -------------------------------------------------------------------------------- /analysis/sizevschurn.rb: -------------------------------------------------------------------------------- 1 | desc "predict code churn based on size" 2 | run_R 3 | png 1, "figure", ["-geometry 550x9999"] 4 | pdf 1, "sizevschurn" 5 | 6 | create_data do 7 | File.open(datafile, "w") do |f| 8 | f.puts "CHURN SIZE GROWTH" 9 | CompResult.each do |cmp| 10 | if cmp.from != "nil" and cmp.to != "nil" 11 | size = cmp.from_loc.to_f 12 | growth = (cmp.to_loc.to_f/size-1)*100 13 | churn = (cmp.insertions.to_i+cmp.deletions.to_i).to_f/size*100/2 14 | 15 | # (churn < 100) Eliminate packages where commonality seems to be so low 16 | # churn isn't measuring anything. 100% churn comes from cases where 17 | # there is really no commonality and everything is deemed rewritten. 18 | # (Note that since churn is calculated as percentage of from_loc it 19 | # can be >100 if a lot of new code is added. This seems rare enough 20 | # to not matter) 21 | # 22 | # (churn > 0) Ignore packages with no changes and avoid log(0) if doing 23 | # log(CHURN) in R 24 | if churn < 100 and churn > 0 25 | f.puts [churn,size,growth].join(" ") 26 | end 27 | end 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /bin/ProcessPopCon: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # Process the popularity contest results to select the N most popular ones 3 | 4 | $-w = true 5 | require File.dirname(__FILE__)+"/../lib/all" 6 | 7 | NUM_PKGS = ARGV[1].to_i 8 | if ARGV.size != 3 || NUM_PKGS == 0 9 | $stderr.puts "Usage: ProcessPopCon " 10 | exit(1) 11 | end 12 | 13 | PkgStats = {} 14 | 15 | File.new(ARGV[0]).each do |line| 16 | if line.startswith? "Package: " 17 | s = line.split[1..-1] 18 | PkgStats[s[0]] = s[1..-1].map{|v| v.to_i} 19 | end 20 | end 21 | 22 | def nvotes(list); list.map{|el| el[1][0]}.reduce(:+); end 23 | 24 | total_list = PkgStats.sort{|a,b| a[1][0] <=> b[1][0]} 25 | selection = total_list[0-NUM_PKGS..-1] 26 | 27 | total_votes = nvotes(total_list) 28 | selection_votes = nvotes(selection) 29 | vote_fraction = selection_votes.to_f/total_votes.to_f 30 | package_fraction = NUM_PKGS.to_f/total_list.size.to_f 31 | 32 | #Output a list of packages with the number of regular users 33 | File.open(ARGV[2],"w") do |f| 34 | selection.reverse.each {|p| f.puts "#{p[0]} #{p[1][0]}"} 35 | end 36 | 37 | puts "Covering #{NUM_PKGS}/#{total_list.size} packages (#{package_fraction})" 38 | puts "Covering #{selection_votes}/#{total_votes} votes (#{vote_fraction})" 39 | -------------------------------------------------------------------------------- /bin/TestComparisons: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # Test comparisons between two packages 3 | 4 | $-w = true 5 | require File.dirname(__FILE__)+"/../lib/all" 6 | 7 | require "string_additions" 8 | require "sources_info" 9 | require "comparator" 10 | 11 | if ARGV.size != 4 12 | $stderr.puts "Usage: TestComparisons " 13 | exit(1) 14 | end 15 | 16 | pkg1 = ARGV[0] 17 | pkg2 = ARGV[1] 18 | s1 = SourcesInfo.new(ARGV[2]) 19 | s2 = SourcesInfo.new(ARGV[3]) 20 | 21 | if pkg1 != pkg2 22 | $stderr.puts "Error: source packages for #{bin} differ (#{pkg1} vs #{pkg2})" 23 | exit 1 24 | end 25 | 26 | Comparator.compare(pkg1, pkg2, s1, s2) 27 | Comparator.compare(nil, pkg2, s1, s2) 28 | Comparator.compare(pkg1, nil, s1, s2) 29 | -------------------------------------------------------------------------------- /bin/getsourcebugs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from launchpadlib.launchpad import Launchpad 4 | import os 5 | 6 | # It's 2011, why is python defaulting to ascii for stdout? Backwards compatibility? 7 | import sys 8 | reload(sys) 9 | sys.setdefaultencoding('utf-8') 10 | 11 | cachedir = os.path.abspath(os.path.join(os.path.dirname(__file__),"../lpcache")) 12 | launchpad = Launchpad.login_anonymously('just testing', 'production', cachedir) 13 | ubuntu = launchpad.distributions['ubuntu'] 14 | package = ubuntu.getSourcePackage(name='glibc') 15 | bugs = package.searchTasks(status=["New", "Incomplete (with response)", "Incomplete (without response)", "Incomplete", "Opinion", "Invalid", "Won't Fix", "Expired", "Confirmed", "Triaged", "In Progress", "Fix Committed", "Fix Released"]) 16 | 17 | for bug in bugs: 18 | print bug.status 19 | -------------------------------------------------------------------------------- /data/all-popcon-results-20101123.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/data/all-popcon-results-20101123.txt -------------------------------------------------------------------------------- /data/default_packages/natty: -------------------------------------------------------------------------------- 1 | acpi-support 0.138 2 | acpid 1:2.0.7-1ubuntu2 3 | adduser 3.112+nmu1ubuntu5 4 | adium-theme-ubuntu 0.3.1-0ubuntu1 5 | aisleriot 1:2.32.1-0ubuntu5 6 | alacarte 0.13.2-1ubuntu2 7 | alsa-base 1.0.24+dfsg-0ubuntu1 8 | alsa-utils 1.0.24.2-0ubuntu6 9 | anacron 2.3-14ubuntu1 10 | app-install-data 0.11.04.7.3 11 | app-install-data-partner 12.11.04.2 12 | apparmor 2.6.1-0ubuntu3 13 | apparmor-utils 2.6.1-0ubuntu3 14 | appmenu-gtk 0.2.1-0ubuntu3 15 | apport 1.20.1-0ubuntu5 16 | apport-gtk 1.20.1-0ubuntu5 17 | apport-symptoms 0.12 18 | apt 0.8.13.2ubuntu2 19 | apt-clone 0.1.6 20 | apt-transport-https 0.8.13.2ubuntu2 21 | apt-utils 0.8.13.2ubuntu2 22 | apt-xapian-index 0.41ubuntu6 23 | aptdaemon 0.41+bzr646-0ubuntu2 24 | aptdaemon-data 0.41+bzr646-0ubuntu2 25 | apturl 0.4.2ubuntu5 26 | apturl-common 0.4.2ubuntu5 27 | archdetect-deb 1.81ubuntu2 28 | aspell 0.60.6-6 29 | aspell-en 6.0-0-6ubuntu1 30 | at 3.1.12-1ubuntu2 31 | at-spi 1.32.0-0ubuntu2 32 | avahi-autoipd 0.6.30-0ubuntu2 33 | avahi-daemon 0.6.30-0ubuntu2 34 | avahi-utils 0.6.30-0ubuntu2 35 | bamfdaemon 0.2.90-0ubuntu2 36 | banshee 2.0.0-2ubuntu1 37 | banshee-extension-soundmenu 2.0.0-2ubuntu1 38 | banshee-extension-ubuntuonemusicstore 2.0.0-2ubuntu1 39 | baobab 2.32.0-0ubuntu5 40 | base-files 5.0.0ubuntu28 41 | base-passwd 3.5.22 42 | bash 4.2-0ubuntu3 43 | bash-completion 1:1.3-1ubuntu3 44 | bc 1.06.95-2 45 | bind9-host 1:9.7.3.dfsg-1ubuntu2 46 | binfmt-support 2.0.3 47 | binutils 2.21.0.20110327-2ubuntu2 48 | bluez 4.91-0ubuntu1 49 | bluez-alsa 4.91-0ubuntu1 50 | bluez-cups 4.91-0ubuntu1 51 | bluez-gstreamer 4.91-0ubuntu1 52 | bogofilter 1.2.2-2ubuntu1 53 | bogofilter-bdb 1.2.2-2ubuntu1 54 | bogofilter-common 1.2.2-2ubuntu1 55 | branding-ubuntu 0.7 56 | brasero 2.32.1-0ubuntu2 57 | brasero-cdrkit 2.32.1-0ubuntu2 58 | brasero-common 2.32.1-0ubuntu2 59 | brltty 4.2-8ubuntu2 60 | brltty-x11 4.2-8ubuntu2 61 | bsdmainutils 8.2.2 62 | bsdutils 1:2.17.2-9.1ubuntu4 63 | btrfs-tools 0.19+20100601-3ubuntu2 64 | build-essential 11.5ubuntu1 65 | busybox-initramfs 1:1.17.1-10ubuntu1 66 | busybox-static 1:1.17.1-10ubuntu1 67 | bzip2 1.0.5-6ubuntu1 68 | ca-certificates 20090814+nmu2 69 | capplets-data 1:2.32.1-0ubuntu15 70 | casper 1.265 71 | checkbox 0.11.3 72 | checkbox-gtk 0.11.3 73 | cifs-utils 2:4.5-2 74 | cli-common 0.7.1 75 | cmap-adobe-japan1 0+20090930-2 76 | command-not-found 0.2.41ubuntu2 77 | command-not-found-data 0.2.41ubuntu2 78 | compiz 1:0.9.4+bzr20110415-0ubuntu2 79 | compiz-core 1:0.9.4+bzr20110415-0ubuntu2 80 | compiz-gnome 1:0.9.4+bzr20110415-0ubuntu2 81 | compiz-plugins 1:0.9.4+bzr20110415-0ubuntu2 82 | compiz-plugins-main 0.9.4+bzr20110406-0ubuntu2 83 | compizconfig-backend-gconf 0.9.2.4-0ubuntu1 84 | computer-janitor 2.1.0-0ubuntu4 85 | computer-janitor-gtk 2.1.0-0ubuntu4 86 | console-setup 1.57ubuntu20 87 | console-terminus 4.30-2 88 | consolekit 0.4.4-1 89 | coreutils 8.5-1ubuntu6 90 | cpio 2.11-7ubuntu1 91 | cpp 4:4.5.2-1ubuntu3 92 | cpp-4.5 4.5.2-8ubuntu4 93 | cron 3.0pl1-116ubuntu1 94 | cryptsetup 2:1.1.3-4ubuntu1 95 | cups 1.4.6-5ubuntu1 96 | cups-bsd 1.4.6-5ubuntu1 97 | cups-client 1.4.6-5ubuntu1 98 | cups-common 1.4.6-5ubuntu1 99 | cups-driver-gutenprint 5.2.6-1ubuntu1 100 | cups-ppdc 1.4.6-5ubuntu1 101 | dash 0.5.5.1-7.2ubuntu1 102 | dbus 1.4.6-1ubuntu6 103 | dbus-x11 1.4.6-1ubuntu6 104 | dc 1.06.95-2 105 | debconf 1.5.36ubuntu4 106 | debconf-i18n 1.5.36ubuntu4 107 | debianutils 3.4.3ubuntu1 108 | defoma 0.11.12ubuntu1 109 | desktop-file-utils 0.18-0ubuntu4 110 | dictionaries-common 1.9.3ubuntu1 111 | diffstat 1.54-1 112 | diffutils 1:3.0-1 113 | dmidecode 2.9-1.2build1 114 | dmraid 1.0.0.rc16-4.1ubuntu3 115 | dmsetup 2:1.02.48-4ubuntu2 116 | dmz-cursor-theme 0.4.3 117 | dnsmasq-base 2.57-1 118 | dnsutils 1:9.7.3.dfsg-1ubuntu2 119 | doc-base 0.9.5ubuntu2 120 | docbook-xml 4.5-7 121 | dosfstools 3.0.9-1 122 | dpkg 1.16.0~ubuntu7 123 | dpkg-dev 1.16.0~ubuntu7 124 | dpkg-repack 1.33ubuntu2 125 | dvd+rw-tools 7.1-9 126 | e2fslibs 1.41.14-1ubuntu3 127 | e2fsprogs 1.41.14-1ubuntu3 128 | ecryptfs-utils 87-0ubuntu1 129 | ed 1.5-1 130 | eject 2.1.5+deb1+cvs20081104-7.1 131 | empathy 2.34.0-0ubuntu3 132 | empathy-common 2.34.0-0ubuntu3 133 | eog 2.32.1-0ubuntu2 134 | espeak 1.44.05-1ubuntu1 135 | espeak-data 1.44.05-1ubuntu1 136 | evince 2.32.0-0ubuntu12 137 | evince-common 2.32.0-0ubuntu12 138 | evolution 2.32.2-0ubuntu7 139 | evolution-common 2.32.2-0ubuntu7 140 | evolution-data-server 2.32.2-0ubuntu2 141 | evolution-data-server-common 2.32.2-0ubuntu2 142 | evolution-exchange 2.32.2-0ubuntu3 143 | evolution-indicator 0.2.14-0ubuntu4 144 | evolution-plugins 2.32.2-0ubuntu7 145 | evolution-webcal 2.32.0-0ubuntu2 146 | example-content 43 147 | exiv2 0.21.1-0ubuntu2 148 | fakeroot 1.14.4-1ubuntu1 149 | file 5.04-5ubuntu2 150 | file-roller 2.32.1-0ubuntu4 151 | findutils 4.4.2-1ubuntu3 152 | firefox 4.0+nobinonly-0ubuntu3 153 | firefox-globalmenu 4.0+nobinonly-0ubuntu3 154 | firefox-gnome-support 4.0+nobinonly-0ubuntu3 155 | fontconfig 2.8.0-2.1ubuntu3 156 | fontconfig-config 2.8.0-2.1ubuntu3 157 | foo2zjs 20110210dfsg-1ubuntu2 158 | foomatic-db-compressed-ppds 20110317-0ubuntu1 159 | foomatic-db-engine 4.0.7-0ubuntu1 160 | foomatic-filters 4.0.7-0ubuntu1 161 | friendly-recovery 0.2.11 162 | ftp 0.17-23 163 | fuse-utils 2.8.4-1.1ubuntu4 164 | g++ 4:4.5.2-1ubuntu3 165 | g++-4.5 4.5.2-8ubuntu4 166 | gamin 0.1.10-2ubuntu1 167 | gbrainy 1.65-0ubuntu1 168 | gcalctool 6.0.1~git20110421-0ubuntu1 169 | gcc 4:4.5.2-1ubuntu3 170 | gcc-4.5 4.5.2-8ubuntu4 171 | gcc-4.5-base 4.5.2-8ubuntu4 172 | gconf-defaults-service 2.32.2-0ubuntu2 173 | gconf-editor 2.32.0-0ubuntu2 174 | gconf2 2.32.2-0ubuntu2 175 | gconf2-common 2.32.2-0ubuntu2 176 | gdb 7.2-1ubuntu11 177 | gdm 2.32.1-0ubuntu3 178 | gdm-guest-session 0.24 179 | gedit 2.30.4-2ubuntu1 180 | gedit-common 2.30.4-2ubuntu1 181 | genisoimage 9:1.1.11-1ubuntu2 182 | geoclue 0.12.0-1ubuntu8 183 | geoclue-ubuntu-geoip 0.0.2-0ubuntu5 184 | geoip-database 1.4.7~beta6+dfsg-1 185 | gettext 0.18.1.1-3ubuntu1 186 | gettext-base 0.18.1.1-3ubuntu1 187 | ghostscript 9.01~dfsg-1ubuntu5 188 | ghostscript-cups 9.01~dfsg-1ubuntu5 189 | ghostscript-x 9.01~dfsg-1ubuntu5 190 | ginn 0.2.4-0ubuntu1 191 | gir1.2-appindicator-0.1 0.3.0-0ubuntu1 192 | gir1.2-atk-1.0 2.0.0-0ubuntu1 193 | gir1.2-freedesktop 0.10.7-0ubuntu1 194 | gir1.2-gconf-2.0 2.32.2-0ubuntu2 195 | gir1.2-gdkpixbuf-2.0 2.23.3-0ubuntu1 196 | gir1.2-glib-2.0 0.10.7-0ubuntu1 197 | gir1.2-gtk-2.0 2.24.4-0ubuntu2 198 | gir1.2-notify-0.7 0.7.2-0ubuntu2 199 | gir1.2-panelapplet-3.0 1:2.32.1-0ubuntu6.3 200 | gir1.2-pango-1.0 1.28.4-0ubuntu1 201 | gir1.2-soup-2.4 2.34.0-0ubuntu1 202 | gir1.2-vte-0.0 1:0.27.90-0ubuntu1 203 | gksu 2.0.2-5ubuntu2 204 | glib-networking 2.28.5-0ubuntu1 205 | gnome-about 1:2.32.1-0ubuntu6 206 | gnome-accessibility-themes 2.32.1-0ubuntu1 207 | gnome-applets 2.32.1.1-0ubuntu5 208 | gnome-applets-data 2.32.1.1-0ubuntu5 209 | gnome-bluetooth 2.91.2.is.2.32.0-0ubuntu3 210 | gnome-codec-install 0.4.7ubuntu3 211 | gnome-control-center 1:2.32.1-0ubuntu15 212 | gnome-desktop-data 1:2.32.1-0ubuntu6 213 | gnome-disk-utility 2.32.1-0ubuntu4 214 | gnome-doc-utils 0.20.5-0ubuntu1 215 | gnome-games-common 1:2.32.1-0ubuntu5 216 | gnome-icon-theme 2.31.0-0ubuntu2 217 | gnome-keyring 2.92.92.is.2.32.1-0ubuntu2 218 | gnome-mag 1:0.16.3-0ubuntu2 219 | gnome-mahjongg 1:2.32.1-0ubuntu5 220 | gnome-media 2.32.0-0ubuntu7 221 | gnome-media-common 2.32.0-0ubuntu7 222 | gnome-menus 2.30.5-0ubuntu3 223 | gnome-mime-data 2.18.0-1 224 | gnome-nettool 2.32.0-0ubuntu1 225 | gnome-orca 3.0.0-0ubuntu2 226 | gnome-panel 1:2.32.1-0ubuntu6.3 227 | gnome-panel-bonobo 1:2.32.1-0ubuntu6.3 228 | gnome-panel-data 1:2.32.1-0ubuntu6.3 229 | gnome-power-manager 2.32.0-2ubuntu2 230 | gnome-screensaver 2.30.2-0ubuntu2 231 | gnome-screenshot 2.32.0-0ubuntu5 232 | gnome-search-tool 2.32.0-0ubuntu5 233 | gnome-session 2.32.1-0ubuntu19 234 | gnome-session-bin 2.32.1-0ubuntu19 235 | gnome-session-canberra 0.28-0ubuntu3 236 | gnome-session-common 2.32.1-0ubuntu19 237 | gnome-settings-daemon 2.32.1-0ubuntu13.1 238 | gnome-sudoku 1:2.32.1-0ubuntu5 239 | gnome-system-log 2.32.0-0ubuntu5 240 | gnome-system-monitor 2.28.2-0ubuntu1 241 | gnome-system-tools 2.32.0-0ubuntu7 242 | gnome-terminal 2.32.1-0ubuntu3 243 | gnome-terminal-data 2.32.1-0ubuntu3 244 | gnome-themes-selected 2.32.1-0ubuntu1 245 | gnome-themes-ubuntu 0.6.1 246 | gnome-user-guide 3.0.0+git20110406ubuntu8 247 | gnome-user-share 2.30.2-0ubuntu2 248 | gnome-utils-common 2.32.0-0ubuntu5 249 | gnomine 1:2.32.1-0ubuntu5 250 | gnupg 1.4.11-3ubuntu1 251 | gparted 0.7.0-1ubuntu1 252 | gpgv 1.4.11-3ubuntu1 253 | grep 2.6.3-3ubuntu1 254 | groff-base 1.21-5 255 | growisofs 7.1-9 256 | grub-common 1.99~rc1-13ubuntu3 257 | grub-gfxpayload-lists 0.2 258 | grub-pc 1.99~rc1-13ubuntu3 259 | gs-cjk-resource 1.20100103-2 260 | gsettings-desktop-schemas 3.0.0-0ubuntu1 261 | gsfonts 1:8.11+urwcyr1.0.7~pre44-4.2ubuntu1 262 | gstreamer0.10-alsa 0.10.32-1ubuntu5 263 | gstreamer0.10-gnonlin 0.10.17-1 264 | gstreamer0.10-nice 0.1.0-2ubuntu1 265 | gstreamer0.10-plugins-base 0.10.32-1ubuntu5 266 | gstreamer0.10-plugins-base-apps 0.10.32-1ubuntu5 267 | gstreamer0.10-plugins-good 0.10.28-0ubuntu7 268 | gstreamer0.10-pulseaudio 0.10.28-0ubuntu7 269 | gstreamer0.10-tools 0.10.32-3ubuntu3 270 | gstreamer0.10-x 0.10.32-1ubuntu5 271 | gtk2-engines 1:2.20.2-0ubuntu1 272 | gtk2-engines-murrine 0.98.1.1-0ubuntu3 273 | gtk2-engines-pixbuf 2.24.4-0ubuntu2 274 | gucharmap 1:2.32.1-0ubuntu2 275 | guile-1.8-libs 1.8.7+1-3ubuntu3 276 | gvfs 1.8.0-0ubuntu2 277 | gvfs-backends 1.8.0-0ubuntu2 278 | gvfs-fuse 1.8.0-0ubuntu2 279 | gwibber 3.0.0.1-0ubuntu2 280 | gwibber-service 3.0.0.1-0ubuntu2 281 | gwibber-service-facebook 3.0.0.1-0ubuntu2 282 | gwibber-service-identica 3.0.0.1-0ubuntu2 283 | gwibber-service-twitter 3.0.0.1-0ubuntu2 284 | gzip 1.3.12-9ubuntu1.1 285 | hdparm 9.32-1ubuntu3 286 | hicolor-icon-theme 0.12-1ubuntu1 287 | hostname 3.05ubuntu1 288 | hpijs 3.11.1-2ubuntu2 289 | hplip 3.11.1-2ubuntu2 290 | hplip-cups 3.11.1-2ubuntu2 291 | hplip-data 3.11.1-2ubuntu2 292 | humanity-icon-theme 0.5.3.10 293 | hunspell-en-ca 1:3.3.0-2ubuntu2 294 | hunspell-en-us 20070829-4ubuntu1 295 | hwdata 0.230-1 296 | ibus 1.3.9-0ubuntu3 297 | ibus-gtk 1.3.9-0ubuntu3 298 | ibus-pinyin 1.3.11-1 299 | ibus-pinyin-db-android 1.3.11-1 300 | ibus-table 1.3.0.20100621-2 301 | ifupdown 0.6.10ubuntu4 302 | im-switch 1.20ubuntu3 303 | indicator-applet 0.4.12-0ubuntu1 304 | indicator-applet-appmenu 0.4.12-0ubuntu1 305 | indicator-applet-complete 0.4.12-0ubuntu1 306 | indicator-applet-session 0.4.12-0ubuntu1 307 | indicator-application 0.3.2-0ubuntu1 308 | indicator-appmenu 0.2.1-0ubuntu2 309 | indicator-datetime 0.2.3-0ubuntu3 310 | indicator-me 0.2.19-0ubuntu1 311 | indicator-messages 0.4.0-0ubuntu1 312 | indicator-session 0.2.17-0ubuntu1 313 | indicator-sound 0.6.6.1-0ubuntu3 314 | info 4.13a.dfsg.1-6ubuntu3 315 | initramfs-tools 0.98.8ubuntu3 316 | initramfs-tools-bin 0.98.8ubuntu3 317 | initscripts 2.87dsf-4ubuntu23 318 | inputattach 20051019-12ubuntu1 319 | insserv 1.14.0-2 320 | install-info 4.13a.dfsg.1-6ubuntu3 321 | intel-gpu-tools 1.0.2+git20100324-0ubuntu1 322 | intltool-debian 0.35.0+20060710.1 323 | iproute 20100519-3 324 | iptables 1.4.10-1ubuntu1 325 | iputils-arping 3:20100418-3ubuntu1 326 | iputils-ping 3:20100418-3ubuntu1 327 | iputils-tracepath 3:20100418-3ubuntu1 328 | irqbalance 0.56-1ubuntu3 329 | isc-dhcp-client 4.1.1-P1-15ubuntu9 330 | isc-dhcp-common 4.1.1-P1-15ubuntu9 331 | iso-codes 3.24-1 332 | jfsutils 1.1.12-2.1 333 | jockey-common 0.9.2-0ubuntu5 334 | jockey-gtk 0.9.2-0ubuntu5 335 | kbd 1.15-1ubuntu5 336 | kerneloops-daemon 0.12+git20090217-1ubuntu11 337 | keyboard-configuration 1.57ubuntu20 338 | keyutils 1.4-4ubuntu2 339 | klibc-utils 1.5.20-1ubuntu6 340 | language-pack-de 1:11.04+20110421 341 | language-pack-de-base 1:11.04+20110421 342 | language-pack-en 1:11.04+20110421 343 | language-pack-en-base 1:11.04+20110421 344 | language-pack-es 1:11.04+20110421 345 | language-pack-es-base 1:11.04+20110421 346 | language-pack-gnome-de 1:11.04+20110421 347 | language-pack-gnome-de-base 1:11.04+20110421 348 | language-pack-gnome-en 1:11.04+20110421 349 | language-pack-gnome-en-base 1:11.04+20110421 350 | language-pack-gnome-es 1:11.04+20110421 351 | language-pack-gnome-es-base 1:11.04+20110421 352 | language-pack-gnome-pt 1:11.04+20110421 353 | language-pack-gnome-pt-base 1:11.04+20110421 354 | language-pack-gnome-xh 1:11.04+20110421 355 | language-pack-gnome-xh-base 1:11.04+20110421 356 | language-pack-gnome-zh-hans 1:11.04+20110421 357 | language-pack-gnome-zh-hans-base 1:11.04+20110421 358 | language-pack-pt 1:11.04+20110421 359 | language-pack-pt-base 1:11.04+20110421 360 | language-pack-xh 1:11.04+20110421 361 | language-pack-xh-base 1:11.04+20110421 362 | language-pack-zh-hans 1:11.04+20110421 363 | language-pack-zh-hans-base 1:11.04+20110421 364 | language-selector-common 0.33 365 | language-selector-gnome 0.33 366 | language-support-en 1:9.10+20090909 367 | language-support-writing-en 1:10.04+20100311 368 | laptop-detect 0.13.7ubuntu2 369 | launchpad-integration 0.1.51 370 | less 436-1 371 | lftp 4.0.9-2 372 | libaa1 1.4p5-38build1 373 | libacl1 2.2.49-4ubuntu2 374 | libalgorithm-diff-perl 1.19.02-2 375 | libalgorithm-diff-xs-perl 0.04-1 376 | libalgorithm-merge-perl 0.08-2 377 | libapparmor-perl 2.6.1-0ubuntu3 378 | libapparmor1 2.6.1-0ubuntu3 379 | libappindicator0.1-cil 0.3.0-0ubuntu1 380 | libappindicator1 0.3.0-0ubuntu1 381 | libapt-pkg-perl 0.1.24build1 382 | libarchive1 2.8.4-1 383 | libart-2.0-2 2.3.21-1 384 | libart2.0-cil 2.24.2-0ubuntu1 385 | libasound2 1.0.24.1-0ubuntu5 386 | libasound2-plugins 1.0.24-0ubuntu2 387 | libaspell15 0.60.6-6 388 | libatasmart4 0.17+git20100219-3 389 | libatk1.0-0 2.0.0-0ubuntu1 390 | libatk1.0-data 2.0.0-0ubuntu1 391 | libatkmm-1.6-1 2.22.5-0ubuntu1 392 | libatm1 1:2.5.1-1.2build1 393 | libatspi1.0-0 1.32.0-0ubuntu2 394 | libattr1 1:2.4.44-2ubuntu3 395 | libavahi-client3 0.6.30-0ubuntu2 396 | libavahi-common-data 0.6.30-0ubuntu2 397 | libavahi-common3 0.6.30-0ubuntu2 398 | libavahi-core7 0.6.30-0ubuntu2 399 | libavahi-glib1 0.6.30-0ubuntu2 400 | libavahi-gobject0 0.6.30-0ubuntu2 401 | libavahi-ui0 0.6.30-0ubuntu2 402 | libavc1394-0 0.5.3-1build4 403 | libbamf0 0.2.90-0ubuntu2 404 | libbind9-60 1:9.7.3.dfsg-1ubuntu2 405 | libblkid1 2.17.2-9.1ubuntu4 406 | libbluetooth3 4.91-0ubuntu1 407 | libbonobo2-0 2.32.1-0ubuntu1 408 | libbonobo2-common 2.32.1-0ubuntu1 409 | libbonoboui2-0 2.24.5-0ubuntu1 410 | libbonoboui2-common 2.24.5-0ubuntu1 411 | libboost-serialization1.42.0 1.42.0-4ubuntu2 412 | libbrasero-media1 2.32.1-0ubuntu2 413 | libbrlapi0.5 4.2-8ubuntu2 414 | libbsd0 0.2.0-1 415 | libburn4 0.8.0.pl00-2 416 | libbz2-1.0 1.0.5-6ubuntu1 417 | libc-bin 2.13-0ubuntu13 418 | libc-dev-bin 2.13-0ubuntu13 419 | libc6 2.13-0ubuntu13 420 | libc6-dev 2.13-0ubuntu13 421 | libcaca0 0.99.beta17-1 422 | libcairo-gobject2 1.10.2-2ubuntu2 423 | libcairo-perl 1.070-1ubuntu1 424 | libcairo2 1.10.2-2ubuntu2 425 | libcairomm-1.0-1 1.9.8-0ubuntu1 426 | libcamel1.2-19 2.32.2-0ubuntu2 427 | libcanberra-gtk-module 0.28-0ubuntu3 428 | libcanberra-gtk0 0.28-0ubuntu3 429 | libcanberra-pulse 0.28-0ubuntu3 430 | libcanberra0 0.28-0ubuntu3 431 | libcap-ng0 0.6.5-1 432 | libcap2 1:2.20-1 433 | libcdio-cdda0 0.81-4build1 434 | libcdio-paranoia0 0.81-4build1 435 | libcdio10 0.81-4build1 436 | libcdparanoia0 3.10.2+debian-10 437 | libcheese-gtk18 2.32.0-0ubuntu2 438 | libck-connector0 0.4.4-1 439 | libclass-accessor-perl 0.34-1 440 | libcloog-ppl0 0.15.9-2 441 | libcolamd2.7.1 1:3.4.0-2ubuntu2 442 | libcomerr2 1.41.14-1ubuntu3 443 | libcompizconfig0 0.9.4-0ubuntu2 444 | libcroco3 0.6.2-1 445 | libcrypt-passwdmd5-perl 1.3-9 446 | libcryptui0 2.32.0-0ubuntu3 447 | libcups2 1.4.6-5ubuntu1 448 | libcupscgi1 1.4.6-5ubuntu1 449 | libcupsdriver1 1.4.6-5ubuntu1 450 | libcupsimage2 1.4.6-5ubuntu1 451 | libcupsmime1 1.4.6-5ubuntu1 452 | libcupsppdc1 1.4.6-5ubuntu1 453 | libcurl3-gnutls 7.21.3-1ubuntu1 454 | libdaemon0 0.14-2 455 | libdatrie1 0.2.4-1 456 | libdb4.8 4.8.30-5ubuntu2 457 | libdbus-1-3 1.4.6-1ubuntu6 458 | libdbus-glib-1-2 0.92-0ubuntu1 459 | libdbusmenu-glib3 0.4.3-0ubuntu3 460 | libdbusmenu-gtk3 0.4.3-0ubuntu3 461 | libdconf0 0.7.3-0ubuntu1 462 | libdebconfclient0 0.154ubuntu2 463 | libdebian-installer4 0.77ubuntu2 464 | libdecoration0 1:0.9.4+bzr20110415-0ubuntu2 465 | libdee-1.0-1 0.5.18-0ubuntu1 466 | libdevmapper-event1.02.1 2:1.02.48-4ubuntu2 467 | libdevmapper1.02.1 2:1.02.48-4ubuntu2 468 | libdigest-hmac-perl 1.01-7 469 | libdigest-sha1-perl 2.13-1 470 | libdjvulibre-text 3.5.23-3ubuntu2 471 | libdjvulibre21 3.5.23-3ubuntu2 472 | libdmraid1.0.0.rc16 1.0.0.rc16-4.1ubuntu3 473 | libdns69 1:9.7.3.dfsg-1ubuntu2 474 | libdotconf1.0 1.0.13-3 475 | libdpkg-perl 1.16.0~ubuntu7 476 | libdrm-intel1 2.4.23-1ubuntu6 477 | libdrm-nouveau1a 2.4.23-1ubuntu6 478 | libdrm-radeon1 2.4.23-1ubuntu6 479 | libdrm2 2.4.23-1ubuntu6 480 | libdv4 1.0.0-2.1ubuntu1 481 | libebackend1.2-0 2.32.2-0ubuntu2 482 | libebook1.2-10 2.32.2-0ubuntu2 483 | libecal1.2-8 2.32.2-0ubuntu2 484 | libecryptfs0 87-0ubuntu1 485 | libedata-book1.2-8 2.32.2-0ubuntu2 486 | libedata-cal1.2-10 2.32.2-0ubuntu2 487 | libedataserver1.2-14 2.32.2-0ubuntu2 488 | libedataserverui1.2-11 2.32.2-0ubuntu2 489 | libedit2 2.11-20080614-2 490 | libegroupwise1.2-13 2.32.2-0ubuntu2 491 | libelf1 0.148-1ubuntu1 492 | libelfg0 0.8.13-1 493 | libemail-valid-perl 0.184-1 494 | libenchant1c2a 1.6.0-2 495 | libept1 1.0.4 496 | libespeak1 1.44.05-1ubuntu1 497 | libevdocument3 2.32.0-0ubuntu12 498 | libevent-1.4-2 1.4.13-stable-1 499 | libevolution 2.32.2-0ubuntu7 500 | libevview3 2.32.0-0ubuntu12 501 | libexempi3 2.1.1-1build2 502 | libexif12 0.6.20-0ubuntu1 503 | libexiv2-10 0.21.1-0ubuntu2 504 | libexpat1 2.0.1-7ubuntu3 505 | libffi5 3.0.9-3ubuntu1 506 | libfile-basedir-perl 0.03-1fakesync1 507 | libfile-copy-recursive-perl 0.38-1 508 | libfile-desktopentry-perl 0.04-2 509 | libfile-mimeinfo-perl 0.15-1 510 | libflac8 1.2.1-3 511 | libfolks-telepathy22 0.4.2-0ubuntu1 512 | libfolks22 0.4.2-0ubuntu1 513 | libfont-afm-perl 1.20-1 514 | libfontconfig1 2.8.0-2.1ubuntu3 515 | libfontenc1 1:1.1.0-1 516 | libfreetype6 2.4.4-1ubuntu2 517 | libfreezethaw-perl 0.5001-1 518 | libfribidi0 0.19.2-1 519 | libfs6 2:1.0.3-1 520 | libfuse2 2.8.4-1.1ubuntu4 521 | libgadu3 1:1.10.1-1 522 | libgail-common 2.24.4-0ubuntu2 523 | libgail-gnome-module 1.20.3-1 524 | libgail18 2.24.4-0ubuntu2 525 | libgamin0 0.1.10-2ubuntu1 526 | libgcc1 1:4.5.2-8ubuntu4 527 | libgconf2-4 2.32.2-0ubuntu2 528 | libgconf2.0-cil 2.24.2-0ubuntu1 529 | libgcr0 2.92.92.is.2.32.1-0ubuntu2 530 | libgcrypt11 1.4.6-4ubuntu2 531 | libgd2-xpm 2.0.36~rc1~dfsg-5ubuntu2 532 | libgdata-common 0.8.0-0ubuntu1 533 | libgdata1.7-cil 1.7.0.1-1 534 | libgdata11 0.8.0-0ubuntu1 535 | libgdbm3 1.8.3-9ubuntu1 536 | libgdk-pixbuf2.0-0 2.23.3-0ubuntu1 537 | libgdu-gtk0 2.32.1-0ubuntu4 538 | libgdu0 2.32.1-0ubuntu4 539 | libgee2 0.6.1-0ubuntu1 540 | libgeoclue0 0.12.0-1ubuntu8 541 | libgeoip1 1.4.7~beta6+dfsg-1 542 | libgexiv2-0 0.3.1-0ubuntu1 543 | libgirepository-1.0-1 0.10.7-0ubuntu1 544 | libgkeyfile1.0-cil 0.1-2ubuntu1 545 | libgksu2-0 2.0.13~pre1-3ubuntu3 546 | libgl1-mesa-dri 7.10.2-0ubuntu2 547 | libgl1-mesa-glx 7.10.2-0ubuntu2 548 | libglade2-0 1:2.6.4-1build1 549 | libglade2.0-cil 2.12.10-1ubuntu1 550 | libgladeui-1-11 3.8.0-0ubuntu1 551 | libglew1.5 1.5.7.is.1.5.2-1ubuntu2 552 | libglewmx1.5 1.5.7.is.1.5.2-1ubuntu2 553 | libglib-perl 2:1.223-1 554 | libglib2.0-0 2.28.6-0ubuntu1 555 | libglib2.0-bin 2.28.6-0ubuntu1 556 | libglib2.0-cil 2.12.10-1ubuntu1 557 | libglib2.0-data 2.28.6-0ubuntu1 558 | libglibmm-2.4-1c2a 2.28.0-1 559 | libglu1-mesa 7.10.2-0ubuntu2 560 | libgmime-2.4-2 2.4.24-0ubuntu1 561 | libgmime2.4-cil 2.4.24-0ubuntu1 562 | libgmp3c2 2:4.3.2+dfsg-1ubuntu3 563 | libgmpxx4ldbl 2:4.3.2+dfsg-1ubuntu3 564 | libgnome-bluetooth8 2.91.2.is.2.32.0-0ubuntu3 565 | libgnome-desktop-2-17 1:2.32.1-0ubuntu6 566 | libgnome-keyring0 2.32.0-1ubuntu2 567 | libgnome-mag2 1:0.16.3-0ubuntu2 568 | libgnome-media0 2.32.0-0ubuntu7 569 | libgnome-menu2 2.30.5-0ubuntu3 570 | libgnome-vfs2.0-cil 2.24.2-0ubuntu1 571 | libgnome-window-settings1 1:2.32.1-0ubuntu15 572 | libgnome2-0 2.32.1-0ubuntu3 573 | libgnome2-common 2.32.1-0ubuntu3 574 | libgnome2.24-cil 2.24.2-0ubuntu1 575 | libgnomecanvas2-0 2.30.3-0ubuntu1 576 | libgnomecanvas2-common 2.30.3-0ubuntu1 577 | libgnomekbd-common 2.32.0-0ubuntu1 578 | libgnomekbd4 2.32.0-0ubuntu1 579 | libgnomeui-0 2.24.5-0ubuntu1 580 | libgnomeui-common 2.24.5-0ubuntu1 581 | libgnomevfs2-0 1:2.24.4-0ubuntu4 582 | libgnomevfs2-common 1:2.24.4-0ubuntu4 583 | libgnutls26 2.8.6-1ubuntu2 584 | libgomp1 4.5.2-8ubuntu4 585 | libgoocanvas-common 0.15-1 586 | libgoocanvas3 0.15-1 587 | libgp11-0 2.92.92.is.2.32.1-0ubuntu2 588 | libgpg-error0 1.10-0.2ubuntu1 589 | libgpgme11 1.2.0-1.2ubuntu5 590 | libgphoto2-2 2.4.10.1-2ubuntu5 591 | libgphoto2-port0 2.4.10.1-2ubuntu5 592 | libgpm2 1.20.4-3.3ubuntu1 593 | libgpod-common 0.8.0-2 594 | libgpod4 0.8.0-2 595 | libgraphite3 1:2.3.1-0.2 596 | libgs9 9.01~dfsg-1ubuntu5 597 | libgs9-common 9.01~dfsg-1ubuntu5 598 | libgsl0ldbl 1.14+dfsg-1 599 | libgssapi-krb5-2 1.8.3+dfsg-5ubuntu2.1 600 | libgssdp-1.0-2 0.8.2-1 601 | libgstfarsight0.10-0 0.0.26-1ubuntu1 602 | libgstreamer-plugins-base0.10-0 0.10.32-1ubuntu5 603 | libgstreamer0.10-0 0.10.32-3ubuntu3 604 | libgtk-sharp-beans-cil 2.14.1-1 605 | libgtk-vnc-1.0-0 0.4.3-0ubuntu3 606 | libgtk2-perl 2:1.223-1 607 | libgtk2.0-0 2.24.4-0ubuntu2 608 | libgtk2.0-bin 2.24.4-0ubuntu2 609 | libgtk2.0-cil 2.12.10-1ubuntu1 610 | libgtk2.0-common 2.24.4-0ubuntu2 611 | libgtkhtml-editor-common 1:3.32.2-0ubuntu1 612 | libgtkhtml-editor0 1:3.32.2-0ubuntu1 613 | libgtkhtml3.14-19 1:3.32.2-0ubuntu1 614 | libgtkmm-2.4-1c2a 1:2.24.0-0ubuntu1 615 | libgtksourceview2.0-0 2.10.5-0ubuntu3 616 | libgtksourceview2.0-common 2.10.5-0ubuntu3 617 | libgtkspell0 2.0.16-1 618 | libgtop2-7 2.28.3-0ubuntu1 619 | libgtop2-common 2.28.3-0ubuntu1 620 | libgucharmap7 1:2.32.1-0ubuntu2 621 | libgudev-1.0-0 1:167-0ubuntu3 622 | libgudev1.0-cil 0.1-2 623 | libgupnp-1.0-3 0.14.1-1 624 | libgupnp-igd-1.0-3 0.1.7-3 625 | libgutenprint2 5.2.6-1ubuntu1 626 | libgvfscommon0 1.8.0-0ubuntu2 627 | libgweather-common 2.30.3-1ubuntu1 628 | libgweather1 2.30.3-1ubuntu1 629 | libgwibber1 0.1.1-0ubuntu1 630 | libhpmud0 3.11.1-2ubuntu2 631 | libhtml-format-perl 2.04-2 632 | libhtml-parser-perl 3.68-1 633 | libhtml-tagset-perl 3.20-2 634 | libhtml-tree-perl 4.1-1 635 | libhunspell-1.2-0 1.2.14-4 636 | libhyphen0 2.7.1-4ubuntu1 637 | libibus2 1.3.9-0ubuntu3 638 | libical0 0.44-3 639 | libice6 2:1.0.7-1ubuntu1 640 | libicu44 4.4.2-2 641 | libidl0 0.8.14-0.1ubuntu1 642 | libidn11 1.18-1build1 643 | libido-0.1-0 0.2.2-0ubuntu1 644 | libiec61883-0 1.2.0-0.1build1 645 | libieee1284-3 0.2.11-5ubuntu4 646 | libijs-0.35 0.35-7ubuntu1 647 | libimobiledevice2 1.1.0-3 648 | libindicate-gtk2 0.5.0-0ubuntu2 649 | libindicate5 0.5.0-0ubuntu2 650 | libindicator3 0.3.22-0ubuntu1 651 | libio-pty-perl 1:1.08-1 652 | libio-string-perl 1.08-2 653 | libipc-run-perl 0.89-1 654 | libisc62 1:9.7.3.dfsg-1ubuntu2 655 | libisccc60 1:9.7.3.dfsg-1ubuntu2 656 | libisccfg62 1:9.7.3.dfsg-1ubuntu2 657 | libisofs6 0.6.32-2ubuntu2 658 | libiw30 30~pre9-3ubuntu6 659 | libjack-jackd2-0 1.9.6~dfsg.1-5ubuntu1 660 | libjasper1 1.900.1-7ubuntu2 661 | libjbig2dec0 0.11-1ubuntu1 662 | libjpeg62 6b1-1ubuntu1 663 | libjs-jquery 1.5-2ubuntu1 664 | libjson-glib-1.0-0 0.12.2-0ubuntu1 665 | libk5crypto3 1.8.3+dfsg-5ubuntu2.1 666 | libkeyutils1 1.4-4ubuntu2 667 | libklibc 1.5.20-1ubuntu6 668 | libkpathsea5 2009-8ubuntu2 669 | libkrb5-3 1.8.3+dfsg-5ubuntu2.1 670 | libkrb5support0 1.8.3+dfsg-5ubuntu2.1 671 | liblaunchpad-integration-common 0.1.51 672 | liblaunchpad-integration1 0.1.51 673 | liblaunchpad-integration1.0-cil 0.1.51 674 | liblcms1 1.18.dfsg-1.2ubuntu1 675 | libldap-2.4-2 2.4.23-6ubuntu6 676 | liblircclient0 0.8.7-0ubuntu4 677 | liblocale-gettext-perl 1.05-6 678 | liblockfile1 1.08-4 679 | liblouis-data 2.0.0-1ubuntu2 680 | liblouis2 2.0.0-1ubuntu2 681 | libltdl7 2.2.6b-2ubuntu3 682 | liblua5.1-0 5.1.4-5 683 | liblvm2app2.2 2.02.66-4ubuntu2 684 | liblwres60 1:9.7.3.dfsg-1ubuntu2 685 | liblzma2 5.0.0-2 686 | libmagic1 5.04-5ubuntu2 687 | libmailtools-perl 2.06-1 688 | libmeanwhile1 1.0.2-3ubuntu1 689 | libmetacity-private0 1:2.30.3-0ubuntu8 690 | libmission-control-plugins0 1:5.7.7-1 691 | libmldbm-perl 2.04-1 692 | libmono-addins-gui0.2-cil 0.4-8 693 | libmono-addins0.2-cil 0.4-8 694 | libmono-cairo2.0-cil 2.6.7-5ubuntu3 695 | libmono-corlib2.0-cil 2.6.7-5ubuntu3 696 | libmono-i18n-west2.0-cil 2.6.7-5ubuntu3 697 | libmono-management2.0-cil 2.6.7-5ubuntu3 698 | libmono-posix2.0-cil 2.6.7-5ubuntu3 699 | libmono-security2.0-cil 2.6.7-5ubuntu3 700 | libmono-sharpzip2.84-cil 2.6.7-5ubuntu3 701 | libmono-system2.0-cil 2.6.7-5ubuntu3 702 | libmono-zeroconf1.0-cil 0.9.0-2 703 | libmpc2 0.9-1 704 | libmpfr4 3.0.0-7 705 | libmtdev1 1.1.0-0ubuntu1 706 | libmtp8 1.0.6-2 707 | libmythes-1.2-0 2:1.2.1-1 708 | libnautilus-extension1 1:2.32.2.1-0ubuntu13 709 | libncurses5 5.7+20101128-1 710 | libncursesw5 5.7+20101128-1 711 | libndesk-dbus-glib1.0-cil 0.4.1-3 712 | libndesk-dbus1.0-cil 0.6.0-4 713 | libneon27-gnutls 0.29.5-3 714 | libnet-dbus-perl 0.33.6-2 715 | libnet-dns-perl 0.66-2ubuntu1 716 | libnet-domain-tld-perl 1.68-1 717 | libnet-ip-perl 1.25-2 718 | libnewt0.52 0.52.11-2ubuntu7 719 | libnfnetlink0 1.0.0-1 720 | libnice10 0.1.0-2ubuntu1 721 | libnih-dbus1 1.0.3-1ubuntu1 722 | libnih1 1.0.3-1ubuntu1 723 | libnl1 1.1-6 724 | libnm-glib-vpn1 0.8.4~git.20110319t175609.d14809b-0ubuntu3 725 | libnm-glib2 0.8.4~git.20110319t175609.d14809b-0ubuntu3 726 | libnm-util1 0.8.4~git.20110319t175609.d14809b-0ubuntu3 727 | libnotify0.4-cil 0.4.0~r3032-2ubuntu1 728 | libnotify1 0.5.0-2ubuntu1 729 | libnotify4 0.7.2-0ubuntu2 730 | libnspr4 4.8.7-0ubuntu1 731 | libnss-mdns 0.10-3.1ubuntu1 732 | libnss3 3.12.9+ckbi-1.82-0ubuntu2 733 | libnss3-1d 3.12.9+ckbi-1.82-0ubuntu2 734 | libntfs-3g79 1:2010.8.8-0ubuntu1 735 | libntfs10 2.0.0-1ubuntu4 736 | libnux-0.9-0 0.9.46-0ubuntu4 737 | libnux-0.9-common 0.9.46-0ubuntu4 738 | libogg0 1.2.0~dfsg-1 739 | liboobs-1-5 2.32.0-0ubuntu1 740 | libopencc1 0.1.2-1 741 | libopenobex1 1.5-2build1 742 | liborbit2 1:2.14.19-0ubuntu2 743 | liborc-0.4-0 1:0.4.11-2 744 | liboverlay-scrollbar-0.1-0 0.1.9-0ubuntu1 745 | libpam-ck-connector 0.4.4-1 746 | libpam-gnome-keyring 2.92.92.is.2.32.1-0ubuntu2 747 | libpam-modules 1.1.2-2ubuntu8 748 | libpam-modules-bin 1.1.2-2ubuntu8 749 | libpam-runtime 1.1.2-2ubuntu8 750 | libpam0g 1.1.2-2ubuntu8 751 | libpanel-applet-3-0 1:2.32.1-0ubuntu6.3 752 | libpanel-applet2-0 1:2.32.1-0ubuntu6.3 753 | libpango-perl 1.221-2 754 | libpango1.0-0 1.28.4-0ubuntu1 755 | libpangomm-1.4-1 2.28.1-0ubuntu1 756 | libpaper-utils 1.1.24 757 | libpaper1 1.1.24 758 | libparse-debianchangelog-perl 1.1.1-2.1ubuntu1 759 | libparted0debian1 2.3-5ubuntu5 760 | libpcap0.8 1.1.1-2 761 | libpci3 1:3.1.7-4ubuntu7 762 | libpciaccess0 0.12.1-1 763 | libpcre3 8.12-3ubuntu2 764 | libpcsclite1 1.7.0-2ubuntu2 765 | libperl5.10 5.10.1-17ubuntu4 766 | libpipeline1 1.2.0-1 767 | libpixman-1-0 0.20.2-0ubuntu1 768 | libplist1 1.4-1 769 | libplymouth2 0.8.2-2ubuntu22 770 | libpng12-0 1.2.44-1ubuntu3 771 | libpolkit-agent-1-0 0.101-1ubuntu1 772 | libpolkit-backend-1-0 0.101-1ubuntu1 773 | libpolkit-gobject-1-0 0.101-1ubuntu1 774 | libpolkit-gtk-1-0 0.99-1ubuntu4 775 | libpoppler-glib6 0.16.4-0ubuntu1 776 | libpoppler13 0.16.4-0ubuntu1 777 | libpopt0 1.16-1 778 | libportaudio2 19+svn20110317-1 779 | libppl-c2 0.10.2-10ubuntu1 780 | libppl7 0.10.2-10ubuntu1 781 | libprotobuf6 2.3.0-4ubuntu2 782 | libprotoc6 2.3.0-4ubuntu2 783 | libproxy0 0.3.1-2ubuntu5 784 | libpst4 0.6.41-0ubuntu5 785 | libpth20 2.0.7-16ubuntu2 786 | libpulse-browse0 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 787 | libpulse-mainloop-glib0 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 788 | libpulse0 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 789 | libpurple-bin 1:2.7.11-1ubuntu2 790 | libpurple0 1:2.7.11-1ubuntu2 791 | libpython2.7 2.7.1-5ubuntu2 792 | libquvi0 0.2.11-1 793 | libraptor1 1.4.21-2 794 | librarian0 0.8.1-5 795 | librasqal2 0.9.20-1 796 | libraw1394-11 2.0.6-1 797 | librdf0 1.0.12-1 798 | libreadline6 6.2-0ubuntu1 799 | libreoffice-base-core 1:3.3.2-1ubuntu4 800 | libreoffice-calc 1:3.3.2-1ubuntu4 801 | libreoffice-common 1:3.3.2-1ubuntu4 802 | libreoffice-core 1:3.3.2-1ubuntu4 803 | libreoffice-draw 1:3.3.2-1ubuntu4 804 | libreoffice-emailmerge 1:3.3.2-1ubuntu4 805 | libreoffice-gnome 1:3.3.2-1ubuntu4 806 | libreoffice-gtk 1:3.3.2-1ubuntu4 807 | libreoffice-help-en-us 1:3.3.2-1ubuntu4 808 | libreoffice-impress 1:3.3.2-1ubuntu4 809 | libreoffice-math 1:3.3.2-1ubuntu4 810 | libreoffice-style-human 1:3.3.2-1ubuntu4 811 | libreoffice-writer 1:3.3.2-1ubuntu4 812 | librpc-xml-perl 0.73-1 813 | librsvg2-2 2.32.1-0ubuntu3 814 | librsvg2-common 2.32.1-0ubuntu3 815 | libsamplerate0 0.1.7-3 816 | libsane 1.0.22-2ubuntu1 817 | libsane-hpaio 3.11.1-2ubuntu2 818 | libsasl2-2 2.1.23.dfsg1-5ubuntu3 819 | libsasl2-modules 2.1.23.dfsg1-5ubuntu3 820 | libsdl1.2debian 1.2.14-6.1ubuntu3 821 | libsdl1.2debian-pulseaudio 1.2.14-6.1ubuntu3 822 | libselinux1 2.0.96-1ubuntu2 823 | libsensors4 1:3.2.0-1ubuntu1 824 | libsepol1 2.0.41-1 825 | libsgutils2-2 1.30-1 826 | libshout3 2.2.2-5ubuntu1 827 | libsigc++-2.0-0c2a 2.2.4.2-1ubuntu1 828 | libsilc-1.1-2 1.1.10-2build1 829 | libsilcclient-1.1-3 1.1.10-2build1 830 | libslang2 2.2.2-4ubuntu2 831 | libslp1 1.2.1-7.8ubuntu1 832 | libsm6 2:1.2.0-1ubuntu1 833 | libsmbclient 2:3.5.8~dfsg-1ubuntu2 834 | libsndfile1 1.0.23-1build1 835 | libsnmp-base 5.4.3~dfsg-2ubuntu1 836 | libsnmp15 5.4.3~dfsg-2ubuntu1 837 | libsoup-gnome2.4-1 2.34.0-0ubuntu1 838 | libsoup2.4-1 2.34.0-0ubuntu1 839 | libspectre1 0.2.6-1build1 840 | libspeechd2 0.7.1-0ubuntu3 841 | libspeex1 1.2~rc1-1ubuntu1 842 | libspeexdsp1 1.2~rc1-1ubuntu1 843 | libsqlite3-0 3.7.4-2ubuntu5 844 | libss2 1.41.14-1ubuntu3 845 | libssl0.9.8 0.9.8o-5ubuntu1 846 | libstartup-notification0 0.10-1build1 847 | libstdc++6 4.5.2-8ubuntu4 848 | libstdc++6-4.5-dev 4.5.2-8ubuntu4 849 | libstlport4.6ldbl 4.6.2-7 850 | libsub-name-perl 0.05-1 851 | libsyncdaemon-1.0-1 1.6.1-0ubuntu3 852 | libsysfs2 2.1.0+repack-1 853 | libt1-5 5.1.2-3build1 854 | libtag1-vanilla 1.6.3-1 855 | libtag1c2a 1.6.3-1 856 | libtaglib2.0-cil 2.0.3.7+dfsg-1 857 | libtalloc2 2.0.5-1 858 | libtasn1-3 2.7-1ubuntu1 859 | libtdb1 1.2.9-1fakesync1 860 | libtelepathy-farsight0 0.0.16-1 861 | libtelepathy-glib0 0.14.3-1ubuntu1 862 | libtelepathy-logger2 0.2.6-1ubuntu1 863 | libterm-readkey-perl 2.30-4build1 864 | libtext-charwidth-perl 0.04-6 865 | libtext-iconv-perl 1.7-2 866 | libtext-wrapi18n-perl 0.06-7 867 | libtextcat-data 2.2-9ubuntu2 868 | libtextcat0 2.2-9ubuntu2 869 | libthai-data 0.1.14-2ubuntu1 870 | libthai0 0.1.14-2ubuntu1 871 | libtheora0 1.1.1+dfsg.1-3 872 | libtie-ixhash-perl 1.21-2 873 | libtiff4 3.9.4-5ubuntu6 874 | libtimedate-perl 1.2000-1 875 | libtotem-plparser17 2.32.4-0ubuntu1 876 | libubuntuone-1.0-1 0.10.0-0ubuntu1 877 | libubuntuone1.0-cil 0.10.0-0ubuntu1 878 | libudev0 167-0ubuntu3 879 | libunique-1.0-0 1.1.6-1.1ubuntu2 880 | libunistring0 0.9.3-3 881 | libunity-misc0 0.2.1-0ubuntu2 882 | libunity4 3.8.4-0ubuntu1 883 | libupower-glib1 0.9.9-4 884 | liburi-perl 1.56-1 885 | libusb-0.1-4 2:0.1.12-17 886 | libusb-1.0-0 2:1.0.8-2 887 | libusbmuxd1 1.0.7-1 888 | libutempter0 1.1.5-3 889 | libutouch-evemu1 1.0.5-0ubuntu1 890 | libutouch-frame1 1.1.1-0ubuntu1 891 | libutouch-geis1 2.0.10-0ubuntu1 892 | libutouch-grail1 1.0.20-0ubuntu4 893 | libuuid-perl 0.02-4 894 | libuuid1 2.17.2-9.1ubuntu4 895 | libv4l-0 0.8.3-1 896 | libvisual-0.4-0 0.4.0-3 897 | libvisual-0.4-plugins 0.4.0.dfsg.1-2ubuntu5 898 | libvorbis0a 1.3.2-1ubuntu1 899 | libvorbisenc2 1.3.2-1ubuntu1 900 | libvorbisfile3 1.3.2-1ubuntu1 901 | libvte-common 1:0.27.90-0ubuntu1 902 | libvte9 1:0.27.90-0ubuntu1 903 | libwavpack1 4.60.1-1 904 | libwbclient0 2:3.5.8~dfsg-1ubuntu2 905 | libwebkitgtk-1.0-0 1.3.13-0ubuntu2 906 | libwebkitgtk-1.0-common 1.3.13-0ubuntu2 907 | libwmf0.2-7 0.2.8.4-7ubuntu3 908 | libwmf0.2-7-gtk 0.2.8.4-7ubuntu3 909 | libwnck-common 1:2.30.6-0ubuntu3 910 | libwnck22 1:2.30.6-0ubuntu3 911 | libwpd-0.9-9 0.9.0-2 912 | libwpg-0.2-2 0.2.0-3 913 | libwps-0.2-2 0.2.0-2 914 | libwrap0 7.6.q-19ubuntu1 915 | libwww-perl 5.837-1 916 | libx11-6 2:1.4.2-1ubuntu3 917 | libx11-data 2:1.4.2-1ubuntu3 918 | libx11-xcb1 2:1.4.2-1ubuntu3 919 | libx86-1 1.1+ds1-6 920 | libxapian22 1.2.4-1 921 | libxau6 1:1.0.6-1ubuntu1 922 | libxaw7 2:1.0.9-2 923 | libxcb-atom1 0.3.6-1build1 924 | libxcb-aux0 0.3.6-1build1 925 | libxcb-dri2-0 1.7-2ubuntu2 926 | libxcb-event1 0.3.6-1build1 927 | libxcb-render0 1.7-2ubuntu2 928 | libxcb-shape0 1.7-2ubuntu2 929 | libxcb-shm0 1.7-2ubuntu2 930 | libxcb1 1.7-2ubuntu2 931 | libxcomposite1 1:0.4.3-1ubuntu1 932 | libxcursor1 1:1.1.11-1ubuntu1 933 | libxdamage1 1:1.1.3-1ubuntu1 934 | libxdmcp6 1:1.1.0-1ubuntu1 935 | libxext6 2:1.2.0-2ubuntu1 936 | libxfixes3 1:4.0.5-1ubuntu1 937 | libxfont1 1:1.4.3-2 938 | libxft2 2.2.0-2ubuntu2 939 | libxi6 2:1.4.1-1ubuntu2 940 | libxinerama1 2:1.1.1-1ubuntu1 941 | libxkbfile1 1:1.0.7-1 942 | libxklavier16 5.0-2ubuntu1 943 | libxml-parser-perl 2.36-1.1build3 944 | libxml-twig-perl 1:3.34-1ubuntu1 945 | libxml-xpath-perl 1.13-7 946 | libxml2 2.7.8.dfsg-2 947 | libxml2-utils 2.7.8.dfsg-2 948 | libxmu6 2:1.1.0-1 949 | libxmuu1 2:1.1.0-1 950 | libxp6 1:1.0.0.xsf1-2build1 951 | libxpm4 1:3.5.9-1ubuntu1 952 | libxrandr2 2:1.3.1-1ubuntu1 953 | libxrender1 1:0.9.6-1ubuntu1 954 | libxres1 2:1.0.5-1 955 | libxslt1.1 1.1.26-6build1 956 | libxss1 1:1.2.1-1 957 | libxt6 1:1.0.9-1ubuntu1 958 | libxtst6 2:1.2.0-1 959 | libxv1 2:1.0.6-1 960 | libxvmc1 2:1.0.6-1ubuntu2 961 | libxxf86dga1 2:1.1.2-1 962 | libxxf86vm1 1:1.1.1-1ubuntu1 963 | libzeitgeist-1.0-1 0.3.10-0ubuntu1 964 | libzephyr4 3.0-1 965 | light-themes 0.1.8.13 966 | lintian 2.5.0~rc2ubuntu3 967 | linux-firmware 1.52 968 | linux-generic 2.6.38.8.22 969 | linux-headers-2.6.38-8 2.6.38-8.42 970 | linux-headers-2.6.38-8-generic 2.6.38-8.42 971 | linux-headers-generic 2.6.38.8.22 972 | linux-image-2.6.38-8-generic 2.6.38-8.42 973 | linux-image-generic 2.6.38.8.22 974 | linux-libc-dev 2.6.38-8.42 975 | linux-sound-base 1.0.24+dfsg-0ubuntu1 976 | localechooser-data 2.34ubuntu4 977 | locales 2.13+git20100825-4 978 | lockfile-progs 0.1.15 979 | login 1:4.1.4.2+svn3283-3ubuntu1 980 | logrotate 3.7.8-6ubuntu3 981 | lp-solve 5.5.0.13-7 982 | lsb-base 4.0-0ubuntu11 983 | lsb-release 4.0-0ubuntu11 984 | lshw 02.15-1 985 | lsof 4.81.dfsg.1-1build1 986 | ltrace 0.5.3-2.1ubuntu1 987 | lupin-casper 0.34 988 | lzma 4.43-14ubuntu2 989 | make 3.81-8ubuntu1 990 | makedev 2.3.1-89ubuntu1 991 | man-db 2.5.9-4 992 | manpages 3.27-1ubuntu2 993 | manpages-dev 3.27-1ubuntu2 994 | mawk 1.3.3-15ubuntu2 995 | media-player-info 14-1 996 | memtest86+ 4.10-1.1ubuntu1 997 | metacity 1:2.30.3-0ubuntu8 998 | metacity-common 1:2.30.3-0ubuntu8 999 | mime-support 3.51-1ubuntu1 1000 | min12xxw 0.0.9-3ubuntu3 1001 | mlocate 0.23.1-1ubuntu1 1002 | mobile-broadband-provider-info 20110415-0ubuntu1 1003 | modemmanager 0.4+git.20110124t203624.00b6cce-2ubuntu1 1004 | module-init-tools 3.12-1ubuntu6 1005 | mono-2.0-gac 2.6.7-5ubuntu3 1006 | mono-csharp-shell 2.6.7-5ubuntu3 1007 | mono-gac 2.6.7-5ubuntu3 1008 | mono-gmcs 2.6.7-5ubuntu3 1009 | mono-runtime 2.6.7-5ubuntu3 1010 | mount 2.17.2-9.1ubuntu4 1011 | mountall 2.25ubuntu1 1012 | mousetweaks 3.0.0-0ubuntu2 1013 | mscompress 0.3-3.1 1014 | mtools 4.0.12-1 1015 | mtr-tiny 0.80-1 1016 | multiarch-support 2.13-0ubuntu13 1017 | myspell-en-au 2.1-5 1018 | myspell-en-gb 1:3.3.0-2ubuntu2 1019 | myspell-en-za 1:3.3.0-2ubuntu2 1020 | nano 2.2.6-1 1021 | nautilus 1:2.32.2.1-0ubuntu13 1022 | nautilus-data 1:2.32.2.1-0ubuntu13 1023 | nautilus-sendto 2.32.0-0ubuntu1 1024 | nautilus-sendto-empathy 2.34.0-0ubuntu3 1025 | nautilus-share 0.7.2-14ubuntu1 1026 | ncurses-base 5.7+20101128-1 1027 | ncurses-bin 5.7+20101128-1 1028 | net-tools 1.60-23ubuntu3 1029 | netbase 4.45ubuntu1 1030 | netcat-openbsd 1.89-3ubuntu5 1031 | network-manager 0.8.4~git.20110319t175609.d14809b-0ubuntu3 1032 | network-manager-gnome 0.8.4~git.20110318t152954.9c4c9a0-0ubuntu1 1033 | network-manager-pptp 0.8.1+git.20110207t142407.7e1d989-0ubuntu1 1034 | network-manager-pptp-gnome 0.8.1+git.20110207t142407.7e1d989-0ubuntu1 1035 | notify-osd 0.9.30-0ubuntu4 1036 | notify-osd-icons 0.7 1037 | ntfs-3g 1:2010.8.8-0ubuntu1 1038 | ntfsprogs 2.0.0-1ubuntu4 1039 | ntpdate 1:4.2.6.p2+dfsg-1ubuntu5 1040 | nux-tools 0.9.46-0ubuntu4 1041 | nvidia-common 0.2.30 1042 | obex-data-server 0.4.6-0ubuntu1 1043 | obexd-client 0.40-1 1044 | onboard 0.94.0-0ubuntu2b1 1045 | openprinting-ppds 20110317-0ubuntu1 1046 | openssh-client 1:5.8p1-1ubuntu3 1047 | openssl 0.9.8o-5ubuntu1 1048 | os-prober 1.44ubuntu1 1049 | overlay-scrollbar 0.1.9-0ubuntu1 1050 | parted 2.3-5ubuntu5 1051 | passwd 1:4.1.4.2+svn3283-3ubuntu1 1052 | patch 2.6-3 1053 | pciutils 1:3.1.7-4ubuntu7 1054 | pcmciautils 015-1ubuntu1 1055 | perl 5.10.1-17ubuntu4 1056 | perl-base 5.10.1-17ubuntu4 1057 | perl-modules 5.10.1-17ubuntu4 1058 | pitivi 0.13.5-1ubuntu4 1059 | pkg-config 0.25-1.1ubuntu1 1060 | plymouth 0.8.2-2ubuntu22 1061 | plymouth-label 0.8.2-2ubuntu22 1062 | plymouth-theme-ubuntu-logo 0.8.2-2ubuntu22 1063 | plymouth-theme-ubuntu-text 0.8.2-2ubuntu22 1064 | pm-utils 1.4.1-7 1065 | pnm2ppa 1.13-0ubuntu1 1066 | policykit-1 0.101-1ubuntu1 1067 | policykit-1-gnome 0.99-1ubuntu4 1068 | policykit-desktop-privileges 0.4 1069 | poppler-utils 0.16.4-0ubuntu1 1070 | popularity-contest 1.51ubuntu1 1071 | powermgmt-base 1.31 1072 | ppp 2.4.5-5ubuntu1 1073 | pppconfig 2.3.18+nmu2ubuntu1 1074 | pppoeconf 1.19ubuntu1 1075 | pptp-linux 1.7.2-6 1076 | procps 1:3.2.8-10ubuntu3 1077 | protobuf-compiler 2.3.0-4ubuntu2 1078 | psmisc 22.13-1 1079 | pulseaudio 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 1080 | pulseaudio-esound-compat 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 1081 | pulseaudio-module-bluetooth 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 1082 | pulseaudio-module-gconf 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 1083 | pulseaudio-module-x11 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 1084 | pulseaudio-utils 1:0.9.22+stable-queue-24-g67d18-0ubuntu3 1085 | pxljr 1.1-0ubuntu7 1086 | python 2.7.1-0ubuntu5 1087 | python-appindicator 0.3.0-0ubuntu1 1088 | python-apport 1.20.1-0ubuntu5 1089 | python-apt 0.7.100.3ubuntu6 1090 | python-apt-common 0.7.100.3ubuntu6 1091 | python-aptdaemon 0.41+bzr646-0ubuntu2 1092 | python-aptdaemon-gtk 0.41+bzr646-0ubuntu2 1093 | python-aptdaemon.gtk3widgets 0.41+bzr646-0ubuntu2 1094 | python-aptdaemon.gtkwidgets 0.41+bzr646-0ubuntu2 1095 | python-argparse 1.1-1 1096 | python-brlapi 4.2-8ubuntu2 1097 | python-cairo 1.8.8-1ubuntu1 1098 | python-central 0.6.15ubuntu5 1099 | python-chardet 2.0.1-1 1100 | python-configglue 0.9pre1-0ubuntu1 1101 | python-crypto 2.1.0-2ubuntu1 1102 | python-cups 1.9.54-0ubuntu1 1103 | python-cupshelpers 1.3.1+20110222-0ubuntu16.1 1104 | python-dbus 0.83.1-1 1105 | python-debian 0.1.18ubuntu2 1106 | python-defer 1.0.2-0ubuntu2 1107 | python-egenix-mxdatetime 3.1.3-4build1 1108 | python-egenix-mxtools 3.1.3-4build1 1109 | python-farsight 0.0.26-1ubuntu1 1110 | python-gconf 2.28.1-1ubuntu3 1111 | python-gdbm 2.7-2ubuntu2 1112 | python-glade2 2.22.0-0ubuntu1 1113 | python-gmenu 2.30.5-0ubuntu3 1114 | python-gnome2 2.28.1-1ubuntu3 1115 | python-gnomecanvas 2.28.1-1ubuntu3 1116 | python-gnomekeyring 2.32.0-0ubuntu2 1117 | python-gnupginterface 0.3.2-9.1ubuntu1 1118 | python-gobject 2.28.3-1ubuntu1 1119 | python-gobject-cairo 2.28.3-1ubuntu1 1120 | python-gst0.10 0.10.21-1 1121 | python-gtk2 2.22.0-0ubuntu1 1122 | python-gtksourceview2 2.10.1-1build1 1123 | python-gtkspell 2.25.3-7ubuntu2 1124 | python-httplib2 0.6.0-4build1 1125 | python-ibus 1.3.9-0ubuntu3 1126 | python-imaging 1.1.7-2build2 1127 | python-indicate 0.5.0-0ubuntu2 1128 | python-keyring 0.5.1-1 1129 | python-launchpad-integration 0.1.51 1130 | python-launchpadlib 1.9.7-0ubuntu2 1131 | python-lazr.restfulclient 0.11.1-1build1 1132 | python-lazr.uri 1.0.2-3build1 1133 | python-libproxy 0.3.1-2ubuntu5 1134 | python-libxml2 2.7.8.dfsg-2 1135 | python-louis 2.0.0-1ubuntu2 1136 | python-mako 0.3.6-1 1137 | python-markupsafe 0.9.2-3build2 1138 | python-minimal 2.7.1-0ubuntu5 1139 | python-notify 0.1.1-2build4 1140 | python-oauth 1.0a~svn1124-0ubuntu2 1141 | python-openssl 0.10-1ubuntu3 1142 | python-pam 0.4.2-12.2ubuntu2 1143 | python-papyon 0.5.5-1ubuntu1 1144 | python-pexpect 2.3-1build1 1145 | python-piston-mini-client 0.3+bzr32-0ubuntu1 1146 | python-pkg-resources 0.6.15-1ubuntu1 1147 | python-problem-report 1.20.1-0ubuntu5 1148 | python-protobuf 2.3.0-4ubuntu2 1149 | python-pyatspi 1.32.0-0ubuntu2 1150 | python-pycurl 7.19.0-3build1 1151 | python-pygoocanvas 0.14.1-1ubuntu5 1152 | python-pyicu 1.0-1build1 1153 | python-pyinotify 0.8.9-1ubuntu3 1154 | python-pyorbit 2.24.0-6ubuntu1 1155 | python-rdflib 2.4.2-1build1 1156 | python-serial 2.5-2 1157 | python-simplejson 2.1.2-1build1 1158 | python-smbc 1.0.10-0ubuntu1 1159 | python-software-properties 0.80.9 1160 | python-speechd 0.7.1-0ubuntu3 1161 | python-support 1.0.10ubuntu3 1162 | python-telepathy 0.15.19-1 1163 | python-twisted-bin 10.2.0-1 1164 | python-twisted-core 10.2.0-1 1165 | python-twisted-names 10.1.0-1build2 1166 | python-twisted-web 10.2.0-1 1167 | python-ubuntuone-client 1.6.1-0ubuntu3 1168 | python-ubuntuone-control-panel 1.0.0-0ubuntu1 1169 | python-ubuntuone-storageprotocol 1.6.0-0ubuntu1 1170 | python-uno 1:3.3.2-1ubuntu4 1171 | python-virtkey 0.60.0-0ubuntu3 1172 | python-vte 1:0.27.90-0ubuntu1 1173 | python-wadllib 1.1.8+ds-1build1 1174 | python-webkit 1.1.8-1ubuntu2 1175 | python-wnck 2.32.0-0ubuntu2 1176 | python-wsgi-intercept 0.4-0ubuntu1 1177 | python-xapian 1.2.3-3ubuntu1 1178 | python-xdg 0.19-2ubuntu1 1179 | python-xkit 0.4.2.2 1180 | python-zope.interface 3.6.1-0ubuntu4 1181 | python2.7 2.7.1-5ubuntu2 1182 | python2.7-minimal 2.7.1-5ubuntu2 1183 | radeontool 1.6.1-1 1184 | rarian-compat 0.8.1-5 1185 | rdate 1:1.2-4build1 1186 | rdesktop 1.6.0-3ubuntu4 1187 | readline-common 6.2-0ubuntu1 1188 | reiserfsprogs 1:3.6.21-1build1 1189 | rfkill 0.4-1 1190 | rsync 3.0.7-2ubuntu3 1191 | rsyslog 4.6.4-2ubuntu4 1192 | rtkit 0.9-2 1193 | samba-common 2:3.5.8~dfsg-1ubuntu2 1194 | samba-common-bin 2:3.5.8~dfsg-1ubuntu2 1195 | sane-utils 1.0.22-2ubuntu1 1196 | screensaver-default-images 0.2-1 1197 | seahorse 2.32.0-0ubuntu3 1198 | sed 4.2.1-8 1199 | sensible-utils 0.0.6ubuntu2 1200 | sessioninstaller 0.20+bzr119-0ubuntu2 1201 | sgml-base 1.26+nmu1ubuntu1 1202 | sgml-data 2.0.5 1203 | shared-mime-info 0.90-1ubuntu3 1204 | shotwell 0.9.2-0ubuntu3 1205 | simple-scan 2.32.0.1-0ubuntu2 1206 | smbclient 2:3.5.8~dfsg-1ubuntu2 1207 | software-center 4.0 1208 | software-properties-gtk 0.80.9 1209 | speech-dispatcher 0.7.1-0ubuntu3 1210 | splix 2.0.0+20110219-0ubuntu1 1211 | ssh-askpass-gnome 1:5.8p1-1ubuntu3 1212 | ssl-cert 1.0.28 1213 | strace 4.5.20-2ubuntu2 1214 | sudo 1.7.4p4-5ubuntu7 1215 | synaptic 0.75.1ubuntu2 1216 | syslinux 2:4.02+dfsg-7ubuntu1 1217 | syslinux-common 2:4.02+dfsg-7ubuntu1 1218 | system-config-printer-common 1.3.1+20110222-0ubuntu16.1 1219 | system-config-printer-gnome 1.3.1+20110222-0ubuntu16.1 1220 | system-config-printer-udev 1.3.1+20110222-0ubuntu16.1 1221 | system-tools-backends 2.10.1-2ubuntu1 1222 | sysv-rc 2.87dsf-4ubuntu23 1223 | sysvinit-utils 2.87dsf-4ubuntu23 1224 | tar 1.25-3 1225 | tcl 8.4.16-2 1226 | tcl8.4 8.4.19-4ubuntu3 1227 | tcpd 7.6.q-19ubuntu1 1228 | tcpdump 4.1.1-1ubuntu3 1229 | telepathy-butterfly 0.5.15-1 1230 | telepathy-gabble 0.11.10-1ubuntu1 1231 | telepathy-haze 0.4.0-1ubuntu 1232 | telepathy-idle 0.1.8-1ubuntu1 1233 | telepathy-logger 0.2.6-1ubuntu1 1234 | telepathy-mission-control-5 1:5.7.7-1 1235 | telepathy-salut 0.4.0-1 1236 | telnet 0.17-36build1 1237 | time 1.7-23.1 1238 | tomboy 1.6.0-0ubuntu3 1239 | toshset 1.75-2 1240 | totem 2.32.0-0ubuntu10 1241 | totem-common 2.32.0-0ubuntu10 1242 | totem-mozilla 2.32.0-0ubuntu10 1243 | totem-plugins 2.32.0-0ubuntu10 1244 | transmission-common 2.13-0ubuntu8 1245 | transmission-gtk 2.13-0ubuntu8 1246 | tsclient 0.150-4ubuntu2 1247 | ttf-dejavu-core 2.31-1 1248 | ttf-freefont 20090104-7 1249 | ttf-indic-fonts-core 1:0.5.11ubuntu1 1250 | ttf-kacst-one 4.0-0ubuntu1 1251 | ttf-khmeros-core 5.0-3ubuntu1 1252 | ttf-lao 0.0.20060226-7 1253 | ttf-liberation 1.05.2.20091019-4 1254 | ttf-opensymbol 2:2.4.3+LibO3.3.2-1ubuntu4 1255 | ttf-punjabi-fonts 1:0.5.11ubuntu1 1256 | ttf-takao-pgothic 003.02.01-4ubuntu1 1257 | ttf-thai-tlwg 1:0.4.14-1 1258 | ttf-ubuntu-font-family 0.71.2-0ubuntu3 1259 | ttf-unfonts-core 1.0.3.is.1.0.1-0ubuntu1 1260 | ttf-wqy-microhei 0.2.0-beta-1 1261 | tzdata 2011f-1 1262 | ubiquity 2.6.10 1263 | ubiquity-casper 1.265 1264 | ubiquity-frontend-gtk 2.6.10 1265 | ubiquity-slideshow-ubuntu 40 1266 | ubiquity-ubuntu-artwork 2.6.10 1267 | ubuntu-artwork 53.8 1268 | ubuntu-desktop 1.220 1269 | ubuntu-docs 11.04.2 1270 | ubuntu-extras-keyring 2010.09.27 1271 | ubuntu-keyring 2010.+09.30 1272 | ubuntu-minimal 1.220 1273 | ubuntu-mono 0.0.30 1274 | ubuntu-sounds 0.13 1275 | ubuntu-sso-client 1.2.1-0ubuntu1 1276 | ubuntu-standard 1.220 1277 | ubuntu-system-service 0.1.21 1278 | ubuntu-wallpapers 0.31.10 1279 | ubuntuone-client 1.6.1-0ubuntu3 1280 | ubuntuone-client-gnome 1.6.1-0ubuntu3 1281 | ubuntuone-control-panel 1.0.0-0ubuntu1 1282 | ubuntuone-control-panel-gtk 1.0.0-0ubuntu1 1283 | ucf 3.0025+nmu1ubuntu1 1284 | udev 167-0ubuntu3 1285 | udisks 1.0.2-4ubuntu1 1286 | ufw 0.30.1-1ubuntu1 1287 | unattended-upgrades 0.72.1ubuntu1 1288 | unionfs-fuse 0.24-2 1289 | unity 3.8.10-0ubuntu2 1290 | unity-asset-pool 0.8.20-0ubuntu2 1291 | unity-common 3.8.10-0ubuntu2 1292 | unity-place-applications 0.2.46-0ubuntu3 1293 | unity-place-files 0.5.46-0ubuntu5 1294 | uno-libs3 1.7.0+LibO3.3.2-1ubuntu4 1295 | unzip 6.0-4ubuntu1 1296 | update-inetd 4.38 1297 | update-manager 1:0.150 1298 | update-manager-core 1:0.150 1299 | update-notifier 0.111ubuntu2 1300 | update-notifier-common 0.111ubuntu2 1301 | upower 0.9.9-4 1302 | upstart 0.9.7-1 1303 | ure 1.7.0+LibO3.3.2-1ubuntu4 1304 | ureadahead 0.100.0-11 1305 | usb-creator-common 0.2.28 1306 | usb-creator-gtk 0.2.28 1307 | usb-modeswitch 1.1.7-1 1308 | usb-modeswitch-data 20110227-2 1309 | usbmuxd 1.0.7-1 1310 | usbutils 0.87-5 1311 | user-setup 1.28ubuntu15 1312 | util-linux 2.17.2-9.1ubuntu4 1313 | uuid-runtime 2.17.2-9.1ubuntu4 1314 | vbetool 1.1-2ubuntu1 1315 | vim-common 2:7.3.035+hg~8fdc12103333-1ubuntu7 1316 | vim-tiny 2:7.3.035+hg~8fdc12103333-1ubuntu7 1317 | vinagre 2.30.3-1ubuntu2 1318 | vino 2.32.1-0ubuntu2 1319 | wamerican 6-3 1320 | wbritish 6-3 1321 | wget 1.12-2.1ubuntu2 1322 | whiptail 0.52.11-2ubuntu7 1323 | whois 5.0.11ubuntu1 1324 | wireless-crda 1.13 1325 | wireless-tools 30~pre9-3ubuntu6 1326 | wodim 9:1.1.11-1ubuntu2 1327 | wpasupplicant 0.7.3-0ubuntu1 1328 | x-ttcidfont-conf 32 1329 | x11-apps 7.6+4ubuntu2 1330 | x11-common 1:7.6+4ubuntu3 1331 | x11-session-utils 7.6+1ubuntu1 1332 | x11-utils 7.6+1 1333 | x11-xfs-utils 7.4+1build2 1334 | x11-xkb-utils 7.6+2 1335 | x11-xserver-utils 7.6+2 1336 | xauth 1:1.0.5-1 1337 | xbitmaps 1.1.1-1 1338 | xcursor-themes 1.0.3-1 1339 | xdg-user-dirs 0.13-2ubuntu2 1340 | xdg-user-dirs-gtk 0.8-1ubuntu1 1341 | xdg-utils 1.1.0~rc1-2ubuntu3 1342 | xfonts-base 1:1.0.3 1343 | xfonts-encodings 1:1.0.4-1 1344 | xfonts-mathml 4ubuntu1 1345 | xfonts-scalable 1:1.0.3-1 1346 | xfonts-utils 1:7.6~1 1347 | xfsprogs 3.1.4ubuntu2 1348 | xinit 1.3.0-1 1349 | xinput 1.5.3-2ubuntu1 1350 | xkb-data 2.1-1ubuntu3 1351 | xml-core 0.13 1352 | xorg 1:7.6+4ubuntu3 1353 | xorg-docs-core 1:1.5.99.901-1ubuntu1 1354 | xscreensaver-data 5.12-0ubuntu3 1355 | xscreensaver-gl 5.12-0ubuntu3 1356 | xserver-common 2:1.10.1-1ubuntu1 1357 | xserver-xorg 1:7.6+4ubuntu3 1358 | xserver-xorg-core 2:1.10.1-1ubuntu1 1359 | xserver-xorg-input-all 1:7.6+4ubuntu3 1360 | xserver-xorg-input-evdev 1:2.6.0-1ubuntu12 1361 | xserver-xorg-input-mouse 1:1.6.0-1ubuntu3 1362 | xserver-xorg-input-synaptics 1.3.99+git20110116.0e27ce3a-0ubuntu12 1363 | xserver-xorg-input-vmmouse 1:12.6.99.901-1ubuntu2 1364 | xserver-xorg-input-wacom 1:0.10.11-0ubuntu4 1365 | xserver-xorg-video-all 1:7.6+4ubuntu3 1366 | xserver-xorg-video-apm 1:1.2.3-0ubuntu5 1367 | xserver-xorg-video-ark 1:0.7.3-1ubuntu3 1368 | xserver-xorg-video-ati 1:6.14.0-0ubuntu4 1369 | xserver-xorg-video-chips 1:1.2.3-2ubuntu5 1370 | xserver-xorg-video-cirrus 1:1.3.2-2ubuntu7 1371 | xserver-xorg-video-fbdev 1:0.4.2-3ubuntu6 1372 | xserver-xorg-video-geode 2.11.12-1build2 1373 | xserver-xorg-video-i128 1:1.3.4-1ubuntu3 1374 | xserver-xorg-video-i740 1:1.3.2-3ubuntu3 1375 | xserver-xorg-video-intel 2:2.14.0-4ubuntu7 1376 | xserver-xorg-video-mach64 6.8.2+git20101202.d60087f0-4ubuntu3 1377 | xserver-xorg-video-mga 1:1.4.13.dfsg-3build1 1378 | xserver-xorg-video-neomagic 1:1.2.5-1ubuntu3 1379 | xserver-xorg-video-nouveau 1:0.0.16+git20110107+b795ca6e-0ubuntu7 1380 | xserver-xorg-video-openchrome 1:0.2.904+svn916-1build1 1381 | xserver-xorg-video-qxl 0.0.12-1ubuntu4 1382 | xserver-xorg-video-r128 6.8.1-4ubuntu3 1383 | xserver-xorg-video-radeon 1:6.14.0-0ubuntu4 1384 | xserver-xorg-video-rendition 1:4.2.4-0ubuntu5 1385 | xserver-xorg-video-s3 1:0.6.3-3ubuntu3 1386 | xserver-xorg-video-s3virge 1:1.10.4-3ubuntu3 1387 | xserver-xorg-video-savage 1:2.3.2-3ubuntu2 1388 | xserver-xorg-video-siliconmotion 1:1.7.4-0ubuntu7 1389 | xserver-xorg-video-sis 1:0.10.3-2ubuntu3 1390 | xserver-xorg-video-sisusb 1:0.9.4-0ubuntu5 1391 | xserver-xorg-video-tdfx 1:1.4.3-3ubuntu3 1392 | xserver-xorg-video-trident 1:1.3.4-0ubuntu5 1393 | xserver-xorg-video-tseng 1:1.2.4-0ubuntu5 1394 | xserver-xorg-video-vesa 1:2.3.0-4ubuntu3 1395 | xserver-xorg-video-vmware 1:11.0.3-1ubuntu3 1396 | xserver-xorg-video-voodoo 1:1.2.4-0ubuntu5 1397 | xsltproc 1.1.26-6build1 1398 | xterm 268-1ubuntu1 1399 | xul-ext-ubufox 0.9-0ubuntu1 1400 | xz-utils 5.0.0-2 1401 | yelp 3.0.0-0ubuntu2 1402 | yelp-xsl 3.0.0-0ubuntu1 1403 | zeitgeist 0.7.1-1 1404 | zeitgeist-core 0.7.1-1 1405 | zeitgeist-datahub 0.7.0-0ubuntu1 1406 | zeitgeist-extension-fts 0.0.7-0ubuntu1 1407 | zenity 2.32.1-0ubuntu1 1408 | zip 3.0-3build1 1409 | zlib1g 1:1.2.3.4.dfsg-3ubuntu3 1410 | -------------------------------------------------------------------------------- /data/popcon/all: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/data/popcon/all -------------------------------------------------------------------------------- /data/popcon/all-popcon-results-debian-20110529.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/data/popcon/all-popcon-results-debian-20110529.gz -------------------------------------------------------------------------------- /data/popcon/all-popcon-results.txt-20110529.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/data/popcon/all-popcon-results.txt-20110529.gz -------------------------------------------------------------------------------- /generated/gnuinlinux/Rplots.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/gnuinlinux/Rplots.pdf -------------------------------------------------------------------------------- /generated/gnuinlinux/data1: -------------------------------------------------------------------------------- 1 | LABEL SIZE CHURN 2 | gnu 18326997 12212546 3 | kernel 20462713 4632568 4 | kde 17263694 4396217 5 | mozilla 13842878 3021411 6 | gnome 11390774 3518059 7 | java 6849572 722068 8 | xorg 5775242 1311166 9 | other 129089456 27944119 10 | -------------------------------------------------------------------------------- /generated/gnuinlinux/data2: -------------------------------------------------------------------------------- 1 | PKG_LABEL PKG_SIZE PKG_CHURN 2 | mailman 162796 2035 3 | gnutls 205785 0 4 | coreutils 212152 100 5 | libunistring 261971 0 6 | gsl 262739 0 7 | grub 285205 427585 8 | gnupg 322780 4916 9 | emacs 780992 117950 10 | gettext 1165635 0 11 | glibc 1665007 44215 12 | binutils 2441694 78958 13 | gdb 2504727 107087 14 | gcc 5855055 11374368 15 | other 2200459 55332 16 | -------------------------------------------------------------------------------- /generated/gnuinlinux/gnusplit.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/gnuinlinux/gnusplit.pdf -------------------------------------------------------------------------------- /generated/gnuinlinux/gnusplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/gnuinlinux/gnusplit.png -------------------------------------------------------------------------------- /generated/gnuinlinux/output: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/gnuinlinux/output -------------------------------------------------------------------------------- /generated/gnuinlinux/totalsplit.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/gnuinlinux/totalsplit.pdf -------------------------------------------------------------------------------- /generated/gnuinlinux/totalsplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/gnuinlinux/totalsplit.png -------------------------------------------------------------------------------- /generated/sectionsplit/Rplots.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sectionsplit/Rplots.pdf -------------------------------------------------------------------------------- /generated/sectionsplit/data1: -------------------------------------------------------------------------------- 1 | CORE BASE USER 2 | 7241749 95982377 63521786 3 | 6182934 59848438 84940277 4 | 5275165 65228903 45189188 5 | 6875265 65798885 24204106 6 | -------------------------------------------------------------------------------- /generated/sectionsplit/figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sectionsplit/figure.png -------------------------------------------------------------------------------- /generated/sectionsplit/output: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sectionsplit/output -------------------------------------------------------------------------------- /generated/sectionsplit/sectionsplit.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sectionsplit/sectionsplit.pdf -------------------------------------------------------------------------------- /generated/sizevschurn/Rplots.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sizevschurn/Rplots.pdf -------------------------------------------------------------------------------- /generated/sizevschurn/figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sizevschurn/figure.png -------------------------------------------------------------------------------- /generated/sizevschurn/output: -------------------------------------------------------------------------------- 1 | 2 | Call: 3 | lm(formula = CHURN ~ log(SIZE)) 4 | 5 | Residuals: 6 | Min 1Q Median 3Q Max 7 | -18.840 -12.108 -8.541 5.097 96.253 8 | 9 | Coefficients: 10 | Estimate Std. Error t value Pr(>|t|) 11 | (Intercept) 28.52702 0.97523 29.25 <2e-16 *** 12 | log(SIZE) -1.61157 0.09758 -16.52 <2e-16 *** 13 | --- 14 | Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 15 | 16 | Residual standard error: 19.31 on 6659 degrees of freedom 17 | Multiple R-squared: 0.03935, Adjusted R-squared: 0.0392 18 | F-statistic: 272.7 on 1 and 6659 DF, p-value: < 2.2e-16 19 | 20 | -------------------------------------------------------------------------------- /generated/sizevschurn/sizevschurn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/generated/sizevschurn/sizevschurn.pdf -------------------------------------------------------------------------------- /lib/all.rb: -------------------------------------------------------------------------------- 1 | $:.unshift(File.dirname(__FILE__)) 2 | require "utils" 3 | require "sources_info" 4 | require "string_additions" 5 | require "comparator" 6 | require "rule_engine" 7 | -------------------------------------------------------------------------------- /lib/comparator.rb: -------------------------------------------------------------------------------- 1 | require "utils" 2 | 3 | class DummyFile 4 | # Dummy download to compare to nothing 5 | def download(dir) 6 | FileUtils.mkdir_p dir 7 | end 8 | end 9 | 10 | class Comparator 11 | def self.compare(pkg1, pkg2, sources1, sources2, basetmpdir=nil, resultsdir=nil) 12 | basetmpdir ||= File.dirname(__FILE__)+"/../tmpdir/#{sources1.distro}_#{sources2.distro}" 13 | resultsdir ||= File.dirname(__FILE__)+"/../cmpcache/#{sources1.distro}_#{sources2.distro}" 14 | pkgname = (pkg1 ? pkg1 : "nil")+"#"+(pkg2 ? pkg2 : "nil") 15 | resultfile = resultsdir+"/"+pkgname 16 | if !File.exists? resultfile 17 | FileUtils.mkdir_p resultsdir 18 | FileUtils.mkdir_p tmpdir = basetmpdir+"/"+pkgname 19 | file1 = pkg1 ? sources1.package_to_file(pkg1) : DummyFile.new 20 | file2 = pkg2 ? sources2.package_to_file(pkg2) : DummyFile.new 21 | file1.download(dir1 = tmpdir+"/"+sources1.distro) 22 | file2.download(dir2 = tmpdir+"/"+sources2.distro) 23 | run_cmd_size_of_dir("From:", pkg1, dir1, resultfile) 24 | run_cmd_size_of_dir("To:", pkg2, dir2, resultfile) 25 | # Diff exits with code 1 on differences hence the || [... bit 26 | Util.run_cmd "diff -auNr #{dir1} #{dir2} > #{resultfile}.diff || [ \"$?\" -eq 1 ]" 27 | Util.run_cmd "echo -n \"diffstat: \" >> #{resultfile}" 28 | Util.run_cmd "cat #{resultfile}.diff | diffstat -b -f 0 | tail -n 1 >> #{resultfile}" 29 | Util.run_cmd "echo -n \"diffstat -m: \" >> #{resultfile}" 30 | Util.run_cmd "cat #{resultfile}.diff | diffstat -m -b -f 0 | tail -n 1 >> #{resultfile}" 31 | #FileUtils.rm resultfile+".diff" 32 | FileUtils.rm_rf tmpdir 33 | end 34 | end 35 | 36 | private 37 | def self.run_cmd_size_of_dir(prefix, pkg, dir, resultfile) 38 | if !pkg 39 | Util.run_cmd("echo \"#{prefix} nil WithLOC: 0\" >> #{resultfile}") 40 | else 41 | Util.run_cmd("echo -n \"#{prefix} #{pkg} WithLOC: \" >> #{resultfile}") 42 | Util.run_cmd("find #{dir} -type f -print0 | wc -l --files0-from=- | tail -n 1 | cut -f 1 -d ' ' | tr '\n' ' ' >> #{resultfile}") 43 | Util.run_cmd("echo ' ' >> #{resultfile}") 44 | end 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /lib/rule_engine.rb: -------------------------------------------------------------------------------- 1 | class RuleEngine 2 | def initialize(sinfo1, sinfo2) 3 | @sinfo1 = sinfo1 4 | @sinfo2 = sinfo2 5 | @ignore_srcs = [] 6 | @deleted_in = {} 7 | @added_in = {} 8 | @include_srcs = [] 9 | 10 | @matchup_pairs = {} 11 | 12 | eval_rules "general" 13 | eval_rules "#{sinfo1.distro}_#{sinfo2.distro}" 14 | end 15 | 16 | def same_src(expr1, *exprs) 17 | exprs.unshift(expr1) 18 | @sinfo1.add_wildcard_bundle(exprs) 19 | @sinfo2.add_wildcard_bundle(exprs) 20 | end 21 | 22 | def use_path(expr, path) 23 | @sinfo1.add_use_path(expr, path) 24 | @sinfo2.add_use_path(expr, path) 25 | end 26 | 27 | def ignore_src(src1, *srcs) 28 | @sinfo1.ignore_srcs(srcs.unshift(src1)) 29 | @sinfo2.ignore_srcs(srcs.unshift(src1)) 30 | end 31 | 32 | def matchups 33 | @matchup_pairs.map do |key, v| 34 | sb1, sb2 = key 35 | [sb1 ? sb1.pkg : nil, sb2 ? sb2.pkg : nil] 36 | end 37 | end 38 | 39 | def clear_matchups 40 | @matchup_pairs = {} 41 | end 42 | 43 | def process 44 | sbs = {} 45 | @sinfo1.bundles.each{|b| sbs[b.hash] ||= [nil,nil]; sbs[b.hash][0] = b} 46 | @sinfo2.bundles.each{|b| sbs[b.hash] ||= [nil,nil]; sbs[b.hash][1] = b} 47 | sbs.values.each do |b1, b2| 48 | add_matchup(b1, b2) if (b1||b2) 49 | end 50 | end 51 | 52 | private 53 | def add_matchup(sb1, sb2) 54 | @matchup_pairs[[sb1,sb2]] = true 55 | end 56 | 57 | def eval_rules(name) 58 | filename = File.dirname(__FILE__)+"/../rules/#{name}.rules" 59 | self.instance_eval(File.read(filename),filename) 60 | end 61 | end 62 | -------------------------------------------------------------------------------- /lib/sources_info.rb: -------------------------------------------------------------------------------- 1 | require "tmpdir" 2 | require "fileutils" 3 | require "utils" 4 | 5 | class SourceBundle 6 | attr_reader :src, :exprs, :sinfo, :matches 7 | def initialize(sinfo, options) 8 | @sinfo = sinfo 9 | @src = nil 10 | if options[:src] 11 | @src = options[:src] 12 | @matches = [options[:src]] 13 | elsif options[:exprs] 14 | @exprs = options[:exprs] 15 | @matches = find_all_matching_srcs(options[:exprs], sinfo) 16 | end 17 | end 18 | 19 | def match?(src) 20 | @matches.include? src 21 | end 22 | 23 | def to_s 24 | @src ? @src : @exprs.join("|") 25 | end 26 | 27 | def ==(sb) 28 | self.src ? self.src == sb.src : self.exprs == sb.exprs 29 | end 30 | 31 | def hash 32 | self.src ? self.src.hash : self.exprs.hash 33 | end 34 | 35 | def eql?(sb) 36 | self.src ? self.src.eql?(sb.src) : self.exprs.eql?(sb.exprs) 37 | end 38 | 39 | def pkg 40 | @matches[-1] 41 | end 42 | 43 | def section 44 | sinfo.package_to_file(pkg).section 45 | end 46 | 47 | def votes 48 | @matches.map{|m| sinfo.package_to_file(m).votes}.reduce(:+) 49 | end 50 | 51 | private 52 | def find_all_matching_srcs(exprs, sinfo) 53 | matches = Array.new(exprs.size){Array.new} 54 | sinfo.each do |src| 55 | exprs.each_with_index do |e,i| 56 | matches[i] << src if Util.match_expansion(e, src) 57 | end 58 | end 59 | matches.flatten 60 | end 61 | end 62 | 63 | class SourcesInfo 64 | attr_reader :distro 65 | include Enumerable 66 | 67 | def initialize(distro, opts={}) 68 | @PackageToFile = {} 69 | @BinToVotes = {} 70 | @simple_bundles = {} 71 | @wildcard_bundles = [] 72 | @ignore_srcs = [] 73 | @distro = distro 74 | @use_paths = {} 75 | 76 | #FIXME: use a different file per distro 77 | if opts[:popconfile] 78 | parsepopcon(opts[:popconfile]) 79 | else 80 | parsepopcon(File.dirname(__FILE__)+"/../data/popcon/all") 81 | end 82 | 83 | repos = opts[:repos] || ["main"] 84 | if opts[:parsefile] 85 | parsefile opts[:parsefile] 86 | else 87 | repos.each do |repo| 88 | repofile = "Sources-#{distro}-#{repo}.bz2" 89 | fullpath = Archive.get("/dists/#{distro}/#{repo}/source/Sources.bz2", 90 | repofile) 91 | parsefile(fullpath) 92 | end 93 | end 94 | end 95 | 96 | def parsepopcon(filename) 97 | File.open(filename).each do |line| 98 | if line.startswith? "Package: " 99 | s = line.split[1..-1] 100 | @BinToVotes[s[0]] = s[1].to_i 101 | end 102 | end 103 | end 104 | 105 | def getvotes(bin) 106 | @BinToVotes[bin] || 0 107 | end 108 | 109 | def parsefile(filename) 110 | currpkg = nil 111 | in_files_section = false 112 | fileobj = nil 113 | dir = nil 114 | 115 | simple_attrs = {"Section" => :section, "Homepage" => :homepage, 116 | "Priority" => :priority, "Vcs-Browser" => :vcsbrowser, 117 | "Maintainer" => :maintainer, "Directory" => :directory} 118 | 119 | IO.popen("bzcat #{filename}").each do |line| 120 | if line.include? ":" or line.strip == "" 121 | in_files_section = false 122 | end 123 | if in_files_section 124 | md5, size, filename = line.split 125 | fileobj.add_file FileInfo.new(filename, md5, size) 126 | elsif line.startswith? "Package:" 127 | currpkg = line.split[1] 128 | @PackageToFile[currpkg] = fileobj = SourcePkg.new(currpkg,@distro) 129 | elsif simple_attrs.keys.include?(a = line.split(":")[0].strip) 130 | fileobj.send(simple_attrs[a].to_s+"=", line.split(":")[1..-1].join(":").strip) 131 | elsif line.startswith? "Binary:" 132 | line[8..-1].split(",").each{|bin| fileobj.add_bin(bin.strip, getvotes(bin.strip))} 133 | elsif line.startswith? "Files:" 134 | in_files_section = true 135 | end 136 | end 137 | end 138 | 139 | def bin_to_package(bin); @BinToPackage[bin]; end 140 | def package_to_file(pkg); 141 | p = @PackageToFile[pkg]; 142 | p.upath = (@use_paths.find{|e,path| Util.match_expansion(e,pkg)}||[nil,nil])[1] if p 143 | p 144 | end 145 | def include_bin?(bin); @BinToPackage.include? bin; end 146 | def include_src?(src); @PackageToFile.include? src; end 147 | 148 | def each 149 | @PackageToFile.keys.each {|k| yield k} 150 | end 151 | 152 | def add_wildcard_bundle(exprs) 153 | @wildcard_bundles << SourceBundle.new(self, :exprs=>exprs) 154 | end 155 | 156 | def add_use_path(expr, path) 157 | @use_paths[expr] = path 158 | end 159 | 160 | def ignore_srcs(srcs) 161 | @ignore_srcs += srcs 162 | end 163 | 164 | def bin_to_bundle(bin) 165 | src_to_bundle(bin_to_package(bin)) 166 | end 167 | 168 | def find_ignore_src_match(src) 169 | @ignore_srcs.map{|e| Util.match_expansion(e, src)}.reduce(:|) 170 | end 171 | 172 | def bundles 173 | self.map {|src| src_to_bundle(src) if !find_ignore_src_match(src)} 174 | end 175 | 176 | def src_to_bundle(src) 177 | return nil if not src 178 | @wildcard_bundles.each {|b| return b if b.match? src} 179 | @simple_bundles[src] ||= SourceBundle.new(self, :src=>src) 180 | end 181 | 182 | def inspect 183 | to_s 184 | end 185 | def to_s 186 | "" 187 | end 188 | end 189 | 190 | class FileInfo 191 | attr_reader :filename, :md5, :size, :type 192 | def initialize(filename, md5, size) 193 | @filename = filename 194 | @md5 = md5 195 | @size = size 196 | 197 | split = filename.split(".") 198 | if split[-1] == 'dsc' 199 | @type = :dsc 200 | elsif split[-2] == 'diff' 201 | @type = :diff 202 | elsif ["gz","bz2","xz"].include? split[-1] 203 | @type = :orig 204 | else 205 | @type = :unknown 206 | end 207 | end 208 | end 209 | 210 | class SourcePkg 211 | SOURCE_EXTS = ["c","cc","cpp","h","rb","py","cs","java","pl","xs","php","sh", 212 | "vala","js","d","f","s","patch","diff","dpatch","mm"] 213 | PKG_EXTS = {"tar.gz" => "z", "tgz" => "z", "tar.bz2" => "j", "tar.xz" => "J"} 214 | 215 | attr_accessor :package, :distro, :directory, :section, :homepage, :priority, 216 | :vcsbrowser, :maintainer, :upath 217 | attr_reader :votes 218 | def initialize(package, distro, opts={}) 219 | @package = package 220 | @directory = nil 221 | @pkgcache = opts[:pkgcache]||File.expand_path("../pkgcache/",File.dirname(__FILE__)) 222 | @upath = nil 223 | @files = [] 224 | @votes = 0 225 | @distro = distro 226 | end 227 | 228 | def add_file(finfo) 229 | @files << finfo 230 | end 231 | 232 | def add_bin(bin, votes) 233 | @votes += votes 234 | end 235 | 236 | def orig 237 | @files.find{|f| f.type == :orig} 238 | end 239 | 240 | def dsc 241 | @files.find{|f| f.type == :dsc} 242 | end 243 | 244 | def download(destdir=".") 245 | @files.each{|f| get_from_archive(f)} 246 | 247 | #Unpack using dpkg-source 248 | Util.run_cmd "dpkg-source -x --no-copy #{get_from_archive(dsc)} #{destdir}" 249 | 250 | #Extract all packages from inside the package (complex packages like firefox 251 | #or openoffice have the upstream packages inside the debian packaging) 252 | PKG_EXTS.each do |ext, flag| 253 | IO.popen("find #{destdir} -name \"*.#{ext}\"").each do |file| 254 | file = file.strip 255 | r = Util.run_cmd("tar -C #{File.dirname(file)} -#{flag}xf #{file}",false) 256 | Util.warn "unpacking #{file} failed" if !r 257 | end 258 | end 259 | 260 | #Remove all non-source files 261 | extensions = SOURCE_EXTS+SOURCE_EXTS.map{|e| e.upcase} 262 | ext_cond = extensions.map{|e| "-not -name \"*.#{e}\""}.join(" ") 263 | 264 | File.open("#{destdir}/deleted_files", "w") do |f| 265 | ["find #{destdir} -type l", 266 | "find #{destdir} #{ext_cond} -not -type d"].each do |cmd| 267 | IO.popen(cmd).each do |line| 268 | line = line.strip 269 | if not line.endswith? "deleted_files" 270 | f.puts line 271 | FileUtils.rm line 272 | end 273 | end 274 | end 275 | end 276 | FileUtils.rm destdir+"/deleted_files" 277 | 278 | # Copy only the selected files if use_path has been used in the rules 279 | # for this package 280 | if @upath 281 | tmpdir = "#{destdir}.use_path" 282 | FileUtils.mkdir_p tmpdir 283 | Util.run_cmd "mv #{destdir}/#{@upath}/* #{tmpdir}/" 284 | Util.run_cmd "rm -fr #{destdir}" 285 | Util.run_cmd "mv #{tmpdir} #{destdir}" 286 | end 287 | end 288 | 289 | private 290 | def get_from_archive(file) 291 | Archive.get("/#{@directory}/#{file.filename}", file.filename) 292 | end 293 | end 294 | 295 | class Archive 296 | BASE_URL="http://archive.ubuntu.com/ubuntu/" 297 | CACHE_DIR = File.dirname(__FILE__)+"/../pkgcache/" 298 | NSEC_RETRY = 30 299 | 300 | def self.get(url, filename) 301 | #FIXME Check md5 if it already exists and at the end 302 | FileUtils.mkdir_p(CACHE_DIR) 303 | finalpath = CACHE_DIR+"/"+filename 304 | if File.exists? finalpath 305 | Util.info "#{filename} already in cache" 306 | else 307 | $stderr.puts " Downloading #{filename}" 308 | tmpdir = Dir.tmpdir+"/ubuntu_evolution-"+Process.pid.to_s 309 | FileUtils.mkdir_p tmpdir 310 | fullpath = tmpdir+"/"+filename 311 | cmd = "curl #{Util.verbose ? '-#' : '-s'} -o #{fullpath} #{BASE_URL}/#{url}" 312 | while !Util.run_cmd(cmd, false) 313 | $stderr.puts "Trying again in #{NSEC_RETRY} seconds" 314 | sleep NSEC_RETRY 315 | end 316 | FileUtils.mv fullpath, finalpath 317 | FileUtils.rmdir tmpdir 318 | end 319 | finalpath 320 | end 321 | end 322 | -------------------------------------------------------------------------------- /lib/string_additions.rb: -------------------------------------------------------------------------------- 1 | class String 2 | def startswith?(str) 3 | self[0..str.size-1] == str 4 | end 5 | def endswith?(str) 6 | self[-str.size..-1] == str 7 | end 8 | end 9 | 10 | -------------------------------------------------------------------------------- /lib/utils.rb: -------------------------------------------------------------------------------- 1 | class Util 2 | @@warnings = 0 3 | @@errors = 0 4 | @@verbose = 1 5 | 6 | def self.run_cmd(cmd, exit_on_error=true) 7 | $stderr.puts "++ Running: #{cmd}" if @@verbose >= 2 8 | r = system(cmd) 9 | if !r 10 | $stderr.puts "-- Error Running Command: #{cmd}" 11 | exit 1 if exit_on_error 12 | end 13 | r 14 | end 15 | 16 | def self.match_expansion(str, name) 17 | expr = str.scan(/([^\*\?]+|[\*\?])/).map do |m| 18 | if m[0] == "*" 19 | ".*" 20 | elsif m[0] == "?" 21 | "." 22 | else 23 | Regexp.escape(m[0]) 24 | end 25 | end.join("") 26 | not Regexp.new("^"+expr+"$").match(name).nil? 27 | end 28 | 29 | def self.info(message) 30 | $stderr.puts "Info: #{message}" if @@verbose >= 2 31 | end 32 | 33 | def self.warn(message) 34 | $stderr.puts "Warning: #{message}" if @@verbose >= 1 35 | @@warnings += 1 36 | end 37 | 38 | def self.error(message) 39 | $stderr.puts "ERROR: #{message}" 40 | @@errors += 1 41 | end 42 | def self.fatal_error(message) 43 | $stderr.puts "FATAL ERROR: #{message}" 44 | exit 2 45 | end 46 | 47 | def self.warnings; @@warnings; end 48 | def self.errors; @@errors; end 49 | def self.verbose; @@verbose; end 50 | end 51 | -------------------------------------------------------------------------------- /rules/general.rules: -------------------------------------------------------------------------------- 1 | # Packages that should be collapsed into a single comparison 2 | same_src "firefox-*", "firefox" 3 | same_src "gcc-*" 4 | same_src "gcj-*" 5 | same_src "readline?" 6 | same_src "glibc", "eglibc" 7 | same_src "xulrunner-*" 8 | same_src "telepathy-mission-control", "telepathy-mission-control-*" 9 | same_src "xfree86-driver-synaptics", "xserver-xorg-input-synaptics" 10 | same_src "ffmpeg-debian", "ffmpeg" 11 | same_src "wxwindows*", "wxwidgets*" 12 | same_src "mysql-dfsg-*", "mysql-5.*" 13 | same_src "postgresql-*" 14 | same_src "gnome-keyring", "libgnome-keyring" 15 | same_src "db4.7", "db4.8", "db" 16 | same_src "clutter-gtk", "clutter-gtk-*" 17 | same_src "kdebluetooth", "kbluetooth" 18 | same_src "wine", "wine1.2" 19 | same_src "openoffice.org", "libreoffice" 20 | 21 | # That's quite a build system you've got there buddy! 22 | # Make the openoffice comparisons (somewhat sane). 23 | 24 | #use_path "openoffice.org", "sources/*/" 25 | #use_path "libreoffice", "sources/*/" 26 | 27 | # Not really code 28 | ignore_src "iso-codes" 29 | ignore_src "language-support-*", "language-pack-*" 30 | ignore_src "*l10n*" 31 | 32 | # Duplicate copies of the kernel 33 | ignore_src "linux-qcm-msm", "linux-ti-omap4" 34 | # Not really code 35 | ignore_src "linux-firmware" 36 | 37 | 38 | -------------------------------------------------------------------------------- /rules/jaunty_karmic.rules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/rules/jaunty_karmic.rules -------------------------------------------------------------------------------- /rules/karmic_lucid.rules: -------------------------------------------------------------------------------- 1 | same_src "wacom-tools", "xf86-input-wacom" 2 | same_src "update-notifier-kde", "kubuntu-notification-helper" 3 | same_src "phonon", "phonon-backends" 4 | same_src "wine", "wine1.2" 5 | -------------------------------------------------------------------------------- /rules/lucid_maverick.rules: -------------------------------------------------------------------------------- 1 | same_src "openjdk-6*" 2 | same_src "libtimedate-perl", "timedate" 3 | same_src "policykit", "policykit-*" 4 | same_src "phonon", "phonon-backends" 5 | same_src "git", "git-core" 6 | -------------------------------------------------------------------------------- /rules/maverick_natty.rules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/rules/maverick_natty.rules -------------------------------------------------------------------------------- /tasks/masscompare.rb: -------------------------------------------------------------------------------- 1 | desc "Mass compare packages from two dists" 2 | task :mass_compare, [:dist1, :dist2] do |t, args| 3 | mass_compare(args.dist1, args.dist2) 4 | end 5 | 6 | DISTPAIRS.each do |d1,d2| 7 | file GENDIR+"comparisons/#{d1}_#{d2}" do 8 | $stderr.puts "Comparing #{d1} with #{d2}" 9 | mass_compare(d1,d2) 10 | end 11 | end 12 | 13 | desc "Compare all distributions" 14 | task :compare_all_dists => DISTPAIRS.map{|d1,d2| "generated/comparisons/#{d1}_#{d2}"} 15 | 16 | def mass_compare(dist1, dist2) 17 | sinfo1 = SourcesInfo.new(dist1) 18 | sinfo2 = SourcesInfo.new(dist2) 19 | re = RuleEngine.new(sinfo1, sinfo2) 20 | re.process 21 | 22 | $stderr.puts "Finished determining package matchups, #{Util.errors} errors and #{Util.warnings} warnings" 23 | if Util.errors > 0 || Util.warnings > 0 24 | $stderr.puts "Aborting due to errors or warnings in package matchups, correct those to advance" 25 | exit 1 26 | end 27 | $stderr.puts "Success!! Proceeding with comparison" 28 | 29 | matchups = re.matchups 30 | matchups.each_with_index do |match, i| 31 | s1, s2 = match 32 | $stderr.puts "Comparison #{i+1}/#{matchups.size}: #{s1 ? s1 : "nil"} with #{s2 ? s2 : "nil"}" 33 | Comparator.compare(s1, s2, sinfo1, sinfo2) 34 | end 35 | 36 | def read_loc(str) 37 | str.strip! 38 | str.split(" ")[-1].to_i 39 | end 40 | 41 | def read_diffstat(str, pattern) 42 | match = str.match(Regexp.new("(\\d*) "+pattern)) 43 | match ? match[1].to_i : 0 44 | end 45 | 46 | def get_votes_section(sinfo, pkg) 47 | return [0,''] if !pkg or pkg == "nil" 48 | bundle = sinfo.src_to_bundle(pkg) 49 | [bundle.votes, bundle.section] 50 | end 51 | 52 | cmpdir = GENDIR+"comparisons/" 53 | FileUtils.mkdir_p cmpdir 54 | cmpfile = cmpdir+"#{dist1}_#{dist2}" 55 | $stderr.puts "Writing #{cmpfile}" 56 | File.open(cmpfile, 'w') do |f| 57 | f.puts ['from', 'to', 'from_section', 'to_section', 'from_loc', 'to_loc', 58 | 'from_votes', 'to_votes', 'files_changed', 'insertions', 'deletions'].join(',') 59 | matchups.each do |from, to| 60 | from ||= "nil" 61 | to ||= "nil" 62 | filename = "cmpcache/#{dist1}_#{dist2}/#{from}\##{to}" 63 | content = File.open(filename).readlines 64 | from_loc = read_loc(content[0]) 65 | to_loc = read_loc(content[1]) 66 | from_votes, from_section = get_votes_section(sinfo1, from) 67 | to_votes, to_section = get_votes_section(sinfo2, to) 68 | files_changed = read_diffstat(content[2], "files changed") 69 | insertions = read_diffstat(content[2], "insertions") 70 | deletions = read_diffstat(content[2], "deletions") 71 | f.puts [from, to, from_section, to_section, from_loc, to_loc, from_votes, to_votes, 72 | files_changed, insertions, deletions].join(',') 73 | end 74 | end 75 | $stderr.puts "Finished comparing #{dist1} with #{dist2}" 76 | end 77 | -------------------------------------------------------------------------------- /test/popcon.test: -------------------------------------------------------------------------------- 1 | Package: dpkg 1 1260863 5082 62 2 | Package: dpkg-dev 10 613212 31396 139 3 | Package: dselect 100 299346 580 68 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /test/rule_engine_test.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | $-w = true 3 | require File.dirname(__FILE__)+"/../lib/all" 4 | require 'test/unit' 5 | 6 | class RuleEngineTest < Test::Unit::TestCase 7 | def setup 8 | @re ||= RuleEngine.new("jaunty", "karmic") 9 | end 10 | 11 | def teardown 12 | @re.clear_matchups 13 | end 14 | 15 | def self.assert_matchup(bin, left, right) 16 | class_eval %{ 17 | def test_in_line_#{caller[0].split(":")[1]} 18 | @re.process(["#{bin}"]) 19 | assert(@re.matchups[0] == ["#{left}","#{right}"], 20 | "#{bin} did not match as [#{left}, #{right}] (instead \#{@re.matchups[0].inspect})") 21 | end 22 | } 23 | end 24 | 25 | assert_matchup("install-info", "texinfo", "texinfo") 26 | end 27 | -------------------------------------------------------------------------------- /test/sources-info.test.bz2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pedrocr/codecomp/d8f0823c9049659493a86ab088447596ef4e227b/test/sources-info.test.bz2 -------------------------------------------------------------------------------- /test/sources_info_test.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | $-w = true 3 | require File.dirname(__FILE__)+"/../lib/all" 4 | require 'test/unit' 5 | 6 | class SourcesInfoTest < Test::Unit::TestCase 7 | def test_double_comparisons_exprs 8 | @jaunty ||= SourcesInfo.new("jaunty") 9 | @karmic ||= SourcesInfo.new("karmic") 10 | 11 | bundle1a = SourceBundle.new(@jaunty, :exprs => ["glibc","eglibc"]) 12 | bundle2a = SourceBundle.new(@karmic, :exprs => ["glibc","eglibc"]) 13 | bundle1b = SourceBundle.new(@jaunty, :exprs => ["glibc","eglibc"]) 14 | bundle2b = SourceBundle.new(@karmic, :exprs => ["glibc","eglibc"]) 15 | 16 | pair1 = [bundle1a, bundle2a] 17 | pair2 = [bundle1b, bundle2b] 18 | 19 | assert(pair1 == pair2, "#{pair1} != #{pair2}") 20 | assert(pair1.hash == pair2.hash, "#{pair1} hash != #{pair2} hash") 21 | assert(pair1.eql?(pair2), "#{pair1} not .eql? to #{pair2}") 22 | end 23 | 24 | def test_parse 25 | popcon = File.dirname(__FILE__)+"/popcon.test" 26 | sources = File.dirname(__FILE__)+"/sources-info.test.bz2" 27 | sinfo = SourcesInfo.new("jaunty", :popconfile => popcon, :parsefile => sources) 28 | 29 | bundle = sinfo.src_to_bundle("dpkg") 30 | assert_instance_of SourceBundle, bundle 31 | assert_equal 111, bundle.votes 32 | end 33 | 34 | def test_bundle_matching 35 | @maverick ||= SourcesInfo.new("maverick") 36 | @natty ||= SourcesInfo.new("natty") 37 | RuleEngine.new(@maverick, @natty) 38 | 39 | assert_equal "openoffice.org", @maverick.src_to_bundle("openoffice.org").pkg 40 | assert_equal "libreoffice",@natty.src_to_bundle("openoffice.org").pkg 41 | 42 | assert_equal "db4.8", @maverick.src_to_bundle("db4.8").pkg 43 | assert_equal "db",@natty.src_to_bundle("db4.8").pkg 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /test/utils_test.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | $-w = true 3 | require File.dirname(__FILE__)+"/../lib/all" 4 | require 'test/unit' 5 | 6 | class UtilsTest < Test::Unit::TestCase 7 | @@test_num = 0 8 | 9 | def self.assert_match(str, name) 10 | class_eval %{ 11 | def test_in_line_#{caller[0].split(":")[1]} 12 | assert(Util.match_expansion("#{str}","#{name}") == true, "#{name} did not match #{str}") 13 | end 14 | } 15 | end 16 | def self.assert_nomatch(str, name) 17 | class_eval %{ 18 | def test_in_line_#{caller[0].split(":")[1]} 19 | assert(Util.match_expansion("#{str}","#{name}") == false, "#{name} matched #{str}") 20 | end 21 | } 22 | end 23 | 24 | assert_match("foo[]{}\\+-/", "foo[]{}\\+-/") 25 | assert_match("foo*","foobar") 26 | assert_match("*bar","foobar") 27 | assert_nomatch("foo*","barfoobar") 28 | assert_nomatch("*foo","barfoobar") 29 | assert_match("*bar","foobar") 30 | assert_match("foo?","foob") 31 | assert_nomatch("foo?","fooba") 32 | assert_nomatch("foo?","foobar") 33 | assert_nomatch("foo*", nil) 34 | end 35 | 36 | -------------------------------------------------------------------------------- /writeups/.gitignore: -------------------------------------------------------------------------------- 1 | *.aux 2 | *.log 3 | *.pdf 4 | -------------------------------------------------------------------------------- /writeups/Writeup1.tex: -------------------------------------------------------------------------------- 1 | \documentclass[11pt]{article} 2 | \usepackage[english]{babel} 3 | \usepackage[utf8]{inputenc} 4 | \usepackage{ifthen} 5 | \selectlanguage{english} 6 | \usepackage[pdftex]{graphicx} 7 | \usepackage{fancyhdr} 8 | \usepackage{subfigure} 9 | \usepackage[hmargin=1in,vmargin=1in]{geometry} 10 | \usepackage{setspace} 11 | \usepackage{url} 12 | %\usepackage{fancyhdr} 13 | %\pagestyle{fancy} 14 | %%% ---------------------------------------------------------------------- 15 | 16 | %\rfoot{\thepage} 17 | %\cfoot{} 18 | %\lhead{} 19 | \pagestyle{fancy} 20 | \lhead{GSBGEN 390 : Individual Research \\ Sponsoring Professor William Barnett} 21 | \rhead{Pedro Alves Ribeiro Côrte-Real \\ SUID: 005575591} 22 | \lfoot{} 23 | \rfoot{} 24 | \setlength{\headheight}{30pt} 25 | 26 | \title{Final Writeup} 27 | \date{June 7, 2011} 28 | \author{Pedro Côrte-Real} 29 | 30 | \begin{document} 31 | 32 | \thispagestyle{fancy} 33 | \begin{center} 34 | \textbf{\Large Final Paper} 35 | \end{center} 36 | 37 | \section{Introduction} 38 | 39 | Open-source development, by its public nature, provides a valuable data source to study how systems are composed and evolve. Previous work on building quantitative measures based on the source are either outdated\cite{sloccount} or target only a specific project\cite{lwnstats,gnomecensus}. The objective of this work was to look at a representative cross-section of open-source software currently being used and extract from it both immediate conclusions and a repeatable method that can be extended for further study. All data and code to produce the analysis and its outputs (including this document) is itself contained within an open-source project\cite{repo}. 40 | 41 | \section{Methodology} 42 | 43 | The development of open-source software is highly dispersed, so to study a finite set a selection criteria must be established. For the purpose of this study the Ubuntu Linux distribution was used as a reference because it is: 44 | \begin{itemize} 45 | \item Based on and includes the full Debian archive which is the biggest of any Linux distribution 46 | \item Organized as fixed time releases\cite{ubuntureleases} so any given iteration will roughly correspond to a 6 month effort by the whole community\footnote{unless packaging of new versions of released software is lagging behind} 47 | \item Backed by a commercial entity, and so open to the question as to how the small amount of contribution by the parent company can make a difference in the much higher output of the full community 48 | \end{itemize} 49 | 50 | Having selected Ubuntu as the basis for comparison the methodology used was to match consecutive versions of the same packages between consecutive iterations of the distribution and calculate relevant metrics: 51 | \begin{itemize} 52 | \item The total lines of code (LOC) in the package, as a proxy for its relative size 53 | \item The total LOC that were actually added and remove to a given package\footnote{altered lines are counted as both an addition and removal, leading to what could be considered a double counting} 54 | \item A measure of churn in the code base defined as the total number of lines changed between the two version divided by the total LOC of the original version as calculated before 55 | \end{itemize} 56 | 57 | These two metrics, together with metadata about the packages (e.g., their original source project) forms the basis of the initial results of the research. The results presented were limited to Ubuntu's ``main'' repository, the roughly 3.000 packages that Ubuntu supports directly and are selected from the more than 30.000 that Debian packages. The hope is that by focusing on this selection a representative subset is chosen of what constitutes the most relevant open-source software for at least the desktop and server uses Linux distributions are commonly employed for. 58 | 59 | \section{Preliminary Results} 60 | 61 | A first analysis\cite{prelimresults} was focused on the relationship between size and churn and how the total amount of mutation in the code base has been evolving over time. 62 | 63 | \begin{figure}[htb] 64 | \begin{center} 65 | \subfigure[Churn vs Size]{\label{churn:size}\includegraphics[width=80mm]{../generated/sizevschurn/sizevschurn.pdf}} 66 | \subfigure[Churn per section]{\label{churn:section}\includegraphics[width=80mm]{../generated/sectionsplit/sectionsplit.pdf}} 67 | \end{center} 68 | \caption{Package to package churn in the last four Ubuntu releases} 69 | \label{fig:churn} 70 | \end{figure} 71 | 72 | Figure~\ref{churn:size} shows there is a negative correlation between the size of a given package and the churn it goes through in a given development cycle. The plot is not very convincing but the result is highly statistically significant\footnote{$p < 2 \times 10^{-16}$; Since there are many other factors that explain Churn than total LOC by itself the R-squared is very small at 0.04. This is evident in how the scatter plot does not even hint at what the regression line is}. It is perhaps not particularly surprising that as a package grows bigger more parts of it are mature and the total rate of mutation as a percentage slows. If that explains the full effect then this is not a particularly insightful result. It remains to be checked by future work if controlling for a measure package maturity is enough to eliminate this effect or if there is in fact a negative impact on the rate of mutation from a package growing larger. Software Engineering practice would support this hypothesis, as the complexity of the project makes its evolution harder. 73 | 74 | Figure~\ref{churn:section} shows the evolution of the total amount of code changes across the whole distribution. Here the surprising result is that the total amount of mutation of the distribution has been steadily decreasing. On the other hand the absolute numbers are staggering. In just 6 months, just the narrow slice of packages in Ubuntu main has consistently received more than 100M lines of changes. That is 5-10 times the whole Linux kernel, a 20 year old and highly complex piece of software, every 6 months. 75 | 76 | The second analysis was focused on the question of how much of the GNU project, started by Richard Stallman, to create a complete Unix replacement, is still present in a modern distribution\cite{gnuinlinux} and how much other projects weigh in on the same metric. 77 | 78 | \begin{figure}[htb] 79 | \begin{center} 80 | \subfigure[Total]{\label{gnuinlinux:total}\includegraphics[height=60mm]{../generated/gnuinlinux/totalsplit.pdf}} 81 | \subfigure[GNU software]{\label{gnuinlinux:gnu}\includegraphics[height=60mm]{../generated/gnuinlinux/gnusplit.pdf}} 82 | \end{center} 83 | \caption{LOC split of projects in Ubuntu natty's main repository} 84 | \label{fig:gnuinlinux} 85 | \end{figure} 86 | 87 | Figure~\ref{gnuinlinux:total} shows the split in total size of Ubuntu packages divided by their originating projects. It is interesting to discover that the kernel and its accompanying utilities amounts to a fraction very similar to GNU's. Perhaps more surprising is that almost 60\% of the distribution is sourced from very small projects, each often producing a single application. 88 | 89 | Figure~\ref{gnuinlinux:gnu} shows the projects that compose the GNU slice. With the notable exception of \texttt{gdb} all the large GNU projects have viable and popular alternatives in active use. This together with the high percentage of packages sourced from small projects argues for the decreasing importance of large umbrella projects, instead replaced by distributions as the most relevant aggregator in the supply chain between original developers and end-users. 90 | 91 | \section{Future Work} 92 | 93 | The work presented is but a proof of concept of what can be done with the source code as a data source. Potential avenues of further refinement and extension of the work are (from small to large): 94 | \begin{itemize} 95 | \item Improve the methodology of how churn and LOC are calculated to better account for the differing types of programming languages 96 | \item Explore using a weighted sum of LOC as a better size metric, correcting for the relative verbosity of programming languages 97 | \item Creating a maturity variable based on the openly accessible bug database for the same packages 98 | \item Use the Ubuntu/Debian package popularity results to relate the effort put into packages and their changes in popularity with end-users 99 | \item Do comparisons based on other unrelated Linux distributions such as Fedora and RedHat 100 | \item Re-purpose the same types of analysis for the Debian archive and see if Ubuntu's corporate sponsor (Canonical) can be observed to have a significant effect 101 | \item Look at finer grained data from the version control systems that are used to store the code for the project, allowing analysis of the micro-aspects of the evolution, instead of the relatively large 6 month steps studied here 102 | \item Explore code repository communities such as GitHub and its dynamics as a social graph on top of code repositories 103 | \item Obtain access to and perform similar analysis on large close-sourced code bases as the Windows or OS X sources 104 | \end{itemize} 105 | 106 | \section{Conclusion} 107 | 108 | Source code is itself good quality data; programmers produce it in its original form so it is directly a human output; it is unambiguously and mechanically translated into final usable software so it is a complete definition; it is usually stored in systems that record not only its most recent version but also a full record of its evolution so it includes an inherent time series of mutation. 109 | 110 | The conclusions extracted so far are still tentative and incomplete. The most interesting achievement of this work has been the production of a first base of repeatable and fully automated analysis that can be used to target existing code bases and extract from them meaningful metrics. 111 | 112 | The analysis made are fully defined in source code, with no manual steps. This allows for the same kind of incremental approach that is used to build complex systems to be used to further the study in this area, while at the same time retaining a complete record of all the steps taken. It has been invaluable throughout the project to be able to go back to previous versions of the work and understand why modifications were having unexpected results. In a lot of ways the codification of the complete method of analysis replaces the lab notebook and makes repetition of previous experiments trivial. 113 | 114 | \newpage 115 | \begin{thebibliography}{9} 116 | 117 | \bibitem{sloccount} 118 | David A. Wheeler, 119 | \emph{More Than a Gigabuck: Estimating GNU/Linux's Size}\\ 120 | \url{http://www.dwheeler.com/sloc/redhat71-v1/redhat71sloc.html}\\ 121 | June 30, 2001 (updated July 29, 2002) 122 | 123 | \bibitem{lwnstats} 124 | Jonathan Corbet, 125 | \emph{2.6.39 development statistics}\\ 126 | \url{https://lwn.net/Articles/442229/}\\ 127 | May 10, 2011 128 | 129 | \bibitem{gnomecensus} 130 | Neary Consulting, 131 | \emph{The GNOME Census: Who writes GNOME?}\\ 132 | \url{http://www.neary-consulting.com/docs/GNOME_Census.pdf}\\ 133 | July 28, 2010 134 | 135 | \bibitem{repo} 136 | \emph{Source repository}\\ 137 | \url{https://github.com/pedrocr/codecomp} 138 | 139 | \bibitem{ubuntureleases} 140 | \emph{List of Ubuntu releases}\\ 141 | \url{https://wiki.ubuntu.com/Releases} 142 | 143 | \bibitem{prelimresults} 144 | Pedro Côrte-Real, 145 | \emph{Preliminary Results from Open Source Evolution Analysis}\\ 146 | \url{http://pedrocr.net/text/preliminary-results-open-source-evolution}\\ 147 | May 12 2011 148 | 149 | \bibitem{gnuinlinux} 150 | Pedro Côrte-Real, 151 | \emph{How much GNU is there in GNU/Linux?}\\ 152 | \url{http://pedrocr.net/text/how-much-gnu-in-gnu-linux}\\ 153 | May 31 2011 154 | 155 | \end{thebibliography} 156 | 157 | \end{document} 158 | --------------------------------------------------------------------------------