#!/usr/bin/env bash # Copyright 2015 The Chromium 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 git extension converts a chromium commit number to its git commit hash. # It accepts the following input formats: # # $ git crrev-parse Cr-Commit-Position: refs/heads/master@{#311769} # $ git crrev-parse ' Cr-Commit-Position: refs/heads/master@{#311769}' # $ git crrev-parse 'Cr-Commit-Position: refs/heads/master@{#311769}' # $ git crrev-parse refs/heads/master@{#311769} # # It also works for branches (assuming you have branches in your local # checkout): # # $ git crrev-parse refs/branch-heads/2278@{#2} # # If you don't specify a branch, refs/heads/master is assumed: # # $ git crrev-parse @{#311769} # $ git crrev-parse 311769 # Developer note: this script makes heavy use of prefix/suffix/pattern # substitution for bash variables. Refer to the "Parameter Expansion" # section of the man page for bash. while [ -n "$1" ]; do if [[ "$1" = "Cr-Commit-Position:" ]] && [[ "$2" =~ .*@\{#[0-9][0-9]*\} ]]; then commit_pos="$2" shift else commit_pos="${1#*Cr-Commit-Position: }" fi ref="${commit_pos%@\{#*\}}" if [ "$ref" = "$commit_pos" -o -z "$ref" ]; then ref="refs/heads/master" fi remote_ref="${ref/refs\/heads/refs\/remotes\/origin}" remote_ref="${remote_ref/refs\/branch-heads/refs\/remotes\/branch-heads}" remote_ref="${remote_ref//\\}" num="${commit_pos#*@\{\#}" num="${num%\}}" if [ -z "$ref" -o -z "$num" ]; then git rev-parse "$1" else grep_str="^Cr-Commit-Position: $ref@{#$num}" git rev-list -n 1 --grep="$grep_str" "$remote_ref" fi shift done