From bd5494f90661c8c52b0bfc57d250ddb40d915022 Mon Sep 17 00:00:00 2001
From: "Antoine R. Dumont (@ardumont)" <antoine.romain.dumont@gmail.com>
Date: Tue, 22 Mar 2016 15:21:48 +0100
Subject: [PATCH] Add README-dev.md which explicits the sha1 computations

---
 README-dev.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)
 create mode 100644 README-dev.md

diff --git a/README-dev.md b/README-dev.md
new file mode 100644
index 00000000..aeae180f
--- /dev/null
+++ b/README-dev.md
@@ -0,0 +1,66 @@
+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
+
+### 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
-- 
GitLab