273 lines · 10.2 KB · Text
RawDownload
#!/bin/bash## Updates the Info.plist file for a macOS app bundle to register supported file types and URL schemes.# This only applies the updates common to `script/bundle` and `script/run`.# Must be called from the root directory of the warp repo. set -e if [[ ! -d "script" ]]; then    echo "Run this script from the root of your warp repo."    exit 1fi if [[ -z "$WARP_PLIST_PATH" ]]; then  echo 'Must set $WARP_PLIST_PATH'  exit 1fi if [[ -n "$GIT_RELEASE_TAG" ]]; then  echo "Updating plist Warp version to $GIT_RELEASE_TAG"  plutil -insert WarpVersion -string "$GIT_RELEASE_TAG" "$WARP_PLIST_PATH"   # We convert our version format to be period-separated integers only to align better with  # Apple's guidance on values for `CFBundleVersion` / `CFBundleShortVersionString`.  # (They technically only allow [major].[minor].[patch], but it's not enforced.)  # This allows IT admins to work with a more stable version of our internal versioning scheme.  # A tag like `v0.2025.01.07.08.02.stable_02` would be converted to `0.2025.01.07.08.02.02`.  if [[ $GIT_RELEASE_TAG =~ ^v([0-9]+)\.([0-9]{4})\.([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.[a-z]+_([0-9]{2})$ ]]; then    MAJOR="${BASH_REMATCH[1]}"    YEAR="${BASH_REMATCH[2]}"    MONTH="${BASH_REMATCH[3]}"    DAY="${BASH_REMATCH[4]}"    HOUR="${BASH_REMATCH[5]}"    MINUTE="${BASH_REMATCH[6]}"    BUILD="${BASH_REMATCH[7]}"        FORMATTED_VERSION="${MAJOR}.${YEAR}.${MONTH}.${DAY}.${HOUR}.${MINUTE}.${BUILD}"        echo "Updating plist version to $FORMATTED_VERSION"    plutil -replace CFBundleShortVersionString -string "$FORMATTED_VERSION" "$WARP_PLIST_PATH"    plutil -replace CFBundleVersion -string "$FORMATTED_VERSION" "$WARP_PLIST_PATH"  else    echo "Warning: GIT_RELEASE_TAG '$GIT_RELEASE_TAG' does not match expected format vN.YYYY.MM.DD.HH.MM.channel_NN"  fifi if [[ -n "$WARP_SCHEME_NAME" ]]; then  echo "Updating plist to support a custom url scheme"  # Update the plist that cargo bundle creates to add support for custom URL schemes. Unfortunately, cargo bundle does not support  # setting arbitrary plist fields, so we must do this after the fact.  plutil -insert CFBundleURLTypes -xml "<array><dict><key>CFBundleURLName</key><string>Custom App</string><key>CFBundleURLSchemes</key><array><string>$WARP_SCHEME_NAME</string></array></dict></array>" "$WARP_PLIST_PATH"fi if [[ -z "$WARP_PLIST_NO_FILE_TYPES" ]]; then  echo "Updating plist with supported file types"  plutil -insert CFBundleDocumentTypes -xml "  <array>    <dict>      <key>CFBundleTypeName</key><string>Folder</string>      <key>CFBundleTypeRole</key><string>Editor</string>      <key>LSHandlerRank</key><string>Alternate</string>      <key>LSItemContentTypes</key>      <array>        <string>public.folder</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>Terminal shell script</string>      <key>CFBundleTypeRole</key><string>Shell</string>      <key>LSItemContentTypes</key>      <array>        <string>com.apple.terminal.shell-script</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>Unix Executable File</string>      <key>CFBundleTypeRole</key><string>Shell</string>      <key>LSItemContentTypes</key>      <array>        <string>public.unix-executable</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>Markdown File</string>      <key>CFBundleTypeRole</key><string>Editor</string>      <key>LSHandlerRank</key><string>Alternate</string>      <key>LSItemContentTypes</key>      <array>        <string>net.daringfireball.markdown</string>        <string>com.unknown.md</string>        <string>net.ia.markdown</string>        <string>public.markdown</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>Plain Text File</string>      <key>CFBundleTypeRole</key><string>Editor</string>      <key>LSHandlerRank</key><string>Alternate</string>      <key>LSItemContentTypes</key>      <array>        <string>public.plain-text</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>Source Code File</string>      <key>CFBundleTypeRole</key><string>Editor</string>      <key>LSHandlerRank</key><string>Alternate</string>      <key>LSItemContentTypes</key>      <array>        <string>public.source-code</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>Source Code</string>      <key>CFBundleTypeRole</key><string>Editor</string>      <key>LSHandlerRank</key><string>Alternate</string>      <key>CFBundleTypeExtensions</key>      <array>        <string>c</string>        <string>h</string>        <string>cc</string>        <string>cpp</string>        <string>cxx</string>        <string>c++</string>        <string>hpp</string>        <string>hxx</string>        <string>hh</string>        <string>h++</string>        <string>m</string>        <string>mm</string>        <string>cs</string>        <string>csx</string>        <string>css</string>        <string>dart</string>        <string>dockerfile</string>        <string>containerfile</string>        <string>go</string>        <string>htm</string>        <string>html</string>        <string>xhtml</string>        <string>java</string>        <string>jav</string>        <string>js</string>        <string>mjs</string>        <string>cjs</string>        <string>json</string>        <string>jsx</string>        <string>less</string>        <string>lua</string>        <string>makefile</string>        <string>mk</string>        <string>cmake</string>        <string>php</string>        <string>pl</string>        <string>pm</string>        <string>py</string>        <string>pyi</string>        <string>r</string>        <string>rb</string>        <string>gemspec</string>        <string>rs</string>        <string>rst</string>        <string>sass</string>        <string>scss</string>        <string>sql</string>        <string>swift</string>        <string>ts</string>        <string>tsx</string>        <string>txt</string>        <string>vue</string>        <string>xml</string>        <string>xaml</string>        <string>dtd</string>        <string>plist</string>        <string>yaml</string>        <string>yml</string>        <string>eyaml</string>        <string>eyml</string>        <string>toml</string>        <string>cfg</string>        <string>conf</string>        <string>config</string>        <string>csv</string>        <string>diff</string>        <string>env</string>        <string>gradle</string>        <string>groovy</string>        <string>ini</string>        <string>log</string>        <string>properties</string>        <string>svg</string>        <string>tex</string>        <string>cls</string>        <string>lock</string>        <string>bat</string>        <string>cmd</string>        <string>ps1</string>        <string>psd1</string>        <string>psm1</string>        <string>sh</string>        <string>bash</string>        <string>zsh</string>        <string>fish</string>        <string>bashrc</string>        <string>bash_profile</string>        <string>zshrc</string>        <string>zshenv</string>        <string>profile</string>        <string>gitignore</string>        <string>gitconfig</string>        <string>gitattributes</string>        <string>editorconfig</string>        <string>hbs</string>        <string>handlebars</string>        <string>erb</string>        <string>tf</string>        <string>tfvars</string>        <string>proto</string>        <string>graphql</string>        <string>gql</string>        <string>wgsl</string>        <string>zig</string>        <string>kt</string>        <string>kts</string>        <string>scala</string>        <string>ex</string>        <string>exs</string>        <string>erl</string>        <string>clj</string>        <string>cljs</string>        <string>coffee</string>        <string>fs</string>        <string>fsi</string>        <string>fsx</string>        <string>ml</string>        <string>mli</string>        <string>vb</string>        <string>pug</string>        <string>jade</string>        <string>ipynb</string>      </array>    </dict>    <dict>      <key>CFBundleTypeName</key><string>All Documents</string>      <key>CFBundleTypeRole</key><string>Editor</string>      <key>LSHandlerRank</key><string>Alternate</string>      <key>LSItemContentTypes</key>      <array>        <string>public.data</string>      </array>    </dict>  </array>" "$WARP_PLIST_PATH"fi # Unfortunately, there isn't a single standard UTI (what goes in LSItemContentTypes) for Markdown# files. Instead, we list all the common ones - see these for more info:# https://github.com/sbarex/QLMarkdown#installation# https://blog.smittytone.net/2021/01/19/how-tools-try-to-own-markdown/ echo "Updating plist with permissions descriptions"plutil -insert NSAppleEventsUsageDescription -string "A program in Warp wants to use AppleScript." "$WARP_PLIST_PATH"plutil -insert NSCameraUsageDescription -string "A program in Warp wants to use the camera." "$WARP_PLIST_PATH"plutil -insert NSMicrophoneUsageDescription -string "A program in Warp wants to use your microphone." "$WARP_PLIST_PATH"plutil -insert NSContactsUsageDescription -string "A program in Warp wants to use your contacts." "$WARP_PLIST_PATH"plutil -insert NSCalendarsUsageDescription -string "A program in Warp wants to use your calendar." "$WARP_PLIST_PATH"plutil -insert NSCalendarsFullAccessUsageDescription -string "A program in Warp wants full access to your calendar." "$WARP_PLIST_PATH"plutil -insert NSRemindersUsageDescription -string "A program in Warp wants to use your reminders." "$WARP_PLIST_PATH"plutil -insert NSRemindersFullAccessUsageDescription -string "A program in Warp wants full access to your reminders." "$WARP_PLIST_PATH"plutil -insert NSLocationUsageDescription -string "A program in Warp wants to use your location information." "$WARP_PLIST_PATH"plutil -insert NSPhotoLibraryUsageDescription -string "A program in Warp wants to use your photo library." "$WARP_PLIST_PATH" echo "Disabling use of Liquid Glass on macOS Tahoe"plutil -insert UIDesignRequiresCompatibility -bool true "$WARP_PLIST_PATH"