atom.sh 5.3 KB

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