/ atom.sh
atom.sh
  1  #!/bin/bash
  2  
  3  if [ "$(uname)" == 'Darwin' ]; then
  4    OS='Mac'
  5  elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
  6    OS='Linux'
  7  else
  8    echo "Your platform ($(uname -a)) is not supported."
  9    exit 1
 10  fi
 11  
 12  case $(basename $0) in
 13    atom-beta)
 14      CHANNEL=beta
 15      ;;
 16    atom-nightly)
 17      CHANNEL=nightly
 18      ;;
 19    atom-dev)
 20      CHANNEL=dev
 21      ;;
 22    *)
 23      CHANNEL=stable
 24      ;;
 25  esac
 26  
 27  # Only set the ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT env var if it hasn't been set.
 28  if [ -z "$ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT" ]
 29  then
 30    export ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT=true
 31  fi
 32  
 33  ATOM_ADD=false
 34  ATOM_NEW_WINDOW=false
 35  EXIT_CODE_OVERRIDE=
 36  
 37  while getopts ":anwtfvh-:" opt; do
 38    case "$opt" in
 39      -)
 40        case "${OPTARG}" in
 41          add)
 42            ATOM_ADD=true
 43            ;;
 44          new-window)
 45            ATOM_NEW_WINDOW=true
 46            ;;
 47          wait)
 48            WAIT=1
 49            ;;
 50          help|version)
 51            REDIRECT_STDERR=1
 52            EXPECT_OUTPUT=1
 53            ;;
 54          foreground|benchmark|benchmark-test|test)
 55            EXPECT_OUTPUT=1
 56            ;;
 57          enable-electron-logging)
 58            export ELECTRON_ENABLE_LOGGING=1
 59            ;;
 60        esac
 61        ;;
 62      a)
 63        ATOM_ADD=true
 64        ;;
 65      n)
 66        ATOM_NEW_WINDOW=true
 67        ;;
 68      w)
 69        WAIT=1
 70        ;;
 71      h|v)
 72        REDIRECT_STDERR=1
 73        EXPECT_OUTPUT=1
 74        ;;
 75      f|t)
 76        EXPECT_OUTPUT=1
 77        ;;
 78    esac
 79  done
 80  
 81  if [ "${ATOM_ADD}" = "true" ] && [ "${ATOM_NEW_WINDOW}" = "true" ]; then
 82    EXPECT_OUTPUT=1
 83    EXIT_CODE_OVERRIDE=1
 84  fi
 85  
 86  if [ $REDIRECT_STDERR ]; then
 87    exec 2> /dev/null
 88  fi
 89  
 90  ATOM_HOME="${ATOM_HOME:-$HOME/.atom}"
 91  mkdir -p "$ATOM_HOME"
 92  
 93  if [ $OS == 'Mac' ]; then
 94    if [ -L "$0" ]; then
 95      SCRIPT="$(readlink "$0")"
 96    else
 97      SCRIPT="$0"
 98    fi
 99    ATOM_APP="$(dirname "$(dirname "$(dirname "$(dirname "$SCRIPT")")")")"
