15 years agoClean up the Makefile a bit.
Linus Torvalds [Mon, 18 Apr 2005 19:49:39 +0000 (12:49 -0700)]
Clean up the Makefile a bit.

This introduces the concept of git "library" objects that
the real programs use, and makes it easier to add such things
to a "libgit.a".

This will also make it trivial to split the current "read-cache.o"
into more aptly named pieces (it does a lot more than just read
the index file).

15 years agoAdd the simple scripts I used to do a merge with content conflicts.
Linus Torvalds [Mon, 18 Apr 2005 19:15:10 +0000 (12:15 -0700)]
Add the simple scripts I used to do a merge with content conflicts.

They sure as hell aren't perfect, but they allow you to do:

./git-pull-script {other-git-directory}

to do the initial merge, and if that had content clashes, you do

merge-cache ./git-merge-one-file-script -a

which tries to auto-merge. When/if the auto-merge fails, it will
leave the last file in your working directory, and you can edit
it and then when you're happy you can do "update-cache filename"
on it. Re-do the merge-cache thing until there are no files left
to be merged, and now you can write the tree and commit:

commit-tree .... -p $(cat .git/HEAD) -p $(cat .git/MERGE_HEAD)

and you're done.

15 years agoMerge the new object model thing from Daniel Barkalow
Linus Torvalds [Mon, 18 Apr 2005 19:12:00 +0000 (12:12 -0700)]
Merge the new object model thing from Daniel Barkalow

This was a real git merge with conflicts. I'll commit the scripts I used
to do the merge next.

Not pretty, but it's half-way functional.

15 years ago[PATCH] fix bug in read-cache.c which loses files when merging a tree
James Bottomley [Mon, 18 Apr 2005 18:44:31 +0000 (11:44 -0700)]
[PATCH] fix bug in read-cache.c which loses files when merging a tree

I noticed this when I tried a non-trivial scsi merge and checked the
results against BK.  The problem is that remove_entry_at() actually
decrements active_nr, so decrementing it in add_cache_entry() before
calling remove_entry_at() is a double decrement (hence we lose cache
entries at the end).

15 years ago[PATCH] Switch implementations of merge-base, port to parsing
Daniel Barkalow [Mon, 18 Apr 2005 18:39:48 +0000 (11:39 -0700)]
[PATCH] Switch implementations of merge-base, port to parsing

This switches to my implementation of merge-base, but with the new parsing

Signed-Off-By: Daniel Barkalow <>
Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Port fsck-cache to use parsing functions
Daniel Barkalow [Mon, 18 Apr 2005 18:39:48 +0000 (11:39 -0700)]
[PATCH] Port fsck-cache to use parsing functions

This ports fsck-cache to use parsing functions. Note that performance
could be improved here by only reading each object once, but this requires
somewhat more complicated flow control.

Signed-Off-By: Daniel Barkalow <>
Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Port rev-tree to parsing functions
Daniel Barkalow [Mon, 18 Apr 2005 18:39:48 +0000 (11:39 -0700)]
[PATCH] Port rev-tree to parsing functions

This ports rev-tree to use the parsing functions introduced in the
previous patches.

Signed-Off-By: Daniel Barkalow <>
Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Implementations of parsing functions
Daniel Barkalow [Mon, 18 Apr 2005 18:39:48 +0000 (11:39 -0700)]
[PATCH] Implementations of parsing functions

This implements the parsing functions.

Signed-Off-By: Daniel Barkalow <>
Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Header files for object parsing
Daniel Barkalow [Mon, 18 Apr 2005 18:39:48 +0000 (11:39 -0700)]
[PATCH] Header files for object parsing

This adds the structs and function declarations for parsing git objects.

Signed-Off-By: Daniel Barkalow <>
Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Fix confusing behaviour of update-cache --refresh on unmerged paths.
Junio C Hamano [Mon, 18 Apr 2005 17:42:48 +0000 (10:42 -0700)]
[PATCH] Fix confusing behaviour of update-cache --refresh on unmerged paths.

The "update-cache --refresh" command attempts refresh_entry()
on unmerged path, which results in as many "needs update" messages
as there are unmerged stages for that path.  This does not do
any harm to the working directory, but it is confusing.

Here is a fix.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
15 years agoUpdate README to reflect the hierarchical tree objects,
Linus Torvalds [Mon, 18 Apr 2005 04:52:23 +0000 (21:52 -0700)]
Update README to reflect the hierarchical tree objects,
and other newfangled things like merging.

Also, talk more about the actual operations, and give some
rough examples of what you can do.

15 years ago[PATCH] (resend) show-diff.c off-by-one fix
Junio C Hamano [Mon, 18 Apr 2005 03:31:40 +0000 (20:31 -0700)]
[PATCH] (resend) show-diff.c off-by-one fix

