Ecosystems in GitHub and a Method for Ecosystem Identification using Reference Coupling

Kelly Blincoe, Francis Harrison and Daniela Damian Engineering Global InterAction Lab University of Victoria Victoria, BC, Canada Email: [email protected], [email protected], [email protected]

Abstract—Software projects are not developed in isolation. To identify technical dependencies, we turn to cross- Recent research has shifted to studying software ecosystems, references on GitHub, a social code hosting service. GitHub communities of projects that depend on each other and are encourages collaboration between users both within and across developed together. However, identifying technical dependencies at the ecosystem level can be challenging. In this paper, we projects through its transparent interface and built-in social 1 propose a new method, known as reference coupling, for detecting features. With GitHub Flavored , when a user technical dependencies between projects. The method establishes cross-references another repository in a pull request, issue or dependencies through user-specified cross-references between commit comment a link to the other repository is automati- projects. We use our method to identify ecosystems in GitHub- cally created. This introduces a way for developers to bring hosted projects, and we identify several characteristics of the identified ecosystems. We find that most ecosystems are centered awareness across repositories. In this paper, we investigate around one project and are interconnected with other ecosystems. whether these cross-references indicate a technical dependency The predominant type of ecosystems are those that develop between the two repositories by examining a set of these tools to support software development. We also found that the cross-references. We found that the cross-references are a project owners’ social behaviour aligns well with the technical good conceptualization of technical dependencies between dependencies within the ecosystem, but project contributors’ social behaviour does not align with these dependencies. We projects, and we highlight several common types of technical conclude with a discussion on future research that is enabled dependencies seen in these cross-reference comments. We call by our reference coupling method. our method for identifying technical dependencies reference coupling. I.INTRODUCTION With an ability to identify technical dependencies between Software ecosystems, defined as “a collection of software a large number of projects, ecosystems of densely connected projects which are developed and which co-evolve together in projects can be identified. We use a popular community the same environment” [1], have become an area of interest detection algorithm [10] to identify ecosystems across all in recent research. Since software projects are not typically GitHub-hosted projects. Ecosystem identification is important developed in isolation, studying a software project without to help developers understand how their tasks fit into the big examining its surrounding ecosystem is incomplete. Thus, picture and who they need to coordinate their changes with analysis of software ecosystems has emerged as a novel new at the ecosystem level [1], [11]. For open source ecosystems, research area in recent years. it is also important for attracting new contributors [1] since Projects in an ecosystem depend on one another [1]. The project’s within an ecosystem are more likely to attract at- technical dependencies that exist between projects define the tention. In this paper, we analyze the ecosystems identified structure of the ecosystem [2]. Thus, identifying technical using our methods on GitHub-hosted projects and identify a dependencies between software projects is a useful way to set of properties that characterize the ecosystems. Conway identify ecosystems. However, identifying technical depen- Law. To complement our focus on technical dependencies dencies between projects on a large scale has proven to be within ecosystems, we also investigate the social behaviour difficult [3]. Existing static dependency analysis approaches of project owners/contributors in relation to these ecosystems. do not identify dependencies across projects. Methods for Our analysis was guided by the following research questions: extracting dependencies from a project’s have RQ1: Do cross-references to other projects in issue, pull been proposed [2], [3], [4], but they require large amounts request, and commit comments indicate the existence of a of memory and computation time [5]. Thus, they cannot be technical dependency between the two projects? employed across a large set of projects. Other methods [1], [6], RQ2: What ecosystems exist across GitHub-hosted projects [7], [8], [9] avoid analyzing source code by obtaining technical and what is their structure? dependency information from a project’s configuration files, RQ3: Do the project owners’ and contributors’ social but this information is not always available or accurate. behaviours align with the technical dependencies? Without a way to establish dependencies between projects, researchers cannot fully understand a project’s ecosystem. 1https://help.github.com/articles/github-flavored-markdown/ The rest of the paper is structured as follows: Our research of these comments simply referenced another repository using methods and results are presented in Section II for RQ1, the pattern as described above with no additional text provided. Section III for RQ2, and Section IV for RQ3. In Section V, we We identified two main types of dependencies: summarize our findings and discuss open questions for future Dependency between the two projects. The most common research. Section VI provides an overview of related work in type of dependency found was a direct technical dependency software ecosystems and dependency conceptualizations. We between the two projects. An example of a direct technical provide a brief conclusion in Section VII. dependency is when an issue created in one project depends on a fix/update in another project. Another example is when a II.REFERENCE COUPLING project needs to be updated based on changes made in another RQ1: Do cross-references to other projects in issue, pull project. request, and commit comments indicate the existence of a Below we provide three examples of cross-reference com- technical dependency between the two projects? ments that are indicative of direct technical dependencies between the two projects. Project names follow the pattern A. Research Method user/repository where user is the owner’s GitHub login and repository is the name of the project repository. We studied the cross-references made to other repositories in Issue #449 on the sensu/sensu project describes an issue comments on issues, pull requests and commits. We obtained that is the result of the interaction between the sensu/sensu data from the GHTorrent [12] project, which provides a mirror code and the ruby-amqp/amq-client . The comment of the GitHub API data. GHTorrent obtains its data by mon- references a commit on the ruby-amqp/amq-client that fixes itoring and recording GitHub events as they occur. We used the issue. the MySQL 2014-04-02 dataset to obtain information on the projects. This dataset contains data on 2,399,526 repositories, “I verified that the problem is still the one referenced 3,426,046 users, and their events - including commits, issues, in ruby-amqp/amq-client#14. This fix is not merged pull requests and comments. Since the MySQL con- with amq-client’s ‘0.9.x-stable’ branch. This is why tains only the first 256 characters of comments, we obtained all I am still hitting it. The commit ruby-amqp/amq- comments from GHTorrent’s main MongoDB in May client@60f1c59 is the fix but it resides only in the 2014. The MongoDB contains the full text of all comments. master branch.” Cross-references follow the pattern User/Project#Num (e.g. Issue #8 on the tsujigiri/axiom project notes that changes rails/rails#123) or User/Project@SHA. We performed pattern must be made to the code base to allow an upgrade to the matching on all comments in the GHTorrent database to iden- latest release of the ninenines/cowboy project. tify these cross-references. We define a project as a repository and all of its forks as recommended by [13]. Since we are “Upgrade Cowboy: After Cowboy 0.6.1 Cowboy’s interested only in relationships between projects, we filtered http req record was made opaque and can not be the cross-references to ignore those where one project is a used directly anymore. I didn’t really have the time fork of the other project. We identified 89,784 comments with yet to look into it, but it looks like we just need a cross-reference to another project. to remove all references to the record from the To answer RQ1 and verify that these cross-references are documentation and add directions on how to access a valid conceptualization of dependencies, we examined 198 cowboy req:req() via the cowboy req functions. See random comments which cross-referenced another project. We ninenines/cowboy#266 and ninenines/cowboy#267.” classified a comment as a technical dependency if the comment Commit 81bbbec21c04b6392f6892f7735243387d295337 described a work dependency, either direct or indirect, between on the /node project closes isaacs/node-graceful-fs issue the two projects. #6, which describes a problem in the isaacs/node-graceful-fs We examined the comments classified as technical depen- code stemming from the use of joyent/node. GitHub allows dencies to identify the types of dependencies that exist through automatic closure of issues through commit comments, even these cross-reference relationships. We used a grounded theory when the commit is in a different repository2. approach to identify types of dependencies [14]. We conducted open coding on the cross references, grouping conceptu- “This fixes isaacs/node-graceful-fs#6.” ally similar comments into categories. We stopped when we Both projects depend on a third project. We also identified achieved saturation after 49 comments. One person, familiar some cases where the comments describe a dependency on with software development practices, performed the qualitative a third project that is not cross-referenced. For example, coding. everzet/capifony’s pull request #376 cross-references com- B. Results poser/’s issue #1453, but the problem stems from the use of the /symfony project. After identifying the Most of the cross-reference comments (90%) were classified source of the problem, a new issue (#411) is created on the as technical dependencies. The remaining 10% of comments did not contain enough details for proper classification. Many 2https://github.com/blog/1439-closing-issues-across-repositories everzet/capifony project that identifies the changes that need to be made to the way the symfony environment is set so that the composer/composer code executes correctly. “As described in #376 capifony should execute composer with the right symfony environment set. Currently, with --no-scripts option removed in #376, composer is always executing symfony scripts with default dev environment.”

Cross-references to other repositories appearing in GitHub comments, therefore, do indicate the existence of a technical dependency. We call this conceptualization of dependencies between projects reference coupling.

III.GITHUB ECOSYSTEMS RQ2: What ecosystems exist across GitHub-hosted projects and what is their structure? A. Research Method We constructed a network of the technical dependency rela- tionships established through reference coupling as described in Section II. The Dependency Network is defined as a directed Fig. 1. All GitHub projects with cross-references. The largest connected graph Gd =< V, E >. The set of vertices, denoted by V , is component (or giant component) is easily identified as the well-connected all GitHub projects involved in at least one cross-reference. subgraph appearing in the center of the graph. There are 18,533 projects in this set. The set of edges, denoted by E, is a set of node pairs E(V ) = {(x, y)|x, y ∈ V }. exist between projects define the structure of an ecosystem [2], If the project represented by node x cross-referenced the i these communities represent software ecosystems. project represented by node y , there is a directed edge from j To identify properties of the identified ecosystems, we x to y . The weight of each edge is the count of cross- i j analyzed visualizations of the Dependency Network. We used references for the pair of projects. We filtered the edges to only the Gephi [16] graphing tool to create visualizations. We consider dependencies between nodes if the pair of projects inspected visualizations of the network to visually identify have been cross-referenced two or more times to capture only patterns. We triangulated the patterns visible in the network the stronger dependencies. with statistics of the network. We also examined the type of To identify ecosystems across projects hosted on GitHub, projects prominent in each ecosystem. we used the popular Louvain community detection method [10] on the Dependency Network. The Louvain B. Results method is a greedy optimization method that aims to partition Of the 18,533 projects in the Dependency Network, 10,484 a network into communities of densely connected nodes and (57%) are a part of the largest connected component (com- optimize the modularity of the network. Modularity is defined monly referred to as the giant component [17]), which is as “the number of edges falling within [communities] minus the largest subgraph in which every node is connected to the expected number in an equivalent network with edges every other node by some path. The connected components placed at random [15].” The Louvain method is comprised isolated from the giant component are primarily comprised of of two steps. It first optimizes modularity locally by looking same owner communities in which all nodes in the connected for small communities. Then it aggregates the nodes in component are projects owned by the same GitHub user each small community and builds a new network with these or organization. For example, the second largest connected aggregated nodes. It iterates on these two steps until the component is comprised of 65 nodes, of which, all but two modularity is maximized. The Louvain method outperforms are owned by GitHub user deathcap3. Figure 1 shows the full all other community detection methods in terms of both the Dependency Network, though for visibility we only display modularity that is achieved and the computation time [10]. nodes with degree of 3 or greater. As visible on the graph, most High modularity scores indicate that there are dense con- of the nodes isolated from the giant component are connected nections within the communities but sparse connections across to only a small number of nodes. In fact, 75% of nodes not communities, showing that an optimal solution has been found. in the giant component are connected to only one other node. When high modularity scores are obtained, the communities Since we are most interested in studying the popular GitHub have significant real-world meaning [10]. In our network, ecosystems, we focus our analysis on the interconnected part the identified communities represent sets of projects densely connected by technical dependencies. Since dependencies that 3https://github.com/deathcap daliwali/fortune -api/json-apirpflorence/ember-qunit

