Read about our upcoming Code of Conduct on this issue

_form.html.haml 23.6 KB
Newer Older
1
= form_for @application_setting, url: admin_application_settings_path, html: { class: 'form-horizontal fieldset-form' } do |f|
2
  = form_errors(@application_setting)
3

4
  %fieldset
5
    %legend Visibility and Access Controls
6
    .form-group
7
8
9
10
11
12
      = f.label :default_branch_protection, class: 'control-label col-sm-2'
      .col-sm-10
        = f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control'
    .form-group.project-visibility-level-holder
      = f.label :default_project_visibility, class: 'control-label col-sm-2'
      .col-sm-10
13
        = render('shared/visibility_radios', model_method: :default_project_visibility, form: f, selected_level: @application_setting.default_project_visibility, form_model: Project.new)
14
15
16
    .form-group.project-visibility-level-holder
      = f.label :default_snippet_visibility, class: 'control-label col-sm-2'
      .col-sm-10
17
        = render('shared/visibility_radios', model_method: :default_snippet_visibility, form: f, selected_level: @application_setting.default_snippet_visibility, form_model: ProjectSnippet.new)
18
    .form-group.project-visibility-level-holder
19
20
21
      = f.label :default_group_visibility, class: 'control-label col-sm-2'
      .col-sm-10
        = render('shared/visibility_radios', model_method: :default_group_visibility, form: f, selected_level: @application_setting.default_group_visibility, form_model: Group.new)
22
23
24
    .form-group
      = f.label :restricted_visibility_levels, class: 'control-label col-sm-2'
      .col-sm-10
25
26
        - restricted_level_checkboxes('restricted-visibility-help').each do |level|
          .checkbox
27
            = level
28
29
        %span.help-block#restricted-visibility-help
          Selected levels cannot be used by non-admin users for projects or snippets.
30
          If the public level is restricted, user profiles are only visible to logged in users.
31
32
33
    .form-group
      = f.label :import_sources, class: 'control-label col-sm-2'
      .col-sm-10
34
35
        - import_sources_checkboxes('import-sources-help').each do |source|
          .checkbox= source
36
37
        %span.help-block#import-sources-help
          Enabled sources for code import during project creation. OmniAuth must be configured for GitHub
38
          = link_to "(?)", help_page_path("integration/github")
39
          , Bitbucket
40
          = link_to "(?)", help_page_path("integration/bitbucket")
41
          and GitLab.com
42
          = link_to "(?)", help_page_path("integration/gitlab")
43
44
45
    .form-group
      %label.control-label.col-sm-2 Enabled Git access protocols
      .col-sm-10
46
        = select(:application_setting, :enabled_git_access_protocol, [['Both SSH and HTTP(S)', nil], ['Only SSH', 'ssh'], ['Only HTTP(S)', 'http']], {}, class: 'form-control')
47
48
        %span.help-block#clone-protocol-help
          Allow only the selected protocols to be used for Git access.
49
50
51

  %fieldset
    %legend Account and Limit Settings
52
    .form-group
53
54
55
56
57
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :gravatar_enabled do
            = f.check_box :gravatar_enabled
            Gravatar enabled
58
    .form-group
59
      = f.label :default_projects_limit, class: 'control-label col-sm-2'
60
61
      .col-sm-10
        = f.number_field :default_projects_limit, class: 'form-control'
62
    .form-group
63
      = f.label :max_attachment_size, 'Maximum attachment size (MB)', class: 'control-label col-sm-2'
Vinnie Okada's avatar
Vinnie Okada committed
64
      .col-sm-10
65
66
67
        = f.number_field :max_attachment_size, class: 'form-control'
    .form-group
      = f.label :session_expire_delay, 'Session duration (minutes)', class: 'control-label col-sm-2'
Vinnie Okada's avatar
Vinnie Okada committed
68
      .col-sm-10
69
70
        = f.number_field :session_expire_delay, class: 'form-control'
        %span.help-block#session_expire_delay_help_block GitLab restart is required to apply changes
71
    .form-group
72
      = f.label :user_oauth_applications, 'User OAuth applications', class: 'control-label col-sm-2'
73
      .col-sm-10
74
75
76
77
        .checkbox
          = f.label :user_oauth_applications do
            = f.check_box :user_oauth_applications
            Allow users to register any application to use GitLab as an OAuth provider
