Skip to content

Commit

Permalink
Merge branch 'kh/svn' into next
Browse files Browse the repository at this point in the history
* kh/svn:
  git-svnimport: Don't assume that copied files haven't changed
  Add Documentation/technical/pack-format.txt
  Added Packing Heursitics IRC writeup.
  Add documentation for git-imap-send.
  • Loading branch information
Junio C Hamano committed Apr 7, 2006
2 parents 2db70f6 + e67c662 commit 38b525e
Show file tree
Hide file tree
Showing 4 changed files with 647 additions and 5 deletions.
60 changes: 60 additions & 0 deletions Documentation/git-imap-send.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
git-imap-send(1)
================

NAME
----
git-imap-send - Dump a mailbox from stdin into an imap folder


SYNOPSIS
--------
'git-imap-send'


DESCRIPTION
-----------
This command uploads a mailbox generated with git-format-patch
into an imap drafts folder. This allows patches to be sent as
other email is sent with mail clients that cannot read mailbox
files directly.

Typical usage is something like:

git-format-patch --signoff --stdout --attach origin | git-imap-send


CONFIGURATION
-------------

git-imap-send requires the following values in the repository
configuration file (shown with examples):

[imap]
Folder = "INBOX.Drafts"

[imap]
Tunnel = "ssh -q user@server.com /usr/bin/imapd ./Maildir 2> /dev/null"

[imap]
Host = imap.server.com
User = bob
Password = pwd
Port = 143


BUGS
----
Doesn't handle lines starting with "From " in the message body.


Author
------
Derived from isync 1.0.1 by Mike McCormack.

Documentation
--------------
Documentation by Mike McCormack

GIT
---
Part of the gitlink:git[7] suite
111 changes: 111 additions & 0 deletions Documentation/technical/pack-format.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
GIT pack format
===============

= pack-*.pack file has the following format:

- The header appears at the beginning and consists of the following:

4-byte signature
4-byte version number (network byte order)
4-byte number of objects contained in the pack (network byte order)

Observation: we cannot have more than 4G versions ;-) and
more than 4G objects in a pack.

- The header is followed by number of object entries, each of
which looks like this:

(undeltified representation)
n-byte type and length (4-bit type, (n-1)*7+4-bit length)
compressed data

(deltified representation)
n-byte type and length (4-bit type, (n-1)*7+4-bit length)
20-byte base object name
compressed delta data

Observation: length of each object is encoded in a variable
length format and is not constrained to 32-bit or anything.

- The trailer records 20-byte SHA1 checksum of all of the above.

= pack-*.idx file has the following format:

- The header consists of 256 4-byte network byte order
integers. N-th entry of this table records the number of
objects in the corresponding pack, the first byte of whose
object name are smaller than N. This is called the
'first-level fan-out' table.

Observation: we would need to extend this to an array of
8-byte integers to go beyond 4G objects per pack, but it is
not strictly necessary.

- The header is followed by sorted 28-byte entries, one entry
per object in the pack. Each entry is:

4-byte network byte order integer, recording where the
object is stored in the packfile as the offset from the
beginning.

20-byte object name.

Observation: we would definitely need to extend this to
8-byte integer plus 20-byte object name to handle a packfile
that is larger than 4GB.

- The file is concluded with a trailer:

A copy of the 20-byte SHA1 checksum at the end of
corresponding packfile.

20-byte SHA1-checksum of all of the above.

Pack Idx file:

idx
+--------------------------------+
| fanout[0] = 2 |-.
+--------------------------------+ |
| fanout[1] | |
+--------------------------------+ |
| fanout[2] | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| fanout[255] | |
+--------------------------------+ |
main | offset | |
index | object name 00XXXXXXXXXXXXXXXX | |
table +--------------------------------+ |
| offset | |
| object name 00XXXXXXXXXXXXXXXX | |
+--------------------------------+ |
.-| offset |<+
| | object name 01XXXXXXXXXXXXXXXX |
| +--------------------------------+
| | offset |
| | object name 01XXXXXXXXXXXXXXXX |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | offset |
| | object name FFXXXXXXXXXXXXXXXX |
| +--------------------------------+
trailer | | packfile checksum |
| +--------------------------------+
| | idxfile checksum |
| +--------------------------------+
.-------.
|
Pack file entry: <+

packed object header:
1-byte type (upper 4-bit)
size0 (lower 4-bit)
n-byte sizeN (as long as MSB is set, each 7-bit)
size0..sizeN form 4+7+7+..+7 bit integer, size0
is the most significant part.
packed object data:
If it is not DELTA, then deflated bytes (the size above
is the size before compression).
If it is DELTA, then
20-byte base object name SHA1 (the size above is the
size of the delta data that follows).
delta data, deflated.
Loading

0 comments on commit 38b525e

Please sign in to comment.