Commit Graph

11896 Commits

Author SHA1 Message Date
Linus Torvalds
59f8c189a5 Fix racy-git handling in git-write-tree.
After git-write-tree finishes computing the tree, it updates the
index so that later operations can take advantage of fully
populated cache tree.

However, anybody writing the index file has to mark the entries
that are racily clean.  For each entry whose cached lstat(3)
data in the index exactly matches what is obtained from the
filesystem, if the timestamp on the index file was the same or
older than the modification timestamp of the file, the blob
contents and the work tree file, after convert_to_git(), need to
be compared, and if they are different, its index entry needs to
be marked not to match the lstat(3) data from the filesystem.

In order for this to work, convert_to_git() needs to work
correctly, which in turn means you need to read the config file
to get the settings of core.crlf and friends.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-09-03 23:48:53 +01:00
Johannes Schindelin
b9dcb2cbe5 Fix cpio for CR/LF line endings
Under certain circumstances (I did not find out the complete
details, but it happens when running the tests), the filterdirs()
function in cpio outputs CR/LF.  Since tar does not like that,
the command failed.

So strip out all CRs when filtering the directories.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-09-03 19:55:09 +01:00
Johannes Schindelin
7734ad404c MinGW: Convert CR/LF to LF in tag signatures
On Windows, gpg outputs CR/LF signatures.  But since the tag
messages are already stripped of the CR by stripspace(), it is
arguably nicer to do the same for the tag signature.  Actually,
this patch does not look for CR/LF, but strips all CRs
from the signature.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-09-03 17:45:31 +01:00
Johannes Schindelin
a19cff248e verify-tag: also grok CR/LFs in the tag signature
On some people's favorite platform, gpg outputs signatures
with CR/LF line endings.  So verify-tag has to play nice with
them.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-09-03 17:45:29 +01:00
Johannes Schindelin
685268d9a1 t5701: skip hardlink test
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-08-29 17:57:08 +01:00
Johannes Schindelin
5464a3f4b7 t5701: "wc -l" may add whitespace
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-08-29 17:43:02 +01:00
Johannes Schindelin
194c1dbb5a Provide git_exit() for MinGW
Apparently, MinGW's exit function has problems with negative
exit codes.  Substitute them by 1.

This fixes at least t1300, which failed because the exit code of
git-config with an invalid file was 0.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-08-29 14:28:48 +01:00
Marius Storm-Olsen
dd56555ea5 Add a trace to more easily show that the index has been smudged.
Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
2007-08-24 08:37:06 +02:00
Marius Storm-Olsen
ae3d370abf Add patch from Linus, to make write-tree read the configuration, in case it
datestamps are so close that it needs to ce_smudge_racily_clean_entry(),
thus read the content of the file and compare. The core.autocrlf value is
needed in this case.

Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
2007-08-24 08:36:30 +02:00
Johannes Schmidt-Ehrenberg
20e93f53e3 mergetool: fixed parsing of registry entry for kdiff3
The old code failed on Windows Vista. The output of
reg.exe or something else may be a bit different.
This patch improves the parsing code to be more robust.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
2007-08-18 03:27:45 -07:00
Mike Pape
331406ad30 Correct connect logic to allow for Windows C: paths.
We need to add logic for windows to allow C: and not assume the : means
it's another protocol.

Signed-off-by: Mike Pape <dotzenlabs@gmail.com>
2007-08-17 19:18:09 -04:00
Johannes Schindelin
94e7a6b7b4 Revert fa807fcb: 'Revert "Makefile: remove $foo when $foo.exe...'
It works in msysgit, so there is no reason why we should not remove the
scripted versions.  Especially since some tests were failing for the
sole reason that _not_ the builtin, but the script was executed.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-08-17 14:50:29 +02:00
Marius Storm-Olsen
a0b4827288 Revert "Correct logic from merge to fix t1020-subdirectory.sh."
This reverts commit 1a896a5900.

The patch had an adverse effect on fetching with the git+ssh
protocol, giving me the following errors

  Pseudo-terminal will not be allocated because stdin is not a terminal.
  ssh: <repo address>': no address associated with hostname.
  fatal: The remote end hung up unexpectedly
  Cannot get the repository state from git+ssh://<repo address>