78
79
80
81
82
83
84
    .form-group
      = f.label :user_default_external, 'New users set to external', class: 'control-label col-sm-2'
      .col-sm-10
        .checkbox
          = f.label :user_default_external do
            = f.check_box :user_default_external
            Newly registered users will by default be external
85
86

  %fieldset
87
    %legend Sign-up Restrictions
88
89
90
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
91
92
93
          = f.label :signup_enabled do
            = f.check_box :signup_enabled
            Sign-up enabled
94
95
96
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
97
          = f.label :send_user_confirmation_email do
98
            = f.check_box :send_user_confirmation_email
99
            Send confirmation email on sign-up
100
    .form-group
101
      = f.label :domain_whitelist, 'Whitelisted domains for sign-ups', class: 'control-label col-sm-2'
102
      .col-sm-10
103
        = f.text_area :domain_whitelist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8
104
105
106
107
108
109
110
111
112
113
114
115
        .help-block ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com
    .form-group
      = f.label :domain_blacklist_enabled, 'Domain Blacklist', class: 'control-label col-sm-2'
      .col-sm-10
        .checkbox
          = f.label :domain_blacklist_enabled do
            = f.check_box :domain_blacklist_enabled
            Enable domain blacklist for sign ups
    .form-group
      .col-sm-offset-2.col-sm-10
        .radio
          = label_tag :blacklist_type_file do
116
            = radio_button_tag :blacklist_type, :file
117
118
119
120
            .option-title
              Upload blacklist file
        .radio
          = label_tag :blacklist_type_raw do
121
            = radio_button_tag :blacklist_type, :raw, @application_setting.domain_blacklist.present? || @application_setting.domain_blacklist.blank?
122
123
124
125
126
127
128
129
            .option-title
              Enter blacklist manually
    .form-group.blacklist-file
      = f.label :domain_blacklist_file, 'Blacklist file', class: 'control-label col-sm-2'
      .col-sm-10
        = f.file_field :domain_blacklist_file, class: 'form-control', accept: '.txt,.conf'
        .help-block Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries.
    .form-group.blacklist-raw
130
      = f.label :domain_blacklist, 'Blacklisted domains for sign-ups', class: 'control-label col-sm-2'
131
      .col-sm-10
132
        = f.text_area :domain_blacklist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8
133
134
135
136
137
138
139
140
141
142
        .help-block Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com

    .form-group
      = f.label :after_sign_up_text, class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_area :after_sign_up_text, class: 'form-control', rows: 4
        .help-block Markdown enabled

  %fieldset
    %legend Sign-in Restrictions
143
144
145
146
147
148
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :signin_enabled do
            = f.check_box :signin_enabled
            Sign-in enabled
149
    - if omniauth_enabled? && button_based_providers.any?
150
      .form-group
151
        = f.label :enabled_oauth_sign_in_sources, 'Enabled OAuth Sign-In sources', class: 'control-label col-sm-2'
152
        .col-sm-10
153
          .btn-group{ data: { toggle: 'buttons' } }
154
            - oauth_providers_checkboxes.each do |source|
155
              = source
156
    .form-group
157
      = f.label :two_factor_authentication, 'Two-factor authentication', class: 'control-label col-sm-2'
158
159
160
161
      .col-sm-10
        .checkbox
          = f.label :require_two_factor_authentication do
            = f.check_box :require_two_factor_authentication
162
            Require all users to setup Two-factor authentication
163
    .form-group
164
      = f.label :two_factor_authentication, 'Two-factor grace period (hours)', class: 'control-label col-sm-2'
165
166
167
      .col-sm-10
        = f.number_field :two_factor_grace_period, min: 0, class: 'form-control', placeholder: '0'
        .help-block Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication
168
    .form-group
169
      = f.label :home_page_url, 'Home page URL', class: 'control-label col-sm-2'
170
      .col-sm-10
171
172
        = f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block'
        %span.help-block#home_help_block We will redirect non-logged in users to this page
173
174
175
176
177
    .form-group
      = f.label :after_sign_out_path, class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :after_sign_out_path, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'after_sign_out_path_help_block'
        %span.help-block#after_sign_out_path_help_block We will redirect users to this page after they sign out
178
    .form-group
179
      = f.label :sign_in_text, class: 'control-label col-sm-2'
180
      .col-sm-10
