<<

TECHNISCHE UNIVERSITÄT CAROLO-WILHELMINA ZU BRAUNSCHWEIG

Studienarbeit

Indicators for Missing Maintainership in Collaborative Open Source Projects

Andre Klapper

February 04, 2013

Institute of Engineering and Automotive Informatics Prof. Dr.-Ing. Ina Schaefer

Supervisor: Michael Dukaczewski

Affidavit

Hereby I, Andre Klapper, declare that I wrote the present thesis without any assis- tance from third parties and without any sources than those indicated in the thesis itself.

Braunschweig / Prague, February 04, 2013

Abstract

The thesis provides an attempt to use freely accessible metadata in order to identify missing maintainership in free and open source software projects by querying various data sources and rating the gathered information. GNOME and Apache are used as case studies.

License This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.

Keywords Maintenance, Activity, Open Source, , Metrics, Metadata, DOAP

Contents

List of Tablesx

1 Introduction1 1.1 Problem and Motivation...... 1 1.2 Objective...... 2 1.3 Outline...... 3

2 Theoretical Background4 2.1 Reasons for Inactivity...... 4 2.2 Problems Caused by Inactivity...... 4 2.3 Ways to Maintainership...... 5

3 Data Sources in Projects7 3.1 Identification and Accessibility...... 7 3.2 Potential Sources and their Exploitability...... 7 3.2.1 Code Repositories...... 8 3.2.2 Mailing Lists...... 9 3.2.3 IRC Chat...... 9 3.2.4 Wikis...... 10 3.2.5 Issue Tracking Systems...... 11 3.2.6 Forums...... 12 3.2.7 Releases...... 12 3.2.8 Patch Review...... 13 3.2.9 Social Media...... 13 3.2.10 Other Sources...... 14 3.3 Weighting and Relevance of Sources...... 14 3.4 Sources in Potential Case Studies...... 15 3.5 Selection of Case Studies...... 18 3.5.1 The Apache Organization...... 18 3.5.2 The GNOME organization...... 19

4 Concept and Implementation 21 4.1 Existing Tools for Specific Sources...... 21 4.1.1 Code Repositories...... 21 4.1.2 Mailing Lists...... 22 4.1.3 IRC Chat...... 22 4.1.4 Wikis...... 23

vii Contents

4.1.5 Issue Tracking Systems...... 23 4.1.6 Forums...... 23 4.1.7 Releases...... 24 4.1.8 Patch Review...... 24 4.1.9 Social Media...... 24 4.2 Data Collection Implementation...... 24 4.2.1 Prerequisites...... 24 4.2.2 Data Queries...... 27 4.3 Rating Criteria...... 31 4.3.1 Code Repository Activity...... 31 4.3.2 Issue Activity...... 32

5 Results and Interpretation 33 5.1 Results...... 33 5.1.1 Metadata Consistency and Completeness...... 33 5.1.2 Code Repositories...... 34 5.1.3 Issue Tracker...... 37 5.2 Rating Results...... 38 5.3 Interpretation...... 39 5.4 Threats to Validity and Data Correctness...... 40

6 Conclusions 42 6.1 Data Analysis...... 42 6.2 Recommended Actions...... 43 6.2.1 Data Gathering: On Metadata Availability and Consistency. 43 6.2.2 Taking Action on Results...... 44 6.3 Outlook...... 45

Bibliography 47

A Source Code 62 A.1 Database Setup...... 62 A.2 Checkout and Update...... 63 A.3 GNOME Checkout and Update...... 64 A.4 Extracting Metadata from Apache DOAP files...... 64 A.5 Extracting Metadata from GNOME DOAP files...... 65 A.6 Maintainer Information from Apache JIRA...... 67 A.7 Code Repository Activity Data in Apache...... 68 A.8 Code Repository Activity Data in GNOME...... 69 A.9 Code Repository Activity Rating in Apache...... 70 A.10 Code Repository Activity Rating in GNOME...... 71 A.11 Issue Tracker Activity Data in Apache...... 72 A.12 Issue Tracker Activity Data in GNOME...... 76 A.13 Issue Tracker Activity Rating in Apache...... 78

viii Contents

A.14 Issue Tracker Activity Rating in GNOME...... 80

B List of Projects by Maintenance Rating 82 B.1 Apache: ratings...... 82 B.2 GNOME: ratings...... 83

C Code Repository Activity 92 .1 Apache...... 92 C.2 GNOME...... 93

D Disclosure of Interest 102

ix List of Tables

3.1 Organization Infrastructures...... 16 3.2 Organization Infrastructures (continued)...... 17

5.1 Metadata Consistency and Completeness...... 33 5.2 Commits and Committers in Apache: Absolute Numbers...... 35 5.3 Commits and Committers in Apache: Percentage Values...... 35 5.4 Commits and Committers in GNOME: Absolute Numbers...... 36 5.5 Commits and Committers in GNOME: Percentage Values...... 36 5.6 Number of Projects per Rating Category...... 38

x 1 Introduction

1.1 Problem and Motivation

„Open source development is a form of distributed, collaborative, asynchronous, partly volunteer, software development“ [DM08, p. 159]. It is largely driven and maintained by volunteers who work on development of software in order to solve a problem they face [Gra04, p. 236]. Potential reasons for involvement include „fun, reputation, learning, enjoyment, and peer recognition“ [vKS07, p. 239]. According to [MH03, p. 105], „the majority of Free Software projects are directed by a single lead developer — usually the software’s original author — who assumes the role of maintainer, integrates patches submitted from developers in his or her user community, and organizes and coordinates releases of the software.“ At any time, a maintainer of a free software/open source project1 (in short: FOSS project) might lose interest in continuing development and become inactive. „As a result of the centralized decision making structure, development stalls in the absence of the lead developer“ [MH03, p. 105]. While spending less time is often realized by a maintainer, „there’s no point at which he consciously realizes that he can no longer fulfill the duties of the role“ [Fog06, p. 216] as the process takes place grad- ually. Furthermore, developers feel emotionally bound to their project and ask the community „to be patient but never find the time“ [MH03, p. 105]. Hence no public call for new contributors is issued either. To make the problem worse, „most free software projects are distributed, which makes it hard to quickly identify volunteers who neglect their duties“ [Mic04, p. 93]. Terms commonly used for this situation are AWOL (Away/Absent Without Official Leave) and MIA (Missing in Action) [Mic04, p. 95]. About 80% of the projects registered on the popular open source platform Source- do not see any error reports, patches, feature request or other measurable in- teraction with the community after their registration [CMP05, p. 9]. Such a project can be considered inactive and unmaintained if no code development takes place and if nobody feels responsible for its state. The code base rots and does not get ported to potential new technologies in its environment, or falls behind the quality of competing projects. Inactivity is often not recognized by parties with interest in further development who could have stepped up to fill the gap if they only had known early enough.

1The terms Free Software and Open Source are often used synonymously. However, the first and older term implies an ideology and suffers from the ambiguity of the term free in (free as in freedom but also without costs) while Open Source rather focuses on technical aspects. For elaboration see [Fog06, p. 11–15].

1 1 Introduction

1.2 Objective

Big and established FOSS organizations can consist of hundreds of projects (modular packages) specialized on providing certain functionality in the stack [Gra04, p. 237]. Such packages, or modules, are often led and maintained by one person or a small core team of developers who lead and moderate discussions and decide on the direc- tion of the project and design questions [Seb08, p. 9][Gra04, p. 237]. Previous research shows that most projects only have a small number of developers — [CMP05, p. 6] proves that 82.6% of the projects hosted on SourceForge have only one or two devel- opers and [Wei05, p. 31] shows that the average number of developers per project on SourceForge is 2.0067. Most of these teams are loosely organized and do not require any official membership. Positions are frequently filled by individuals based on mer- its (meritocracy2), determined by previous contributions, commitment (cf. [Gra04, p. 237]), and reputation. As a result, volunteers and paid developers often work together on a project (see for example [Nea10] for an analysis of the contributor base of the GNOME organization). Moreover, most projects face the problem of only having a few main developers. [DM08] analyzed in 2004 „the 38,000 most recent patches to the kernel (made by roughly 1,000 developers)“ and found out that „37,000 of these patches — that’s about 97% — were made by a subset of 100 developers who were employees paid by their companies to work on Linux!“ [DM08, p. 95]. For the client Evolution „about 70% of the CVS commits come from the top 10% of the contributors, all of whom are employees of “[DM08, p. 106]. Hence inactivity or loss of a project maintainer or member of the core team likely has a huge or even crucial impact on the development pace. Communication and coordination of FOSS development is done via a variety of channels and tools. Fogel considers web sites, mailing lists, systems (code repositories), issue tracking systems and real-time chat as a „minimum, stan- dard set of tools“ [Fog06, p. 47–48]. According to Deek and McHugh it is a „mix of e-mails, CVS, forums, Web sites, and IRC“ [DM08, p. 178]. This is extended by further tools such as blogs or instant messaging. Often these sources use freely acces- sible infrastructure and offer a variety of data to gather and combine, however „the sheer volume of the available information“ requires „methodologies which highlight the relevant information“ [LFRGBH06, p. 27]. This thesis provides an approach that uses available data sources of projects and organizations to make trends visible which endanger further development. Hereby, maintainers receive valuable feedback on the state of their project and can act to improve the situation. As volunteer developers cannot spend spare time on setting up complex solutions and as permissions in environments are limited, the proposed implementation focuses on a rather simple but still meaningful implementation.

2Meritocracy is „a system in which the talented are chosen and moved ahead on the basis of their achievement“[MW]. The Apache Software Foundation describes it as „literally, government by merit“ [Apan].

2 1.3 Outline

1.3 Outline

To achieve better understanding for underlying problems, chapter2 takes a closer look at reasons for decreased or stalled development activity. Chapter3 describes and weights common data sources and infrastructure in FOSS organizations with a closer look at several established organizations. Subsequently the implementation of the proposed approach to the problem is elaborated and applied to two chosen case studies in chapter4. Afterwards, results are evaluated and interpreted in chapter 5. Finally, chapter6 provides recommendations for project maintainers, as well as applicability of the chosen approach to other projects.

3 2 Theoretical Background

2.1 Reasons for Inactivity

Missing activity within a project can have many reasons. Apart from technical reasons such as deprecated or superseded technology provided by the project, other reasons are that the maintainer could have lost interest in solving the underlying problem that initiated the project or has found a non-perfect but acceptable solution that suits personal needs. The maintainer might have less spare time due to university exams, job changes, children, burnout or other personal reasons [Fog06, p. 216][Mic04, p. 95]. Another reason to give up development can be lack of acknowledgment or of a community to share achievements and success with [Ott08]. In case of projects maintained by paid developers, the employer can change stra- tegy and therefore reassign or lay off manpower. If this happens on short notice, the developer might not even have time left to try to pass maintainership gracefully by finding a successor [Wal10].

2.2 Problems Caused by Inactivity

The unidentified absence of a maintainer can create several problems, partially de- pending on the structure of the organization and on how autonomously its teams act. Most common problems are:

• Localization teams spend time translating projects that will likely never be released again. Hence the translations or translation improvements will never be shipped to users.

• A documentation team spends time writing or updating a user manual that will never be included and shipped in a future release.

• Users spend time reporting problems in the issue tracker which will not be read or processed by anybody in case no dedicated triage1 team exists to take a look at them.

1Triaging is „the process of assigning bugs severity and priority, to help developers allocate their bug-fixing time, and cleaning the system of bugs which are in some way not useful — duplicate bugs, incomplete bugs, and bugs which have been fixed but not marked as such in a bug tracker“ [Vil05].

4 2.3 Ways to Pass Maintainership

• A triage team spends time bringing reports into good shape by making these reports contain enough information though no developer is going to take a look at them.

• New code contributors interested in getting involved in development write patches to solve problems and make them available via an issue tracker or mailing list of the project. As no feedback is given (a comment or review of the patch), the contributor receives a negative first impression and loses in- terest in the project. This becomes worse as new contributors who are not familiar with the project do not know where to escalate in order to make lack of maintainership known to a bigger audience that might be able to help with resurrecting.

• Stability and performance can decrease as changes in the environment do not get adapted. Such changes can also trigger previously undiscovered problems in the code which are hard to track down and which nobody feels responsible for. This issue does not only affect users, as distributions2 often cannot check or judge the stability of every single package which is included and shipped. Un- stable applications could redound upon a distribution by hurting its reputation and popularity.

2.3 Ways to Pass Maintainership

Project maintainership can be handed over in several ways. The following list is based on the experience of the author.

• The maintainer realizes personal lack of interest on continuing development. Potential successors are known. The maintainer contacts these candidates and receives a positive answer [Pen12], [Ver11].

• The maintainer announces lack of interest in a weblog or on a mailing list. People interested in continuing development speak up and the maintainership is passed [Wen10], [Qui12], [Cum12].

• A person interested in contributing contacts the maintainer and receives a reply stating that the maintainer is unable to continue development and would like to pass project maintainership to the new person [Wie09].

• A person interested in contributing has unsuccessfully tried to contact the maintainer. If knowledge exists how and where to escalate the problem, it is proposed that the person become the new maintainer [Küh11], [Pie12].

2Distributions are compilations that group a large number of software applications into an inte- grated system [RGBMA06, p. 3]. They are often based on the Linux . An included piece of software is called a package.

5 2 Theoretical Background

• Some organizations have formalized governance systems which cover the situa- tion of losing a project leader. The Xen organization (which calls a maintainer project lead and expects the existence of co-maintainers) requires that „the project’s maintainer community should agree who would want to be/be able to be the new project lead and follow the election process [...]“ which recommends „consensus decision making“ or „a more formal vote“ [Xen12]. As this requires a broader developer base of a rather established project, this concept cannot easily be applied to other organizations. In the case of Apache where indi- viduals are categorized into various roles, members of a Project Management Committee (PMC) are elected and then appoint the PMC Chair [Apan] (which comes close to the term maintainer in this thesis).

6 3 Data Sources in Projects

In this chapter, various pieces of project infrastructure are identified that contain and provide data on development activity. These data sources are described, identified and weighed both in general and for the potential case studies.

3.1 Identification and Accessibility

There are several criteria which facilitate accessing and leveraging data. First of all, information should be publicly accessible in order to enable any interes- ted external person to gather data without bigger efforts required, such as registration for services or even administrator permissions. „It is hard to obtain data for a large sample of open source software projects because of the heterogeneity in the data sources. Not all projects use the same tools for the different repositories, or even the same kind of repositories, and often those repositories are dispersed across different sites.“ [HH10, p. 147] Hence centralized data storage (e. g. one code repository and one central issue tracker for all projects) extremely simplifies harvesting data from a certain organization and avoids potential ambiguity regarding resource to consider the most relevant and up-to-date. Semantic, machine readable information in the code repository pointing to other infrastructure resources used by the project help finding further relevant data sources. Metadata files such as DOAP (Description of a Project) files include properties point- ing to URIs of other resources in an RDF format [Dum]. Preferably these files follow a naming and location scheme of the umbrella organization to facilitate finding them. Data sources providing a well-defined and documented SOAP1 or JSON2 inter- face to access and query information are preferable to crude scripts error-prone to unannounced changes in the structure of the data source. For obvious reasons communication via infrastructure not controlled by the project cannot be identified, such as one-on-one instant messaging (via XMPP, ICQ, etc.), Skype conferences or chats, Hangout conferences, or private exchange.

3.2 Potential Sources and their Exploitability

As written in section 1.2, most free and open source software projects provide a large variety of data sources. This section lists potential sources and data sets. It also lists 1SOAP „is a lightweight protocol intended for exchanging structured information in a decentralized, distributed environment“ [GHM+07] 2„JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format“ [Cro06]

7 3 Data Sources in Projects problems to expect and to keep in mind when trying to leverage a specific source. Apart from a code repository none of the subsequently listed data sources are mandatory for running a project. For example, maintainers of smaller projects might consider using an issue tracker overkill and ask users to send them private about problems. In addition, especially smaller projects might not have dedicated communication channels, hence generic channels are used3.

3.2.1 Code Repositories Definition Source code repositories are the core of any software project. Without them a project would not exist. They store and archive source code files and track all changes made by developers via an integrated version/revision control system.

Popular applications Popular applications are Bazaar, CVS, Git, (hg), and Subversion (SVN).

Data to harvest Apart from the sheer number of recent commits, the number of different authors and committers, plus average times between commits can provide indicators for size and activity of the developer base.

Potential problems Potential problems to consider are as follows: • Depending on the structure of the project, a repository might contain non- code commits. Not all projects use separate repositories to host localization data — the GNOME organization stores translation files in a folder called po which is a subdirectory in each project. Without explicitly excluding this subfolder, the activity of translation teams could be misinterpreted as existing code development activity. • Commits that only change one or two lines should be considered for exclusion as they might be simple build fixes committed by non-maintainers outside of the project instead of development activity. • The age of the repository history (e. g. after conversion from another version control system without properly importing previous history) and date of project creation (first commit): If a project is very young, gathered data cannot be considered meaningful. • Version control systems might have implementation characteristics that influ- ence the definition of a module. In Git, a module can include submodules [Cha09a] which would require analyzing activity in the child nodes instead of the parent one. Subversion allows pulling in components from other repositories via the svn:externals property [CSFPb].

3One example is GNOME’s file archive management tool file-roller, see https://mail.gnome. org/archives/desktop-devel-list/2012-October/msg00049.

8 3.2 Potential Sources and their Exploitability

• Module maintainers often use branches to maintain several versions of a project, e. g. to have stable and unstable branches. If the default branch (refered to as CVS Head, Subversion Trunk or Git Master) is not the branch where most development takes place, other branches might need to be identified for further analysis to not incorrectly consider the module unmaintained due to missing activity in the default branch.

• It is necessary to gather a list of numerous, if not all projects hosted in a code repository. This is doable only if the version control client provides such functionality 4, if a server-generated file with a list of all hosted projects is available5, or worse if a self-written script6 could harvest such data via a code repository web interface (such as viewvc or gitweb).

3.2.2 Mailing Lists Definition Mailing lists are used to communicate and discuss a project or work area via email. People interested in following a mailing list subscribe to it in order to receive all messages shared on that list. Messages are sent to a specific email address in order to share them with all subscribers.

Popular applications Popular applications are GNU Mailman and LISTSERV .

Data to harvest Simple statistics could include the number of messages sent, the number and activity of different senders, messages without reply, or interactions between subscribers (via Thread-IDs/In-Reply-To mail headers). The number of subscribers could describe the general interest in and relevance of the project.

Potential problems An analysis of mailing list communication obviously requires the existence and accessibility of mailing list archives. Some data to analyze, such as the number of subscribers, might require administrator access. Developers could use different or several email addresses.

3.2.3 IRC Chat Definition (IRC) is an internet protocol for synchronous, real- time text messaging. While private messaging is available, its main feature are so- called channels or rooms for group conversations. The only sorting criterion used for messages is the time of posting.

4For example the svn list command of Subversion, or the command ssh -l username gerrit.wikimedia.org gerrit ls-projects in case of Wikimedia’s Gerrit/Git setup 5like for GNOME Git at http://git.gnome.org/repositories.txt 6like https://lists.tizen.org/pipermail/general/2012-May/000658.html for the Tizen project

9 3 Data Sources in Projects

Anybody can log conversations by setting up a bot. A bot is a small application or a script that connects to an IRC channel and performs automated actions, such as logging, providing access permissions or identification services7. The gathered log can then be published to a website, either by another script or manually by a user.

Popular applications Based on the initial server software IRCd (IRC ) a large number of derivations is in use.

Data to harvest Measuring activities on IRC channels could include the number of channel visitors, the number of actively discussing channel visitors, the number of messages per channel and per specific user, and responsiveness.

Potential problems Information must be available to map an IRC nickname to a specific developer identity. Also it should be kept in mind that discussions can take place via private messages or in generic development channels which are not dedicated to a specific project.

3.2.4 Wikis Definition Wikis are websites allowing users to add and edit content via a web browser. They are often used for documentation and planning.

Popular applications There are several well-established applications such as Media- Wiki and MoinMoin with differences in syntax, functionality and extensibility.

Data to harvest The average number of edits per user per month compared to recent activity could indicate changes in interest. With regard to a specific project the number of edits on project pages over time could be gathered.

Potential problems Only some wikis provide accessible statistics about the activity of a certain user, such as the Special:Contributions page in MediaWiki. Depend- ing on the configuration this might require a registered account or even membership in certain groups. If no username policy is applied, information must be available to map a wiki user account to a specific developer identity. Edits on project pages are impossible to interpret without knowing for what the wiki is used, e. g. if wikipages in an active project are not used for incoming information (meeting logs etc.) but more as a static homepage, the editing activity will be low.

7One example is Supybot which is available at http://sourceforge.net/projects/supybot/ and used for example by the Mer Project [Gre].

10 3.2 Potential Sources and their Exploitability

3.2.5 Issue Tracking Systems Definition Issue trackers (also called bug trackers) are databases that allow keeping an overview of software problems and help to avoid duplicated work of developers [Seb08, p. 164], users, management and quality assurance.

Popular applications The issue tracker landscape is heterogenous among open source organizations. , JIRA, MantisBT and Trac are popular examples. If maintainers would like to avoid hosting an issue tracker themselves or prefer inte- grated management tools, GitHub, Google Code Hosting, and SourceForge have gained a certain popularity.

Data to harvest Statistics per person could include the total number of comments by a certain account in the past 12 months. Project-wide data could be the total number of reports for a project, unresolved reports that have not seen any changes for a certain amount of time, or the average response time to resolve a report.

Potential problems

• Certain functionality to gather data might require an account or even special permissions. If built-in tools to gather statistics are not sufficient, a data sample or a complete dump of the issue database would be needed. This requires access and/or administrator rights.

• There are two main factors influencing the reporter’s ability to report a problem at the right place and hence the significance of reports in general: the userbase size of a project (common applications such as browsers or word processing tools vs. rare specialized usecases like video editing software), and the techni- cal background of the reporter to identify the correct project in the software stack that triggers the problem (application with a graphic user interface vs dependency on a low-level background library).

• Some activities when managing issue reports can incorrectly lead to the as- sumption that active development happens, such as testing and reproducing older tickets or closing support requests as invalid by a triage team or other non-developers. Triagers might also ignore bug report resolution conventions that might be in place, e. g. by marking a report as fixed because the problem is not reproducible anymore in a recent version instead of using this resolution only when an identifiable code change has been committed.

• If the project has only received a small number of reports, the relevance can be questioned as the feedback could be biased. It might be necessary to set a threshold to decide whether to take data into consideration.

11 3 Data Sources in Projects

• Also, most projects have no policy that an issue report must be created before the corresponding problem gets fixed by a code commit, as it would create unnecessary bureaucracy and slow down development. Hence issue reports which are marked as fixed are only a subset of discovered fixed problems in general which are already covered by code repository activity.

3.2.6 Forums Definition Internet forums (also called message boards) are websites where users can discuss by posting messages. The difference to IRC is that messages are archived, and that discussions are structured via threads (certain topics). If a user does not start a new thread, the user always replies to a previous posting in a thread, hence the relationship between posts is obvious. Forums can provide sections for specific areas of interests.

Popular applications Popular forum applications are phpBB and vBulletin.

Data to harvest Similar to wikis, statistics which would be run on the data could include the average number of postings per month by user compared to recent activity, the total number of postings by user or the recent number of postings by user.

Potential problems Though forums might have sections per project, available sta- tistics are often gathered globally and refer to the entire forum. This makes it hard to retrieve statistics for a specific topic (like a project) only. As aforementioned for other sources, it is necessary to be able to link a freely chosen account name with a user ID, such as an email address of a person.

3.2.7 Releases Definition Software releases are snapshots of software code reflecting the state at a certain time made available in a compressed archive file (often called tarball). Such files have a version scheme based on numbering and/or dates.

Data to harvest The date of the last published release and the regularity of releases might imply development activity.

Potential problems Some projects might not publish tarballs regularly or at all and leave it up to distributions to use code repository snapshots of a certain revision that can be considered stable. Tarballs might have been created and uploaded by non- maintainers such as an organization’s release team, due to other projects depending on this project.

12 3.2 Potential Sources and their Exploitability

3.2.8 Patch Review Definition A patch file consists of code which is meant to fix a specific problem in a software project by modifying its source or binary code.

Data to harvest The number of unreviewed patches, both in the issue tracking or dedicated patch review system of the project itself, might provide signs concerning contribution handling. In case of projects modified and redistributed via indirect channels (such as Linux distributions) the number of downstream patches in distributions could be considered. With regard to reviewed patches the average wait time between contribution and review could be a helpful indicator. Its variance could imply whether a maintainer works rather constantly on the codebase, or just from time to time which could be a sign of the maintainer losing interest.

Potential problems A high number of unreviewed old patches does not necessarily mean that the project is unmaintained per se — instead it could just be a huge backlog that nobody has ever cleaned up while recent patches receive reviews. Furthermore, a project with a large codebase (lines of code) is likely to also receive more patches, so this needs to be viewed in relation. With regard to downstream patches it is rather impossible to identify whether dis- tributions already tried unsuccessfully to upstream their changes. Also distributions tend to ship changes to their users for the sake of differentiation towards competitors, hence upstreaming patches is not desirable in all cases.8

3.2.9 Social Media Definition Social media are „sites based on user contributions“ [ACD+08]. They „include blogs and web forums, social bookmarking sites, photo and video sharing communities, as well as social networking platforms“ [ACD+08]. The term can also include microblogs (Twitter, Identi.ca) and social networks (Facebook, Google+) or developer directories for communication.

Data to harvest Recent postings or conversations of a developer on a social media platform about project development can indicate continued interest in developing the project. As an example for social networks, the KDE organization runs a centralized identity system [KDEb] which makes developers and their activities centrally identi- fiable [Alb10] and allows statistics such as development activity by country and other demographics [KDEa].

8In case of Linux distributions, a list of URLs that provide shipped downstream patches is available on http://distributions.freedesktop.org/wiki/DistributionLocations

13 3 Data Sources in Projects

Potential problems The ID of a developer on a social media platform or the URLs of personal blogs have to be known. Some platforms (or the settings that the user has chosen) require an account for using the service.

3.2.10 Other Sources Other potential sources to consider are:

• Updates to user documentation if the documentation is located in a separate location. If the documentation is in the same code repository this would be al- ready covered under 3.2.1. However it has to be noted that some organizations (such as GNOME [GNO12h]) have a separate user documentation team which is not integrated into development teams. This could result in rewriting doc- umentation (e. g. a conversion to a different markup format) without knowing that the software itself has not been recently changed.

• Last update of the project homepage or wikipage, if the headers of the HTML file or server logs reveal dates.

• Average time required to fix a compilation or execution failure if infrastructure to automatically compile or run a project on a server (buildbot) exists. If fixing takes often a long time or if fixes are often committed into the code repository by non-maintainers these could be signs of a lack of maintainership.

• Undelivered (bounced) emails due to obsolete email addresses of project main- tainers. However, logs are often accessible only with system administrator rights.

• Comments by other developers [Mic04, p. 98] or an organization’s release team forced to make a non-maintainer release. This happens if there have been no recent tarballs and if severe issues which require immediate action are not handled.

• Information from downstream distributions: packages which versions have not changed across distribution releases for a while can be indications for lack of maintenance [RGBMA06, p. 4,6].

• Number of unresolved security vulnerabilities and exposures (CVEs) and their age, plus past response times to fix such security issues.

3.3 Weighting and Relevance of Sources

This section evaluates and rates the aforementioned sources with regard to usefulness, relevance and accessibility.

14 3.4 Sources in Potential Case Studies

Obviously activity (committed changes) in a project’s code repository is the most relevant source to analyze. Mailing list archives are often accessible without obsta- cles though in some cases there might be a high correlation between the number of messages on the mailing list and the code activity [SBAH09, p. 41]. Information in issue trackers is freely available and might only require creating an account. When no dedicated patch review system is used, issue trackers also provide patch review data. IRC logs are only available if logging has been set up in the past and is available. Wiki activity can only be analyzed if the provides an index of user contributions. The publishing dates of releases can be checked by gathering server data, however this might be easier with shell access to the FTP server. Forums are mostly user-centric and Linux distributions often provide forums them- selves (like [Ubu] or Fedora [Fed]) so that users would not necessarily contact the forum of an (upstream) itself. Social networks require know- ing the ID of the developer and a separate implementation for each service to gather relavant data. Taking these findings and judgments into consideration, initial analysis concen- trates on code repository activity. If sufficient activity cannot be identified and if an issue tracker location is known or can be guessed, general activity and maintainer activity in this second place is analyzed as a second step. Analysis of further data sources like mailing lists or releases is left for future work and would exceed the scope of this thesis.

3.4 Sources in Potential Case Studies

As several large and successful FOSS organizations were considered for analysis for a proof of concept, the infrastructure of each organization was analyzed in depth. Even though not all available data sources were used in this thesis, the results are useful pointers for potential deeper follow-up investigations. Results are outlined in table 3.1 on page 16 and table 3.2 on page 17.

9Though some Mozilla projects like Bugzilla use Bazaar, see https://wiki.mozilla.org/ Bugzilla:Bzr 10Vague plans for DOAP in KDE existed [KDE10] 11Google Groups does not seem to offer downloading mailing list archives 12like https://en.wikipedia.org/wiki/Wikipedia:Village_pump for the English Wikipedia 13GitHub provides API access to a variety of sources: http://developer.github.com/v3/ 14CVS in was retired on December 21st, 2012 according to [Ecl13] 15Some Apache projects also offer raw mbox files download, such as HTTP Server at http:// httpd.apache.org/mail/ [Apab] 16No official forums mentioned on http://httpd.apache.org/support.html and other Apache project pages 17https://help.github.com/ is just for GitHub itself 18Apache has no global recommendation to use IRC, however many Apache projects use it, while some like Maven use irc.codehaus.org according to http://maven.apache.org/ community.html

15 3 Data Sources in Projects

Organization GNOME KDE Wikimedia Mozilla Source code Git Conversion from Git (Conversion from Mercurial9 repository SVN to Git in SVN mostly done type process [KDE12c] [Hor12], [Med12c]) Command to git clone git clone git clone hg clone check out a git://git. git://anongit. https://gerrit. http://hg. project from gnome.org/ .org/$project.git wikimedia.org/r/p/ mozilla.org/ repository $project [KDE12d] / svn / $project [GNO12c] co svn://anonsvn. $project.git [Med12b] [Moz12c] kde.org/home/kde /trunk/$project [KDE12a] Metadata DOAP per — 10 — — files repository Mailing list Mailman, MARC, http: Mailman, Google11, archives for- mostly http: //lists.kde.org/ https://lists. https: mat and base //mail. wikimedia.org/ //groups. URL gnome.org google.com/ forum/ Issue tracker Bugzilla Bugzilla 4.2.4 Bugzilla 4.2.4 Bugzilla 4.0.9+ 3.4.13 Issue tracker https: https://bugs. https://bugs. https: URL //bugzilla. kde.org wikimedia.org //bugzilla. gnome.org mozilla.org Dedicated Splinter (in- Review Board 1.6.6 Gerrit (https: — (Bugzilla) code/patch/ tegrated in (https://git. //gerrit. branch re- bugtracker) reviewboard.kde. wikimedia.org/) view system org/) Web forum — (No known phpBB, http: — (Special Village Merged with and URL official ones) //forum.kde.org/ pumps12 wikipages mailing lists used as such) [Mozb]; inoffi- cial one exists [mozc] IRC chan- mostly irc.freenode.net mostly irc.mozilla.org nels URL irc.gimp.net [KDE12b] irc.freenode.net [Moz09] [GNO12i] [Med12d] FTP server ftp://ftp. ftp://ftp. Core: http: ftp://ftp. URL for gnome.org/ kde.org/pub/ //download. mozilla. tarballs pub/GNOME/ kde/unstable/ wikimedia. org/pub/ sources/ $version/ org/mediawiki/ mozilla.org/ sources/ src/$project- $version/, Ex- $productname/ $project/ $version tensions: Various; releases/ $version/ tarball creation from $version/ repository on the fly

Table 3.1: Organization Infrastructures

16 3.4 Sources in Potential Case Studies

Organization LibreOffice Eclipse Apache GitHub13 Source code Git Git, SVN14 SVN (Git mir- Git repository rors available type [Apal]) Command to git clone git://anongit. svn co svn://dev. svn checkout https:// check out a freedesktop.org/ eclipse.org/svnroot/ http://svn. github.com/ project from libreoffice/$project technology/$project apache.org/ $username/ repository [Ecl12c] and git repos/asf/ $project clone git://git. $project/trunk eclipse.org/gitroot/ [Apas] $project/$repo [Ecl12a] Metadata — — DOAP per Misc. per files repo. [Apah] product Mailing list http:// Mailman, https: mod_mbox, Misc. per archives for- listarchives. //dev.eclipse. http://mail- product mat and base documentfoundation. org/mailman/ archives. URL org/ / http: apache.org/ //listarchives. mod_mbox/15 .org/ [Docb] Issue tracker Bugzilla 4.2.3 Bugzilla 4.2.1 Bugzilla 4.2.4 GitHub and JIRA 5.2.1 [Apap] Issue tracker https://bugs. https://bugs. https: https: URL freedesktop.org eclipse.org/ //issues. //github. bugs/ apache.org/ com/ bugzilla/ $username/ and https: $project/ //issues. issues apache.org/ jira/ Dedicated Gerrit (https: Gerrit (https:// Review Board GitHub code/patch/ //gerrit. git.eclipse.org/) 1.6.12 (https: branch re- libreoffice.org/) //reviews. view system apache.org/) Web forum No official one, inoffi- FUDforum, http: — (No known Misc. per and URL cial one exists [Lib] //www.eclipse. official ones16) product17 org/forums/ IRC chan- irc.freenode.net [Doca] irc.freenode.net mostly irc. Misc. per nels URL [Ecl12b] freenode.net18 product FTP server http://download. Various, linked http://www. Various; URL for documentfoundation. from http://www. eu.apache. tarball cre- tarballs org/$project/src/ eclipse.org/ org/dist/ ation from $version/ downloads/index_ /$project/ repo. on the project.php $project- fly $version/

