rbm.conf 17.2 KB
Newer Older
boklm's avatar
boklm committed
1
# vim: filetype=yaml sw=2
2
debug: '[% GET ! ENV.RBM_NO_DEBUG %]'
boklm's avatar
boklm committed
3
4
compress_tar: gz
output_dir: "out/[% project %]"
5
tmp_dir: '[% c("basedir") %]/tmp'
6
build_log: '[% GET ENV.RBM_LOGS_DIR ? ENV.RBM_LOGS_DIR : "logs" %]/[% project %][% IF c("var/osname") %]-[% c("var/osname") %][% END %].log'
boklm's avatar
boklm committed
7
8
9

pkg_type: build

10
11
12
13
14
15
16
17
18
steps:
  src-tarballs:
    compress_tar: xz
    src-tarballs: |
      #!/bin/bash
      set -e
      mkdir -p '[% dest_dir %]'
      mv -vf '[% project %]-[% c("version") %].tar.xz' '[% dest_dir %]/[% c("filename") %]'

19
20
21
22
# buildconf contains build options that the user can change in rbm.local.conf
# When adding a new option to buildconf, a default value should be defined
# in var/build_id, so that changing this option does not affect the build_id.
buildconf:
23
  num_procs: '[% GET ENV.RBM_NUM_PROCS ? ENV.RBM_NUM_PROCS : "4" %]'
boklm's avatar
boklm committed
24
  git_signtag_opt: '-s'
25

boklm's avatar
boklm committed
26
var:
27
  torbrowser_version: '9.5a4'
28
  torbrowser_build: 'build2'
29
  torbrowser_incremental_from:
30
    - 9.5a3
boklm's avatar
boklm committed
31
  project_name: tor-browser
boklm's avatar
boklm committed
32
  multi_lingual: 0
boklm's avatar
boklm committed
33
  build_mar: 1
34
35
36
37
38
  # By default, we sort the list of installed packages. This allows sharing
  # containers with identical list of packages, even if they are not listed
  # in the same order. In the cases where the installation order is
  # important, sort_deps should be set to 0.
  sort_deps: 1
39
  build_id: '[% sha256(c("var/build_id_txt", { buildconf => { num_procs => 4 } })).substr(0, 6) %]'
boklm's avatar
boklm committed
40
41
  build_id_txt: |
    [% c("version") %]
boklm's avatar
boklm committed
42
    [% IF c("git_hash") || c("hg_hash"); GET c("abbrev"); END; %]
43
    [% IF c("var/container/use_container") && ! c("var/container/global_disable") -%]
boklm's avatar
boklm committed
44
45
    [% c("var/container/suite") %]
    [% c("var/container/arch") %]
boklm's avatar
boklm committed
46
47
48
    [% END -%]
    input_files: [% c("input_files_id") %]
    build:
49
    [% c("build", { filename => 'f', output_dir => '/out', norec => {} }) %]
boklm's avatar
boklm committed
50
  container:
51
    dir: '[% c("rbm_tmp_dir") %]/rbm-containers/[% sha256(c("build_id")) %]'
boklm's avatar
boklm committed
52
    user: rbm
53
54
55
    disable_network:
      # disable network in the build scripts
      build: 1
boklm's avatar
boklm committed
56
57
58
59
60
  input_files_list: |
    [% FOREACH file IN c("input_files_by_name").keys.sort -%]
    [% c("input_files_by_name/" _ file) %]
    [% END -%]

boklm's avatar
boklm committed
61
  faketime: "faketime -f \"[% USE date; GET date.format(c('timestamp'), format = '%Y-%m-%d %H:%M:%S') %]\""
boklm's avatar
boklm committed
62
63
  touch: "[% USE date %]touch -m -t [% date.format(c('timestamp'), format = '%Y%m%d%H%M') %]"

boklm's avatar
boklm committed
64
65
66
  locale_ja: ja
  locales:
    - ar
67
    - ca
68
    - cs
69
    - da
boklm's avatar
boklm committed
70
    - de
71
    - el
72
    - es-AR
boklm's avatar
boklm committed
73
74
75
    - es-ES
    - fa
    - fr
76
    - ga-IE
77
    - he
78
    - hu
79
80
    - id
    - is
boklm's avatar
boklm committed
81
82
    - it
    - '[% c("var/locale_ja") %]'
83
    - ka
boklm's avatar
boklm committed
84
    - ko
Georg Koppen's avatar
Georg Koppen committed
85
    - lt
