Hacker News new | ask | show | jobs
Gitlab Gitaly project now supports the SHA-256 hashing algorithm (about.gitlab.com)
23 points by nayak 1029 days ago
2 comments

They have a common beginner's mistake in their example usage of sha256sum. Nothing that would affect the git usage, to be fair... unless they have related tooling that does this.

    > echo "please hash this data" | sha256sum
    f2ccc47bcb79799071eab33aa4311e6764769681bb9052ae444cb6e2d87427c8  -
This sum is not the sum of "please hash this data" but instead it is the sum of "please hash this data\n" where "\n" represents not a literal backslash and n, but a newline character. The unwanted newline is supplied by the echo command, obviously.

The proper way to have done this example (edit: on BSD, macOS, etc.) would be:

    > echo -n "please hash this data" | sha256sum
    62f73749b40cc70f453320e1ffc37e405ba50474b5db68ad436e64b61fbb8cf0  -
And then we would see the actual sha256sum for the example data used.

Edit: Forget this, an even better way is posted by others below! Thanks!

best to avoid echo in the first place:

    printf '%s' "my string" | sha256sum
Hope you don't mind, but I opened up an MR to update the page with your code suggestion

https://gitlab.com/gitlab-com/www-gitlab-com/-/merge_request...

Thanks, merged.
Can you expand on why?
Because `echo -n` is a BSD-ism that's not supported on System V derivatives¹. It's perfectly legitimate for:

    echo -n "please hash this data"
...to output the bytes "-n please hash this data\n", which is even more misleading than the extra newline echo outputs normally.

¹: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/e...

     The newline may also be suppressed by appending `\c' to the end of the
     string, as is done by iBCS2 compatible systems.  Note that the -n option
     as well as the effect of `\c' are implementation-defined in IEEE Std
     1003.1-2001 ("POSIX.1") as amended by Cor. 1-2002.  For portability, echo
     should only be used if the first argument does not start with a hyphen
     (`-') and does not contain any backslashes (`\'). If this is not suffi-
     cient, printf(1) should be used.
* https://man.freebsd.org/cgi/man.cgi?query=echo

     \c      Suppress the <newline> that otherwise follows
             the final argument in the output. All
             characters following the '\c' in the arguments
             shall be ignored.
* https://man7.org/linux/man-pages/man1/echo.1p.html
Thanks for mentioning that! I learned something.
Because if you get in the habit of using printf instead of echo you can avoid having to remember to strip the newline when it matters and only add it when you need it. Though obviously echo is simpler to use for 95% of situations.
With the formated parameters '%s' it's instantly visible that there is no new line.
Clicking through to https://gitlab.com/gitlab-org/gitaly yields

> Gitaly is a Git RPC service for handling all the git calls made by GitLab

So I think this means that a major piece of gitlab now supports sha256 git repos? But probably not everything and therefore we can't actually push sha256 git repos to gitlab yet?

Yeah, Gitaly is GitLab's approach to scaling up the actual Git operations. It's certainly a major part of the equation, but the article suggests the Rails app still has a bit of work to go before it's possible to use SHA256 repos.
The answer to your question is in the first sentence of the article.
Ah, now that I reread it, yes it does say

> While there is still some work we need to do in other parts of the GitLab application before SHA-256 repositories can be used, this milestone is important.

Somehow I managed to skim over and miss that; I was expecting a "what this means for gitlab" or "next steps" section.