Table 3.2: Organization Infrastructures (continued)

17 3 Data Sources in Projects

3.5 Selection of Case Studies

Several prerequisites had to be checked. By characteristics the organizations have to be large. Keeping simplicity and accessibility to sources without special permissions in mind, the crucial aspect is the availability of machine-readable metadata to iden- tify locations of resources related to a codebase and to avoid cumbersome manual searching. Projects hosted under the Apache and GNOME umbrellas are expected to provide the aforementioned DOAP files in the toplevel folders of their code repos- itories [Apah][GNO11b] instead of a traditional unstructured MAINTAINERS text file, which fulfills this requirement. Previous research implies that „[d]ifferences in development environments and pro- cesses will have a fundamental impact on the project history and thus must be con- sidered when mining that history“ [HZ10]. Hence to compare the influence of the level of organizational structure, one organization should have rather strict and the other rather loose acceptance criteria for projects and/or developers. It is assumed that lack of maintainership is recognized earlier when strong social structures and strict workflows are in place. While it is common that „in many projects roles are assumed through ”self- allocation” based on people’s knowledge and interests“ [vKS07, p. 244], Apache has a strong organizational approach by explicitly defining duties and responsibilities via roles for involved people and by defining processes to achieve a certain role based on votes and invitations of already established community members. In contrast, acceptance criteria in GNOME are rather loosely based on underlying technology for projects. Moreover, developers interested in joining GNOME can apply for commit access themselves. This is elaborated in the following sections.

3.5.1 The Apache Organization History The Apache Software Foundation (ASF) was founded in 1999 and „provides organizational, legal, and financial support for a broad range of open source software projects“ [Apaj]. Before a project is fully accepted and allowed to move under the ASF umbrella, it must enter the Incubator [Apac][Apad]. This enforces acceptance of only established codebases. As of November 12th 2012, 42 projects are in incubation [Apao]. The ASF hosts nearly 200 projects [Apaq]. The ASF code repository lists 125 toplevel modules plus the incubator directory which contains 64 modules.

Infrastructure The Apache Software Foundation (ASF) uses Subversion as the main code repository tool and has taken an uncommon approach by providing both Bugzilla and JIRA for issue tracking and leaving the choice up to project [Apa11]. The issue trackers share a landing page. As Subversion was invented under the umbrella of Apache it „fits to workflows and concepts of Apache“ [Stä12]. When some developers expressed interest in using Git there was a fear of „fragmentation of the community“ [Stä12]. In the end, read-only Git mirrors were set up [Apal] and

18 3.5 Selection of Case Studies work is ongoing to provide writable Git repositories [Apam]. According to developer Ulrich Stärk, „as long as people volunteer to maintain infrastruc- ture there is no reason to enforce having only one system for one purpose. Only a few projects use their own separate issue trackers mostly due to historical reasons before they moved under the Apache umbrella“ [Stä12]. Using two issue trackers provides „higher acceptance by developers“ [Stä12]. They share a landing page. Apache decided to use DOAP files in October 2005 [Apah].

Permissions The ASF categorizes people into roles, from user through committer and Project Management Committee (PMC) member up to ASF member [Apan]. The PMC „is the entity that controls the project, nobody else“ [Apan]. Only PMC members can propose active users for committership [Apan], an interested subject cannot apply. As of November 17th 2012, [Apad] lists 3206 persons with commit rights.

Communication emphases „Communication is done via mailing lists. [...] Some projects additionally use more synchronous messaging (for example, IRC or instant messaging). [...] In general, asynchronous communication is much more important because it allows archives to be created and it’s more tolerant on the volunteer nature of the various communities“ [Apan].

3.5.2 The GNOME organization History GNOME is a free and open source desktop environment. It is one of the most popular desktop environments for GNU/Linux and -type operating sys- tems [GNOa]. After a first announcement in 1997, GNOME 1.0 was released in 1999 [GNOa]. Version 2.0 was released in 2002 and version 3.0 in 2011 [GNOc]. In the last six month development cycle between stable versions 3.4 and 3.6, 1112 persons made about 38302 changes in the repositories [GNOb]. As of November 12th, 2012 the GNOME code repository lists 656 modules which are not archived. To get a project under the GNOME umbrella only few criteria must apply:

• The project must be free/open source software.

• It must use the GTK+ toolkit and/or further underlying „GNOME technolo- gies“ (without further specification).

• It must be „maintained“ (without any further definition of the term), and already have had at least one public release [GNO11a].

Infrastructure Since April 2009 Git has been used as the code repository tool [Høg09]. Bugzilla is the main issue tracker. Some projects such as the design team have decided to use external infrastructure such as GitHub [Pét11] for outreach and

19 3 Data Sources in Projects collaboration, other projects such as only use part of the GNOME in- frastructure due to historical reasons (e.g. code hosting on SourceForge but issue tracking in GNOME Bugzilla). GNOME decided to use DOAP files in April 2009 [Owe09].

Permissions In order to receive direct commit access to the code repository, it is only required to „have submitted a reasonable number of patches to an existing maintainer, or bugzilla reports“ [GNO12d]. Interested subjects can apply themselves by making a formal request to the accounts team and are expected to list vouchers who are established community members which will be responsible for future actions of the requester [GNO12a], [Sie12, p. 50].

Communication emphases „There are two main ways that GNOME contributors communicate with each other: mailing lists and IRC [...]. There are many GNOME IRC channels and mailing lists. Many modules have their own IRC channel and list.“ [GNO12j]

20 4 Concept and Implementation

After having chosen two case studies, existing tools to gather data are evaluated, the implementation setup is described, and the actual queries to run on the gathered data are listed. Data gathering on project activity inherits two aspects: Generic data about activity in a project itself by anybody, and data about activity of specific persons marked as maintainers of the project.

4.1 Existing Tools for Specific Sources

This section lists several existing tools and concepts that can be considered for use to harvest data from sources. They either require sources to be downloaded locally, or use online API to access sources and query them for data. The collection of tools described in this section does not aim at completeness. [RGBICH09] is recommended for an in-depth analysis of many available tools. Followup investigations could also consider the use of FOSS indexing and analytics websites such as Ohloh which recently introduced the option to define organizations with subprojects [Ric12]. It allows querying the recent activity of a certain devel- oper and the date of the last commit1 and accessing further project metrics. Ohloh provides a REST-based API for queries but requires a registration of the application and obtaining an API key [Ohl12]. Codebase activity projects like CIA.vc are now defunct [Mor12], remaining projects that concentrate on FOSS code search such as Krugle.org require manual registration to get a project listed.

4.1.1 Code Repositories • The tool CVSAnalY [Met12b] „extracts information out of source code repo- sitory logs and stores it into a database“ [Met12d]. It is written in Python. It requires the tool RepositoryHandler [Met12g] which „is a python library for handling code repositories through a common interface“ [Met12e] and creating a database first. Database information is passed as parameters when running the tool. It also supports analyzing several branches and custom configuration files.

1See https://www.ohloh.net/p/gnome/contributors?query=andre+klapper&sort=commits_ 12_mo for an example.

21 4 Concept and Implementation

• The tool Carnavon „analyses how old the software system is on a per-line basis and extracts figures and indexes that make it possible to identify how ’old’ the software is, how much it has been maintained [...]“ [Col06] but it saw its last code updates in 2006. The code is still available2 but only supports CVS and Subversion [Git06]. • The code repository clients (Subversion, Git) themselves also provide built-in functionality to create queries about the history of users, files and activity.

4.1.2 Mailing Lists • The tool Mailing List Stats [Met12c] „is a command line based tool used to analyze mboxes. It downloads the mboxes in a directory where database will be created [sic!]. It stores all the information which is contained in a [sic!] e-mail“ [Met12f]. It requires manual creation of a database and passing an URL to the mailing list archive. Its database model is described in [Día10] and example queries can be seen in [Nea12]. • Online search of mailing list archives via services such as gmane.org, mail- archive.com, marc.info or nabble.com which also allow searching for real names3 instead of email addresses only and partially even across mailing lists4. None of these services provide an API to query and receive results via client software, but gmane.org offers downloading specific messages [Gma]. • Small helper scripts like mailman-subscriber-count [Wad12a] „count all sub- scribers on all lists on a Mailman installation, storing the results in to a CSV file for each list“ [Wad12b]. but need to be run on the mail server (shell access). The project uses a system called Echolon „which monitors every mailing list and looks for postings sent by a Debian developer“ [Mic04, p. 97]. As Debian developers mostly only package upstream software releases the system itself is not applicable to identifying activity of upstream development.

4.1.3 IRC Chat Several tools exist to gather and publish statistics of IRC channels. IRC Statistics Generator 5 „creates statistics from different logfile formats“ of IRC applications [pis12]. Examples can be seen on [Wha12]. The tool irssistats6 was

2Copy available at http://www.gitorious.org/mining-tools/carnarvon 3See http://www.mail-archive.com/search?l=mer-general%40lists.merproject.org&q= from%3A’’Andre+Klapper’’ or http://marc.info/?w=2&r=1&s=%22andre+klapper%22&q=a for examples. 4See http://search.gmane.org/?query=&author=andre+klapper&group=&sort=date& DEFAULTOP=and&xFILTERS=Aandre-Aklapper---A or http://www.nabble.com/user/ UserProfile.jtp?user=24600 [Nab] for examples. 5http://pisg.sourceforge.net/ 6http://royale.zerezo.com/irssistats/

22 4.1 Existing Tools for Specific Sources used to gather and publish statistics for the main IRC channel of the now defunct MeeGo project as can be seen on [Mun11]. Another tool to format and present existing statistics is superseriousstats7.

4.1.4 Wikis Most wiki software logs activity of user accounts. MediaWiki reveals this informa- tion via the page Special:Contributions which can be also accessed via API which is included by default [Med]8.

4.1.5 Issue Tracking Systems • The commandline tool Bicho can be „used to parse bug/issue tracking systems. It gets all the information associated with issues and stores them in a relation database“ [Met12a] and supports a wide range of issue trackers. Bugzilla and JIRA (unstable) are supported, but the tool creates a complete copy of all reports and their comments for a specific project. This is more information than required and leads to unneeded server load. • Bugzilla extensions listed on [Moz12a] such as BugzillaMetrics or Bayoteers require deployment on the Bugzilla server and are hence out of scope. • Both JIRA and Bugzilla provide Remote Procedure Call (RPC) interfaces. ◦ In the case of JIRA, using REST is recommended and JSON is transitional on the way to REST, while the SOAP and XML interfaces will not see future development [Atl11]. JIRA also offers a command line interface tool that requires a commercial license [Atl12c] and hence is out of scope. ◦ Bugzilla’s web service API [Bugc] has included an XML interface since ver- sion 3.0 [Bug07] and an experimental [Buge] JSON interface since version 3.6 [Bug10]. A REST API is unofficially being worked on [Moz12b].

4.1.6 Forums Apart from basic statistics about your own activity, vBulletin makes statistics only available to administrators [vBu12a], [vBu12b]. However when the „What’s Going On?“ section on the frontpage has been enabled, basic statistics such as the numbers of currently active users, the total numbers of threads, postings and members and the names of currently logged-in are shown to the public on the frontpage.9 phpBB offers an integrated statistics.php subpage. There are also some external third-party extensions available10. 7http://sss.dutnie.nl/ 8An example can be found on English Wikipedia at https://en.wikipedia.org/w/api.php? action=query&list=usercontribs&ucuser=Malyacko&uclimit=100&ucdir=newer 9An example can be seen on http://talk.maemo.org/ 10such as https://www.phpbb.com/customise/db/mod/phpbb_statistics

23 4 Concept and Implementation

4.1.7 Releases As a generic case of checking the date of files on servers, this would require checking each project’s location separately and extracting the creation date of a file. However ASF already lists each project’s latest release(s) on a central website [Apar], and GNOME’s code repositories include JSON files with some file metadata [Kin11].

4.1.8 Patch Review When dedicated patch review tools are used, data can be gathered via integrated APIs, such as in the case of Gerrit [Ger]. A basic implementation example can be found for Wikimedia [baw]. If patches are attached and reviewed in an issue tracker, either integrated APIs can be used, or (as a fallback) querying the issue tracker via its web interface.

4.1.9 Social Media Mentions of the project name can be found by querying previous postings of the developer and included tags. Networks like Twitter, Facebook or Google+ provide APIs for searching [Twi], [Fac], [Goo]. For searching blog entries under a known URL, internet search engines can be used (e.g. Google in connection with the site: parameter).

4.2 Data Collection Implementation

This section elaborates the preparational steps taken to succeed in gathering reason- able data. It also lists the actual queries which were run on the harvested data.

4.2.1 Prerequisites Required packages The following steps require the applications XMLStarlet11, svn, git, curl, mysqldb, python-mysqldb, python-psycopg2, w3m, sed, jsawk12 and spider- monkey to be installed on a GNU/Linux system.

Database setup and layout For efficient processing of the extracted data a rela- tional database (MySQL) is set up to store harvested information. The metadata for each project is stored in the table projects with the projectname as the primary key. Obviously the code repository URL is not stored, as it and its included DOAP file are the origin of all project metadata. Generic, non-personal data for each data source is stored in a table for each data source. As a project can have several persons

11http://xmlstar.sourceforge.net/ 12https://github.com/micha/jsawk

24 4.2 Data Collection Implementation marked as maintainers and as a person can maintain several projects, the person- related data is stored in the table maintainers with the projectname as a foreign key and the maintainer_email_address of the maintainer in order to identify the person and to query this person’s activity in other data sources by using the corre- sponding email address, if available. The calculated scores for code repository and issue tracker activity of a project are stored in the ratings table. The Linux shell script for creating the initial MySQL database architecture can be found in A.1. The database schema is shown in Figure 4.1.

Figure 4.1: Database Schema

Code checkout Two top-level directories are created. Initial complete checkouts of the Apache and GNOME code repositories are dumped into these folders by using the Linux Bash shell scripts listed in appendices A.2 and A.3, in order to get hold of repository history data and to find included DOAP files, if existing. Note that

25 4 Concept and Implementation

Apache’s incubator subdirectory is excluded due to time and diskspace constraints.

DOAP file locating, parsing & writing metadata to the database The Linux Bash shell scripts in A.4 and A.5 are placed in the previously created two top-level directories which include the code checkouts in order to try to locate a DOAP file in each project’s directory. The scripts search for files with the schema ”doa*.rdf” for Apache and ”*.doap” for GNOME. When a DOAP file is found it is passed to an XML parser. The XMLStarlet utility is used as the commandline utility xmllint of the popular package shaped up as cumbersome due to insufficient documentation (–xpath option) and namespace issue handling. If URLs for the issue tracker database and the project mailing list are found, they are written into the database table projects for the project. If email addresses of maintainers are found, they are written into the database table maintainers together with the project name, in order to use them for also potentially checking for mailing list and issue tracker activity of maintainers. The maintainer user IDs in the code repository of GNOME are also stored but currently not used. Regarding the implementation, as the default internal field separator (IFS) for the Bash shell also allows spaces to split words, and as invalid values might include spaces, the IFS is set to newline (\n) in the script. While GNOME’s DOAP files define the code repository user ID of a maintainer via gitusername, manual inspection shows that there is surprisingly no such equivalent in Apache’s DOAP files. As SVN does not store the email address of an author (unlike Git) either but only a username, no simple way exists to identify maintainer commits in Apache’s code repositories by the DOAP file data. The script in A.4 stores the maintainer email addresses and also the maintainer real name in maintainers to provide another potential approach for manual comparison with other sources. As this is unsatisfying, the additional script A.6 queries data from Apache JIRA as a second source of information about maintainer activity for those Apache projects using JIRA as their issue tracker. The script tries to gather the real name, code repository committer ID and email address of users marked as a project lead in JIRA by using the REST API [Atl12a], [Atl11] and stores the information in maintainers. jsawk is used for parsing received data.

Metadata value checks The aforementioned script also tries to identify invalid email addresses of maintainers by comparing them with a regular expression. It also checks the issue tracker and mailing list HTTP URLs for their HTTP response status, with 000 and 404 responses indicating that the server is offline or resp. that the page was not found). Such warnings are emitted in the console. However, these basic tests can only identify a subset of invalid data, as some servers (such as Bugzilla) do not return a 404 response in the case of a non-existing page but redirect to an overview page. In addition, data is inspected manually. Results can be found in section 5.1.1.

26 4.2 Data Collection Implementation

Potential issue tracker accessing and querying After having run the code reposi- tory data queries in 4.2.2.1 and in case of detected moderate code repository activity (defined in section 4.3.1), it is attempted to access and query issue tracker data. Metadata for querying project mailing lists is also analyzed but a query implemen- tation is left for future work.

4.2.2 Data Queries After having finished querying metadata, the subsequently listed queries on develop- ment activity are executed. Their results are written into the database.

4.2.2.1 Code Repository Querying Apache The following queries are run for each project in Apache’s Subversion re- pository. The results of the first four queries are written into the database table coderepos; the results of the last query which targets the activity of individuals are written into the table maintainers. The corresponding Linux Bash shell script can be found in A.7. Documentation for the command svn log can be found in [CSFPa] and in [CSFPc].

• Date of first commit — How old is the project? As it cannot be assumed that the oldest revision is always revision number 1 and as using svn propget svn:log requires passing a specific revision number, the field in XML for the oldest entry is used: svn log -r 1:HEAD –-limit 1 –xml | grep ”” | cut -b7-16

• Date of last commit — Has there been recent activity? svn log –-limit 1 –xml | grep ”” | cut -b7-16

• Number of commits since November 2011 — How much recent activity exists? svn log -r {2011-11-01}:{2013-01-31} -q | grep ”ˆr” | wc -l

• Contributor base size — How many different authors and committers have existed since November 2011?13 svn log -r {2011-11-01}:{2013-01-31} -q | awk ‘/ˆr/ {print $3}’ | sort | uniq | wc -l

• Activity of a certain author since November 2011, via SVN user ID: svn log -r {2011-11-01}:{2013-01-31} -q –xml | grep ”” | grep ”examplename” | wc -l

13SVN does not offer distinguishing between code authors and individuals that commit a patch into the codebase on the server, see [She11].

27 4 Concept and Implementation

GNOME The following queries are run for each project in GNOME’s Git reposito- ry. The results of the first five queries are written into the database table coderepos; the results of the last query which targets the activity of an individual are written into the table maintainers. The corresponding Linux Bash shell script can be found in A.8. Documentation for the command git log can be found in [Cha09b]. In contrast to Subversion there are two different queries for author and committer data. The commands use –- !(po) (Bash’s extglob option [RF10]) to exclude the po subfolder of translations, as they are not maintained by developers.

• Date of first commit — How old is the project? git log –-reverse –-pretty=format:“%cd” –-date=short | head -1

• Date of last commit — Has there been recent activity? git log -n 1 –-pretty=format:“%cd” –-date=short –- !(po)

• Number of commits since November 2011 — How much recent activity exists? git log –-after=2011-11-01 –-pretty=oneline –- !(po) | wc -l

• Number of people with code repository commit access — How many different committers have existed since November 2011? Results are case specific) git log –-after=2011-11-01 –-committer=‘’ –-pretty=format:“%ce” –- !(po) | sort -u | wc -l

• Contributor base size — How many different authors have existed since Novem- ber 2011? (Results are case specific) git log –-after=2011-11-01 –-author=‘’ –-pretty=format:“%ae” –- !(po) | sort -u | wc -l

• Activity of a certain author since November 2011, via email address: git log –-after=2011-11-01 –-author=‘[email protected]’ –-pretty=format:“%ae” –- !(po) | wc -l

4.2.2.2 Issue Tracker Querying Apache Due to the diversity of listed URL types and hosts for the bug-database entry in a project’s DOAP file, the issue tracker of a project is only queried if the URL matches the regular expressions ˆhttps?://issues\.apache\.org/jira/(browse/.+|secure/BrowseProject\. jspa\?id\=[0-9]+)$ (for JIRA) or ˆhttps?://issues\.apache\.org/bugzilla/.+product\=.+$ (for Bugzilla). If no URL is given it is attempted to query Apache’s two main issue trackers with the project’s code repository name. In case of projects using Apache JIRA as their issue tracker, JIRA’s REST API [Atl12b] in combination with JIRA’s JQL query language [Atl] is used for querying. JQL allows searching for issues belonging to a particular project by Project Name, Project Key or Project ID, but for the activity of a specific person it only offers

28 4.2 Data Collection Implementation searching for Reporter and Assignee. There is no general Commenter role or such available. The following URLs for JIRA are accessed. Received data is passed to jsawk to extract the number of reports matching the query criteria. Results are limited to 10000 for performance reasons. The placeholders $projectname and $reportername need to be replaced by actual data. In the case of projects using Apache Bugzilla as their issue tracker, the same queries are used as for GNOME (listed in the following paragraph of this section), replacing bugzilla.gnome.org by issues.apache.org/bugzilla in the URLs respectively. The corresponding Linux Bash shell script that handles both Apache JIRA and Bugzilla can be found in A.11.

• Number of reports reported since November 2011 — Are there users? https://issues.apache.org/jira/rest/api/2/search?jql=created >=2011-11-01+and+project=$projectname&fields=summary &maxResults=10000

• Number of reports closed as fixed since November 2011 — Is there development activity? https://issues.apache.org/jira/rest/api/2/search?jql=resolved >=2011-11-01+and+resolution=fixed+and+project=$projectname &fields=summary&maxResults=10000

• Number of reports edited since November 2011 — Is there other activity? https://issues.apache.org/jira/rest/api/2/search?jql=updated >=2011-11-01 and project=$projectname&fields=summary& maxResults=10000

• Activity of a certain author since November 2011 https://issues.apache.org/jira/rest/api/2/search?jql=created >=2011-11-01+and+project=$projectname+and+reporter= ”$reportername”&fields=summary&maxResults=10000

• Total number of unresolved reports, in order to relate to the previous numbers https://issues.apache.org/jira/rest/api/2/search?jql=project= $projectname+and+(status=”Patch+Available”+or+status=Open+or +status=Reopened+or+status=”In+progress”)&fields=summary &maxResults=10000

GNOME Similar to Apache, GNOME Bugzilla is only queried if the URL matches the regular expression ˆhttps?://bugzilla\.gnome\.org/(enter_bug|browse)\.cgi\?product=.+$ If no URL is provided it is attempted to query GNOME Bugzilla with the project’s code repository name. mailto: URLs as bug-database values are ignored.

29 4 Concept and Implementation

As GNOME still uses Bugzilla version 3.4, the JSON-RPC interface is not avail- able and XML-RPC would have to be used. However, queries via RPC cannot be combined, hence using Bug.search.product (all reports for a certain product) in combination with Bug.history.history.who (all changes by a certain person) is not possible. The RPC interface does not allow either to limit the information gathered from bug reports which match a certain query. Instead all results (bug reports) which match must be fully downloaded creating increased bandwidth usage and server load for broader searches. Furthermore, Bugzilla does not allow (yet) to run all queries via the RPC interface which are available via the browser interface according to [Buga]. Using Bugzilla’s query web interface, only the latest version 4.4 allows multiple custom search criteria to match one field (like ”comment changed after $date” combined with ”commenter is equal to $name” in order to find recent issue tracker activity of a project maintainer) [Bugb]. Considering the aforementioned limitations, the following URLs are accessed in order to retrieve HTML files. Afterwards, the number of reports matching the query criteria is extracted from files. The placeholders [email protected] and $projectname need to be replaced by actual data. The corresponding Linux Bash shell script can be found in A.12.

• Number of reports reported since November 2011 — Are there users? https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now&chfield= [Bug%20creation]&chfieldfrom=2011-11-01&product=$projectname

• Number of reports closed as fixed since November 2011 — Is there development activity? https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now&chfield= bug_status&chfieldfrom=2011-11-01&chfieldvalue=RESOLVED& resolution=FIXED&product=$projectname

• Number of reports edited since November 2011 — Is there other activity? https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now&chfieldfrom= 2011-11-01&product=$projectname

• Activity of a certain author since November 2011, via reports filed by that email address https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now&chfield= [Bug%20creation]&emailreporter1=1&chfieldfrom=$DEADLINE&email1= [email protected]&product=$projectname&emailtype1=exact

• Total number of unresolved reports, in order to relate to the previous numbers https://bugzilla.gnome.org/buglist.cgi&bug_status=UNCONFIRMED &bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED &bug_status=NEEDINFO&product=$projectname

30 4.3 Rating Criteria

Additionally, the implementation of the last query writes a value of -1 into issuetracker_reports_in_12m when the maintainer email address is not registered in GNOME Bugzilla.

4.3 Rating Criteria

The following section describes the criteria used to assign an activity score to each project, based on the results of the previous code repository activity queries from subsection 4.2.2.1 and, in case of a moderate score, also by executing the issue tracker activity queries from subsection 4.2.2.2.

4.3.1 Code Repository Activity After analyzing code repository activity, the scripts in A.9 and A.10 insert scores into coderepo_score in the table ratings. The code tests each project for the following criteria, and if applicable adds the corresponding number of points to the default project score of 0. The higher the final score for a project, the more likely it lacks maintainership.

• +5 points if 0 code commits (and committers) since November 2011, +2 points if 1–5 code commits since November 2011, +1 point if 6–20 code commits since November 2011

• +3 points if 1 committer since November 2011, +1 point if 2 committers since November 2011

• +2 points if 0 listed maintainers, +1 point if 1 listed maintainer

• +2 points if the number of listed maintainers equals the number of maintainers who have not committed any code changes since November 2011 (all listed maintainers are inactive), otherwise +1 point if ≥1 listed maintainer has committed 0 code changes since November 2011

• in case of GNOME only: +1 point if the number of code change authors equals the number of code changes committers (only established developers commit code, no outside con- tributions)

As projects with a low code repository activity score (≤4) can be considered well maintained and as projects with a high score (≥8) can be considered very likely inactive, further investigation is only executed for projects with a moderate score between 5 and 7. These projects are neither clearly inactive nor well maintained. Only in these cases it is attempted to retrieve and analyze additional data from issue

31 4 Concept and Implementation trackers via the queries in subsection 4.2.2.2 and to apply a rating in subsection 4.3.2, in order to decrease the number of projects in this range.

4.3.2 Issue Tracker Activity Similar to the previous chapter, the scripts in A.13 and A.14 insert scores into issuetracker_score in the table ratings. The code tests each project for the following criteria:

• +3 points if 0 reports marked as fixed since November 2011 and 0 reports with any changes since November 2011 which implies no activity, otherwise

• +2 points if 0 reports marked as fixed since November 2011 which implies nearly no activity, otherwise

• -1 point if 0 unresolved reports and ≥1 reports marked as fixed since November 2011 which implies some activity in a smaller project, otherwise

• -3 points if number of unresolved reports divided by reports marked as fixed since November 2011 ≤5 which implies higher activity,

• +1 points if number of unresolved reports divided by reports marked as fixed since November 2011 ≥10 which implies lower activity

32 5 Results and Interpretation

5.1 Results

5.1.1 Metadata Consistency and Completeness While investigating automated crawling of data sources it became evident that con- sistent metadata and use of homogenous infrastructure are foundations for successful analysis. Hence this section provides statistics and observations worth noting which were gathered by automatic and manual analysis of metadata in the DOAP files.

Apache GNOME # % # % General No DOAP file found (Apache: ”doa*.rdf”, 32/125 25.6 79/654 12.1 GNOME: ”*.doap”) in project repository Mailing list URLs in DOAP files No mailing-list entry, or empty value 4/93 4.3 234/575 40.7 URLs with HTTP status 000 or 404 14/89 15.7 11/341 3.2 Substring mailto: in mailing-list 1/89 1.1 40/341 11.7 Substring mail.gnome.org/mailman/ — — 243/341 71.3 listinfo in mailing-list Issue tracker URLs in DOAP files No bug-database entry, or empty value 7/93 7.5 287/575 49.9 URLs with HTTP status 000 or 404 1/86 1.2 10/288 3.5 Subs. issues.apache.org in bug-database 80/86 93.0 — — Substring issues.apache.org/bugzilla 6/86 7.0 — — Substring issues.apache.org/jira/ 67/86 77.9 — — Substring bugzilla.gnome.org — — 272/288 94.4 Substring http:// 55/86 64.0 234/288 81.2 Substring https:// 31/86 36.0 54/288 18.8 Substring browse.cgi? — — 241/288 83.7 Substring enter_bug.cgi? — — 28/288 9.7 Generic URLs (no project specific part) 4/86 4.7 8/288 2.8 Maintainer email addresses in DOAP files DOAP files without maintainer email add. 38/93 40.9 75/575 13.0 Addresses not validating against regex 0/68 0.0 22/824 2.7

Table 5.1: Metadata Consistency and Completeness

33 5 Results and Interpretation

Apart from various data inconsistencies depicted in table 5.1 on page 33, the following further observations or details are worth noting:

• Mailing list URLs: Only in few cases a direct link to mailing list archives is provided. In many cases the URL points to project overview HTML pages which list links to available project-related mailing lists in a non-machine read- able format. In some cases the mailing list’s email address is listed (mailto:) instead of an http(s): address to list information on the web.

• Issue trackers: Some URLs only point to the generic URL of the bugtracker without project-specific elements in the URL. Some URLs point to project overview pages or pages for filing a new report in the issue tracker, others are queries of existing bug reports for the project. Moreover, some projects (such as GNOME’s ) link to an HTML page of their project homepage providing instructions how to file a bug report instead of linking to the actual issue tracker.

• In the case of Apache’s Wicket project the located DOAP file does not validate.

5.1.2 Code Repositories This subsection provides the results gathered by executing the queries listed in sub- section 4.2.2.1. The numbers of commits and committers per project are listed both in absolute and relative numbers, with an obvious focus on lower numbers as high numbers indicate sufficient maintainership. Low activity which will lead to an increased score as per section 4.3 is shown with a yellow background color in the tables. Committers were favored over authors as committers have write access to the codebase and thus are a potential bottleneck for authors without write access.

5.1.2.1 Apache The commits and committers per project are shown in tables 5.2 and 5.3. 76% of the projects have 5 or more committers. The most active projects are lucene with approx. 9000 commits and infrastructure with 119 committers since November 2011. 7 out of 125 projects (5.6%) have not seen any recent code changes, and 4 projects (3.2%) show only low activity.

Maintainer activity For 77 out of 139 identified maintainers (via DOAP files and Apache JIRA) their IDs in JIRA are known. For 38 (49.4%) of these 77, no code changes could be identified in the corresponding project since November 2011. Hence 39 (50.6%) of 77 identified maintainers have committed changes to their projects’ code repositories since November 2011.

34 5.1 Results