and

  [0: 172.20.1.78]: errno=Invalid argument
  [1: 192.168.1.3]: errno=Bad file descriptor
  [2: 192.168.35.1]: errno=Bad file descriptor
  [3: 192.168.150.1]: errno=Bad file descriptor
  fatal: unable to connect a socket (Bad file descriptor)
  Cannot get the repository state from git://<repo address>

Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
2007-08-16 21:16:48 +02:00
Mike Pape
d1f83218dc Hardlinks are not supported in MSys so we disable them.
We do not want the default to be hardlinks for local clones and we show
a warning if the user tries to use -l.

Signed-off-by: Mike Pape <dotzenlabs@gmail.com>
2007-08-15 13:18:20 -04:00
Mike Pape
1a896a5900 Correct logic from merge to fix t1020-subdirectory.sh.
Some logic was lost from the merge from git.git.

Signed-off-by: Mike Pape <dotzenlabs@gmail.com>
2007-08-15 08:16:45 -04:00
Steffen Prohaska
65b356f555 mergetool: converting backslashes in kdiff3 path from Windows registry
Backslashes are converted to slashes right after the Windows
registry returned a path. This is needed to avoid problems
with shell expansion.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
2007-08-14 02:07:41 -07:00
Marius Storm-Olsen
56be985fe9 Avoid calling signal(SIGPIPE, ..) for MinGW builds.
SIGPIPE isn't supported in MinGW.

Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
2007-08-14 09:48:39 +02:00
Marius Storm-Olsen
88d775162b Merge branch 'git_git' into next
Conflicts:

	connect.c
	git-clone.sh
	t/t7004-tag.sh
2007-08-14 09:30:22 +02:00
Steffen Prohaska
3318ad905e mergetool: added support for kdiff3 on windows
kdiff3's homepage is http://kdiff3.sourceforge.net/.

kdiff3 is automatically added to the available
mergetools if its path is found in the Windows
Registry. The path is taken from the registry.

Be sure to set

    git config core.autocrlf true

because kdiff3 seems to follow Windows crlf convention.
2007-08-12 16:08:58 -07:00
Steffen Prohaska
fefe8db817 mergetool: refactored kdiff3 -> KDIFF3
Use shell variable KDIFF3 instead of kdiff3 to call
kdiff3. This will be used in detection of the absolute
absolute path.
2007-08-12 16:08:58 -07:00
Steffen Prohaska
57bab054a9 help (msysgit): teach git help to open html from /doc/git/html/
Html pages will be opened using the default Windows application
configured for html. This code path is taken for msysgit (mingw).

It is assumed that html pages are installed at /doc/git/html.
This needs to be ensured by the msysgit superproject to make this
patch useful. html pages should be cloned from git.git's main
repo. This is the easiest way to get up-to-date documentation,
without requiring the complete tool chain to generate them
locally.

If html pages are not yet there, you can use the following
commands to get them:

    mkdir -p /doc/git/html
    cd /doc/git/html/
    git init
    git config remote.origin.url git://git.kernel.org/pub/scm/git/git.git
    git config remote.origin.fetch refs/heads/html:refs/remotes/origin/html
    git fetch
    git checkout --track -b html origin/html

and update the html documentation with

    git pull

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
2007-08-12 16:08:57 -07:00
Dmitry Kakurin
89697a4c15 Issue 20: Fix all build warnings
Fixed all warnings. Code compiles cleanly now.

Full test pass: OK

Signed-off-by: Dmitry Kakurin <Dmitry.Kakurin@gmail.com>
2007-08-12 05:30:07 -07:00
David Kastrup
f9286765b2 Documentation/Makefile: remove cmd-list.made before redirecting to it.
If cmd-list.made has been created by a previous run as root, output
redirection to it will fail.  So remove it before regeneration.

Signed-off-by: David Kastrup <dak@gnu.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 23:50:00 -07:00
Junio C Hamano
55d1932bce Merge branch 'cr/tag'
* cr/tag:
  Teach "git stripspace" the --strip-comments option
  Make verify-tag a builtin.
  builtin-tag.c: Fix two memory leaks and minor notation changes.
  launch_editor(): Heed GIT_EDITOR and core.editor settings
  Make git tag a builtin.
2007-08-10 23:17:46 -07:00
David Kastrup
98e79f63be INSTALL: explain info installation and dependencies.
Signed-off-by: David Kastrup <dak@gnu.org>
2007-08-10 23:16:38 -07:00
David Kastrup
4739809cd0 Add support for an info version of the user manual
These patches use docbook2x in order to create an info version of the
git user manual.  No existing Makefile targets (including "all") are
touched, so you need to explicitly say