86
    - mk
Georg Koppen's avatar
Georg Koppen committed
87
    - ms
88
    - nb-NO
boklm's avatar
boklm committed
89
90
91
    - nl
    - pl
    - pt-BR
Georg Koppen's avatar
Georg Koppen committed
92
    - ro
boklm's avatar
boklm committed
93
    - ru
94
    - sv-SE
Georg Koppen's avatar
Georg Koppen committed
95
    - th
boklm's avatar
boklm committed
96
97
98
    - tr
    - vi
    - zh-CN
99
    - zh-TW
boklm's avatar
boklm committed
100

101
102
103
  sign_build: '[% ENV.RBM_SIGN_BUILD %]'
  sign_build_gpg_opts: '[% ENV.RBM_GPG_OPTS %]'

boklm's avatar
boklm committed
104
105
106
107
108
109
110
111
112
113
114
115
  rezip: |
    rezip_tmpdir=$(mktemp -d)
    mkdir -p "$rezip_tmpdir/z"
    unzip -d "$rezip_tmpdir/z" -- [% c("rezip_file") %] || [ $? -lt 3 ]
    pushd "$rezip_tmpdir/z"
    [% c("zip", {
      zip_src => [ '.' ],
      zip_args => '$rezip_tmpdir/new.zip',
    }) %]
    popd
    mv -f -- "$rezip_tmpdir/new.zip" [% c("rezip_file") %]
    rm -Rf "$rezip_tmpdir"
boklm's avatar
boklm committed
116

117
118
119
120
121
122
123
124
125
  set_default_env: |
    set -e
    [% FOREACH env = c('ENV') -%]
    export [% env.key %]="[% env.value %]"
    [% END -%]
    rootdir=$(pwd)
    export SHELL=/bin/bash
    export HOME=$rootdir
    umask 0022
126
127
128
    [% IF c("var/container/global_disable") -%]
      rm -Rf /var/tmp/build /var/tmp/dist
    [% END -%]
129

boklm's avatar
boklm committed
130
131
132
133
134
  DOCSDIR_project: '[% project %]'
  set_PTDIR_DOCSDIR: |
    PTDIR="$distdir/TorBrowser/Tor/PluggableTransports"
    DOCSDIR="$distdir/TorBrowser/Docs/[% c("var/DOCSDIR_project") %]"

boklm's avatar
boklm committed
135
136
137
138
targets:
  notarget: linux-x86_64
  noint:
    debug: 0
boklm's avatar
boklm committed
139

140
141
142
  release:
    var:
      release: 1
143
      channel: release
144
145
  alpha:
    var:
146
147
      alpha: 1
      channel: alpha
boklm's avatar
boklm committed
148
  nightly:
149
    fetch: 1
boklm's avatar
boklm committed
150
    var:
151
      nightly: 1
152
      channel: nightly
153
      torbrowser_version: '[% ENV.TORBROWSER_NIGHTLY_VERSION ? ENV.TORBROWSER_NIGHTLY_VERSION : c("var_p/nightly_torbrowser_version") %]'
154
155
156
157
158
159
      # For nightly builds, we support updates for a limited set of locales
      mar_locales:
        - de
        - es-ES
        - fr
        - ru
160
      max_torbrowser_incremental_from: 2
boklm's avatar
boklm committed
161

boklm's avatar
boklm committed
162
163
164
165
166
  torbrowser-testbuild:
    - testbuild
    - alpha
  testbuild:
    var:
167
      testbuild: 1
boklm's avatar
boklm committed
168
169
170
      # Don't create mar files to save time
      build_mar: 0

171
172
173
174
175
176
177
178
  # The common-stretch target is used to build components that are common to all
  # platforms, using Debian stretch.
  common-stretch:
    var:
      common: 1
      container:
        suite: stretch
        arch: amd64
179
      pre_pkginst: ''
180
181
182
183
184
185
186
187
      deps:
        - build-essential
        - python
        - automake
        - libtool
        - zip
        - unzip

188
189
  torbrowser-android-armv7:
    - android-armv7
190
    - android
191
192
193
  android-armv7:
    arch: armv7
    var:
194
      android-armv7: 1
195
      osname: android-armv7
196
      toolchain_arch: arm
197
198
199
200
201
202
203
204
  torbrowser-android-x86:
    - android-x86
    - android
  android-x86:
    arch: x86
    var:
      android-x86: 1
      osname: android-x86
