Merge lp:~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed into lp:unity-scope-click

Proposed by Allan LeSage
Status: Superseded
Proposed branch: lp:~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed
Merge into: lp:unity-scope-click
Diff against target: 312 lines (+271/-0)
5 files modified
CMakeLists.txt (+20/-0)
cmake/EnableCoverageReport.cmake (+158/-0)
cmake/FindLcov.cmake (+35/-0)
cmake/Findgcovr.cmake (+43/-0)
debian/copyright (+15/-0)
To merge this branch: bzr merge lp:~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Needs Fixing
dobey Pending
Review via email: mp+218164@code.launchpad.net

This proposal supersedes a proposal from 2014-04-10.

Description of the change

Here we're adding some CMake tooling to aid in the generation of coverage reports. As described in the top-level CMakeLists.txt, after you've make and make test'ed, try make coverage and look for a coveragereport dir with html files in your build dir.

Note that you'll need a couple of dependencies, esp. lcov and gcovr --note that unity8 and mir have elected not to make these part of the debian/control deps. Also note that this method is borrowed wholesale from those projects and others, with some adaptation for your project.

We have some good tests to build on here :) , maybe the html view will help.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:209
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~allanlesage/unity-scope-click/enable-coverage-reporting/+merge/215319/+edit-commit-message

http://jenkins.qa.ubuntu.com/job/unity-scope-click-ci/428/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-amd64-ci/329
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-armhf-ci/326
        deb: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-armhf-ci/326/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity-scope-click-ci/428/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

Please use "bzr commit unchanged --fixes=lp:1305180" so that bug #1305180 is linked to the branch.

Revision history for this message
dobey (dobey) : Posted in a previous version of this proposal
review: Needs Fixing
Revision history for this message
Allan LeSage (allanlesage) wrote : Posted in a previous version of this proposal

Done; sorry for the delay :) .

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Approve (continuous-integration)
Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

As unity-scope-click is under the CLA, and is distributed as GPLv3+OpenSSL exception, I wonder if we can include this, given the cmake module being copy/pasted here is GPLv2+ without such an exception.

Is there any reason we cannot package the bits being added under cmake/ as a separate project/package in Ubuntu, which all our projects depend on? It will make updating for any changes much easier, and will not introduce such copyright/license conflicts in the distribution of the source.

Also, where is the ParseArguments.cmake module from? It has no copyright information at all in it, so I wonder if we are even allowed to redistribute it? Is there a particular reason that the standard cmake argument parsing module can't be used?

I'm basically OK with the changes that enable the feature, but I think we need to ship the actual cmake module separately as its own package.

Revision history for this message
Allan LeSage (allanlesage) wrote : Posted in a previous version of this proposal

I've long wanted to find the means to do this, but I'm wondering to where our CMake coverage bits would be shipped? I may need some instructio--meanwhile I'll try to collect some licensing information from Canonical committers for the files you've singled out.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Approve (continuous-integration)
Revision history for this message
Allan LeSage (allanlesage) wrote : Posted in a previous version of this proposal

Switched to the standard CMake argument parsing macro per dobey's suggestion.

Rodney, do lines 67-8 resolve your licensing concern?

Lastly can you provide some instruction on packaging these CMake files? I.e. does a standard archive exist already for such, and how are they invoked, etc.?

Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

> Rodney, do lines 67-8 resolve your licensing concern?

Not really. The license is still different from the rest of the code we ship. And we cannot add the OpenSSL exception clause to this license. With the other file, which had no copyright/license info at all, gone from the branch, the licensing is at least something we are legally allowed to redistribute (and change) now. It just means shipping things under different licenses, in the same source, and having to deal with managing any necessary changes to these files across several projects, versus a central source for it.

> Lastly can you provide some instruction on packaging these CMake files? I.e.
> does a standard archive exist already for such, and how are they invoked,
> etc.?