The patch to introduce shell safety to show-diff has an
off-by-one error.  Here is an fix.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
15 years agoAss a "merge-cache" helper program to execute a merge on
Linus Torvalds [Mon, 18 Apr 2005 02:52:54 +0000 (19:52 -0700)]
Ass a "merge-cache" helper program to execute a merge on
any unmerged files.

This one doesn't actually do the merging, but it makes it
easy to script the programs that do using it.

15 years ago[PATCH] fork optional branch point normazilation
Brad Roberts [Mon, 18 Apr 2005 02:12:14 +0000 (19:12 -0700)]
[PATCH] fork optional branch point normazilation

Fix remove_specials for real.  The second half logic needs the original
head of the string.

Signed-off-by: Brad Roberts <>
Signed-off-by: Linus Torvalds <>
15 years agoIgnore any unmerged entries for "checkout-cache -a".
Linus Torvalds [Mon, 18 Apr 2005 01:39:14 +0000 (18:39 -0700)]
Ignore any unmerged entries for "checkout-cache -a".

They don't "exist" yet, and you need to merge them first.

15 years agoRemove extraneous ',' ';' and '.' characters from the full name gecos field.
Linus Torvalds [Sun, 17 Apr 2005 23:52:54 +0000 (16:52 -0700)]
Remove extraneous ',' ';' and '.' characters from the full name gecos field.

Apparently some distributions tend to have space for phone numbers etc there.

15 years agoMake the revision tracking track the object types too.
Linus Torvalds [Sun, 17 Apr 2005 23:19:32 +0000 (16:19 -0700)]
Make the revision tracking track the object types too.

This allows fsck to verify not just that an object exists, but
also that it has the type it was expected to have.

15 years agoMake "commit-tree" check the input objects more carefully.
Linus Torvalds [Sun, 17 Apr 2005 22:26:13 +0000 (15:26 -0700)]
Make "commit-tree" check the input objects more carefully.

Let's not allow trivially bogus commits. I did one for the first
trial of the first kernel git merge. fsck found it ok, but..

15 years agoMake "parse_commit" return the "struct revision" for the commit.
Linus Torvalds [Sun, 17 Apr 2005 19:40:18 +0000 (12:40 -0700)]
Make "parse_commit" return the "struct revision" for the commit.

Also, make it a fatal error to pass in a non-commit object. The callers
never checked, so better check here.

This simplifies merge-base further. It's now so trivial that it's almost

15 years agoDo a very simple "merge-base" that finds the most recent common
Linus Torvalds [Sun, 17 Apr 2005 19:18:17 +0000 (12:18 -0700)]
Do a very simple "merge-base" that finds the most recent common
parent of two commits.

The question of "best" commit can probably be tweaked almost arbitrarily.
In particular, trying to take things like how big the tree differences
are into account migt be a good idea. This one is just very simple.

15 years agoMake "rev-tree.c" use the new-and-improved "mark_reachable()"
Linus Torvalds [Sun, 17 Apr 2005 19:09:20 +0000 (12:09 -0700)]
Make "rev-tree.c" use the new-and-improved "mark_reachable()"

It used to have its own specialized version for marking the
sub-reachability bits.

15 years agoMake "revision.h" slightly better to use.
Linus Torvalds [Sun, 17 Apr 2005 19:07:00 +0000 (12:07 -0700)]
Make "revision.h" slightly better to use.

 - mark_reachable() can be more generic, marking the reachable revisions
   with an arbitrary mask.
 - date parsing will parse to a date of 0 rather than ULONG_MAX for the
   bad old case, sorting the dates correctly.

15 years agoMove "parse_commit()" into common revision.h file.
Linus Torvalds [Sun, 17 Apr 2005 18:39:18 +0000 (11:39 -0700)]
Move "parse_commit()" into common revision.h file.

This also drops the old-style date parsing. We just don't care
enough, since we dropped that format pretty early.

Yes, this could do with some cleanup, and a common library file.
Some day.

15 years ago[PATCH] fix for memory leak in write-tree.c
Brad Roberts [Sun, 17 Apr 2005 17:55:12 +0000 (10:55 -0700)]
[PATCH] fix for memory leak in write-tree.c

Fix a memory leak in write-tree.c, not freeing the directory buffer.

15 years ago[PATCH] Fix +x-related show-diff false positives
Petr Baudis [Sun, 17 Apr 2005 17:04:48 +0000 (10:04 -0700)]
[PATCH] Fix +x-related show-diff false positives

This fixes show-diff listing all +x files as differring.

Signed-off-by: Petr Baudis <>
[ That's what I get for working on a G5 - my testing was all
  big-endian in the first place.  -- Linus ]

Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Remove unused arguments from index_fd()
Junio C Hamano [Sun, 17 Apr 2005 17:02:22 +0000 (10:02 -0700)]
[PATCH] Remove unused arguments from index_fd()

The function index_fd() in update-cache.c takes 5 arguments, but
two is not necessary and one that is a pointer to a structure
really needs to be a pointer to one member of that structure.
This patch cleans it up.