stefanpenner/ember-inflector basho/erlang_jsbasho/riaknostic sproutsocial/es6-import-validate tricknotes/ember-datapeter-murach/github basho/giddyup basho/riak_search basho/bitcask

anl/kitchen-gce stefanpenner/ember-app-kit toranb/ember-data--rest-adapter thomasboyt/defeatureify basho/eleveldb emberjs/data basho/riak--client GroupTalent/epf basho/cuttlefish kevinykchan/knife-joyent emberjs/ember-devemberjs/website /cucumber-js basho/riak_ensemblebasho/riak_core novalis/bitcask

basho/riak_api basho/leveldb fog/fog myronmarston/vcr cucumber/multi_test fog/fog-core tricknotes/ember.js basho/riak_control indirect/ember-rails ebryn/backburner.js heartsentwined/ember-auth ebryn/ember-model aidahz/riak_core basho/riak_dt emberjs/ember.js wkhtmltopdf/wkhtmltopdf.github.io basho/riak_test cucumber/cucumber-rails basho/riakbasho/riak_pipe basho/riak_kv rumblelabs/asset_sync flyerhzm/switch_user basho/sidejob spagalloco/em-twittergeemus/excon basho/riak_pb tildeio/router.js basho/lager owncloud/chat KentBeck/junit basho/riak-python-client bblimke/webmock zgramana/router.js Addepar/ember-table cucumber/cucumber-ruby-core basho/yokozuna fruux/sabre-dav drbrain/net-http-persistent bergie/dnode-php cucumber/cucumber- basho/node_packagebasho/riak-ruby-client vmeurisse/node-phantom wkhtmltopdf/wkhtmltopdf intridea/tweetstream cowboyd/libv8 McNetic/PHPZipStreamer sferik/twitter basho/riak-erlang-http-clientbasho/basho_docs cowboyd/therubyracer stereobooster/execjs lostisland/faraday vcr/vcr cucumber/cucumber-jvm owncloud/music chobie/php-uv basho/stanchion basho/riak-erlang-client technoweenie/faraday owncloud/appframework jnunemaker/twitter wkhtmltopdf/qt owncloud/calendar jlogsdon/php-cli-tools n1k0/casperjs typhoeus/ethon cucumber/gherkin laurentj/slimerjs /rubygems-aws rzezeski/yokozuna trinidad/trinidad seattlerb/minitest karmi/rubygems-aws owncloud/contacts luislavena/-compilerjingweno/msgpack_rails owncloud/media owncloud/documentsowncloud/apps wp-cli/package-indexgharlan/propelorm.github.com cldwalker/hirb emberjs/ember-rails cucumber/cucumber basho/riak_cs sferik/t s17t/owncloud reactphp/react /monomac owncloud/gallery ariya/ simplepie/simplepie wp-cli/wp-cli.github.com

chancancode/rails igrigorik/em-http-request test-unit/test-unit whit537/www.gittip.com bjeanes/squash-web nemerle/red_tint owncloud/news zimbatm/raven-ruby anarchivist/archivesspace owncloud/bookmarks owncloud/mozilla_sync postrank-labs/goliath test-unit/test-unit-activesupport yaauie/cliver ruby-korea/ruby-korea.github.io sennza/Chassis myint/perceptualdiff tiagohillebrandt/builds marcj/Propel2 mono/mono-tools jDataView/jBinary plentz/jruby_report mathnet/mathnet-numerics /eventmachine luislavena/rb-readline wojsmol/wp-cli.github.com owncloud/android cedriclombardot/Propel owncloud/mirallowncloud/core /jruby-rack seattlerb/minitest-bacon paulcbetts/ModernHttpClient gma/nestacms.com IronLanguages/main benbalter/wordpress-plugin-tests bradt/wp-migrate-db ohler55/oj SynoCommunity/spksrc jnr/jnr-constants rweng/-rails owncloud/documentation mishoo/UglifyJS2 wycats/thor freerange/mochatyphoeus/typhoeus jruby/bytelist tmm1/http_parser.rb rubygems/rubygems.org wp-cli/builds propelorm/Propel2 zendframework/ZFTool JabbR/JabbR fsharp/FSharp.Data zendframework/zf-web carlhuda/bundler-site rlinehan/dotfiles wp-cli/server-command topazproject/topaz nickl-/composer propelorm/propelorm.github.com pry/pry-coolline jpcamara/jruby celluloid/dcell tenderlove/psych jhelwig/technosorcery.net wp-cli/wp-cli

mishoo/UglifyJS celluloid/celluloid-io rubygems/bundler- jruby/warbler guzzle/guzzle3 brianmario/yajl-ruby bootstraponline/gollum-lib adhearsion/adhearsion /mruby github/markup nareshv/hhvm UnionOfRAD/framework propelorm/PropelBundle staabm/Propel2 bundler/bundler-site jonleighton/poltergeist zendframework/Component_ZendMail flori/json zendframework/Component_ZendView michaelficarra/esfuzz gma/nesta bundler/bundler-features ruby-amqp/rubybunny.info sikachu/rails macgitver/libHeaven owncloud/3rdparty craftsmen/dad zendframework/zf1 celluloid/reel jruby/jruby-ossl /gitmono/mono mhitza/Propel2 adhearsion/adhearsion-i18n naderman/composer adhearsion/punchblock pry/pry zendframework/Component_ZendServiceManagerzendframework/ZF2Package /migrations rayo/xmpp ffi/ffi jbarnette/isolate gollum/gollum zendframework/Component_ZendDebug digitalkaoz/composer phpspec/phpspec2-sitephpspec/prophecy Shopify/active_utils UnionOfRAD/manual macgitver/DiffViewer oneclick/rubyinstaller borland/ironlanguages-main zendframework/Component_ZendEscaper intridea/multi_jsonmeskyanichi/hirefire-resource thorin/redmine_ldap_syncShopify/active_fulfillment macgitver/MacGitverModules zendframework/ZendOAuth sebastianbergmann/-selenium h5bp/server-configs-gae jnicklas/capybaralsegal/rubydoc.info zendframework/Component_ZendModuleManager webbj74/- cboden/Ratchet ruby-amqp/bunny gollum/gollum-lib Ocramius/OcraDiCompiler Sylius/SyliusResourceBundle spree/spree-product-assembly capnregex/spree_auth_devise basho/webmachine zendframework/Component_ZendConfig nesquena/rabl celluloid/celluloid kachick/ sebastianbergmann/dbunitUnionOfRAD/lithium Sylius/Sylius-Docsphpspec/phpspec zendframework/Component_ZendValidatorguzzle/guzzle Ocramius/DoctrineModule Respect/Loader h5bp/server-configs- jnicklas/celluloid-zmq gds-operations/puppet-elasticsearch rubyspec/rubyspec bickerstoff/zf2-documentation lautis/uglifier spastorino/rails-api dahlbyk/libgit2sharp macgitver/libGitWrap sensiolabs/security-advisories rails-api/active_model_serializers macgitver/macgitver zendframework/zf2-documentation /bolt-docs 200Creative/spree_bootstrap_frontend jruby/jruby-launcher rubysl/rubysl-socket freerunningtechnologies/spree_reviews rubinius/rubinius-ast libgit2/pygit2 zendframework/Component_ZendText propelorm/Propel Sylius/Sylius-Standard galymzhan/composer bundler/bundlernobu/mruby lsegal/ zendframework/Component_ZendPermissionsAcl zendframework/Component_ZendDom zendframework/Component_ZendTag cristianosistemas/phpunit-documentation Shopify/active_merchant Ocramius/hiphop-php vakata/jstree Modernizr/-modernizr drublic/h5bp-stylus spree/spree_active_shipping spree/spree-guides enricosada/IronLanguages spree/spree_wishlist ruby/rubyjruby/jrubyjnr/jnr-posix dahlbyk/posh-git zendframework/Component_ZendEventManager zf-fr/zfr-oauth2-server-modulesebastianbergmann/php-code-coveragecomposer/satis padraic/mockery richardhinkamp/bolt-docs carlhuda/bundler thekid/behave Sylius/Sylius libgit2/rugged nulltoken/libgit2sharp zendframework/Component_ZendProgressBar