181
182
        = f.text_area :sign_in_text, class: 'form-control', rows: 4
        .help-block Markdown enabled
183
184
185
186
187
    .form-group
      = f.label :help_page_text, class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_area :help_page_text, class: 'form-control', rows: 4
        .help-block Markdown enabled
188

Kamil Trzcinski's avatar
Kamil Trzcinski committed
189
190
191
192
193
194
195
196
  %fieldset
    %legend Pages
    .form-group
      = f.label :max_pages_size, 'Maximum size of pages (MB)', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :max_pages_size, class: 'form-control'
        .help-block Zero for unlimited

197
198
199
200
201
202
203
  %fieldset
    %legend Continuous Integration
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :shared_runners_enabled do
            = f.check_box :shared_runners_enabled
Steffen Köhler's avatar
Steffen Köhler committed
204
            Enable shared runners for new projects
205
206
207
208
209
    .form-group
      = f.label :shared_runners_text, class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_area :shared_runners_text, class: 'form-control', rows: 4
        .help-block Markdown enabled
Kamil Trzcinski's avatar
Kamil Trzcinski committed
210
211
212
213
    .form-group
      = f.label :max_artifacts_size, 'Maximum artifacts size (MB)', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :max_artifacts_size, class: 'form-control'
214
215
216
        .help-block
          Set the maximum file size each build's artifacts can have
          = link_to "(?)", help_page_path("user/admin_area/settings/continuous_integration", anchor: "maximum-artifacts-size")
Kamil Trzcinski's avatar
Kamil Trzcinski committed
217

218
219
220
221
222
223
224
225
  - if Gitlab.config.registry.enabled
    %fieldset
      %legend Container Registry
      .form-group
        = f.label :container_registry_token_expire_delay, 'Authorization token duration (minutes)', class: 'control-label col-sm-2'
        .col-sm-10
          = f.number_field :container_registry_token_expire_delay, class: 'form-control'

226
227
228
  %fieldset
    %legend Metrics
    %p
229
230
231
232
233
      Setup InfluxDB to measure a wide variety of statistics like the time spent
      in running SQL queries. These settings require a
      = link_to 'restart', help_page_path('administration/restart_gitlab')
      to take effect.
      = link_to icon('question-circle'), help_page_path('administration/monitoring/performance/introduction')
234
235
236
237
238
239
240
241
242
243
244
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :metrics_enabled do
            = f.check_box :metrics_enabled
            Enable InfluxDB Metrics
    .form-group
      = f.label :metrics_host, 'InfluxDB host', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :metrics_host, class: 'form-control', placeholder: 'influxdb.example.com'
    .form-group
245
      = f.label :metrics_port, 'InfluxDB port', class: 'control-label col-sm-2'
246
      .col-sm-10
247
        = f.text_field :metrics_port, class: 'form-control', placeholder: '8089'
248
        .help-block
249
250
251
252
          The UDP port to use for connecting to InfluxDB. InfluxDB requires that
          your server configuration specifies a database to store data in when
          sending messages to this port, without it metrics data will not be
          saved.
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
    .form-group
      = f.label :metrics_pool_size, 'Connection pool size', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :metrics_pool_size, class: 'form-control'
        .help-block
          The amount of InfluxDB connections to open. Connections are opened
          lazily. Users using multi-threaded application servers should ensure
          enough connections are available (at minimum the amount of application
          server threads).
    .form-group
      = f.label :metrics_timeout, 'Connection timeout', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :metrics_timeout, class: 'form-control'
        .help-block
          The amount of seconds after which an InfluxDB connection will time
          out.
    .form-group
      = f.label :metrics_method_call_threshold, 'Method Call Threshold (ms)', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :metrics_method_call_threshold, class: 'form-control'
        .help-block
          A method call is only tracked when it takes longer to complete than
          the given amount of milliseconds.
276
277
278
279
280
281
282
    .form-group
      = f.label :metrics_sample_interval, 'Sampler Interval (sec)', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :metrics_sample_interval, class: 'form-control'
        .help-block
          The sampling interval in seconds. Sampled data includes memory usage,
          retained Ruby objects, file descriptors and so on.
283
284
285
286
287
288
289
    .form-group
      = f.label :metrics_packet_size, 'Metrics per packet', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :metrics_packet_size, class: 'form-control'
        .help-block
          The amount of points to store in a single UDP packet. More points
          results in fewer but larger UDP packets being sent.