Also it removes printf() apparently left after initial

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] Better error message from checkout-cache for unmerged files.
Junio C Hamano [Sun, 17 Apr 2005 17:02:21 +0000 (10:02 -0700)]
[PATCH] Better error message from checkout-cache for unmerged files.

The checkout-cache command says "file is not in the cache" when
an unmerged path is given.  This patch adds code to distinguish
the unmerged and the nonexistent cases and gives an appropriate
error message.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
15 years agoFix total permission bogosity in "checkout-cache.c".
Linus Torvalds [Sun, 17 Apr 2005 16:55:36 +0000 (09:55 -0700)]
Fix total permission bogosity in "checkout-cache.c".

Use the proper octal mode naming instead of random decimal
crud, and don't reset the mode after the create with fchmod:
the whole point was to let "umask" do its thing.


15 years ago[PATCH] update-cache --remove marks the path merged.
Junio C Hamano [Sun, 17 Apr 2005 16:53:35 +0000 (09:53 -0700)]
[PATCH] update-cache --remove marks the path merged.

When update-cache --remove is run, resolve unmerged state for
the path.  This is consistent with the update-cache --add
behaviour.  Essentially, the user is telling us how he wants to
resolve the merge by running update-cache.

Signed-off-by: Junio C Hamano <>
Fixed to do the right thing at the end.

Signed-off-by: Linus Torvalds <>
15 years ago[PATCH] show-diff.c: do not include unused header file
Junio C Hamano [Sun, 17 Apr 2005 16:53:35 +0000 (09:53 -0700)]
[PATCH] show-diff.c: do not include unused header file

This is my bad.  I added #include <ctype.h> to the file,
which I ended up not using and failed to remove it.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years agoBe much more liberal about the file mode bits.
Linus Torvalds [Sun, 17 Apr 2005 05:26:31 +0000 (22:26 -0700)]
Be much more liberal about the file mode bits.

We only really care about the difference between a file being executable
or not (by its owner). Everything else we leave for the user umask to

16 years ago[PATCH] Do not run useless show-diff on unmerged paths repeatedly.
Junio C Hamano [Sun, 17 Apr 2005 04:29:45 +0000 (21:29 -0700)]
[PATCH] Do not run useless show-diff on unmerged paths repeatedly.

When run on unmerged dircache, show-diff compares the working
file with each non-empty stage for that path.  Two out of three
times, this is not very helpful.  This patch makes it report the
unmergedness only once per each path and avoids running the
actual diff.

Upper layer SCMs like Cogito are expected to find out mode/SHA1
for each stage by using "show-files --stage" and run the diff
itself.  This would result in more sensible diffs.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] show-diff style fix.
Junio C Hamano [Sun, 17 Apr 2005 04:29:45 +0000 (21:29 -0700)]
[PATCH] show-diff style fix.

This fixes some stylistic problems introduced by my previous set
of patches.  I'll be sending my last patch to show-diff next,
which depends on this cleanup.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] Rename confusing variable in show-diff
Junio C Hamano [Sun, 17 Apr 2005 04:29:45 +0000 (21:29 -0700)]
[PATCH] Rename confusing variable in show-diff

The show-diff command uses a variable "new" but it is always
used to point at the original data recorded in the dircache
before the user started editing in the working file.  Rename it
to "old" to avoid confusion.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] show-diff shell safety
Junio C Hamano [Sun, 17 Apr 2005 04:29:45 +0000 (21:29 -0700)]
[PATCH] show-diff shell safety

The command line for running "diff" command is built without
taking shell metacharacters into account.  A malicious dircache
entry "foo 2>bar" (yes, a filename with space) would result in
creating a file called "bar" with the error message "diff: foo:
No such file or directory" in it.

This is not just a user screwing over himself.  Such a dircache
can be created as a result of a merge with tree from others.

Here is a fix.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] show-diff -z option for machine readable output.
Junio C Hamano [Sun, 17 Apr 2005 04:29:45 +0000 (21:29 -0700)]
[PATCH] show-diff -z option for machine readable output.

This patch adds the -z option to the show-diff command,
primarily for use by scripts.  The information emitted is
similar to that of -q option, but in a more machine readable
form.  Records are terminated with NUL instead of LF, so that
the scripts can deal with pathnames with embedded newlines.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] Optionally tell show-diff to show only named files
Junio C Hamano [Sun, 17 Apr 2005 04:29:45 +0000 (21:29 -0700)]
[PATCH] Optionally tell show-diff to show only named files

SCMs have ways to say "I want diff only this particular file",
or "I want diff files under this directory".  This patch teaches
show-diff to do something similar.  Without command line
arguments, it still examines everything in the dircache as

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] Un unoptimize ls-tree behaviour
Junio C Hamano [Sat, 16 Apr 2005 20:57:39 +0000 (13:57 -0700)]
[PATCH] Un unoptimize ls-tree behaviour

