Hex Artifact Content

Artifact e7a75a276a731bbf576e3da37417daa72ac633a8:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 62 61 73 68 0a 0a 50 41 54 48 3d 22 24 7b 50 41  bash..PATH="${PA
0020: 54 48 7d 3a 24 28 64 69 72 6e 61 6d 65 20 22 24  TH}:$(dirname "$
0030: 28 77 68 69 63 68 20 22 24 30 22 29 22 29 22 0a  (which "$0")")".
0040: 0a 69 66 20 5b 20 22 24 31 22 20 3d 3d 20 27 2d  .if [ "$1" == '-
0050: 2d 63 70 69 6f 27 20 5d 3b 20 74 68 65 6e 0a 09  -cpio' ]; then..
0060: 73 68 69 66 74 0a 0a 09 6d 6f 64 65 3d 27 66 69  shift...mode='fi
0070: 6c 65 27 0a 0a 09 70 6b 67 66 69 6c 65 3d 22 24  le'...pkgfile="$
0080: 31 22 0a 65 6c 73 65 0a 09 6d 6f 64 65 3d 27 64  1".else..mode='d
0090: 69 72 27 0a 0a 09 70 6b 67 73 64 69 72 3d 22 24  ir'...pkgsdir="$
00a0: 31 22 0a 66 69 0a 61 70 70 66 73 64 69 72 3d 22  1".fi.appfsdir="
00b0: 24 32 22 0a 0a 73 68 69 66 74 3b 20 73 68 69 66  $2"..shift; shif
00c0: 74 0a 0a 69 66 20 5b 20 2d 7a 20 22 24 7b 70 6b  t..if [ -z "${pk
00d0: 67 73 64 69 72 7d 22 20 2d 61 20 2d 7a 20 22 24  gsdir}" -a -z "$
00e0: 7b 70 6b 67 66 69 6c 65 7d 22 20 5d 20 7c 7c 20  {pkgfile}" ] || 
00f0: 5b 20 2d 7a 20 22 24 7b 61 70 70 66 73 64 69 72  [ -z "${appfsdir
0100: 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 65 63 68 6f  }" ]; then..echo
0110: 20 27 55 73 61 67 65 3a 20 61 70 70 66 73 2d 6d   'Usage: appfs-m
0120: 6b 20 7b 2d 2d 63 70 69 6f 20 3c 70 6b 67 66 69  k {--cpio <pkgfi
0130: 6c 65 3e 7c 3c 70 6b 67 73 64 69 72 3e 7d 20 3c  le>|<pkgsdir>} <
0140: 61 70 70 66 73 64 69 72 3e 20 5b 3c 73 69 74 65  appfsdir> [<site
0150: 2d 6b 65 79 3e 20 5b 3c 73 69 74 65 2d 63 65 72  -key> [<site-cer
0160: 74 69 66 69 63 61 74 65 3e 5d 5d 27 20 3e 26 32  tificate>]]' >&2
0170: 0a 0a 09 65 78 69 74 20 31 0a 66 69 0a 0a 61 70  ...exit 1.fi..ap
0180: 70 66 73 64 69 72 3d 22 24 28 63 64 20 22 24 7b  pfsdir="$(cd "${
0190: 61 70 70 66 73 64 69 72 7d 22 20 26 26 20 70 77  appfsdir}" && pw
01a0: 64 29 22 0a 69 66 20 5b 20 2d 7a 20 22 24 7b 61  d)".if [ -z "${a
01b0: 70 70 66 73 64 69 72 7d 22 20 5d 3b 20 74 68 65  ppfsdir}" ]; the
01c0: 6e 0a 09 65 63 68 6f 20 22 55 6e 61 62 6c 65 20  n..echo "Unable 
01d0: 74 6f 20 66 69 6e 64 20 61 70 70 66 73 20 64 69  to find appfs di
01e0: 72 65 63 74 6f 72 79 2e 22 20 3e 26 32 0a 0a 09  rectory." >&2...
01f0: 65 78 69 74 20 31 0a 66 69 0a 0a 6d 6b 64 69 72  exit 1.fi..mkdir
0200: 20 2d 70 20 22 24 7b 61 70 70 66 73 64 69 72 7d   -p "${appfsdir}
0210: 2f 73 68 61 31 22 0a 0a 66 75 6e 63 74 69 6f 6e  /sha1"..function
0220: 20 73 68 61 31 28 29 20 7b 0a 09 6c 6f 63 61 6c   sha1() {..local
0230: 20 66 69 6c 65 6e 61 6d 65 0a 0a 09 66 69 6c 65   filename...file
0240: 6e 61 6d 65 3d 22 24 31 22 0a 0a 09 6f 70 65 6e  name="$1"...open
0250: 73 73 6c 20 73 68 61 31 20 22 24 7b 66 69 6c 65  ssl sha1 "${file
0260: 6e 61 6d 65 7d 22 20 7c 20 73 65 64 20 27 73 40  name}" | sed 's@
0270: 2e 2a 3d 20 40 40 27 0a 7d 0a 0a 66 75 6e 63 74  .*= @@'.}..funct
0280: 69 6f 6e 20 65 6d 69 74 5f 6d 61 6e 69 66 65 73  ion emit_manifes
0290: 74 28 29 20 7b 0a 09 66 69 6e 64 20 2e 20 2d 70  t() {..find . -p
02a0: 72 69 6e 74 30 20 7c 20 77 68 69 6c 65 20 49 46  rint0 | while IF
02b0: 53 3d 27 27 20 72 65 61 64 20 2d 72 20 2d 64 20  S='' read -r -d 
02c0: 24 27 5c 30 27 20 66 69 6c 65 6e 61 6d 65 3b 20  $'\0' filename; 
02d0: 64 6f 0a 09 09 69 66 20 5b 20 22 24 7b 66 69 6c  do...if [ "${fil
02e0: 65 6e 61 6d 65 7d 22 20 3d 20 27 2e 27 20 5d 3b  ename}" = '.' ];
02f0: 20 74 68 65 6e 0a 09 09 09 63 6f 6e 74 69 6e 75   then....continu
0300: 65 0a 09 09 66 69 0a 0a 09 09 66 69 6c 65 6e 61  e...fi....filena
0310: 6d 65 3d 22 24 28 65 63 68 6f 20 22 24 7b 66 69  me="$(echo "${fi
0320: 6c 65 6e 61 6d 65 7d 22 20 7c 20 73 65 64 20 27  lename}" | sed '
0330: 73 40 5e 5c 2e 2f 40 40 27 20 7c 20 68 65 61 64  s@^\./@@' | head
0340: 20 2d 6e 20 31 29 22 0a 0a 09 09 69 66 20 5b 20   -n 1)"....if [ 
0350: 21 20 2d 65 20 22 24 7b 66 69 6c 65 6e 61 6d 65  ! -e "${filename
0360: 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09 63 6f  }" ]; then....co
0370: 6e 74 69 6e 75 65 0a 09 09 66 69 0a 0a 09 09 69  ntinue...fi....i
0380: 66 20 5b 20 2d 68 20 22 24 7b 66 69 6c 65 6e 61  f [ -h "${filena
0390: 6d 65 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09  me}" ]; then....
03a0: 74 79 70 65 3d 27 73 79 6d 6c 69 6e 6b 27 0a 09  type='symlink'..
03b0: 09 65 6c 69 66 20 5b 20 2d 64 20 22 24 7b 66 69  .elif [ -d "${fi
03c0: 6c 65 6e 61 6d 65 7d 22 20 5d 3b 20 74 68 65 6e  lename}" ]; then
03d0: 0a 09 09 09 74 79 70 65 3d 27 64 69 72 65 63 74  ....type='direct
03e0: 6f 72 79 27 0a 09 09 65 6c 69 66 20 5b 20 2d 66  ory'...elif [ -f
03f0: 20 22 24 7b 66 69 6c 65 6e 61 6d 65 7d 22 20 5d   "${filename}" ]
0400: 3b 20 74 68 65 6e 0a 09 09 09 74 79 70 65 3d 27  ; then....type='
0410: 66 69 6c 65 27 0a 09 09 65 6c 73 65 0a 09 09 09  file'...else....
0420: 63 6f 6e 74 69 6e 75 65 0a 09 09 66 69 0a 0a 09  continue...fi...
0430: 09 63 61 73 65 20 22 24 7b 74 79 70 65 7d 22 20  .case "${type}" 
0440: 69 6e 0a 09 09 09 64 69 72 65 63 74 6f 72 79 29  in....directory)
0450: 0a 09 09 09 09 73 74 61 74 5f 66 6f 72 6d 61 74  .....stat_format
0460: 3d 27 25 59 27 0a 09 09 09 09 65 78 74 72 61 5f  ='%Y'.....extra_
0470: 64 61 74 61 3d 27 27 0a 09 09 09 09 3b 3b 0a 09  data=''.....;;..
0480: 09 09 73 79 6d 6c 69 6e 6b 29 0a 09 09 09 09 73  ..symlink).....s
0490: 74 61 74 5f 66 6f 72 6d 61 74 3d 27 25 59 27 0a  tat_format='%Y'.
04a0: 09 09 09 09 65 78 74 72 61 5f 64 61 74 61 3d 22  ....extra_data="
04b0: 24 28 72 65 61 64 6c 69 6e 6b 20 22 24 7b 66 69  $(readlink "${fi
04c0: 6c 65 6e 61 6d 65 7d 22 29 22 0a 09 09 09 09 3b  lename}")".....;
04d0: 3b 0a 09 09 09 66 69 6c 65 29 0a 09 09 09 09 69  ;....file).....i
04e0: 66 20 5b 20 2d 78 20 22 24 7b 66 69 6c 65 6e 61  f [ -x "${filena
04f0: 6d 65 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09  me}" ]; then....
0500: 09 09 65 78 74 72 61 5f 64 61 74 61 3d 27 78 27  ..extra_data='x'
0510: 0a 09 09 09 09 65 6c 73 65 0a 09 09 09 09 09 65  .....else......e
0520: 78 74 72 61 5f 64 61 74 61 3d 27 27 0a 09 09 09  xtra_data=''....
0530: 09 66 69 0a 0a 09 09 09 09 73 74 61 74 5f 66 6f  .fi......stat_fo
0540: 72 6d 61 74 3d 27 25 59 2c 25 73 27 0a 09 09 09  rmat='%Y,%s'....
0550: 09 66 69 6c 65 6e 61 6d 65 5f 68 61 73 68 3d 22  .filename_hash="
0560: 24 28 73 68 61 31 20 22 24 7b 66 69 6c 65 6e 61  $(sha1 "${filena
0570: 6d 65 7d 22 29 22 0a 09 09 09 09 65 78 74 72 61  me}")".....extra
0580: 5f 64 61 74 61 3d 22 24 7b 65 78 74 72 61 5f 64  _data="${extra_d
0590: 61 74 61 7d 2c 24 7b 66 69 6c 65 6e 61 6d 65 5f  ata},${filename_
05a0: 68 61 73 68 7d 22 0a 0a 09 09 09 09 66 69 6c 65  hash}"......file
05b0: 6e 61 6d 65 5f 69 6e 74 72 65 65 3d 22 24 7b 61  name_intree="${a
05c0: 70 70 66 73 64 69 72 7d 2f 73 68 61 31 2f 24 7b  ppfsdir}/sha1/${
05d0: 66 69 6c 65 6e 61 6d 65 5f 68 61 73 68 7d 22 0a  filename_hash}".
05e0: 0a 09 09 09 09 69 66 20 5b 20 21 20 2d 65 20 22  .....if [ ! -e "
05f0: 24 7b 66 69 6c 65 6e 61 6d 65 5f 69 6e 74 72 65  ${filename_intre
0600: 65 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09 09  e}" ]; then.....
0610: 09 63 61 74 20 22 24 7b 66 69 6c 65 6e 61 6d 65  .cat "${filename
0620: 7d 22 20 3e 20 22 24 7b 66 69 6c 65 6e 61 6d 65  }" > "${filename
0630: 5f 69 6e 74 72 65 65 7d 2e 74 6d 70 22 0a 0a 09  _intree}.tmp"...
0640: 09 09 09 09 6d 76 20 22 24 7b 66 69 6c 65 6e 61  ....mv "${filena
0650: 6d 65 5f 69 6e 74 72 65 65 7d 2e 74 6d 70 22 20  me_intree}.tmp" 
0660: 22 24 7b 66 69 6c 65 6e 61 6d 65 5f 69 6e 74 72  "${filename_intr
0670: 65 65 7d 22 0a 09 09 09 09 66 69 0a 09 09 09 09  ee}".....fi.....
0680: 3b 3b 0a 09 09 65 73 61 63 0a 09 09 73 74 61 74  ;;...esac...stat
0690: 5f 64 61 74 61 3d 22 24 28 73 74 61 74 20 2d 2d  _data="$(stat --
06a0: 66 6f 72 6d 61 74 3d 22 24 7b 73 74 61 74 5f 66  format="${stat_f
06b0: 6f 72 6d 61 74 7d 22 20 22 24 7b 66 69 6c 65 6e  ormat}" "${filen
06c0: 61 6d 65 7d 22 29 22 0a 0a 09 09 69 66 20 5b 20  ame}")"....if [ 
06d0: 2d 7a 20 22 24 7b 65 78 74 72 61 5f 64 61 74 61  -z "${extra_data
06e0: 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09 65 63  }" ]; then....ec
06f0: 68 6f 20 22 24 7b 74 79 70 65 7d 2c 24 7b 73 74  ho "${type},${st
0700: 61 74 5f 64 61 74 61 7d 2c 24 7b 66 69 6c 65 6e  at_data},${filen
0710: 61 6d 65 7d 22 0a 09 09 65 6c 73 65 0a 09 09 09  ame}"...else....
0720: 65 63 68 6f 20 22 24 7b 74 79 70 65 7d 2c 24 7b  echo "${type},${
0730: 73 74 61 74 5f 64 61 74 61 7d 2c 24 7b 65 78 74  stat_data},${ext
0740: 72 61 5f 64 61 74 61 7d 2c 24 7b 66 69 6c 65 6e  ra_data},${filen
0750: 61 6d 65 7d 22 0a 09 09 66 69 0a 09 64 6f 6e 65  ame}"...fi..done
0760: 0a 7d 0a 0a 70 61 63 6b 61 67 65 6c 69 73 74 66  .}..packagelistf
0770: 69 6c 65 3d 22 24 7b 61 70 70 66 73 64 69 72 7d  ile="${appfsdir}
0780: 2f 73 68 61 31 2f 24 7b 52 41 4e 44 4f 4d 7d 24  /sha1/${RANDOM}$
0790: 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41 4e 44 4f 4d  {RANDOM}${RANDOM
07a0: 7d 24 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41 4e 44  }${RANDOM}${RAND
07b0: 4f 4d 7d 2e 74 6d 70 22 0a 64 65 66 61 75 6c 74  OM}.tmp".default
07c0: 5f 69 73 4c 61 74 65 73 74 3d 27 30 27 0a 0a 63  _isLatest='0'..c
07d0: 61 73 65 20 22 24 7b 6d 6f 64 65 7d 22 20 69 6e  ase "${mode}" in
07e0: 0a 09 64 69 72 29 0a 09 09 63 64 20 22 24 7b 70  ..dir)...cd "${p
07f0: 6b 67 73 64 69 72 7d 22 20 7c 7c 20 65 78 69 74  kgsdir}" || exit
0800: 20 31 0a 09 09 3b 3b 0a 09 66 69 6c 65 29 0a 09   1...;;..file)..
0810: 09 6f 6c 64 70 61 63 6b 61 67 65 6c 69 73 74 66  .oldpackagelistf
0820: 69 6c 65 3d 22 24 7b 61 70 70 66 73 64 69 72 7d  ile="${appfsdir}
0830: 2f 73 68 61 31 2f 24 28 63 61 74 20 22 24 7b 61  /sha1/$(cat "${a
0840: 70 70 66 73 64 69 72 7d 2f 69 6e 64 65 78 22 20  ppfsdir}/index" 
0850: 7c 20 68 65 61 64 20 2d 6e 20 31 20 7c 20 63 75  | head -n 1 | cu
0860: 74 20 2d 66 20 31 20 2d 64 20 27 2c 27 29 22 0a  t -f 1 -d ',')".
0870: 0a 09 09 77 6f 72 6b 64 69 72 3d 22 24 7b 61 70  ...workdir="${ap
0880: 70 66 73 64 69 72 7d 2f 2e 77 6f 72 6b 64 69 72  pfsdir}/.workdir
0890: 2d 24 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41 4e 44  -${RANDOM}${RAND
08a0: 4f 4d 7d 24 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41  OM}${RANDOM}${RA
08b0: 4e 44 4f 4d 7d 22 0a 09 09 6d 6b 64 69 72 20 22  NDOM}"...mkdir "
08c0: 24 7b 77 6f 72 6b 64 69 72 7d 22 0a 0a 09 09 63  ${workdir}"....c
08d0: 61 74 20 22 24 7b 70 6b 67 66 69 6c 65 7d 22 20  at "${pkgfile}" 
08e0: 7c 20 28 20 63 64 20 22 24 7b 77 6f 72 6b 64 69  | ( cd "${workdi
08f0: 72 7d 22 20 26 26 20 63 70 69 6f 20 2d 69 6d 64  r}" && cpio -imd
0900: 20 29 20 7c 7c 20 65 78 69 74 20 31 0a 09 09 63   ) || exit 1...c
0910: 64 20 22 24 7b 77 6f 72 6b 64 69 72 7d 22 20 7c  d "${workdir}" |
0920: 7c 20 65 78 69 74 20 31 0a 0a 09 09 64 69 72 64  | exit 1....dird
0930: 61 74 65 3d 22 24 28 66 69 6e 64 20 2e 20 2d 74  ate="$(find . -t
0940: 79 70 65 20 66 20 2d 70 72 69 6e 74 66 20 27 25  ype f -printf '%
0950: 54 59 25 54 6d 25 54 64 25 54 48 25 54 4d 2e 25  TY%Tm%Td%TH%TM.%
0960: 54 53 5c 6e 27 20 2d 71 75 69 74 20 7c 20 63 75  TS\n' -quit | cu
0970: 74 20 2d 66 20 31 2d 32 20 2d 64 20 27 2e 27 29  t -f 1-2 -d '.')
0980: 22 0a 09 09 66 69 6e 64 20 2e 20 2d 74 79 70 65  "...find . -type
0990: 20 64 20 2d 70 72 69 6e 74 30 20 7c 20 78 61 72   d -print0 | xar
09a0: 67 73 20 2d 30 20 2d 2d 20 74 6f 75 63 68 20 2d  gs -0 -- touch -
09b0: 74 20 22 24 7b 64 69 72 64 61 74 65 7d 22 0a 0a  t "${dirdate}"..
09c0: 09 09 23 20 49 66 20 74 68 69 73 20 61 72 63 68  ..# If this arch
09d0: 69 76 65 20 63 6f 6e 74 61 69 6e 73 20 65 78 61  ive contains exa
09e0: 63 74 6c 79 20 6f 6e 65 20 70 61 63 6b 61 67 65  ctly one package
09f0: 20 6d 61 72 6b 20 69 74 20 61 73 20 74 68 65 20   mark it as the 
0a00: 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 0a 09  latest version..
0a10: 09 63 68 6b 5f 70 61 63 6b 61 67 65 3d 22 24 28  .chk_package="$(
0a20: 65 63 68 6f 20 2a 29 22 0a 09 09 69 66 20 5b 20  echo *)"...if [ 
0a30: 2d 64 20 22 24 7b 63 68 6b 5f 70 61 63 6b 61 67  -d "${chk_packag
0a40: 65 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09 64  e}" ]; then....d
0a50: 65 66 61 75 6c 74 5f 69 73 4c 61 74 65 73 74 3d  efault_isLatest=
0a60: 27 31 27 0a 09 09 66 69 0a 0a 09 09 63 61 74 20  '1'...fi....cat 
0a70: 22 24 7b 6f 6c 64 70 61 63 6b 61 67 65 6c 69 73  "${oldpackagelis
0a80: 74 66 69 6c 65 7d 22 20 32 3e 2f 64 65 76 2f 6e  tfile}" 2>/dev/n
0a90: 75 6c 6c 20 7c 20 28 0a 09 09 09 69 66 20 5b 20  ull | (....if [ 
0aa0: 2d 64 20 22 24 7b 63 68 6b 5f 70 61 63 6b 61 67  -d "${chk_packag
0ab0: 65 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 09 09  e}" ]; then.....
0ac0: 73 65 64 20 27 73 40 5e 5c 28 27 22 7b 63 68 6b  sed 's@^\('"{chk
0ad0: 5f 70 61 63 6b 61 67 65 7d 22 27 2c 2e 2a 5c 29  _package}"',.*\)
0ae0: 2c 31 40 5c 31 2c 30 40 27 0a 09 09 09 65 6c 73  ,1@\1,0@'....els
0af0: 65 0a 09 09 09 09 63 61 74 0a 09 09 09 66 69 0a  e.....cat....fi.
0b00: 09 09 29 20 3e 20 22 24 7b 70 61 63 6b 61 67 65  ..) > "${package
0b10: 6c 69 73 74 66 69 6c 65 7d 22 0a 0a 09 09 3b 3b  listfile}"....;;
0b20: 0a 65 73 61 63 0a 0a 66 6f 72 20 70 61 63 6b 61  .esac..for packa
0b30: 67 65 20 69 6e 20 2a 3b 20 64 6f 0a 09 69 66 20  ge in *; do..if 
0b40: 5b 20 21 20 2d 64 20 22 24 7b 70 61 63 6b 61 67  [ ! -d "${packag
0b50: 65 7d 22 20 5d 3b 20 74 68 65 6e 0a 09 09 63 6f  e}" ]; then...co
0b60: 6e 74 69 6e 75 65 0a 09 66 69 0a 0a 09 28 0a 09  ntinue..fi...(..
0b70: 09 63 64 20 22 24 7b 70 61 63 6b 61 67 65 7d 22  .cd "${package}"
0b80: 20 7c 7c 20 65 78 69 74 20 31 0a 0a 09 09 66 6f   || exit 1....fo
0b90: 72 20 6f 73 5f 63 70 75 41 72 63 68 20 69 6e 20  r os_cpuArch in 
0ba0: 2a 3b 20 64 6f 0a 09 09 09 6f 73 3d 22 24 28 65  *; do....os="$(e
0bb0: 63 68 6f 20 22 24 7b 6f 73 5f 63 70 75 41 72 63  cho "${os_cpuArc
0bc0: 68 7d 22 20 7c 20 63 75 74 20 2d 66 20 31 20 2d  h}" | cut -f 1 -
0bd0: 64 20 27 2d 27 29 22 0a 09 09 09 63 70 75 41 72  d '-')"....cpuAr
0be0: 63 68 3d 22 24 28 65 63 68 6f 20 22 24 7b 6f 73  ch="$(echo "${os
0bf0: 5f 63 70 75 41 72 63 68 7d 22 20 7c 20 63 75 74  _cpuArch}" | cut
0c00: 20 2d 66 20 32 2d 20 2d 64 20 27 2d 27 29 22 0a   -f 2- -d '-')".
0c10: 0a 09 09 09 28 0a 09 09 09 09 63 64 20 22 24 7b  ....(.....cd "${
0c20: 6f 73 5f 63 70 75 41 72 63 68 7d 22 20 7c 7c 20  os_cpuArch}" || 
0c30: 65 78 69 74 20 31 0a 0a 09 09 09 09 66 6f 72 20  exit 1......for 
0c40: 76 65 72 73 69 6f 6e 20 69 6e 20 2a 3b 20 64 6f  version in *; do
0c50: 0a 09 09 09 09 09 69 66 20 5b 20 2d 68 20 22 24  ......if [ -h "$
0c60: 7b 76 65 72 73 69 6f 6e 7d 22 20 5d 3b 20 74 68  {version}" ]; th
0c70: 65 6e 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75  en.......continu
0c80: 65 0a 09 09 09 09 09 66 69 0a 0a 09 09 09 09 09  e......fi.......
0c90: 6d 61 6e 69 66 65 73 74 66 69 6c 65 3d 22 24 7b  manifestfile="${
0ca0: 61 70 70 66 73 64 69 72 7d 2f 73 68 61 31 2f 24  appfsdir}/sha1/$
0cb0: 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41 4e 44 4f 4d  {RANDOM}${RANDOM
0cc0: 7d 24 7b 52 41 4e 44 4f 4d 7d 24 7b 52 41 4e 44  }${RANDOM}${RAND
0cd0: 4f 4d 7d 24 7b 52 41 4e 44 4f 4d 7d 2e 74 6d 70  OM}${RANDOM}.tmp
0ce0: 22 0a 0a 09 09 09 09 09 28 0a 09 09 09 09 09 09  ".......(.......
0cf0: 63 64 20 22 24 7b 76 65 72 73 69 6f 6e 7d 22 20  cd "${version}" 
0d00: 7c 7c 20 65 78 69 74 20 31 0a 0a 09 09 09 09 09  || exit 1.......
0d10: 09 65 63 68 6f 20 22 23 6d 61 6e 69 66 65 73 74  .echo "#manifest
0d20: 6d 65 74 61 64 61 74 61 2c 24 7b 70 61 63 6b 61  metadata,${packa
0d30: 67 65 7d 2c 24 7b 6f 73 7d 2c 24 7b 63 70 75 41  ge},${os},${cpuA
0d40: 72 63 68 7d 2c 24 7b 76 65 72 73 69 6f 6e 7d 22  rch},${version}"
0d50: 0a 09 09 09 09 09 09 65 6d 69 74 5f 6d 61 6e 69  .......emit_mani
0d60: 66 65 73 74 0a 09 09 09 09 09 29 20 3e 20 22 24  fest......) > "$
0d70: 7b 6d 61 6e 69 66 65 73 74 66 69 6c 65 7d 22 0a  {manifestfile}".
0d80: 0a 09 09 09 09 09 6d 61 6e 69 66 65 73 74 66 69  ......manifestfi
0d90: 6c 65 5f 68 61 73 68 3d 22 24 28 73 68 61 31 20  le_hash="$(sha1 
0da0: 22 24 7b 6d 61 6e 69 66 65 73 74 66 69 6c 65 7d  "${manifestfile}
0db0: 22 29 22 0a 09 09 09 09 09 6d 76 20 22 24 7b 6d  ")"......mv "${m
0dc0: 61 6e 69 66 65 73 74 66 69 6c 65 7d 22 20 22 24  anifestfile}" "$
0dd0: 7b 61 70 70 66 73 64 69 72 7d 2f 73 68 61 31 2f  {appfsdir}/sha1/
0de0: 24 7b 6d 61 6e 69 66 65 73 74 66 69 6c 65 5f 68  ${manifestfile_h
0df0: 61 73 68 7d 22 0a 0a 09 09 09 09 09 23 20 58 58  ash}".......# XX
0e00: 58 3a 54 4f 44 4f 3a 20 44 65 74 65 72 6d 69 6e  X:TODO: Determin
0e10: 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
0e20: 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 0a   latest version.
0e30: 09 09 09 09 09 69 73 4c 61 74 65 73 74 3d 22 24  .....isLatest="$
0e40: 7b 64 65 66 61 75 6c 74 5f 69 73 4c 61 74 65 73  {default_isLates
0e50: 74 3a 2d 30 7d 22 0a 0a 09 09 09 09 09 65 63 68  t:-0}".......ech
0e60: 6f 20 22 24 7b 70 61 63 6b 61 67 65 7d 2c 24 7b  o "${package},${
0e70: 76 65 72 73 69 6f 6e 7d 2c 24 7b 6f 73 7d 2c 24  version},${os},$
0e80: 7b 63 70 75 41 72 63 68 7d 2c 24 7b 6d 61 6e 69  {cpuArch},${mani
0e90: 66 65 73 74 66 69 6c 65 5f 68 61 73 68 7d 2c 24  festfile_hash},$
0ea0: 7b 69 73 4c 61 74 65 73 74 7d 22 0a 09 09 09 09  {isLatest}".....
0eb0: 64 6f 6e 65 0a 0a 09 09 09 29 0a 09 09 64 6f 6e  done.....)...don
0ec0: 65 0a 09 29 0a 64 6f 6e 65 20 3e 3e 20 22 24 7b  e..).done >> "${
0ed0: 70 61 63 6b 61 67 65 6c 69 73 74 66 69 6c 65 7d  packagelistfile}
0ee0: 22 0a 0a 23 20 45 6e 73 75 72 65 20 70 61 63 6b  "..# Ensure pack
0ef0: 61 67 65 20 6c 69 73 74 20 66 69 6c 65 20 64 6f  age list file do
0f00: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  es not contain d
0f10: 75 70 6c 69 63 61 74 65 20 76 65 72 73 69 6f 6e  uplicate version
0f20: 73 0a 63 61 74 20 22 24 7b 70 61 63 6b 61 67 65  s.cat "${package
0f30: 6c 69 73 74 66 69 6c 65 7d 22 20 7c 20 61 77 6b  listfile}" | awk
0f40: 20 2d 46 20 27 2c 27 20 27 0a 09 7b 0a 09 09 70   -F ',' '..{...p
0f50: 61 63 6b 61 67 65 20 3d 20 24 31 3b 0a 09 09 76  ackage = $1;...v
0f60: 65 72 73 69 6f 6e 20 3d 20 24 32 3b 0a 09 09 6f  ersion = $2;...o
0f70: 73 20 3d 20 24 33 3b 0a 09 09 63 70 75 41 72 63  s = $3;...cpuArc
0f80: 68 20 3d 20 24 34 3b 0a 09 09 68 61 73 68 20 3d  h = $4;...hash =
0f90: 20 24 35 3b 0a 09 09 69 73 4c 61 74 65 73 74 20   $5;...isLatest 
0fa0: 3d 20 24 36 3b 0a 0a 09 09 6b 65 79 20 3d 20 70  = $6;....key = p
0fb0: 61 63 6b 61 67 65 20 22 2c 22 20 76 65 72 73 69  ackage "," versi
0fc0: 6f 6e 20 22 2c 22 20 6f 73 20 22 2c 22 20 63 70  on "," os "," cp
0fd0: 75 41 72 63 68 3b 0a 0a 09 09 69 66 20 28 69 73  uArch;....if (is
0fe0: 4c 61 74 65 73 74 20 3d 3d 20 22 31 22 29 20 7b  Latest == "1") {
0ff0: 0a 09 09 09 6b 65 79 73 5f 6c 61 74 65 73 74 5b  ....keys_latest[
1000: 6b 65 79 5d 20 3d 20 68 61 73 68 3b 0a 09 09 7d  key] = hash;...}
1010: 0a 09 09 6b 65 79 73 5b 6b 65 79 5d 20 3d 20 68  ...keys[key] = h
1020: 61 73 68 3b 0a 09 7d 0a 0a 09 45 4e 44 7b 0a 09  ash;..}...END{..
1030: 09 66 6f 72 20 28 6b 65 79 20 69 6e 20 6b 65 79  .for (key in key
1040: 73 29 20 7b 0a 09 09 09 69 66 20 28 6b 65 79 73  s) {....if (keys
1050: 5f 6c 61 74 65 73 74 5b 6b 65 79 5d 20 21 3d 20  _latest[key] != 
1060: 22 22 29 20 7b 0a 09 09 09 09 69 73 4c 61 74 65  "") {.....isLate
1070: 73 74 20 3d 20 22 31 22 3b 0a 09 09 09 09 68 61  st = "1";.....ha
1080: 73 68 20 3d 20 6b 65 79 73 5f 6c 61 74 65 73 74  sh = keys_latest
1090: 5b 6b 65 79 5d 3b 0a 09 09 09 7d 20 65 6c 73 65  [key];....} else
10a0: 20 7b 0a 09 09 09 09 69 73 4c 61 74 65 73 74 20   {.....isLatest 
10b0: 3d 20 22 30 22 3b 0a 09 09 09 09 68 61 73 68 20  = "0";.....hash 
10c0: 3d 20 6b 65 79 73 5b 6b 65 79 5d 3b 0a 09 09 09  = keys[key];....
10d0: 7d 0a 0a 09 09 09 70 72 69 6e 74 20 6b 65 79 20  }.....print key 
10e0: 22 2c 22 20 68 61 73 68 20 22 2c 22 20 69 73 4c  "," hash "," isL
10f0: 61 74 65 73 74 3b 0a 09 09 7d 0a 09 7d 20 20 0a  atest;...}..}  .
1100: 27 20 7c 20 73 6f 72 74 20 2d 75 20 3e 20 22 24  ' | sort -u > "$
1110: 7b 70 61 63 6b 61 67 65 6c 69 73 74 66 69 6c 65  {packagelistfile
1120: 7d 2e 6e 65 77 22 0a 63 61 74 20 22 24 7b 70 61  }.new".cat "${pa
1130: 63 6b 61 67 65 6c 69 73 74 66 69 6c 65 7d 2e 6e  ckagelistfile}.n
1140: 65 77 22 20 3e 20 22 24 7b 70 61 63 6b 61 67 65  ew" > "${package
1150: 6c 69 73 74 66 69 6c 65 7d 22 0a 72 6d 20 2d 66  listfile}".rm -f
1160: 20 22 24 7b 70 61 63 6b 61 67 65 6c 69 73 74 66   "${packagelistf
1170: 69 6c 65 7d 2e 6e 65 77 22 0a 0a 70 61 63 6b 61  ile}.new"..packa
1180: 67 65 6c 69 73 74 66 69 6c 65 5f 68 61 73 68 3d  gelistfile_hash=
1190: 22 24 28 73 68 61 31 20 22 24 7b 70 61 63 6b 61  "$(sha1 "${packa
11a0: 67 65 6c 69 73 74 66 69 6c 65 7d 22 29 22 0a 6d  gelistfile}")".m
11b0: 76 20 22 24 7b 70 61 63 6b 61 67 65 6c 69 73 74  v "${packagelist
11c0: 66 69 6c 65 7d 22 20 22 24 7b 61 70 70 66 73 64  file}" "${appfsd
11d0: 69 72 7d 2f 73 68 61 31 2f 24 7b 70 61 63 6b 61  ir}/sha1/${packa
11e0: 67 65 6c 69 73 74 66 69 6c 65 5f 68 61 73 68 7d  gelistfile_hash}
11f0: 22 0a 0a 69 66 20 5b 20 2d 6e 20 22 24 41 50 50  "..if [ -n "$APP
1200: 46 53 5f 53 49 47 4e 5f 49 4e 5f 50 4c 41 43 45  FS_SIGN_IN_PLACE
1210: 22 20 5d 3b 20 74 68 65 6e 0a 09 69 6e 64 65 78  " ]; then..index
1220: 66 69 6c 65 3d 22 24 7b 61 70 70 66 73 64 69 72  file="${appfsdir
1230: 7d 2f 69 6e 64 65 78 22 0a 65 6c 73 65 0a 09 69  }/index".else..i
1240: 6e 64 65 78 66 69 6c 65 3d 22 24 7b 61 70 70 66  ndexfile="${appf
1250: 73 64 69 72 7d 2f 69 6e 64 65 78 2e 6e 65 77 22  sdir}/index.new"
1260: 0a 66 69 0a 0a 65 63 68 6f 20 22 24 7b 70 61 63  .fi..echo "${pac
1270: 6b 61 67 65 6c 69 73 74 66 69 6c 65 5f 68 61 73  kagelistfile_has
1280: 68 7d 2c 73 68 61 31 22 20 3e 20 22 24 7b 69 6e  h},sha1" > "${in
1290: 64 65 78 66 69 6c 65 7d 22 0a 0a 69 66 20 5b 20  dexfile}"..if [ 
12a0: 2d 78 20 22 24 28 77 68 69 63 68 20 27 61 70 70  -x "$(which 'app
12b0: 66 73 2d 63 65 72 74 27 20 32 3e 2f 64 65 76 2f  fs-cert' 2>/dev/
12c0: 6e 75 6c 6c 29 22 5d 3b 20 74 68 65 6e 0a 09 61  null)"]; then..a
12d0: 70 70 66 73 2d 63 65 72 74 20 73 69 67 6e 2d 73  ppfs-cert sign-s
12e0: 69 74 65 20 22 24 7b 69 6e 64 65 78 66 69 6c 65  ite "${indexfile
12f0: 7d 22 20 22 24 40 22 0a 66 69 0a 0a 69 66 20 5b  }" "$@".fi..if [
1300: 20 2d 7a 20 22 24 41 50 50 46 53 5f 53 49 47 4e   -z "$APPFS_SIGN
1310: 5f 49 4e 5f 50 4c 41 43 45 22 20 5d 3b 20 74 68  _IN_PLACE" ]; th
1320: 65 6e 0a 09 6d 76 20 22 24 7b 69 6e 64 65 78 66  en..mv "${indexf
1330: 69 6c 65 7d 22 20 22 24 7b 61 70 70 66 73 64 69  ile}" "${appfsdi
1340: 72 7d 2f 69 6e 64 65 78 22 0a 66 69 0a 0a 63 61  r}/index".fi..ca
1350: 73 65 20 22 24 7b 6d 6f 64 65 7d 22 20 69 6e 0a  se "${mode}" in.
1360: 09 66 69 6c 65 29 0a 09 09 63 64 20 2f 0a 09 09  .file)...cd /...
1370: 72 6d 20 2d 72 66 20 22 24 7b 77 6f 72 6b 64 69  rm -rf "${workdi
1380: 72 7d 22 0a 09 09 3b 3b 0a 65 73 61 63 0a        r}"...;;.esac.