Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/scripts/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 5 kB image not shown  

Quelle  git-resolve.sh   Sprache: Shell

 
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# (c) 2025, Sasha Levin <sashal@kernel.org>

usage() {
 echo "Usage: $(basename "$0") [--selftest] [--force] [commit-subject]"
 echo "Resolves a short git commit ID to its full SHA-1 hash, particularly useful for fixing references in commit messages."
 echo ""
 echo "Arguments:"
 echo " --selftest Run self-tests"
 echo " --force Try to find commit by subject if ID lookup fails"
 echo " commit-id Short git commit ID to resolve"
 echo " commit-subject Optional commit subject to help resolve between multiple matches"
 exit 1
}

# Convert subject with ellipsis to grep pattern
convert_to_grep_pattern() {
 local subject="$1"
 # First escape ALL regex special characters
 local escaped_subject
 escaped_subject=$(printf '%s\n' "$subject" | sed 's/[[\.*^$()+?{}|]/\\&/g')
 # Also escape colons, parentheses, and hyphens as they are special in our context
 escaped_subject=$(echo "$escaped_subject" | sed 's/[:-]/\\&/g')
 # Then convert escaped ... sequence to .*?
 escaped_subject=$(echo "$escaped_subject" | sed 's/\\\.\\\.\\\./.*?/g')
 echo "^${escaped_subject}$"
}

git_resolve_commit() {
 local force=0
 if [ "$1" = "--force" ]; then
  force=1
  shift
 fi

 # Split input into commit ID and subject
 local input="$*"
 local commit_id="${input%% *}"
 local subject=""

 # Extract subject if present (everything after the first space)
 if [[ "$input" == *" "* ]]; then
  subject="${input#* }"
  # Strip the ("...") quotes if present
  subject="${subject#*(\"}"
  subject="${subject%\")*}"
 fi

 # Get all possible matching commit IDs
 local matches
 readarray -t matches < <(git rev-parse --disambiguate="$commit_id" 2>/dev/null)

 # Return immediately if we have exactly one match
 if [ ${#matches[@]} -eq 1 ]; then
  echo "${matches[0]}"
  return 0
 fi

 # If no matches and not in force mode, return failure
 if [ ${#matches[@]} -eq 0 ] && [ $force -eq 0 ]; then
  return 1
 fi

 # If we have a subject, try to find a match with that subject
 if [ -n "$subject" ]; then
  # Convert subject with possible ellipsis to grep pattern
  local grep_pattern
  grep_pattern=$(convert_to_grep_pattern "$subject")

  # In force mode with no ID matches, use git log --grep directly
  if [ ${#matches[@]} -eq 0 ] && [ $force -eq 1 ]; then
   # Use git log to search, but filter to ensure subject matches exactly
   local match
   match=$(git log --format="%H %s" --grep="$grep_pattern" --perl-regexp -10 | \
     while read -r hash subject; do
      if echo "$subject" | grep -qP "$grep_pattern"then
       echo "$hash"
       break
      fi
     done)
   if [ -n "$match" ]; then
    echo "$match"
    return 0
   fi
  else
   # Normal subject matching for existing matches
   for match in "${matches[@]}"do
    if git log -1 --format="%s" "$match" | grep -qP "$grep_pattern"then
     echo "$match"
     return 0
    fi
   done
  fi
 fi

 # No match found
 return 1
}

run_selftest() {
 local test_cases=(
  '00250b5 ("MAINTAINERS: add new Rockchip SoC list")'
  '0037727 ("KVM: selftests: Convert xen_shinfo_test away from VCPU_ID")'
  'ffef737 ("net/tls: Fix skb memory leak when running kTLS traffic")'
  'd3d7 ("cifs: Improve guard for excluding $LXDEV xattr")'
  'dbef ("Rename .data.once to .data..once to fix resetting WARN*_ONCE")'
  '12345678'  # Non-existent commit
  '12345 ("I'\''m a dummy commit")' # Valid prefix but wrong subject
  '--force 99999999 ("net/tls: Fix skb memory leak when running kTLS traffic")'  # Force mode with non-existent ID but valid subject
  '83be ("firmware: ... auto-update: fix poll_complete() ... errors")'  # Wildcard test
  '--force 999999999999 ("firmware: ... auto-update: fix poll_complete() ... errors")'  # Force mode wildcard test
 )

 local expected=(
  "00250b529313d6262bb0ebbd6bdf0a88c809f6f0"
  "0037727b3989c3fe1929c89a9a1dfe289ad86f58"
  "ffef737fd0372ca462b5be3e7a592a8929a82752"
  "d3d797e326533794c3f707ce1761da7a8895458c"
  "dbefa1f31a91670c9e7dac9b559625336206466f"
  ""  # Expect empty output for non-existent commit
  ""  # Expect empty output for wrong subject
  "ffef737fd0372ca462b5be3e7a592a8929a82752"  # Should find commit by subject in force mode
  "83beece5aff75879bdfc6df8ba84ea88fd93050e"  # Wildcard test
  "83beece5aff75879bdfc6df8ba84ea88fd93050e"  # Force mode wildcard test
 )

 local expected_exit_codes=(
  0
  0
  0
  0
  0
  1  # Expect failure for non-existent commit
  1  # Expect failure for wrong subject
  0  # Should succeed in force mode
  0  # Should succeed with wildcard
  0  # Should succeed with force mode and wildcard
 )

 local failed=0

 echo "Running self-tests..."
 for i in "${!test_cases[@]}"do
  # Capture both output and exit code
  local result
  result=$(git_resolve_commit ${test_cases[$i]})  # Removed quotes to allow --force to be parsed
  local exit_code=$?

  # Check both output and exit code
  if [ "$result" != "${expected[$i]}" ] || [ $exit_code != ${expected_exit_codes[$i]} ]; then
   echo "Test case $((i+1)) FAILED"
   echo "Input: ${test_cases[$i]}"
   echo "Expected output: '${expected[$i]}'"
   echo "Got output: '$result'"
   echo "Expected exit code: ${expected_exit_codes[$i]}"
   echo "Got exit code: $exit_code"
   failed=1
  else
   echo "Test case $((i+1)) PASSED"
  fi
 done

 if [ $failed -eq 0 ]; then
  echo "All tests passed!"
  exit 0
 else
  echo "Some tests failed!"
  exit 1
 fi
}

# Check for selftest
if [ "$1" = "--selftest" ]; then
 run_selftest
 exit $?
fi

# Handle --force flag
force=""
if [ "$1" = "--force" ]; then
 force="--force"
 shift
fi

# Verify arguments
if [ $# -eq 0 ]; then
 usage
fi

# Skip validation in force mode
if [ -z "$force" ]; then
 # Validate that the first argument matches at least one git commit
 if [ "$(git rev-parse --disambiguate="$1" 2>/dev/null | wc -l)" -eq 0 ]; then
  echo "Error: '$1' does not match any git commit"
  exit 1
 fi
fi

git_resolve_commit $force "$@"
exit $?

93%


¤ Dauer der Verarbeitung: 0.30 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.