ls-tree unconditionally called read_sha1_file() for all paths
even when not needed, which was a mistake introduced by me.
Rectify this by first checking S_ISDIR(mode) and read the tree
contents only when it is a tree and we are recursive.  There is
no need to read it in any other cases.

The patch also removes the confusing comment that led to this
incorrect implementation.

Thanks to Peter Baudis for noticing this problem.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years agoAdd "--unmerged" flag to "show-files", which does what the name implies.
Linus Torvalds [Sat, 16 Apr 2005 19:43:32 +0000 (12:43 -0700)]
Add "--unmerged" flag to "show-files", which does what the name implies.

The flag also implies "--stage", since unmerged file information doesn't
make sense without the full output.

16 years agoRemove "merge-tree.c"
Linus Torvalds [Sat, 16 Apr 2005 19:24:12 +0000 (12:24 -0700)]
Remove "merge-tree.c"

It's there in the history if somebody wants to resurrect it, but it
seems to have been successfully superceded by the new and improved
index-merge thing, where we do all merging entirely in the index.

16 years agoWhen inserting a index entry of stage 0, remove all old unmerged entries.
Linus Torvalds [Sat, 16 Apr 2005 19:05:45 +0000 (12:05 -0700)]
When inserting a index entry of stage 0, remove all old unmerged entries.

This allows you to actually tell git that you've resolved a conflict.

16 years agoMake 'read-tree' do a few more of the trivial merge cases.
Linus Torvalds [Sat, 16 Apr 2005 16:11:49 +0000 (09:11 -0700)]
Make 'read-tree' do a few more of the trivial merge cases.

This cuts down the work for the "real merge" to stuff where
people might actually disagree on the algorithm. The trivial
cases would seem to be totally independent of any policy.

16 years ago[PATCH] Add --stage to show-files for new stage dircache.
Junio C Hamano [Sat, 16 Apr 2005 15:33:23 +0000 (08:33 -0700)]
[PATCH] Add --stage to show-files for new stage dircache.

This adds --stage option to show-files command.  It shows
file-mode, SHA1, stage and pathname.  Record separator follows
the usual convention of -z option as before.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] Byteorder fix for read-tree, new -m semantics version.
Junio C Hamano [Sat, 16 Apr 2005 15:30:20 +0000 (08:30 -0700)]
[PATCH] Byteorder fix for read-tree, new -m semantics version.

The ce_namelen field has been renamed to ce_flags and split into
the top 2-bit unused, next 2-bit stage number and the lowest
12-bit name-length, stored in the network byte order.  A new
macro create_ce_flags() is defined to synthesize this value from
length and stage, but it forgets to turn the value into the
network byte order.  Here is a fix.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years agoMake "read-tree" merge the trees it reads by giving them consecutive states.
Linus Torvalds [Sat, 16 Apr 2005 05:53:45 +0000 (22:53 -0700)]
Make "read-tree" merge the trees it reads by giving them consecutive states.

Normally you'd use state 0 for the "merged" state, and start out with
state 1 being "origin", state 2 being "first tree" and state 3 being
"second tree".

Once all the index entries are back in state 0, we have a successful
merge and can write the result tree back.

16 years agoMake cache entry comparison take the new "state" flag into account.
Linus Torvalds [Sat, 16 Apr 2005 05:51:44 +0000 (22:51 -0700)]
Make cache entry comparison take the new "state" flag into account.

This is what allows us to have multiple states of the same file in
the index, and what makes it always sort correctly.

16 years agowrite-tree: refuse to write out trees with unmerged index entries.
Linus Torvalds [Sat, 16 Apr 2005 05:04:54 +0000 (22:04 -0700)]
write-tree: refuse to write out trees with unmerged index entries.

Of course, we can't even generate such an index yet, but give me
some time. This is a cunning plan. Let's see if it actually works.

(I feel like Wile E Coyote, waiting for the big rock to fall).

16 years agoEncode a few extra flags per index entry.
Linus Torvalds [Sat, 16 Apr 2005 04:45:38 +0000 (21:45 -0700)]
Encode a few extra flags per index entry.

This will allow us to have the same name in different "states" in the
index at the same time. Which in turn seems to be a very simple way to

16 years agoSimplify show-diff cache entry name handling.
Linus Torvalds [Sat, 16 Apr 2005 04:42:34 +0000 (21:42 -0700)]
Simplify show-diff cache entry name handling.

The cache-entry names are all proper strings, no need to worry about
their length.

16 years ago[PATCH] Add '-z' to merge-tree.c
Junio C Hamano [Sat, 16 Apr 2005 02:20:42 +0000 (19:20 -0700)]
[PATCH] Add '-z' to merge-tree.c

This adds '-z' to merge-tree and changes its default line termination to
LF to make it consistent with your other recent changes.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years agoMake "diff-tree" have similar behaviour as "ls-tree" wrt line termination.
Linus Torvalds [Fri, 15 Apr 2005 22:11:57 +0000 (15:11 -0700)]
Make "diff-tree" have similar behaviour as "ls-tree" wrt line termination.

