| #!/bin/sh |
| # Copyright 2025 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # This script unstages submodules prior to commiting, but only if the current |
| # repository is fuchsia.git. |
| # |
| # fuchsia.git is the only repository that has submodules that shouldn't be |
| # updated manually. Its submodules only exist for the purpose of Code Search and |
| # are never initialized locally, but may still incidentally be `git add`ed |
| # because Git recognizes them as "old-form" submodules. |
| |
| set -euf |
| |
| # Provide a safety hatch in case the user really does intend to commit |
| # submodules, or the unstaging logic happens to be buggy. |
| if [ -n "${FUCHSIA_DONT_UNSTAGE_SUBMODULES:-}" ]; then |
| exit 0 |
| fi |
| |
| # Get the remote, but don't fail if for some reason there's no remote named |
| # "origin". |
| remote="$(git remote get-url origin 2>/dev/null || echo "no remote")" |
| |
| # Exit early if the repository is not fuchsia.git. |
| case "$remote" in |
| */fuchsia) ;; |
| *) exit 0 ;; |
| esac |
| |
| staged_submodules="$( |
| git submodule status | |
| awk '{ print $2 }' | |
| # We have to use `git status` rather than `git diff` since `git diff` |
| # excludes submodules that have `ignore = all` in .gitmodules. |
| xargs git status --porcelain | |
| # "M" as the first character indicates a staged modified file. Remove the "M" |
| # prefix and any subsequent whitespace before the filename. The combination of |
| # `-n` and `/p` causes sed to only print matching lines. |
| sed -n '/^M/s/^M\s*//p' |
| )" |
| |
| repo_root="$(git rev-parse --show-toplevel)" |
| |
| submodule_count=0 |
| last_submodule= |
| |
| IFS=' |
| ' |
| for file in $staged_submodules; do |
| # Unstage the submodule, but don't change its checked-out revision. |
| git reset --quiet HEAD -- "${repo_root}/${file}" |
| submodule_count=$((submodule_count+1)) |
| last_submodule="$file" |
| done |
| |
| if [ $submodule_count -eq 1 ]; then |
| echo "info: unstaged submodule ${last_submodule} (see https://fxbug.dev/290956668)" |
| elif [ $submodule_count -gt 1 ]; then |
| echo "info: unstaged ${submodule_count} submodules (see https://fxbug.dev/290956668)" |
| fi |