205
      toolchain_arch: x86
206
207
208
209
210
211
212
213
  torbrowser-android-x86_64:
    - android-x86_64
    - android
  android-x86_64:
    arch: x86_64
    var:
      android-x86_64: 1
      osname: android-x86_64
214
      toolchain_arch: x86_64
215
216
217
218
219
220
221
222
  torbrowser-android-aarch64:
    - android-aarch64
    - android
  android-aarch64:
    arch: aarch64
    var:
      android-aarch64: 1
      osname: android-aarch64
223
      toolchain_arch: arm64
224
225
226
  android:
    var:
      android: 1
227
      compiler: android-toolchain
228
      # API 16 is the minimum we currently support for Tor Browser on Android
229
230
231
232
233
      android_min_api: '[% GET c("var/android_min_api_" _ c("arch")) %]'
      # API 21 is the minimum we currently support for arm64 on Android
      android_min_api_aarch64: 21
      android_min_api_armv7: 16
      android_min_api_x86: 16
234
      android_min_api_x86_64: 21
235
      snowflake: 0
236
      namecoin: 0
237
238
      CC: '$ANDROID_NDK_HOME/[% c("var/toolchain_arch") %]/bin/clang'
      CXX: '$ANDROID_NDK_HOME/[% c("var/toolchain_arch") %]/bin/clang++'
239
      container:
240
        suite: stretch
241
242
243
244
245
246
247
248
        arch: amd64
      deps:
        - build-essential
        - python
        - automake
        - libtool
        - zip
        - unzip
249

boklm's avatar
boklm committed
250
251
252
  torbrowser-linux-x86_64:
    - linux-x86_64
    - linux
boklm's avatar
boklm committed
253
254
255
256
  torbrowser-linux-x86_64-debug:
    - linux-debug
    - linux-x86_64
    - linux
boklm's avatar
boklm committed
257
258
259
  torbrowser-linux-i686:
    - linux-i686
    - linux
boklm's avatar
boklm committed
260
261
262
  linux-x86_64:
    arch: x86_64
    var:
boklm's avatar
boklm committed
263
      linux-x86_64: 1
boklm's avatar
boklm committed
264
265
266
267
      osname: linux-x86_64
  linux-i686:
    arch: i686
    var:
boklm's avatar
boklm committed
268
      linux-i686: 1
boklm's avatar
boklm committed
269
      osname: linux-i686
270
271
      configure_opt_i686: '--host=i686-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32'
      configure_opt: '[% c("var/configure_opt_i686") %]'
272
273
274
275
  linux:
    var:
      linux: 1
      compiler: gcc
276
      # We only build snowflake on the alpha and nightly
277
      # channels for now.
278
      snowflake: '[% c("var/alpha") || c("var/nightly") %]'
279
280
      # Only build Namecoin for linux on nightly
      namecoin: '[% c("var/nightly") %]'
281
282
      container:
        suite: wheezy
283
284
        arch: amd64
      pre_pkginst: dpkg --add-architecture i386
boklm's avatar
boklm committed
285
      deps:
286
287
        - libc6-dev-i386
        - lib32stdc++6
boklm's avatar
boklm committed
288
289
290
291
292
293
294
295
        - build-essential
        - python
        - bison
        - hardening-wrapper
        - automake
        - libtool
        - zip
        - unzip
boklm's avatar
boklm committed
296
297
298
  linux-debug:
    var:
      asan: 1
boklm's avatar
boklm committed
299
300
301

  torbrowser-windows-i686:
    - windows-i686
302
303
304
305
306
307
308
309
310
    - windows
  torbrowser-windows-x86_64:
    - windows-x86_64
    - windows
  windows-x86_64:
    arch: x86_64
    var:
      windows-x86_64: 1
      osname: windows-x86_64
311
312
      # HEASLR is 64 bit only (see bug 12968)
      flag_HEASLR: '-Wl,--high-entropy-va'
boklm's avatar
boklm committed
313
314
315
  windows-i686:
    arch: i686
    var:
316
      windows-i686: 1
boklm's avatar
boklm committed
317
      osname: windows-i686
318
319
320
321
  windows:
    var:
      windows: 1
      container:
322
        suite: stretch
323
        arch: amd64
324
      configure_opt: '--host=[% c("arch") %]-w64-mingw32 CFLAGS="[% c("var/CFLAGS") %]" LDFLAGS="[% c("var/LDFLAGS") %]"'
