https://github.com/SoftwareHeritage/swh-model
Revision 8aa5c3aa6cbdca08b165e8a7ce5b7aa3c2664d43 authored by Nicolas Dandrimont on 12 July 2017, 14:12:12 UTC, committed by Nicolas Dandrimont on 12 July 2017, 14:12:35 UTC
Summary: for those people with legacy openssls

Reviewers: anlambert, #reviewers!

Differential Revision: https://forge.softwareheritage.org/D224
1 parent 11de644
Raw File
Tip revision: 8aa5c3aa6cbdca08b165e8a7ce5b7aa3c2664d43 authored by Nicolas Dandrimont on 12 July 2017, 14:12:12 UTC
Load pyblake2 dynamically instead of hardcoding the Python version
Tip revision: 8aa5c3a
README-dev.md
Git sha1 computation
--------------------

Document to describe how the git sha1 computation takes place.

### commit/revision

sha1 git commit/revision computation:

    commit `size`\0
    tree `sha1-git-tree-and-subtree-in-plain-hex-string`
    ([parent `commit-parent-n`])
    author `name` <`email`> `date-ts` `date-offset`
    committer `name` <`email`> `date-ts` `date-offset`
    ([extra-header-key-n extra-header-value-n])

    `commit-message`
    (inline-gpg-signature)


Notes:
- [] denotes list of entries (one per line)
- () denotes optional entry. For example, the parent entry is optional.
- empty line at the end of the commit message
- timestamp example: 1444054085
- date offset for example: +0200, -0100

sources:
- commit_tree_extended: https://github.com/git/git/blob/8d530c4d64ffcc853889f7b385f554d53db375ed/commit.c#L1522
- commit_tree: https://github.com/git/git/blob/8d530c4d64ffcc853889f7b385f554d53db375ed/commit.c#L1392

Examples:

```sh
$ cat commit.txt
tree 85a74718d377195e1efd0843ba4f3260bad4fe07
parent 01e2d0627a9a6edb24c37db45db5ecb31e9de808
author Linus Torvalds <torvalds@linux-foundation.org> 1436739030 -0700
committer Linus Torvalds <torvalds@linux-foundation.org> 1436739030 -0700
svn-repo-uuid 046f1af7-66c2-d61b-5410-ce57b7db7bff
svn-revision 10

Linux 4.2-rc2
```

```
$ cat commit.txt | git hash-object -t commit --stdin
010d34f384fa99d047cdd5e2f41e56e5c2feee45
```

commit: 44cc742a8ca17b9c279be4cc195a93a6ef7a320e
```
$ git cat-file -p 44cc742a8ca17b9c279be4cc195a93a6ef7a320e
...
tree b134f9b7dc434f593c0bab696345548b37de0558
parent 689664ae944b4692724f13b709a4e4de28b54e57
parent c888305e1efbaa252d01b4e5e6b778f865a97514
author Jiang Xin <worldhello.net@gmail.com> 1428538899 +0800
committer Jiang Xin <worldhello.net@gmail.com> 1428538899 +0800
gpgsig -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.13 (Darwin)

 iQIcBAABAgAGBQJVJcYsAAoJEBiY3kIkQRNJVAUQAJ8/XQIfMqqC5oYeEFfHOPYZ
 L7qy46bXHVBa9Qd8zAJ2Dou3IbI2ZoF6/Et89K/UggOycMlt5FKV/9toWyuZv4Po
 L682wonoxX99qvVTHo6+wtnmYO7+G0f82h+qHMErxjP+I6gzRNBvRr+SfY7VlGdK
 wikMKOMWC5smrScSHITnOq1Ews5pe3N7qDYMzK0XVZmgDoaem4RSWMJs4My/qVLN
 e0CqYWq2A22GX7sXl6pjneJYQvcAXUX+CAzp24QnPSb+Q22Guj91TcxLFcHCTDdn
 qgqMsEyMiisoglwrCbO+D+1xq9mjN9tNFWP66SQ48mrrHYTBV5sz9eJyDfroJaLP
 CWgbDTgq6GzRMehHT3hXfYS5NNatjnhkNISXR7pnVP/obIi/vpWh5ll6Gd8q26z+
 a/O41UzOaLTeNI365MWT4/cnXohVLRG7iVJbAbCxoQmEgsYMRc/pBAzWJtLfcB2G
 jdTswYL6+MUdL8sB9pZ82D+BP/YAdHe69CyTu1lk9RT2pYtI/kkfjHubXBCYEJSG
 +VGllBbYG6idQJpyrOYNRJyrDi9yvDJ2W+S0iQrlZrxzGBVGTB/y65S8C+2WTBcE
 lf1Qb5GDsQrZWgD+jtWTywOYHtCBwyCKSAXxSARMbNPeak9WPlcW/Jmu+fUcMe2x
 dg1KdHOa34shrKDaOVzW
 =od6m
 -----END PGP SIGNATURE-----

Merge branch 'master' of git://github.com/alexhenrie/git-po

* 'master' of git://github.com/alexhenrie/git-po:
  l10n: ca.po: update translation
```

### directory/tree

sha1 git directory/tree computation:

    tree `tree-size`\0
    <file-perm> <file-name>\0<file-sha1-in-20-bytes-string>...<dir-perm> <dir-name>\0<dir-sha1-in-20-bytes-string>...


Notes:
- no newline separator between tree entries
- no empty newline at the end of the tree entries
- tree content header size is the length of the content
- The tree entries are ordered according to bytes in their <name> properties.

Note: Tree entries referencing trees are sorted as if their name have a trailing /
at their end.

Possible permissions are:
- 100644 - file
- 40000  - directory
- 100755 - executable file
- 120000 - symbolink link
- 160000 - git link (relative to submodule)

### content/file

sha1 git content computation:

    blob `blob-size`\0
    `blob-content`

Notes:
- no newline at the end of the blob content

Compress with DEFLATE and compute sha1
back to top