Default to the human-readable '\n', but make the scriptable "-z" flag
do the old '\0' behaviour.

16 years ago[PATCH] Add "-q" option to show-diff.c
Junio C Hamano [Fri, 15 Apr 2005 22:08:09 +0000 (15:08 -0700)]
[PATCH] Add "-q" option to show-diff.c

This adds the '-q' option for show-diff.c to squelch complaints for
missing files.

It is handy if you want to run it in the merge temporary directory after
running merge-trees with its minimum checkout mode, which is the
default, because you would not find any files other than the ones that
needs human validation after the merge there.

It also fixes the argument parsing bug Paul Mackerras noticed in
<> but slightly

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years ago[PATCH] Add -z option to show-files
Junio C Hamano [Fri, 15 Apr 2005 18:11:01 +0000 (11:11 -0700)]
[PATCH] Add -z option to show-files

This adds NUL-terminated output (-z) to show-files.  This is necessary
for merge-trees script to deal with filenames with embedded newlines.

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years agoAdd "--cacheinfo" option to update-cache.
Linus Torvalds [Fri, 15 Apr 2005 18:08:33 +0000 (11:08 -0700)]
Add "--cacheinfo" option to update-cache.

This allows scripts to manually add entries to the cache explicitly.

Need to do some way to remove them too, even if the path exists.

16 years agoConvert the index file reading/writing to use network byte order.
Linus Torvalds [Fri, 15 Apr 2005 17:44:27 +0000 (10:44 -0700)]
Convert the index file reading/writing to use network byte order.

This allows using a git tree over NFS with different byte order, and
makes it possible to just copy a fully populated repository and have
the end result immediately usable (needing just a refresh to update
the stat information).

16 years ago[PATCH] Simplify date handling and make it more reliable
David Woodhouse [Fri, 15 Apr 2005 15:39:57 +0000 (08:39 -0700)]
[PATCH] Simplify date handling and make it more reliable

This make all dates be stores as seconds since UTC epoch, with the
author's or committer's timezone as auxiliary data so that dates can be
pretty-printed in the original timezone later if anyone cares.  I left
the date parsing in rev-tree.c for backward compatibility but it can be
dropped when we change to base64 :)

commit-tree now eats RFC2822 dates as AUTHOR_DATE because that's
what you're going to want to feed it.

Yes, glibc sucks and strptime is a pile of crap. We have to parse it

16 years ago[PATCH] ls-tree enhancements
Junio C Hamano [Fri, 15 Apr 2005 15:37:05 +0000 (08:37 -0700)]
[PATCH] ls-tree enhancements

This adds '-r' (recursive) option and '-z' (NUL terminated)
option to ls-tree.  I need it so that the merge-trees (formerly
known as git-merge.perl) script does not need to create any
temporary dircache while merging.  It used to use show-files on
a temporary dircache to get the list of files in the ancestor
tree, and also used the dircache to store the result of its
automerge.  I probably still need it for the latter reason, but
with this patch not for the former reason anymore.

It is relative to bb95843a5a0f397270819462812735ee29796fb4

Signed-off-by: Junio C Hamano <>
Signed-off-by: Linus Torvalds <>
16 years agoAdd "merge-tree" helper program. Maybe it's retarded, maybe it's helpful.
Linus Torvalds [Thu, 14 Apr 2005 08:37:23 +0000 (01:37 -0700)]
Add "merge-tree" helper program. Maybe it's retarded, maybe it's helpful.

It only works one directory level at a time, so lookout..

16 years agoUse common "revision.h" header for both fsck and rev-tree.
Linus Torvalds [Thu, 14 Apr 2005 04:37:59 +0000 (21:37 -0700)]
Use common "revision.h" header for both fsck and rev-tree.

It's really a very generic thing: the notion of one sha1 revision
referring to another one. "fsck" uses it for all nodes, and "rev-tree"
only tracks commit-node relationships, but the code was already
the same - now we just make that explicit by moving it to a common
header file.

16 years agoFix read-cache.c collission check logic.
Linus Torvalds [Thu, 14 Apr 2005 00:47:12 +0000 (17:47 -0700)]
Fix read-cache.c collission check logic.

Not only did it test the #define the wrong way around, but
it also leaked file descriptors and VM space. This should
fix it.

16 years agoMake 'fsck' able to take an arbitrary number of parents on the
Linus Torvalds [Wed, 13 Apr 2005 23:42:09 +0000 (16:42 -0700)]
Make 'fsck' able to take an arbitrary number of parents on the
command line.

"arbitrary" is a bit wrong, since it is limited by the argument
size limit (128kB or so), but let's see if anybody ever cares.
Arguably you should prune your tree before you have a few thousand
dangling heads in your archive.

We can fix it by passing in a file listing if we ever care.