325
      CFLAGS: '-fstack-protector-strong -fno-strict-overflow -Wno-missing-field-initializers -Wformat -Wformat-security [% c("var/flag_mwindows") %]'
326
      LDFLAGS: '-Wl,--dynamicbase -Wl,--nxcompat -Wl,--enable-reloc-section -Wl,--no-insert-timestamp -lssp -L$gcclibs [% c("var/flag_HEASLR") %] [% c("var/flag_mwindows") %]'
boklm's avatar
boklm committed
327
      flag_mwindows: '-mwindows'
boklm's avatar
boklm committed
328
      compiler: mingw-w64
329
      faketime_path: /usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1
330
331
332
      # We only build snowflake on the alpha and nightly
      # channels for now.
      snowflake: '[% c("var/alpha") || c("var/nightly") %]'
333
      namecoin: 0
boklm's avatar
boklm committed
334
335
336
337
338
339
340
341
      deps:
        - build-essential
        - python
        - bison
        - automake
        - libtool
        - zip
        - unzip
boklm's avatar
boklm committed
342
343
344

  torbrowser-osx-x86_64:
    - osx-x86_64
boklm's avatar
boklm committed
345
346
347
348
349
  osx-x86_64:
    arch: x86_64
    var:
      osx: 1
      osname: osx-x86_64
boklm's avatar
boklm committed
350
      container:
351
        suite: stretch
boklm's avatar
boklm committed
352
        arch: amd64
boklm's avatar
boklm committed
353
      compiler: 'macosx-toolchain'
354
355
      configure_opt: '--host=x86_64-apple-darwin11 CC="x86_64-apple-darwin11-clang [% c("var/FLAGS") %]" CXX="x86_64-apple-darwin11-clang++ [% c("var/FLAGS") %]"'
      FLAGS: "-target x86_64-apple-darwin11 -B $cctoolsdir -isysroot $sysrootdir"
356
      LDFLAGS: "-Wl,-syslibroot,$sysrootdir -Wl,-dead_strip -Wl,-pie"
357
      macosx_deployment_target: '10.9'
boklm's avatar
boklm committed
358
      locale_ja: ja-JP-mac
359
      # We only build snowflake on the alpha and nightly
360
      # channels for now.
361
      snowflake: '[% c("var/alpha") || c("var/nightly") %]'
362
      namecoin: 0
boklm's avatar
boklm committed
363
364
365
366
367
368
369
      deps:
        - build-essential
        - python
        - automake
        - libtool
        - zip
        - unzip
370
      faketime_path: /usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1
boklm's avatar
boklm committed
371
372
373
      set_PTDIR_DOCSDIR: |
        PTDIR="$distdir/Contents/MacOS/Tor/PluggableTransports"
        DOCSDIR="$distdir/Contents/Resources/TorBrowser/Docs/[% c("var/DOCSDIR_project") %]"
boklm's avatar
boklm committed
374
375
376
377
378

  # The no_build_id target can be useful if you want to quickly display
  # a build template or other option but don't want to spend time to
  # compute the various build ids
  no_build_id:
379
380
381
382
383
384
    # The defaut timestamp value will use the commit time of the
    # selected commit for the project, which will require cloning the
    # git repository if it is not present. When we use the no_build_id
    # target to display a script, we usually don't care about such
    # details, so we set timestamp to 0 to avoid unnecessary cloning.
    timestamp: 0
boklm's avatar
boklm committed
385
386
387
    var:
      build_id: 1

388
389
390
391
  no_containers:
    var:
      container:
        global_disable: 1
boklm's avatar
boklm committed
392
393
394
395
396
397
398
399
400
401
402
403

# change the default gpg_wrapper to allow git tag signed using an
# expired key.
# https://bugs.torproject.org/19737
gpg_wrapper: |
  #!/bin/bash
  export LC_ALL=C
  [%
      IF c('gpg_keyring');
          SET gpg_kr = '--keyring ' _ path(c('gpg_keyring'), path(c('gpg_keyring_dir'))) _ ' --no-default-keyring';
      END;
  -%]
404
405
406
407
408
409
  gpg_verify=0
  for opt in "$@"
  do
    test "$opt" = '--verify' && gpg_verify=1
  done
  if [ $gpg_verify = 1 ]