290

291
292
293
294
295
296
297
298
299
300
301
302
  %fieldset
    %legend Background Jobs
    %p
      These settings require a restart to take effect.
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :sidekiq_throttling_enabled do
            = f.check_box :sidekiq_throttling_enabled
            Enable Sidekiq Job Throttling
          .help-block
            Limit the amount of resources slow running jobs are assigned.
303
304
305
306
307
308
309
310
311
    .form-group
      = f.label :sidekiq_throttling_queues, 'Sidekiq queues to throttle', class: 'control-label col-sm-2'
      .col-sm-10
        = f.select :sidekiq_throttling_queues, sidekiq_queue_options_for_select, { include_hidden: false }, multiple: true, class: 'select2 select-wide', data: { field: 'sidekiq_throttling_queues' }
        .help-block
          Choose which queues you wish to throttle.
    .form-group
      = f.label :sidekiq_throttling_factor, 'Throttling Factor', class: 'control-label col-sm-2'
      .col-sm-10
312
        = f.number_field :sidekiq_throttling_factor, class: 'form-control', min: '0.01', max: '0.99', step: '0.01'
313
        .help-block
314
          The factor by which the queues should be throttled. A value between 0.0 and 1.0, exclusive.
315

316
317
318
319
320
321
322
323
  %fieldset
    %legend Spam and Anti-bot Protection
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :recaptcha_enabled do
            = f.check_box :recaptcha_enabled
            Enable reCAPTCHA
324
          %span.help-block#recaptcha_help_block Helps prevent bots from creating accounts
325
326
327
328
329
330

    .form-group
      = f.label :recaptcha_site_key, 'reCAPTCHA Site Key', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :recaptcha_site_key, class: 'form-control'
        .help-block
331
          Generate site and private keys at
332
          %a{ href: 'http://www.google.com/recaptcha', target: 'blank' } http://www.google.com/recaptcha
333

334
335
336
337
338
    .form-group
      = f.label :recaptcha_private_key, 'reCAPTCHA Private Key', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :recaptcha_private_key, class: 'form-control'

339
340
341
342
343
344
345
346
347
348
349
350
351
352
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :akismet_enabled do
            = f.check_box :akismet_enabled
            Enable Akismet
          %span.help-block#akismet_help_block Helps prevent bots from creating issues

    .form-group
      = f.label :akismet_api_key, 'Akismet API Key', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :akismet_api_key, class: 'form-control'
        .help-block
          Generate API key at
353
          %a{ href: 'http://www.akismet.com', target: 'blank' } http://www.akismet.com
354

355
356
357
358
359
360
361
362
363
  %fieldset
    %legend Abuse reports
    .form-group
      = f.label :admin_notification_email, 'Abuse reports notification email', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :admin_notification_email, class: 'form-control'
        .help-block
          Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.

Jeroen Nijhof's avatar
Jeroen Nijhof committed
364
365
366
367
368
369
370
371
372
373
  %fieldset
    %legend Error Reporting and Logging
    %p
      These settings require a restart to take effect.
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :sentry_enabled do
            = f.check_box :sentry_enabled
            Enable Sentry
374
375
          .help-block
            Sentry is an error reporting and logging tool which is currently not shipped with GitLab, get it here:
Douwe Maan's avatar
Douwe Maan committed
376
            %a{ href: 'https://getsentry.com', target: '_blank' } https://getsentry.com
Jeroen Nijhof's avatar
Jeroen Nijhof committed
377
378
379
380
381
382

    .form-group
      = f.label :sentry_dsn, 'Sentry DSN', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :sentry_dsn, class: 'form-control'

383
384
385
  %fieldset
    %legend Repository Storage
    .form-group
386
      = f.label :repository_storages, 'Storage paths for new projects', class: 'control-label col-sm-2'
387
      .col-sm-10
388
        = f.select :repository_storages, repository_storages_options_for_select, {include_hidden: false}, multiple: true, class: 'form-control'
389
        .help-block
390
391
392
          Manage repository storage paths. Learn more in the
          = succeed "." do
            = link_to "repository storages documentation", help_page_path("administration/repository_storages")
393

394
395
396
397
398
399
400
401
402
  %fieldset
    %legend Repository Checks
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :repository_checks_enabled do
            = f.check_box :repository_checks_enabled
            Enable Repository Checks
          .help-block
