|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +set -e |
| 4 | + |
| 5 | +# NOTES |
| 6 | +# `install.sh` |
| 7 | +# - moves `.azd` to `.~azd-old` if it exists |
| 8 | +# - creates symlink from `~/.azd` to the mounted volume |
| 9 | +# |
| 10 | +# `oncreate.sh` |
| 11 | +# - if the old `.azd/extensions` folder exists |
| 12 | +# - and is symlinked to the same location then exit (success) |
| 13 | +# - and is symlinked to a different location then fail (unexpected/unplanned state) |
| 14 | +# - and not a symlink then copy extensions from the old folder to the new location, adding marker files to copied extensions. Additionally clean up any extensions with the marker file that no longer exist in the source folder (i.e. extensions that the user has removed but we previously copied). |
| 15 | +# - if the old `.azd/extensions` folder does not exist then check if the new `.azd/extensions` folder is a symlink to the old location and if so, remove the symlink |
| 16 | + |
| 17 | + |
| 18 | +FEATURE_DIR="/usr/local/share/stuartleeks-devcontainer-features/azd-cli-persistence" |
| 19 | +LOG_FILE="$FEATURE_DIR/log.txt" |
| 20 | + |
| 21 | +log() { |
| 22 | + echo "$1" |
| 23 | + echo "$1" >> "$LOG_FILE" |
| 24 | +} |
| 25 | + |
| 26 | +if command -v sudo > /dev/null; then |
| 27 | + sudo chown -R "$(id -u):$(id -g)" "$LOG_FILE" |
| 28 | +else |
| 29 | + chown -R "$(id -u):$(id -g)" "$LOG_FILE" |
| 30 | +fi |
| 31 | + |
| 32 | +log "In OnCreate script" |
| 33 | +# check if marker file exists to avoid re-running oncreate script actions |
| 34 | +if [ -f "$HOME/.stuartleeks/azd-cli-persistence-oncreate" ]; then |
| 35 | + log "Feature 'azd-cli-persistence' oncreate actions already run, skipping" |
| 36 | + exit 0 |
| 37 | +fi |
| 38 | + |
| 39 | + |
| 40 | +fix_permissions() { |
| 41 | + local dir |
| 42 | + dir="${1}" |
| 43 | + |
| 44 | + if [ ! -w "${dir}" ]; then |
| 45 | + echo "Fixing permissions of '${dir}'..." |
| 46 | + sudo chown -R "$(id -u):$(id -g)" "${dir}" |
| 47 | + echo "Done!" |
| 48 | + else |
| 49 | + echo "Permissions of '${dir}' are OK!" |
| 50 | + fi |
| 51 | +} |
| 52 | + |
| 53 | +fix_permissions "/dc/azure-dev" |
| 54 | + |
| 55 | +add_marker() { |
| 56 | + log "Adding marker file to indicate oncreate actions have been run" |
| 57 | + mkdir -p "$HOME/markers" |
| 58 | + if command -v sudo > /dev/null; then |
| 59 | + sudo touch "$FEATURE_DIR/markers/oncreate" |
| 60 | + else |
| 61 | + touch "$FEATURE_DIR/markers/oncreate" |
| 62 | + fi |
| 63 | +} |
| 64 | + |
| 65 | +merge_extensions() { |
| 66 | + local src_dir |
| 67 | + local dest_dir |
| 68 | + src_dir="${1}" |
| 69 | + dest_dir="${2}" |
| 70 | + log "Merging extensions from '${src_dir}' to '${dest_dir}'..." |
| 71 | + for extension in "${src_dir}"/*; do |
| 72 | + extension_name=$(basename "${extension}") |
| 73 | + if [ -d "${dest_dir}/${extension_name}" ]; then |
| 74 | + log " Extension '${extension_name}' already exists in destination - skipping" |
| 75 | + else |
| 76 | + log " Copying extension '${extension_name}' to destination" |
| 77 | + cp -R "${extension}" "${dest_dir}/" |
| 78 | + # Add a marker file to indicate that this extension was copied from the source folder |
| 79 | + touch "${dest_dir}/${extension_name}/.azd-cli-persistence-copied" |
| 80 | + fi |
| 81 | + done |
| 82 | + |
| 83 | + log "Checking for extensions that were copied previously but are no longer in the source folder..." |
| 84 | + for extension in "${dest_dir}"/*; do |
| 85 | + extension_name=$(basename "${extension}") |
| 86 | + if [ -f "${extension}/.azd-cli-persistence-copied" ]; then |
| 87 | + if [ ! -d "${src_dir}/${extension_name}" ]; then |
| 88 | + log " Extension '${extension_name}' was copied previously but is no longer in source - removing" |
| 89 | + rm -rf "${extension}" |
| 90 | + else |
| 91 | + log " Extension '${extension_name}' was copied but is still present in source - keeping" |
| 92 | + fi |
| 93 | + else |
| 94 | + log " Extension '${extension_name}' was not copied by azure-cli-persistence - keeping" |
| 95 | + fi |
| 96 | + done |
| 97 | +} |
| 98 | + |
| 99 | +# Fix up the extensions folder in case the user had an old .azd folder |
| 100 | +# that had extensions installed in it |
| 101 | + |
| 102 | +if [ -d "$HOME/.azd-old" ]; then |
| 103 | + got_old_azure_folder=true |
| 104 | +else |
| 105 | + got_old_azure_folder=false |
| 106 | +fi |
| 107 | + |
| 108 | + |
| 109 | +old_extensions_folder="$HOME/.azc-old/extensions" |
| 110 | +new_extensions_folder="$HOME/.azc/extensions" |
| 111 | +new_extensions_folder_parent="$HOME/.azc" |
| 112 | + |
| 113 | +if [ -d "$old_extensions_folder" ]; then |
| 114 | + log "extensions folder found in old .azd folder" |
| 115 | + if [ -d "$new_extensions_folder" ]; then |
| 116 | + if [ -L "$new_extensions_folder" ]; then |
| 117 | + symlink_target=$(readlink "$new_extensions_folder") |
| 118 | + if [ "$symlink_target" = "$old_extensions_folder" ]; then |
| 119 | + log "extensions folder ('$new_extensions_folder') already symlinked to '$old_extensions_folder' - no action needed" |
| 120 | + add_marker |
| 121 | + log "Done" |
| 122 | + exit 0 |
| 123 | + else |
| 124 | + log "extensions folder ('$new_extensions_folder') is a symlink, but points to a different location ('$symlink_target')" |
| 125 | + exit 1 |
| 126 | + fi |
| 127 | + else |
| 128 | + log "extensions folder ('$new_extensions_folder') already exists but is not a symlink" |
| 129 | + merge_extensions "$old_extensions_folder" "$new_extensions_folder" |
| 130 | + add_marker |
| 131 | + log "Done" |
| 132 | + exit 0 |
| 133 | + fi |
| 134 | + else |
| 135 | + log "extensions folder ('$new_extensions_folder') does not exist - creating symlink to '$old_extensions_folder'" |
| 136 | + log "Creating symlink..." |
| 137 | + if command -v sudo > /dev/null; then |
| 138 | + sudo ln -s "$old_extensions_folder" "$new_extensions_folder_parent" |
| 139 | + else |
| 140 | + ln -s "$old_extensions_folder" "$new_extensions_folder_parent" |
| 141 | + fi |
| 142 | + add_marker |
| 143 | + log "Done" |
| 144 | + exit 0 |
| 145 | + fi |
| 146 | +else |
| 147 | + log "No old .azd/extensions folder found" |
| 148 | + # If we haven't got an old .azd folder with a extensions folder in it, check if the new extensions folder is a symlink to the old one |
| 149 | + # And if so, remove the symlink |
| 150 | + # This can happen if the user has installed extensions before this feature runs |
| 151 | + if [ -L "$new_extensions_folder" ]; then |
| 152 | + symlink_target=$(readlink "$new_extensions_folder") |
| 153 | + if [ "$symlink_target" = "$old_extensions_folder" ]; then |
| 154 | + log "extensions folder ('$new_extensions_folder') is a symlink to '$old_extensions_folder' which doesn't exist- removing symlink" |
| 155 | + rm "$new_extensions_folder" |
| 156 | + fi |
| 157 | + fi |
| 158 | +fi |
| 159 | + |
| 160 | +add_marker |
| 161 | +log "Done" |
| 162 | + |
0 commit comments