mirror of
https://github.com/go-gitea/gitea.git
synced 2024-12-23 23:18:10 +08:00
35 lines
1.4 KiB
Go
35 lines
1.4 KiB
Go
|
/*
|
||
|
Package merkletrie provides support for n-ary trees that are at the same
|
||
|
time Merkle trees and Radix trees (tries).
|
||
|
|
||
|
Git trees are Radix n-ary trees in virtue of the names of their
|
||
|
tree entries. At the same time, git trees are Merkle trees thanks to
|
||
|
their hashes.
|
||
|
|
||
|
This package defines Merkle tries as nodes that should have:
|
||
|
|
||
|
- a hash: the Merkle part of the Merkle trie
|
||
|
|
||
|
- a key: the Radix part of the Merkle trie
|
||
|
|
||
|
The Merkle hash condition is not enforced by this package though. This
|
||
|
means that the hash of a node doesn't have to take into account the hashes of
|
||
|
their children, which is good for testing purposes.
|
||
|
|
||
|
Nodes in the Merkle trie are abstracted by the Noder interface. The
|
||
|
intended use is that git trees implements this interface, either
|
||
|
directly or using a simple wrapper.
|
||
|
|
||
|
This package provides an iterator for merkletries that can skip whole
|
||
|
directory-like noders and an efficient merkletrie comparison algorithm.
|
||
|
|
||
|
When comparing git trees, the simple approach of alphabetically sorting
|
||
|
their elements and comparing the resulting lists is too slow as it
|
||
|
depends linearly on the number of files in the trees: When a directory
|
||
|
has lots of files but none of them has been modified, this approach is
|
||
|
very expensive. We can do better by prunning whole directories that
|
||
|
have not change, just by looking at their hashes. This package provides
|
||
|
the tools to do exactly that.
|
||
|
*/
|
||
|
package merkletrie
|