16 years agoMake fsck reachability avoid doing unnecessary work for
Linus Torvalds [Wed, 13 Apr 2005 19:35:08 +0000 (12:35 -0700)]
Make fsck reachability avoid doing unnecessary work for
parents that we reach multiple ways.

This doesn't matter right now. It _will_ matter once we have
complex revision graphs.

16 years agoMake "fsck-cache" use the same revision tracking structure as "rev-tree".
Linus Torvalds [Wed, 13 Apr 2005 16:57:30 +0000 (09:57 -0700)]
Make "fsck-cache" use the same revision tracking structure as "rev-tree".

This makes things a lot more efficient, and makes it trivial to do things
like reachability analysis.

Add command line flags to tell what the head is, and whether to warn
about unreachable objects.

16 years ago[PATCH] Change diff-tree output format
Petr Baudis [Wed, 13 Apr 2005 09:42:04 +0000 (02:42 -0700)]
[PATCH] Change diff-tree output format

Changes diff-tree output format so that fields are separated by tabs instead of
spaces (readibility, parseability), and tree entry type is listed along the
entry (avoids having to figure that out from the mode in the scripts).

This is what my scripts expect.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] diff-tree usage
Petr Baudis [Wed, 13 Apr 2005 09:39:33 +0000 (02:39 -0700)]
[PATCH] diff-tree usage

Fix diff-tree usage, since it takes -r instead of -R now.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] nsec portability
Petr Baudis [Wed, 13 Apr 2005 09:38:44 +0000 (02:38 -0700)]
[PATCH] nsec portability

It seems like the nsec portability is limited; in particular, older
glibcs (<=2.2.4 at least) don't seem to like it. So access the nsec
fields in struct stat only when -DNSEC.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Whitespace Fixes
Ingo Molnar [Tue, 12 Apr 2005 18:36:26 +0000 (11:36 -0700)]
[PATCH] Whitespace Fixes

Trivial whitespace fixes.

From: Ingo Molnar <>
Signed-off-by: Ingo Molnar <>
Signed-off-by: Petr Baudis <>
16 years ago[PATCH] No need to clean temp_git_file_* anymore
Junio C Hamano [Tue, 12 Apr 2005 15:08:12 +0000 (08:08 -0700)]
[PATCH] No need to clean temp_git_file_* anymore

Ancient cat-file command used to leave temp_git_file_* and there
was support to remove them in the clean target of Makefile.  I
do not think it is needed anymore.

From: Junio C Hamano <>
Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Typofix in git/show-files.
Junio C Hamano [Tue, 12 Apr 2005 15:04:17 +0000 (08:04 -0700)]
[PATCH] Typofix in git/show-files.

Fixes a typo in usage string.

From: Junio C Hamano <>
Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Consolidate the error handling
Petr Baudis [Wed, 13 Apr 2005 09:28:48 +0000 (02:28 -0700)]
[PATCH] Consolidate the error handling

Now there is error() for "library" errors and die() for fatal "application"
errors. usage() is now used strictly only for usage errors.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Make nsec checking optional
Petr Baudis [Wed, 13 Apr 2005 09:20:38 +0000 (02:20 -0700)]
[PATCH] Make nsec checking optional

The nsec field of ctime/mtime is now checked only with -DNSEC defined during
compilation. nsec acts broken since it is stored in the icache but apparently
just gets to zero when flushed to filesystem not supporting it (e.g. ext3),
creating illusions of false changes. At least that's my impression.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] SHA1 naive collision checking
Petr Baudis [Wed, 13 Apr 2005 09:14:06 +0000 (02:14 -0700)]
[PATCH] SHA1 naive collision checking

When compiled with -DCOLLISION_CHECK, we will check against SHA1
collisions when writing to the object database.

From: Christopher Li <>
Signed-off-by: Petr Baudis <>
16 years ago[PATCH] ls-tree for listing trees
Petr Baudis [Wed, 13 Apr 2005 09:02:34 +0000 (02:02 -0700)]
[PATCH] ls-tree for listing trees

ls-tree tool provides just a way to export the binary tree objects
to a usable text format. This is bound to be useful in variety
of scripts, although none of those I have currently uses it.
But e.g. the simple script I've sent to HPA for purging the object
database uses it.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Correct show-diff output for deleted files
Petr Baudis [Wed, 13 Apr 2005 08:46:35 +0000 (01:46 -0700)]
[PATCH] Correct show-diff output for deleted files

My convention is that contrary to files trimmed to zero size,
deleted files always go to /dev/null. This patch turns show-diff
to abide this.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Silent flag for show-diff
Petr Baudis [Wed, 13 Apr 2005 08:40:09 +0000 (01:40 -0700)]
[PATCH] Silent flag for show-diff

This patch adds a -s flag for show-diff, which will surpress the
actual diffing. This is useful for my scripts when they just want
to see what needs to be updated in the cache.