radar/spree zendframework/Component_ZendMath spree/spree_i18n ms-ati/docile rtomayko/posix-spawn zendframework/Component_ZendCache rubygems/guides zendframework/Component_ZendCrypt Netpositive/ndeploy h5bp/node-build-script libgit2/libgit2 Majkl578/nette iloveitaly/spree_volume_pricing mperham/sidekiq zendframework/Component_ZendMvc symfony/DoctrineBridge sensiolabs/-Connect ghedo/p5-Git-Raw doctrine/DoctrineORMModule sonata-project/SonataDoctrineORMAdminBundle AgilTec/spree_fancy resolve/refinerycms-blogtechnicalpickles/-spies sebastianbergmann/phpunit-documentation aFarkas/html5shiv parndt/seo_meta xaviershay/rspec-fire zendframework/Component_ZendDb doctrine/dbal hacken-in/puppet-hackenin libgit2/libgit2.github.com snarfed/oauth-dropins zendframework/ZendSkeletonApplication h5bp/server-configs-apacheh5bp/server-configs zendframework/Component_ZendFile superdweebie/-odm ntomka/bolt spree/spree_gatewayRubyMoney/money rubygems/rubygems apmasell/vapis zendframework/Component_ZendLoader openid/ruby-openid rubinius/rubinius-melbourne zendframework/Component_ZendServer jdorn/sql-formatter silexphp/Silex bolt/bolt git-tfs/git-tfs tzinfo/tzinfo-data brainspec/enumerize zendframework/ZendDeveloperTools thedarkone/rails-dev-boostspree/spree zendframework/Component_ZendInputFilter polyfractal/athletic rubinius/rubinius doctrine/DoctrineModule /hiphop-php refinery/refinerycms-blogmarkevans/dragonflymathie/broken_cucumber_demo yorah/libgit2 snarfed/webutil zendframework/Component_ZendDi sebastianbergmann/phpunit-mock-objectscomposer/packagist Modernizr/Modernizr GeekOnCoffee/spree_product_sort vmg/clar piuccio/ariatemplates hacken-in/website Ocramius/OcraServiceManager jmikola/mongo-php-driver sonata-project/SonataMediaBundle spree/spree_auth_devise rspec/rspec-mocks macournoyer/thin zendframework/Component_ZendPaginatorzendframework/Component_ZendI18n rixbeck/bolt libgit2/objective-git swiftmailer/swiftmailer h5bp/ant-build-script mperham/dalli agrobbin/uclass sonata-project/SonataUserBundle radar/spree_auth_devise rails/strong_parameters Ocramius/LazyMap adam-gegotek/symfony drapergem/draper weierophinney/ZendSkeletonApplication guard/guard-rspec sebastianbergmann/phpunit necolas/normalize. gitextensions/gitextensions zendframework/Component_ZendLog spree/spree_reviews refinery/refinerycms zendframework/zf2zendframework/Component_ZendFilter snarfed/bridgy zendframework/Component_ZendPermissionsRbac yujinakayama/transpec snarfed/activitystreams-unofficial Exercise/FOQElasticaBundle svenfuchs/globalize3 hhvm/packaging composer/installers spree/spree_fancy airblade/paper_trail thoughtbot/suspenders zendframework/Component_ZendTest ariatemplates/ariatemplates Modernizr/modernizr.com zendframework/Component_ZendFeed sonata-project/SonataAdminBundle ernie/squeel zendframework/Component_ZendSerializer composer/composer rspec/rspec-railsgithub/github-services libgit2/libgit2sharp voloko/sdoc KnpLabs/KnpMenuBundle oxpeck/spree robin850/coffee-rails nukomeet/coworfing rails/protected_attributes silexphp/Silex-WebProfiler nulltoken/libgit2 fabpot/Silex spree/deface artsy/garner kartikprabhu/activitystreams-unofficial zendframework/Component_ZendUridoctrine/DoctrineMongoODMModule zendframework/Component_ZendHttp sonata-project/SonataDoctrinePhpcrAdminBundle ariatemplates/usermanual rails/journey rspec/rspec-support fabpot/Pimple sstephenson/ruby-build zendframework/Component_ZendForm doctrine/doctrine2 h5bp/-boilerplate parndt/decorators doctrine/DoctrineBundle rspec/rspec-expectations Uncommon/Xit t-8ch/urllib3 zendframework/Component_ZendNavigation nishigori/nyancat-phpunit-resultprinterdoctrine/mongodb h5bp/mobile-boilerplate jonatack/polyamorous ayosec/adminful zendframework/Component_ZendStdlib schmittjoh/JMSSerializerBundle substack/browser-pack thoughtbot/shoulda sensio/SensioFrameworkExtraBundle facebook/hhvmzendframework/Component_ZendMemory rails/arel rails/coffee-rails rspec/rspec-activemodel-mocks arthurschreiber/rugged zendframework/Component_ZendCaptcha rowanj/gitx h5bp/html5boilerplate.comKatello/hammer-cli-katello brianmario/mysql2 seancribbs/webmachine-ruby zendframework/Component_ZendLdap fabpot/Twig discourse/discourse rspec/rspec-its composer/getcomposer.org jkbr/httpie kennethreitz/httpbin zendframework/Component_ZendJson KnpLabs/KnpMenu thoughtbot/shoulda-matchers requests/requests-oauthlib Ocramius/ProxyManager sensio/SensioGeneratorBundle FriendsOfSymfony/FOSRestBundle spraints/git-tfs zendframework/Component_ZendSession sensio/SensioDistributionBundle versgui/Form substack/node-detective drublic/mobile-boilerplate pwnall/rails5738 zendframework/Component_ZendSoap akeneo/pim-community-standard visionmedia/jade yellow5/foreigner-matcher rspec/rspec-corehalostatue/diff-lcs rails/activeresource norman/friendly_id zendframework/Component_ZendAuthentication symfony-cmf/MenuBundle mongoid/moped zendframework/Component_ZendMime doctrine/mongodb-odm indirect/-rails headius/thread_safe yola/demands symfony/symfony-standard Alamoz/docrails astropy/astropy-api Ocramius/common xdissent/karma-browserify /rdocrails/rails mongoid/mongoid-site globalize/globalize sensiolabs/SensioDistributionBundle aeolus-incubator/bundler_ext zendframework/Component_ZendXmlRpc doctrine/DoctrineMongoDBBundle symfony/Icu gammapy/tevpy zendframework/Component_ZendBarcode alrra/server-configs daviddavis/katello-cli 1up-lab/FOSMessageBundle taldcroft/asciitable zendframework/Component_ZendVersion sferik/rails_admin dabeaz/ply kennethreitz/requests mongoid/origin symfony/Console /enhanced-resolve use-init/init lifo/docrails jnicklas/turnip schmittjoh/serializer rsim/oracle-enhanced merk/Citadel Katello/katello rack/rack skaes/rvm-patchsets zendframework/Component_ZendCodezendframework/Component_ZendConsole mongoid/mongoid schmittjoh/JMSI18nRoutingBundle symfony-cmf/MediaBundle amatsuda/kaminari gagern/urllib3 symfony/HttpFoundation radar/spree_gateway kennethreitz/grequests doctrine/commonOcramius/doctrine2 symfony/SwiftmailerBundle symfony/WebProfilerBundle rails/docrails sstephenson/rbenv yahonda/rails-dev-box-runs-oracle spacetelescope/stsynphot yiisoft/ substack/node-browserify globalize/globalize-versioning astropy/astropy-website liberfa/erfa yiisoft/yii2-framework kizu/bemto Katello/katello-installer mikel/mail symfony/MonologBundle smockle/smockle rails/cache_digests fnichol/-rvm mongoid/mongoid.github.com astropy/astropy-APEs shtylman/node-browser-resolve tzinfo/tzinfo ryanb/cancan rvm/gem-wrappers yiisoft/yii2 symfony/DomCrawler webpack/core stof/DoctrineMongoDBBundle fabpot/sphinx-php yii2-chinesization/yii2-zh-cn FriendsOfSymfony/FOSFacebookBundle tenderlove/racc wayneeseguin/rvm-test doctrine/mongodb-odm-documentation symfony-cmf/CreateBundle tPl0ch/symfony-docs PythonCharmers/python-future danez/symfony-docs pllim/pysynphot ryanmcgrath/twython Katello/runcible astropy/coordinates-benchmark shazow/urllib3 geophysics/MoPaD bcardarella/client_side_validationshaml/haml rails/sprockets-rails CanCanCommunity/cancancan astropy/photutils yiiext/trash-bin-behavior symfony-cmf/Routing jeremy/mail statbit/composite_primary_keys Pybonacci/poliastro rvm/rvm-binary gammapy/gammapy mpapis/rubygems-bundler doctrine/DoctrinePHPCRBundle symfony/EventDispatcher webpack/jade-loader rspec/rspec-dev symfony/symfony Katello/katello-cli substack/module-deps peerigon/alamid roboguice/roboguice phpDocumentor/Reflection kevarch/symfony-docs symfony/symfony-docs MacRuby/MacRuby yahonda/oracle-enhanced Ocramius/mongodb-odm symfony-cmf/symfony-cmf travis-ci/travis-rubies orgsync/active_interaction obspy/obspy doctrine/annotations FriendsOfSymfony/FOSUserBundle webpack/worker-loader le-phare/BazingaJsTranslationBundle daviddavis/katello spacetelescope/pysynphot doctrine/phpcr-odm plataformatec/simple_formsstephenson/sprockets astropy/ccdproc cython/cython jvperrin/date_validator Seldaek/monolog scambra/devise_invitable diaspora/diaspora lyrixx/symfony megies/obspy Orange-OpenSource/YACassandraPDO kbond/symfony-standard symfony/Filesystem diaspora/diaspora-project-site alphagov/govuk_content_models slang800/jade-book astropy/astropy schmittjoh/JMSDiExtraBundle astropy/astroquery scipy/scipy obspy/sandbox craue/CraueFormFlowBundle jmreidy/grunt-browserify assaf/vanity gildegoma/travis-build symfony-cmf/SearchBundle eregon/racc meskyanichi/backup gregbell/active_admin astropy/package-template /sinatra wayneeseguin/rvm claes08/symfony-standard dcestari/TextSecure-iOSpuppetlabs/puppetlabs-mongodb marsuboss/yii2 rails/sass-rails jruby/activerecord-jdbc-adapter rvm/rvm-site StemerdinkIT/SensioFrameworkExtraBundle webpack/webpack sinatra/sinatra-contrib mpapis/-hooks Ocramius/phpcr-odm symfony/AsseticBundle symfony/Serializer cup-of-giraf/symfony dpb587/symfony-docs yyuu/homebrew spacetelescope/PyFITS scikit-learn/scikit-learnandrenarchy/krypy nipy/nitime michaelficarra/-everywhere alexmmm/json-schema PyTables/PyTables ryanb/nested_formhaml/html2haml bobthecow/psysh symfony/Validator ivanov/matplotlib numpy/numpy symfony-cmf/RoutingAutoBundle symfony-cmf/RoutingBundle sinatra/sinatra.github.com mpapis/bundler-unload pigoz/mpv plataformatec/devise fredrik-johansson/mpmath RubenVerborgh/N3.js ennova/postmarkdown SciTools/iris-code-generators dmascia/RemixChart webpack/less-loader twitter/bootstrap achempion/simple_form gildegoma/travis-cookbooks rkh/dpl facebook/ mne-tools/mne-python Ocramius/annotations sm/sm-libraries FriendsOfSymfony/FOSCommentBundlekriswallsmith/assetic karmi/tire MagLev/ henrikhodne/travis-assets symfony-cmf/SimpleCmsBundle EppO/rolify schmittjoh/JMSSecurityExtraBundleRapotOR/ConsoleBundle sympy/sympy-bot susestudio/studio-helpstatsmodels/statsmodels webpack/grunt-webpack Joshua-Anderson/dpl SciTools/cartopy joblib/joblib symfony-cmf/symfony-cmf-docs webpack/webpack.github.com wvengen/foodsoft yyuu/pyenv-virtualenv cloudhead/less.js karmi/tire-contrib henrikhodne-test/travis-test danielholmes/symfony-docs symfony/TwigBundle copiousfreetime/hitimes Joshua-Anderson/travis-core nipy/PySurfer symfony/FrameworkBundle symfony-cmf/CoreBundle gibiansky/IHaskell SciTools/biggus fussl/passme thetallgrassnet/thetallgrass.net eurodev/symfony mattwildig/sinatra.github.com tiennou/nested_form blakewatters/TransitionKit netdna/bootstrap-cdn matplotlib/matplotlibpydata/pandas SciTools/iris php/php-src spree/spree_social yabawock/bootstrap-sass-rails ernie/ransack alexaitken/guard-konacha lastguest/Twig-extensions gregkare/jekyll rtfd/readthedocs.org rafaelfranca/simple_form-bootstrap sympy/sympy magiclabs/alchemy_cms elia/activeadmin-mongoid travis-ci/travis-assets sympy/sympy-live JuliaStats/Distributions.jl flyboarder/AirOS sensiolabs/SensioFrameworkExtraBundle ianwhite/orm_adapter justinfrench/formtastic schmittjoh/JMSDebuggingBundle webpack/enhanced-require minrk/ipython_extensions JuliaLang/libuv SciTools/iris-sample-dataalphagov/panopticon cloudhead/lesscss.org symfony-cmf/ContentBundle symfony/Form symfony-cmf/Testing dmathieu/travis-web henrikhodne/travis-core cordoval/symfony-standard dart-lang/dartlang.org eugeneo/brackets JuliaLang/julialang.github.com jimhester/knitrBootstrap gordonslondon/FOSUserBundle travis-ci/travis-web alphagov/travel-advice-publisher MaxCDN/bootstrap-cdn codahale/bcrypt-ruby gregbell/arbre projecthydra/sufia autozimu/julia_zh_cn genemu/GenemuFormBundle ranmocy/guard-rails starsquare/Buzz bsmr-ruby/travis-boxes JuliaLang/ZMQ.jl tkf/--notebook WouterJ/symfony nex3/sass jm81/dm-devise travis-ci/travis-ci.github.com jlong/sass-twitter-bootstrap JuliaStats/DataArrays.jl mongodb/mongo-php-driver travis-ci/travis-cirossant/ipycache gotcha/ipdb yyuu/pyenv JuliaStats/GLM.jl uq-eresearch/aorra twitter/recessrkh/rack-protection chriseppstein/compass Kodowa/Light-Table-Playground alphagov/publisher loopj/-tokeninput travis-ci/docs-travis-ci-com SciTools/iris-test-data troopjs/troopjs-contrib-browser JuliaOpt/JuMP.jl leafo/scssphp henrikhodne/travis-cookbooks ipython/nbconvert troopjs/troopjs-net karmi/retire agrobbin/active_admin krlmlr/r-travis stevengj/PyCall.jl njx/brackets-bower twbs/bootstrap projectblacklight/blacklight alphagov/govuk_content_api swcarpentry/website travis-ci/travis-api travis-ci/-travis-ci-com JuliaLang/julia-ipython /MinkBrowserKitDriver ericam/susy travis-ci/travis-images xp-framework/rest alphagov/gds-api-adapters travis-ci/travis-build HarlanH/DataFrames.jl thomas-mcdonald/bootstrap-sasscablegram/guard-rails doctorjnupe/cookbook-elasticsearch JuliaStats/DataFrames.jl cfjedimaster/brackets-jshint xp-framework/xp-language todc/todc-bootstrap travis-ci/travis JuliaLang/Cairo.jl ipython/ipython-components alphagov/maslow rouge8/Font-Awesome FortAwesome/Font-Awesome alphagov/govuk_need_api Asquera/elasticsearch-rake-taskselasticsearch/elasticsearch adobe-research/theseus ipython-contrib/IPython-notebook-extensions sul-dlss/spotlight besanek/PresenterTester JuliaLang/IJulia.jl caarlos0/bootstrap-sass travis-ci/travis-worker ipython/ipython JuliaDSP/DSP.jl alphagov/rummager garethr/vagrantboxes-heroku JuliaLang/openlibm troopjs/troopjs-data ruflin/Elastica minrk/ipython adobe/brackets-updates mjgallag/-bootstrap-3 twalpole/sass madebymany/sir-trevor-js travis-ci/travis-coretravis-ci/travis-cookbooks alphagov/frontend inkling/Subliminal ivanov/ipython troopjs/troopjs-utils lusis/chef-kibana adobe/brackets-shell xp-framework/xp-framework guard/listen zeromq/zeromq4-x JuliaLang/METADATA.jl marijnh/CodeMirror alphagov/whitehall ivanov/-ipython thekid/xp-experiments alphagov/signonotron2 sparklemotion/ swcarpentry/site xp-framework/xp-runners middleman/middleman-guides alphagov/design-principles porada/middleman-autoprefixer elasticsearch/kibana yakaz/elasticsearch-action-updatebyquery /padrino-framework swcarpentry/boot-camps IcecaveStudios/archer JuliaLang/juliadcjones/Gadfly.jl guard/guard travis-ci/travis-boxes adobe/brackets.io ipython/nbviewer s-mage/rush stevengj/PyPlot.jl adobe/brackets-registry xp-lang/ troopjs/troopjs-composer NUBIC/ncs_mdes zeromq/pyzmq craigcitro/r-travis thekid/stomp vtjnash/ODE.jl karbarcca/Datetime.jl troopjs/troopjs middleman/middleman jlong/sass-bootstrap jgm/pandoc-templates numpy/numpydoc xianyi/OpenBLAS troopjs/troopjs-requirejs YorickPeterse/oga swcarpentry/bc phpBB-Blog/phpBB-Blog-for-3.1 toivoh/Debug.jl adobe/brackets-app alphagov/feedback elasticsearch/elasticsearch-ruby msysgit/Git-Cheetah mikey179/xp-framework steveluscher/sass-brunch FabienPennequin/scalastic openlayers/openlayers.github.io lindahua/NumericExtensions.jl alphagov/govuk_frontend_toolkit thekid/xp-runners ivanov/IHaskell laktek/jQuery-Smart-Auto-Complete middleman/middleman-blog padrino/padrino-recipes jgm/pandoc alphagov/government-service-design-manual adobe/brackets-phonegap yakaz/elasticsearch-query-indices2416 travis-ci/dpl railsinstaller/railsinstaller-nix andrew/node-sass marcodaniel/mdframed jsdoc3/jsdoc3.github.com minrk/zguide andrioni/MPFI.jl JuliaLang/IterativeSolvers.jl xp-framework/rfc PaulKinlan/yeoman.io bryanwb/chef-ark JuliaLang/ODE.jl xp-framework/core openlayers/ol3 JuliaStats/StatsBase.jl adobe/brackets zjhiphop/troopjs-core padrino/padrino-docs troopjs/troopjs-browser middleman/middleman-sprockets Mange/roadie elasticsearch/cookbook-elasticsearch loladiro/REPL.jl xp-framework/remote BanzaiMan/travis-api zeromq/libzmq alphagov/business-support-finder msysgit/msysgit tanmaykm/DataFrames.jl alphagov/static alphagov/smart-answers gettalong/kramdown msysgit/git adobe/brackets-edge-web-fonts peterflynn/svg-preview embarkmobile/android-maven-example nose-devs/nose thehogfather/brackets-code-folding bhollis/middleman-sprockets nanoc/nanoc aaronbushnell/generator-tmproject travis-ci/travis-tasks lukesarnacki/travis-web gildegoma/travis-images roryk/ipython-cluster-helper pao/Monads.jl alphagov/slimmer troopjs/troopjs-core mojombo/jekyll tomaz/appledoc chapmanb/homebrew-cbl timholy/HDF5.jl Behat/Mink yeoman/yeoman-generator-list vangdfang/git marijnh/tern_for_vim troopjs/troopjs-bundle ilpaijin/generator-chromeapp distler/syntax arq5x/gemini le717/brackets-html-skeleton phlipper/chef-monit chapmanb/bcbio-nextgen IainNZ/MathProg.jl thekid/xp-contrib jekyll/help davidavdav/NamedArray thekid/xp-language alphagov/transformation-dashboard sleeper/generator-backbone hadley/devtools alphagov/ci-puppet troopjs/troopjs-jquery brainstorm/ipython-cluster-helper JuliaLang/DataStructures.jl hcatlin/sass-spec simonster/MAT.jl alphagov/prototyping jekyll/jekyll-import drublic/css-modal IcecaveStudios/woodhouse chapmanb/gemini marijnh/tern ngbp/ng-boilerplate lkcampbell/brackets-ruler geoadmin/mf-chsdi3 robotology/gazebo_yarp_plugins hcatlin/libsass porterjamesj/ipython camptocamp/c2cgeoportal simonster/DataFrames.jl adobe/CodeMirror2 frozenice-/yeoman-generator-list fgrehm/-lxc romanbsd/fast-stemmer Shopify/liquid jsdoc3/jsdoc chapmanb/cloudbiolinux camptocamp/cgxp robotology/yarp thekid/xp-framework imathis/octopress eztierney/tern xp-framework/xp-contrib alphagov/licence-finder openlayers/openlayers romanzenka/cloudbiolinux heuermh/cloudbiolinux peterflynn/brackets-commands-guide jekyll/jekyll Behat/MinkSelenium2Driver rosa-abf/vagrantboxes-heroku yeoman/yeoman.ionicksp/generator-bbb rstudio/shiny jts/sga gds-operations/puppet-graphite troopjs/troopjs-todos joshdmiller/ng-boilerplate marijnh/acorn hcatlin/sassc TwP/directory_watcher sleuthkit/sleuthkit libLAS/libLAS simonster/HDF5.jl github/pages-gem rstudio/ggvis geoadmin/mf-geoadmin3 ruby-/ruby-llvm sjackman/homebrew chapmanb/bcbio-nextgen-vm benlemasurier/stormfs fgrehm/bindler ivantsepp/jekyll dtao/safe_yaml SLaks/SLaks.Blog mcuadros/homebrew-hhvm intimidate/generator-webapp SLaks/WebEssentials2013 wking/email-issue-reply-testing oclint/oclint phusion/baseimage-docker mozilla/rhino brandon-fryslie/ember-rest.coffee tombh/deis-cookbook Behat/MinkSeleniumDriver Behat/MinkSahiDriver yeoman/yo openlayers/cla alphagov/planneralphagov/puppet-jenkins Homebrew/linuxbrew dotcloud/gordon tianon/dockerfilesmarijnh/tern_for_sublime net-ssh/net-ssh madskristensen/vswebessentials.com /angular.js defunkt/hub sjackman/abyss Behat/SahiClient yeoman/yeoman Homebrew/homebrew-boneyard Valloric/YouCompleteMe iml/homebrew-science WinRb/vagrant-windows nicksp/generator-angular zedshaw/mongrel2 ultravideo/kvazaar am11/WebEssentials2013 am11/CssSorter s-u/Cairo /npmjs.org adamv/homebrew-alt fgrehm/vagrant-cachier yeoman/generator-angular am11/zencoding coreos/coreos-vagrant saltstack/salty-vagrant madskristensen/CssSorter bhollis/maruku njh/redstore marijnh/CodeMirror2 Behat/MinkExtension SirVer/ultisnips hegemonic/catharsis swig/swig opdemand/deis anba/rhino cebe/markdown rabbit-shocker/rabbiter tianon/brew Supacoco/generators madskristensen/zencoding mojombo/github-flavored-markdown aik099/qa-tools mdevils/node-jscs vmg/redcarpet josegonzalez/homebrew-php angular-ui/ui-utils phoenixsong6/homebrew-php dotcloud/docker-registry kykyev/almond schisamo/vagrant-omnibus yeoman/grunt-usemin Homebrew/homebrew-scienceHomebrew/homebrew carsomyr/rbenv-bundler lovanwubing/r.js cambridge-healthcare/dockerfiles jlertle/generator-ember skivvies/angular.js alessandro277/homebrew-php RiotGames/buff-config kevin-smets/angular-bleed Behat/MinkZombieDriver stof/MinkBrowserKitDriver berkshelf/solve teropa/build-your-own- chevex/homebrew yeoman/generator-karma dotcloud/docker-py rolandwalker/homebrew-cask jawshooah/homebrew lra/mackup opdemand/deis-cookbook yeoman/generators palantir/tslint /camlp4 less/less.js chrmoritz/homebrew-binary npm/npm-registry-mock Parallels/vagrant-parallels madskristensen/WebEssentials2013 koraktor/steam-condenser-phpcmus/cmus josh/brew-pip Homebrew/homebrew-binaryzimbatm/homebrew-versions npm/read-package-json yeoman/generator lyridious/homebrew Homebrew/homebrew-dupes dotcloud/docker jrburke/require-cs berkshelf/vagrant-berkshelf schweikert/fping kr/pty kasperisager/vanilla-bootstrap angular/angular.dart jrburke/r.js angular-ui/bootstrap karma-runner/grunt-karma mroth/lolcommits Homebrew/homebrew-versions steeve/boot2docker mxcl/homebrew yanniks/linuxbrew RiotGames/ridley Sparks-Creative-Limited/angular.js npm/npm-www realworldocaml/examples mistydemeo/tigerbrew keithw/mosh jpetazzo/dind progrium/dokku mitchellh/vagrant angular-ui/angular-ui-docs angular-ui/ui-router heroku/heroku-buildpack-nodejs petermichaux/maria yeoman/generator-webapp ocamllabs/ocaml-ctypes scraperwiki/tang rodyhaddad/angular.js koraktor/steam-condenser-ruby yeoman/generator-backbone PromyLOPh/pianobar berkshelf/berkshelf /knockout avsm/mirage-tcpip jrburke/requirejs passy/generator-canjs ichuan/bower-angular-latest koraktor/steam-condenserBrewTestBot/homebrewprotomouse/homebrew-versions npm/read-installed Homebrew/homebrew-headonly jrburke/almond netj/homebrew-boneyard snkinard/steam-condenser- requirejs/xrayquire RiotGames/berkshelf npm/npm drewwells/lolsrv boot2docker/boot2docker Homebrew/homebrew-games phinze/homebrew-cask stucki/docker-cyanogenmod progrium/buildstep getlantern/statshub getlantern/lantern-uihall5714/angular-ui-bootstrap nomiddlename/log4js-node ocaml/opam-repository dsheets/ocaml-sodium yeoman/generator-mocha getlantern/www.getlantern.org caskroom/homebrew-versions Incubaid/baardskeerder mitchellh/vagrant-rackspace ocaml/opam dotcloud/stackbrew progrium/pluginhook fengmk2/node-gyp noflo/noflo.github.io getlantern/laeproxy mletterle/rust-http mirage/mirage-www ocamllabs/rwo-comments RiotGames/berkshelf-api mitchellh/vagrant-aws Kroisse/rust-mustache sdegutis/zephyros avsm/ocaml-cohttp RiotGames/vagrant-berkshelf vojtajina/testacular karma-runner/karma JeremyLetang/rust-sfml elixir-lang/elixir-lang.github.com gkz/prelude-ls ocamllabs/opamfu SlexAxton/require-handlebars-plugin gruntjs/grunt-contrib-requirejs ForbesLindesay/component-website forresto/dataflow-noflo rlidwka/yapm koraktor/steam-condenser-java realworldocaml/scripts kevinwallace/qemu-dockerboot2docker/boot2docker-cli angular-ui/angular-ui.github.com dennisreimann/ioctocat pivotal/pivotal_workstation janestreet/bin_prot getlantern/lantern caskroom/homebrew-fonts dbashford/mimosa-server ivaynberg/select2 getlantern/lantern_aws rlane/glfw-rs tknerr/vagrant-plugin-bundler paulmillr/chokidar evanlucas/npm-registry-mock g2p/blocks jonnor/microflo dbashford/mimosa-copy AngryLawyer/rust-sdl2 samoht/opam-repository tmatilai/vagrant-proxyconf Nami-Doc/coco bflad/chef-docker adamfisk/LittleProxy kbhomes/google-music-mac mirage/mirage assaf/zombie pivotal-sprout/sprout dsheets/opam-repository kmcallister/servolosttime/steam-condenser-php samoht/htcaml dbashford/mimosa-combine michaelficarra/cscodegen satyr/coco ocaml/opam2web component/component dbashford/mimosa- xforty/vagrant-drupaldotless-de/vagrant-vbguest noflo/fbp getlantern/lantern-common mzabaluev/grust poise/python angular-ui/ui-map paul90/Smallest-Federated-Wiki TooTallNate/node snrs/sonorous avsm/mirage-www dbashford/mimosajs.com mbrubeck/servo adridu59/rust-tuts pypa/pip pypa/virtualenv nicoulaj/vagrant-maven-plugin brunch/uglify-js-brunch OCamlPro/opam paylogic/pip-accel qqueue/html5chan mirage/opam-repository dbashford/logmimosa noflo/noflo-runtime-base getlantern/lantern-controller fredrikbonander/karma protobox/protobox angular-ui/angular-ui OCamlPro/opam2web vincent-hugot/iTeML mirage/mirage-tcpip dbashford/mimosa-lint gkz/LiveScript kmcallister/html5 /ansible clutchski/coffeelint crabtw/rust-bindgen component/builder2.js jroweboy/rust-mustache dbashford/mimosa-sass avsm/homebrew Constellation/escodegen Kroisse/rust-http avsm/mirage MatthewMueller/cheerio noflo/noflo iangreenleaf/brunch-with-chaplin graydon/rust-www avsm/melange dbashford/mimosa-require mozilla/rust genesis/ fb55/CSSselect BlueSpire/Durandal trustmaster/goflow brunch/brunch LearnBoost/socket.ioTooTallNate/node-gyp avsm/mirage-platform jck/uhdl fvdm/nodejs-youtube chris-morgan/rust-http dbashford/skelmimosa protobox/protobox-web kevva/image-min mirage/opam-repo-dev dbashford/mimosa-web-package component/builder.js paulmillr/brunch-with-chaplin michaelficarra/CoffeeScriptRedux dsc/coco jashkenas/coffee-script bjz/glfw-rs rust-lang/rfcs CocoaPods/Xcodeproj dbashford/mimosa-bower chris-morgan/ncurses-rs mreid-moz/s3funnel jfirebaugh/openstreetmap-website chaplinjs/chaplin Constellation/esmangle capdevc/flycheck OCamlPro/opam-repository aredridel/html5 dbashford/mimosa-less noflo/noflo-ui alexcrichton/rust sebcrozet/kiss3d avsm/ocaml-github osmlab/openstreetmap-website dbashford/mimosa Polymer/more-elements xforty/chef- fb55/htmlparser2 mapnik/mapnik-packaging ionrock/cachecontrol dbashford/mimosa-minify meemoo/dataflow gruntjs/grunt-contrib-imagemin tenerd/CoffeeScriptRedux isaacs/cluster-master wanderview/node-tap hhatto/autopep8 jtriley/scp.py MayhemYDG/4chan-x dmajda/pegjs zargony/rust-fuse dbashford/mimosa-client-jade-static boto/boto Polymer/HTMLImports bnoordhuis/node-buffertools CocoaPods/guides..org osmlab/editor-imagery-index MicahChalmer/rust-fuse CocoaPods/CocoaPods greasemonkey/greasemonkey SimonSapin/servo mozilla/servo CocoaPods/cocoapods-integration-specs dbashford/mimosa-live-reload janestreet/core bnoordhuis/node CocoaPods/cocoapods-downloader the-grid/the-graph OpenStreetMap/iD Polymer/docs gravitystorm/openstreetmap-carto dbashford/mimosa-server-reload rvagg/nan alexcrichton/libuv dbashford/mimosa-minify-css kchmck/vim-coffee-script humdedum/homebrew ContinuumIO/anaconda-ec2 noflo/dataflow-noflo documentcloud/backbone discoproject/odisco jtriley/StarCluster Polymer/projects rstacruz/js2coffee brson/rust-sdl EricDunsworth/theme-gcwu-fegc tmpvar/jsdomdbashford/mimosa-testem-require bestiejs/lodash Nami-Doc/LiveScript tUrG0n/nconf sfackler/rust-postgrescadencemarseille/rust-pcre tomhughes/openstreetmap-website mapbox/carto 4chan/4chan-JS mapnik/mapnik pnorman/openstreetmap-carto mapbox/tilemill jcrocholl/pep8 OpenUserJs/OpenUserJS.org indutny/libuv joyent/libuv AFNetworking/AFNetworking mapbox/millstone Polymer/PointerEventsPolymer/PointerGestures NV/CSSOM dbashford/mimosa-import-source gruntjs/grunt-contrib-coffee willthames/ansible /haibu-carapace pjackson28/theme-base noflo/noflo-runtime dbashford/mimosa-iced-coffeescript felixge/node-formidable mozilla-servo/rust-httpmozilla-servo/rust-geom CocoaPods/Core EricDunsworth/GCWeb Polymer/platform documentcloud/underscore arashpayan/appirater kanso/couchtypes LightTable/LightTable cjdelisle/cjdns marionettejs/backbone.marionette gruntjs/grunt-contrib-internal saghul/pyuv bnoordhuis/node-iconv zerebubuth/openstreetmap-cgimap developmentseed/bones systemed/iD mapbox/tilemill-win-launcher gruntjs/grunt-contrib-qunit mapnik/carto-parser mapbox/tilelive-mapnik GoogleCloudPlatform/gsutil bnoordhuis/libuv featurist/spawn-cmd joyent/node-website HipByte/motion-cocoapods hotosm/HDM-CartoCSS Polymer/ShadowDOM RestKit/RestKit EricDunsworth/theme-gc-intranet CocoaPods/Specs wet-boew/theme-base Polymer/todomvc gruntjs/grunt-contrib-handlebars mozilla-servo/rust-mozjs joyent/nodenode-inspector/node-inspectorlaverdet/node-fibers shama/grunt mapbox/tilelive.js Polymer/polymer isaacs/node-graceful-fs pjackson28/theme-ogpl gruntjs/grunt-contrib-uglify glaszig/SZTextView wyuenho/backgrid-filter gravitystorm/mapnik-reference gruntjs/grunt-contrib-copy georgethomas/node-restify shirayuki/openstreetmap-websiteopenstreetmap/openstreetmap-website JustinTulloss/zeromq.node mapnik/mapnik-reference wet-boew/ pjackson28/GCWeb gruntjs/grunt-contrib-jst joyent/http-parser isaacs/libuv edgecase/ECSlidingViewController Polymer/CustomElements kanso/kanso mcavage/node-fast mapnik/node-mapnik gruntjs/grunt-contrib-jade Uncodin/bypass isaacs/read-package-json wet-boew/wet-boew-xsl jlaws/JLAddressBook davidbkemp/node-gyp plepe/pgmapcss malfaux/http-parser barmstro/web-animations-tools developmentseed/node-get jashkenas/backbone bnoguchi/hooks-js bajtos/libuv cowboy/grunt jwarkentin/node-monkey wet-boew/wet-boew noflo/noflo-gestures vtsvang/grunt-contrib-nodeunit mapnik/mapnik-support DieBuche/openstreetmap-website agnat/node_mdns andreacremaschi/SpatialDBKit jzaefferer/jquery-validation creationix/nvm isaacs/npm gruntjs/grunt-contrib pjackson28/theme-gc-intranet developmentseed/node-sqlite3 mapbox/wax wet-boew/theme-gc-intranet cowboy/node-exit developmentseed/node-blend gruntjs/gruntjs.com rogerwang/blink osmlab/openstreetmap-upcoming-features wet-boew/theme-ogpl Polymer/polymer-ui-elements substack/node-mkdirp trondn/libuv robertkowalski/osenv openstreetmap/mod_tile gruntjs/grunt-contrib-watchmongodb/node-mongodb-native d3/d3-geo-projection Polymer/labs wyuenho/backgrid jbcrail/Haywire meryn/normalize-package-data gruntjs/grunt mapbox/tm2 gruntjs/grunt-contrib-sass gruntjs/grunt-contrib-compass mbostock/d3 mbostock/smash mapbox/carmen wet-boew/GCWeb Polymer/toolkit-ui nodejitsu/node-http-proxy isaacs/npmconf benmills/robotskirt robertkowalski/normalize-package-data wet-boew/theme-gcwu-fegc gruntjs/grunt-contrib-clean mapbox/tilelive-vector vtsvang/grunt-contrib-uglify mikeal/request pjackson28/wet-boew