boklm's avatar
boklm committed
410
411
412
413
414
415
  then
        [% c('gpg_bin') %] [% c('gpg_args') %] --with-fingerprint [% gpg_kr %] "$@" | sed 's/^\[GNUPG:\] EXPKEYSIG /\[GNUPG:\] GOODSIG /'
        exit ${PIPESTATUS[0]}
  else
        exec [% c('gpg_bin') %] [% c('gpg_args') %] --with-fingerprint [% gpg_kr %] "$@"
  fi
boklm's avatar
boklm committed
416

417
418
419
420
421
remote_start: '[% IF c("var/container/use_container") && ! c("var/container/global_disable") %][% c("runc/remote_start") %][% END %]'
remote_exec: '[% IF c("var/container/use_container") && ! c("var/container/global_disable") %][% c("runc/remote_exec") %][% END %]'
remote_put: '[% IF c("var/container/use_container") && ! c("var/container/global_disable") %][% c("runc/remote_put") %][% END %]'
remote_get: '[% IF c("var/container/use_container") && ! c("var/container/global_disable") %][% c("runc/remote_get") %][% END %]'
remote_finish: '[% IF c("var/container/use_container") && ! c("var/container/global_disable") %][% c("runc/remote_finish") %][% END %]'
boklm's avatar
boklm committed
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441

runc:
  remote_start: |
    #!/bin/sh
    set -e
    if [ $(ls -1 '[% c("remote_srcdir", { error_if_undef => 1 }) %]/container-image_'* | wc -l) -ne 1 ]
    then
      echo "Can't find container image in input files" >&2
      ls -l '[% c("remote_srcdir") %]' >&2
      exit 1
    fi
    mkdir -p '[% c("var/container/dir") %]'/rootfs/rbm
    sudo tar -C '[% c("var/container/dir") %]'/rootfs -xf $(ls -1 '[% c("remote_srcdir", { error_if_undef => 1 }) %]/container-image_'*)
    [% SET user = c("var/container/user") -%]
    [% c("remote_exec", { exec_as_root => 1, exec_cmd => 'id ' _ user
        _ ' >/dev/null 2>&1 || adduser -m ' _ user _ ' || useradd -m ' _ user }) %]

  remote_exec: |
    #!/bin/sh
    set -e
442
443
444
    [% IF c("interactive") -%]
      echo Container directory: [% shell_quote(c("var/container/dir")) %]
    [% END -%]
boklm's avatar
boklm committed
445
446
447
448
449
450
451
452
    mkdir -p '[% c("var/container/dir", { error_if_undef => 1 }) %]'/rootfs/rbm
    echo '#!/bin/sh' > '[% c("var/container/dir") %]'/rootfs/rbm/cmd
    echo [% shell_quote(c('exec_cmd')) %] >> '[% c("var/container/dir") %]'/rootfs/rbm/cmd
    echo '#!/bin/sh' > '[% c("var/container/dir") %]'/rootfs/rbm/run
    [% IF c('exec_as_root'); SET user = 'root'; ELSE; SET user = c("var/container/user", { error_if_undef => 1 }); END; %]
    echo 'su - [% user %] -c /rbm/cmd' >> '[% c("var/container/dir") %]'/rootfs/rbm/run
    chmod +x '[% c("var/container/dir") %]'/rootfs/rbm/cmd
    chmod +x '[% c("var/container/dir") %]'/rootfs/rbm/run
453
454
455
    cat > '[% c("var/container/dir") %]'/config.json << EOF
    [% INCLUDE 'runc-config.json' %]
    EOF
456
457
    [% IF c("var/container/disable_network/" _ c("exec_name")) -%]
      sudo ip netns add 'rbm-[% sha256(c("build_id", { error_if_undef => 1 })) %]'
458
459
      # make sure the lo interface is up (see bug 31293)
      sudo ip netns exec 'rbm-[% sha256(c("build_id", { error_if_undef => 1 })) %]' ip link set lo up
460
    [% END -%]
boklm's avatar
boklm committed
461
    sudo runc [% IF c("var_p/runc100") %]run[% ELSE %]start[% END %] -b '[% c("var/container/dir") %]' rbm-[% sha256(c("build_id", { error_if_undef => 1 })) %] [% IF c("runc_hide_stderr") %]2>/dev/null[% END %]
462
463
464
    [% IF c("var/container/disable_network/" _ c("exec_name")) -%]
      sudo ip netns delete 'rbm-[% sha256(c("build_id", { error_if_undef => 1 })) %]'
    [% END -%]
