summaryrefslogtreecommitdiffstats
path: root/bin/create-dmg-from-merged-app-bundle
blob: 483b1298d7c9fe6419e41302afece36d66c7b87d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env bash

# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Exit on errors
set -e

# Use of unset variable is an error
set -u

# If any part of a pipeline of commands fails, the whole pipeline fails
set -o pipefail

if [ `uname` != Darwin ]; then
    echo This is for macOS only >&2
    exit 1
fi

if [ $# != 2 ]; then
    echo Usage: $0 signed-app-bundle type
    echo "  where type is 'release', 'dev', or 'collabora'"
    exit 1
fi

if [ ! -d "$1" ]; then
    echo No such directory: $1 >&2
    exit 1
fi

if [[ "$1" != *.app ]]; then
    echo "signed-app-bundle argument $1 does not end with .app" >&2
    exit 1
fi

DSSTOREFILE=
VOLUMEICON=
if [ "$2" = "release" ];then
    DSSTOREFILE=DS_Store
elif [ "$2" = "dev" ];then
    DSSTOREFILE=DS_Store_Dev
elif [ "$2" = "collabora" ];then
    DSSTOREFILE=DS_Store
    # Collabora is not currently using a volume icon
    #VOLUMEICON=main.icns
else
    echo "type argument $2 is not equal to 'release', 'dev', or 'collabora'" >&2
    exit 1
fi

IN=$(cd "$1" && /bin/pwd)
INAPP=$(basename "$IN")
INDIR=$(dirname "$IN")
OUTVOLUME=$(basename "$IN" .app)
OUTVOLUMEMOUNT=/Volumes/"$OUTVOLUME"
OUTTMPDIR=$(dirname "$IN")/"$OUTVOLUME"
OUTFILE="$OUTTMPDIR".dmg
OUTFILETMP="$OUTTMPDIR".tmp.dmg
SRCDIR=$(cd `dirname "$0"`/.. && /bin/pwd)

# Create $OUTTMPDIR directory in the same directory as the output .dmg and
# assemble assets

if [ -f "$OUTFILE" ]; then
    echo The file $OUTFILE exists already >&2
    exit 1
fi

if [ -d "$OUTFILE" ]; then
    echo $OUTFILE exists and is a directory >&2
    exit 1
fi

if [ -f "$OUTFILETMP" ]; then
    echo The file $OUTFILETMP exists already >&2
    exit 1
fi

if [ -d "$OUTFILETMP" ]; then
    echo $OUTFILETMP exists and is a directory >&2
    exit 1
fi

if [ -d "$OUTTMPDIR" ]; then
    echo The directory $OUTTMPDIR exists already >&2
    exit 1
fi

if [ -f "$OUTTMPDIR" ]; then
    echo $OUTTMPDIR exists and is a file >&2
    exit 1
fi

if [ -d "$OUTVOLUMEMOUNT" ]; then
    echo The directory $OUTVOLUMEMOUNT exists already >&2
    exit 1
fi

if [ -f "$OUTVOLUMEMOUNT" ]; then
    echo $OUTVOLUMEMOUNT exists and is a file >&2
    exit 1
fi

mkdir "$OUTTMPDIR"
mkdir "$OUTTMPDIR"/.background
tar cf - "$INAPP" -C "$INDIR" | tar xvpf - -C "$OUTTMPDIR"
ln -s /Applications "$OUTTMPDIR"/Applications
cp "$SRCDIR"/setup_native/source/packinfo/DS_Store "$OUTTMPDIR"/.DS_Store
if [ ! -z "$VOLUMEICON" ]; then
    cp "$SRCDIR"/sysui/desktop/icons/"$VOLUMEICON" "$OUTTMPDIR"/.VolumeIcon.icns
fi
cp "$SRCDIR"/setup_native/source/packinfo/osxdndinstall.png "$OUTTMPDIR"/.background/background.png

# Create and mount empty .dmg

sync

if [ -z "$VOLUMEICON" ]; then
# Copied and adapted to bash from solenv/bin/modules/installer/simplepackage.pm
# tdf#151341 Use lzfse compression instead of bzip2
hdiutil create -srcfolder "$OUTTMPDIR" "$OUTFILE" -ov -fs HFS+ -volname "$OUTVOLUME" -format ULFO
else
# To set a volume icon, we need to create a writable .dmg, mount it, set the
# volume icon, unmount it, and then convert it to a read-only .dmg
hdiutil create -srcfolder "$OUTTMPDIR" "$OUTFILETMP" -ov -fs HFS+ -volname "$OUTVOLUME" -format UDRW
sync
hdiutil attach "$OUTFILETMP"
if [ -f "$OUTVOLUMEMOUNT"/.VolumeIcon.icns ]; then
    # TODO: SetFile is deprecated so we will eventually need to find another
    # way to set the volume icon or stop trying to set the volume icon
    SetFile -a C "$OUTVOLUMEMOUNT"
fi
hdiutil detach "$OUTVOLUMEMOUNT"
sync
hdiutil convert "$OUTFILETMP" -format ULFO -o "$OUTFILE"
fi

sync

# Print warning about notarization
echo "Successfully created '$OUTFILE'"
echo
echo "Warning: the .dmg is NOT notarized!"
echo
echo "You can manually notarize the .dmg using the following commands:"
echo "  xcrun notarytool submit '$OUTFILE' ... [--wait]"
echo "  xcrun stapler staple '$OUTFILE'"
echo "  xcrun stapler validate '$OUTFILE'"
exit 0