shama/grunt-hub yohanboniface/Leaflet.Storage wet-boew/wet-boew-styleguide shama/gaze /v8 isaacs/npm-www zcbenz/ d3/d3-plugins square/crossfilter the-grid/the-behavior rbranson/node-ffi rogerwang/chromium.src wpreul/node-fork NickQiZhu/dc.js jquery/jquerymobile.com scottgonzalez/grunt-wordpress gruntjs/grunt-initLearnBoost/mongoose KiNgMaR/libuv isaacs/npmjs.org jquery/jquery-mobile gruntjs/grunt-cli pjackson28/theme-gcwu-fegc Polymer/polymer-elements einaros/ws rogerwang/node- gruntjs/grunt-contrib-stylus ShaunK/node-soap jquery/api.jquerymobile.com mapbox/mapbox.js jquery/demos.jquerymobile.com shawnbot/aight nodejitsu/forever yohanboniface/django-leaflet-storage jmeas/grunt jquery/blog.jquery.com-theme timmywil/grunt-bowercopy Circadio/circadio-issues gruntjs/grunt-contrib-htmlmin seebees/node-1 vjeux/jDataView Leaflet/Leaflet jquery/jquery.org LearnBoost/stylus gruntjs/grunt-contrib-livereload visionmedia/express brianc/node-postgres rogerwang/WebKit_trimmed isaacs/npm-registry-mock wyuenho/backgrid-select-all johnmdonahue/npmjs.org isaacs/rimraf gruntjs/grunt-contrib-compress mbostock/topojson RedWolves/jquery-wp-content isaacs/nopt Wizcorp/distribute mapbox/markers.js gruntjs/grunt-contrib-yuidoc kartena/Proj4Leaflet

gruntjs/grunt-contrib-jshint whs/chromium.src jquery/web-base-template jquery/events.jquery.org naholyr/doggybag leobalter/jquery-wp-content senchalabs/connect rogerwang/node JamesMGreene/qunit-assert-html Leaflet/Leaflet.markercluster aheckmann/mquery isaacs/osenv isaacs/read-installed visionmedia/nib gruntjs/grunt-contrib-nodeunit isaacs/init-package-json davey3000/chromium jquery/jquery-wp-content yeoman/grunt-regarde jquery/jquery.com cowboy/node-findup-sync jshint/jshint visionmedia/expresso mapbox/node-sqlite3 gulpjs/gulp mbostock/us-atlas jquery/api.qunitjs.com eclipsesource/jshint-eclipse visionmedia/expressjs.com jquery/jquery-release jquery/plugins.jquery.com JamesMGreene/qunit zcbenz/node stereobooster/jshintrb ecomfe/edp-package Leaflet/Leaflet.draw robrich/orchestrator jquery/learn.jquery.com ctalkington/node-archiver tkellen/node-liftoff ielgnaw/edp-doctor springmeyer/node-pre-gyp jquery/2012-dev-summit Mithgol/node-pre-gyp cosm/jshintrb jquery/jquery jquery/qunitjs.com yyx990803/npm jquery/api.jquery.com jquery/qunit nodejitsu/forever-monitor bower/bower terinjokes/gulp-uglify gulpjs/gulp-util acdha/openseadragon caolan/async jshint/site douglasduteil/ui-utils mapbox/node-pre-gyp fraction/fraction ecomfe/edp jquery/testswarm scottgonzalez/jquery leobalter/qunitjs.comjzaefferer/node-testswarm strongloop/loopback bower/decompress-zip strongloop/strong-supervisor ecomfe/edp-doctor jquery/jquery-ui cujojs/rest jquery/contribute.jquery.org kof/node-qunit ecomfe/edp-webserver strongloop/loopback-datasource-jugglerstrongloop/loopback-workspace yatskevich/grunt-bower-task stream-utils/raw-body

