Skip to content

Instantly share code, notes, and snippets.

@hborders
Last active January 7, 2023 13:56
Show Gist options
  • Save hborders/87eecb5874169f76cfacb26dc4223575 to your computer and use it in GitHub Desktop.
Save hborders/87eecb5874169f76cfacb26dc4223575 to your computer and use it in GitHub Desktop.
Print the given git hash + a prepended "1" in decimal form
#!/bin/bash -euo pipefail
if [ ${#} -eq 0 ]
then
# read from STDIN
MAYBE_GIT_HASH=$( cat )
else
MAYBE_GIT_HASH="${1}"
fi
LEGAL_GIT_HASH_CHARACTERS="0123456789ABCDEFabcdef"
# grep regex doesn't allow + metacharacter :(
HASH_GREP_REGEX='^['"${LEGAL_GIT_HASH_CHARACTERS}"']['"${LEGAL_GIT_HASH_CHARACTERS}"']*$'
GIT_HASH=$( echo "${MAYBE_GIT_HASH}" | grep "${HASH_GREP_REGEX}" ) || {
echo "\"${MAYBE_GIT_HASH}\" doesnt look like a git hash. A git hash should have only: \"${LEGAL_GIT_HASH_CHARACTERS}\"" >&2
exit 1
}
# We must prefix the git hash with a 1
# If it starts with a zero, when we decimalize it,
# and later hexify it, we'll lose the zero.
ONE_PREFIXED_GIT_HASH=1"${GIT_HASH}"
# bc requires hex to be uppercase because
# lowercase letters are reserved for bc variables
UPPERCASE_ONE_PREFIXED_GIT_HASH=$( echo "${ONE_PREFIXED_GIT_HASH}" | tr "[:lower:]" "[:upper:]" )
# convert to decimal
# See "with bc": http://stackoverflow.com/a/13280173/9636
echo "ibase=16;obase=A;${UPPERCASE_ONE_PREFIXED_GIT_HASH}" | bc
@andrewvmail
Copy link

didnt realize its just hex to dec conversion, got it echo "obase=16; 348379070" | bc

@thirdwheel
Copy link

thirdwheel commented Aug 5, 2019

@thirdwheel how do you reverse the process?

@andrewvmail sorry for the late reply, see below.

$ printf "%d" 0xd3ac43f
221955135
$ printf "0x%x" 221955135
0xd3ac43f

@andrewvmail
Copy link

andrewvmail commented Aug 6, 2019 via email

@rogerluan
Copy link

Very interesting, @andrewvmail! Thanks for the alternative and way cleaner way to do this.

One single caveat about your technique is that that method can't decimalize the whole hash, only the short (7-char) ones. But I think we're all using only the hash prefix, so it's not a big deal 😁

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment