Merge lp:~zeller-benjamin/qtcreator-plugin-ubuntu/bughunt-27082015 into lp:qtcreator-plugin-ubuntu/3.1

Proposed by Benjamin Zeller
Status: Merged
Merged at revision: 408
Proposed branch: lp:~zeller-benjamin/qtcreator-plugin-ubuntu/bughunt-27082015
Merge into: lp:qtcreator-plugin-ubuntu/3.1
Diff against target: 409 lines (+122/-42)
12 files modified
share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.desktop (+1/-1)
share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.pro (+9/-3)
share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/projectName.pro (+6/-5)
share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.desktop (+1/-1)
share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.pro (+9/-2)
share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/projectName.pro (+7/-6)
share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.desktop (+1/-1)
share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.pro (+9/-3)
share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/projectName.pro (+7/-6)
share/qtcreator/ubuntu/scripts/qtc_device_applaunch.py (+8/-3)
src/ubuntu/ubuntupackagestep.cpp (+1/-1)
ubuntu-click-tools.prf (+63/-10)
To merge this branch: bzr merge lp:~zeller-benjamin/qtcreator-plugin-ubuntu/bughunt-27082015
Reviewer Review Type Date Requested Status
Zoltan Balogh Approve
Review via email: mp+269329@code.launchpad.net

Commit message

- Catch "permission denied" error if opening syslog is not allowed
- Fix Bug lp:1480771 "Wrong directory used for translation"
- Fix Bug lp:1443351 ".desktop file is not translated for qmake based
projects"
- Fix Bug lp:1479581 "Debug helper is disabled by default"
- Fix Bug lp:1481325 "fix i18n integration in qmake template"

Description of the change

- Catch "permission denied" error if opening syslog is not allowed
- Fix Bug lp:1480771 "Wrong directory used for translation"
- Fix Bug lp:1443351 ".desktop file is not translated for qmake based
projects"
- Fix Bug lp:1479581 "Debug helper is disabled by default"
- Fix Bug lp:1481325 "fix i18n integration in qmake template"

To post a comment you must log in.
Revision history for this message
Zoltan Balogh (bzoltan) wrote :

Let's test it

review: Approve
408. By Benjamin Zeller