ecomfe/edp-build jquery/grunt-jquery-content jquery/bugs.jquery.com strongloop/loopback-angular ecomfe/edp-lint jquery/sizzle jquery/api.jqueryui.com cowboy/wesbos gruntjs/grunt-lib-phantomjs jquery/qunit-reporter-junit ecomfe/edp-bcs bower/bower.github.io strongloop/strong-remoting ecomfe/edp-core ecomfe/edp-project jquery/jqueryui.com

strongloop/sls-sample-app ecomfe/edp-test kswedberg/grunt-jquery-content

yellapuhari/web-base-template

ecomfe/edp-codegen ecomfe/edpx-ub-ria bdowling/jquery-ui bower/registryObvious/phantomjs ecomfe/edp-add ielgnaw/edp jquery/download.jqueryui.com ecomfe/edp-minify

Fig. 2. Ecosystems in the largest connected component of GitHub-hosted projects. Project names follow the pattern user/repository where user is the owner’s GitHub login and repository is the name of the project repository. of the network or the giant component. Figure 2 shows the gi- high number of cross-reference relationships pointing to it, it ant component. The color of the nodes represent communities has a high authority value [18]. Table I shows the most well- as detected by the Louvain method. We obtained a modularity connected project node (highest Authority value) in each of score of 0.913 (out of a possible range of 0 to 1). This high the ecosystems. modularity score indicates that the detected communities are much more tightly connected by technical dependencies than . Properties of GitHub Ecosystems would appear in a random graph. Ecosystems revolve around one central project. As depicted There were 43 ecosystems identified in this network. Nodes in Figure 2, each ecosystem appears to revolve around one are sized according to their authority to display the nodes that main project. In Table I, the most well-connected project are more prominent in each ecosystem. When a node has a node in each ecosystem is listed along with a description TABLE I ECOSYSTEMSIN GITHUB.DETAILS OF THE MOST WELL-CONNECTEDNODEINEACHECOSYSTEM.

Project Description Stars Ecosystem Size Degree (in,out) joyent/node Framework 39,373 10.08% 69 (53,16) symfony/symfony Framework 10,985 8.46% 93 (53,40) rails/rails Framework 29,744 7.92% 93 (65,28) JuliaLang/julia 5,531 6.74% 51 (35,16) rubygems/rubygems 1,304 6.04% 22 (14,8) mxcl/homebrew Package Manager 13,723 3.94% 48 (21,27) zendframework/zf2 Framework 5,841 3.88% 72 (65,7) travis-ci/travis-ci Development Tool ( Platform) 3,693 3.50% 70 (54,16) wet-boew/wet-boew Framework 688 3.34% 19 (15,4) twbs/bootstrap Framework 41,828 3.29% 9 (9,0) dbashford/mimosa Development Tool (Browser development) 472 2.43% 25 (20,5) h5bp/html5-boilerplate Framework 31,926 2.37% 19 (15,4) mitchellh/vagrant Framework 9,274 2.10% 23 (15,8) libgit2/libgit2 Library 5,161 2.05% 20 (11,9) Behat/Mink Development Tool (Testing) 673 1.99% 13 (9,4) OCamlPro/opam Package Manager 118 1.89% 9 (8,1) basho/riak Database 2,520 1.83% 27 (18,9) Polymer/polymer Library 8,787 1.83% 16 (11,5) mapnik/mapnik Development Tool (Toolkit for developing mapping applications) 1,003 1.78% 20 (12,8) mozilla/rust Programming language 5,604 1.78% 36 (29,7) alphagov/static Other (GOV.UK static files/resources) 67 1.73% 13 (10,3) adobe/brackets Development Tool (code editor) 23,921 1.46% 26 (16,10) CocoaPods/CocoaPods Development Tool (dependency manager) 5,711 1.46% 14 (9,5) yeoman/yeoman Development Tool (web development tools) 7,246 1.46% 18 (13,5) angular/angular.js Framework 42,950 1.40% 12 (8,4) dotcloud/docker Development Tool (application container engine) 14,270 1.35% 24 (19,5) emberjs/ember.js Framework 14,185 1.29% 20 (12,8) owncloud/core Other (personal cloud storage tool) 3,222 1.19% 26 (13,13) typhoeus/typhoeus Library 2,465 1.19% 6 (4,2) facebook/hhvm Other () 11,506 1.08% 15 (10,5) celluloid/celluloid Framework 2,855 0.86% 9 (6,3) xp-framework/rfc Framework 0 0.86% 16 (14,2) rogerwang/node-webkit Framework 19,737 0.86% 16 (11,5) ecomfe/edp Development Tool (front-end development platform) 264 0.86% 18 (15,3) kennethreitz/requests Library 13,812 0.81% 13 (10,3) documentcloud/underscore Library 7,135 0.81% 6 (4,2) middleman/middleman Development Tool (website generator) 4,179 0.75% 8 (5,3) elasticsearch/elasticsearch Other (search and analytics tool) 10,700 0.70% 11 (11,0) chapmanb/bcbio-nextgen Other (RNA-seq analysis tool) 173 0.59% 10 (9,1) wp-cli/wp-cli Development Tool (command line interface for WordPress) 1,968 0.59% 13 (9,4) cucumber/cucumber Development Tool (Testing) 5,142 0.49% 7 (4,3) jsdoc3/jsdoc Development Tool (API documentation generator) 2,909 0.49% 6 (3,3) propelorm/Propel Development Tool (Object-Relational Mapping) 893 0.49% 7 (7,0) of the project, the number of stars the project has, the size There are 13 frameworks, 5 libraries, 3 package managers, of the associated ecosystem, and the node’s degree. Each of 2 programming languages, 1 database, and 14 other tools that these projects has a higher in-degree than out-degree with support software development like a testing tool, a continuous the exception of the mxcl/homebrew project. On the other integration platform, and an API documentation generator. hand, low-degree project nodes are four times as likely to Ecosystems are interconnected. The graph in Figure 1 be dependent on another project than they are to have a shows two types of communities that occur in GitHub-hosted project depend on them. This shows that ecosystems are projects, those that are part of the largest connected compo- being formed around a central project with the other projects nent and those that are isolated from the largest connected in the ecosystem mostly depending on that central project. component. The majority of project nodes, 10,484 or 57%, This results in a star pattern. The twbs/bootstrap ego network are involved in the largest connected component, indicating (Figure 3) clearly depicts this pattern within the graph. that many ecosystems are connected to each other across Predominant type of ecosystems is software development the projects in our Dependency Network. The next biggest support. Interestingly, nearly all of the ecosystems are cen- connected component in the graph is only 65 nodes indicating tered around projects whose purpose is to support software that the ecosystems that are isolated are small and have not development, such as frameworks, libraries and programming attracted public attention. languages. In fact, of the 43 ecosystems, there are only Figure 2 displays the interconnected part of the network, and 5 whose purpose is not to support software development. the connections between the ecosystems are apparent. As an A. Research Method netdna/bootstrap-cdn yabawock/bootstrap-sass-rails To complement our investigation of technical dependencies and connectedness of projects in Github, we also sought to