boklm's avatar
boklm committed
465
466
467
468
469
470
471
472
473
474

  remote_put: |
    #!/bin/sh
    set -e
    [%
      SET src = shell_quote(c('put_src', { error_if_undef => 1 }));
      SET dst = shell_quote(c('put_dst', { error_if_undef => 1 }));
    -%]
    sudo mkdir -p '[% c("var/container/dir") %]'/rootfs/[% dst %]
    sudo cp -aP [% src %] '[% c("var/container/dir") %]'/rootfs/[% dst %]
475
476
477
478
    # On Ubuntu, the /root/.profile file contains a `mesg n` line which is
    # producing some `stdin: is not a tty` messages. To hide them, we hide
    # stderr from this part by setting runc_hide_stderr.
    [% c("remote_exec", { exec_as_root => 1, exec_cmd => 'chown -R ' _ c("var/container/user") _ ' ' _ dst, runc_hide_stderr => 1 }) %]
boklm's avatar
boklm committed
479
480
481
482
483
484
485
486
487
488

  remote_get: |
    #!/bin/sh
    set -e
    [%
      SET src = shell_quote(c('get_src', { error_if_undef => 1 }));
      SET dst = shell_quote(c('get_dst', { error_if_undef => 1 }));
    -%]
    mkdir -p [% dst %]
    srcdir='[% c("var/container/dir", { error_if_undef => 1 }) %]'/rootfs/[% src %]
489
    sudo chown -R $(whoami) "$srcdir"
boklm's avatar
boklm committed
490
491
    if [ $(ls -1 "$srcdir"/* 2> /dev/null | wc -l) -gt 0 ]
    then
492
493
494
495
496
497
      for file in "$srcdir"/*
      do
        bname="$(basename "$file")"
        test -e [% dst %]/"$bname" && rm -Rf [% dst %]/"$bname"
        mv -f "$file" [% dst %]/
      done
boklm's avatar
boklm committed
498
499
500
501
502
503
504
505
    fi

  remote_finish: |
    #!/bin/sh
    set -e
    sudo rm -Rf '[% c("var/container/dir", { error_if_undef => 1 }) %]'/rootfs '[% c("var/container/dir", { error_if_undef => 1 }) %]'/config.json
    rmdir '[% c("var/container/dir") %]'

boklm's avatar
boklm committed
506
507
508
ENV:
  TZ: UTC
  LC_ALL: C
boklm's avatar
boklm committed
509
510
511
512
513
514
--- |
  # This part of the file contains options written in perl
  use IO::CaptureOutput qw(capture_exec);
  (
    var_p => {
      # runc100 is true if we are using runc >= 1.0.0
515
      # we assume that any version that is not 0.1.1 is >= 1.0.0
boklm's avatar
boklm committed
516
      runc100 => sub {
517
518
        my ($out) = capture_exec('sudo', 'runc', '--version');
        return !($out =~ m/^runc version 0.1.1/);
boklm's avatar
boklm committed
519
      },
520
      # runc_spec100 is true if runc spec is at least 1.0.0
521
522
523
      # We will need to update this when there is a new spec version available
      runc_spec100 => sub {
        my ($out) = capture_exec('sudo', 'runc', '--version');
524
        return $out =~ m/^.*spec: 1\.[0-9]+\.[0-9]+(?:-dev)?$/m;
525
      },
526
527
528
529
530
531
532
      nightly_torbrowser_version => sub {
        state $version = '';
        return $version if $version;
        my (undef, undef, undef, $day, $mon, $year) = gmtime;
        $version = sprintf("tbb-nightly.%u.%02u.%02u", $year + 1900, $mon + 1, $day);
        return $version;
      },
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
      nightly_torbrowser_incremental_from => sub {
        my ($project, $options) = @_;
        my $nightly_dir = project_config($project, 'basedir', $options) . '/nightly';
        my $current_version = project_config($project, 'var/torbrowser_version', $options);
        use Path::Tiny;
        return [] unless -d $nightly_dir;
        my @dirs = sort map { $_->basename } path($nightly_dir)->children(qr/^tbb-nightly\./);
        my $nb_incr = project_config($project, ['var', 'max_torbrowser_incremental_from'], $options);
        my @res;
        while ($nb_incr > 0) {
          my $dir = pop @dirs;
          last unless $dir;
          next if $dir eq $current_version;
          $nb_incr--;
          push @res, $dir;
        }
        return [@res];
      },
boklm's avatar
boklm committed
551
552
    },
  )