Signed-off-by: Petr Baudis <>
16 years ago[PATCH] Fix a crash when doing rev-tree
Petr Baudis [Tue, 12 Apr 2005 21:37:42 +0000 (14:37 -0700)]
[PATCH] Fix a crash when doing rev-tree

In parse_commit(), free(buffer) is fed a bogus pointer.

Signed-off-by: Petr Baudis <>
Signed-off-by: Linus Torvalds <>
16 years agoMake "checkout-cache" silently skip up-to-date files.
Linus Torvalds [Tue, 12 Apr 2005 21:17:28 +0000 (14:17 -0700)]
Make "checkout-cache" silently skip up-to-date files.

It used to always overwrite them if forced. Now it just
realizes that they are already ok, and don't need to be

16 years agoMake "rev-tree" able to read its own output again from the cache.
Linus Torvalds [Tue, 12 Apr 2005 20:40:03 +0000 (13:40 -0700)]
Make "rev-tree" able to read its own output again from the cache.

Also, add "date" information to the output so that you can do something
like this:

rev-tree `cat .git/HEAD` | sort -nr | cut -d' ' -f2 | while read i; do cat-file commit $i; done

which basically becomes a "git log" (aka "git changes") where things are
sorted by time.

16 years ago[PATCH] rev-tree support for "in X but not in Y".
David Woodhouse [Tue, 12 Apr 2005 19:35:11 +0000 (12:35 -0700)]
[PATCH] rev-tree support for "in X but not in Y".

To do the automated commit-mailing I need to be able to answer the
question "which commits are here today but weren't yesterday"...  i.e.
given two commit-ids $HEAD and $YESTERDAY I want to be able to do:

rev-tree $HEAD ^$YESTERDAY

to list those commits which are in the tree now but weren't
ancestors of yesterday's head.

Yes, I could probably do this with
rev-tree $HEAD $YESTERDAY | egrep -v ^[a-z0-9]*:3
but I prefer not to.

16 years ago[PATCH] show-diff show deleted files as diff as well.
Christopher Li [Tue, 12 Apr 2005 09:04:44 +0000 (02:04 -0700)]
[PATCH] show-diff show deleted files as diff as well.

The ideas is that using the show-diff to generate the
patch including deleted and new file (in the next patch).
So we don't have to do the temp new file diff dance on the

The cache index now contain enough information to generate
the whole patch. So the GIT SCM don't need separate command
for check out file to edit or delete. Just do the edit and
remove and GIT will generate the correct patch.

It still require tell GIT to add new files.

16 years agoRemove the annoying "ok" printout from show-diff.
Linus Torvalds [Tue, 12 Apr 2005 09:01:12 +0000 (02:01 -0700)]
Remove the annoying "ok" printout from show-diff.

It used to be useful before I wrote "show-files", so that
show-diff would also tell what the cached files were. Now
it's just annoying.

16 years agoAdd a "check-files" command, which is useful for scripting
Linus Torvalds [Tue, 12 Apr 2005 07:23:14 +0000 (00:23 -0700)]
Add a "check-files" command, which is useful for scripting