dart-lang/dartlang.org understand the social behaviour of project owners/contributors

MaxCDN/bootstrap-cdn in relation to these ecosystems. We studied two of GitHub’s social relationships, following users and starring projects. On uq-eresearch/aorra twitter/recess GitHub, users can follow other users to receive notification on twbs/bootstrap their activity and star a repository to bookmark it or indicate interest in the project. To understand how the social behaviour

todc/todc-bootstrap of project owners/contributors relates to the identified ecosys- rouge8/Font-Awesome FortAwesome/Font-Awesome tems, we examine the alignment between social and technical connections between the projects. mjgallag/meteor-bootstrap-3 To answer our research question, we construct project-to- project networks based on the following and starring activity Fig. 3. twbs/bootstrap Ego Network. Portraying a sample star pattern in the of the project owners and contributors. We ran correlations network. between the edge weights in the Dependency Network with the edge weights in each social network to determine if there whit537/www.gittip.com is a relationship between the technical dependencies and the social connections. Pearson correlations were used since the freerange/mocha rubygems/rubygems.org data was normally distributed.

jruby/warbler

bundler/bundler-features Project Owners. We constructed two networks using the

jbarnette/isolate

oneclick/rubyinstaller thorin/redmine_ldap_sync following and starring relationships by considering the actions webbj74/puppet-fitbit of the project owners. The Owner Stars Network, G =< gds-operations/puppet-elasticsearch os bundler/bundler V, E >, and the Owner Follows Network, Gof =< V, E >, carlhuda/bundler ruby/rubyjruby/jruby

ms-ati/docile are both undirected graphs whose set of vertices is all GitHub rubygems/guides rubygems/rubygems projects involved in at least one cross-reference. For the Owner rubinius/rubinius Follows Network, there is an edge from nodes xi to yj if the owner of project xi follows the owner of project yj. There is airblade/paper_trail rspec/rspec-rails an edge from xi to yj in the Owner Stars Network if an owner of any project in our dataset has starred both project xi and project yj.

rails/railsheadius/thread_safe rdoc/rdoc globalize/globalize To compare the social connections with the technical depen- dencies, we compare the edge weights of these two networks with the edge weights of the Dependency Network described earlier. The edge weights of these three networks represent the following: wayneeseguin/rvm • Dependency Network Gd: Number of technical depen- Fig. 4. rubygems/rubygems Ego Network. Portraying connections between dencies, measured through reference coupling, between ecosystems. the two project nodes.

• Owner Follows Network Gof : 0 if neither project owner example, Figure 4 shows the rubygems/rubygems ego network, follows the other, 1 if one project owner follows the other clearly depicting its connection to the rails/rails project. This project owner, and 2 if both project owners follow each is not surprising, since the rubygems project is a package other. management framework for the Ruby programming language • Owner Stars Network Gos: Number of project owners and rails/rails is a web application framework written in Ruby. who have starred both projects. There is a direct connection between the rubygems/rubygems Project Contributors. We constructed two additional net- and rails/rails nodes. In addition, there are projects, like works using these following and starring relationships by carlhuda/bundler and airblade/paper trail, which connect the considering the actions of the project contributors (users who two projects. have made commits on the project or are members of the project). The Contributor Stars Network, Gcs =< V, E >, and IV. SOCIAL BEHAVIOUR OF PROJECT the Contributor Follows Network, Gcf =< V, E >, are also OWNERS/CONTRIBUTORS undirected graphs whose set of vertices is all GitHub projects RQ3: Do the project owners’ and contributors’ social involved in at least one cross-reference. The Contributor Fol- behaviours align with the technical dependencies? lows Network has an edge from nodes xi to yj if a contributor TABLE II TABLE III PROJECT OWNERS: CORRELATIONSBETWEENTECHNICALDEPENDENCIES PROJECT CONTRIBUTORS: CORRELATIONSBETWEENTECHNICAL AND SOCIAL BEHAVIOUR. DEPENDENCIESANDSOCIALBEHAVIOUR.

Pearson Correlation p-value Pearson Correlation p-value Technical Dependencies and Following 0.91 <0.001 Technical Dependencies and Following 0.0002 0.98 Technical Dependencies and Stars 0.79 <0.001 Technical Dependencies and Stars 0.001 0.88