403
            GitLab will periodically run
404
405
            %a{ href: 'https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html', target: 'blank' } 'git fsck'
            in all project and wiki repositories to look for silent disk corruption issues.
406
407
408
409
    .form-group
      .col-sm-offset-2.col-sm-10
        = link_to 'Clear all repository checks', clear_repository_check_states_admin_application_settings_path, data: { confirm: 'This will clear repository check states for ALL projects in the database. This cannot be undone. Are you sure?' }, method: :put, class: "btn btn-sm btn-remove"
        .help-block
Jacob Vosmaer's avatar
Jacob Vosmaer committed
410
          If you got a lot of false alarms from repository checks you can choose to clear all repository check information from the database.
411

412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
  %fieldset
    %legend Koding
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :koding_enabled do
            = f.check_box :koding_enabled
            Enable Koding
    .form-group
      = f.label :koding_url, 'Koding URL', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :koding_url, class: 'form-control', placeholder: 'http://gitlab.your-koding-instance.com:8090'
        .help-block
          Koding has integration enabled out of the box for the
          %strong gitlab
          team, and you need to provide that team's URL here. Learn more in the
          = succeed "." do
429
            = link_to "Koding administration documentation", help_page_path("administration/integration/koding")
430

431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
  %fieldset
    %legend PlantUML
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :plantuml_enabled do
            = f.check_box :plantuml_enabled
            Enable PlantUML
    .form-group
      = f.label :plantuml_url, 'PlantUML URL', class: 'control-label col-sm-2'
      .col-sm-10
        = f.text_field :plantuml_url, class: 'form-control', placeholder: 'http://gitlab.your-plantuml-instance.com:8080'
        .help-block
          Allow rendering of
          = link_to "PlantUML", "http://plantuml.com"
          diagrams in Asciidoc documents using an external PlantUML service.

448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
  %fieldset
    %legend Usage statistics
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :version_check_enabled do
            = f.check_box :version_check_enabled
            Version check enabled
          .help-block
            Let GitLab inform you when an update is available.

  %fieldset
    %legend Email
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :email_author_in_body do
            = f.check_box :email_author_in_body
            Include author name in notification email body
          .help-block
            Some email servers do not support overriding the email sender name.
            Enable this option to include the name of the author of the issue,
            merge request or comment in the email body instead.
471
472
473
474
475
476
477
478
479
480
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :html_emails_enabled do
            = f.check_box :html_emails_enabled
            Enable HTML emails
          .help-block
            By default GitLab sends emails in HTML and plain text formats so mail
            clients can choose what format to use. Disable this option if you only
            want to send emails in plain text format.
Jacob Vosmaer's avatar
Jacob Vosmaer committed
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
  %fieldset
    %legend Automatic Git repository housekeeping
    .form-group
      .col-sm-offset-2.col-sm-10
        .checkbox
          = f.label :housekeeping_enabled do
            = f.check_box :housekeeping_enabled
            Enable automatic repository housekeeping (git repack, git gc)
          .help-block
            If you keep automatic housekeeping disabled for a long time Git
            repository access on your GitLab server will become slower and your
            repositories will use more disk space. We recommend to always leave
            this enabled.
        .checkbox
          = f.label :housekeeping_bitmaps_enabled do
            = f.check_box :housekeeping_bitmaps_enabled
            Enable Git pack file bitmap creation
          .help-block
            Creating pack file bitmaps makes housekeeping take a little longer but
            bitmaps should accelerate 'git clone' performance.
    .form-group
      = f.label :housekeeping_incremental_repack_period, 'Incremental repack period', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :housekeeping_incremental_repack_period, class: 'form-control'
        .help-block
          Number of Git pushes after which an incremental 'git repack' is run.
    .form-group
      = f.label :housekeeping_full_repack_period, 'Full repack period', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :housekeeping_full_repack_period, class: 'form-control'
        .help-block
          Number of Git pushes after which a full 'git repack' is run.
    .form-group
      = f.label :housekeeping_gc_period, 'Git GC period', class: 'control-label col-sm-2'
      .col-sm-10
        = f.number_field :housekeeping_gc_period, class: 'form-control'
        .help-block
          Number of Git pushes after which 'git gc' is run.

520
  .form-actions
521
    = f.submit 'Save', class: 'btn btn-save'