In particular, it verifies that all the listed files are up-to-date
in the cache (or don't exist and are ready to be added).

16 years agoAdd "show-files" command to show the list of managed (or non-managed) files.
Linus Torvalds [Tue, 12 Apr 2005 01:55:38 +0000 (18:55 -0700)]
Add "show-files" command to show the list of managed (or non-managed) files.

You want things like this to check in a patch..

16 years agoAllow zero-sized files to be checked in.
Linus Torvalds [Tue, 12 Apr 2005 01:02:00 +0000 (18:02 -0700)]
Allow zero-sized files to be checked in.

The kernel may not want it, but others probably do.

Noted (again) by Junio Hamano.

16 years agoMake the rev-tree output more regular. This is the last
Linus Torvalds [Tue, 12 Apr 2005 00:40:58 +0000 (17:40 -0700)]
Make the rev-tree output more regular. This is the last
change. Promise.

It now always outputs all the revisions as <sha1>:<reachability>, where the
reachability is the bitmask of how that revision was reachable from the
commits in the argument list.

Trivially, if there is only one commit, the reachability will always be
(1 << 0) == 1 for all reachable revisions, and there won't be any edges
(so the "--edges" flag only makes sense with multiple commit keys).

16 years agoMake "rev-tree" capable of showing the difference in reachability between two
Linus Torvalds [Tue, 12 Apr 2005 00:23:58 +0000 (17:23 -0700)]
Make "rev-tree" capable of showing the difference in reachability between two
or more commit points.

This is important both to know what the difference between two commit
points is, but also to figure out where to try to merge from.

16 years agoMake "rev-tree" more efficient and more useful.
Linus Torvalds [Mon, 11 Apr 2005 23:42:13 +0000 (16:42 -0700)]
Make "rev-tree" more efficient and more useful.

Slight change of output format: it now lists all parents on the same line.

This allows it to work on initial commits too (which have no parents), and
also makes the output format a lot more intuitive.

16 years agoRename ".dircache" directory to ".git"
Linus Torvalds [Mon, 11 Apr 2005 22:47:57 +0000 (15:47 -0700)]
Rename ".dircache" directory to ".git"

I started out calling the tool "dircache". That's clearly moronic.

16 years agoFix stale index.lock file removal using "atexit()".
Linus Torvalds [Mon, 11 Apr 2005 22:39:26 +0000 (15:39 -0700)]
Fix stale index.lock file removal using "atexit()".

Problem noted by Randy Dunlap.

16 years agoAdd a "rev-tree" helper, which calculates the revision
Linus Torvalds [Mon, 11 Apr 2005 20:55:10 +0000 (13:55 -0700)]
Add a "rev-tree" helper, which calculates the revision
tree graph.

It's quite fast when the commit-objects are cached, but since
it has to walk every single commit-object, it also allows you
to cache an old state and just add on top of that.

16 years agoFix "usage()" to do the missing line termination.
Linus Torvalds [Mon, 11 Apr 2005 20:53:49 +0000 (13:53 -0700)]
Fix "usage()" to do the missing line termination.

It got broken when I changed it to use stdarg.

16 years agoFix "update-cache" not fixing up the size field as appropriate.
Linus Torvalds [Mon, 11 Apr 2005 18:33:58 +0000 (11:33 -0700)]
Fix "update-cache" not fixing up the size field as appropriate.

The size field isn't in the tree information, so we need to
update it if the sha1 matches.

16 years agoMake the default directory permissions more lax.
Linus Torvalds [Mon, 11 Apr 2005 17:24:41 +0000 (10:24 -0700)]
Make the default directory permissions more lax.

After all, if you want to not allow others to read your
stuff, set your "umask" appropriately or make sure the
parent directories aren't readable/executable.

16 years agoAdd a COPYING notice, making it explicit that the license is GPLv2.
Linus Torvalds [Mon, 11 Apr 2005 17:18:16 +0000 (10:18 -0700)]
Add a COPYING notice, making it explicit that the license is GPLv2.

Let's bite the v3 bullet when it comes, although if people want to,
they can just state "or later at discretion of Linus" in their copyright

16 years agoMake "update-cache --refresh" do what it really should do: just
Linus Torvalds [Mon, 11 Apr 2005 16:39:21 +0000 (09:39 -0700)]
Make "update-cache --refresh" do what it really should do: just
refresh the "stat" information.

We need this after having done a "read-tree", for example, when the
stat information does not match the checked-out tree, and we want to
start getting efficient cache matching against the parts of the tree
that are already up-to-date.

16 years agoFix up commit-tree/diff-tree user interface issues.
Linus Torvalds [Mon, 11 Apr 2005 15:37:17 +0000 (08:37 -0700)]
Fix up commit-tree/diff-tree user interface issues.

No, this doesn't make them easy to use, but makes diff-tree use
the "-r" flag for "recursive" (not "-R") and makes commit-tree
use AUTHOR_xxx environment flags (not COMMITTER_xxx) to match what
it actually does.

16 years agoOops. Fix bad initialization of the "seen" array, causing us to not
Linus Torvalds [Mon, 11 Apr 2005 06:33:52 +0000 (23:33 -0700)]
Oops. Fix bad initialization of the "seen" array, causing us to not
properly clear the reference count at init time. It happened to work
for me by pure luck.

Until it broke, and my unreferenced commit suddenly looked referenced
again. Fixed.

16 years agoOops, the actual 'printf' for missing objects was missing.
Linus Torvalds [Mon, 11 Apr 2005 06:22:59 +0000 (23:22 -0700)]
Oops, the actual 'printf' for missing objects was missing.

Which made fsck very quiet about objects it hadn't found. So add

We'll need to make things like these optional, because it's
perfectly ok to have partial history if you don't want it,
and don't want to go backwards. But for development, it's best
to always complain about missing sha1 object files that are
referenced from somewhere else.

16 years agoAdd connectivity tracking to fsck.
Linus Torvalds [Mon, 11 Apr 2005 06:13:09 +0000 (23:13 -0700)]
Add connectivity tracking to fsck.

This shows that I've lost track of one commit already. Most likely
because I forgot to update the .dircache/HEAD file when doing a
commit, so that the next commit referenced not the top-of-tree, but
the one older commit.

Having dangling commits is fine (in fact, you should always have
at least _one_ dangling commit in the top-of-tree). But it's
good to know about them.

16 years agoFix off-by-one error in removal of cache entry.
Linus Torvalds [Mon, 11 Apr 2005 05:06:50 +0000 (22:06 -0700)]
Fix off-by-one error in removal of cache entry.

Also make the return value of "cache_name_pos()" be sane: positive
or zero if we found it (it's the index into the cache array), and
"-pos-1" to indicate where it should go if we didn't.