100    if [ "$ATOM_APP" == . ]; then
101      unset ATOM_APP
102    else
103      ATOM_PATH="$(dirname "$ATOM_APP")"
104      ATOM_APP_NAME="$(basename "$ATOM_APP")"
105    fi
106  
107    if [ ! -z "${ATOM_APP_NAME}" ]; then
108      # If ATOM_APP_NAME is known, use it as the executable name
109      ATOM_EXECUTABLE_NAME="${ATOM_APP_NAME%.*}"
110    else
111      # Else choose it from the inferred channel name
112      if [ "$CHANNEL" == 'beta' ]; then
113        ATOM_EXECUTABLE_NAME="Atom Beta"
114      elif [ "$CHANNEL" == 'nightly' ]; then
115        ATOM_EXECUTABLE_NAME="Atom Nightly"
116      elif [ "$CHANNEL" == 'dev' ]; then
117        ATOM_EXECUTABLE_NAME="Atom Dev"
118      else
119        ATOM_EXECUTABLE_NAME="Atom"
120      fi
121    fi
122  
123    if [ -z "${ATOM_PATH}" ]; then
124      # If ATOM_PATH isn't set, check /Applications and then ~/Applications for Atom.app
125      if [ -x "/Applications/$ATOM_APP_NAME" ]; then
126        ATOM_PATH="/Applications"
127      elif [ -x "$HOME/Applications/$ATOM_APP_NAME" ]; then
128        ATOM_PATH="$HOME/Applications"
129      else
130        # We haven't found an Atom.app, use spotlight to search for Atom
131        ATOM_PATH="$(mdfind "kMDItemCFBundleIdentifier == 'com.github.atom'" | grep -v ShipIt | head -1 | xargs -0 dirname)"
132  
133        # Exit if Atom can't be found
134        if [ ! -x "$ATOM_PATH/$ATOM_APP_NAME" ]; then
135          echo "Cannot locate ${ATOM_APP_NAME}, it is usually located in /Applications. Set the ATOM_PATH environment variable to the directory containing ${ATOM_APP_NAME}."
136          exit 1
137        fi
138      fi
139    fi
140  
141    if [ $EXPECT_OUTPUT ]; then
142      "$ATOM_PATH/$ATOM_APP_NAME/Contents/MacOS/$ATOM_EXECUTABLE_NAME" --executed-from="$(pwd)" --pid=$$ "$@"
143      ATOM_EXIT=$?
144      if [ ${ATOM_EXIT} -eq 0 ] && [ -n "${EXIT_CODE_OVERRIDE}" ]; then
145        exit "${EXIT_CODE_OVERRIDE}"
146      else
147        exit ${ATOM_EXIT}
148      fi
149    else
150      open -a "$ATOM_PATH/$ATOM_APP_NAME" -n --args --executed-from="$(pwd)" --pid=$$ --path-environment="$PATH" "$@"
151    fi
152  elif [ $OS == 'Linux' ]; then
153    SCRIPT=$(readlink -f "$0")
154    USR_DIRECTORY=$(readlink -f $(dirname $SCRIPT)/..)
155  
156    case $CHANNEL in
157      beta)
158        ATOM_PATH="$USR_DIRECTORY/share/atom-beta/atom"
159        ;;
160      nightly)
161        ATOM_PATH="$USR_DIRECTORY/share/atom-nightly/atom"
162        ;;
163      dev)
164        ATOM_PATH="$USR_DIRECTORY/share/atom-dev/atom"
165        ;;
166      *)
167        ATOM_PATH="$USR_DIRECTORY/share/atom/atom"
168        ;;
169    esac
170  
171    : ${TMPDIR:=/tmp}
172  
173    [ -x "$ATOM_PATH" ] || ATOM_PATH="$TMPDIR/atom-build/Atom/atom"
174  
175    if [ $EXPECT_OUTPUT ]; then
176      "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@"
177      ATOM_EXIT=$?
178      if [ ${ATOM_EXIT} -eq 0 ] && [ -n "${EXIT_CODE_OVERRIDE}" ]; then
179        exit "${EXIT_CODE_OVERRIDE}"
180      else
181        exit ${ATOM_EXIT}
182      fi
183    else
184      (
185      nohup "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@" > "$ATOM_HOME/nohup.out" 2>&1
186      if [ $? -ne 0 ]; then
187        cat "$ATOM_HOME/nohup.out"
188        exit $?
189      fi
190      ) &
191    fi
192  fi
193  
194  # Exits this process when Atom is used as $EDITOR
195  on_die() {
196    exit 0
197  }
198  trap 'on_die' SIGQUIT SIGTERM
199  
200  # If the wait flag is set, don't exit this process until Atom kills it.
201  if [ $WAIT ]; then
202    WAIT_FIFO="$ATOM_HOME/.wait_fifo"
203  
204    if [ ! -p "$WAIT_FIFO" ]; then
205      rm -f "$WAIT_FIFO"
206      mkfifo "$WAIT_FIFO"
207    fi
208  
209    # Block endlessly by reading from a named pipe.
210    exec 2>/dev/null
211    read < "$WAIT_FIFO"
212  
213    # If the read completes for some reason, fall back to sleeping in a loop.
214    while true; do
215      sleep 1
216    done
217  fi