Fig. 5. The Owner Follows Network, Gof . Fig. 6. The Contributor Follows Network, Gcf . of project x follows a contributor of project y . The weight i j V. DISCUSSION of each edge is the count of contributors with following relationships for the pair of projects. The Contributor Stars We developed a way to detect technical dependencies Network has an edge from xi to yj if a contributor to any between projects by considering the cross-references made project in our dataset has starred both project xi and project in comments on GitHub. We found that cross-references yj. The weight of each edge is the count of project contributors are commonly included in GitHub comments. By analyzing who have starred both projects. the content of these cross-references, we showed that they are a valid conceptualization of technical dependencies. We B. Results used this conceptualization of dependencies, called reference Project Owners. Table II shows strong, positive correlations coupling, to identify ecosystems. To do this, we used a popular between the technical dependencies and the social behaviour community detection algorithm [10] on the dependency net- of the owners. Along with these strong correlations, Figure 5 work, which identifies clusters of nodes densely connected by shows a pronounced star pattern in the Owner Follows Net- technical dependencies. These detected communities represent work. This indicates that the project owners in an ecosystem software ecosystems. tend to follow the owner of the central repository. Through analysis of the resulting ecosystems found in GitHub-hosted projects, we showed that the ecosystems are Project Contributors. As shown in Table III, the social centered mostly around projects that support software de- behaviour of project contributors does not align with the velopment through developing frameworks and toolkits. The technical dependencies. This indicates that, while the project predominant structure of the ecosystems is a star where one owners seem to follow the right people and are aware of the central project is the hub of the ecosystem. right projects based on the technical dependencies that exist Our method detects technical dependencies that may not in the ecosystem, the social behaviour of project contributors manifest themselves in source code by identifying issues, is not aligned with project dependencies. pull requests or commits that rely on another project, and, Figure 6 shows the Contributor Follows Network. As shown, therefore, it can identify dependencies not identified by other the structure is quite different than the Dependency Network. methods. Our method is analogous to the logical coupling Communities do not have one central project and the network method that detects dependencies within a project proposed is much more densely connected. by Gall et al. [19] except at the ecosystem level. Where logical coupling detects dependencies when artifacts have [7], [8], [9], [20]. Our method allows the identification of been worked on together, our method detects dependencies technical dependencies more broadly across projects and opens when issues, pull requests or commits have been worked in the door to continuing the study of socio-technical alignment conjunction with another project (as evidenced through user- across a larger set of projects and their stakeholders. specified cross-references). Thus, the dependencies established In this study, we found that when dependencies exist through our method are those that are logical. between a pair of projects, the project owners tend to be Limiting the detected dependencies to those that are logical following the owner of the other project. Conway was the is important when using those dependencies to identify ecosys- first to describe the possibility of an alignment between social tems. Methods that detect technical dependencies between connections and technical dependencies in software engineer- projects through analysis of code or configuration files may ing projects, commonly referred to as Conway’s law [21]. not be best suited for identifying software ecosystems. For The transparent nature of GitHub could encourage technical example, when one project uses another project, it does connections between projects by providing an awareness of not necessarily the two software projects are evolving activity across projects. An interesting future research question together in the same environment, especially when the de- is understanding how and when these technical dependencies pendency is to an established, off-the-shelf software package. and social connections came to exist. Did the social con- Thus, identifying all relationships that manifest in the source nections exist first and result in a technical dependency or code or configuration files may result in dependencies that are did the technical dependency exist first and result in a social not important for the identification of ecosystems. connection? If the social connections existed first, what was Our method also allows for the identification of dependen- the driver behind the creation of the technical dependency? cies across all projects hosted on GitHub. Other methods that Perhaps, the awareness of the other project, enabled through detect dependencies are limited to analyzing a given project GitHub’s notifications, was enough to spur a technical depen- or set of projects. Analyzing the dependencies of a popular dency indicating that GitHub’s transparency is changing the project through its source code or configuration files to identify of OSS projects. These research questions could be its ecosystem would not identify projects that rely on that investigated in future research. project. We saw that most ecosystems across the GitHub- While the project owners’ social behaviours (following hosted projects are centered around one main project and users and starring projects) aligned with the technical depen- many projects depend on that project without a reciprocal dencies in our study, we did not witness such an alignment relationship. These relationships would be missed if only the for all project contributors. The follower network of project dependencies of the main project were studied to identify contributors showed that there were no clear central projects its ecosystem. Since the ecosystems are not always well- and communities were densely connected. This is in contrast defined, it would be impossible to know which other projects to the technical dependency network. These results align with to consider for analysis. Thus, our method is better suited to recent research that found that the reasons behind following identifying ecosystems since it is not limited in the number of others extends beyond project coordination needs [22]. Future projects it can analyze. work should investigate the usefulness of following others for GitHub’s built-in social features and transparency may coordination purposes. foster these comments about project interconnections. Future It is also worth studying in more detail the coordination work should investigate if similar comments are made on needs of developers on OSS projects. Perhaps the mere ex- other software development environments that would allow istence of a technical dependency does not imply a coordi- this method to be extended beyond GitHub. Future work nation need, especially given the transparent environment of should also compare the dependencies established via refer- GitHub. Our previous work [23] begun this investigation, but ence coupling to those that manifest themselves in the source coordination needs at the ecosystem level are also worthy of code to provide greater insight into the types of dependencies investigation. that manifest using this method. Ecosystem emergence and evolution. The most prominent A. A Research Agenda nodes in Figure 2 are not always the most popular projects on The ability to easily identify technical dependencies be- GitHub when considering the number of stars each project has. tween a large set of projects opens the door for many in- In fact, the two projects with the most stars, angular/angular.js teresting avenues of research. and twbs/bootstrap, have significantly smaller ecosystem size and lower degree than other projects. Future work can investi- Socio-technical analysis. Studies that have attempted to gate how and why ecosystems emerge and why some projects study how communication aligns with dependencies across become popular without growing a large ecosystem. Such a projects have been limited to studying well-defined ecosystems study could include a temporal analysis of the composition where dependency information is publicized in some way. of the ecosystem and density of connections together with For example, dependencies can be made available through a temporal analysis of project history information such as a project’s configuration files, dependency manager files or number of contributors, forks, stars, etc. It would also be through publicly available dependency specifications [1], [6], worth triangulating results with other information on important project events now commonly available through and OSS software ecosystems have mostly focused on the analysis wikis. Such a study on the evolution of ecosystems can be a of a well-defined OSS ecosystem like [4], [26], Ruby first step in understanding when and why projects accumulate on Rails [20], [27] or Apache [6], [8]. Instead, we introduce an ecosystem. a way to identify unknown ecosystems by using community Ecosystem size and strength of connections and project detection methods. success. On many open source projects, volunteers are crucial Several studies [28], [29] have used community detection to project success as they rely on volunteers to submit new algorithms to detect communities across GitHub projects, features and fix bugs. As a project accumulates more projects but they have focused on relationships between developers in its ecosystem, it is also likely to increase its contributions rather than technical dependencies between projects. Thung as developers on dependent projects will be more likely et al. [30] constructed project-to-project networks for GitHub- to fix bugs that they encounter through their dependency. hosted projects, but edges between projects in their network Future research could investigate this relationship to identify represent a single developer contributing to both projects. if the size of a project’s ecosystem is a good predictor of This method can not be used to detect dependencies between various project health and success metrics like the number of projects since developers can often work on multiple indepen- contributions it receives or the number of forks it has. dent projects and, thus, sharing developers is not an indication of a technical dependency. We use technical dependencies for Automatic detection of ecosystems. Another avenue for community detection since the structure of an ecosystem is future research is creating tools to support developers at the defined by its technical dependencies [2]. ecosystem level. It is important for developers to know who Analysis of a project’s source code is a common technique they need to coordinate with across the ecosystem and to un- to identify technical dependencies within a project (intra- derstand how their tasks fit into the big picture. A tool could be project). However, these techniques do not scale up to iden- developed that automatically identifies technical dependencies tify dependencies between projects (inter-project). Lungu et across projects and provides a visualization of the ecosystem. al. [2] describe several methods for extracting inter-project Such a tool could increase awareness of coordination needs dependencies by considering external method and class calls that extend outside project boundaries and help developers in a project’s source code. However, when investigating a large gain a better view of the ecosystem surrounding their project. number of projects, obtaining the source code for every project B. Threats to Validity is not always feasible. Collecting source code data across an One threat stems from our selection of the GHTorrent entire versioning system would require multiple TBs of data dataset, which may not be a full copy of all GitHub data [12]. and more than a year in processing time [5]. Ossher et al. [3] Nevertheless, it is a best-effort approach that has been widely introduced a technique that analyzes import statements in Java accepted in the research community as evidenced by its inclu- source code to resolve inter-project dependencies. Businge and sion as the dataset for the MSR 2013 Mining Challenge [24] Serebrenik [4] employ a similar technique in their study of the and the many recent papers that utilize its data in their analysis. Eclipse ecosystem. However, this technique still requires ob- Another threat is that our analysis was limited to only taining a large amount of source code and, therefore, requires projects hosted on GitHub. We do not generalize our results to a large amount of memory. These techniques, therefore, are other coding hosting environments. Future work can investi- limited in the number of projects that can be studied. gate whether similar cross-reference comments that indicate Previous studies have proposed ways to identify technical technical dependencies are found in other coding hosting dependencies without relying on analysis of source code. One environments. method is to identify technical dependencies by examining Our manual exploration of cross reference comments illus- declared dependencies from a project’s configuration files or trates a variety of types of technical dependencies, but these re- its dependency management tool like Maven [1], [6], [7], sults also can not be generalized. While we achieved saturation [8], [9]. However, not all projects declare dependencies in in our results, our results could be impacted by selection bias. configuration files or employ a dependency manager, and, even To mitigate this, we ensured an equal number of comments for those that do, the data can be missing. Bavota et al. [8] for each source (commit, issue, pull request) were included in found that this information was missing in 37% of releases our sample. Further, for each repository, the manual analysis in a study of the Apache project. Syeed et al. [20] extracted was performed by only one person introducing a possible metadata on inter-project dependencies from the published risk of unreliable results. However, the types of dependencies specifications at rubygems.org in their study of the Ruby on identified seem reasonable for any software project. Future Rails ecosystem. However, the specified dependencies may be work can continue this investigation by examining the content out of date and the approach is specific to only projects that of cross-reference comments across a wide range of projects publish dependency specifications. and code hosting environments. Our approach, which does not rely on analyzing source code, takes advantage of the cross-references that can be VI.RELATED WORK made in comments on GitHub. These cross-references are user- Much work has been done studying the technical, business specified between a pair of projects. They are made in and social dimensions of software ecosystems [25]. Studies of comments on pull requests, issues, and commits as developers coordinate and manage their work dependencies. [13] E. Kalliamvakou, G. Gousios, K. Blincoe, L. Singer, . . German, and D. Damian, “The promises and perils of mining github,” in Proceedings VII.CONCLUSION of the 11th Working Conference on Mining Software Repositories. ACM, 2014, pp. 92–101. In this paper, we proposed a new method for detecting [14] J. Corbin and A. Strauss, Basics of qualitative research: Techniques and technical dependencies between projects, called reference cou- procedures for developing grounded theory. Sage, 2008. [15] M. E. Newman, “Modularity and community structure in networks,” pling, which utilizes user-specified cross-references between Proceedings of the National Academy of Sciences, vol. 103, no. 23, pp. projects. We used this reference coupling method to identify 8577–8582, 2006. ecosystems in GitHub-hosted projects by using an existing [16] M. Bastian, S. Heymann, M. Jacomy et al., “Gephi: an open source software for exploring and manipulating networks.” Proceedings of community detection algorithm to identify densely connected International AAAI Conference on Web and Social Media, vol. 8, pp. clusters of projects. Through an analysis of the identified 361–362, 2009. ecosystems, we find that most ecosystems are centered around [17] M. Molloy and B. Reed, “Critical subgraphs of a random graph,” The Electronic Journal of Combinatorics, vol. 6, no. R35, p. 2, 1999. a single project. While small, unpopular ecosystems remain [18] J. M. Kleinberg, “Authoritative sources in a hyperlinked environment,” isolated, most ecosystems are interconnected. The isolated Journal of the ACM, vol. 46, no. 5, p. 604632, 1999. ecosystems tend to contain projects owned by the same GitHub [19] H. Gall, K. Hajek, and M. Jazayeri, “Detection of logical coupling based on product release history,” in Proceedings of International Conference user or organization. The popular ecosystems are mostly on Software Maintenance. IEEE, 1998, pp. 190–198. centered around tools that support software development. [20] M. Syeed, K. M. Hansen, I. Hammouda, and K. Manikas, “Socio- Our reference coupling method opens the door for fu- technical congruence in the ruby ecosystem,” in Proceedings of The International Symposium on Open Collaboration. ACM, 2014, p. 2. ture research in software ecosystems including studying the [21] M. E. Conway, “How do committees invent,” Datamation, vol. 14, no. 4, socio-technical relationships, evolution, health and success of pp. 28–31, 1968. ecosystems. [22] K. Blincoe and D. Damian, “Implicit coordination: A case study of the rails oss project,” in Proceedings of International Conference on Open Source Systems, 2015, to appear. CKNOWLEDGMENT A [23] K. Blincoe, G. Valetto, and D. Damian, “Do all task dependencies This work was partly funded by NSERC Canada. require coordination? the role of task properties in identifying critical coordination needs in software projects,” in Proceedings of the 9th Joint Meeting of the European Software Engineering Conference and the EFERENCES R ACM SIGSOFT Symposium on the Foundations of Software Engineering. [1] M. F. Lungu, “Reverse engineering software ecosystems,” Ph.D. disser- ACM, 2013, pp. 213–223. tation, University of Lugano, 2009. [24] G. Gousios, “The ghtorent dataset and tool suite,” in Proceedings of [2] M. Lungu, R. Robbes, and M. Lanza, “Recovering inter-project depen- the 10th Working Conference on Mining Software Repositories. IEEE dencies in software ecosystems,” in Proceedings of the International Press, 2013, pp. 233–236. Conference on Automated Software Engineering. ACM, 2010, pp. 309– [25] C. Werner and S. Jansen, “A systematic mapping study on software 312. ecosystems from a three-dimensional perspective,” Software Ecosystems: [3] J. Ossher, S. Bajracharya, and C. Lopes, “Automated dependency Analyzing and Managing Business Networks in the Software Industry, resolution for open source software,” in Proceedings of 7th Working pp. 59–81, 2013. Conference on Mining Software Repositories. IEEE, 2010, pp. 130– [26] D. Dhungana, I. Groher, E. Schludermann, and S. Biffl, “Software 140. ecosystems vs. natural ecosystems: learning from the ingenious mind [4] J. Businge, A. Serebrenik, and M. van den Brand, “Survival of eclipse of nature,” in Proceedings of the 4th European Conference on Software third-party plug-ins,” in Proceedings of 28th International Conference Architecture: Companion Volume. ACM, 2010, pp. 96–102. on Software Maintenance. IEEE, 2012, pp. 368–377. [27] J. Kabbedijk and S. Jansen, “Steering insight: An exploration of the [5] A. Mockus, “Amassing and indexing a large sample of version control ruby software ecosystem,” in Software Business. Springer, 2011, pp. systems: Towards the census of public source code history,” in Pro- 44–55. ceedings of 6th Working Conference on Mining Software Repositories. [28] S. Syed and S. Jansen, “On clusters in open source ecosystems.” IEEE, 2009, pp. 11–20. in Proceedings of International Workshop on Software Ecosystems. [6] F. W. Santana and C. M. L. Werner, “Towards the analysis of soft- Citeseer, 2013, pp. 19–32. ware projects dependencies: An exploratory visual study of software [29] Y. Yu, G. Yin, H. Wang, and T. Wang, “Exploring the patterns of social ecosystems.” in Proceedings of International Workshop on Software behavior in github,” in Proceedings of the 1st International Workshop on Ecosystems. Citeseer, 2013, pp. 7–18. Crowd-based Software Development Methods and Technologies. ACM, [7] J. M. Gonzalez-Barahona, G. Robles, M. Michlmayr, J. J. Amor, and 2014, pp. 31–36. D. M. German, “-level software evolution: a case study of a large [30] F. Thung, T. F. Bissyande,´ D. Lo, and L. Jiang, “Network structure of software compilation,” Empirical Software Engineering, vol. 14, no. 3, social coding in github,” in Proceedings of 17th European Conference on pp. 262–285, 2009. Software Maintenance and Reengineering. IEEE, 2013, pp. 323–326. [8] G. Bavota, G. Canfora, M. Di Penta, R. Oliveto, and S. Panichella, “How the apache community upgrades dependencies: an evolutionary study,” Empirical Software Engineering, pp. 1–43, 2014. [9] D. M. German, J. M. Gonzalez-Barahona, and G. Robles, “A model to understand the building and running inter-dependencies of software,” in Proceedings of 14th Working Conference on Reverse Engineering. IEEE, 2007, pp. 140–149. [10] V. D. Blondel, J.-L. Guillaume, R. Lambiotte, and E. Lefebvre, “Fast unfolding of communities in large networks,” Journal of Statistical Mechanics: Theory and Experiment, vol. 2008, no. 10, p. P10008, 2008. [11] D. Cubranic, G. C. Murphy, J. Singer, and K. S. Booth, “Hipikat: A project memory for software development,” Transactions on Software Engineering, vol. 31, no. 6, pp. 446–465, 2005. [12] G. Gousios and D. Spinellis, “Ghtorrent: Github’s data from a firehose,” in Proceedings of the 9th Working Conference on Mining Software Repositories. IEEE, 2012, pp. 12–21.