Add bugs

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.desktop'
2--- share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.desktop 2015-01-17 04:53:32 +0000
3+++ share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.desktop 2015-08-27 10:44:50 +0000
4@@ -1,5 +1,5 @@
5 [Desktop Entry]
6-Name=%ClickHookName%
7+_Name=%ClickHookName%
8 Exec=qmlscene $@ %ClickHookName%/Main.qml
9 Icon=%ClickHookName%/%ClickHookName%.png
10 Terminal=false
11
12=== modified file 'share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.pro'
13--- share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.pro 2015-05-26 09:46:32 +0000
14+++ share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/appName/appName.pro 2015-08-27 10:44:50 +0000
15@@ -7,7 +7,6 @@
16 $$files(*.js,true)
17
18 CONF_FILES += %ClickHookName%.apparmor \
19- %ClickHookName%.desktop \
20 %ClickHookName%.png
21
22 AP_TEST_FILES += tests/autopilot/run \
23@@ -15,7 +14,8 @@
24
25 OTHER_FILES += $${CONF_FILES} \
26 $${QML_FILES} \
27- $${AP_TEST_FILES}
28+ $${AP_TEST_FILES} \
29+ %ClickHookName%.desktop
30
31 #specify where the qml/js files are installed to
32 qml_files.path = /%ClickHookName%
33@@ -25,4 +25,10 @@
34 config_files.path = /%ClickHookName%
35 config_files.files += $${CONF_FILES}
36
37-INSTALLS+=config_files qml_files
38+#install the desktop file, a translated version is automatically created in
39+#the build directory
40+desktop_file.path = /%ClickHookName%
41+desktop_file.files = $$OUT_PWD/%ClickHookName%.desktop
42+desktop_file.CONFIG += no_check_exist
43+
44+INSTALLS+=config_files qml_files desktop_file
45
46=== modified file 'share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/projectName.pro'
47--- share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/projectName.pro 2015-05-26 09:46:32 +0000
48+++ share/qtcreator/templates/wizards/ubuntu/backend-app-qmake/projectName.pro 2015-08-27 10:44:50 +0000
49@@ -25,20 +25,21 @@
50 $$files(*.qml,true) \
51 $$files(*.js,true) \
52 $$files(*.cpp,true) \
53- $$files(*.h,true)
54+ $$files(*.h,true) \
55+ $$files(*.desktop,true)
56
57 # specifies all translations files and makes sure they are
58 # compiled and installed into the right place in the click package
59 UBUNTU_PO_FILES+=$$files(po/*.po)
60
61 aptest.target = autopilot
62-aptest.commands = QML2_IMPORT_PATH=$$OUT_PWD/backend bash $$PWD/app/tests/autopilot/run
63-aptest.depends = sub-app sub-backend-App
64+aptest.commands = QML2_IMPORT_PATH=$$OUT_PWD/backend bash $$PWD/%ClickHookName%/tests/autopilot/run
65+aptest.depends = sub-%ClickHookName% sub-backend-App
66
67 unittest.target = check
68 unittest.commands = /usr/bin/qmltestrunner -input $$PWD/backend/tests/unit -import $$OUT_PWD/backend
69-unittest.commands += && /usr/bin/qmltestrunner -input $$PWD/app/tests/unit -import $$OUT_PWD/backend
70-unittest.depends = sub-app sub-backend-App
71+unittest.commands += && /usr/bin/qmltestrunner -input $$PWD/%ClickHookName%/tests/unit -import $$OUT_PWD/backend
72+unittest.depends = sub-%ClickHookName% sub-backend-App
73
74 QMAKE_EXTRA_TARGETS += aptest unittest
75
76
77=== modified file 'share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.desktop'
78--- share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.desktop 2014-11-13 15:45:24 +0000
79+++ share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.desktop 2015-08-27 10:44:50 +0000
80@@ -1,5 +1,5 @@
81 [Desktop Entry]
82-Name=%ClickHookName%
83+_Name=%ClickHookName%
84 Exec=%ClickHookName%
85 Icon=%ClickHookName%/%ClickHookName%.png
86 Terminal=false
87
88=== modified file 'share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.pro'
89--- share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.pro 2015-05-22 15:37:52 +0000
90+++ share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/appName/appName.pro 2015-08-27 10:44:50 +0000
91@@ -13,7 +13,6 @@
92 $$files(*.js,true)
93
94 CONF_FILES += %ClickHookName%.apparmor \
95- %ClickHookName%.desktop \
96 %ClickHookName%.png
97
98 AP_TEST_FILES += tests/autopilot/run \
99@@ -22,13 +21,21 @@
100 #show all the files in QtCreator
101 OTHER_FILES += $${CONF_FILES} \
102 $${QML_FILES} \
103- $${AP_TEST_FILES}
104+ $${AP_TEST_FILES} \
105+ %ClickHookName%.desktop
106
107 #specify where the config files are installed to
108 config_files.path = /%ClickHookName%
109 config_files.files += $${CONF_FILES}
110 INSTALLS+=config_files
111
112+#install the desktop file, a translated version is
113+#automatically created in the build directory
114+desktop_file.path = /%ClickHookName%
115+desktop_file.files = $$OUT_PWD/%ClickHookName%.desktop
116+desktop_file.CONFIG += no_check_exist
117+INSTALLS+=desktop_file
118+
119 # Default rules for deployment.
120 target.path = $${UBUNTU_CLICK_BINARY_PATH}
121 INSTALLS+=target
122
123=== modified file 'share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/projectName.pro'
124--- share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/projectName.pro 2015-05-26 09:46:32 +0000
125+++ share/qtcreator/templates/wizards/ubuntu/qtquick-app-qmake/projectName.pro 2015-08-27 10:44:50 +0000
126@@ -21,20 +21,21 @@
127 # template is created in po/template.pot, to create a
128 # translation copy the template to e.g. de.po and edit the sources
129 UBUNTU_TRANSLATION_SOURCES+= \
130- $$files(app/*.qml,true) \
131- $$files(app/*.js,true)
132+ $$files(*.qml,true) \
133+ $$files(*.js,true) \
134+ $$files(*.desktop,true)
135
136 # specifies all translations files and makes sure they are
137 # compiled and installed into the right place in the click package
138 UBUNTU_PO_FILES+=$$files(po/*.po)
139
140 aptest.target = autopilot
141-aptest.commands = bash $$PWD/app/tests/autopilot/run
142-aptest.depends = sub-app
143+aptest.commands = bash $$PWD/%ClickHookName%/tests/autopilot/run
144+aptest.depends = sub-%ClickHookName%
145
146 unittest.target = check
147-unittest.commands = /usr/bin/qmltestrunner -input $$PWD/app/tests/unit
148-unittest.depends = sub-app
149+unittest.commands = /usr/bin/qmltestrunner -input $$PWD/%ClickHookName%/tests/unit
150+unittest.depends = sub-%ClickHookName%
151
152 QMAKE_EXTRA_TARGETS += aptest unittest
153
154
155=== modified file 'share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.desktop'
156--- share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.desktop 2015-01-17 04:53:32 +0000
157+++ share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.desktop 2015-08-27 10:44:50 +0000
158@@ -1,5 +1,5 @@
159 [Desktop Entry]
160-Name=%ClickHookName%
161+_Name=%ClickHookName%
162 Exec=qmlscene $@ %ClickHookName%/Main.qml
163 Icon=%ClickHookName%/%ClickHookName%.png
164 Terminal=false
165
166=== modified file 'share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.pro'
167--- share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.pro 2015-05-22 15:37:52 +0000
168+++ share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/appName/appName.pro 2015-08-27 10:44:50 +0000
169@@ -7,7 +7,6 @@
170 $$files(*.js,true)
171
172 CONF_FILES += %ClickHookName%.apparmor \
173- %ClickHookName%.desktop \
174 %ClickHookName%.png
175
176 AP_TEST_FILES += tests/autopilot/run \
177@@ -15,7 +14,8 @@
178
179 OTHER_FILES += $${CONF_FILES} \
180 $${QML_FILES} \
181- $${AP_TEST_FILES}
182+ $${AP_TEST_FILES} \
183+ %ClickHookName%.desktop
184
185 #specify where the qml/js files are installed to
186 qml_files.path = /%ClickHookName%
187@@ -25,4 +25,10 @@
188 config_files.path = /%ClickHookName%
189 config_files.files += $${CONF_FILES}
190
191-INSTALLS+=config_files qml_files
192+#install the desktop file, a translated version is
193+#automatically created in the build directory
194+desktop_file.path = /%ClickHookName%
195+desktop_file.files = $$OUT_PWD/%ClickHookName%.desktop
196+desktop_file.CONFIG += no_check_exist
197+
198+INSTALLS+=config_files qml_files desktop_file
199
200=== modified file 'share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/projectName.pro'
201--- share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/projectName.pro 2015-05-26 09:46:32 +0000
202+++ share/qtcreator/templates/wizards/ubuntu/simple-app-qmake/projectName.pro 2015-08-27 10:44:50 +0000
203@@ -21,19 +21,20 @@
204 # template is created in po/template.pot, to create a
205 # translation copy the template to e.g. de.po and edit the sources
206 UBUNTU_TRANSLATION_SOURCES+= \
207- $$files(app/*.qml,true) \
208- $$files(app/*.js,true)
209+ $$files(*.qml,true) \
210+ $$files(*.js,true) \
211+ $$files(*.desktop,true)
212
213 # specifies all translations files and makes sure they are
214 # compiled and installed into the right place in the click package
215 UBUNTU_PO_FILES+=$$files(po/*.po)
216
217 aptest.target = autopilot
218-aptest.commands = bash $$PWD/app/tests/autopilot/run
219-aptest.depends = sub-app
220+aptest.commands = bash $$PWD/%ClickHookName%/tests/autopilot/run
221+aptest.depends = sub-%ClickHookName%
222
223 unittest.target = check
224-unittest.commands = /usr/bin/qmltestrunner -input $$PWD/app/tests/unit
225-unittest.depends = sub-app
226+unittest.commands = /usr/bin/qmltestrunner -input $$PWD/%ClickHookName%/tests/unit
227+unittest.depends = sub-%ClickHookName%
228
229 QMAKE_EXTRA_TARGETS += aptest unittest
230
231=== modified file 'share/qtcreator/ubuntu/scripts/qtc_device_applaunch.py'
232--- share/qtcreator/ubuntu/scripts/qtc_device_applaunch.py 2015-06-01 14:26:02 +0000
233+++ share/qtcreator/ubuntu/scripts/qtc_device_applaunch.py 2015-08-27 10:44:50 +0000
234@@ -441,7 +441,7 @@
235 success = subprocess.call(
236 ["pkcon","--allow-untrusted","install-local",options.clickPck,"-p"])
237 if success != 0:
238- print("Sdk-Launcher> Installing the application failed",flush=True)
239+ print("Sdk-Launcher> Installing the application failed",flush=True,file=sys.stderr)
240 sys.exit(1)
241
242 print("Sdk-Launcher> Application installed successfully",flush=True)
243@@ -451,6 +451,7 @@
244 procStdOut = None
245 stderrPipeName = None
246 procStdErr = None
247+syslogHandle = None
248
249 try:
250 confined = is_confined(manifest,hook_name)
251@@ -494,8 +495,12 @@
252 stderrPipeName = tmp_dir+app_id+".stderr"
253 procStdErr = create_procpipe(stderrPipeName,on_proc_stderr)
254
255- syslogFileName = "/var/log/syslog"
256- syslogHandle = create_filelistener("/var/log/syslog",on_syslog_update)
257+ try:
258+ syslogFileName = "/var/log/syslog"
259+ syslogHandle = create_filelistener("/var/log/syslog",on_syslog_update)
260+ except OSError:
261+ print("Sdk-Launcher> Not able to open syslog, apparmor errors will not be reported.",flush=True,file=sys.stderr)
262+
263
264 if "unix_signal_add" in dir(GLib):
265 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM, on_sigterm, runner)
266
267=== modified file 'src/ubuntu/ubuntupackagestep.cpp'
268--- src/ubuntu/ubuntupackagestep.cpp 2015-07-08 15:43:11 +0000
269+++ src/ubuntu/ubuntupackagestep.cpp 2015-08-27 10:44:50 +0000
270@@ -62,7 +62,7 @@
271 false).toBool();
272
273 if (!settings.value(QLatin1String(Constants::SETTINGS_KEY_ENABLE_DEBUG_HELPER_DEFAULT),
274- false).toBool())
275+ true).toBool())
276 m_debugMode = DisableDebugScript;
277
278 settings.endGroup();
279
280=== modified file 'ubuntu-click-tools.prf'
281--- ubuntu-click-tools.prf 2015-01-16 13:06:04 +0000
282+++ ubuntu-click-tools.prf 2015-08-27 10:44:50 +0000
283@@ -26,40 +26,60 @@
284
285 !isEmpty(UBUNTU_MANIFEST_FILE){
286 OTHER_FILES+=$$UBUNTU_MANIFEST_FILE
287- manifest_file.target = $$OUT_PWD/manifest.json
288+ manifest_file.target = $$shadowed($$_PRO_FILE_PWD_)/manifest.json
289 manifest_file.commands = sed s/@CLICK_ARCH@/$$UBUNTU_CLICK_ARCH/g $$absolute_path($${UBUNTU_MANIFEST_FILE},$$_PRO_FILE_PWD_) > $${manifest_file.target}
290 manifest_file.depends = $$absolute_path($${UBUNTU_MANIFEST_FILE},$$_PRO_FILE_PWD_)
291
292 QMAKE_EXTRA_TARGETS+=manifest_file
293+ QMAKE_CLEAN += $${manifest_file.target}
294 ubuntuAddPreTargetDep($${manifest_file.target})
295
296 manifest_file_install.path = /
297- manifest_file_install.files = $${OUT_PWD}/manifest.json
298+ manifest_file_install.files = $$manifest_file.target
299 manifest_file_install.CONFIG +=no_check_exist
300 INSTALLS+=manifest_file_install
301 }
302
303 !isEmpty(UBUNTU_TRANSLATION_SOURCES){
304+ isEmpty(UBUNTU_TRANSLATION_DOMAIN):error("UBUNTU_TRANSLATION_DOMAIN not defined")
305+
306 # iterate over all QML/JS files and create a basic translation template
307- template_pot.target=$$_PRO_FILE_PWD_/po/template.pot
308+ template_pot.target=$$_PRO_FILE_PWD_/po/$${UBUNTU_TRANSLATION_DOMAIN}.pot
309 for(filelist, UBUNTU_TRANSLATION_SOURCES) {
310 resolved_filelist = $$absolute_path($$filelist,$$_PRO_FILE_PWD_)
311 resolved_filelist = $$files($$resolved_filelist)
312+
313 for(file,resolved_filelist) {
314- template_pot.depends+=$$file
315+ RESULT = $$find(file, "\\.desktop(\\.in)?$")
316+ count(RESULT, 1) {
317+ # extract the strings from the desktop file, and feed them to xgettext
318+ target_file = "$$shadowed($$_PRO_FILE_PWD_)/$$relative_path($$file,$$_PRO_FILE_PWD_).h"
319+ target_dir = $$dirname(target_file)
320+ target_name = $$replace(target_file,"[/.-]","_")
321+
322+ $${target_name}.target=$$target_file
323+ $${target_name}.commands=mkdir -p $$target_dir && cd $$target_dir && intltool-extract --type="gettext/ini" --update --srcdir=$$dirname(file) $$basename(file)
324+ $${target_name}.depends+=$$file
325+ QMAKE_EXTRA_TARGETS+=$$target_name
326+
327+ template_pot.depends+=$$target_file
328+ QMAKE_CLEAN += $$target_file
329+
330+ translated_desktop_files+=$$file
331+ } else {
332+ template_pot.depends+=$$file
333+ }
334 }
335-
336 }
337
338 !isEmpty(template_pot.depends) {
339- template_pot.commands=mkdir -p $$_PRO_FILE_PWD_/po && xgettext -o $$template_pot.target --qt --c++ --add-comments=TRANSLATORS --keyword=tr --keyword=tr:1,2 $$template_pot.depends --from-code=UTF-8
340+ template_pot.commands=mkdir -p $$_PRO_FILE_PWD_/po && xgettext -o $$template_pot.target --qt --c++ --from-code=UTF-8 --add-comments=TRANSLATORS --keyword=tr --keyword=tr:1,2 --keyword=N_ $$template_pot.depends
341
342 QMAKE_EXTRA_TARGETS+=template_pot
343- ubuntuAddPreTargetDep($$_PRO_FILE_PWD_/po/template.pot)
344+ ubuntuAddPreTargetDep($${template_pot.target})
345 }
346
347 !isEmpty(UBUNTU_PO_FILES){
348- isEmpty(UBUNTU_TRANSLATION_DOMAIN):error("UBUNTU_TRANSLATION_DOMAIN not defined")
349 # compile the mo files into po files
350 for(filelist, UBUNTU_PO_FILES) {
351 resolved_filelist = $$absolute_path($$filelist,$$_PRO_FILE_PWD_)
352@@ -69,22 +89,55 @@
353 lang=$$split(lang, .)
354 lang=$$first(lang)
355
356+ # add a target that automatically updates the po files from the template
357+ update_target_file = $$shadowed($$_PRO_FILE_PWD_)/po/$$basename(file).updated
358+
359+ target_name=update_po_target_$$lang
360+ $${target_name}.target = $${update_target_file}
361+ $${target_name}.commands =cd $$_PRO_FILE_PWD_/po && LC_ALL=C intltool-update -d $$lang -g template -x && touch $${update_target_file}
362+ $${target_name}.depends+=$${template_pot.target}
363+
364+ QMAKE_EXTRA_TARGETS+=$$target_name
365+ QMAKE_CLEAN += $$update_target_file
366+ ubuntuAddPreTargetDep($${update_target_file})
367+
368+ # build the .mo files
369 target_name=mo_target_$$lang
370 target_file=$$shadowed($$_PRO_FILE_PWD_)/po/$${lang}/$${UBUNTU_TRANSLATION_DOMAIN}.mo
371
372 $${target_name}.target=$$target_file
373- $${target_name}.commands=mkdir -p po/$${lang} && msgfmt -o $${target_file} $$absolute_path($$file,$$_PRO_FILE_PWD_)
374- $${target_name}.depends+=$$absolute_path($$file,$$_PRO_FILE_PWD_)
375+ $${target_name}.commands=mkdir -p po/$${lang} && LC_ALL=C msgfmt -o $${target_file} $$absolute_path($$file,$$_PRO_FILE_PWD_)
376+ $${target_name}.depends+=$$absolute_path($$file,$$_PRO_FILE_PWD_) $${update_target_file}
377
378 $${target_name}_inst.path =/share/locale/$${lang}/LC_MESSAGES
379 $${target_name}_inst.CONFIG +=no_check_exist
380 $${target_name}_inst.files=$$target_file
381
382+ registered_po_files+=$$absolute_path($$file,$$_PRO_FILE_PWD_)
383 QMAKE_EXTRA_TARGETS+=$$target_name
384+ QMAKE_CLEAN += $$target_file
385 ubuntuAddPreTargetDep($${target_file})
386
387 INSTALLS += $${target_name}_inst
388 }
389 }
390 }
391+
392+ !isEmpty(translated_desktop_files) {
393+ #merge the translations into the desktop files
394+ for(file, translated_desktop_files) {
395+ target_file = $$shadowed($$_PRO_FILE_PWD_)/$$relative_path($$file,$$_PRO_FILE_PWD_)
396+ target_file = $$replace(target_file,"\\.in$","")
397+
398+ target_name = $$replace(target_file,"[/.-]","_")
399+ $${target_name}.target=$$target_file
400+ $${target_name}.commands=LC_ALL=C intltool-merge -d -u $$_PRO_FILE_PWD_/po $$file $$target_file > /dev/null
401+ $${target_name}.depends+=$$registered_po_files \
402+ $$file
403+
404+ QMAKE_EXTRA_TARGETS+=$$target_name
405+ QMAKE_CLEAN += $$target_file
406+ ubuntuAddPreTargetDep($${target_file})
407+ }
408+ }
409 }

Subscribers

People subscribed via source and target branches