make info
sudo make install-info

to get git.info created and installed.  If the info target directory
does not already contain a "dir" file, no directory entry is created.
This facilitates $(DESTDIR)-based installations.  The same could be
achieved with

sudo make INSTALL_INFO=: install-info

explicitly.

perl is used for patching up sub-par file and directory information in
the Texinfo file.  It would be cleaner to place the respective info
straight into user-manual.txt or the conversion configurations, but I
find myself unable to find out how to do this with Asciidoc/Texinfo.

Signed-off-by: David Kastrup <dak@gnu.org>
2007-08-10 23:16:18 -07:00
Junio C Hamano
fa548703d1 Merge branch 'jc/clone'
* jc/clone:
  git-clone: aggressively optimize local clone behaviour.
  connect: accept file:// URL scheme
2007-08-10 23:05:04 -07:00
Linus Torvalds
566b5c057c Optimize the three-way merge of git-read-tree
As mentioned, the three-way case *should* be as trivial as the
following. It passes all the tests, and I verified that a conflicting
merge in the 100,000 file horror-case merged correctly (with the conflict
markers) in 0.687 seconds with this, so it works, but I'm lazy and
somebody else should double-check it [jc: followed all three-way merge
codepaths and verified it removes when it should].

Without this patch, the merge took 8.355 seconds, so this patch
really does make a huge difference for merge performance with lots and
lots of files, and we're not talking percentages, we're talking
orders-of-magnitude differences!

