rabbit-slide-kenhys-tokyodebian-dputng-howto-202301 2023.01.21.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.md +14 -0
- data/Rakefile +17 -0
- data/config.yaml +26 -0
- data/images/popcon-dput-ng.png +0 -0
- data/images/popcon-dput.png +0 -0
- data/images/popcon-dupload.png +0 -0
- data/pdf/tokyodebian-dputng-howto-202301-tokyodebian-dputng-howto.pdf +0 -0
- data/theme.rb +5 -0
- data/tokyodebian-dputng-howto.md +357 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 105bd3d4d66c1a115b448f6163831ec06c0380268f2d30071d3c6d3cf769f02d
|
4
|
+
data.tar.gz: 0f0ec37fadc8975363c1ba04e09a511594469277370f7be41e3bb1c2fb89b610
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1b6b695752fc933a0705312eedea3ada4935a75c321f4c06d0576f16cd1bf0ea4f1eb7b5cecbbe94100e5977e1214735f31593a61a90c8b36d268a9b490027c6
|
7
|
+
data.tar.gz: 750cb8c1b47d0e12f86cd11c790f2ee78a6f65444150b8a648dfceeb7e0f68975d1f759ff8e1d7e32c449b7083317d4119e8c8205d511e838db03efe99e981ea
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--size=1024,768 tokyodebian-dputng-howto.md
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
# spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
id: tokyodebian-dputng-howto-202301
|
3
|
+
base_name: tokyodebian-dputng-howto
|
4
|
+
tags:
|
5
|
+
- rabbit
|
6
|
+
- debian
|
7
|
+
- dput
|
8
|
+
- dput-ng
|
9
|
+
presentation_date: 2023-01-21
|
10
|
+
presentation_start_time:
|
11
|
+
presentation_end_time:
|
12
|
+
slideshare_id:
|
13
|
+
version: 2023.01.21.1
|
14
|
+
licenses:
|
15
|
+
- CC-BY-SA-4.0
|
16
|
+
slideshare_id: kenhys
|
17
|
+
speaker_deck_id:
|
18
|
+
vimeo_id:
|
19
|
+
youtube_id:
|
20
|
+
author:
|
21
|
+
markup_language: :md
|
22
|
+
name: Kentaro Hayashi
|
23
|
+
email: kenhys@gmail.com
|
24
|
+
rubygems_user: kenhys
|
25
|
+
slideshare_user:
|
26
|
+
speaker_deck_user: kenhys
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/theme.rb
ADDED
@@ -0,0 +1,357 @@
|
|
1
|
+
# Debianパッケージング アップロード編
|
2
|
+
|
3
|
+
subtitle
|
4
|
+
: おすすめのアップロードツールはどれか?
|
5
|
+
|
6
|
+
author
|
7
|
+
: Kentaro Hayashi
|
8
|
+
|
9
|
+
institution
|
10
|
+
: ClearCode Inc.
|
11
|
+
|
12
|
+
content-source
|
13
|
+
: 2023年1月 東京エリア・関西合同Debian勉強会
|
14
|
+
|
15
|
+
allotted-time
|
16
|
+
: 20m
|
17
|
+
|
18
|
+
theme
|
19
|
+
: .
|
20
|
+
|
21
|
+
# スライドはRabbit Slide Showにて公開済みです
|
22
|
+
|
23
|
+
* Debianパッケージング アップロード編
|
24
|
+
* <https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-dputng-howto-202301/>
|
25
|
+
|
26
|
+
# 本日の内容
|
27
|
+
|
28
|
+
* Debianパッケージのアップロードの機会
|
29
|
+
* 各種アップロードツールの紹介
|
30
|
+
* dput,dpug-ng,dupload
|
31
|
+
* おすすめのツールについて
|
32
|
+
|
33
|
+
# Debianパッケージのアップロードの機会
|
34
|
+
|
35
|
+
* パッケージのメンテナンス
|
36
|
+
* コントリビューターによるアップロード
|
37
|
+
* 例: mentors.d.nへのアップロードなど
|
38
|
+
* DM/DD: 既存のパッケージのメンテナンス
|
39
|
+
* DD:新規パッケージのスポンサー
|
40
|
+
* 例: ftp-masterへのスポンサーアップロードなど
|
41
|
+
|
42
|
+
# アップロードに用いられるツール
|
43
|
+
|
44
|
+
* dput (圧倒的に利用者が多い)
|
45
|
+
* dupload (dput-ngよりは使われている)
|
46
|
+
* <https://www.debian.org/doc/manuals/maint-guide/upload.ja.html>
|
47
|
+
* <https://www.debian.org/doc/manuals/developers-reference/tools.ja.html#package-uploaders>
|
48
|
+
* dput-ng (一部の人が使っている)
|
49
|
+
|
50
|
+
# dputのインストール動向
|
51
|
+
|
52
|
+
![](images/popcon-dput.png){:relative-height="80"}
|
53
|
+
|
54
|
+
* <https://qa.debian.org/popcon.php?package=dput>
|
55
|
+
|
56
|
+
# duploadのインストール動向
|
57
|
+
|
58
|
+
![](images/popcon-dupload.png){:relative-height="80"}
|
59
|
+
|
60
|
+
* <https://qa.debian.org/popcon.php?package=dupload>
|
61
|
+
|
62
|
+
# dput-ngのインストール動向
|
63
|
+
|
64
|
+
![](images/popcon-dput-ng.png){:relative-height="80"}
|
65
|
+
|
66
|
+
* <https://qa.debian.org/popcon.php?package=dput-ng>
|
67
|
+
|
68
|
+
# dputとは
|
69
|
+
|
70
|
+
* ほぼデファクトスタンダードのアップロードツール
|
71
|
+
* devscriptsのrecommendsでインストールされる
|
72
|
+
* packaging-devの依存でインストールされる
|
73
|
+
* ~/.dput.cfでユーザーごとにカスタマイズ
|
74
|
+
* PPAにアップロードするときとか
|
75
|
+
|
76
|
+
# dput-ngとは(1)
|
77
|
+
|
78
|
+
* <https://dput.readthedocs.io/en/latest/>
|
79
|
+
* dputとの設定ファイルの互換性を維持しつつも方向性が異なるプロジェクト
|
80
|
+
* フックの仕組みでチェック機能を拡張可能
|
81
|
+
* 例: 3rdパーティーが開発したチェッカーを利用できる
|
82
|
+
* 独自書式の設定ファイルで挙動を柔軟に変えることもできる
|
83
|
+
* DMのパーミッションの操作もできる(dcutの機能強化)
|
84
|
+
|
85
|
+
# dput-ngとは(2)
|
86
|
+
|
87
|
+
* **dputと併用はできない**
|
88
|
+
* dput-ngをインストールするとdputは削除される
|
89
|
+
* ドキュメントはdputよく知っている前提
|
90
|
+
* 利用可能なフックの説明はなく、実装についてのページがある
|
91
|
+
* <https://dput.readthedocs.io/en/latest/library/hooks/index.html>
|
92
|
+
* dput(1)もしくはdput(5)の参照おすすめ
|
93
|
+
|
94
|
+
# dirtを使ってフックを調べる
|
95
|
+
|
96
|
+
* dirt listコマンドが利用できる
|
97
|
+
|
98
|
+
```
|
99
|
+
% dirt list
|
100
|
+
|
101
|
+
WARNING: This command is not completed yet. Interface and behavior changes are expected in future releases
|
102
|
+
|
103
|
+
pre-upload hooks:
|
104
|
+
required-fields: check whether a field is present and non-empty in the changes file
|
105
|
+
checksum: verify checksums before uploading
|
106
|
+
protected-distribution: warn before uploading to distributions where a special policy applies
|
107
|
+
lintian: runs lintian before the upload
|
108
|
+
gpg: check GnuPG signatures before the upload
|
109
|
+
allowed-distribution: check whether a local profile permits uploads to the target distribution
|
110
|
+
suite-mismatch: check the target distribution for common errors
|
111
|
+
supported-distribution: check whether the target distribution is currently supported (using distro-info)
|
112
|
+
check-debs: makes sure the upload contains a binary package
|
113
|
+
|
114
|
+
post-upload hooks:
|
115
|
+
impatient: Tell me when dinstall will pick this up
|
116
|
+
```
|
117
|
+
|
118
|
+
# duploadとは
|
119
|
+
|
120
|
+
* dput,dput-ngと同様にアップロードするためのもの
|
121
|
+
* dput,dput-ngよりは機能が少なめ
|
122
|
+
* 設定(.dupload.conf)に従ってアナウンスメールを送信する機能あり
|
123
|
+
* .uploadがあればスキップしたり、チェックサムの確認機能ぐらい
|
124
|
+
|
125
|
+
# 利用可能なチェックを比較する
|
126
|
+
|
127
|
+
* dputで利用可能なチェック: 7
|
128
|
+
* dput-ngで利用可能なチェック: 10
|
129
|
+
* duploadで利用可能なチェック: (省略)
|
130
|
+
|
131
|
+
# dputで利用可能なチェック(1)
|
132
|
+
|
133
|
+
* Unique upload
|
134
|
+
* アップロードしたときのログがあればアップロードを中断する
|
135
|
+
* Required package files
|
136
|
+
* 必要なファイルが含まれていないときにアップロードを中断する
|
137
|
+
* Successful local install
|
138
|
+
* パッケージをインストールした状態でないときにアップロードを中断する(既定で無効)
|
139
|
+
|
140
|
+
# dputで利用可能なチェック(2)
|
141
|
+
|
142
|
+
* Cryptographic signature
|
143
|
+
* GPG署名していないときにアップロードを中断する(既定で有効)
|
144
|
+
* Package files content match
|
145
|
+
* サイズやハッシュ値が一致していないときにアップロードを中断する(既定で有効)
|
146
|
+
|
147
|
+
# dputで利用可能なチェック(3)
|
148
|
+
|
149
|
+
* Distribution name is permitted for the remote host
|
150
|
+
* アップロード先が許容しないdistributionの場合にアップロードを中断する(サーバー側設定に依存)
|
151
|
+
* Lintian success
|
152
|
+
* lintianが失敗したときにアップロードを中断する(既定で無効)
|
153
|
+
|
154
|
+
# dput-ngで利用できるフック(1)
|
155
|
+
|
156
|
+
* allowed-distribution
|
157
|
+
* プロファイルに応じてアップロードしてもよいかチェックする
|
158
|
+
* 例: debian/changelogでUNRELEASEDのままアップロードしようとしたら止める
|
159
|
+
|
160
|
+
* check-debsフック
|
161
|
+
* ソース or バイナリどちらが含まれるべきかチェックする
|
162
|
+
* 例: PPAにバイナリパッケージをアップロードしようとするとエラー
|
163
|
+
|
164
|
+
# dput-ngで利用できるフック(2)
|
165
|
+
|
166
|
+
* checksumフック
|
167
|
+
* アップロード前のパッケージのチェックサムがあっているかをチェックする
|
168
|
+
* gpgフック
|
169
|
+
* アップロード前にGnuPGで署名してあるかをチェックする
|
170
|
+
* 署名していなかったら署名をうながし、アップロードできる
|
171
|
+
|
172
|
+
# dput-ngで利用できるフック(2)
|
173
|
+
|
174
|
+
* impatientフック
|
175
|
+
* 次にdinstallが実行されるまでの時間を通知する
|
176
|
+
|
177
|
+
* lintianフック
|
178
|
+
* アップロード前にlintianを実行する
|
179
|
+
|
180
|
+
# dput-ngで利用できるフック(3)
|
181
|
+
|
182
|
+
* protected-distributionフック
|
183
|
+
* 特別なポリシーが適用されるところへのアップロード前に警告する
|
184
|
+
* 例: testing-proposed-updates, proposed-updates, oldstable, stable, testing, stable-security, oldstable-security, testing-securityなどにアップロードしようとしたときに確認が求められる
|
185
|
+
|
186
|
+
# dput-ngで利用できるフック(4)
|
187
|
+
|
188
|
+
* required-fieldsフック
|
189
|
+
* 指定された項目があるかをチェックする
|
190
|
+
* 例:.changesファイルにプロファイルで定義したrequired-fieldsに指定されたものが含まれていないと警告する
|
191
|
+
|
192
|
+
# dput-ngで利用できるフック(4)
|
193
|
+
|
194
|
+
* suite-mismatchフック
|
195
|
+
* changelogと.changesのディストリビューションが一致しない場合、警告する
|
196
|
+
* 例: unstableでexperimentalが混在しているとき
|
197
|
+
|
198
|
+
* supported-distributionフック
|
199
|
+
* .changesのDistributionがサポートされていないときに警告する
|
200
|
+
* 例: サポートの有無はpython3-distro-infoを使って/usr/share/distro-info/debian.csvを参照する
|
201
|
+
|
202
|
+
# サンプルとして利用できるフック
|
203
|
+
|
204
|
+
* bd-blacklist
|
205
|
+
* Build-Dependsに対象が含まれていたら失敗する
|
206
|
+
* clojure-arno-tester
|
207
|
+
* メンテナーがarno@debian.orgだったら失敗する
|
208
|
+
* twitter
|
209
|
+
* アップロード後にtweetする
|
210
|
+
|
211
|
+
# 各種ツールの機能比較(1)
|
212
|
+
|
213
|
+
| |dupload|dput|dput-ng|
|
214
|
+
|---|---|---|---|
|
215
|
+
|提供コマンド|dupload|dput,dcut|dput,dcut,**dirt**|
|
216
|
+
|設定ファイル|~/.dupload.conf|~/.dput.cf or ~/.config/dput/dput.cf|~/.dput.cf or 独自|
|
217
|
+
|
218
|
+
# 各種ツールの機能比較(2)
|
219
|
+
|
220
|
+
| |dupload|dput|dput-ng|
|
221
|
+
|フックの追加実装|❌非対応|❌非対応|✅対応|
|
222
|
+
|対応プロトコル|ftp,http,https,scp,scpb,**rsync**,copy|ftp,http,https,scp,**rsync**,local|ftp,http,https,scp,local|
|
223
|
+
|メール連携|✅対応|❌非対応|❌非対応|
|
224
|
+
|
225
|
+
# 各種ツールの機能比較(3)
|
226
|
+
|
227
|
+
| |dupload|dput|dput-ng|
|
228
|
+
|DMの権限操作|❌非対応|❌非対応|✅dcut追加機能|
|
229
|
+
|
230
|
+
# dcutによるDMの権限操作
|
231
|
+
|
232
|
+
* dput-ng版ではdcutでDMの許可を変更できる
|
233
|
+
|
234
|
+
```
|
235
|
+
% dcut dm \
|
236
|
+
--uid 66DEF15282990C2199EFA801A8A128A8AB1CEE49 \
|
237
|
+
--allow zarchive
|
238
|
+
Uploading commands file to
|
239
|
+
ftp.upload.debian.org (incoming: /pub/UploadQueue/)
|
240
|
+
Picking DM Andrea Pappacoda
|
241
|
+
(Tachi's main key) <andrea@pappacoda.it>
|
242
|
+
with fingerprint 66DEF15282990C2199EFA801A8A128A8AB1CEE49
|
243
|
+
Uploading kenhys-1673679146.dak-commands to ftp-master
|
244
|
+
```
|
245
|
+
|
246
|
+
# dput-ngでのプロファイルの考え方
|
247
|
+
|
248
|
+
* dputと互換性のないフォーマット(JSON)について
|
249
|
+
* メタ情報を拡張したものがプロファイル
|
250
|
+
* 例: debianというメタ情報からmentors-ftpプロファイルを派生
|
251
|
+
* 基本的な設定をメタ情報として定義し、サイトごとの設定をプロファイルで指定して上書きするイメージ
|
252
|
+
|
253
|
+
# dput-ngでのプロファイル設定例(1)
|
254
|
+
|
255
|
+
* <https://mentors.debian.net/intro-maintainers/>
|
256
|
+
* FTPの場合に~/.dput.cfに設定する内容
|
257
|
+
|
258
|
+
```
|
259
|
+
[mentors-ftp]
|
260
|
+
fqdn = mentors.debian.net
|
261
|
+
login = anonymous
|
262
|
+
progress_indicator = 2
|
263
|
+
passive_ftp = 1
|
264
|
+
incoming = /pub/UploadQueue/
|
265
|
+
method = ftp
|
266
|
+
allow_unsigned_uploads = 0
|
267
|
+
# Allow uploads for UNRELEASED packages
|
268
|
+
allowed_distributions = .*
|
269
|
+
```
|
270
|
+
|
271
|
+
# dput-ngでのプロファイル設定例(2)
|
272
|
+
|
273
|
+
* /etc/dput.d/profiles/mentors.json
|
274
|
+
|
275
|
+
```
|
276
|
+
{
|
277
|
+
"-hooks": [
|
278
|
+
"check-debs",
|
279
|
+
"allowed-distribution"
|
280
|
+
],
|
281
|
+
"allowed_distributions": ".*",
|
282
|
+
"fqdn": "mentors.debian.net",
|
283
|
+
"incoming": "/pub/UploadQueue/",
|
284
|
+
"login": "anonymous",
|
285
|
+
"meta": "debian",
|
286
|
+
"method": "ftp"
|
287
|
+
}
|
288
|
+
```
|
289
|
+
|
290
|
+
|
291
|
+
# dput-ngでのプロファイル設定例(3)
|
292
|
+
|
293
|
+
* 継承元の/etc/dput.d/metas/debian.json定義
|
294
|
+
|
295
|
+
```
|
296
|
+
{
|
297
|
+
"allow_dcut": true,
|
298
|
+
"allowed-distribution": {
|
299
|
+
"codename-groups": [
|
300
|
+
"general", "backport", "rm-managed"
|
301
|
+
]
|
302
|
+
},
|
303
|
+
"codenames": "debian",
|
304
|
+
"hooks": [
|
305
|
+
"allowed-distribution",
|
306
|
+
"protected-distribution",
|
307
|
+
"checksum",
|
308
|
+
"suite-mismatch",
|
309
|
+
"gpg"
|
310
|
+
],
|
311
|
+
...(省略)...
|
312
|
+
}
|
313
|
+
```
|
314
|
+
|
315
|
+
|
316
|
+
# 結局、どれを使うのがよいのか? (1)
|
317
|
+
|
318
|
+
* dupload
|
319
|
+
* ✅メール連携が使いたい
|
320
|
+
* ✅シンプルな機能で十分派
|
321
|
+
* ❌チェック機能は少なめ
|
322
|
+
|
323
|
+
# 結局、どれを使うのがよいのか? (2)
|
324
|
+
|
325
|
+
* dput
|
326
|
+
* ✅メジャーなものを使いたい派
|
327
|
+
* ✅チェックはdputのもので十分派
|
328
|
+
* ❌DMの権限変更もしたい
|
329
|
+
|
330
|
+
# 結局、どれを使うのがよいのか? (3)
|
331
|
+
|
332
|
+
* dput-ng
|
333
|
+
* ✅チェック機能を強化したい派
|
334
|
+
* ✅アップロード時に署名もまとめて実行したい
|
335
|
+
* ✅DMの権限変更もしたい
|
336
|
+
* ❌rsyncでアップロード必須
|
337
|
+
|
338
|
+
# さいごに
|
339
|
+
|
340
|
+
* dputとdput-ng、設定ファイルの互換性あるものの機能性に違いあり
|
341
|
+
* アップロード時に署名もできるのでdput-ngオススメ
|
342
|
+
|
343
|
+
# 参考資料(1)
|
344
|
+
|
345
|
+
* <https://manpages.debian.org/unstable/dput/index.html>
|
346
|
+
* dput(1)
|
347
|
+
* dcut(1)
|
348
|
+
* dput.cf(5)
|
349
|
+
|
350
|
+
# 参考資料(2)
|
351
|
+
|
352
|
+
* <https://manpages.debian.org/unstable/dput-ng/index.html>
|
353
|
+
* dput(1)
|
354
|
+
* dput(5) dput-ngの独自設定フォーマットについて知るのによい
|
355
|
+
* dcut(1) dmサブコマンドの使い方について
|
356
|
+
* dput.cf(5)
|
357
|
+
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-kenhys-tokyodebian-dputng-howto-202301
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2023.01.21.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kentaro Hayashi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-01-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: ''
|
28
|
+
email:
|
29
|
+
- kenhys@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- config.yaml
|
38
|
+
- images/popcon-dput-ng.png
|
39
|
+
- images/popcon-dput.png
|
40
|
+
- images/popcon-dupload.png
|
41
|
+
- pdf/tokyodebian-dputng-howto-202301-tokyodebian-dputng-howto.pdf
|
42
|
+
- theme.rb
|
43
|
+
- tokyodebian-dputng-howto.md
|
44
|
+
homepage: https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-dputng-howto-202301/
|
45
|
+
licenses:
|
46
|
+
- CC-BY-SA-4.0
|
47
|
+
metadata: {}
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubygems_version: 3.4.1
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: Tokyo Debian dput, dput-ng Howto 202301
|
67
|
+
test_files: []
|