Committers Apache [#] 0 1 2 3–4 5–8 9–119 Total 0 7 — — — — — 7 1–5 — 1 — — — — 1 6–20 — 2 1 1 — — 4 21–50 — — 1 4 3 1 9 51–100 — — — 1 2 — 3

Commits 101–300 — — 2 6 6 6 20 301–9088 — — — 4 19 58 81 Total 7 3 4 16 30 65 125

Table 5.2: Commits and Committers in Apache: Absolute Numbers

Committers Apache [%] 0 1 2 3–4 5–8 9–119 Total 0 5.6 — — — — — 5.6 1–5 — 0.8 — — — 0.8 6–20 — 1.6 0.8 0.8 — — 3.2 21–50 — — 0.8 3.2 2.4 0.8 7.2 51–100 — — — 0.8 1.6 — 2.4

Commits 101–300 — — 1.6 4.8 4.8 4.8 16.0 301–9088 — — — 3.2 15.2 46.4 64.8 Total 5.6 2.4 3.2 12.8 24.0 52.0 100

Table 5.3: Commits and Committers in Apache: Percentage Values

35 5 Results and Interpretation

5.1.2.2 GNOME The commits and committers per project are shown in tables 5.4 and 5.5. 28.3% of the projects have 5 or more committers. The most active project is + with 3476 commits and 135 committers since November 2011. 218 out of 654 projects (33.3%) have not seen any recent code changes, and 129 projects (19.7%) show only low activity.

Committers GNOME [#] 0 1 2 3–4 5–8 9–135 Total 0 218 — — — — — 218 1–5 — 57 24 10 — — 91 6–20 — 23 25 18 6 1 73 21–50 — 11 15 20 21 8 75 51–100 — 7 8 14 18 29 76

Commits 101–300 — 4 3 9 21 35 72 301–3477 — — — 3 8 38 49 Total 218 102 75 74 74 111 654

Table 5.4: Commits and Committers in GNOME: Absolute Numbers

Committers GNOME [%] 0 1 2 3–4 5–8 9–135 Total 0 33.3 — — — — — 33.3 1–5 — 8.7 3.7 1.5 — — 13.9 6–20 — 3.5 3.8 2.8 0.9 0.2 11.2 21–50 — 1.7 2.3 3.1 3.2 1.2 11.5 51–100 — 1.1 1.2 2.1 2.8 4.4 11.6

Commits 101–300 — 0.6 0.5 1.4 3.2 5.4 11.0 301–3477 — — — 0.5 1.2 5.8 7.5 Total 33.3 15.6 11.3 11.3 11.3 17.0 100.0

Table 5.5: Commits and Committers in GNOME: Percentage Values

Maintainer activity For 530 (64.3%) out of 824 identified GNOME maintainers (via DOAP files) no code changes could be identified in the corresponding project since November 2011. Hence only 294 (35.7%) identified maintainers have committed changes to their projects’ code repositories since November 2011.

Author/Committer ratio As Git allows differentiation between authors and com- mitters of code, figure 5.1 shows the correlation between patch authors and patch committers in GNOME. A lower number of committers combined with a high num- ber of authors means that contributors depend on a small number of individuals to

36 5.1 Results get code changes committed into the codebase. The coefficient of determination R2 is 0.927. The large values of the projects and gtk+ are not included in the image.

Figure 5.1: Committers and Authors of Code Changes in the Last 12 Months for Each GNOME Project.

5.1.3 Issue Tracker This subsection provides the results gathered by executing the queries listed in sub- section 4.2.2.2.

5.1.3.1 Apache Out of 5 projects with a score between 5 and 7, 4 projects provided a value for an issue tracker URL. Attic and Harmony received only 1 resp. 2 bug report changes since November 2011. More active have been Esme with 7 changes for a total number of 69 open reports, and Forrest with 14 changes for 416 open reports. None of the 5 identified maintainers for 4 of these 5 projects have filed any reports in their issue trackers recently either.

5.1.3.2 GNOME Out of 93 projects with a score between 5 and 7, 40 projects provided a value for an issue tracker URL hosted on bugzilla.gnome.org. For projects with no such URL an attempt was made to query bugzilla.gnome.org by using the projectname. In total, issue tracker activity for 56 projects could be queried.

37 5 Results and Interpretation

8 projects have seen zero bug activity (changes, new reports, reports marked as fixed) at all since November 2011. 4 projects have zero open reports but a high number of changed reports since 2011. These changed reports have all been closed as Resolved Wontfix which means that they have been ”properly” shut down and marked as unmaintained. Out of GNOME’s 70 maintainer email addresses from DOAP files identified for projects with a coderepo_score value between 5 and 7, 21 addresses do not exist as accounts in GNOME Bugzilla, and for 47 addresses the maintainer has filed 0 reports since November 2011.

5.2 Rating Results

The results of the rating for code repository activity in 4.3.1 and, in case of a moderate score between 5 and 7, also for issue tracker activity (if an issue tracker was found for the project) in 4.3.2 are listed in table 5.6. The higher the score, the more likely a project lacks maintainership. Based on code repository activity, 113 of 125 Apache projects (90.4%) and 284 of 654 GNOME projects (43.4%) are initially considered maintained. Attempting to decrease the number of projects with a moderate score by analyzing issue tracker activity, one of Apache’s five affected projects is transfered into the ”inactive” category, with four projects remaining. For GNOME’s 93 affected projects, 19 are transfered to the green ”maintained” category and 16 to the red ”inactive” category, leaving 58 projects in an unclear state. The complete lists of projects ordered by score can be found in appendixB.

Score Projects After Code Repo. Rating Projects After Issue Tracker Rating Apache GNOME Apache GNOME # % # % # % # % 0 0/125 0.0 16/654 2.4 0/125 0.0 16/654 2.4 1 36/125 28.8 131/654 20.0 36/125 28.8 131/654 20.0 2 11/125 8.8 49/654 7.5 11/125 8.8 49/654 7.5 3 40/125 32.0 34/654 5.2 40/125 32.0 43/654 6.6 4 26/125 20.8 54/654 8.3 26/125 20.8 64/654 9.8 5 3/125 2.4 32/654 4.9 1/125 0.8 23/654 3.5 6 1/125 0.8 34/654 5.2 3/125 2.4 15/654 2.3 7 1/125 0.8 27/654 4.1 0/125 0.0 20/654 3.1 8 6/125 4.8 61/654 9.3 7/125 5.6 71/654 10.9 9 1/125 0.8 99/654 15.1 1/125 0.8 101/654 15.4 10 — — 114/654 17.4 — — 118/654 18.0 11 — — 3/654 0.5 — — 3/654 0.5

Table 5.6: Number of Projects per Rating Category

38 5.3 Interpretation

5.3 Interpretation

Metadata A standardized metadata format like DOAP does not ensure consistency of the data values or enforce some values to be mandatory (non-empty). Results of this analysis are affected as further data sources exist which cannot be automatically localized due to poor or missing metadata quality. For given values, the heterogeneity of infrastructure used for issue trackers and mailing lists would require separate implementations for each host system. Heuristic approaches in cases of empty data, such as using the project name from the code repository to check for the existence of the project in the default issue tracker of an organization, only help in some cases.

Maintainer activity It was attempted to identify project maintainer and also query for the activity of these individuals. In total, 824 GNOME maintainers were identified for 654 projects. For Apache projects, more than half of the projects have more than 9 committers, but only 139 maintainers were identified for 125 Apache projects. Hence results with regard to activity and number of project maintainers cannot be considered reliable for the approach taken in this thesis. Furthermore, trying to use maintainer data to query the issuetracker, only 2 of 70 tested maintainer email addresses in GNOME revealed any issue tracker activity. As a consequence, querying maintainer activity by gathered email addresses in the issue tracker cannot be considered to provide significant and reliable results — likely different email addresses are used.

Query results One third of the projects GNOME’s code repository have not seen any recent activity. For Apache this is only the case for 5.6%. Looking at the numbers for code repository commits and committers it becomes clear that a large number of Apache projects has a broad committer base and receive constant commits, shown by the concentration in the lower right corner of the table in subsection 5.1.2.1. Only few Apache projects cannot be considered vital. In contrast, GNOME’s distribution for the chosen ranges of commits and commit- ters shows apart from inactive projects no clear concentration; the mid-ranges for commits and committers are nearly uniformly distributed. Looking at gathered issue tracker data, 4 GNOME projects have 0 open reports but a high number of changed (but not fixed) reports since 2011. This indicates a shutdown of a project with proper closing of remaining tickets. The same situation applies for most projects with all values set to 0, indicating a closed product in GNOME Bugzilla which is still pointed to from the project’s DOAP file. Some GNOME projects (like the four gupnp ones) share exactly the same numbers for all queries. A manual look shows that they are organized as subcomponents of the same product in Bugzilla, and the projects’ DOAP files all point to this product. Taking the rating into consideration, projects in section 5.2 remaining with a final score between 5 and 7 need further investigation as neither code repository nor is- sue tracker activity provided sufficient indicators. Again, the percentage of affected projects is much higher in GNOME than in Apache.

39 5 Results and Interpretation

Surprisingly no Apache projects with a score of 0 were found due to the fact that for most projects only one maintainer could be identified or because no code changes were found for the ID of a maintainer. The unexpectedly small number of GNOME projects with a score of 0 is mostly due to many projects listing inactive maintainers in their DOAP files.

5.4 Threats to Validity and Data Correctness

• To base crawling on initial code repository checkouts assumes the every top- level folder includes only one project which has only one DOAP file. This as- sumption about structure is incorrect in many cases, as can be seen for example in the Apache projects overview in JIRA at [Apae]. Hence some maintainers are not identified due to this structure as a different KEY to query is used per subproject.

• Unlocated DOAP files — As project code repositories were crawled for DOAP files by looking for the filename pattern ”doa*.rdf” likely missed files with a different naming scheme and might be too restrictive.

• Inconsistencies in the code repository data — For example in Apache’s Avalon project, the first revision r10720 is younger (2004-05-20) than the second revi- sion r10721 (2000-11-23), and r19863 is younger than r19864.

• Inconsistent naming of projects across infrastructure — In Apache empire-db is used as code repository name, but EMPIREDB (without hyphen) as KEY in JIRA.

• Use of a different email address for Git code repositories and/or issue trackers and/or mailing lists than listed in the DOAP file so no link can be created.

• Human copy and paste mistakes — Some GNOME maintainer email addresses failed to validate due to copy and paste mistakes such as a succeeding >. GNOME’s transmageddon set http://example.com/projectname/mail as its mailing list URL.

• The script to gather maintainer data from Apache JIRA does not handle esca- ping of names with an (like ”O’Neil”) correctly. Apache’s Beehive and Hadoop are affected.

• Obfuscation — Some GNOME maintainer email addresses which failed to validate include the HTML encoded %40 instead of @, @ replaced by a pe- riod or whitespace, or @ and periods replaced literally by the strings AT and DOT. In Apache JIRA, maintainer addresses such as no.email@address or [email protected] were found.

40 5.4 Threats to Validity and Data Correctness

• Subcomponents in issue trackers — Some projects (such as GNOME’s - cossa or -sharing) have top-level folders in the code repository but are only subcomponents of other projects (gedit and seahorse-plugins) in the issue tracker. Gathered issue tracker activity refers to the entire project and is therefore higher than for the subcomponent only.

• Issue tracker access restrictions — Bugzilla RPC queries only return informa- tion about reports that the user is allowed to access. Reports which are marked as private or restricted to certain groups are entirely excluded from the results [Bugd].

• SVN does not provide a built-in way to query the activity of a specific code repository user ID. As a consequence wc -l is used, which leads to results being zero both for zero commits by an existing user and a non-existing user. This makes it impossible to draw reliable conclusions.

• The scripts only query issue trackers which URLs match the given regular expression. In some cases projects use external issue tracking infrastructure. Accessing external resources is not implemented in the scripts.

Results may not be generalized and may not be representative of other free and open source software organizations.

41 6 Conclusions

It has been shown that unmaintained projects are a problem in open source develop- ment which needs to be dealt with, but „[t]racking inactive volunteers is a complicated task because it cannot be fully automated“ [Mic04, p. 100]. „[T]he process of find- ing inactive maintainers and contacting them is time intensive and requires human judgement“ [Mic04, p. 101] in order to improve the development process and health of a complex FOSS organization. One promising way to decide on whether to take precautions and actions is by gathering and evaluating publicly available data. This thesis provides a simple but powerful methodology and classification for quantitative analysis that can be auto- mated, is rather effortless and can be used without running into access barriers for specific data sources. The analysis could be easily repeated for other FOSS projects with similar freely accessible data sources. However, to get significant data it is crucial to have reliable, consistent and com- plete metadata. It remains challenging to automatically exclude misindicators and identify valid reasons for missing development which does not represent a problem, such as obsolete or legacy software only used by older systems but not for new ap- plications and which is slowly replaced by new technology. A similar case are small applications with a well-defined functionality which can be considered mostly free of errors and functionally complete. For differentiation, human knowledge of the project’s ecosystem is still required. Comparing the two chosen case studies, the level of maintainership in Apache projects is generally higher than in GNOME when evaluating development activity (table 5.3 vs. table 5.5) and completeness of available metadata (table 5.1). This can also be seen in the ratings in table 5.6. Very likely this is due to Apache’s formalized governance system and the strict categorization of individuals into various roles which helps in detecting the decreasing contributions of an individual. Another reason is the requirement to start and establish a project in the incubator before becoming a full Apache project while GNOME only enforces weak and rather vague technical requirements for joining as shown in section 3.5.

6.1 Data Analysis

Metadata For data analysis, providing metadata in the project (e. g. via DOAP files) simplifies the automatic identification and exploitation of related data sources. Unfortunately Apache does not have a policy on the naming and location of DOAP files [Apag] which makes automatically locating them via browsing directories un- necessarily harder. A centralized list of DOAP file locations available at [Apai] was

42 6.2 Recommended Actions found at the end of investigations — in hindsight, starting with this list for Apache instead of checking out all repositories might have been more reasonable. A significant amount of metadata in DOAP files contains incorrect or inconsistent data, or is simply missing. Given URLs for issue trackers contain links to create a new ticket, links to the project overview in the issue tracker, or generic links to the bugtracker frontpage, depending on how the author interprets the requirement to have a DOAP file. Mailing list URLs point to archives, to information pages about mailing lists, or to HTML websites listing links to the mailing lists of the project. Hence plenty of manual work is currently required to identify URLs of data sources, to cover the different interpretations of the requirement to provide an URL, and to actually access these sources in an automated way. Further inconsistencies (e. g. different project name spellings across infrastructure tools) make potential heuristic approaches error-prone. The use of different email addresses of maintainers across sources complicates gathering reliable results, and a number of projects (like GNOME’s release-notes) exhibit zero code repository activity in the main develop- ment branch as work only happens in other code repository branches.

Infrastructure Current versions of infrastructure tools such as Bugzilla do not allow querying for certain data, such as any activity in the issue tracker of person X in the last 12 months, or hosted older versions do not provide stable RPC interfaces. Once tools have overcome some limitations and once organizations have upgraded to recent versions, the results and approach of this thesis could be reevaluated. The implemented approach provides a low entrance barrier through its simplicity, but the inconsistent use of infrastructure tools and their cumbersome identifiability create a major challenge for anybody who is not able to invest more time. In addition, the assumption that one top-level code repository hosts one project which is one top-level project in the issue tracker and has one project specific mai- ling list cannot always be applied — projects have differing needs in organizational structure and grow organically without overarching control at the beginning.

6.2 Recommended Actions

6.2.1 Data Gathering: On Metadata Availability and Consistency Apache The DOAP file guidelines of the Apache project [Apak] are strict. Files can be created via a web form and a validation service is provided [Wor07]. Based on gathered metadata this seems to have a positive influence on correctness and completeness. Still metadata consistency and completeness could be improved by enforcing stricter checks and better guidelines for URL targets. Also, the missing policy on the naming and location of DOAP files [Apag] makes automatical locating via crawling directories unnecessarily hard.

43 6 Conclusions

GNOME Though GNOME has already several pre-push checks in place [GNO12e], [GNO12f], [GNO12g]. GNOME should enforce stricter rules for metadata values by improving these checks to facilitate automatic data gathering for projects’ activities across infrastructure tools. To point out one issue, an entry for mailing-list is given in the GNOME DOAP file example at [GNO12b] but an entry for bug-tracker is entirely missing.

Further Potentially Helpful Data As proactive contacting of maintainers is needed to make them aware of a potentially dangerous situation a project is in, a central place to list which modules need more manpower can be considered helpful. Such a resource should also mention the functional category and the programming language(s) of a project. This might help new contributors to choose a project to work on based on their knowledge and is done by Apache in [Apaa] and [Apaf]. For institutionalization of analysis and actions, a quality assurance team in Debian exists [Mic04, p. 99]. In Debian, after no response to a MIA Ping email for two months the maintainers’ account would be deactivated [Mic04, p. 100]. Also, De- bian maintainers are clearly identifiable as such [Deb07] and statistics are available [Deb12]. Many Debian projects also have secondary or backup maintainer making it more likely that individuals detect missing activity of the primary maintainer. „Further- more, the backup maintainer will have access to the development infrastructure which will make any necessary transition easier“ [MH03, p. 108].

6.2.2 Taking Action on Results Contacting Maintainers When a project is likely unmaintained the first step is to contact the persons listed as maintainers. As Fogel states, „[...] it’s up to you and the others in the project to notice what’s happening — or rather, not happening — and to ask the volunteer what’s going on. The inquiry should be friendly and 100% guilt-free“ [Fog06, p. 216] as „[o]ne always has to keep in mind that there might be a good reason why they are not performing their duties“ [Mic04, p. 99]. Fogel also recommends contacting the maintainer via a public mailing list in order to have a „context established for your next public post: a request for a new volunteer to fill that role“ in case of response [Fog06, p. 216]. The email should summarize one’s findings and politely ask what their situation is [Mic04, p. 99]. In case of no response another email should be sent after a few weeks. For a follow-up maintainer there are nearly always access barriers, as understanding of concepts of the programming language and the software architecture is required. Further negative factors can be missing code refactoring (so-called spaghetti code), unstructured software, lack of consistent style and badly or inconsistently chosen variable and procedure names etc. [Smi99, p. 88]. Often previous are not available anymore for follow-up questions or documentation is incomplete or non-existent [Smi99, p. 4]. If previous maintainer can still be reached they can help

44 6.3 Outlook with the passing of maintainership and answer questions of the new maintainer for a transition period. Furthermore, formalized instructions concerning steps a maintainer is expected to perform before retiring come in handy to raise problem awareness among maintainers and to reduce efforts of subjects to identify appropriate steps. An example can be found in the Debian project [Deb]. As Git differentiates between author and committer, potential candidates for be- coming new maintainer(s) are obviously the most active authors of a project. This can easily be queried1.

Spreading Problem Awareness If maintainership cannot be passed to a new volun- teer, the problem should be made visible so potential volunteers speak up. Michlmayr recommends active classification of inactive projects [Mic04, p. 101]. The Mozilla extensions community lists inactive projects at a central place [moza] to warn contributors to not waste time waiting for a patch review. The FreeBSD project sets the MAINTAINER value to a specific address to signal lack of main- tainership [Fre]. However contributors cannot be expected to find such information when getting started. Instead inactivity information must be visible and displayed at potential contribution entrance points, such as bug reports. Patch contributors (authors) without commit rights in Git projects with a low number of committers and high number of authors (see GNOME’s author/committer ratio in 5.1.2.2) might face problems getting their code in if committers become inactive. Therefore Maintainers should consider identifying trustworthy and active contributors to hand out commit rights to, in order to broaden the committer base and to avoid potential future bottlenecks.

6.3 Outlook

Future Improvements Apart from using more data sources to judge activity such as mailing list and releases or more fine-grained rating criteria in 4.3, further work could include identifying the importance of a project in its organization as it is more comfortable to accept the death of projects which are less relevant. Technically, for underlying libraries in the organization’s software stack it could be checked how many other projects link against the library (via ldd). Nevertheless human knowledge of a project’s relevance and scope is needed to understand that a frontend project provides commonly needed functionality (for example a CD recording application which might be feature-complete and have low development activity but is considered crucial when it comes to customer requirements). In addition, to achieve a better impression on the importance and urgency of taking action, analysis of how many other projects in a shared organization depend on the specific inactive project (such as done by [GBLR04]) could be considered.

1via the command git log –after=$DEADLINE –-author=‘’ –-pretty=format:“%ae” –- !(po) | sort | uniq -c | sort -rn | head -n 20

45 6 Conclusions

At last, the amount of code changes could be set in relation to the number of lines of code, as larger projects can also be expected to receive more code changes.

Community Metrics Any efforts to identify lack of maintainership inevitably lead to the field of community metrics. Community metrics aim to measure how healthy and active a project’s community is. Several FOSS projects (such as Fedora [Fed11], Mozilla [Moz12d], Tizen [Tiz12] or MediaWiki [Med12a]) have started approaches to create community metrics2 which remain to be explored further, also with regard to identifying meaningful parameters3 among the sheer mass of available data. Such data could also warn if there is huge domination of only one company in a project. This is dangerous as a company might suddenly change strategies which lead to drastically decreased manpower4.

Social Approaches Sophisticated approaches to interaction between a project’s maintainer and its community would fall into the category of analyzing query graphs in projects (such as [BKZ10]) and visualizing interaction in collaboration networks via graphs and sociograms (such as [dSQTR07], [OlMB+07], [LFRGBH06], [MGL08, p. 10–11], [ACD+08] or [YN08] for web forums) in order to study relationships be- tween developers and to find potential successors for project maintainership.

2An overview of projects and their approaches can be found at [Wad11]. 3cf. Ross Turk’s Mind Map of potential metrics to gather [Tur12] 4This happened for example to the documentation of the GNOME organization when Sun Mi- crosystems assigned its technical writers to non-GNOME projects [McC12, p. 110].

46 Bibliography

[ACD+08] Eugene Agichtein, Carlos Castillo, Debora Donato, Aristides Gionis, and Gilad Mishne. Finding high-quality content in social media. In Proceedings of the 2008 International Conference on Web Search and Data Mining, WSDM ’08, pages 183–194, New York, NY, USA, 2008. ACM. 13, 46

[Alb10] Tom Albers. Launch identity.kde.org. http://www.omat.nl/2010/ 09/02/launch-identity-kde-org/, September 2010. Accessed Oc- tober 13, 2012. 13

[Apaa] The Apache Software Foundation. Alphabetical Index. http:// projects.apache.org/indexes/alpha.html. Accessed January 28, 2013. 44

[Apab] The Apache Software Foundation. Apache HTTP Server Mailing Lists. http://httpd.apache.org/lists.html. Accessed November 18, 2012. 15

[Apac] The Apache Software Foundation. . http:// incubator.apache.org/. Accessed November 05, 2012. 18

[Apad] The Apache Software Foundation. ASF Committers by id. http: //people.apache.org/committer-index.html. Accessed November 17, 2012, 18:33:05 UTC. 18, 19

[Apae] The Apache Software Foundation. Browse Projects – ASF JIRA. https://issues.apache.org/jira/secure/BrowseProjects. jspa#all. Accessed January 12, 2013. 40

[Apaf] The Apache Software Foundation. Category Index. http:// projects.apache.org/indexes/category.html. Accessed January 28, 2013. 44

[Apag] The Apache Software Foundation. DOAP File FAQ. http:// projects.apache.org/doapfaq.html. Accessed December 24, 2012. 42, 43

[Apah] The Apache Software Foundation. DOAP Files. http://projects. apache.org/doap.html. Accessed July 16, 2012. 17, 18, 19

47 Bibliography

[Apai] The Apache Software Foundation. files.xml. https://svn.apache. org/repos/asf/infrastructure/site-tools/trunk/projects/ files.xml. SVN Revision 1426847. Accessed December 29, 2012. 42

[Apaj] The Apache Software Foundation. Foundation project. http:// apache.org/foundation/. Accessed November 05, 2012. 18

[Apak] The Apache Software Foundation. General DOAP Guidelines. http: //projects.apache.org/guidelines.html. Accessed December 18, 2012. 43

[Apal] The Apache Software Foundation. Git access to Apache code- bases. http://www.apache.org/dev/git.html. Accessed November 05, 2012. 17, 18

[Apam] The Apache Software Foundation. Git at The ASF. https://git- wip-us.apache.org/. Accessed November 18, 2012. 19

[Apan] The Apache Software Foundation. How the ASF works. http://www. apache.org/foundation/how-it-works.html. Accessed November 09, 2012.2,6, 19

[Apao] The Apache Software Foundation. Incubated Projects. http:// incubator.apache.org/projects/. Accessed November 05, 2012. 18

[Apap] The Apache Software Foundation. issues.apache.org. https:// issues.apache.org/. Accessed November 18, 2012. 17

[Apaq] The Apache Software Foundation. Project Listing. http://projects. apache.org/indexes/quick.html. Accessed November 05, 2012. 18

[Apar] The Apache Software Foundation. Project Releases. http:// projects.apache.org/indexes/releases.html. Accessed Novem- ber 18, 2012. 24

[Apas] The Apache Software Foundation. Source Code Repository. http:// www.apache.org/dev/version-control.html. Accessed November 18, 2012. 17

[Apa11] The Apache Software Foundation. ApacheJira. http://wiki.apache. org/general/ApacheJira?action=recall&rev=9, March 2011. Ac- cessed December 05, 2012. 18

[Atl] Atlassian Pty Ltd. Advanced Searching – JIRA 5.2 – Atlassian Documentation – Confluence. https://confluence.atlassian.com/ display/JIRA052/Advanced+Searching. Accessed January 12, 2013. 28

48 Bibliography

[Atl11] Atlassian Pty Ltd. JIRA RPC Services. https://developer. atlassian.com/display/JIRADEV/JIRA+RPC+Services, October 2011. Accessed December 06, 2012. 23, 26

[Atl12a] Atlassian Pty Ltd. JIRA 5.2.1 REST API documentation: /rest/api/2/project/{key}. http://docs.atlassian.com/jira/ REST/5.2.1/#id289232, 2012. Accessed January 10, 2013. 26

[Atl12b] Atlassian Pty Ltd. JIRA 5.2.1 REST API documentation: /rest/api/2/search. http://docs.atlassian.com/jira/REST/5.2. 1/#id296043, 2012. Accessed January 10, 2013. 28

[Atl12c] Atlassian Pty Ltd. JIRA Command Line Interface. https: //bobswift.atlassian.net/wiki/display/JCLI/JIRA+Command+ Line+Interface#JIRACommandLineInterface-Usage, September 2012. Accessed December 06, 2012. 23

[baw] bawolff. Gerrit stats. https://toolserver.org/~bawolff/gerrit- stats.htm. Accessed November 05, 2012. 24

[BKZ10] Andrew Begel, Yit Phang Khoo, and Thomas Zimmermann. Code- book: discovering and exploiting relationships in software reposito- ries. In Proceedings of the 32nd ACM/IEEE International Conference on Software Engineering - Volume 1, ICSE ’10, pages 125–134, New York, NY, USA, 2010. ACM. Also available at http://research. .com/pubs/121127/codebook-cameraready.pdf. 46

[Buga] Bugzilla Project. Ability to search with full functionality via the WebService. https://bugzilla.mozilla.org/show_bug.cgi?id= 475754. Accessed December 16, 2012. 30

[Bugb] Bugzilla Project. Allow multiple custom search criteria to match one field. https://bugzilla.mozilla.org/show_bug.cgi?id=780820. Accessed January 04, 2013. 30

[Bugc] Bugzilla Project. Bugzilla::WebService. http://www.bugzilla.org/ docs/3.6/en/html/api/Bugzilla/WebService.html. Accessed De- cember 06, 2012. 23

[Bugd] Bugzilla Project. Bugzilla::Webservice::Bug. http://www.bugzilla. org/docs/3.4/en/html/api/Bugzilla/WebService/Bug.html# search. Accessed December 18, 2012. 41

[Buge] Bugzilla Project. Bugzilla::WebService::Server::JSONRPC. http://www.bugzilla.org/docs/4.2/en/html/api/Bugzilla/ WebService/Server/JSONRPC.html. Accessed December 06, 2012. 23

49 Bibliography

[Bug07] Bugzilla Project. Bugzilla 3.0 Release Notes. http://www.bugzilla. org/releases/3.0/release-notes.html#v30_feat_xml, May 2007. Accessed December 06, 2012. 23

[Bug10] Bugzilla Project. Bugzilla 3.6 Release Notes. http://www.bugzilla. org/releases/3.6/release-notes.html#v36_feat_jsonrpc, April 2010. Accessed December 06, 2012. 23

[Cha09a] Scott Chacon. Pro Git. http://git-scm.com/book/en/Git-Tools- Submodules, 2009. Accessed July 16, 2012.8

[Cha09b] Scott Chacon. Pro Git. http://git-scm.com/docs/git-log, 2009. Accessed December 16, 2012. 28

[CMP05] Stefano Comino, Fabio M. Manenti, and Maria Laura Parisi. From Planning to Mature: On the Determinants of Open Source Take Off. Department of Economics Working Papers, University of Trento, Trento, 0517, 2005. Also available at http://ideas.repec.org/p/ wpa/wuwpio/0507006.html.1,2

[Col06] CollabNet. carnarvon.tigris.org. http://carnarvon.tigris.org/, July 2006. Accessed November 30, 2012. 22

[Cro06] Douglas Crockford. The application/ Media Type for JavaScript Object Notation (JSON). RFC 4627, RFC Editor, July 2006. Accessed September 02, 2012.7

[CSFPa] Ben Collins-Sussman, Brian W. Fitzpatrick, and C. Michael Pilato. Examining History. http://svnbook.red-bean.com/en/1.7/svn. tour.history.html. Accessed November 12, 2012. 27

[CSFPb] Ben Collins-Sussman, Brian W. Fitzpatrick, and C. Michael Pilato. Externals Definitions. http://svnbook.red-bean.com/en/1.7/svn. advanced.externals.html. Accessed November 12, 2012.8

[CSFPc] Ben Collins-Sussman, Brian W. Fitzpatrick, and C. Michael Pilato. Revision Specifiers. http://svnbook.red-bean.com/en/1.7/svn. tour.revs.specifiers.html. Accessed November 12, 2012. 27

[Cum12] Murray Cumming. maintainership. http://www.murrayc. com/blog/permalink/2012/11/08/gtkmm-maintainership/, November 2012. Accessed November 09, 2012.5

[Deb] Debian Project. Debian Developer’s Reference. http: //www.debian.org/doc/manuals/developers-reference/ developer-duties.html#s3.7. Accessed December 14, 2012. 45

50 Bibliography

[Deb07] Debian Project. General Resolution: Endorse the concept of Debian Maintainers. http://www.debian.org/vote/2007/vote_003, August 2007. Accessed December 02, 2012. 44

[Deb12] Debian Project. DebianMaintainer. http://wiki.debian.org/ DebianMaintainer?action=recall&rev=114#Statistics, October 2012. Accessed December 02, 2012. 44

[Día10] Luis Cañas Díaz. Data-model. http://projects.libresoft.es/ projects/mlstats/wiki/Data-model/1, November 2010. Accessed January 15, 2013. 22

[DM08] Fadi P. Deek and James A. M. McHugh. Open Source – Technology and Policy. Cambridge University Press, Cambridge, 2008.1,2

[Doca] The Document Foundation. Get Help. https://www.libreoffice. org/get-help/. Accessed October 03, 2012. 17

[Docb] The Document Foundation. Mailing Lists. http://www.libreoffice. org/get-help/mailing-lists/. Accessed November 09, 2012. 17

[dSQTR07] Cleidson R. de Souza, Stephen Quirk, Erik Trainer, and David F. Red- miles. Supporting collaborative software development through the vi- sualization of socio-technical dependencies. In Proceedings of the 2007 international ACM conference on Supporting group work, GROUP ’07, pages 147–156, New York, NY, USA, 2007. ACM. 46

[Dum] Edd Dumbill. Description of a Project. https://github.com/ edumbill/doap/wiki. Accessed June 27, 2012.7

[Ecl12a] Eclipse Project. Git. http://wiki.eclipse.org/index.php?title= Git&oldid=320213, October 2012. Accessed November 03, 2012. 17

[Ecl12b] Eclipse Project. IRC. http://wiki.eclipse.org/index.php?title= IRC&oldid=315919, September 2012. Accessed November 03, 2012. 17

[Ecl12c] Eclipse Project. SVN Howto. http://wiki.eclipse.org/index. php?title=SVN_Howto&oldid=296314, April 2012. Accessed October 03, 2012. 17

[Ecl13] Eclipse Project. Eclipse SCM Countdown. http://www.eclipse.org/ projects/scmcountdown.php, 2013. Accessed January 05, 2013. 15

[Fac] Facebook. API Reference > Graph API. https://developers. facebook.com/docs/reference/api/. Accessed December 02, 2012. 24

51 Bibliography

[Fed] Fedora Project. Communicating and getting help. http: //fedoraproject.org/wiki/Communicating_and_getting_help# Forums. Accessed November 12, 2012. 15

[Fed11] Fedora Project. Infrastructure/Metrics. https://fedoraproject. org/w/index.php?title=Infrastructure/Metrics&oldid=264918, December 2011. Accessed December 17, 2012. 46

[Fog06] Karl Fogel. Producing Open Source Software – How to run a successful free software project. O’Reilly, Sebastopol, 2006.1,2,4, 44

[Fre] FreeBSD Project. Contributing to the FreeBSD Ports Collec- tion. http://www.freebsd.org/doc/en_US.ISO8859-1/articles/ contributing-ports/article.html#ADOPT-PORT. Accessed Decem- ber 17, 2012. 45

[GBLR04] Jesus M. Gónzalez-Barahona, Luis López, and Gregorio Robles. Com- munity structure of modules in the apache project. Proceedings of the 4th Workshop on Open Source Software Engineering, pages 43–47, 2004. Also available at http://citeseerx.ist.psu.edu/viewdoc/ download?doi=10.1.1.2.1223&rep=rep1&type=. 45

[Ger] Gerrit Documentation. gerrit query. http://gerrit.googlecode. com/svn-history/r3021/documentation/2.1.4/cmd-query.html. Accessed November 05, 2012. 24

[GHM+07] Martin Gudgin, Marc Hadley, Noah Mendelsohn, Yves Lafon, Jean- Jacques Moreau, Anish Karmarkar, and Henrik Frystyk Nielsen. SOAP version 1.2 part 1: Messaging framework (second edition). W3C recommendation, W3C, April 2007. http://www.w3.org/TR/2007/ REC-soap12-part1-20070427/.7

[Git06] . www/documentation/quick-guide.html. http: //www.gitorious.org/mining-tools/carnarvon/blobs/master/ www/documentation/quick-guide.html, July 2006. Accessed November 30, 2012. 22

[Gma] Gmane. Exporting. http://gmane.org/export.php. Accessed De- cember 02, 2012. 22

[GNOa] GNOME Project. About Us. http://www.gnome.org/about/. Ac- cessed November 05, 2012. 19

[GNOb] GNOME Project. GNOME 3.6 Release Notes. http://library. gnome.org/misc/release-notes/3.6/. Accessed November 05, 2012. 19

52 Bibliography

[GNOc] GNOME Project. Happy Birthday GNOME. http://www. happybirthdaygnome.org/. Accessed November 05, 2012. 19 [GNO11a] GNOME Project. Requirements to have a project hosted on the GNOME infrastructure. https://live.gnome.org/action/recall/ ProjectPrerequisites?action=recall&rev=7, April 2011. Accessed November 05, 2012. 19

[GNO11b] GNOME Project. The Maintainers’ Corner. https://live.gnome. org/action/recall/MaintainersCorner?action=recall&rev=54, March 2011. Accessed June 27, 2012. 18

[GNO12a] GNOME Project. AccountPolicy. https://live.gnome.org/action/ recall/AccountPolicy?action=recall&rev=5, January 2012. Ac- cessed November 17, 2012. 20

[GNO12b] GNOME Project. Frequently Asked Questions about git. https://live.gnome.org/action/recall/Git/FAQ?action= recall&rev=29#How_do_I_add_a_description_to_the_git_web_ view.3F__What_is_this_.22blah.doap.22.3F, August 2012. Accessed December 09, 2012. 44

[GNO12c] GNOME Project. Getting the most out of Git in GNOME. https://live.gnome.org/action/recall/Git/Developers? action=recall&rev=76#Anonymous_Access, August 2012. Ac- cessed November 03, 2012. 16

[GNO12d] GNOME Project. NewAccounts. https://live.gnome.org/action/ recall/NewAccounts?action=recall&rev=32, June 2012. Accessed November 17, 2012. 20

[GNO12e] GNOME Project. sysadmin-bin — Scripts used by GNOME sysadmin team. http://git.gnome.org/browse/sysadmin-bin/tree/git/ validate-doap?id=15ab1d6c642ddf0ed4946be824b5ab7956a06c07, October 2012. Accessed December 25, 2012. 44

[GNO12f] GNOME Project. sysadmin-bin — Scripts used by GNOME sysadmin team. http://git.gnome.org/browse/ sysadmin-bin/tree/git/doap-from-maintainers?id= 15ab1d6c642ddf0ed4946be824b5ab7956a06c07, October 2012. Accessed December 25, 2012. 44

[GNO12g] GNOME Project. sysadmin-bin — Scripts used by GNOME sysadmin team. http://git.gnome.org/browse/ sysadmin-bin/tree/git/pre-receive-check-maintainers? id=15ab1d6c642ddf0ed4946be824b5ab7956a06c07, October 2012. Accessed December 25, 2012. 44

53 Bibliography

[GNO12h] GNOME Project. The GNOME Documentation Project. https: //live.gnome.org/action/recall/DocumentationProject? action=recall&rev=76, April 2012. Accessed November 12, 2012. 14

[GNO12i] GNOME Project. The GNOME Documentation Project. https://live.gnome.org/action/recall/GnomeIrcChannels? action=recall&rev=63, August 2012. Accessed October 09, 2012. 16

[GNO12j] GNOME Project. The GNOME Tour: finding your way around GNOME. https://live.gnome.org/action/recall/GnomeLove/ ProjectTour?action=recall&rev=8, April 2012. Accessed Novem- ber 17, 2012. 20

[Goo] Google Inc. Activities: list – Google+ Platform – Google Develop- ers. https://developers.google.com/+/api/latest/activities/ list. Accessed December 22, 2012. 24

[Gra04] Volker Grassmuck. Freie Software – Zwischen Privat- und Gemeineigentum. Bundeszentrale für politische Bildung, Bonn, 2nd corrected edition, 2004.1,2

[Gre] David Greaves. IRC Logs have moved. http://www.mail-archive. com/[email protected]/msg00784.html. Ac- cessed November 17, 2012. 10

[HH10] Israel Herraiz and Ahmed E. Hassan. Beyond Lines of Code: Do We Need More Complexity Metrics? In Andy Oram and Mary Treseler, editors, Making Software. What Really Works, and Why We Believe It, chapter 8, pages 125–141. O’Reilly, Sebastopol, 1st edition, October 2010.7

[Høg09] Kristian Høgsberg. Git day minus 1. https://mail.gnome.org/ archives/devel-announce-list/2009-April/msg00006.html, April 2009. Accessed November 17, 2012. 19

[Hor12] Chad Horohoe. Extensions still in SVN. http://lists.wikimedia. org/pipermail/wikitech-l/2012-September/063377.html, September 2012. Accessed October 03, 2012. 16

[HZ10] Kim Sebastian Herzig and Andreas Zeller. Mining Your Own Evidence. In Andy Oram and Mary Treseler, editors, Making Software. What Really Works, and Why We Believe It, chapter 27, pages 517–529. O’Reilly, Sebastopol, 1st edition, October 2010. 18

[KDEa] KDE Project. KDE Commit-Digest. http://commit-digest.org/. Accessed November 17, 2012. 13

54 Bibliography

[KDEb] KDE Project. KDE Identity. https://identity.kde.org/. Accessed November 17, 2012. 13

[KDE10] KDE Project. Projects/AboutData/DOAP. http://techbase.kde. org/index.php?title=Projects/AboutData/DOAP&oldid=52634, July 2010. Accessed October 03, 2012. 15

[KDE12a] KDE Project. Getting Started/Sources/Subversion. http: //techbase.kde.org/index.php?title=Getting_Started/ Sources/Subversion&oldid=72834#Checking_out_and_updating, July 2012. Accessed October 03, 2012. 16

[KDE12b] KDE Project. IRC Channels. http://userbase.kde.org/index. php?title=IRC_Channels&oldid=270577, October 2012. Accessed November 09, 2012. 16

[KDE12c] KDE Project. Projects/MovetoGit/Progress. http://techbase.kde. org/index.php?title=Projects/MovetoGit/Progress&oldid= 69861, April 2012. Accessed October 04, 2012. 16

[KDE12d] KDE Project. Sysadmin/GitKdeOrgManual. http://community. kde.org/index.php?title=Sysadmin/GitKdeOrgManual&oldid= 24000#Overview_of_repository_URL_schemes, September 2012. Accessed October 03, 2012. 16

[Kin11] David King. Improving the JSON cache created by ftp-admin in- stall. https://mail.gnome.org/archives/gnome-infrastructure/ 2011-December/msg00020.html, December 2011. Accessed January 06, 2013. 24

[Küh11] Chris Kühl. Made myself the new maintainer. http: //git.gnome.org/browse/gnome-system-monitor/commit/?id= fd33dd0d68d30aa986ea9386c3cd80868f4fa336, February 2011. Accessed May 06, 2012.5

[LFRGBH06] Luis López-Fernández, Gregorio Robles, Gónzalez-Barahona, and Israel Herraiz. Applying Social Network Analysis Techniques to Community-Driven Libre Software Projects. International Journal of Information Technology and Web Engineering, 1(3):27–48, 2006. Also available at http://herraiz.org/papers/english/06_Lopez_ ijitwe_sna.pdf.2, 46

[Lib] LibreOfficeForum.org. Forums. http://libreofficeforum.org/. Ac- cessed October 03, 2012. 17

[McC12] Shaun McCance. Stop Worrying and Love the Crowd. In Lydia Pintscher, editor, Open Advice – FOSS: What We Wish We Had

55 Bibliography

Known When We Started, chapter 19, pages 109–112. lulu.com, 2012. Also available at http://open-advice.org/. 46

[Med] MediaWiki project. API:Usercontribs. http://www.mediawiki.org/ wiki/API:Usercontribs. Accessed July 23, 2012. 23

[Med12a] MediaWiki Project. Community metrics. http://www.mediawiki. org/w/index.php?title=Community_metrics&oldid=613898, De- cember 2012. Accessed December 17, 2012. 46

[Med12b] MediaWiki Project. Download from Git. http://www.mediawiki. org/w/index.php?title=Download_from_Git&oldid=606889, November 2012. Accessed November 28, 2012. 16

[Med12c] MediaWiki Project. Git/Conversion. https://www.mediawiki.org/ w/index.php?title=Git/Conversion&oldid=577442, August 2012. Accessed October 03, 2012. 16

[Med12d] MediaWiki Project. IRC/Channels. http://meta.wikimedia.org/w/ index.php?title=IRC/Channels&oldid=4462206, November 2012. Accessed November 09, 2012. 16

[Met12a] Metrics Grimoire Project. Bicho. https://github.com/ MetricsGrimoire/Bicho#readme, October 2012. Accessed December 05, 2012. 23

[Met12b] Metrics Grimoire Project. CVSAnalY. http://metricsgrimoire. github.com/CVSAnalY/, 2012. Accessed December 02, 2012. 21

[Met12c] Metrics Grimoire Project. Mailing List Stats. http:// metricsgrimoire.github.com/MailingListStats/, July 2012. Ac- cessed December 02, 2012. 22

[Met12d] Metrics Grimoire Project. README. https://github.com/ MetricsGrimoire/CVSAnalY#readme, October 2012. Accessed De- cember 02, 2012. 21

[Met12e] Metrics Grimoire Project. README. https://github.com/ MetricsGrimoire/RepositoryHandler#readme, July 2012. Accessed December 02, 2012. 21

[Met12f] Metrics Grimoire Project. README. http://metricsgrimoire. github.com/MailingListStats/#readme, July 2012. Accessed De- cember 02, 2012. 22

[Met12g] Metrics Grimoire Project. RepositoryHandler. https://github.com/ MetricsGrimoire/RepositoryHandler/, 2012. Accessed December 02, 2012. 21

56 Bibliography

[MGL08] Claudia Müller, Nobert Gronau, and Robert Lembcke. Application of social network analysis in knowledge processes. In Proceedings of 16th European Conference on Information Systems (ECIS), (Ire- land), 2008. Also available at http://is2.lse.ac.uk/asp/aspecis/ 20080189.pdf. 46

[MH03] Martin Michlmayr and . Quality and the Re- liance on Individuals in Free Software Projects. In Proceedings of the 3rd Workshop on Open Source Software Engineering, pages 105– 109, 2003. Also available at http://www.cyrius.com/publications/ michlmayr_hill-reliance.pdf.1, 44

[Mic04] Martin Michlmayr. Managing Volunteer Activity in Free Software Projects. In Proceedings of the 2004 USENIX Annual Technical Conference, Freenix Track, pages 93–102, 2004. Also available at http://www.cyrius.com/publications/michlmayr-mia.pdf.1,4, 14, 22, 42, 44, 45

[Mor12] Ignacio R. Morelle. CIA.vc is dead. http://shadowm.rewound.net/ blog/archives/245-CIA.vc-is-dead.html, September 2012. Ac- cessed September 30, 2012. 21

[moza] mozdev.org. Inactive Projects. http://www.mozdev.org/projects/ inactive.html. Accessed December 17, 2012. 45

[Mozb] Mozilla Project. Forums. https://www.mozilla.org/about/ forums/. Accessed October 03, 2012. 16

[mozc] mozillaZine. mozillaZine forums. http://forums.mozillazine.org/. Accessed October 03, 2012. 16

[Moz09] Mozilla Project. Mozilla IRC Network. http://irc.mozilla.org/, 2009. Accessed November 09, 2012. 16

[Moz12a] Mozilla Project. Bugzilla:Addons. https://wiki.mozilla. org/index.php?title=Bugzilla:Addons&oldid=491488#Data_ harvesting, December 2012. Accessed December 06, 2012. 23

[Moz12b] Mozilla Project. Bugzilla:REST API. https://wiki.mozilla. org/index.php?title=Bugzilla:REST_API&oldid=489245, Novem- ber 2012. Accessed November 30, 2012. 23

[Moz12c] Mozilla Project. Getting Mozilla Source Code Using Mercu- rial. https://developer.mozilla.org/en-US/docs/Developer_ Guide/Source_Code/Mercurial$revision/329971, November 2012. Accessed November 28, 2012. 16

57 Bibliography

[Moz12d] Mozilla Project. Metrics. https://wiki.mozilla.org/index.php? title=Metrics&oldid=391116, January 2012. Accessed December 17, 2012. 46

[Mun11] Carsten Munk. Statistics for #. http://stskeeps. subnetmask.net/irc/data/irssistats.feb.html, March 2011. Ac- cessed December 01, 2012. 23

[MW] Merriam-Webster. Meritocracy. http://www.merriam-webster.com/ dictionary/meritocracy. Accessed July 23, 2012.2

[Nab] Nabble, LLC. What search features does nabble provide? http://n6. nabble.com/help/Answer.jtp?id=31. Accessed January 30, 2013. 22

[Nea10] Dave Neary. GNOME Census. http://blogs.gnome.org/bolsh/ 2010/07/28/gnome-census/, July 2010. Accessed May 02, 2012.2

[Nea12] Dave Neary. Queries. http://projects.libresoft.es/projects/ mlstats/wiki/Queries/3, May 2012. Accessed January 15, 2013. 22

[Ohl12] Ohloh Meta. Getting Started. http://meta.ohloh.net/getting_ started/, 2012. Accessed November 09, 2012. 21 [OlMB+07] Michael Ogawa, Kwan liu Ma, Christian Bird, Premkumar Devanbu, and Alex Gourley. Visualizing social interaction in open source software projects. In In APVIS’07: Proceeding of the 2007 Asia- Pacific Symposium on Visualisation, pages 25–32. IEEE Computer Society, 2007. Also available at http://www.cabird.com/papers/ ogawa2007vsi.pdf. 46

[Ott08] Benjamin Otte. On Loneliness. http://blogs.gnome.org/otte/ 2008/12/18/on-loneliness/, 2008. Accessed April 28, 2012.4

[Owe09] Owen Taylor. Adding module descriptions. https://mail.gnome. org/archives/devel-announce-list/2009-April/msg00007.html, April 2009. Accessed December 05, 2012. 20

[Pen12] Peter Penz. 2.1. http://ppenz.blogspot.com/2012/06/ dolphin-21.html, June 2012. Accessed July 02, 2012.5

[Pét11] Frédéric Péters. On git.gnome.org and gitorious. https: //mail.gnome.org/archives/foundation-list/2011-September/ msg00008.html, September 2011. Accessed November 17, 2012. 19 [Pie12] Jasper St. Pierre. Replace Travis with myself as a main- tainer. http://git.gnome.org/browse/alacarte/commit/?id= c8f47cadaf2b0a629521da880f5713f5d84293dc, May 2012. Accessed June 01, 2012.5

58 Bibliography

[pis12] pisg project. pisg – Perl IRC Statistics Generator :: Home. http: //pisg.sourceforge.net/, 2012. Accessed December 02, 2012. 22

[Qui12] Ignacio Casal Quinteiro. needs new blood. http://blogs. gnome.org/nacho/2012/03/11/gtranslator-needs-new-blood/, March 2012. Accessed July 02, 2012.5

[RF10] Chet Ramey and Brian Fox. The GNU Bash Reference Manual, for bash, version 4.2. http://www.gnu.org/software/bash/manual/ bashref.html#Pattern-Matching, December 2010. Accessed Jan- uary 03, 2013. 28

[RGBICH09] Gregorio Robles, Jesus M. Gónzalez-Barahona, Daniel Izquierdo- Cortazar, and Israel Herraiz. Tools for the study of the usual data sources found in libre software projects. International Journal of Open Source Software and Processes, 1(1):24–45, Jan-March 2009. Also available at http://herraiz.org/papers/english/IJOSSP1-1.pdf. 21

[RGBMA06] Gregorio Robles, Jesus M. Gonzalez-Barahona, Martin Michlmayr, and Juan Jose Amor. Mining large software compilations over time: Another perspective of software evolution. In Proceedings of the 2006 international workshop on Mining software repositories, MSR ’06, pages 3–9, New York, NY, USA, May 2006. ACM.5, 14

[Ric12] Rich Sands. Introducing Ohloh Organizations: A New View On FOSS. http://meta.ohloh.net/2012/10/introducing-ohloh- organizations-a-new-view-on-foss/, October 2012. Accessed Oc- tober 27, 2012. 21

[SBAH09] Emad Shihab, Nicolas Bettenburg, Bram Adams, and Ahmed E. Has- san. On the central role of mailing lists in open source projects: An ex- ploratory study. In KSCD ’09: Proceedings of of the 3rd International Workshop on Knowledge Collaboration in Software Development, pages 34–48, 2009. Also available at http://nicolas-bettenburg.com/ papers/shihab-kscd2009.pdf. 15

[Seb08] Gerd Sebald. Offene Wissensökonomie – Analysen zur Wissenssoziolo- gie der Free/Open Source-Softwareentwicklung. VS Verlag für Sozial- wissenschaften, Wiesbaden, 2008.2, 11

[She11] Alessandro Bahgat Shehata. Authors 6= committers: why most Open Source projects should switch to distributed revision control. http://blog.abahgat.com/2011/05/25/authors-committers- why-open-source-projects-should-switch-to-distributed- revision-control/, May 2011. Accessed December 17, 2012. 27

59 Bibliography

[Sie12] Daniel G. Siegel. Typical development processes of free and open source software projects. Master’s thesis, Technische Universität München, May 2012. Also available at http://www.dgsiegel.net/ writing/2012_master_thesis.pdf. 20 [Smi99] Dennis D. Smith. Designing Maintainable Software. Springer, New York, 1999. 44

[Stä12] Ulrich Stärk. (Private conversation). At Google Summer of Code Mentor Summit 2012, October 2012. 18, 19

[Tiz12] Tizen Project. Tizen Community Metrics. https://www.tizen.org/ community/community-metrics, 2012. Accessed December 17, 2012. 46

[Tur12] Ross Turk. Community Metrics.pdf. http:// communityleadershipsummit.wikia.com/wiki/File:Community_ Metrics.pdf, July 2012. Accessed January 05, 2013. 46

[Twi] Twitter. Using the Twitter Search API. https://dev.twitter.com/ docs/using-search. Accessed December 02, 2012. 24

[Ubu] Ubuntu Project. Web forums. http://www.ubuntu.com/support/ community/web-forums. Accessed November 15, 2012. 15

[vBu12a] vBulletin Solutions. vBulletin Manual: Statistics. https://www. vbulletin.com/docs/html/stats_logs_stats, 2012. Accessed De- cember 02, 2012. 23

[vBu12b] vBulletin Solutions. vBulletin Manual: Stats. https://www. vbulletin.com/docs/html/vb2_manual_cp_stats, 2012. Accessed December 02, 2012. 23

[Ver11] Ruben Vermeersch. On F-Spot maintainership. http://weblog. savanne.be/469-on-f-spot-maintainership, December 2011. Ac- cessed July 02, 2012.5

[Vil05] . Why Everyone Needs A Bugmaster. In Linux.conf.au 2005 Conference, 2005. Also available at http://tieguy.org/talks- files/LCA-2005-paper-html/index.html.4 [vKS07] Georg von Krogh and Sebastian Spaeth. The open source software phe- nomenon: Characteristics that promote research. Journal of Strategic Information Systems, 16:236–253, 2007.1, 18

[Wad11] Karsten Wade. Working group on community metrics. http://iquaid.org/2011/08/12/working-group-on-community- metrics/, August 2011. Accessed December 24, 2012. 46

60 Bibliography

[Wad12a] Karsten Wade. mailman-subscriber-count. https://github.com/ quaid/mailman-subscriber-count, 2012. Accessed December 02, 2012. 22

[Wad12b] Karsten Wade. README. https://github.com/quaid/mailman- subscriber-count/blob/master/README.md, July 2012. Accessed December 02, 2012. 22

[Wal10] Willie Walker. GNOME Accessibility Hackfest. http: //blogs.gnome.org/wwalker/2010/03/30/gnome-accessibility- hackfest/, March 2010. Accessed September 23, 2012.4

[Wei05] Dawid Weiss. A Large Crawl and Quantitative Analysis of Open Source Projects Hosted on SourceForge. Research Re- port, Institute of Computing Science, Poznań University of Technology, Poland, RA-001/05, 2005. Also available at http://www.cs.put.poznan.pl/dweiss/site/publications/ download/weiss-2005-large-crawl-of-sourceforge.pdf.2

[Wen10] Jonh Wendell. Looking for new maintainers. http://www.bani.com. br/lang/en/2010/12/looking-for-new-maintainers/, December 2010. Accessed July 02, 2012.5

[Wha12] Thomas Whaples. stats. http://stats.fennecfoxen.org, 2012. Ac- cessed December 02, 2012. 22

[Wie09] Pierre Wieser. nautilus-actions is back. https://mail.gnome.org/ archives/desktop-devel-list/2009-May/msg00198.html, May 2009. Accessed May 04, 2012.5

[Wor07] World Wide Web Consortium. W3C RDF Validation Service. http: //www.w3.org/RDF/Validator/, February 2007. Accessed December 18, 2012. 43

[Xen12] Xen Project. Xen.org Project Governance. http://www.xen.org/ projects/governance.html, 2012. Accessed December 02, 2012.6

[YN08] Christopher C. Yang and Tobun Dorbin Ng. Analyzing content devel- opment and visualizing social interactions in web forum. In ISI, pages 25–30, 2008. 46

61 A Source Code

A.1 Database Setup

#!/bin/bash mysql -h localhost -u user -e "CREATE DATABASE IF NOT EXISTS unmaint_apache;"

mysql -h localhost -u user -e "USE unmaint_apache; CREATE TABLE projects ( projectname VARCHAR(100) NOT NULL, issuetracker_url VARCHAR(255), mailinglist_url VARCHAR(255), PRIMARY KEY (projectname) );"

mysql -h localhost -u user -e "USE unmaint_apache; CREATE TABLE coderepos ( projectname VARCHAR(100) NOT NULL, date_of_first_commit DATE NOT NULL, date_of_last_commit DATE NOT NULL, commits_in_12m INTEGER NOT NULL, committers_in_12m INTEGER NOT NULL, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "USE unmaint_apache; CREATE TABLE mailinglists ( projectname VARCHAR(100) NOT NULL, postings_in_12_months INTEGER NOT NULL, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "USE unmaint_apache; CREATE TABLE issuetrackers ( projectname VARCHAR(100) NOT NULL, reported_in_12m INTEGER NOT NULL, fixed_in_12m INTEGER NOT NULL, changed_in_12m INTEGER NOT NULL, all_open INTEGER NOT NULL, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "USE unmaint_apache; CREATE TABLE maintainers ( projectname VARCHAR(100) NOT NULL, id INTEGER NOT NULL AUTO_INCREMENT, maintainer_email_address VARCHAR(255) NOT NULL, maintainer_realname VARCHAR(255), maintainer_jira_id VARCHAR(255), coderepo_commits_in_12m INTEGER NOT NULL, issuetracker_reports_in_12m INTEGER, mailinglist_postings_in_12m INTEGER, FOREIGN KEY (projectname) REFERENCES projects (projectname), PRIMARY KEY (id) );"

mysql -h localhost -u user -e "USE unmaint_apache; CREATE TABLE ratings ( projectname VARCHAR(100) NOT NULL, coderepo_score INTEGER NOT NULL, issuetracker_score INTEGER,

62 A.2 Apache Subversion Checkout and Update

FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "CREATE DATABASE IF NOT EXISTS unmaint_gnome;"

mysql -h localhost -u user -e "USE unmaint_gnome; CREATE TABLE projects ( projectname VARCHAR(100) NOT NULL, issuetracker_url VARCHAR(255), mailinglist_url VARCHAR(255), PRIMARY KEY (projectname) );"

mysql -h localhost -u user -e "USE unmaint_gnome; CREATE TABLE coderepos ( projectname VARCHAR(100) NOT NULL, date_of_first_commit DATE NOT NULL, date_of_last_commit DATE NOT NULL, commits_in_12m INTEGER NOT NULL, committers_in_12m INTEGER NOT NULL, authors_in_12m INTEGER NOT NULL, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "USE unmaint_gnome; CREATE TABLE mailinglists ( projectname VARCHAR(100) NOT NULL, postings_in_12_months INTEGER NOT NULL, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "USE unmaint_gnome; CREATE TABLE issuetrackers ( projectname VARCHAR(100) NOT NULL, reported_in_12m INTEGER NOT NULL, fixed_in_12m INTEGER NOT NULL, changed_in_12m INTEGER NOT NULL, all_open INTEGER NOT NULL, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

mysql -h localhost -u user -e "USE unmaint_gnome; CREATE TABLE maintainers ( projectname VARCHAR(100) NOT NULL, id INTEGER NOT NULL AUTO_INCREMENT, maintainer_email_address VARCHAR(255) NOT NULL, maintainer_realname VARCHAR(255) NOT NULL, maintainer_coderepo_id VARCHAR(255) NOT NULL, coderepo_commits_in_12m INTEGER NOT NULL, issuetracker_reports_in_12m INTEGER, mailinglist_postings_in_12m INTEGER, FOREIGN KEY (projectname) REFERENCES projects (projectname), PRIMARY KEY (id) );"

mysql -h localhost -u user -e "USE unmaint_gnome; CREATE TABLE ratings ( projectname VARCHAR(100) NOT NULL, coderepo_score INTEGER NOT NULL, issuetracker_score INTEGER, FOREIGN KEY (projectname) REFERENCES projects (projectname) );"

A.2 Apache Subversion Checkout and Update

#!/bin/bash

63 A Source Code

for repos in $(svn list http://svn.apache.org/repos/asf); do if [ -d $repos ]; then cd $repos if [ -d ".svn" ]; then svn update fi cd .. else svn checkout http://svn.apache.org/repos/asf/$repos; fi done

A.3 GNOME Git Checkout and Update

#!/bin/bash for repos in $(wget -qO- http://git.gnome.org/repositories.txt); do if [ -d $repos ]; then cd $repos if [ -d ".git" ]; then git pull --rebase fi cd .. else git clone git://git.gnome.org/$repos; fi done

A.4 Extracting Metadata from Apache DOAP files

#!/bin/bash EMAIL_ADD_REGEX="^[a-zA-Z0-9!#\$%&’*+/=?^_\‘{|}~-]+(\.[a-zA-Z0-9!#$%&’*+/=?^_ \‘{|}~-]+)*@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9]([a-zA-Z0 -9-]*[a-zA-Z0-9])?\$" for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [ -d ".svn" ]; then # get the first DOAP file that we find doapfile=$(find . -name "doa*.rdf" | head -1) # if zero-length string only write project name into database: if [ -z "$doapfile" ]; then echo "ERROR: No DOAP file found for $repos" mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO projects ( projectname) VALUES (’$repos’);" else OLD_IFS=${IFS} IFS =$ ’\n’ mailinglist_url=$(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/rdf:RDF/doap:Project/ doap:mailing-list/@rdf:resource" $doapfile;) issuetracker_url=$(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/rdf:RDF/doap:Project/ doap:bug-database/@rdf:resource" $doapfile;)

64 A.5 Extracting Metadata from GNOME DOAP files

EMAIL_ARRAY_COUNT=0 for i in $(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf="http ://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/rdf:RDF/doap:Project/doap: maintainer/foaf:Person/foaf:mbox/@rdf:resource" $doapfile) ; do maintainer_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1" done

EMAIL_ARRAY_COUNT=0 for i in $(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf="http ://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/rdf:RDF/doap:Project/doap: maintainer/foaf:Person/foaf:name" $doapfile) ; do maintainer_realname_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1" done

#Insert projects data here so we can reference to projectname when inserting in maintainers table mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO projects ( projectname, mailinglist_url, issuetracker_url) VALUES (’$repos’, ’ $mailinglist_url’, ’$issuetracker_url’);" IFS=${OLD_IFS}

for (( j = 0 ; j < ${#maintainer_array[@]} ; j++ )) do #Simple regex check for valid email addresses. if [[ ${maintainer_array[$j]#mailto\:} =~ $EMAIL_ADD_REGEX ]] then mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO maintainers ( projectname, maintainer_email_address, maintainer_realname) VALUES (’ $repos’, ’${maintainer_array[$j]#mailto\:}’, ’${maintainer_realname_array[ $j ]} ’) ;" else mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO maintainers ( projectname, maintainer_email_address, maintainer_realname) VALUES (’ $repos’, ’${maintainer_array[$j]#mailto\:}’, ’${maintainer_realname_array[ $j ]} ’) ;" echo "Maintainer email address ${maintainer_array[$j]#mailto\:} for $repos might be invalid." fi done # Flush the array content and length: unset maintainer_array unset maintainer_realname_array fi fi cd .. fi done

A.5 Extracting Metadata from GNOME DOAP files

#!/bin/bash EMAIL_ADD_REGEX="^[a-zA-Z0-9!#\$%&’*+/=?^_\‘{|}~-]+(\.[a-zA-Z0-9!#$%&’*+/=?^_ \‘{|}~-]+)*@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9]([a-zA-Z0 -9-]*[a-zA-Z0-9])?\$" for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [ -d ".git" ]; then # get the first DOAP file that we find

65 A Source Code

doapfile=$(find . -name "*.doap" | head -1) # if zero-length string only write project name into database: if [ -z "$doapfile" ]; then echo "ERROR: No DOAP file found for $repos" mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO projects ( projectname) VALUES (’$repos’);" else OLD_IFS=${IFS} IFS =$ ’\n’

MAILING_LIST_ARRAY_COUNT=0 for i in $(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf="http ://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/doap:Project/doap:mailing- list/@rdf:resource" $doapfile) ; do mailing_list_array[$MAILING_LIST_ARRAY_COUNT]="$i" let "MAILING_LIST_ARRAY_COUNT= $MAILING_LIST_ARRAY_COUNT + 1" done # Use the first mailing list URL that is found and drop any further: mailinglist_url=${mailing_list_array[0]}

if [[ "$mailinglist_url" =~ ^http.* ]] then http_code=$(curl -o /dev/null --silent --head --write-out ’%{http_code}\n’ $mailinglist_url) if [[ "$http_code" = "404" ]] || [[ "$http_code" = "000" ]] then echo "Mailing list URL $mailinglist_url for $repos might be invalid - HTTP status response is: $http_code" fi fi

ISSUE_TRACKER_ARRAY_COUNT=0 for i in $(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf="http ://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/doap:Project/doap:bug- database/@rdf:resource" $doapfile) ; do issue_tracker_array[$ISSUE_TRACKER_ARRAY_COUNT]="$i" let "ISSUE_TRACKER_ARRAY_COUNT= $ISSUE_TRACKER_ARRAY_COUNT + 1" done # Use the first issue tracker URL that is found and drop any further: issuetracker_url=${issue_tracker_array[0]}

if [[ "$issuetracker_url" =~ ^http.* ]] then http_code=$(curl -o /dev/null --silent --head --write-out ’%{http_code}\n’ $issuetracker_url) if [[ "$http_code" = "404" ]] || [[ "$http_code" = "000" ]] then echo "Issue tracker URL $issuetracker_url for $repos might be invalid - HTTP status response is: $http_code" fi fi

EMAIL_ARRAY_COUNT=0 for i in $(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf="http ://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/doap:Project/doap: maintainer/foaf:Person/foaf:mbox/@rdf:resource" $doapfile) ; do maintainer_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1" done

EMAIL_ARRAY_COUNT=0 for i in $(xmlstarlet sel -N doap="http://usefulinc.com/ns/doap#" -N rdf="http ://www.w3.org/1999/02/22-rdf-syntax-ns#" -t -v "/doap:Project/doap: maintainer/foaf:Person/gnome:userid" $doapfile) ; do maintainer_coderepo_id_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1"

66 A.6 Maintainer Information from Apache JIRA

done

#Insert projects data here so we can reference to projectname when inserting in maintainers table mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO projects ( projectname, mailinglist_url, issuetracker_url) VALUES (’$repos’, ’ $mailinglist_url’, ’$issuetracker_url’);" IFS=${OLD_IFS}

for (( j = 0 ; j < ${#maintainer_array[@]} ; j++ )) do #Simple regex check for valid email addresses. if [[ ${maintainer_array[$j]#mailto\:} =~ $EMAIL_ADD_REGEX ]] then mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO maintainers ( projectname, maintainer_email_address, maintainer_coderepo_id) VALUES (’ $repos’, ’${maintainer_array[$j]#mailto\:}’, ’${ maintainer_coderepo_id_array[$j]}’);" else mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO maintainers ( projectname, maintainer_email_address, maintainer_coderepo_id) VALUES (’ $repos’, ’${maintainer_array[$j]#mailto\:}’, ’${ maintainer_coderepo_id_array[$j]}’);" echo "Maintainer email address ${maintainer_array[$j]#mailto\:} for $repos might be invalid." fi done # Flush array content and length of arrays: unset maintainer_array unset maintainer_realname_array unset issue_tracker_array unset mailing_list_array fi fi cd .. fi done

A.6 Maintainer Information from Apache JIRA

#!/bin/bash for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [ -d ".svn" ]; then

# convert project name to uppercase letters, as per JIRA URLs projectname=$(echo "${repos^^}")

# get realname of project’s "lead": jira_lead_realname=$(curl --silent -u username:password -X GET -H ’Content-Type: application/json’ https://issues.apache.org/jira/rest/api/2/project/ $projectname | jsawk ’return this.lead.displayName’)

# get Committer User ID: jira_lead_user_id=$(curl --silent -u username:password -X GET -H ’Content-Type: application/json’ https://issues.apache.org/jira/rest/api/2/project/ $projectname | jsawk ’return this.lead.name’)

# get URL for details on user to get user’s email address

67 A Source Code

jira_user_details_url=$(curl --silent -u username:password -X GET -H ’Content- Type: application/json’ https://issues.apache.org/jira/rest/api/2/project/ $projectname | jsawk ’return this.lead.self’)

# get user email address: jira_lead_email_address=$(curl --silent -u username:password -X GET -H ’Content- Type: application/json’ $jira_user_details_url | jsawk ’return this. emailAddress ’) # replace literal "dot" and "at" in email addresses by "." and "@" jira_lead_email_address=$(echo ${jira_lead_email_address// dot /.}) jira_lead_email_address=$(echo ${jira_lead_email_address// at /@})

# check if already in database, if not add it: person_already_in_table=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT COUNT(*) FROM maintainers WHERE projectname = ’$repos’ AND maintainer_email_address = ’$jira_lead_email_address’"); # remove leading COUNT(*) string for easier comparison. person_already_in_table=$(echo ${person_already_in_table//COUNT(*)/})

if [ "$person_already_in_table" == "1" ]; then # only add JIRA ID mysql -h localhost -u user -e "USE unmaint_apache; UPDATE maintainers SET maintainer_jira_id = ’$jira_lead_user_id’ WHERE projectname = ’$repos’ AND maintainer_email_address = ’$jira_lead_email_address’;" else mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO maintainers ( projectname, maintainer_email_address, maintainer_realname, maintainer_jira_id) VALUES (’$repos’, ’$jira_lead_email_address’, ’ $jira_lead_realname’, ’$jira_lead_user_id’);" fi sleep 5 fi cd .. fi done # as it is complicated above to not create rows with # projectnames only (no 404 for missing projects # in JIRA etc.), remove them here again: mysql -h localhost -u user -e "USE unmaint_apache; DELETE FROM maintainers WHERE maintainer_email_address = ’’;"

A.7 Code Repository Activity Data in Apache

#!/bin/bash for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [ -d ".svn" ]; then # get generic non-personal activity date from the code repository and store into coderepos table: date_of_first_commit=$(svn log -r 1:HEAD --limit 1 --xml | grep "" | cut - b7 -16) date_of_last_commit=$(svn log --limit 1 --xml | grep "" | cut -b7-16) commits_in_12m=$(svn log -r {2011-11-01}:{2013-01-31} -q | grep "^r" | wc -l) committers_in_12m=$(svn log -r {2011-11-01}:{2013-01-31} -q | awk ’/^r/ {print $3 }’ | sort | uniq | wc -l) mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO coderepos ( projectname, date_of_first_commit, date_of_last_commit, commits_in_12m, committers_in_12m) VALUES (’$repos’, ’$date_of_first_commit’, ’ $date_of_last_commit’, ’$commits_in_12m’, ’$committers_in_12m’);"

68 A.8 Code Repository Activity Data in GNOME

# get activity for each maintainer listed and store it into maintainer table: # We cannot start with i=0 as that is the name of the table column so we drop the content into an array and then ignore the array’s first value by using [@]:1 in the loop condition: ARRAY_COUNT=0 for i in $(mysql -h localhost -u user -e "USE unmaint_apache; SELECT maintainer_jira_id FROM maintainers WHERE projectname = ’$repos’") ; do maintainer_array[$ARRAY_COUNT]="$i" let "ARRAY_COUNT= $ARRAY_COUNT + 1" done for i in ${maintainer_array[@]:1}; do if [ "$i" != "NULL" ]; then # must use "eval" here because of parameter expansion, see http://stackoverflow .com/questions/4668640/how-to-execute-command-stored-in-a-variable coderepo_commits_in_12m=$(eval "svn log -r {2011-11-01}:{2013-01-31} -q --xml | grep \"\" | grep \"$i\" | wc -l") mysql -h localhost -u user -e "USE unmaint_apache; UPDATE maintainers SET coderepo_commits_in_12m = ’$coderepo_commits_in_12m’ WHERE projectname = ’ $repos’ AND maintainer_jira_id = ’$i’;" fi done # Flush the array content and length: unset maintainer_array fi cd .. fi done

A.8 Code Repository Activity Data in GNOME

#!/bin/bash for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [ -d ".git" ]; then # make sure that Extended Globs are enabled to use -- !(po) shopt -s extglob # get generic non-personal activity date from the code repository and store into coderepos table: date_of_first_commit=$(git log --reverse --pretty=format:"%cd" --date=short | head -1) date_of_last_commit=$(git log -n 1 --pretty=format:"%cd" --date=short -- !(po)) commits_in_12m=$(git log --after=2011-11-01 --pretty=oneline -- !(po) | wc -l) committers_in_12m=$(git log --after=2011-11-01 --committer=’’ --pretty=format:"% ce" -- !(po) | sort -u | wc -l) authors_in_12m=$(git log --after=2011-11-01 --author=’’ --pretty=format:"%ae" -- !(po) | sort -u | wc -l) mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO coderepos ( projectname, date_of_first_commit, date_of_last_commit, commits_in_12m, committers_in_12m, authors_in_12m) VALUES (’$repos’, ’$date_of_first_commit’, ’$date_of_last_commit’, ’$commits_in_12m’, ’$committers_in_12m’, ’ $authors_in_12m ’);"

# get activity for each maintainer listed and store it into maintainer table:

# We cannot start with i=0 as that is the name of the table column so we drop the content into an array and then ignore the array’s first value by using [@]:1 in the loop condition: ARRAY_COUNT=0

69 A Source Code

for i in $(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT maintainer_email_address FROM maintainers WHERE projectname = ’$repos’") ; do maintainer_array[$ARRAY_COUNT]="$i" let "ARRAY_COUNT= $ARRAY_COUNT + 1" done for i in ${maintainer_array[@]:1}; do # must use "eval" here because of parameter expansion, see http://stackoverflow. com/questions/4668640/how-to-execute-command-stored-in-a-variable coderepo_commits_in_12m=$(eval "git log --after=2011-11-01 --author=’$i’ -- pretty=format:\"%ae\" -- !(po) | wc -l") mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE maintainers SET coderepo_commits_in_12m = ’$coderepo_commits_in_12m’ WHERE projectname = ’ $repos’ AND maintainer_email_address = ’$i’;" done # Flush the array content and length: unset maintainer_array fi cd .. fi done

A.9 Code Repository Activity Rating in Apache

#!/bin/bash

for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [[ ( -d ".git" || -d ".svn" ) ]]; then mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO ratings ( projectname, coderepo_score) VALUES (’$repos’, ’0’);"

coderepo_commits_in_12m=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT commits_in_12m FROM coderepos WHERE projectname = ’$repos’;"); # remove column header string for comparison: coderepo_commits_in_12m=$(echo ${coderepo_commits_in_12m//commits_in_12m/}) if [ "$coderepo_commits_in_12m" == "0" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 5 WHERE projectname = ’$repos’;" elif [ "$coderepo_commits_in_12m" -le "5" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 2 WHERE projectname = ’$repos’;" elif [ "$coderepo_commits_in_12m" -le "20" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

coderepo_committers_in_12m=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT committers_in_12m FROM coderepos WHERE projectname = ’$repos’;"); # remove column header string for comparison: coderepo_committers_in_12m=$(echo ${coderepo_committers_in_12m//committers_in_12m /}) if [ "$coderepo_committers_in_12m" == "1" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 3 WHERE projectname = ’$repos’;" elif [ "$coderepo_committers_in_12m" == "2" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

70 A.10 Code Repository Activity Rating in GNOME

number_of_maintainers=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT COUNT(*) FROM maintainers WHERE projectname = ’$repos’;"); # remove leading COUNT(*) string for easier comparison. number_of_maintainers=$(echo ${number_of_maintainers//COUNT(*)/}) if [ "$number_of_maintainers" == "0" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 2 WHERE projectname = ’$repos’;" elif [ "$number_of_maintainers" == "1" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

inactive_maintainers=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT COUNT(*) FROM maintainers WHERE projectname = ’$repos’ AND coderepo_commits_in_12m = ’0’;"); # remove leading COUNT(*) string for easier comparison. inactive_maintainers=$(echo ${inactive_maintainers//COUNT(*)/}) if [ "$number_of_maintainers" == "$inactive_maintainers" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 2 WHERE projectname = ’$repos’;" elif [ "$inactive_maintainers" -gt 0 ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi fi cd .. fi done

A.10 Code Repository Activity Rating in GNOME

#!/bin/bash

for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [[ ( -d ".git" || -d ".svn" ) ]]; then mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO ratings ( projectname, coderepo_score) VALUES (’$repos’, ’0’);"

coderepo_commits_in_12m=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT commits_in_12m FROM coderepos WHERE projectname = ’$repos’;"); # remove column header string for comparison: coderepo_commits_in_12m=$(echo ${coderepo_commits_in_12m//commits_in_12m/}) if [ "$coderepo_commits_in_12m" == "0" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 5 WHERE projectname = ’$repos’;" elif [ "$coderepo_commits_in_12m" -le "5" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 2 WHERE projectname = ’$repos’;" elif [ "$coderepo_commits_in_12m" -le "20" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

coderepo_committers_in_12m=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT committers_in_12m FROM coderepos WHERE projectname = ’$repos’;"); # remove column header string for comparison:

71 A Source Code

coderepo_committers_in_12m=$(echo ${coderepo_committers_in_12m//committers_in_12m /}) if [ "$coderepo_committers_in_12m" == "1" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 3 WHERE projectname = ’$repos’;" elif [ "$coderepo_committers_in_12m" == "2" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

number_of_maintainers=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT COUNT(*) FROM maintainers WHERE projectname = ’$repos’;"); # remove leading COUNT(*) string for easier comparison. number_of_maintainers=$(echo ${number_of_maintainers//COUNT(*)/}) if [ "$number_of_maintainers" == "0" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 2 WHERE projectname = ’$repos’;" elif [ "$number_of_maintainers" == "1" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

inactive_maintainers=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT COUNT(*) FROM maintainers WHERE projectname = ’$repos’ AND coderepo_commits_in_12m = ’0’;"); # remove leading COUNT(*) string for easier comparison. inactive_maintainers=$(echo ${inactive_maintainers//COUNT(*)/}) if [ "$number_of_maintainers" == "$inactive_maintainers" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 2 WHERE projectname = ’$repos’;" elif [ "$inactive_maintainers" -gt 0 ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi

#GNOME only due to Git difference between author and committer: number_of_authors=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT authors_in_12m FROM coderepos WHERE projectname = ’$repos’;"); number_of_authors=$(echo ${number_of_authors//authors_in_12m/}) number_of_committers=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT committers_in_12m FROM coderepos WHERE projectname = ’$repos’;"); number_of_committers=$(echo ${number_of_committers//committers_in_12m/}) if [ "$number_of_authors" == "$number_of_committers" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET coderepo_score = coderepo_score + 1 WHERE projectname = ’$repos’;" fi fi cd .. fi done

A.11 Issue Tracker Activity Data in Apache

#!/bin/bash

DEADLINE="2011-11-01"

ISSUETRACKER_URL_APACHE_JIRA_REGEX_GOOD="^https?://issues.apache.org/jira/(browse /.+|secure/BrowseProject.jspa\?id\=[0-9]+)\$"

72 A.11 Issue Tracker Activity Data in Apache

ISSUETRACKER_URL_APACHE_BUGZILLA_REGEX_GOOD="^https?://issues.apache.org/bugzilla/.+ product\=.+\$"

ISSUETRACKER_URL_REGEX_EMPTY="(^\$|NULL)"

SCORE_MIN="5" SCORE_MAX="7" for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [[ ( -d ".git" || -d ".svn" ) ]]; then echo $repos coderepo_score=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT coderepo_score FROM ratings WHERE projectname = ’$repos’;"); coderepo_score=$(echo ${coderepo_score//coderepo_score/}) if [[ "$coderepo_score" -ge $SCORE_MIN ]] && [[ "$coderepo_score" -le $SCORE_MAX ]]; then issuetracker_url=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT issuetracker_url FROM projects WHERE projectname = ’$repos’"); issuetracker_url=$(echo ${issuetracker_url//issuetracker_url/})

# compare to regex above so we analyze: if [[ $issuetracker_url =~ $ISSUETRACKER_URL_APACHE_JIRA_REGEX_GOOD ]]; then # For JIRA */browse/* URLs, get product name by removing everything in front of URL: projectname_jira=$(echo $issuetracker_url | sed -r ’s#(.+/browse/)##g’) # For JIRA */secure/* URLs, get project ID by removing everything in front of ID: projectname_jira=$(echo $projectname_jira | sed -r ’s#(.+secure/BrowseProject\. jspa\?id\=)##g’) elif [[ $issuetracker_url =~ $ISSUETRACKER_URL_APACHE_BUGZILLA_REGEX_GOOD ]]; then # For Bugzilla URLs, get project name by removing everything in front of name: projectname_bugzilla=$(echo $issuetracker_url | sed -r ’s#(^https?://issues. apache.org/bugzilla/.+product\=)##g’) elif [[ $issuetracker_url =~ $ISSUETRACKER_URL_REGEX_EMPTY ]]; then # If issuetracker_url is NULL or empty, try querying JIRA by using repository name. First, check # if a product browse page for the product exists: project_browsepage=$(w3m -no-cookie -T text/html -dump https://issues.apache. org/jira/browse/$repos) sleep 15; if [[ "$project_browsepage" != *"Project Does Not Exist"* ]]; then projectname_jira=$repos else echo "No project $repos found in JIRA." fi fi

# if projectname is still empty: opt out, else: run queries: if [ -z "$projectname_jira" ] && [ -z "$projectname_bugzilla" ]; then echo "$repos issuetracker_url either does not fit regex or was empty. Hence no issuetracker data available."

###### JIRA: (Query for maintainer_realname) ###### elif [ -n "$projectname_jira" ]; then echo "JIRA issuetracker_url found!" mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO issuetrackers ( projectname) VALUES (’$repos’);" sleep 2;

# $repos instead of $projectname_jira is used as project key can be different from project name (e.g.in case of Forrest) fixed_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/jira /rest/api/2/search?jql=resolved\>=2011-11-01+and+resolution=fixed+and+

73 A Source Code

project=$repos\&fields=summary\&maxResults=10000 | jsawk ’return this.total ’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET fixed_in_12m = ’$fixed_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

# Number of reports with any changes in the last 12 months: changed_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/ jira/rest/api/2/search?jql=updated\>=2011-11-01+and+project=$repos\&fields= summary\&maxResults=10000 | jsawk ’return this.total’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET changed_in_12m = ’$changed_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

#New reports filed in last 12 months: reported_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/ jira/rest/api/2/search?jql=created\>=2011-11-01+and+project=$repos\&fields= summary\&maxResults=10000 | jsawk ’return this.total’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET reported_in_12m = ’$reported_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

#Number of unresolved tickets: all_open=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/jira/ rest/api/2/search?jql=project=$repos+and+\(status=\"Patch+Available\"+or+ status=Open+or+status=Reopened+or+status=\"In+progress\"\)\&fields=summary \&maxResults=10000 | jsawk ’return this.total’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET all_open = ’$all_open’ WHERE projectname = ’$repos’;" sleep 15;

#Maintainer email addresses for project: OLD_IFS=${IFS} IFS =$ ’\n’ EMAIL_ARRAY_COUNT=0 for i in $(mysql -h localhost -u user -e "USE unmaint_apache; SELECT maintainer_realname FROM maintainers WHERE projectname = ’$repos’;") ; do # Replace spaces in $i by + so JQL is happy: i=$(echo ${i// /+}) maintainer_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1" done IFS=${OLD_IFS} for i in ${maintainer_array[@]:1}; do # reports filed by maintainer in issue tracker in 12 months: reported_by_maint_in_12m=$(curl --silent -u username:password -X GET -H \’ Content-Type: application/json\’ https://issues.apache.org/jira/rest/api /2/search?jql=created\>=2011-11-01+and+project=$repos+and+reporter=\"$i \"\&fields=summary\&maxResults=10000 | jsawk ’return this.total’) sleep 9 mysql -h localhost -u user -e "USE unmaint_apache; UPDATE maintainers SET issuetracker_reports_in_12m = ’$reported_by_maint_in_12m’ WHERE projectname = ’$repos’ AND maintainer_realname = ’$i’;" done

###### BUGZILLA: (Query for maintainer_email_address) ###### elif [ -n "$projectname_bugzilla" ]; then echo "Bugzilla issuetracker_url found!" mysql -h localhost -u user -e "USE unmaint_apache; INSERT INTO issuetrackers ( projectname) VALUES (’$repos’);"

# Reports closed as FIXED: Query for reports that were changed to # resolution RESOLVED since $DEADLINE and are have status FIXED. # print only lines with "xx bugs found." | remove "bugs found." string | # remove duplicate lines as Bugzilla sometimes prints it twice | # replace literal zero and one strings by integers

74 A.11 Issue Tracker Activity Data in Apache

fixed_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/ bugzilla/buglist.cgi?chfieldto=Now\&chfield=bug_status\&chfieldfrom= $DEADLINE\&chfieldvalue=RESOLVED\&resolution=FIXED\&product= $projectname_bugzilla | sed -re ’/ (bugs?|Boogs) found./!d; s/ (bugs?|Boogs ) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro/0/;s/One /1/ ’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET fixed_in_12m = ’$fixed_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

# Number of reports with any changes in the last 12 months: changed_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/ bugzilla/buglist.cgi?chfieldto=Now\&chfieldfrom=$DEADLINE\&product= $projectname_bugzilla | sed -re ’/ (bugs?|Boogs) found./!d; s/ (bugs?|Boogs ) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro/0/;s/One /1/ ’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET changed_in_12m = ’$changed_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

#New reports filed in last 12 months: reported_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/ bugzilla/buglist.cgi?chfieldto=Now\&chfield=\[Bug\%20creation\]\& chfieldfrom=$DEADLINE\&product=$projectname_bugzilla | sed -re ’/ (bugs?| Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET reported_in_12m = ’$reported_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

#New reports filed in last 12 months: reported_in_12m=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/ bugzilla/buglist.cgi?chfieldto=Now\&chfield=\[Bug\%20creation\]\& chfieldfrom=$DEADLINE\&product=$projectname_bugzilla | sed -re ’/ (bugs?| Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET reported_in_12m = ’$reported_in_12m’ WHERE projectname = ’$repos’;" sleep 15;

#Number of unresolved tickets: all_open=$(w3m -no-cookie -T text/html -dump https://issues.apache.org/bugzilla /buglist.cgi?bug_status=UNCONFIRMED\&bug_status=NEW\&bug_status=ASSIGNED\& bug_status=REOPENED\&bug_status=NEEDINFO\&product=$projectname_bugzilla | sed -re ’/ (bugs?|Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’) mysql -h localhost -u user -e "USE unmaint_apache; UPDATE issuetrackers SET all_open = ’$all_open’ WHERE projectname = ’$repos’;" sleep 15;

#Maintainer email addresses for project: EMAIL_ARRAY_COUNT=0 for i in $(mysql -h localhost -u user -e "USE unmaint_apache; SELECT maintainer_email_address FROM maintainers WHERE projectname = ’$repos’;") ; do maintainer_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1" done for i in ${maintainer_array[@]:1}; do # reports filed by maintainer in issue tracker in 12 months: reported_by_maint_in_12m=$(w3m -no-cookie -T text/html -dump https://issues. apache.org/bugzilla/buglist.cgi?chfieldto=Now\&query_format=advanced\& chfield=\[Bug\%20creation\]\&emailreporter1=1\&chfieldfrom=$DEADLINE\& email1=$i\&product=$projectname_bugzilla\&emailtype1=exact | sed -re ’/ ( bugs?|Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n \1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’)

75 A Source Code

sleep 15; # if $reported_by_maint_in_12m is empty it means that it is not a valid username. Set -1 in that case: if [ -z "$reported_by_maint_in_12m" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE maintainers SET issuetracker_reports_in_12m = ’-1’ WHERE projectname = ’$repos’ AND maintainer_email_address = ’$i’;" else mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE maintainers SET issuetracker_reports_in_12m = ’$reported_by_maint_in_12m’ WHERE projectname = ’$repos’ AND maintainer_email_address = ’$i’;" fi done fi

fi fi # Flush array and values: unset maintainer_array unset project_browsepage unset reported_in_12m unset changed_in_12m unset fixed_in_12m unset all_open unset projectname_jira unset projectname_bugzilla cd .. fi done

A.12 Issue Tracker Activity Data in GNOME

#!/bin/bash

DEADLINE="2011-11-01"

ISSUETRACKER_URL_GNOME_REGEX_GOOD="^https?://bugzilla\.gnome\.org/(enter_bug|browse) \.cgi\?product=.+\$" ISSUETRACKER_URL_REGEX_EMPTY="^\$|NULL)"

SCORE_MIN="5" SCORE_MAX="7"

for repos in $( ls ); do if [ -d $repos ]; then cd $repos if [[ ( -d ".git" || -d ".svn" ) ]]; then coderepo_score=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT coderepo_score FROM ratings WHERE projectname = ’$repos’;"); coderepo_score=$(echo ${coderepo_score//coderepo_score/}) if [[ "$coderepo_score" -ge $SCORE_MIN ]] && [[ "$coderepo_score" -le $SCORE_MAX ]]; then issuetracker_url=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT issuetracker_url FROM projects WHERE projectname = ’$repos’"); issuetracker_url=$(echo ${issuetracker_url//issuetracker_url/})

# compare to regex above so we analyze: if [[ $issuetracker_url =~ $ISSUETRACKER_URL_GNOME_REGEX_GOOD ]]; then # Remove everything in front of URL except for product name:

76 A.12 Issue Tracker Activity Data in GNOME

projectname=$(echo $issuetracker_url | sed -r ’s#(^https?://bugzilla\.gnome\. org/(enter_bug|browse)\.cgi\?product=)##g’) # Remove potential noise after product name starting with %26, after manual examination of issuetracker URLs: projectname=$(echo $projectname | sed -r ’s#(\%26.+)##g’) elif [[ $issuetracker_url =~ $ISSUETRACKER_URL_REGEX_EMPTY ]]; then # If issuetracker_url is NULL or empty, try querying issuetracker by using repository name. First, check # if a product browse page for the product exists, because Bugzilla also returns "0 bugs found" for non-existing products. project_browsepage=$(w3m -no-cookie -T text/html -dump https://bugzilla.gnome. org/browse.cgi?product=$repos) sleep 15; if [[ "$project_browsepage" != *"Sorry, either the product"* ]]; then projectname=$repos fi fi

# if projectname is still empty: opt out, else: run queries: if [ -z "$projectname" ]; then echo "$repos issuetracker_url either does not fit regex or was empty. Hence no issuetracker data available." else #If it exists, run some queries:

mysql -h localhost -u user -e "USE unmaint_gnome; INSERT INTO issuetrackers ( projectname) VALUES (’$repos’);"

# Reports closed as FIXED: Query for reports that were changed to # resolution RESOLVED since $DEADLINE and are have status FIXED. # print only lines with "xx bugs found." | remove "bugs found." string | # remove duplicate lines as Bugzilla sometimes prints it twice | # replace literal zero and one strings by integers fixed_in_12m=$(w3m -no-cookie -T text/html -dump https://bugzilla.gnome.org/ buglist.cgi?chfieldto=Now\&chfield=bug_status\&chfieldfrom=$DEADLINE\& chfieldvalue=RESOLVED\&resolution=FIXED\&product=$projectname | sed -re ’/ (bugs?|Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n \1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’)

mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE issuetrackers SET fixed_in_12m = ’$fixed_in_12m’ WHERE projectname = ’$repos’;" sleep 10;

# Number of reports with any changes in the last 12 months: changed_in_12m=$(w3m -no-cookie -T text/html -dump https://bugzilla.gnome.org/ buglist.cgi?chfieldto=Now\&chfieldfrom=$DEADLINE\&product=$projectname | sed -re ’/ (bugs?|Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’)

mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE issuetrackers SET changed_in_12m = ’$changed_in_12m’ WHERE projectname = ’$repos’;" sleep 10;

#New reports filed in last 12 months: reported_in_12m=$(w3m -no-cookie -T text/html -dump https://bugzilla.gnome.org/ buglist.cgi?chfieldto=Now\&chfield=\[Bug\%20creation\]\&chfieldfrom= $DEADLINE\&product=$projectname | sed -re ’/ (bugs?|Boogs) found./!d; s/ ( bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro /0/;s/One/1/’)

mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE issuetrackers SET reported_in_12m = ’$reported_in_12m’ WHERE projectname = ’$repos’;" sleep 10;

#Number of unresolved tickets:

77 A Source Code

all_open=$(w3m -no-cookie -T text/html -dump https://bugzilla.gnome.org/buglist .cgi?bug_status=UNCONFIRMED\&bug_status=NEW\&bug_status=ASSIGNED\& bug_status=REOPENED\&bug_status=NEEDINFO\&product=$projectname | sed -re ’/ (bugs?|Boogs) found./!d; s/ (bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n \1$/!P; D’ | sed -e ’s/Zarro/0/;s/One/1/’)

mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE issuetrackers SET all_open = ’$all_open’ WHERE projectname = ’$repos’;" sleep 10;

#Maintainer email addresses for project: EMAIL_ARRAY_COUNT=0 for i in $(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT maintainer_email_address FROM maintainers WHERE projectname = ’$repos’;") ; do maintainer_array[$EMAIL_ARRAY_COUNT]="$i" let "EMAIL_ARRAY_COUNT= $EMAIL_ARRAY_COUNT + 1" done for i in ${maintainer_array[@]:1}; do # reports filed by maintainer in issue tracker in 12 months: reported_by_maint_in_12m=$(w3m -no-cookie -T text/html -dump https://bugzilla. gnome.org/buglist.cgi?chfieldto=Now\&query_format=advanced\&chfield=\[Bug \%20creation\]\&emailreporter1=1\&chfieldfrom=$DEADLINE\&email1=$i\&product =$projectname\&emailtype1=exact | sed -re ’/ (bugs?|Boogs) found./!d; s/ ( bugs?|Boogs) found.//’ | sed ’$!N; /^\(.*\)\n\1$/!P; D’ | sed -e ’s/Zarro /0/;s/One/1/’) sleep 9 # if $reported_by_maint_in_12m is empty it means that it is not a valid username. Set -1 in that case: if [ -z "$reported_by_maint_in_12m" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE maintainers SET issuetracker_reports_in_12m = ’-1’ WHERE projectname = ’$repos’ AND maintainer_email_address = ’$i’;" else mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE maintainers SET issuetracker_reports_in_12m = ’$reported_by_maint_in_12m’ WHERE projectname = ’$repos’ AND maintainer_email_address = ’$i’;" fi done fi fi fi # Flush array and values: unset maintainer_array unset projectname unset project_browsepage unset reported_in_12m unset changed_in_12m unset fixed_in_12m cd .. fi done

A.13 Issue Tracker Activity Rating in Apache

#!/bin/bash

SCORE_MIN="5" SCORE_MAX="7"

78 A.13 Issue Tracker Activity Rating in Apache

# get list of projectname between score_min score_max: PROJECT_ARRAY_COUNT=0 for i in $(mysql -h localhost -u user -e "USE unmaint_apache; SELECT issuetrackers. projectname FROM issuetrackers INNER JOIN ratings ON ratings.projectname = issuetrackers.projectname WHERE ratings.coderepo_score BETWEEN ’$SCORE_MIN’ AND ’$SCORE_MAX’;") ; do projects_array[$PROJECT_ARRAY_COUNT]="$i" let "PROJECT_ARRAY_COUNT= $PROJECT_ARRAY_COUNT + 1" done for repos in ${projects_array[@]:1}; do echo $repos cd $repos

all_open=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT all_open FROM issuetrackers WHERE projectname = ’$repos’;") all_open=$(echo ${all_open//all_open/}) echo " +-all_open: " $all_open

reported_in_12m=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT reported_in_12m FROM issuetrackers WHERE projectname = ’$repos’;") reported_in_12m=$(echo ${reported_in_12m//reported_in_12m/}) echo " +-reported_in_12m:" $reported_in_12m

fixed_in_12m=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT fixed_in_12m FROM issuetrackers WHERE projectname = ’$repos’;") fixed_in_12m=$(echo ${fixed_in_12m//fixed_in_12m/}) echo " +-fixed_in_12m: " $fixed_in_12m

changed_in_12m=$(mysql -h localhost -u user -e "USE unmaint_apache; SELECT changed_in_12m FROM issuetrackers WHERE projectname = ’$repos’;") changed_in_12m=$(echo ${changed_in_12m//changed_in_12m/}) echo " +-changed_in_12m: " $changed_in_12m

# no activity at all: if [ "$fixed_in_12m" -le "0" ] && [ "$changed_in_12m" -le "0" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET issuetracker_score = 3 WHERE projectname = ’$repos’;" echo"+--> +3" elif [ "$fixed_in_12m" -le "0" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET issuetracker_score = 2 WHERE projectname = ’$repos’;" echo"+--> +2" # some activity at all of smaller project, plus keeps the bugtracker clean: elif [ "$all_open" -le "0" ] && [ "$fixed_in_12m" -ge "1" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET issuetracker_score = -1 WHERE projectname = ’$repos’;" echo"+--> -1" #division by zero already covered by condition before. # high activity: elif [ "$fixed_in_12m" -gt "0" ]; then ratio=$((all_open / fixed_in_12m)) echo "+-ratio: " $ratio #hig activity: if [ "$ratio" -le "5" ]; then mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET issuetracker_score = -2 WHERE projectname = ’$repos’;" echo"+--> -3" # low activity: else [ "$ratio" -ge "10" ] mysql -h localhost -u user -e "USE unmaint_apache; UPDATE ratings SET issuetracker_score = 1 WHERE projectname = ’$repos’;" echo"+--> +1" fi fi cd .. unset ratio

79 A Source Code

done

A.14 Issue Tracker Activity Rating in GNOME

#!/bin/bash

SCORE_MIN="5" SCORE_MAX="7"

# get list of projectname between score_min score_max: PROJECT_ARRAY_COUNT=0 for i in $(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT issuetrackers. projectname FROM issuetrackers INNER JOIN ratings ON ratings.projectname = issuetrackers.projectname WHERE ratings.coderepo_score BETWEEN ’$SCORE_MIN’ AND ’$SCORE_MAX’;") ; do projects_array[$PROJECT_ARRAY_COUNT]="$i" let "PROJECT_ARRAY_COUNT= $PROJECT_ARRAY_COUNT + 1" done for repos in ${projects_array[@]:1}; do echo $repos cd $repos

all_open=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT all_open FROM issuetrackers WHERE projectname = ’$repos’;") all_open=$(echo ${all_open//all_open/}) echo " +-all_open: " $all_open

reported_in_12m=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT reported_in_12m FROM issuetrackers WHERE projectname = ’$repos’;") reported_in_12m=$(echo ${reported_in_12m//reported_in_12m/}) echo " +-reported_in_12m:" $reported_in_12m

fixed_in_12m=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT fixed_in_12m FROM issuetrackers WHERE projectname = ’$repos’;") fixed_in_12m=$(echo ${fixed_in_12m//fixed_in_12m/}) echo " +-fixed_in_12m: " $fixed_in_12m

changed_in_12m=$(mysql -h localhost -u user -e "USE unmaint_gnome; SELECT changed_in_12m FROM issuetrackers WHERE projectname = ’$repos’;") changed_in_12m=$(echo ${changed_in_12m//changed_in_12m/}) echo " +-changed_in_12m: " $changed_in_12m

# no activity at all: if [ "$fixed_in_12m" -le "0" ] && [ "$changed_in_12m" -le "0" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET issuetracker_score = 3 WHERE projectname = ’$repos’;" echo"+--> +3" elif [ "$fixed_in_12m" -le "0" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET issuetracker_score = 2 WHERE projectname = ’$repos’;" echo"+--> +2" # some activity at all of smaller project, plus keeps the bugtracker clean: elif [ "$all_open" -le "0" ] && [ "$fixed_in_12m" -ge "1" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET issuetracker_score = -1 WHERE projectname = ’$repos’;" echo"+--> -1" #division by zero already covered by condition before. # high activity: elif [ "$fixed_in_12m" -gt "0" ]; then ratio=$((all_open / fixed_in_12m))

80 A.14 Issue Tracker Activity Rating in GNOME

echo "+-ratio: " $ratio #hig activity: if [ "$ratio" -le "5" ]; then mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET issuetracker_score = -2 WHERE projectname = ’$repos’;" echo"+--> -3" # low activity: else [ "$ratio" -ge "10" ] mysql -h localhost -u user -e "USE unmaint_gnome; UPDATE ratings SET issuetracker_score = 1 WHERE projectname = ’$repos’;" echo"+--> +1" fi fi cd .. unset ratio done

81 B List of Projects by Maintenance Rating

B.1 Apache: ratings mysql> SELECT projectname,coderepo_score,issuetracker_score FROM ratings ORDER BY IFNULL(coderepo_score + issuetracker_score, coderepo_score); +------+------+------+ | projectname | coderepo_score | issuetracker_score | +------+------+------+ | nutch | 1 | NULL | | gump | 1 | NULL | | gora | 1 | NULL | | giraph | 1 | NULL | | geronimo | 1 | NULL | | shiro | 1 | NULL | | felix | 1 | NULL | | sling | 1 | NULL | | | 1 | NULL | | stanbol | 1 | NULL | | comdev | 1 | NULL | | santuario | 1 | NULL | | hbase | 1 | NULL | | mahout | 1 | NULL | | lucene | 1 | NULL | | openejb | 1 | NULL | | karaf | 1 | NULL | | pdfbox | 1 | NULL | | james | 1 | NULL | | pivot | 1 | NULL | | isis | 1 | NULL | | rave | 1 | NULL | | hive | 1 | NULL | | cxf | 1 | NULL | | wicket | 1 | NULL | | zookeeper | 1 | NULL | | bval | 1 | NULL | | buildr | 1 | NULL | | bigtop | 1 | NULL | | | 1 | NULL | | vcl | 1 | NULL | | openjpa | 1 | NULL | | any23 | 1 | NULL | | ace | 1 | NULL | | thrift | 1 | NULL | | tapestry | 1 | NULL | | maven | 2 | NULL | | directmemory | 2 | NULL | | river | 2 | NULL | | juddi | 2 | NULL | | aries | 2 | NULL | | oodt | 2 | NULL | | velocity | 2 | NULL | | myfaces | 2 | NULL | | lucy | 2 | NULL | | pig | 2 | NULL | | camel | 2 | NULL | | xalan | 3 | NULL | | oozie | 3 | NULL | | opennlp | 3 | NULL | | xmlgraphics | 3 | NULL | | xerces | 3 | NULL | | openwebbeans | 3 | NULL | | roller | 3 | NULL | | stdcxx | 3 | NULL | | tcl | 3 | NULL | | tika | 3 | NULL | | tomcat | 3 | NULL | | sis | 3 | NULL | | trafficserver | 3 | NULL | | turbine | 3 | NULL | | servicemix | 3 | NULL | | tuscany | 3 | NULL | | qpid | 3 | NULL | | portals | 3 | NULL | | poi | 3 | NULL | | planet | 3 | NULL | | synapse | 3 | NULL |

82 B.2 GNOME: ratings

| mrunit | 3 | NULL | | mina | 3 | NULL | | avro | 3 | NULL | | chemistry | 3 | NULL | | hama | 3 | NULL | | cocoon | 3 | NULL | | flume | 3 | NULL | | couchdb | 3 | NULL | | empire-db | 3 | NULL | | directory | 3 | NULL | | activemq | 3 | NULL | | lenya | 3 | NULL | | libcloud | 3 | NULL | | labs | 3 | NULL | | logging | 3 | NULL | | abdera | 3 | NULL | | accumulo | 3 | NULL | | manifoldcf | 3 | NULL | | jena | 3 | NULL | | subversion | 4 | NULL | | continuum | 4 | NULL | | struts | 4 | NULL | | xml | 4 | NULL | | concom | 4 | NULL | | lucene.net | 4 | NULL | | click | 4 | NULL | | tiles | 4 | NULL | | cayenne | 4 | NULL | | webservices | 4 | NULL | | apr | 4 | NULL | | ant | 4 | NULL | | spamassassin | 4 | NULL | | db | 4 | NULL | | commons | 4 | NULL | | jakarta | 4 | NULL | | jackrabbit | 4 | NULL | | infrastructure | 4 | NULL | | perl | 4 | NULL | | httpd | 4 | NULL | | jmeter | 4 | NULL | | httpcomponents | 4 | NULL | | hadoop | 4 | NULL | | creadur | 4 | NULL | | | 4 | NULL | | steve | 4 | NULL | | xmlbeans | 5 | NULL | | forrest | 5 | 1 | | attic | 7 | -1 | | esme | 5 | 1 | | harmony | 6 | 2 | | ibatis | 8 | NULL | | shale | 8 | NULL | | excalibur | 8 | NULL | | avalon | 8 | NULL | | hivemind | 8 | NULL | | beehive | 8 | NULL | | quetzalcoatl | 9 | NULL | +------+------+------+

B.2 GNOME: ratings mysql> SELECT projectname, coderepo_score, issuetracker_score FROM ratings ORDER BY IFNULL(coderepo_score + issuetracker_score, coderepo_score); +------+------+------+ | projectname | coderepo_score | issuetracker_score | +------+------+------+ | gnome-menus | 0 | NULL | | glade | 0 | NULL | | eog | 0 | NULL | | -introspection | 0 | NULL | | gnome-common | 0 | NULL | | gnome-control-center | 0 | NULL | | gnome-system-monitor | 0 | NULL | | cogl | 0 | NULL | | | 0 | NULL | | totem | 0 | NULL | | gnome-settings-daemon | 0 | NULL | | glabels | 0 | NULL | | damned-lies | 0 | NULL | | libpeas | 0 | NULL | | jhbuild | 0 | NULL | | | 0 | NULL | | gnome-devel-docs | 1 | NULL | | orca | 1 | NULL |

83 B List of Projects by Maintenance Rating

| | 1 | NULL | | gcr | 1 | NULL | | gnome-desktop | 1 | NULL | | ostree | 1 | NULL | | planner | 1 | NULL | | gnome-contacts | 1 | NULL | | gnome-disk-utility | 1 | NULL | | pygobject | 1 | NULL | | network-manager-applet | 1 | NULL | | gnome-mines | 1 | NULL | | frogr | 1 | NULL | | network-manager-openconnect | 1 | NULL | | network-manager-openvpn | 1 | NULL | | gnome-klotski | 1 | NULL | | -pixbuf | 1 | NULL | | gnome-games | 1 | NULL | | f-spot | 1 | NULL | | gnome-documents | 1 | NULL | | network-manager-vpnc | 1 | NULL | | gnome-commander | 1 | NULL | | gjs | 1 | NULL | | gitg | 1 | NULL | | -help-2 | 1 | NULL | | giggle | 1 | NULL | | ghex | 1 | NULL | | gnome-ostree | 1 | NULL | | pinpoint | 1 | NULL | | | 1 | NULL | | gedit-plugins | 1 | NULL | | gedit | 1 | NULL | | glib | 1 | NULL | | gnome-color-manager | 1 | NULL | | gnome-clocks | 1 | NULL | | gdm | 1 | NULL | | gnome-chess | 1 | NULL | | gnome-boxes | 1 | NULL | | gnome-bluetooth | 1 | NULL | | glom | 1 | NULL | | glib-networking | 1 | NULL | | glibmm | 1 | NULL | | gedit-latex | 1 | NULL | | gnome- | 1 | NULL | | latexila | 1 | NULL | | gtk-osx | 1 | NULL | | gtkmm-documentation | 1 | NULL | | gtkmm | 1 | NULL | | gtk-mac-integration | 1 | NULL | | libsoup | 1 | NULL | | gtkhtml | 1 | NULL | | lightsoff | 1 | NULL | | gtk-doc | 1 | NULL | | gtk+ | 1 | NULL | | | 1 | NULL | | gtksourceview | 1 | NULL | | gtk-web | 1 | NULL | | gtranslator | 1 | NULL | | libgd | 1 | NULL | | json-glib | 1 | NULL | | libgda | 1 | NULL | | libgdata | 1 | NULL | | libgee | 1 | NULL | | iagno | 1 | NULL | | libgweather | 1 | NULL | | library-web | 1 | NULL | | librest | 1 | NULL | | libsecret | 1 | NULL | | gsettings-desktop-schemas | 1 | NULL | | grilo-plugins | 1 | NULL | | gnome-shell | 1 | NULL | | nautilus | 1 | NULL | | gnome-session | 1 | NULL | | gnome-screenshot | 1 | NULL | | nautilus-actions | 1 | NULL | | pyatspi2 | 1 | NULL | | nautilus-sendto | 1 | NULL | | gnome-system-log | 1 | NULL | | | 1 | NULL | | gnome-photos | 1 | NULL | | | 1 | NULL | | gnome-sudoku | 1 | NULL | | gnome-terminal | 1 | NULL | | grilo | 1 | NULL | | goobox | 1 | NULL | | | 1 | NULL | | libchamplain | 1 | NULL | | gnome-web-www | 1 | NULL | | mobile-broadband-provider-info | 1 | NULL | | gnome-user-docs | 1 | NULL | | gnome-tweak-tool | 1 | NULL | | gnome-themes-standard | 1 | NULL |

84 B.2 GNOME: ratings

| gnome-tetravex | 1 | NULL | | gnome-panel | 1 | NULL | | swell-foop | 1 | NULL | | valadoc | 1 | NULL | | evolution-mapi | 1 | NULL | | | 1 | NULL | | evolution-data-server | 1 | NULL | | evolution-rss | 1 | NULL | | | 1 | NULL | | | 1 | NULL | | at-spi2-core | 1 | NULL | | at-spi2-atk | 1 | NULL | | devhelp | 1 | NULL | | vala | 1 | NULL | | tali | 1 | NULL | | | 1 | NULL | | clutter-gst | 1 | NULL | | evolution-ews | 1 | NULL | | evolution- | 1 | NULL | | rygel | 1 | NULL | | | 1 | NULL | | sushi | 1 | NULL | | | 1 | NULL | | d-feet | 1 | NULL | | | 1 | NULL | | five-or-more | 1 | NULL | | epiphany | 1 | NULL | | tracker | 1 | NULL | | eog-plugins | 1 | NULL | | folks | 1 | NULL | | | 1 | NULL | | | 1 | NULL | | yelp | 1 | NULL | | evolution | 1 | NULL | | quadrapassel | 1 | NULL | | file-roller | 1 | NULL | | atk | 1 | NULL | | snappy | 1 | NULL | | accerciser | 1 | NULL | | gnome-nibbles | 2 | NULL | | gnome-backgrounds | 2 | NULL | | gnome-applets | 2 | NULL | | gnome-initial-setup | 2 | NULL | | gnome-calculator | 2 | NULL | | gnome-mahjongg | 2 | NULL | | | 2 | NULL | | network-manager-pptp | 2 | NULL | | egg-list-box | 2 | NULL | | drwright | 2 | NULL | | | 2 | NULL | | gnome-nettool | 2 | NULL | | aravis | 2 | NULL | | gnome-power-manager | 2 | NULL | | libcroco | 2 | NULL | | gupnp | 2 | NULL | | gvdb | 2 | NULL | | yelp-tools | 2 | NULL | | hitori | 2 | NULL | | yelp-xsl | 2 | NULL | | libgit2-glib | 2 | NULL | | almanah | 2 | NULL | | | 2 | NULL | | aisleriot | 2 | NULL | | | 2 | NULL | | gtk-vnc | 2 | NULL | | libsigc++2 | 2 | NULL | | gnome-robots | 2 | NULL | | totem-pl-parser | 2 | NULL | | mousetweaks | 2 | NULL | | libgnomekbd | 2 | NULL | | gnumeric | 2 | NULL | | | 2 | NULL | | gssdp | 2 | NULL | | libwnck | 2 | NULL | | libsocialweb | 2 | NULL | | | 2 | NULL | | lasem | 2 | NULL | | | 2 | NULL | | gmime | 2 | NULL | | seahorse | 2 | NULL | | planet-web | 2 | NULL | | gegl-gtk | 2 | NULL | | evolution-kolab | 2 | NULL | | geocode-glib | 2 | NULL | | | 2 | NULL | | gcalctool | 2 | NULL | | glick2 | 2 | NULL | | four-in-a-row | 2 | NULL | | gnome-screensaver | 3 | NULL | | sound-juicer | 3 | NULL |

85 B List of Projects by Maintenance Rating

| gnome-shell-design | 3 | NULL | | | 3 | NULL | | baobab | 3 | NULL | | sysadmin-bin | 3 | NULL | | gnome-keyring | 3 | NULL | | gnome-shell-extensions | 3 | NULL | | evolution-exchange | 3 | NULL | | libxml++ | 3 | NULL | | news-test-www | 3 | NULL | | longomatch | 5 | -2 | | gnome-music | 3 | NULL | | dasher | 3 | NULL | | clutter-gtk | 3 | NULL | | -fonts | 5 | -2 | | phonemgr | 3 | NULL | | byzanz | 5 | -2 | | gnome-user-share | 3 | NULL | | gnome-video-effects | 5 | -2 | | chronojump | 5 | -2 | | clutter-box2dmm | 3 | NULL | | gnome-online-accounts | 3 | NULL | | perl-Glib-Object-Introspection | 3 | NULL | | gedit-cossa | 5 | -2 | | java-libglom | 3 | NULL | | xchat-gnome | 3 | NULL | | xdg-user-dirs-gtk | 3 | NULL | | postr | 3 | NULL | | gupnp-av | 3 | NULL | | gupnp-dlna | 5 | -2 | | pan2 | 5 | -2 | | | 3 | NULL | | gxml | 3 | NULL | | libgnome-keyring | 3 | NULL | | gnome-calendar | 3 | NULL | | gnome-doc-utils | 3 | NULL | | releng | 3 | NULL | | gnome-modulesets | 3 | NULL | | | 3 | NULL | | gtk-mac-bundler | 3 | NULL | | transmageddon | 5 | -2 | | | 3 | NULL | | libepc | 6 | -2 | | gnome-video-arcade | 4 | NULL | | libgsf | 4 | NULL | | libgxps | 4 | NULL | | gnome-university | 4 | NULL | | | 4 | NULL | | | 4 | NULL | | gtk-doc-stub | 6 | -2 | | murrine | 6 | -2 | | libcryptui | 4 | NULL | | caribou | 4 | NULL | | anjuta-extras | 4 | NULL | | | 4 | NULL | | gegl | 4 | NULL | | kupfer | 4 | NULL | | gevice | 4 | NULL | | gnome-web-photo | 4 | NULL | | mm-common | 4 | NULL | | grilomm | 4 | NULL | | gdl | 4 | NULL | | blam | 4 | NULL | | gucharmap | 4 | NULL | | mail-web | 4 | NULL | | babl | 4 | NULL | | | 4 | NULL | | linux-user-chroot | 4 | NULL | | at-spi | 6 | -2 | | mango | 6 | -2 | | gedit-code-assistance | 4 | NULL | | | 4 | NULL | | mhonarc | 4 | NULL | | genius | 4 | NULL | | gupnp-igd | 6 | -2 | | libxml2 | 4 | NULL | | gnome-web-wppo | 6 | -2 | | grits | 4 | NULL | | gnoduino | 4 | NULL | | gnome-hello | 4 | NULL | | nautilus-share | 4 | NULL | | gimp-gap | 6 | -2 | | gnome-dvb-daemon | 4 | NULL | | dots | 6 | -2 | | gnome-icon-theme-symbolic | 4 | NULL | | perl-ExtUtils-PkgConfig | 4 | NULL | | network-manager-iodine | 4 | NULL | | network-manager-openswan | 4 | NULL | | perl-Glib | 4 | NULL | | gnome-mud | 4 | NULL | | gnomemm-website | 4 | NULL |

86 B.2 GNOME: ratings

| gimp-tiny-fu | 4 | NULL | | gimp-web | 4 | NULL | | glade-web | 4 | NULL | | tasks | 4 | NULL | | foundation-web | 4 | NULL | | gnome-software | 4 | NULL | | gimp | 4 | NULL | | gnome-font-viewer | 4 | NULL | | gnome-schedule | 6 | -2 | | | 4 | NULL | | epiphany-extensions | 4 | NULL | | gnome-getting-started-docs | 4 | NULL | | gnome-alsamixer | 4 | NULL | | gnome-dictionary | 4 | NULL | | evolution-activesync | 4 | NULL | | webkitgtk-tarball-releases | 5 | NULL | | gtksourceviewmm | 7 | -2 | | extensions-web | 5 | NULL | | gnome-icon-theme | 7 | -2 | | gupnp-vala | 7 | -2 | | gnomefr-web | 5 | NULL | | gupnp-tools | 7 | -2 | | balsa | 5 | NULL | | krb5-auth- | 7 | -2 | | niepce | 5 | NULL | | sysprof | 5 | NULL | | glib-controller | 5 | NULL | | happybirthdaygnome-web | 5 | NULL | | perl- | 5 | NULL | | moserial | 7 | -2 | | libgsystem | 5 | NULL | | gnome-system-tools | 6 | -1 | | gstreamermm | 5 | NULL | | vala-bootstrap | 5 | NULL | | gegl- | 5 | NULL | | geglmm | 6 | -1 | | gnome-games-extra-data | 6 | -1 | | hyena | 5 | NULL | | gnome-raw-thumbnailer | 6 | NULL | | perl-Gtk3 | 6 | NULL | | gnome-search-tool | 5 | 1 | | libgrss | 6 | NULL | | gtkparasite | 6 | NULL | | perl-Gtk2 | 6 | NULL | | perl-Clutter | 6 | NULL | | gedit-collaboration | 6 | NULL | | ostree-init | 6 | NULL | | devilspie | 5 | 1 | | gromit | 6 | NULL | | gconf-editor | 5 | 1 | | emerillon | 5 | 1 | | gnome-media | 5 | 1 | | -web | 6 | NULL | | sodipodi | 7 | NULL | | libnotify | 6 | 1 | | libgtop | 6 | 1 | | pybliographer | 7 | NULL | | PolicyKit-gnome | 6 | 1 | | grilo-mediaserver2 | 7 | NULL | | gnac | 5 | 2 | | gnome-ostree-integration | 7 | NULL | | perl-Gnome2-Vte | 7 | NULL | | beast | 6 | 1 | | turbine | 7 | NULL | | gswitchit_plugins | 7 | NULL | | perl-GStreamer | 7 | NULL | | nanny | 5 | 2 | | tracker-upnp | 7 | NULL | | gtkmathview | 7 | NULL | | gdlmm | 7 | NULL | | alleyoop | 7 | NULL | | gnome-subtitles | 6 | 1 | | perl-Pango | 7 | NULL | | libegg | 6 | 2 | | pangomm | 8 | NULL | | vte | 8 | NULL | | libgnome-volume-control | 8 | NULL | | libgnome-media-profiles | 8 | NULL | | pygoocanvas | 8 | NULL | | pygtkglext | 8 | NULL | | pygio | 8 | NULL | | pygtk | 8 | NULL | | pygtk-docs | 8 | NULL | | libgnomecanvasmm | 8 | NULL | | pangox-compat | 8 | NULL | | libgconf-bridge | 8 | NULL | | pdfmod | 8 | NULL | | seahorse-plugins | 8 | NULL | | libzapojit | 5 | 3 | | video-subtitles | 8 | NULL |

87 B List of Projects by Maintenance Rating

| vicious-extensions | 8 | NULL | | pessulus | 6 | 2 | | svn-web | 8 | NULL | | usability-lab | 8 | NULL | | nautilus-ideviceinfo | 8 | NULL | | nautilus-sound-converter | 6 | 2 | | model | 8 | NULL | | newcomers-tutorial | 7 | 1 | | notification-daemon | 8 | NULL | | perl-ExtUtils-Depends | 8 | NULL | | libIDL | 8 | NULL | | seahorse-sharing | 8 | NULL | | libnotifymm | 8 | NULL | | seed-examples | 8 | NULL | | snowy | 8 | NULL | | ORBit2 | 8 | NULL | | -glib | 8 | NULL | | regexxer | 8 | NULL | | seahorse-nautilus | 8 | NULL | | telegnome | 8 | NULL | | graph-gtk | 8 | NULL | | gupnp-ui | 8 | NULL | | gwget | 7 | 1 | | gyrus | 7 | 1 | | hamster-applet | 8 | NULL | | ease | 8 | NULL | | evolution-jescs | 8 | NULL | | gitadmin-test | 8 | NULL | | | 8 | NULL | | evolution-scalix | 8 | NULL | | clutter-gtkmm | 8 | NULL | | gb-rdp | 8 | NULL | | gtetrinet | 8 | NULL | | gtk-engines | 8 | NULL | | gtkglext | 8 | NULL | | gtkglextmm | 8 | NULL | | gtkglext-sharp | 8 | NULL | | gegl-edit | 8 | NULL | | gtk-theme-engine- | 8 | NULL | | goffice | 5 | 3 | | giv | 8 | NULL | | clutter-cairomm | 8 | NULL | | banter | 8 | NULL | | gnome-lirc-properties | 8 | NULL | | last-exit | 8 | NULL | | gnome-games-deprecated | 8 | NULL | | gnome-blog | 7 | 1 | | libbonobo | 8 | NULL | | gnome-scan | 8 | NULL | | gnome-icon-theme-extras | 8 | NULL | | libbonoboui | 8 | NULL | | atkmm | 8 | NULL | | cluttermm | 6 | 2 | | bug-buddy | 8 | NULL | | gnome-js-common | 9 | NULL | | perl-Gnome2-VFS | 9 | NULL | | perl-Goo-Canvas | 9 | NULL | | gimp-perl | 9 | NULL | | perl-GStreamer-GConf | 9 | NULL | | perl-GStreamer-Interfaces | 9 | NULL | | gnome-mastermind | 9 | NULL | | gnome-nds-thumbnailer | 9 | NULL | | perl-Gtk2-Champlain | 9 | NULL | | perl-Gnome2-Rsvg | 9 | NULL | | perl-Gnome2-PanelApplet | 9 | NULL | | glide | 9 | NULL | | gnet | 9 | NULL | | gnio | 9 | NULL | | perl-Cairo-GObject | 9 | NULL | | perl-Champlain | 9 | NULL | | gimp-ruby | 9 | NULL | | perl-Glib-IO | 9 | NULL | | perl-Gnome2 | 9 | NULL | | gnome-edu | 9 | NULL | | perl-Gnome2-Canvas | 9 | NULL | | office-runner | 9 | NULL | | perl-Gnome2-Dia | 9 | NULL | | gimp-pspi | 9 | NULL | | gnome-globalmenu | 9 | NULL | | gnome-i18n | 9 | NULL | | glom-postgresql-setup | 9 | NULL | | perl-Gtk2-MozEmbed | 9 | NULL | | perl-Gtk2-SourceView2 | 9 | NULL | | xmlsec | 9 | NULL | | tbo | 9 | NULL | | tempo | 9 | NULL | | clutter-box2d | 9 | NULL | | buoh | 9 | NULL | | buildj | 9 | NULL | | unique | 9 | NULL |

88 B.2 GNOME: ratings

| uniquemm | 9 | NULL | | bugzilla.gnome.org | 9 | NULL | | bprof | 9 | NULL | | bprobe | 9 | NULL | | billreminder | 9 | NULL | | bakery | 9 | NULL | | at-poke | 9 | NULL | | atomix | 9 | NULL | | atomato | 9 | NULL | | contacts | 9 | NULL | | couchdb-glib | 9 | NULL | | perl-Gtk2-Unique | 9 | NULL | | gftp | 9 | NULL | | geoclue-properties | 9 | NULL | | gegl-clutter | 9 | NULL | | gconfmm | 9 | NULL | | emerillon-plugins | 9 | NULL | | pygda | 9 | NULL | | gade | 9 | NULL | | pyorbit | 9 | NULL | | sapwood | 9 | NULL | | evolution-couchdb | 9 | NULL | | shell-perf-web | 9 | NULL | | discident-glib | 6 | 3 | | solang | 9 | NULL | | splinter | 9 | NULL | | dates | 9 | NULL | | wiican | 6 | 3 | | gupnp-dlna-media | 9 | NULL | | gturing | 9 | NULL | | gnome-tv | 9 | NULL | | model-examples | 9 | NULL | | monet | 9 | NULL | | introspection-doc-generator | 9 | NULL | | | 9 | NULL | | j5tester | 9 | NULL | | gnome-themes-extras | 9 | NULL | | identica-glib | 9 | NULL | | gnome-talos | 9 | NULL | | gnomeweb-src | 9 | NULL | | libgnomeprint | 9 | NULL | | libgnomeui | 9 | NULL | | liboobs | 9 | NULL | | librsvgmm | 9 | NULL | | libsoupmm | 9 | NULL | | libvtemm | 9 | NULL | | nautilus-python | 9 | NULL | | hippo- | 9 | NULL | | gpointing-device-settings | 9 | NULL | | goocanvasmm | 9 | NULL | | memprof | 9 | NULL | | mess-desktop-entries | 9 | NULL | | gnome-sound-theme | 9 | NULL | | java-atk-wrapper | 9 | NULL | | perl-Gtk2-Spell | 9 | NULL | | libdmapsharing | 9 | NULL | | libgeexml | 9 | NULL | | nautilus-open-terminal | 9 | NULL | | libgda-uimm | 9 | NULL | | nautilus-image-converter | 9 | NULL | | gnomeradio | 9 | NULL | | libchamplainmm | 9 | NULL | | monster-masher | 9 | NULL | | libglademm | 9 | NULL | | libgnome | 9 | NULL | | evolution-sharp | 10 | NULL | | asbestos | 10 | NULL | | guikachu | 10 | NULL | | libbtctl | 10 | NULL | | | 10 | NULL | | silky | 10 | NULL | | dogtail | 10 | NULL | | divifund | 10 | NULL | | libart_lgpl | 10 | NULL | | firestarter | 10 | NULL | | drivel | 10 | NULL | | hipo | 10 | NULL | | libmetaterm | 10 | NULL | | sabayon | 10 | NULL | | cluttermm_tutorial | 10 | NULL | | libmbca | 10 | NULL | | release-notes | 7 | 3 | | evolution-webcal | 10 | NULL | | hardware-device-themes | 10 | NULL | | evolution-brainread | 10 | NULL | | eel | 10 | NULL | | fantasdic | 10 | NULL | | horizon | 10 | NULL | | libgail-gnome | 10 | NULL | | camorama | 10 | NULL |

89 B List of Projects by Maintenance Rating

| libgeetk | 10 | NULL | | libgtkmusic | 7 | 3 | | java-gobject-introspection-examples | 10 | NULL | | testinggtk | 10 | NULL | | java-access-bridge | 10 | NULL | | libglade | 10 | NULL | | clutter-gstreamermm | 10 | NULL | | torrent-web | 10 | NULL | | jana | 10 | NULL | | libgnomecanvas | 10 | NULL | | vala-tests | 10 | NULL | | clutter-tutorial | 10 | NULL | | system-tools-backends-clone | 10 | NULL | | dbus-inspector | 10 | NULL | | sourcerank | 10 | NULL | | soylent | 10 | NULL | | hotssh | 10 | NULL | | strongwind | 10 | NULL | | testuser-repos | 10 | NULL | | cowbell | 10 | NULL | | jumpnbumpmenu | 10 | NULL | | libgdamm | 7 | 3 | | libgnomeprintui | 10 | NULL | | java-gobject-introspection | 10 | NULL | | capuchin | 10 | NULL | | pygtkimageview | 10 | NULL | | nautilus-vcs | 10 | NULL | | gnome-cookbook | 10 | NULL | | nautilus-cd-burner | 10 | NULL | | gnome3-web | 10 | NULL | | gnome-sharing-service | 10 | NULL | | gnome-specimen | 10 | NULL | | passepartout | 10 | NULL | | gnome-spell | 10 | NULL | | msm | 10 | NULL | | mousetrap | 10 | NULL | | -strigi | 10 | NULL | | gimp-web-devel | 10 | NULL | | mortadelo | 10 | NULL | | gnome-pilot-conduits | 10 | NULL | | monkey-bubble | 10 | NULL | | gnome-desktop-testing | 10 | NULL | | gnome-docker | 10 | NULL | | nautilus-gtkhtml | 10 | NULL | | gnome-pilot | 10 | NULL | | | 10 | NULL | | netspeed | 7 | 3 | | gnome-python | 10 | NULL | | gnome-mime-data | 10 | NULL | | gnome-main-menu | 10 | NULL | | nautilus-rpm | 10 | NULL | | gnome-launch-box | 10 | NULL | | nautilus-rc | 10 | NULL | | gnome-python-extras | 10 | NULL | | nautilus-media | 10 | NULL | | gnome-git-migration | 10 | NULL | | online-desktop | 10 | NULL | | ontv | 10 | NULL | | perl-Gnome2-GConf | 10 | NULL | | gnome-vfs | 10 | NULL | | perl-Gnome2-Print | 10 | NULL | | gtkimageview | 10 | NULL | | gdesklets-extras | 10 | NULL | | plgtkimageview | 10 | NULL | | podsleuth | 10 | NULL | | gdesklets | 10 | NULL | | gtk-quartz-engine | 10 | NULL | | pybank | 10 | NULL | | pyclutter | 10 | NULL | | guadec2010-web | 10 | NULL | | garnome | 10 | NULL | | | 10 | NULL | | galeon | 10 | NULL | | gail | 10 | NULL | | -web | 10 | NULL | | gfloppy | 10 | NULL | | gtkieembed | 10 | NULL | | gimmie | 10 | NULL | | gob | 10 | NULL | | gimp-plugin-template | 10 | NULL | | perl-Gnome2-Wnck | 10 | NULL | | goocanvas | 10 | NULL | | medusa | 10 | NULL | | gimp- | 10 | NULL | | marlin | 10 | NULL | | perl-Gtk2-GladeXML | 10 | NULL | | gimp-data-extras | 10 | NULL | | gtkglarea | 10 | NULL | | gnome-python-desktop | 10 | NULL | | perl-Gtk2-SourceView | 10 | NULL |

90 B.2 GNOME: ratings

| perl-Gtk2-Html2 | 10 | NULL | | perl-Gtk2-GLExt | 10 | NULL | | foocanvas | 10 | NULL | | art-web | 11 | NULL | | api-web | 11 | NULL | | annum | 11 | NULL | +------+------+------+

91 C Code Repository Activity

C.1 Apache mysql> SELECT * FROM coderepos; +------+------+------+------+------+ | projectname | date_of_first_commit | date_of_last_commit | commits_in_12m | committers_in_12m | +------+------+------+------+------+ | abdera | 2006-06-06 | 2012-11-09 | 187 | 4 | | accumulo | 2011-10-03 | 2012-11-11 | 1708 | 15 | | ace | 2009-05-08 | 2012-11-09 | 724 | 9 | | activemq | 2005-12-02 | 2012-11-12 | 2203 | 13 | | ant | 2005-04-15 | 2012-11-10 | 788 | 8 | | any23 | 2011-10-02 | 2012-10-29 | 1853 | 15 | | apr | 2004-11-13 | 2012-11-07 | 384 | 15 | | aries | 2009-09-22 | 2012-11-08 | 1311 | 16 | | attic | 2008-12-11 | 2012-08-11 | 6 | 1 | | avalon | 2004-05-20 | 2004-11-19 | 0 | 0 | | avro | 2009-04-09 | 2012-11-09 | 272 | 8 | | beehive | 2004-07-15 | 2010-03-28 | 0 | 0 | | bigtop | 2011-06-21 | 2012-11-10 | 730 | 11 | | buildr | 2007-11-01 | 2012-11-10 | 313 | 3 | | bval | 2010-03-12 | 2012-11-08 | 219 | 9 | | camel | 2007-03-19 | 2012-11-11 | 4779 | 24 | | cayenne | 2007-01-18 | 2012-11-11 | 698 | 9 | | chemistry | 2009-04-30 | 2012-11-11 | 666 | 9 | | click | 2008-11-15 | 2012-09-24 | 38 | 3 | | cocoon | 2004-06-29 | 2012-10-02 | 588 | 10 | | concom | 2012-02-26 | 2012-08-11 | 60 | 5 | | continuum | 2005-04-11 | 2012-10-17 | 319 | 4 | | couchdb | 2008-02-21 | 2012-10-17 | 31 | 5 | | creadur | 2008-01-14 | 2012-11-11 | 725 | 9 | | cxf | 2006-08-04 | 2012-11-12 | 6169 | 17 | | db | 2005-04-14 | 2012-11-11 | 1752 | 19 | | deltacloud | 2010-05-25 | 2012-11-02 | 245 | 6 | | directmemory | 2011-10-05 | 2012-11-08 | 633 | 9 | | directory | 2003-12-02 | 2012-11-12 | 2032 | 11 | | empire-db | 2008-07-31 | 2012-11-01 | 255 | 4 | | esme | 2008-12-05 | 2012-08-22 | 16 | 2 | | excalibur | 2004-06-13 | 2010-12-28 | 0 | 0 | | felix | 2005-07-19 | 2012-11-09 | 1404 | 18 | | flume | 2011-06-14 | 2012-10-17 | 445 | 14 | | forrest | 2004-03-09 | 2012-04-20 | 38 | 2 | | geronimo | 2004-09-10 | 2012-11-12 | 1075 | 16 | | giraph | 2012-05-22 | 2012-11-13 | 203 | 10 | | gora | 2010-10-03 | 2012-11-12 | 238 | 9 | | gump | 2004-08-01 | 2012-10-29 | 346 | 12 | | hadoop | 2008-01-16 | 2012-11-13 | 6940 | 41 | | hama | 2008-05-23 | 2012-11-10 | 526 | 7 | | harmony | 2005-05-19 | 2011-11-22 | 5 | 1 | | hbase | 2008-02-04 | 2012-11-13 | 3915 | 25 | | hive | 2010-10-08 | 2012-11-13 | 708 | 11 | | hivemind | 2005-06-07 | 2010-11-03 | 0 | 0 | | httpcomponents | 2007-12-13 | 2012-11-12 | 800 | 7 | | httpd | 2004-11-18 | 2012-11-13 | 4873 | 41 | | ibatis | 2005-02-08 | 2010-05-11 | 0 | 0 | | infrastructure | 2004-03-09 | 2012-11-11 | 1612 | 119 | | isis | 2010-10-11 | 2012-11-13 | 988 | 5 | | jackrabbit | 2004-09-13 | 2012-11-13 | 3567 | 21 | | jakarta | 2004-10-10 | 2011-12-24 | 30 | 3 | | james | 2004-01-28 | 2012-10-19 | 1166 | 9 | | jena | 2010-12-03 | 2012-11-13 | 2553 | 8 | | jmeter | 2011-11-01 | 2012-11-13 | 1896 | 4 | | juddi | 2005-08-27 | 2012-07-19 | 143 | 2 | | karaf | 2010-06-25 | 2012-11-13 | 3039 | 14 | | labs | 2006-11-18 | 2012-10-27 | 298 | 10 | | lenya | 2004-09-04 | 2012-04-17 | 28 | 4 | | libcloud | 2009-11-17 | 2012-11-13 | 646 | 6 | | logging | 2005-10-09 | 2012-11-13 | 1164 | 9 | | lucene | 2005-02-02 | 2012-11-14 | 9088 | 35 | | lucene.net | 2010-01-09 | 2012-11-04 | 336 | 9 | | lucy | 2006-06-06 | 2012-11-09 | 734 | 7 | | mahout | 2008-01-15 | 2012-11-12 | 414 | 14 | | manifoldcf | 2010-01-11 | 2012-11-15 | 1543 | 7 | | maven | 2004-12-15 | 2012-12-28 | 5226 | 28 | | mina | 2006-11-18 | 2012-11-15 | 610 | 8 | | mrunit | 2011-03-09 | 2012-10-12 | 229 | 7 |

92 C.2 GNOME

| nutch | 2005-01-23 | 2012-11-16 | 425 | 7 | | oodt | 2010-01-25 | 2012-11-21 | 419 | 13 | | oozie | 2011-07-12 | 2012-11-22 | 714 | 8 | | openejb | 2006-09-15 | 2012-11-22 | 3778 | 13 | | openjpa | 2006-05-02 | 2012-11-22 | 699 | 13 | | opennlp | 2010-12-01 | 2012-11-22 | 577 | 7 | | openwebbeans | 2008-11-17 | 2012-11-22 | 462 | 13 | | pdfbox | 2008-02-10 | 2012-11-18 | 342 | 7 | | perl | 2004-11-14 | 2012-11-21 | 170 | 10 | | pig | 2010-10-03 | 2012-11-20 | 938 | 13 | | pivot | 2009-03-06 | 2012-11-16 | 488 | 5 | | planet | 2004-01-15 | 2012-10-15 | 25 | 22 | | poi | 2005-12-04 | 2012-11-16 | 339 | 5 | | portals | 2004-03-27 | 2012-08-24 | 50 | 4 | | qpid | 2006-09-14 | 2012-11-23 | 3161 | 22 | | quetzalcoatl | 2008-01-23 | 2008-08-19 | 0 | 0 | | rave | 2011-03-14 | 2012-11-19 | 1266 | 24 | | river | 2007-01-02 | 2012-11-22 | 365 | 5 | | roller | 2007-03-30 | 2012-11-10 | 85 | 3 | | santuario | 2005-12-01 | 2012-11-07 | 328 | 4 | | servicemix | 2005-12-02 | 2012-11-22 | 2718 | 10 | | shale | 2005-01-22 | 2010-03-28 | 0 | 0 | | shiro | 2008-06-11 | 2012-11-17 | 254 | 4 | | sis | 2010-02-24 | 2012-11-23 | 573 | 9 | | sling | 2007-09-09 | 2012-11-23 | 1430 | 11 | | sqoop | 2011-06-14 | 2012-09-19 | 244 | 7 | | stanbol | 2010-11-15 | 2012-11-25 | 2142 | 17 | | stdcxx | 2005-07-16 | 2012-11-04 | 34 | 5 | | steve | 2012-07-26 | 2012-08-06 | 226 | 16 | | comdev | 2009-11-20 | 2012-11-20 | 49 | 8 | | commons | 2005-01-28 | 2012-11-28 | 6507 | 50 | | myfaces | 2005-04-15 | 2012-11-28 | 3141 | 22 | | spamassassin | 2003-12-23 | 2012-11-28 | 1696 | 11 | | struts | 2004-10-01 | 2012-11-27 | 387 | 7 | | subversion | 2009-11-15 | 2012-11-28 | 6651 | 44 | | synapse | 2005-08-22 | 2012-10-08 | 319 | 9 | | tapestry | 2005-08-27 | 2012-05-15 | 259 | 8 | | tcl | 2005-08-31 | 2012-11-13 | 160 | 4 | | thrift | 2008-05-11 | 2012-11-20 | 354 | 9 | | tika | 2007-03-23 | 2012-11-19 | 442 | 9 | | tiles | 2007-01-14 | 2012-08-30 | 169 | 2 | | tomcat | 2005-08-05 | 2012-11-25 | 4540 | 18 | | trafficserver | 2009-10-10 | 2012-11-21 | 582 | 16 | | turbine | 2005-06-22 | 2012-11-20 | 139 | 4 | | tuscany | 2005-12-14 | 2012-11-16 | 502 | 9 | | uima | 2006-10-31 | 2012-11-28 | 858 | 11 | | vcl | 2008-10-03 | 2012-11-27 | 799 | 7 | | velocity | 2005-06-14 | 2012-10-27 | 60 | 5 | | webservices | 2004-09-02 | 2012-11-26 | 1276 | 6 | | wicket | 2006-10-10 | 2012-11-20 | 339 | 10 | | xalan | 2005-11-13 | 2012-11-18 | 211 | 3 | | xerces | 2005-05-22 | 2012-11-27 | 204 | 6 | | xml | 2003-11-04 | 2012-04-10 | 6 | 4 | | xmlbeans | 2004-12-07 | 2012-08-15 | 16 | 1 | | xmlgraphics | 2005-02-10 | 2012-11-28 | 1104 | 13 | | zookeeper | 2010-11-23 | 2012-11-28 | 759 | 9 | +------+------+------+------+------+

C.2 GNOME mysql> SELECT projectname, date_of_first_commit AS date_first_commit, date_of_last_commit AS date_last_commit, commits_in_12m, committers_in_12m, authors_in_12m FROM coderepos; +------+------+------+------+------+------+ | projectname | date_first_commit | date_last_commit | commits_in_12m | committers_in_12m | authors_in_12m | +------+------+------+------+------+------+ | accerciser | 2007-03-12 | 2012-10-21 | 58 | 12 | 19 | | aisleriot | 1997-01-02 | 2012-10-16 | 170 | 11 | 13 | | alacarte | 2006-04-10 | 2012-10-22 | 88 | 2 | 5 | | alleyoop | 2003-04-17 | 2011-12-17 | 14 | 2 | 2 | | almanah | 2008-05-24 | 2012-09-25 | 33 | 4 | 4 | | anjuta | 2001-04-23 | 2012-11-06 | 415 | 21 | 38 | | anjuta-extras | 2009-04-07 | 2012-10-13 | 33 | 5 | 6 | | annum | 2010-01-13 | 2010-03-19 | 0 | 0 | 0 | | api-web | 2010-04-09 | 2012-03-24 | 4 | 1 | 1 | | aravis | 2009-12-11 | 2012-11-07 | 208 | 2 | 9 | | art-web | 2002-07-02 | 2011-06-10 | 0 | 0 | 0 | | asbestos | 2005-03-04 | 2009-04-23 | 0 | 0 | 0 | | at-poke | 2002-03-07 | 2011-01-28 | 0 | 0 | 0 | | at-spi | 2001-07-25 | 2012-09-05 | 2 | 2 | 2 | | at-spi2-atk | 2001-07-25 | 2012-10-29 | 100 | 14 | 16 | | at-spi2-core | 2001-07-25 | 2012-10-26 | 80 | 10 | 16 | | atk | 2001-04-26 | 2012-10-26 | 28 | 7 | 8 | | atkmm | 2010-06-23 | 2012-10-26 | 1 | 1 | 1 | | atomato | 2006-07-04 | 2011-12-11 | 1 | 1 | 1 |

93 C Code Repository Activity

| atomix | 2001-11-10 | 2011-03-30 | 0 | 0 | 0 | | babl | 2005-08-09 | 2012-10-28 | 125 | 9 | 12 | | bakery | 2005-01-04 | 2011-11-05 | 1 | 1 | 1 | | balsa | 1997-01-03 | 2012-10-29 | 19 | 6 | 6 | | banshee | 2005-06-20 | 2012-11-02 | 281 | 16 | 45 | | banter | 2007-05-10 | 2010-04-18 | 0 | 0 | 0 | | baobab | 2006-04-23 | 2012-10-27 | 264 | 24 | 30 | | beagle | 2004-04-29 | 2012-05-16 | 7 | 4 | 5 | | beast | 1999-05-17 | 2012-10-25 | 26 | 1 | 1 | | billreminder | 2006-03-01 | 2011-06-17 | 0 | 0 | 0 | | blam | 2004-01-12 | 2012-10-31 | 40 | 4 | 6 | | bprobe | 2006-02-07 | 2009-04-27 | 0 | 0 | 0 | | bprof | 2007-10-06 | 2010-06-11 | 0 | 0 | 0 | | brasero | 2006-09-16 | 2012-11-02 | 54 | 31 | 32 | | bug-buddy | 1999-10-23 | 2010-09-28 | 0 | 0 | 0 | | bugzilla.gnome.org | 2006-10-09 | 2012-04-02 | 1 | 1 | 1 | | buildj | 2010-02-27 | 2011-05-15 | 0 | 0 | 0 | | buoh | 2005-02-28 | 2011-05-23 | 0 | 0 | 0 | | byzanz | 2006-01-05 | 2012-10-10 | 13 | 4 | 4 | | camorama | 2003-01-16 | 2008-05-28 | 0 | 0 | 0 | | cantarell-fonts | 2010-11-05 | 2012-11-01 | 33 | 1 | 4 | | capuchin | 2007-03-11 | 2009-04-18 | 0 | 0 | 0 | | caribou | 2009-11-14 | 2012-11-02 | 27 | 9 | 9 | | cheese | 2007-04-21 | 2012-10-30 | 236 | 28 | 46 | | chronojump | 2004-12-12 | 2012-11-06 | 127 | 1 | 1 | | clutter | 2005-03-22 | 2012-10-24 | 1249 | 31 | 47 | | clutter-box2d | 2008-04-03 | 2012-05-07 | 2 | 1 | 1 | | clutter-box2dmm | 2008-07-25 | 2012-05-07 | 18 | 3 | 3 | | clutter-cairomm | 2008-07-14 | 2010-04-18 | 0 | 0 | 0 | | clutter-gst | 2006-08-30 | 2012-09-26 | 69 | 8 | 16 | | clutter-gstreamermm | 2008-09-21 | 2010-07-14 | 0 | 0 | 0 | | clutter-gtk | 2006-11-29 | 2012-10-24 | 47 | 11 | 12 | | clutter-gtkmm | 2008-07-14 | 2012-03-08 | 2 | 1 | 1 | | clutter-tutorial | 2007-12-07 | 2010-08-02 | 0 | 0 | 0 | | cluttermm | 2007-10-26 | 2012-03-08 | 3 | 2 | 2 | | cluttermm_tutorial | 2008-12-12 | 2011-03-29 | 0 | 0 | 0 | | cogl | 2005-03-22 | 2012-10-25 | 652 | 10 | 24 | | conduit | 2005-12-01 | 2012-06-07 | 1 | 1 | 1 | | contacts | 2005-08-08 | 2010-12-15 | 0 | 0 | 0 | | couchdb-glib | 2009-06-09 | 2011-10-10 | 0 | 0 | 0 | | cowbell | 2006-07-12 | 2008-12-19 | 0 | 0 | 0 | | d-feet | 2007-10-10 | 2012-10-23 | 51 | 2 | 5 | | damned-lies | 2006-03-05 | 2012-11-06 | 110 | 6 | 9 | | dasher | 2002-09-22 | 2012-10-03 | 65 | 4 | 4 | | dates | 2005-09-07 | 2011-10-05 | 0 | 0 | 0 | | dbus-inspector | 2007-03-20 | 2009-12-07 | 0 | 0 | 0 | | dconf | 2009-03-16 | 2012-11-08 | 200 | 7 | 13 | | devhelp | 2001-07-31 | 2012-11-05 | 56 | 4 | 13 | | devilspie | 2002-11-12 | 2012-10-22 | 11 | 2 | 4 | | dia | 1997-01-03 | 2012-10-15 | 236 | 2 | 8 | | discident-glib | 2010-03-18 | 2012-10-08 | 12 | 1 | 1 | | divifund | 2004-07-19 | 2006-01-02 | 0 | 0 | 0 | | dogtail | 2005-10-05 | 2008-12-31 | 0 | 0 | 0 | | dots | 2009-02-16 | 2012-10-21 | 3 | 3 | 3 | | drgeo | 2003-06-12 | 2008-11-02 | 0 | 0 | 0 | | drivel | 2004-02-26 | 2008-09-16 | 0 | 0 | 0 | | drwright | 2003-05-19 | 2012-10-11 | 24 | 3 | 3 | | ease | 2009-12-16 | 2010-11-28 | 0 | 0 | 0 | | eel | 2001-03-29 | 2009-03-16 | 0 | 0 | 0 | | egg-list-box | 2012-05-15 | 2012-10-15 | 33 | 3 | 3 | | ekiga | 2001-08-20 | 2012-11-02 | 422 | 8 | 10 | | emerillon | 2008-10-16 | 2012-10-04 | 5 | 3 | 4 | | emerillon-plugins | 2009-10-17 | 2011-09-12 | 0 | 0 | 0 | | empathy | 2007-04-25 | 2012-11-06 | 1296 | 39 | 57 | | eog | 1999-09-15 | 2012-10-26 | 188 | 24 | 39 | | eog-plugins | 2007-08-06 | 2012-10-15 | 57 | 3 | 6 | | epiphany | 2002-12-30 | 2012-11-05 | 990 | 24 | 34 | | epiphany-extensions | 2003-07-30 | 2012-10-28 | 17 | 6 | 6 | | evince | 1999-04-17 | 2012-10-23 | 275 | 38 | 59 | | evolution | 1998-01-12 | 2012-11-06 | 1226 | 33 | 59 | | evolution-activesync | 2011-04-28 | 2012-08-31 | 102 | 4 | 4 | | evolution-brainread | 2004-04-30 | 2007-10-14 | 0 | 0 | 0 | | evolution-couchdb | 2009-06-11 | 2011-10-11 | 0 | 0 | 0 | | evolution-data-server | 1999-04-18 | 2012-11-06 | 942 | 24 | 40 | | evolution-ews | 2010-07-20 | 2012-11-06 | 265 | 8 | 10 | | evolution-exchange | 2004-05-11 | 2012-07-09 | 52 | 4 | 5 | | evolution-groupwise | 2011-05-04 | 2012-07-06 | 71 | 5 | 6 | | evolution-jescs | 2004-06-29 | 2011-08-25 | 0 | 0 | 0 | | evolution-kolab | 2010-06-10 | 2012-10-30 | 817 | 4 | 4 | | evolution-mapi | 2008-11-19 | 2012-11-06 | 185 | 3 | 4 | | evolution-rss | 2007-10-23 | 2012-10-28 | 43 | 5 | 6 | | evolution-scalix | 2006-02-10 | 2010-12-30 | 0 | 0 | 0 | | evolution-sharp | 2003-11-11 | 2011-03-09 | 0 | 0 | 0 | | evolution-webcal | 2004-02-07 | 2011-02-14 | 0 | 0 | 0 | | extensions-web | 2011-06-01 | 2012-10-25 | 703 | 5 | 5 | | f-spot | 2003-11-08 | 2012-11-03 | 98 | 7 | 10 | | fantasdic | 2006-03-09 | 2011-05-11 | 0 | 0 | 0 | | file-roller | 2002-08-01 | 2012-11-05 | 407 | 26 | 31 | | firestarter | 2003-01-23 | 2008-09-04 | 0 | 0 | 0 | | five-or-more | 1999-04-24 | 2012-11-02 | 103 | 15 | 18 |

94 C.2 GNOME

| folks | 2010-04-02 | 2012-11-06 | 404 | 19 | 21 | | foocanvas | 2002-02-11 | 2008-06-21 | 0 | 0 | 0 | | foundation-web | 2001-03-13 | 2012-11-07 | 35 | 5 | 5 | | four-in-a-row | 2002-04-05 | 2012-10-10 | 53 | 11 | 11 | | frogr | 2009-06-03 | 2012-11-04 | 162 | 5 | 7 | | gade | 2010-03-06 | 2010-03-08 | 0 | 0 | 0 | | gail | 2001-05-02 | 2008-09-07 | 0 | 0 | 0 | | galeon | 2000-07-06 | 2012-10-02 | 1 | 1 | 1 | | gamin | 2004-06-15 | 2009-12-15 | 0 | 0 | 0 | | garnome | 2005-11-13 | 2008-10-01 | 0 | 0 | 0 | | gb-rdp | 2012-08-22 | 2012-10-15 | 10 | 1 | 1 | | gbrainy | 2007-09-04 | 2012-11-04 | 87 | 5 | 6 | | gcalctool | 1997-01-04 | 2012-10-15 | 70 | 20 | 28 | | gcompris | 2001-10-29 | 2012-11-08 | 464 | 8 | 19 | | gconf | 1999-07-22 | 2012-10-18 | 29 | 7 | 10 | | gconf-editor | 2001-12-10 | 2012-05-03 | 9 | 5 | 5 | | gconfmm | 2002-01-27 | 2011-10-21 | 0 | 0 | 0 | | gcr | 2003-11-27 | 2012-10-27 | 179 | 9 | 12 | | gdesklets | 2003-09-04 | 2008-09-04 | 0 | 0 | 0 | | gdesklets-extras | 2003-09-04 | 2005-02-11 | 0 | 0 | 0 | | gdk-pixbuf | 1997-11-24 | 2012-11-03 | 74 | 16 | 21 | | gdl | 2000-01-12 | 2012-10-28 | 98 | 3 | 6 | | gdlmm | 2009-10-11 | 2012-05-15 | 3 | 1 | 1 | | gdm | 1999-04-18 | 2012-11-05 | 302 | 23 | 39 | | gedit | 1998-04-15 | 2012-11-04 | 345 | 32 | 48 | | gedit-code-assistance | 2011-08-25 | 2012-10-20 | 67 | 2 | 3 | | gedit-collaboration | 2010-02-10 | 2012-09-22 | 10 | 2 | 2 | | gedit-cossa | 2011-05-23 | 2012-06-09 | 4 | 3 | 4 | | gedit-latex | 2008-07-29 | 2012-10-19 | 29 | 5 | 6 | | gedit-plugins | 2003-02-21 | 2012-11-05 | 53 | 9 | 12 | | gegl | 1997-01-02 | 2012-11-07 | 653 | 21 | 30 | | gegl-clutter | 2008-01-10 | 2012-04-02 | 1 | 1 | 1 | | gegl-edit | 2012-07-26 | 2012-08-09 | 50 | 1 | 1 | | gegl-gtk | 2011-06-12 | 2012-07-20 | 34 | 2 | 3 | | gegl-qt | 2011-07-15 | 2012-09-14 | 26 | 1 | 1 | | geglmm | 2008-05-19 | 2012-04-16 | 10 | 1 | 1 | | genius | 2002-10-07 | 2012-10-22 | 66 | 7 | 12 | | geoclue-properties | 2009-06-01 | 2011-09-14 | 0 | 0 | 0 | | geocode-glib | 2011-04-21 | 2012-11-05 | 36 | 3 | 3 | | gevice | 2009-05-04 | 2012-09-28 | 19 | 2 | 2 | | gfloppy | 1999-09-22 | 2009-03-29 | 0 | 0 | 0 | | gftp | 2002-08-05 | 2012-03-20 | 1 | 1 | 1 | | ghex | 1998-02-11 | 2012-10-16 | 71 | 7 | 10 | | giggle | 2007-01-12 | 2012-11-01 | 37 | 3 | 5 | | gimmie | 2005-12-11 | 2009-01-12 | 0 | 0 | 0 | | gimp | 1997-01-01 | 2012-11-08 | 1747 | 62 | 93 | | gimp-data-extras | 1997-11-24 | 2008-05-10 | 0 | 0 | 0 | | gimp-freetype | 2000-04-17 | 2007-10-14 | 0 | 0 | 0 | | gimp-gap | 1999-03-18 | 2012-09-30 | 18 | 3 | 3 | | gimp-help-2 | 2002-02-14 | 2012-11-08 | 151 | 18 | 20 | | gimp-perl | 1998-10-23 | 2011-04-01 | 0 | 0 | 0 | | gimp-plugin-template | 2000-05-24 | 2009-02-24 | 0 | 0 | 0 | | gimp-pspi | 2001-12-25 | 2009-11-19 | 0 | 0 | 0 | | gimp-ruby | 2006-06-20 | 2010-06-04 | 0 | 0 | 0 | | gimp-tiny-fu | 2004-10-06 | 2012-05-12 | 5 | 3 | 3 | | gimp-web | 1997-01-04 | 2012-11-04 | 106 | 14 | 15 | | gimp-web-devel | 2003-11-12 | 2011-01-03 | 0 | 0 | 0 | | gio-strigi | 2009-02-26 | 2009-02-26 | 0 | 0 | 0 | | gitadmin-test | 2012-08-17 | 2012-10-09 | 16 | 1 | 1 | | gitg | 2008-06-24 | 2012-11-02 | 201 | 7 | 8 | | giv | 2002-05-29 | 2012-06-20 | 30 | 1 | 1 | | gjs | 2008-10-10 | 2012-11-06 | 154 | 10 | 15 | | glabels | 2002-02-24 | 2012-10-25 | 49 | 11 | 16 | | glade | 2001-06-19 | 2012-11-01 | 114 | 14 | 15 | | glade-web | 2001-04-19 | 2012-10-14 | 15 | 2 | 2 | | glib | 1998-06-10 | 2012-11-07 | 1552 | 78 | 136 | | glib-controller | 2010-04-29 | 2012-03-07 | 4 | 2 | 2 | | glib-networking | 2010-08-12 | 2012-10-31 | 66 | 7 | 9 | | glibmm | 2003-01-07 | 2012-11-05 | 203 | 6 | 11 | | glick2 | 2011-08-15 | 2012-09-06 | 27 | 2 | 3 | | glide | 2010-01-29 | 2010-06-05 | 0 | 0 | 0 | | glom | 2004-06-08 | 2012-11-07 | 437 | 18 | 20 | | glom-postgresql-setup | 2010-09-24 | 2011-10-11 | 0 | 0 | 0 | | gmime | 2000-10-24 | 2012-11-03 | 102 | 3 | 3 | | gnac | 2007-04-10 | 2012-09-20 | 128 | 6 | 6 | | gnet | 2000-01-20 | 2011-03-08 | 0 | 0 | 0 | | gnio | 2008-01-10 | 2009-05-22 | 0 | 0 | 0 | | gnoduino | 2007-10-06 | 2012-10-18 | 65 | 1 | 3 | | gnome-alsamixer | 2002-09-18 | 2012-06-27 | 23 | 2 | 3 | | gnome-applets | 1997-01-01 | 2012-10-28 | 17 | 4 | 5 | | gnome-backgrounds | 2003-08-30 | 2012-10-15 | 27 | 3 | 3 | | gnome-blog | 2003-08-27 | 2012-10-28 | 4 | 2 | 3 | | gnome-bluetooth | 2003-09-26 | 2012-10-30 | 175 | 16 | 25 | | gnome-boxes | 2011-09-29 | 2012-11-08 | 816 | 9 | 17 | | gnome-calculator | 1997-01-04 | 2012-10-16 | 71 | 20 | 28 | | gnome-calendar | 2012-04-25 | 2012-10-10 | 162 | 4 | 6 | | gnome-chess | 2006-10-28 | 2012-10-20 | 57 | 13 | 17 | | gnome-clocks | 2012-04-19 | 2012-11-06 | 225 | 10 | 17 | | gnome-color-manager | 2009-10-24 | 2012-10-08 | 130 | 9 | 13 | | gnome-commander | 2003-11-29 | 2012-10-28 | 142 | 7 | 8 |

95 C Code Repository Activity

| gnome-common | 1997-01-17 | 2012-11-02 | 27 | 6 | 12 | | gnome-contacts | 2011-05-05 | 2012-10-15 | 332 | 9 | 17 | | gnome-control-center | 1998-02-10 | 2012-11-06 | 1055 | 31 | 61 | | gnome-cookbook | 2007-11-14 | 2008-11-02 | 0 | 0 | 0 | | gnome-desktop | 1997-11-24 | 2012-10-31 | 126 | 27 | 36 | | gnome-desktop-testing | 2009-02-08 | 2009-05-18 | 0 | 0 | 0 | | gnome-devel-docs | 2000-09-21 | 2012-11-06 | 706 | 29 | 41 | | gnome-dictionary | 2005-12-16 | 2012-10-29 | 26 | 12 | 12 | | gnome-disk-utility | 2007-05-08 | 2012-11-07 | 389 | 7 | 10 | | gnome-doc-utils | 2004-03-05 | 2012-03-26 | 16 | 2 | 3 | | gnome-docker | 2008-04-22 | 2011-05-24 | 0 | 0 | 0 | | gnome-documents | 2011-06-28 | 2012-11-05 | 455 | 15 | 22 | | gnome-dvb-daemon | 2008-05-18 | 2012-10-03 | 37 | 1 | 3 | | gnome-edu | 2008-04-05 | 2010-04-18 | 0 | 0 | 0 | | gnome-font-viewer | 2010-11-03 | 2012-11-05 | 62 | 1 | 2 | | gnome-games | 1997-01-02 | 2012-10-17 | 748 | 34 | 63 | | gnome-games-deprecated | 1997-11-24 | 2009-08-16 | 0 | 0 | 0 | | gnome-games-extra-data | 2004-08-15 | 2012-05-22 | 2 | 2 | 2 | | gnome-getting-started-docs | 2012-10-19 | 2012-11-05 | 42 | 4 | 4 | | gnome-git-migration | 2009-01-08 | 2009-04-01 | 0 | 0 | 0 | | gnome-globalmenu | 2007-12-24 | 2011-01-28 | 0 | 0 | 0 | | gnome-hello | 1999-06-28 | 2012-09-12 | 8 | 7 | 7 | | gnome-i18n | 1997-01-01 | 2012-01-06 | 1 | 1 | 1 | | gnome-icon-theme | 1997-01-04 | 2012-08-08 | 7 | 2 | 2 | | gnome-icon-theme-extras | 2007-03-07 | 2012-10-11 | 2 | 2 | 2 | | gnome-icon-theme-symbolic | 2009-11-16 | 2012-10-11 | 89 | 4 | 5 | | gnome-initial-setup | 2012-04-13 | 2012-11-06 | 259 | 6 | 6 | | gnome-js-common | 2009-04-16 | 2010-04-01 | 0 | 0 | 0 | | gnome-keyring | 2003-11-27 | 2012-10-27 | 115 | 5 | 15 | | gnome-klotski | 1999-07-10 | 2012-11-05 | 46 | 10 | 11 | | gnome-launch-box | 2005-01-08 | 2010-02-10 | 0 | 0 | 0 | | gnome-lirc-properties | 2008-04-19 | 2011-04-08 | 0 | 0 | 0 | | gnome-mahjongg | 2012-07-15 | 2012-11-04 | 36 | 7 | 8 | | gnome-main-menu | 2006-06-26 | 2011-03-14 | 0 | 0 | 0 | | gnome-mastermind | 2007-04-19 | 2010-04-18 | 0 | 0 | 0 | | gnome-media | 1997-11-24 | 2012-06-07 | 7 | 2 | 3 | | gnome-menus | 2004-11-09 | 2012-09-25 | 29 | 5 | 6 | | gnome-mime-data | 2000-05-02 | 2010-01-05 | 0 | 0 | 0 | | gnome-mines | 1997-11-24 | 2012-10-09 | 144 | 18 | 25 | | gnome-modulesets | 2012-03-29 | 2012-10-04 | 52 | 2 | 2 | | gnome-mud | 1999-07-23 | 2012-10-28 | 10 | 2 | 2 | | gnome-music | 2012-07-29 | 2012-11-05 | 56 | 2 | 2 | | gnome-nds-thumbnailer | 2007-10-06 | 2011-09-14 | 0 | 0 | 0 | | gnome-nettool | 2004-01-23 | 2012-10-01 | 25 | 2 | 9 | | gnome-nibbles | 1999-02-01 | 2012-10-09 | 53 | 10 | 12 | | gnome-online-accounts | 2011-04-18 | 2012-11-07 | 213 | 14 | 21 | | gnome-ostree | 2012-05-08 | 2012-11-06 | 154 | 5 | 8 | | gnome-ostree-integration | 2012-09-21 | 2012-11-01 | 3 | 1 | 1 | | gnome-packagekit | 2007-08-23 | 2012-10-29 | 92 | 9 | 10 | | gnome-panel | 1997-11-24 | 2012-10-26 | 113 | 22 | 29 | | gnome-photos | 2012-04-23 | 2012-09-08 | 206 | 3 | 5 | | gnome-pilot | 1998-06-17 | 2011-12-05 | 1 | 1 | 1 | | gnome-pilot-conduits | 1998-08-13 | 2011-09-10 | 0 | 0 | 0 | | gnome-power-manager | 2005-07-12 | 2012-09-25 | 16 | 3 | 4 | | gnome-python | 2001-09-14 | 2010-03-31 | 0 | 0 | 0 | | gnome-python-desktop | 2001-09-14 | 2011-01-26 | 0 | 0 | 0 | | gnome-python-extras | 2001-09-14 | 2011-04-26 | 0 | 0 | 0 | | gnome-raw-thumbnailer | 2007-10-06 | 2011-12-16 | 6 | 1 | 1 | | gnome-robots | 1999-01-25 | 2012-10-09 | 62 | 12 | 12 | | gnome-scan | 2006-08-26 | 2011-04-03 | 0 | 0 | 0 | | gnome-schedule | 2004-06-07 | 2012-04-27 | 6 | 2 | 3 | | gnome-screensaver | 2005-04-14 | 2012-10-22 | 45 | 7 | 12 | | gnome-screenshot | 2001-05-31 | 2012-09-24 | 60 | 6 | 7 | | gnome-search-tool | 1998-05-25 | 2012-09-25 | 18 | 11 | 11 | | gnome-session | 1997-11-24 | 2012-11-06 | 97 | 12 | 18 | | gnome-settings-daemon | 2007-12-14 | 2012-11-05 | 829 | 26 | 53 | | gnome-sharing-service | 2010-06-15 | 2010-07-04 | 0 | 0 | 0 | | gnome-shell | 2008-10-31 | 2012-11-07 | 1362 | 47 | 78 | | gnome-shell-design | 2010-07-14 | 2012-08-31 | 30 | 2 | 2 | | gnome-shell-extensions | 2011-01-12 | 2012-11-07 | 117 | 3 | 10 | | gnome-software | 2012-05-24 | 2012-06-28 | 20 | 2 | 2 | | gnome-sound-theme | 2008-08-09 | 2009-04-26 | 0 | 0 | 0 | | gnome-specimen | 2008-06-17 | 2008-11-10 | 0 | 0 | 0 | | gnome-spell | 2000-09-20 | 2009-12-31 | 0 | 0 | 0 | | gnome-subtitles | 2005-01-31 | 2012-04-22 | 9 | 1 | 1 | | gnome-sudoku | 2006-10-21 | 2012-10-09 | 98 | 14 | 22 | | gnome-system-log | 2000-04-27 | 2012-11-05 | 72 | 19 | 22 | | gnome-system-monitor | 2001-06-30 | 2012-11-06 | 148 | 16 | 26 | | gnome-system-tools | 2000-08-23 | 2012-03-26 | 4 | 4 | 4 | | gnome-talos | 2011-09-22 | 2011-09-29 | 0 | 0 | 0 | | gnome-terminal | 2001-12-07 | 2012-10-27 | 152 | 13 | 20 | | gnome-tetravex | 1998-12-14 | 2012-10-09 | 68 | 14 | 15 | | gnome-themes-extras | 2003-01-23 | 2011-08-25 | 0 | 0 | 0 | | gnome-themes-standard | 2010-10-13 | 2012-11-02 | 710 | 16 | 18 | | gnome-tv | 2010-02-22 | 2010-03-30 | 0 | 0 | 0 | | gnome-tweak-tool | 2011-03-07 | 2012-10-16 | 76 | 5 | 15 | | gnome-university | 2012-11-04 | 2012-11-05 | 12 | 2 | 2 | | gnome-user-docs | 2000-08-16 | 2012-11-05 | 565 | 50 | 63 | | gnome-user-share | 2004-09-09 | 2012-09-29 | 45 | 12 | 15 | | gnome-vfs | 1997-01-04 | 2011-05-19 | 0 | 0 | 0 |

96 C.2 GNOME

| gnome-video-arcade | 2006-04-24 | 2012-02-16 | 17 | 2 | 2 | | gnome-video-effects | 2010-07-27 | 2012-11-06 | 7 | 1 | 3 | | gnome-web-photo | 2005-04-21 | 2012-10-08 | 8 | 2 | 2 | | gnome-web-wppo | 2011-05-08 | 2012-03-15 | 13 | 1 | 1 | | gnome-web-www | 2011-09-08 | 2012-11-05 | 127 | 20 | 23 | | gnome3-web | 2011-01-18 | 2011-09-06 | 0 | 0 | 0 | | gnomefr-web | 2003-12-14 | 2012-09-27 | 9 | 4 | 4 | | gnomemm-website | 2002-06-19 | 2012-05-27 | 8 | 5 | 6 | | gnomeradio | 2003-01-08 | 2011-08-25 | 0 | 0 | 0 | | gnomeweb-src | 2011-10-24 | 2011-10-24 | 0 | 0 | 0 | | gnote | 2009-03-12 | 2012-11-03 | 201 | 9 | 18 | | gnumeric | 1998-07-01 | 2012-11-07 | 657 | 12 | 17 | | gob | 1999-07-07 | 2012-07-15 | 2 | 1 | 1 | | gobject-introspection | 2005-05-09 | 2012-11-07 | 309 | 28 | 50 | | goffice | 1999-09-22 | 2012-11-07 | 256 | 5 | 5 | | goobox | 2004-10-14 | 2012-09-25 | 39 | 5 | 6 | | goocanvas | 2008-05-18 | 2011-10-19 | 0 | 0 | 0 | | goocanvasmm | 2007-10-17 | 2012-03-15 | 1 | 1 | 1 | | gparted | 2004-09-19 | 2012-11-04 | 165 | 10 | 16 | | gpointing-device-settings | 2009-02-24 | 2012-10-29 | 1 | 1 | 1 | | graph-gtk | 2012-07-13 | 2012-08-09 | 54 | 1 | 1 | | grilo | 2009-12-14 | 2012-11-08 | 176 | 8 | 17 | | grilo-mediaserver2 | 2010-03-04 | 2012-09-10 | 5 | 1 | 1 | | grilo-plugins | 2009-12-14 | 2012-11-08 | 92 | 8 | 15 | | grilomm | 2012-07-10 | 2012-10-12 | 8 | 2 | 2 | | grits | 2008-06-05 | 2012-05-23 | 77 | 1 | 2 | | gromit | 2005-12-06 | 2012-06-28 | 5 | 3 | 3 | | gsettings-desktop-schemas | 2010-07-02 | 2012-11-05 | 40 | 6 | 9 | | gssdp | 2006-04-19 | 2012-10-24 | 32 | 3 | 5 | | gstreamermm | 2007-12-31 | 2012-09-19 | 21 | 1 | 1 | | gswitchit_plugins | 2003-09-14 | 2012-10-02 | 2 | 2 | 2 | | gtetrinet | 2000-06-12 | 2011-09-28 | 0 | 0 | 0 | | gthumb | 2002-10-06 | 2012-11-04 | 457 | 6 | 12 | | gtk+ | 1997-11-24 | 2012-11-07 | 3476 | 135 | 199 | | gtk-doc | 1998-11-24 | 2012-11-06 | 43 | 11 | 18 | | gtk-doc-stub | 2011-12-31 | 2012-07-18 | 9 | 1 | 1 | | gtk-engines | 1998-09-24 | 2011-08-04 | 0 | 0 | 0 | | gtk-mac-bundler | 2007-11-03 | 2012-11-05 | 11 | 3 | 3 | | gtk-mac-integration | 2007-05-29 | 2012-11-01 | 27 | 3 | 4 | | gtk-osx | 2006-12-11 | 2012-11-06 | 126 | 3 | 6 | | gtk-quartz-engine | 2008-04-07 | 2010-10-09 | 0 | 0 | 0 | | gtk-theme-engine-clearlooks | 2005-03-14 | 2011-01-19 | 0 | 0 | 0 | | gtk-vnc | 2006-12-20 | 2012-09-04 | 80 | 3 | 7 | | gtk-web | 2002-06-11 | 2012-09-18 | 30 | 5 | 7 | | gtkglarea | 1999-01-31 | 2012-02-06 | 2 | 1 | 1 | | gtkglext | 2002-05-27 | 2011-05-29 | 0 | 0 | 0 | | gtkglext-sharp | 2003-12-07 | 2009-12-15 | 0 | 0 | 0 | | gtkglextmm | 2002-07-16 | 2011-03-29 | 0 | 0 | 0 | | gtkhtml | 1998-02-10 | 2012-09-16 | 47 | 3 | 6 | | gtkieembed | 2007-10-12 | 2009-02-14 | 0 | 0 | 0 | | gtkimageview | 2010-11-19 | 2011-10-03 | 0 | 0 | 0 | | gtkmathview | 2000-11-07 | 2012-04-10 | 4 | 2 | 2 | | gtkmm | 2003-01-21 | 2012-11-06 | 168 | 6 | 10 | | gtkmm-documentation | 2007-10-03 | 2012-10-14 | 143 | 6 | 10 | | gtkparasite | 2008-07-26 | 2012-10-10 | 27 | 2 | 2 | | gtksourceview | 2001-12-06 | 2012-11-04 | 116 | 13 | 18 | | gtksourceviewmm | 2006-06-22 | 2012-03-15 | 2 | 1 | 1 | | gtranslator | 2000-02-03 | 2012-11-02 | 144 | 18 | 19 | | gturing | 1998-08-12 | 2011-03-08 | 0 | 0 | 0 | | guadec-web | 2003-10-27 | 2010-06-23 | 0 | 0 | 0 | | guadec2010-web | 2003-10-27 | 2010-08-03 | 0 | 0 | 0 | | gucharmap | 2002-09-09 | 2012-10-27 | 81 | 13 | 15 | | guikachu | 2001-02-18 | 2010-04-07 | 0 | 0 | 0 | | gupnp | 2006-05-26 | 2012-11-05 | 57 | 4 | 10 | | gupnp-av | 2007-11-01 | 2012-10-29 | 60 | 2 | 6 | | gupnp-dlna | 2010-06-20 | 2012-08-31 | 16 | 2 | 2 | | gupnp-dlna-media | 2010-07-14 | 2012-06-23 | 1 | 1 | 1 | | gupnp-igd | 2008-09-30 | 2011-11-18 | 10 | 1 | 2 | | gupnp-tools | 2007-08-23 | 2012-10-08 | 7 | 1 | 1 | | gupnp-ui | 2007-08-15 | 2011-06-08 | 0 | 0 | 0 | | gupnp-vala | 2008-05-19 | 2012-10-06 | 13 | 1 | 1 | | gvdb | 2010-04-15 | 2012-07-08 | 8 | 3 | 4 | | gvfs | 2007-09-12 | 2012-11-06 | 348 | 19 | 32 | | gwget | 2004-06-10 | 2012-08-22 | 2 | 2 | 2 | | gxml | 2011-05-24 | 2012-10-09 | 135 | 3 | 4 | | gyrus | 2003-10-06 | 2012-10-28 | 3 | 2 | 2 | | hamster-applet | 2007-08-01 | 2012-09-13 | 1 | 1 | 1 | | happybirthdaygnome-web | 2012-08-13 | 2012-08-28 | 12 | 3 | 4 | | hardware-device-themes | 2009-07-29 | 2010-09-07 | 0 | 0 | 0 | | hipo | 2006-11-15 | 2010-06-23 | 0 | 0 | 0 | | hippo-canvas | 2006-08-24 | 2010-10-12 | 0 | 0 | 0 | | hitori | 2009-03-01 | 2012-11-01 | 13 | 6 | 7 | | horizon | 2005-12-29 | 2011-02-01 | 0 | 0 | 0 | | hotssh | 2008-05-20 | 2010-03-15 | 0 | 0 | 0 | | hyena | 2008-02-11 | 2012-09-15 | 13 | 2 | 3 | | iagno | 1997-01-02 | 2012-10-09 | 95 | 13 | 17 | | identica-glib | 2011-05-20 | 2011-06-12 | 0 | 0 | 0 | | introspection-doc-generator | 2010-03-19 | 2011-04-17 | 0 | 0 | 0 | | istanbul | 2005-06-12 | 2011-08-25 | 0 | 0 | 0 | | j5tester | 2009-01-09 | 2010-03-23 | 0 | 0 | 0 |

97 C Code Repository Activity

| jana | 2007-08-09 | 2011-06-23 | 0 | 0 | 0 | | java-access-bridge | 2002-04-20 | 2009-06-09 | 0 | 0 | 0 | | java-atk-wrapper | 2009-05-26 | 2011-06-13 | 0 | 0 | 0 | | java-gobject-introspection | 2008-08-30 | 2010-02-09 | 0 | 0 | 0 | | java-gobject-introspection-examples | 2008-09-02 | 2008-12-20 | 0 | 0 | 0 | | java-libglom | 2010-11-29 | 2012-05-03 | 61 | 2 | 2 | | jhbuild | 2001-10-23 | 2012-11-07 | 964 | 64 | 78 | | json-glib | 2007-09-20 | 2012-10-27 | 50 | 5 | 6 | | jumpnbumpmenu | 2004-07-01 | 2009-01-12 | 0 | 0 | 0 | | krb5-auth-dialog | 2004-08-16 | 2012-11-08 | 2 | 2 | 2 | | kupfer | 2007-12-01 | 2012-08-05 | 59 | 5 | 9 | | lasem | 2007-12-28 | 2012-11-06 | 200 | 4 | 4 | | last-exit | 2006-03-22 | 2012-02-22 | 1 | 1 | 1 | | latexila | 2010-06-16 | 2012-11-07 | 361 | 8 | 9 | | libart_lgpl | 1998-11-12 | 2010-04-01 | 0 | 0 | 0 | | libbonobo | 1999-02-03 | 2011-09-08 | 0 | 0 | 0 | | libbonoboui | 1998-12-08 | 2011-09-08 | 0 | 0 | 0 | | libbtctl | 2003-07-06 | 2009-02-19 | 0 | 0 | 0 | | libchamplain | 2008-08-11 | 2012-08-13 | 38 | 4 | 8 | | libchamplainmm | 2009-10-05 | 2011-05-24 | 0 | 0 | 0 | | libcroco | 2003-02-27 | 2012-10-25 | 36 | 5 | 8 | | libcryptui | 2003-01-08 | 2012-09-25 | 17 | 2 | 2 | | libdmapsharing | 2009-08-08 | 2012-07-15 | 9 | 1 | 1 | | libegg | 2006-02-02 | 2012-10-21 | 5 | 4 | 4 | | libepc | 2007-11-19 | 2012-01-30 | 4 | 2 | 3 | | libgail-gnome | 2002-01-03 | 2011-02-24 | 0 | 0 | 0 | | libgconf-bridge | 2005-11-28 | 2012-05-27 | 2 | 1 | 2 | | libgd | 2012-08-17 | 2012-11-08 | 41 | 6 | 7 | | libgda | 2000-08-10 | 2012-11-02 | 484 | 12 | 16 | | libgda-uimm | 2009-09-13 | 2012-10-28 | 1 | 1 | 1 | | libgdamm | 2002-04-14 | 2012-01-06 | 5 | 1 | 1 | | libgdata | 2009-01-03 | 2012-11-02 | 72 | 7 | 8 | | libgee | 2008-01-22 | 2012-11-04 | 62 | 3 | 7 | | libgeetk | 2008-07-21 | 2008-12-11 | 0 | 0 | 0 | | libgeexml | 2009-06-27 | 2009-07-07 | 0 | 0 | 0 | | libgit2-glib | 2011-08-06 | 2012-11-04 | 169 | 6 | 6 | | libglade | 1998-11-05 | 2010-01-04 | 0 | 0 | 0 | | libglademm | 2002-04-18 | 2011-09-28 | 0 | 0 | 0 | | libgnome | 1997-11-24 | 2011-09-08 | 0 | 0 | 0 | | libgnome-keyring | 2009-10-25 | 2012-10-27 | 43 | 7 | 9 | | libgnome-media-profiles | 2003-12-12 | 2012-02-22 | 1 | 1 | 1 | | libgnome-volume-control | 2012-10-19 | 2012-10-22 | 4 | 1 | 1 | | libgnomecanvas | 1998-05-27 | 2011-01-31 | 0 | 0 | 0 | | libgnomecanvasmm | 2001-12-04 | 2011-03-29 | 0 | 0 | 0 | | libgnomekbd | 2006-09-27 | 2012-09-25 | 27 | 2 | 8 | | libgnomeprint | 1997-01-01 | 2011-10-12 | 0 | 0 | 0 | | libgnomeprintui | 1998-09-29 | 2010-09-28 | 0 | 0 | 0 | | libgnomeui | 1997-11-24 | 2011-09-08 | 0 | 0 | 0 | | libgrss | 2010-03-18 | 2012-03-06 | 14 | 2 | 3 | | libgsf | 2002-05-23 | 2012-10-28 | 58 | 3 | 4 | | libgsystem | 2012-06-07 | 2012-10-31 | 11 | 1 | 2 | | libgtkmusic | 2011-12-27 | 2012-07-06 | 5 | 1 | 1 | | libgtop | 1998-05-19 | 2012-04-04 | 3 | 3 | 3 | | libgweather | 2007-11-22 | 2012-10-23 | 108 | 42 | 45 | | libgxps | 2010-09-03 | 2012-11-03 | 63 | 1 | 6 | | libIDL | 1998-06-13 | 2011-09-08 | 0 | 0 | 0 | | libmbca | 2008-07-23 | 2008-10-29 | 0 | 0 | 0 | | libmetaterm | 2011-03-19 | 2011-06-02 | 0 | 0 | 0 | | libnotify | 2004-06-27 | 2012-03-26 | 5 | 2 | 2 | | libnotifymm | 2007-09-25 | 2010-04-18 | 0 | 0 | 0 | | liboobs | 2005-04-29 | 2011-04-02 | 0 | 0 | 0 | | libpeas | 2009-10-23 | 2012-10-16 | 74 | 10 | 12 | | library-web | 2006-09-06 | 2012-10-29 | 74 | 10 | 12 | | librest | 2008-08-18 | 2012-08-22 | 32 | 7 | 11 | | librsvg | 2001-03-28 | 2012-10-16 | 175 | 6 | 17 | | librsvgmm | 2009-06-14 | 2011-05-24 | 0 | 0 | 0 | | libsecret | 2011-08-08 | 2012-11-06 | 108 | 5 | 6 | | libsigc++2 | 2003-01-13 | 2012-10-18 | 15 | 3 | 4 | | libsocialweb | 2008-10-23 | 2012-10-15 | 18 | 4 | 4 | | libsoup | 2000-12-06 | 2012-11-06 | 262 | 15 | 26 | | libsoupmm | 2009-08-25 | 2011-05-24 | 0 | 0 | 0 | | libvtemm | 2009-03-17 | 2011-06-25 | 0 | 0 | 0 | | libwnck | 2001-10-06 | 2012-09-04 | 28 | 2 | 4 | | libxml++ | 2003-12-18 | 2012-11-04 | 38 | 2 | 2 | | libxml2 | 1998-07-24 | 2012-10-30 | 219 | 6 | 56 | | libxslt | 1997-01-01 | 2012-10-25 | 54 | 4 | 19 | | libzapojit | 2012-05-12 | 2012-06-06 | 49 | 1 | 1 | | lightsoff | 2009-01-06 | 2012-11-04 | 57 | 14 | 17 | | linux-user-chroot | 2012-01-06 | 2012-08-10 | 22 | 1 | 3 | | longomatch | 2008-05-20 | 2012-11-09 | 266 | 1 | 1 | | mail-web | 2004-12-16 | 2012-10-01 | 13 | 2 | 3 | | mango | 2007-04-02 | 2012-10-22 | 5 | 2 | 2 | | marlin | 2002-06-02 | 2010-01-27 | 0 | 0 | 0 | | medusa | 2000-05-02 | 2008-02-18 | 0 | 0 | 0 | | meld | 2002-05-18 | 2012-11-07 | 171 | 1 | 13 | | memprof | 1999-10-20 | 2011-02-27 | 0 | 0 | 0 | | mess-desktop-entries | 2011-02-23 | 2011-05-14 | 0 | 0 | 0 | | metacity | 2001-05-30 | 2012-10-15 | 25 | 5 | 6 | | mhonarc | 2004-12-02 | 2012-07-15 | 23 | 3 | 3 | | mm-common | 2009-08-04 | 2012-10-22 | 6 | 2 | 2 |

98 C.2 GNOME

| mobile-broadband-provider-info | 2008-07-21 | 2012-10-25 | 58 | 4 | 37 | | model | 2009-10-31 | 2012-10-26 | 2 | 1 | 1 | | model-examples | 2009-10-31 | 2010-03-12 | 0 | 0 | 0 | | monet | 2009-07-23 | 2009-11-07 | 0 | 0 | 0 | | monkey-bubble | 1997-11-24 | 2011-12-01 | 1 | 1 | 1 | | monster-masher | 2003-09-13 | 2012-02-11 | 1 | 1 | 1 | | mortadelo | 2007-06-04 | 2011-07-10 | 0 | 0 | 0 | | moserial | 2009-03-06 | 2012-07-11 | 17 | 1 | 3 | | mousetrap | 2008-08-29 | 2010-04-12 | 0 | 0 | 0 | | mousetweaks | 2008-01-11 | 2012-11-06 | 28 | 3 | 3 | | msm | 2001-09-12 | 2006-12-15 | 0 | 0 | 0 | | murrine | 2008-02-11 | 2012-03-20 | 6 | 3 | 3 | | mutter | 2001-05-30 | 2012-11-05 | 222 | 22 | 30 | | nanny | 2009-12-21 | 2012-08-12 | 14 | 4 | 4 | | nautilus | 1997-01-02 | 2012-11-06 | 810 | 24 | 44 | | nautilus-actions | 2005-09-01 | 2012-10-16 | 400 | 3 | 8 | | nautilus-cd-burner | 2002-11-26 | 2008-12-17 | 0 | 0 | 0 | | nautilus-gtkhtml | 2001-04-03 | 2007-11-05 | 0 | 0 | 0 | | nautilus-ideviceinfo | 2010-03-21 | 2010-08-13 | 0 | 0 | 0 | | nautilus-image-converter | 2007-12-21 | 2011-04-16 | 0 | 0 | 0 | | nautilus-media | 2002-10-26 | 2007-11-05 | 0 | 0 | 0 | | nautilus-open-terminal | 2005-02-22 | 2012-03-27 | 1 | 1 | 1 | | nautilus-python | 2004-10-03 | 2011-03-28 | 0 | 0 | 0 | | nautilus-rc | 2003-05-31 | 2008-07-06 | 0 | 0 | 0 | | nautilus-rpm | 2002-07-30 | 2009-04-13 | 0 | 0 | 0 | | nautilus-sendto | 2004-10-30 | 2012-10-10 | 30 | 4 | 7 | | nautilus-share | 2006-01-09 | 2012-04-07 | 4 | 3 | 3 | | nautilus-sound-converter | 2008-03-19 | 2012-09-04 | 13 | 1 | 1 | | nautilus-vcs | 2003-11-19 | 2007-01-03 | 0 | 0 | 0 | | nemiver | 2006-06-22 | 2012-09-23 | 86 | 8 | 13 | | nemo | 2007-12-12 | 2009-06-16 | 0 | 0 | 0 | | netspeed | 2005-04-21 | 2012-08-25 | 2 | 1 | 2 | | network-manager-applet | 2007-02-02 | 2012-11-05 | 146 | 9 | 16 | | network-manager-iodine | 2012-02-08 | 2012-04-18 | 17 | 2 | 2 | | network-manager-openconnect | 2008-12-12 | 2012-11-07 | 78 | 7 | 10 | | network-manager-openswan | 2011-04-07 | 2012-08-07 | 11 | 2 | 2 | | network-manager-openvpn | 2008-12-11 | 2012-11-02 | 24 | 5 | 6 | | network-manager-pptp | 2008-12-11 | 2012-11-02 | 25 | 4 | 4 | | network-manager-vpnc | 2008-12-11 | 2012-09-26 | 28 | 3 | 4 | | newcomers-tutorial | 2012-09-30 | 2012-09-30 | 2 | 1 | 1 | | news-test-www | 2012-02-04 | 2012-03-09 | 69 | 2 | 2 | | niepce | 2006-10-14 | 2012-09-25 | 93 | 1 | 1 | | notification-daemon | 2004-06-28 | 2012-09-03 | 5 | 1 | 1 | | ocrfeeder | 2008-10-23 | 2012-10-31 | 55 | 7 | 9 | | office-runner | 2011-09-14 | 2011-09-16 | 0 | 0 | 0 | | online-desktop | 2007-04-24 | 2011-01-28 | 0 | 0 | 0 | | ontv | 2005-07-04 | 2011-03-16 | 0 | 0 | 0 | | opengl-glib | 2009-01-28 | 2009-06-02 | 0 | 0 | 0 | | ORBit2 | 1998-02-19 | 2011-09-11 | 0 | 0 | 0 | | orca | 2004-05-21 | 2012-11-06 | 368 | 16 | 26 | | ostree | 2011-10-09 | 2012-10-31 | 632 | 6 | 9 | | ostree-init | 2012-01-16 | 2012-02-03 | 9 | 1 | 1 | | pan2 | 2006-10-02 | 2012-10-07 | 311 | 5 | 5 | | pango | 1997-01-01 | 2012-11-07 | 166 | 14 | 17 | | pangomm | 2008-07-18 | 2012-10-26 | 1 | 1 | 1 | | pangox-compat | 2012-08-27 | 2012-10-16 | 8 | 1 | 1 | | passepartout | 2001-10-15 | 2011-04-03 | 0 | 0 | 0 | | pdfmod | 2009-07-21 | 2011-11-28 | 2 | 1 | 2 | | perl-Cairo | 2004-11-05 | 2012-10-03 | 25 | 2 | 2 | | perl-Cairo-GObject | 2011-08-07 | 2011-10-13 | 0 | 0 | 0 | | perl-Champlain | 2008-08-11 | 2010-05-18 | 0 | 0 | 0 | | perl-Clutter | 2011-02-27 | 2012-05-04 | 12 | 1 | 1 | | perl-ExtUtils-Depends | 2003-06-18 | 2011-01-26 | 0 | 0 | 0 | | perl-ExtUtils-PkgConfig | 2003-09-16 | 2012-04-27 | 7 | 3 | 3 | | perl-Glib | 2003-05-17 | 2012-11-03 | 48 | 2 | 6 | | perl-Glib-IO | 2010-04-17 | 2010-05-03 | 0 | 0 | 0 | | perl-Glib-Object-Introspection | 2010-04-17 | 2012-11-04 | 55 | 3 | 4 | | perl-Gnome2 | 2003-04-17 | 2012-01-08 | 1 | 1 | 1 | | perl-Gnome2-Canvas | 2003-06-16 | 2011-11-24 | 1 | 1 | 1 | | perl-Gnome2-Dia | 2004-09-14 | 2011-11-24 | 1 | 1 | 1 | | perl-Gnome2-GConf | 2003-11-17 | 2008-10-05 | 0 | 0 | 0 | | perl-Gnome2-PanelApplet | 2004-01-30 | 2012-01-08 | 1 | 1 | 1 | | perl-Gnome2-Print | 2003-04-17 | 2008-10-05 | 0 | 0 | 0 | | perl-Gnome2-Rsvg | 2003-12-25 | 2012-01-08 | 1 | 1 | 1 | | perl-Gnome2-VFS | 2003-10-19 | 2012-01-08 | 1 | 1 | 1 | | perl-Gnome2-Vte | 2003-11-25 | 2012-02-29 | 4 | 2 | 2 | | perl-Gnome2-Wnck | 2003-10-11 | 2008-10-05 | 0 | 0 | 0 | | perl-Goo-Canvas | 2009-05-06 | 2009-08-23 | 0 | 0 | 0 | | perl-GStreamer | 2005-03-23 | 2012-04-05 | 4 | 2 | 2 | | perl-GStreamer-GConf | 2005-08-13 | 2011-11-24 | 2 | 1 | 1 | | perl-GStreamer-Interfaces | 2005-09-28 | 2012-01-08 | 1 | 1 | 1 | | perl-Gtk2 | 2003-04-17 | 2012-09-23 | 17 | 2 | 2 | | perl-Gtk2-Champlain | 2008-08-11 | 2010-05-16 | 0 | 0 | 0 | | perl-Gtk2-GladeXML | 2003-05-17 | 2008-10-05 | 0 | 0 | 0 | | perl-Gtk2-GLExt | 2003-11-16 | 2008-10-05 | 0 | 0 | 0 | | perl-Gtk2-Html2 | 2004-04-24 | 2008-10-05 | 0 | 0 | 0 | | perl-Gtk2-MozEmbed | 2004-08-16 | 2012-01-08 | 1 | 1 | 1 | | perl-Gtk2-SourceView | 2004-01-30 | 2006-01-30 | 0 | 0 | 0 | | perl-Gtk2-SourceView2 | 2009-10-23 | 2010-05-30 | 0 | 0 | 0 | | perl-Gtk2-Spell | 2003-04-26 | 2012-01-03 | 4 | 1 | 1 |

99 C Code Repository Activity

| perl-Gtk2-Unique | 2009-04-02 | 2012-04-08 | 1 | 1 | 1 | | perl-Gtk3 | 2011-08-25 | 2012-11-04 | 40 | 1 | 2 | | perl-Pango | 2008-11-02 | 2012-01-08 | 3 | 2 | 2 | | pessulus | 2005-09-13 | 2012-05-21 | 2 | 2 | 2 | | phonemgr | 2004-06-17 | 2012-05-15 | 35 | 1 | 3 | | pinpoint | 2010-06-21 | 2012-11-04 | 42 | 5 | 9 | | pitivi | 2004-05-01 | 2012-11-05 | 800 | 13 | 32 | | planet-web | 2005-09-02 | 2012-10-10 | 182 | 16 | 16 | | planner | 2003-12-01 | 2012-08-30 | 21 | 3 | 9 | | plgtkimageview | 2011-10-05 | 2011-10-05 | 0 | 0 | 0 | | podsleuth | 2007-04-03 | 2010-05-10 | 0 | 0 | 0 | | PolicyKit-gnome | 2008-04-04 | 2012-09-05 | 3 | 2 | 1 | | postr | 2006-08-15 | 2012-10-04 | 13 | 4 | 4 | | pyatspi2 | 2001-07-25 | 2012-11-06 | 54 | 7 | 10 | | pybank | 2005-05-12 | 2009-06-02 | 0 | 0 | 0 | | pybliographer | 1999-11-22 | 2012-04-09 | 3 | 3 | 3 | | pyclutter | 2006-06-23 | 2012-03-16 | 1 | 1 | 1 | | pygda | 2001-09-14 | 2011-04-11 | 0 | 0 | 0 | | pygio | 2008-01-19 | 2011-02-04 | 0 | 0 | 0 | | pygobject | 2000-06-26 | 2012-11-06 | 423 | 15 | 51 | | pygoocanvas | 2006-06-08 | 2010-11-11 | 0 | 0 | 0 | | pygtk | 1998-12-06 | 2011-10-02 | 0 | 0 | 0 | | pygtk-docs | 2004-01-29 | 2011-03-14 | 0 | 0 | 0 | | pygtk-web | 2003-12-11 | 2012-10-07 | 6 | 1 | 1 | | pygtkglext | 2003-03-06 | 2010-01-12 | 0 | 0 | 0 | | pygtkimageview | 2011-10-03 | 2011-10-03 | 0 | 0 | 0 | | pyorbit | 2002-09-21 | 2010-04-18 | 0 | 0 | 0 | | quadrapassel | 2009-10-26 | 2012-10-09 | 76 | 16 | 17 | | regexxer | 2002-10-15 | 2011-10-06 | 0 | 0 | 0 | | release-notes | 2008-03-01 | 2012-03-22 | 4 | 2 | 2 | | releng | 2000-08-24 | 2012-10-26 | 72 | 10 | 11 | | rhythmbox | 2002-06-09 | 2012-11-06 | 280 | 14 | 36 | | rygel | 2008-04-23 | 2012-11-01 | 423 | 4 | 17 | | sabayon | 2005-01-21 | 2011-09-15 | 0 | 0 | 0 | | sapwood | 2005-07-14 | 2010-11-02 | 0 | 0 | 0 | | seahorse | 2003-01-08 | 2012-10-22 | 136 | 10 | 16 | | seahorse-nautilus | 2008-04-23 | 2012-10-15 | 15 | 1 | 1 | | seahorse-plugins | 2008-04-23 | 2012-07-16 | 1 | 1 | 1 | | seahorse-sharing | 2003-01-08 | 2012-09-25 | 5 | 1 | 1 | | seed | 2008-10-17 | 2012-08-10 | 22 | 2 | 4 | | seed-examples | 2009-10-07 | 2012-06-09 | 1 | 1 | 1 | | shell-perf-web | 2010-05-20 | 2010-05-26 | 0 | 0 | 0 | | silky | 2003-07-31 | 2008-07-16 | 0 | 0 | 0 | | snappy | 2011-02-26 | 2012-10-02 | 126 | 5 | 8 | | snowy | 2009-04-18 | 2011-10-09 | 0 | 0 | 0 | | sodipodi | 2000-01-09 | 2012-10-05 | 4 | 1 | 1 | | solang | 2009-05-16 | 2011-04-24 | 0 | 0 | 0 | | sound-juicer | 2003-03-30 | 2012-09-06 | 86 | 7 | 12 | | sourcerank | 2010-11-09 | 2011-04-11 | 0 | 0 | 0 | | soylent | 2007-11-02 | 2008-10-14 | 0 | 0 | 0 | | splinter | 2009-09-07 | 2011-02-18 | 0 | 0 | 0 | | strongwind | 2007-10-19 | 2010-04-18 | 0 | 0 | 0 | | sushi | 2011-04-01 | 2012-09-24 | 88 | 9 | 11 | | svn-web | 2005-11-05 | 2011-10-14 | 0 | 0 | 0 | | swell-foop | 2009-10-26 | 2012-11-04 | 61 | 12 | 16 | | sysadmin-bin | 2005-08-21 | 2012-10-09 | 37 | 3 | 4 | | sysprof | 2004-04-27 | 2012-09-08 | 11 | 3 | 3 | | system-tools-backends-clone | 2000-08-23 | 2010-03-29 | 0 | 0 | 0 | | tali | 1998-06-25 | 2012-10-09 | 43 | 11 | 12 | | tasks | 2007-02-20 | 2012-02-23 | 23 | 2 | 3 | | tasque | 2008-03-12 | 2012-10-30 | 201 | 1 | 4 | | tbo | 2009-12-10 | 2011-08-27 | 0 | 0 | 0 | | telegnome | 2000-05-01 | 2012-09-26 | 2 | 2 | 2 | | tempo | 2011-05-15 | 2011-09-23 | 0 | 0 | 0 | | testinggtk | 2008-05-17 | 2009-07-10 | 0 | 0 | 0 | | testuser-repos | 2011-04-08 | 2011-04-08 | 0 | 0 | 0 | | tomboy | 2004-09-18 | 2012-10-24 | 89 | 18 | 26 | | torrent-web | 2007-10-09 | 2010-09-29 | 0 | 0 | 0 | | totem | 2002-07-14 | 2012-11-06 | 426 | 21 | 40 | | totem-pl-parser | 2007-12-03 | 2012-10-29 | 65 | 3 | 3 | | tracker | 2005-12-14 | 2012-11-04 | 386 | 16 | 24 | | tracker-upnp | 2011-02-07 | 2012-06-12 | 2 | 1 | 2 | | transmageddon | 2009-03-21 | 2012-10-05 | 86 | 5 | 5 | | turbine | 2009-04-17 | 2012-08-30 | 5 | 2 | 3 | | unique | 2007-07-07 | 2011-06-14 | 0 | 0 | 0 | | uniquemm | 2009-09-05 | 2011-05-24 | 0 | 0 | 0 | | usability-lab | 2009-10-11 | 2009-10-11 | 0 | 0 | 0 | | vala | 2006-04-21 | 2012-11-03 | 444 | 19 | 57 | | vala-bootstrap | 2012-01-18 | 2012-08-06 | 5 | 2 | 2 | | vala-tests | 2008-10-17 | 2010-08-17 | 0 | 0 | 0 | | valadoc | 2008-04-26 | 2012-10-26 | 152 | 5 | 7 | | vicious-extensions | 2001-07-09 | 2010-06-02 | 0 | 0 | 0 | | video-subtitles | 2010-07-22 | 2012-10-22 | 2 | 2 | 2 | | vinagre | 2007-06-06 | 2012-10-20 | 67 | 18 | 27 | | vino | 2004-02-05 | 2012-10-20 | 43 | 2 | 7 | | vte | 2002-02-25 | 2011-11-26 | 1 | 1 | 1 | | webkitgtk-tarball-releases | 2012-09-22 | 2012-09-26 | 84 | 1 | 1 | | wiican | 2009-02-06 | 2012-08-20 | 17 | 1 | 1 | | xchat-gnome | 2004-01-20 | 2012-09-25 | 9 | 3 | 8 | | xdg-user-dirs-gtk | 2007-03-01 | 2012-04-03 | 6 | 2 | 3 |

100 C.2 GNOME

| xmlsec | 2002-04-26 | 2012-07-29 | 9 | 1 | 1 | | yelp | 1998-02-20 | 2012-11-06 | 46 | 3 | 4 | | yelp-tools | 2004-03-05 | 2012-10-15 | 26 | 2 | 3 | | yelp-xsl | 2004-03-05 | 2012-11-05 | 178 | 2 | 3 | | zenity | 2003-01-03 | 2012-09-25 | 55 | 17 | 20 | +------+------+------+------+------+------+

101 D Disclosure of Interest

The author has been involved in the GNOME project since 2004, spends significant time on the Wikimedia project, and has contributed to other FOSS projects such as Maemo, MeeGo and Mozilla.

102