Now "unpack_trees()" is just fast enough that we don't need to avoid it
(although it's probably still a good idea to eventually convert it to use
the traverse_trees() infrastructure some day - just to avoid having
extraneous tree traversal functions).

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 23:02:14 -07:00
Alex Riesen
cbbb218f8b Fix filehandle leak in "git branch -D"
On Windows (it can't touch open files in any way) the following fails:

    git branch -D branch1 branch2

if the both branches are in packed-refs.

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 22:50:06 -07:00
Mark Levedahl
21a02980f9 builtin-bundle - use buffered reads for bundle header
This eliminates all use of byte-at-a-time reading of data in this
function: as Junio noted, a bundle file is seekable so we can
reset the file position to the first part of the pack-file using lseek
after reading the header.

Signed-off-by: Mark Levedahl <mdl123@verizon.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 22:33:44 -07:00
Mark Levedahl
442b67a559 builtin-bundle.c - use stream buffered input for rev-list
git-bundle create on cygwin was nearly unusable due to 1 character
at a time (unbuffered) reading from an exec'ed process. Fix by using
fdopen to get a buffered stream.

Results for "time git bundle create test.bdl v1.0.3..v1.5.2" are:

before this patch:
         cygwin         linux
real    1m38.828s      0m3.578s
user    0m12.122s      0m2.896s
sys     1m28.215s      0m0.692s

after this patch:
real    0m3.688s       0m2.835s
user    0m3.075s       0m2.731s
sys     0m1.075s       0m0.149s

Signed-off-by: Mark Levedahl <mdl123@verizon.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 22:20:35 -07:00
Junio C Hamano
c06793a4ed allow git-bundle to create bottomless bundle
Mark Levedahl <mlevedahl@gmail.com> writes:

> Junio C Hamano wrote:
>> While "git bundle" was a useful way to sneakernet incremental
>> changes, we did not allow:
>>
> Thanks - I've been thinking for months I could fix this bug, never
> figured it out and didn't want to nag Dscho one more time. I confirm
> that this allows creation of bundles with arbitrary refs, not just
> those under refs/heads. Yahoo!

Actually, there is another bug nearby.

If you do:

	git bundle create v2.6-20-v2.6.22.bndl v2.6.20..v2.6.22

the bundle records that it requires v2.6.20^0 commit (correct)
and gives you tag v2.6.22 (incorrect); the bug is that the
object it lists in fact is the commit v2.6.22^0, not the tag.

This is because the revision range operation .. is always about
set of commits, but the code near where my patch touches does
not validate that the sha1 value obtained from dwim_ref()
against the commit object name e->item->sha1 before placing the
head information in the commit.

The attached patch attempts to fix this problem.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 22:19:15 -07:00
Junio C Hamano
7fa8254f94 allow git-bundle to create bottomless bundle
While "git bundle" was a useful way to sneakernet incremental
changes, we did not allow:

	$ git bundle create v2.6.20.bndl v2.6.20

to create a bundle that contains the whole history to a
well-known good revision.  Such a bundle can be mirrored
everywhere, and people can prime their repository with it to
reduce the load on the repository that serves near the tip of
the development.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 22:19:06 -07:00
Linus Torvalds
d699676dda Optimize the two-way merge of git-read-tree too
This trivially optimizes the two-way merge case of git-read-tree too,
which affects switching branches.

When you have tons and tons of files in your repository, but there are
only small differences in the branches (maybe just a couple of files
changed), the biggest cost of the branch switching was actually just the
index calculations.

This fixes it (timings for switching between the "testing" and "master"
branches in the 100,000 file testing-repo-from-hell, where the branches
only differ in one small file).

Before:
	[torvalds@woody bummer]$ time git checkout master
	real    0m9.919s
	user    0m8.461s
	sys     0m0.264s

After:
	[torvalds@woody bummer]$ time git checkout testing
	real    0m0.576s
	user    0m0.348s
	sys     0m0.228s

so it's easily an order of magnitude different.

This concludes the series. I think we could/should do the three-way merge
too (to speed up merges), but I'm lazy. Somebody else can do it.

The rule is very simple: you need to remove the old entry if:
 - you want to remove the file entirely
 - you replace it with a "merge conflict" entry (ie a non-stage-0 entry)

and you can avoid removing it if you either

 - keep the old one
 - or resolve it to a new one.

and these rules should all be valid for the three-way case too.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 14:00:25 -07:00
Linus Torvalds
288f072ec0 Optimize the common cases of git-read-tree
This optimizes bind_merge() and oneway_merge() to not unnecessarily
remove and re-add the old index entries when they can just get replaced
by updated ones.

This makes these operations much faster for large trees (where "large"
is in the 50,000+ file range), because we don't unnecessarily move index
entries around in the index array all the time.

Using the "bummer" tree (a test-tree with 100,000 files) we get:

Before:
	[torvalds@woody bummer]$ time git commit -m"Change one file" 50/500
	real    0m9.470s
	user    0m8.729s
	sys     0m0.476s

After:
	[torvalds@woody bummer]$ time git commit -m"Change one file" 50/500
	real    0m1.173s
	user    0m0.720s
	sys     0m0.452s

so for large trees this is easily very noticeable indeed.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 14:00:11 -07:00
Linus Torvalds
b48d5a050a Move old index entry removal from "unpack_trees()" into the individual functions
This makes no changes to current code, but it allows the individual merge
functions to decide what to do about the old entry.  They might decide to
update it in place, rather than force them to always delete and re-add it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 13:59:19 -07:00
Junio C Hamano
79f5e0645a Merge branch 'lt/readtree'
* lt/readtree:
  Start moving unpack-trees to "struct tree_desc"
2007-08-10 13:58:45 -07:00
Linus Torvalds
22631473e0 Fix "git commit directory/" performance anomaly
This trivial patch avoids re-hashing files that are already clean in the
index. This mirrors what commit 0781b8a9b2
did for "git add .", only for "git commit ." instead.

This improves the cold-cache case immensely, since we don't need to bring
in all the file contents, just the index and any files dirty in the index.

Before:

	[torvalds@woody linux]$ time git commit .
	real    1m49.537s
	user    0m3.892s
	sys     0m2.432s

After:

	[torvalds@woody linux]$ time git commit .
	real    0m14.273s
	user    0m1.312s
	sys     0m0.516s

(both after doing a "echo 3 > /proc/sys/vm/drop_caches" to get cold-cache
behaviour - even with the index optimization git still has to "lstat()"
all the files, so with a truly cold cache, bringing all the inodes in
will take some time).

[jc: trivial "return 0;" fixed]

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 13:57:43 -07:00
Junio C Hamano
af3785dc5a Optimize "diff --cached" performance.
The read_tree() function is called only from the call chain to
run "git diff --cached" (this includes the internal call made by
git-runstatus to run_diff_index()).  The function vacates stage
without any funky "merge" magic.  The caller then goes and
compares stage #1 entries from the tree with stage #0 entries
from the original index.

When adding the cache entries this way, it used the general
purpose add_cache_entry().  This function looks for an existing
entry to replace or if there is none to find where to insert the
new entry, resolves D/F conflict and all the other things.

For the purpose of reading entries into an empty stage, none of
that processing is needed.  We can instead append everything and
then sort the result at the end.

This commit changes read_tree() to first make sure that there is
no existing cache entries at specified stage, and if that is the
case, it runs add_cache_entry() with ADD_CACHE_JUST_APPEND flag
(new), and then sort the resulting cache using qsort().

This new flag tells add_cache_entry() to omit all the checks
such as "Does this path already exist?  Does adding this path
remove other existing entries because it turns a directory to a
file?" and instead append the given cache entry straight at the
end of the active cache.  The caller of course is expected to
sort the resulting cache at the end before using the result.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 11:44:23 -07:00
Junio C Hamano
63c21c494f Revert "tweak manpage formatting"
This reverts commit 524e5ffcf4.
It is reported that this change breaks formatting with docbook
1.69.
2007-08-10 11:32:42 -07:00
Johannes Schindelin
8e78bd5710 verify_path(): do not allow absolute paths
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2007-08-10 14:06:54 +02:00
Torgil Svensson
a8c36f3212 Make sane shell- and perl-scripts magic paths
Make the magic paths absolute to msys instead of absolute to Windows.

Signed-off-by: Torgil Svensson <torgil.svensson@gmail.com>
Acked-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Acked-by: Marius Storm-Olsen <marius@trolltech.com>
2007-08-10 13:27:22 +02:00
Linus Torvalds
933bf40a5c Start moving unpack-trees to "struct tree_desc"
This doesn't actually change any real code, but it changes the interface
to unpack_trees() to take an array of "struct tree_desc" entries, the same
way the tree-walk.c functions do.

The reason for this is that we would be much better off if we can do the
tree-unpacking using the generic "traverse_trees()" functionality instead
of having to the special "unpack" infrastructure.

This really is a pretty minimal diff, just to change the calling
convention. It passes all the tests, and looks sane. There were only two
users of "unpack_trees()": builtin-read-tree and merge-recursive, and I
tried to keep the changes minimal.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 02:30:44 -07:00
Johannes Schindelin
7efeb8f098 Reinstate the old behaviour when GIT_DIR is set and GIT_WORK_TREE is unset
The old behaviour was to unilaterally default to the cwd is the work tree
when GIT_DIR was set, but GIT_WORK_TREE wasn't, no matter if we are inside
the GIT_DIR, or if GIT_DIR is actually something like ../../../.git.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 01:12:07 -07:00
Dmitry Kakurin
5e5619bd48 Applied settings from config.mak to Makefile so we don't need config.mak anymore
Signed-off-by: Dmitry Kakurin <Dmitry.Kakurin@gmail.com>
2007-08-10 01:10:22 -07:00
Dmitry Kakurin
855f254b2b git clone was failing with 'invalid object name HEAD' if ran from cmd.exe directly
environment.c caches results of many getenv calls.
Under MinGW setenv(X) invalidates all previous values returned by getenv(X)
so cached values become dangling pointers.

Replaced all setenv(GIT_DIR, ...) with set_git_dir

Signed-off-by: Dmitry Kakurin <Dmitry.Kakurin@gmail.com>
2007-08-10 01:10:21 -07:00
Junio C Hamano
524e5ffcf4 tweak manpage formatting
This attempts to force fixed-font in manpages for literal
blocks.  I have tested this with docbook 1.71 and it seems to
work as expected.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 01:03:51 -07:00
Junio C Hamano
f1ec6b22a8 Fix an illustration in git-rev-parse.txt
This hides the backslash at the end of line from AsciiDoc
toolchain by introducing a trailing whitespace on one line in an
illustration in git-rev-parse.txt.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 01:03:46 -07:00
Uwe Kleine-König
94638f89f5 send-email: get all the quoting of realnames right
- when sending several mails I got a slightly different behaviour for the first
  mail compared to the second to last one.  The reason is that $from was
  assigned in line 608 and was not reset when beginning to handle the next
  mail.

- Email::Valid can only handle properly quoted real names, so quote arguments
  to extract_valid_address.

This patch cleans up variable naming to better differentiate between sender of
the mail and it's author.

Signed-off-by: Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 01:02:32 -07:00
Uwe Kleine-König
155197e6e7 send-email: rfc822 forbids using <address@domain> without a non-empty "phrase"
Email::Valid does respect this considering such a mailbox specification
invalid.  b06c6bc831 addressed the issue, but
only if Email::Valid is available.

Signed-off-by: Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2007-08-10 01:00:51 -07:00