On Ubuntu at least, cmake-data and qtbase5-dev include the majority of cmake modules. The Qt ones are shipped by Qt, and not cmake. I'm not sure why these haven't been included in upstream cmake already, but getting them accepted there would be one way to get them packaged centrally. Another option would be inside the gcovr/lcov packages, if the licensing allows for it. And another option would be to simply place them in their own package, cmake-coverage or something, which only ships these files.

Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

17 +include(EnableCoverageReport)

Can you include a comment next to this, in the form of "# Using gcov cmake modules from https://wherever/they/came/from" so that we have a link to the true upstream of these cmake files?

Also, can you please update debian/copyright to add the necessary bits for the cmake/*.cmake files, which are not (C) Canonical, and which are GPLv2+ rather than GPLv3+OpenSSL?

review: Needs Fixing
Revision history for this message
Allan LeSage (allanlesage) wrote :

Resubmitted under a fresh branch based on devel per dobey's req, updating to the most recent upstream versions of these macros and registering the proper license in debian/copyright, with requested notes.

Note that our version of EnableCoverageReport.cmake differs from the upstream version in omitting the ParseArguments.cmake, which is unlicensed upstream--instead we're using a CMake-native macro (as in the original version of this MP).

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:238
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed/+merge/218164/+edit-commit-message

http://jenkins.qa.ubuntu.com/job/unity-scope-click-ci/460/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-amd64-ci/361/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-armhf-ci/358/console

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity-scope-click-ci/460/rebuild

review: Needs Fixing (continuous-integration)
239. By Allan LeSage

Correct Wienke copyright to 2010-2012, correct cor-lab.org URL.

240. By Allan LeSage

Coverage tooling origin comment http->https per dobey req.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2014-04-30 16:00:10 +0000
+++ CMakeLists.txt 2014-05-02 22:12:55 +0000
@@ -10,6 +10,8 @@
10SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -Wall -Wextra -Werror -fPIC")10SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -Wall -Wextra -Werror -fPIC")
11SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -g -Wextra -Wall -Werror -fPIC")11SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -g -Wextra -Wall -Werror -fPIC")
1212
13set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
14
13include(GNUInstallDirs)15include(GNUInstallDirs)
1416
15set(SCOPE_LIB_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/unity-scopes/clickscope/)17set(SCOPE_LIB_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/unity-scopes/clickscope/)
@@ -38,6 +40,24 @@
38add_subdirectory(data)40add_subdirectory(data)
39add_subdirectory(po)41add_subdirectory(po)
4042
43include(EnableCoverageReport) # Using gcov CMake modules from http://code.cor-lab/projects/rsc
44#####################################################################
45# Enable code coverage calculation with gcov/gcovr/lcov
46# Usage:
47# * Switch build type to coverage (use ccmake or cmake-gui)
48# * Invoke make, make test, make coverage (or ninja if you use that backend)
49# * Find html report in subdir coveragereport
50# * Find xml report feasible for jenkins in coverage.xml
51#####################################################################
52string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower)
53if(cmake_build_type_lower MATCHES coverage)
54 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage" )
55 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage" )
56 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage" )
57 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage" )
58 ENABLE_COVERAGE_REPORT(TARGETS ${SCOPE_LIB_UNVERSIONED} FILTER /usr/include ${CMAKE_SOURCE_DIR}/tests/* ${CMAKE_BINARY_DIR}/*)
59endif()
60
41# Custom targets for the tests61# Custom targets for the tests
42add_custom_target (test62add_custom_target (test
43 DEPENDS test-click-scope63 DEPENDS test-click-scope
4464
=== added directory 'cmake'
=== added file 'cmake/EnableCoverageReport.cmake'
--- cmake/EnableCoverageReport.cmake 1970-01-01 00:00:00 +0000
+++ cmake/EnableCoverageReport.cmake 2014-05-02 22:12:55 +0000
@@ -0,0 +1,158 @@
1# - Creates a special coverage build type and target on GCC.
2#
3# Defines a function ENABLE_COVERAGE_REPORT which generates the coverage target
4# for selected targets. Optional arguments to this function are used to filter
5# unwanted results using globbing expressions. Moreover targets with tests for
6# the source code can be specified to trigger regenerating the report if the
7# test has changed
8#
9# ENABLE_COVERAGE_REPORT(TARGETS target... [FILTER filter...] [TESTS test targets...])
10#
11# To generate a coverage report first build the project with
12# CMAKE_BUILD_TYPE=coverage, then call make test and afterwards make coverage.
13#
14# The coverage report is based on gcov. Depending on the availability of lcov
15# a HTML report will be generated and/or an XML report of gcovr is found.
16# The generated coverage target executes all found solutions. Special targets
17# exist to create e.g. only the xml report: coverage-xml.
18#
19# Copyright (C) 2010 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
20#
21# This file may be licensed under the terms of the
22# GNU Lesser General Public License Version 3 (the ``LGPL''),
23# or (at your option) any later version.
24#
25# Software distributed under the License is distributed
26# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
27# express or implied. See the LGPL for the specific language
28# governing rights and limitations.
29#
30# You should have received a copy of the LGPL along with this
31# program. If not, go to http://www.gnu.org/licenses/lgpl.html
32# or write to the Free Software Foundation, Inc.,
33# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
34#
35# The development of this software was supported by:
36# CoR-Lab, Research Institute for Cognition and Robotics
37# Bielefeld University
38
39FIND_PACKAGE(Lcov)
40FIND_PACKAGE(gcovr)
41
42FUNCTION(ENABLE_COVERAGE_REPORT)
43
44 # argument parsing
45 SET(MULTI_VALUE_ARGS FILTER TARGETS TESTS)
46 CMAKE_PARSE_ARGUMENTS(ENABLE_COVERAGE_REPORT "" "" "${MULTI_VALUE_ARGS}" ${ARGN})
47
48 SET(COVERAGE_RAW_FILE "${CMAKE_BINARY_DIR}/coverage.raw.info")
49 SET(COVERAGE_FILTERED_FILE "${CMAKE_BINARY_DIR}/coverage.info")
50 SET(COVERAGE_REPORT_DIR "${CMAKE_BINARY_DIR}/coveragereport")
51 SET(COVERAGE_XML_FILE "${CMAKE_BINARY_DIR}/coverage.xml")
52 SET(COVERAGE_XML_COMMAND_FILE "${CMAKE_BINARY_DIR}/coverage-xml.cmake")
53
54 # decide if there is any tool to create coverage data
55 SET(TOOL_FOUND FALSE)
56 IF(LCOV_FOUND OR GCOVR_FOUND)
57 SET(TOOL_FOUND TRUE)
58 ENDIF()
59 IF(NOT TOOL_FOUND)
60 MESSAGE(STATUS "Cannot enable coverage targets because neither lcov nor gcovr are found.")
61 ENDIF()
62
63 STRING(TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE)
64 IF(CMAKE_COMPILER_IS_GNUCXX AND TOOL_FOUND AND "${COVERAGE_BUILD_TYPE}" MATCHES "coverage")
65
66 MESSAGE(STATUS "Coverage support enabled for targets: ${ENABLE_COVERAGE_REPORT_TARGETS}")
67
68 # create coverage build type
69 SET(CMAKE_CXX_FLAGS_COVERAGE ${CMAKE_CXX_FLAGS_DEBUG} PARENT_SCOPE)
70 SET(CMAKE_C_FLAGS_COVERAGE ${CMAKE_C_FLAGS_DEBUG} PARENT_SCOPE)
71 SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} coverage PARENT_SCOPE)
72
73 # instrument targets
74 SET_TARGET_PROPERTIES(${ENABLE_COVERAGE_REPORT_TARGETS} PROPERTIES COMPILE_FLAGS --coverage
75 LINK_FLAGS --coverage)
76
77 # html report
78 IF (LCOV_FOUND)
79
80 MESSAGE(STATUS "Enabling HTML coverage report")
81
82 # set up coverage target
83
84 ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_RAW_FILE}
85 COMMAND ${LCOV_EXECUTABLE} -c -d ${CMAKE_BINARY_DIR} -o ${COVERAGE_RAW_FILE}
86 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
87 COMMENT "Collecting coverage data"
88 DEPENDS ${ENABLE_COVERAGE_REPORT_TARGETS} ${ENABLE_COVERAGE_REPORT_TESTS}
89 VERBATIM)
90
91 # filter unwanted stuff
92 LIST(LENGTH ENABLE_COVERAGE_REPORT_FILTER FILTER_LENGTH)
93 IF(${FILTER_LENGTH} GREATER 0)
94 SET(FILTER COMMAND ${LCOV_EXECUTABLE})
95 FOREACH(F ${ENABLE_COVERAGE_REPORT_FILTER})
96 SET(FILTER ${FILTER} -r ${COVERAGE_FILTERED_FILE} ${F})
97 ENDFOREACH()
98 SET(FILTER ${FILTER} -o ${COVERAGE_FILTERED_FILE})
99 ELSE()
100 SET(FILTER "")
101 ENDIF()
102
103 ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_FILTERED_FILE}
104 COMMAND ${LCOV_EXECUTABLE} -e ${COVERAGE_RAW_FILE} "${CMAKE_SOURCE_DIR}*" -o ${COVERAGE_FILTERED_FILE}
105 ${FILTER}
106 DEPENDS ${COVERAGE_RAW_FILE}
107 COMMENT "Filtering recorded coverage data for project-relevant entries"
108 VERBATIM)
109 ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_REPORT_DIR}
110 COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_REPORT_DIR}
111 COMMAND ${GENHTML_EXECUTABLE} --legend --show-details -t "${PROJECT_NAME} test coverage" -o ${COVERAGE_REPORT_DIR} ${COVERAGE_FILTERED_FILE}
112 DEPENDS ${COVERAGE_FILTERED_FILE}
113 COMMENT "Generating HTML coverage report in ${COVERAGE_REPORT_DIR}"
114 VERBATIM)
115
116 ADD_CUSTOM_TARGET(coverage-html
117 DEPENDS ${COVERAGE_REPORT_DIR})
118
119 ENDIF()
120
121 # xml coverage report
122 IF(GCOVR_FOUND)
123
124 MESSAGE(STATUS "Enabling XML coverage report")
125
126 # gcovr cannot write directly to a file so the execution needs to
127 # be wrapped in a cmake file that generates the file output
128 FILE(WRITE ${COVERAGE_XML_COMMAND_FILE}
129 "SET(ENV{LANG} en)\n")
130 FILE(APPEND ${COVERAGE_XML_COMMAND_FILE}
131 "EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" -x -r \"${CMAKE_SOURCE_DIR}\" OUTPUT_FILE \"${COVERAGE_XML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n")
132
133 ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_XML_FILE}
134 COMMAND ${CMAKE_COMMAND} ARGS -P ${COVERAGE_XML_COMMAND_FILE}
135 COMMENT "Generating coverage XML report"
136 VERBATIM)
137
138 ADD_CUSTOM_TARGET(coverage-xml
139 DEPENDS ${COVERAGE_XML_FILE})
140
141 ENDIF()
142
143 # provide a global coverage target executing both steps if available
144 SET(GLOBAL_DEPENDS "")
145 IF(LCOV_FOUND)
146 LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_REPORT_DIR})
147 ENDIF()
148 IF(GCOVR_FOUND)
149 LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_XML_FILE})
150 ENDIF()
151 IF(LCOV_FOUND OR GCOVR_FOUND)
152 ADD_CUSTOM_TARGET(coverage
153 DEPENDS ${GLOBAL_DEPENDS})
154 ENDIF()
155
156 ENDIF()
157
158ENDFUNCTION()
0159
=== added file 'cmake/FindLcov.cmake'
--- cmake/FindLcov.cmake 1970-01-01 00:00:00 +0000
+++ cmake/FindLcov.cmake 2014-05-02 22:12:55 +0000
@@ -0,0 +1,35 @@
1# - Find lcov
2# Will define:
3#
4# LCOV_EXECUTABLE - the lcov binary
5# GENHTML_EXECUTABLE - the genhtml executable
6#
7# Copyright (C) 2010 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
8#
9# This file may be licensed under the terms of the
10# GNU Lesser General Public License Version 3 (the ``LGPL''),
11# or (at your option) any later version.
12#
13# Software distributed under the License is distributed
14# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
15# express or implied. See the LGPL for the specific language
16# governing rights and limitations.
17#
18# You should have received a copy of the LGPL along with this
19# program. If not, go to http://www.gnu.org/licenses/lgpl.html
20# or write to the Free Software Foundation, Inc.,
21# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22#
23# The development of this software was supported by:
24# CoR-Lab, Research Institute for Cognition and Robotics
25# Bielefeld University
26
27INCLUDE(FindPackageHandleStandardArgs)
28
29FIND_PROGRAM(LCOV_EXECUTABLE lcov)
30FIND_PROGRAM(GENHTML_EXECUTABLE genhtml)
31
32FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lcov DEFAULT_MSG LCOV_EXECUTABLE GENHTML_EXECUTABLE)
33
34# only visible in advanced view
35MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE)
036
=== added file 'cmake/Findgcovr.cmake'
--- cmake/Findgcovr.cmake 1970-01-01 00:00:00 +0000
+++ cmake/Findgcovr.cmake 2014-05-02 22:12:55 +0000
@@ -0,0 +1,43 @@
1# - Find gcovr scrip
2# Will define:
3#
4# GCOVR_EXECUTABLE - the gcovr script
5#
6# Uses:
7#
8# GCOVR_ROOT - root to search for the script
9#
10# Copyright (C) 2011 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
11#
12# This file may be licensed under the terms of the
13# GNU Lesser General Public License Version 3 (the ``LGPL''),
14# or (at your option) any later version.
15#
16# Software distributed under the License is distributed
17# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
18# express or implied. See the LGPL for the specific language
19# governing rights and limitations.
20#
21# You should have received a copy of the LGPL along with this
22# program. If not, go to http://www.gnu.org/licenses/lgpl.html
23# or write to the Free Software Foundation, Inc.,
24# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25#
26# The development of this software was supported by:
27# CoR-Lab, Research Institute for Cognition and Robotics
28# Bielefeld University
29
30INCLUDE(FindPackageHandleStandardArgs)
31
32FIND_PROGRAM(GCOVR_EXECUTABLE gcovr
33 HINTS ${GCOVR_ROOT}
34 "${GCOVR_ROOT}/bin"
35 "${GCOVR_ROOT}/share/python"
36 "/usr/share/python"
37 "/usr/local/share/python"
38 "${CMAKE_INSTALL_PREFIX}/share/python")
39
40FIND_PACKAGE_HANDLE_STANDARD_ARGS(gcovr DEFAULT_MSG GCOVR_EXECUTABLE)
41
42# only visible in advanced view
43MARK_AS_ADVANCED(GCOVR_EXECUTABLE)
044
=== modified file 'debian/copyright'
--- debian/copyright 2014-03-24 19:18:13 +0000
+++ debian/copyright 2014-05-02 22:12:55 +0000
@@ -18,3 +18,18 @@
18 .18 .
19 On Debian/Ubuntu systems, the full text of the GPL v3 can be found in19 On Debian/Ubuntu systems, the full text of the GPL v3 can be found in
20 `/usr/share/common-licenses/GPL-3'20 `/usr/share/common-licenses/GPL-3'
21
22Files: cmake/EnableCoverageReport.cmake cmake/Findgcovr.cmake cmake/FindLcov.cmake
23Copyright: 2010 Johannes Wienke
24License: LGPL-3
25 This file may be licensed under the terms of the
26 GNU Lesser General Public License Version 3 (the ``LGPL''),
27 or (at your option) any later version.
28 .
29 Software distributed under the License is distributed
30 on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
31 express or implied. See the LGPL for the specific language
32 governing rights and limitations.
33 .
34 On Debian/Ubuntu systems, the full text of the LGPL v3 can be found in
35 `/usr/share/common-licenses/LGPL-3'

Subscribers

People subscribed via source and target branches

to all changes: