flutter 5.82 KB
Newer Older
1 2 3 4 5
#!/bin/bash
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

6 7 8 9

# ---------------------------------- NOTE ---------------------------------- #
#
# Please keep the logic in this file consistent with the logic in the
10
# `flutter.bat` script in the same directory to ensure that Flutter continues
11 12 13 14
# to work across all platforms!
#
# -------------------------------------------------------------------------- #

15 16
set -e

17
function follow_links() {
18
  cd -P "${1%/*}"
19
  local file="$PWD/${1##*/}"
20 21
  while [ -h "$file" ]; do
    # On Mac OS, readlink -f doesn't work.
22
    cd -P "${file%/*}"
23
    file="$(readlink "$file")"
24 25
    cd -P "${file%/*}"
    file="$PWD/${file##*/}"
26
  done
27
  echo "$PWD/${file##*/}"
28 29
}

30 31 32
# Convert a filesystem path to a format usable by Dart's URI parser.
function path_uri() {
  # Reduce multiple leading slashes to a single slash.
33
  echo "$1" | sed -E -e "s,^/+,/,"
34 35
}

36
function upgrade_flutter () {
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
  # This function is executed with a redirect that pipes the source of
  # this script into file descriptor 3.
  #
  # To ensure that we don't simultaneously update Dart in multiple
  # parallel instances, we try to obtain an exclusive lock on this
  # file descriptor (and thus this script's source file) while we are
  # updating Dart and compiling the script. To do this, we try to use
  # the command line program "flock", which is available on many
  # Unix-like platforms, in particular on most Linux distributions.
  # You give it a file descriptor, and it locks the corresponding
  # file, having inherited the file descriptor from the shell.
  #
  # Complicating matters, there are two major scenarios where this
  # will not work. The first is if the platform doesn't have "flock",
  # for example on Mac. There does not appear to be any sort of other
  # equivalent, so on platforms that don't have flock, we just don't
  # do anything.
  #
  # To determine if we have "flock" available, we abuse the "hash"
  # shell built-in to determine if "flock" resolves to anything. If it
  # does, we call it, otherwise we forget the whole thing.
  #
  # The second complication is NFS. On NFS, to obtain an exclusive
  # lock you need a file descriptor that is open for writing, because
  # NFS implements exclusive locks by writing, or some such. Thus, we
  # ignore errors from flock. We do so by using the '|| true' trick,
  # since we are running in a 'set -e' environment wherein all errors
  # are fatal, and by redirecting all output to /dev/null, since
  # users will typically not care about errors from flock and are
  # more likely to be confused by them than helped.
  #
  # The lock is released when the file descriptor goes out of scope,
  # i.e. when this function returns.
70
  if hash flock 2>/dev/null; then
71
    flock 3 2>/dev/null || true
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
  fi

  local revision=`(cd "$FLUTTER_ROOT"; git rev-parse HEAD)`
  if [ ! -f "$SNAPSHOT_PATH" ] || [ ! -s "$STAMP_PATH" ] || [ `cat "$STAMP_PATH"` != "$revision" ] || [ "$FLUTTER_TOOLS_DIR/pubspec.yaml" -nt "$FLUTTER_TOOLS_DIR/pubspec.lock" ]; then
    mkdir -p "$FLUTTER_ROOT/bin/cache"
    touch "$FLUTTER_ROOT/bin/cache/.dartignore"
    "$FLUTTER_ROOT/bin/internal/update_dart_sdk.sh"

    echo Building flutter tool...
    if [ "$TRAVIS" == "true" ] || [ "$BOT" == "true" ] || [ "$CONTINUOUS_INTEGRATION" == "true" ] || [ "$CHROME_HEADLESS" == "1" ] || [ "$APPVEYOR" == "true" ] || [ "$CI" == "true" ]; then
      PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_bot"
    fi
    export PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_install"

    if [ -d "$FLUTTER_ROOT/.pub-cache" ]; then
      export PUB_CACHE="${PUB_CACHE:-"$FLUTTER_ROOT/.pub-cache"}"
    fi

    while : ; do
      cd "$FLUTTER_TOOLS_DIR"
      "$PUB" upgrade --verbosity=error --no-packages-dir && break
      echo Error: Unable to 'pub upgrade' flutter tool. Retrying in five seconds...
      sleep 5
    done
    "$DART" --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH"
    echo "$revision" > "$STAMP_PATH"
  fi
}

101
PROG_NAME="$(path_uri "$(follow_links "$BASH_SOURCE")")"
102 103 104
BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
export FLUTTER_ROOT="$(cd "${BIN_DIR}/.." ; pwd -P)"

105 106 107
FLUTTER_TOOLS_DIR="$FLUTTER_ROOT/packages/flutter_tools"
SNAPSHOT_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.snapshot"
STAMP_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.stamp"
108
SCRIPT_PATH="$FLUTTER_TOOLS_DIR/bin/flutter_tools.dart"
109
DART_SDK_PATH="$FLUTTER_ROOT/bin/cache/dart-sdk"
110

111
DART="$DART_SDK_PATH/bin/dart"
112 113
PUB="$DART_SDK_PATH/bin/pub"

114 115
# Test if running as superuser – but don't warn if running within Docker
if [[ "$EUID" == "0" ]] && ! [[ -f /.dockerenv ]]; then
116 117 118 119 120 121
  echo "   Woah! You appear to be trying to run flutter as root."
  echo "   We strongly recommend running the flutter tool without superuser privileges."
  echo "  /"
  echo "📎"
fi

122 123 124 125 126 127 128 129 130 131
# Test if Git is available on the Host
if ! hash git 2>/dev/null; then
  echo "Error: Unable to find git in your PATH."
  exit 1
fi
# Test if the flutter directory is a git clone (otherwise git rev-parse HEAD would fail)
if [ ! -d "$FLUTTER_ROOT/.git" ]; then
  echo "Error: The Flutter directory is not a clone of the GitHub project."
  exit 1
fi
132

133
FLUTTER_TOOL_ARGS="--assert-initializer $FLUTTER_TOOL_ARGS"
134 135
# To debug the tool, you can uncomment the following lines to enable checked mode and set an observatory port:
# FLUTTER_TOOL_ARGS="--checked $FLUTTER_TOOL_ARGS"
136
# FLUTTER_TOOL_ARGS="$FLUTTER_TOOL_ARGS --observe=65432"
137

138
(upgrade_flutter) 3< "$PROG_NAME"
139

140
set +e
141
"$DART" $FLUTTER_TOOL_ARGS "$SNAPSHOT_PATH" "$@"
142 143 144 145 146 147

# The VM exits with code 253 if the snapshot version is out-of-date.
# If it is, we need to snapshot it again.
EXIT_CODE=$?
if [ $EXIT_CODE != 253 ]; then
  exit $EXIT_CODE
Ian Hickson's avatar
Ian Hickson committed
148
fi
149 150

set -e
151
"$DART" --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH"
152
"$DART" $FLUTTER_TOOL_ARGS "$SNAPSHOT_PATH" "$@"