Commit graph

41 commits

Author SHA1 Message Date
Brad Roberts 5d728c8411 Rename cache_match_stat() to ce_match_stat()
Signed-off-by: Brad Roberts <braddr@puremagic.com>
Signed-off-by: Petr Baudis <pasky@ucw.cz>
2005-05-15 12:26:25 +02:00
Petr Baudis 62d046a07b Stick a comment to update-cache.c:refresh_cache() that you can't
just free(archive_cache[i]) when replacing it there.
2005-05-11 22:45:42 +02:00
Ingo Molnar cb1da3a794 [patch] git: fix overflow in update-cache.c
this patch fixes a 1-byte overflow in update-cache.c (probably not
exploitable). A specially crafted db object might trigger this overflow.

the bug is that normally the 'type' field is parsed by read_sha1_file(),
via:

	if (sscanf(buffer, "%10s %lu", type, size) != 2)

i.e. 0-10 long strings, which take 1-11 bytes of space. Normally the
type strings are stored in char [20] arrays, but in update-cache.c that
is char [10], so a 1 byte overflow might occur.

This should not happen with a 'friendly' DB, as the longest type string
("commit") is 7 bytes long. The fix is to use the customary char [20].

(someone might want to clean those open-coded constants up with a
TYPE_LEN define, they do tend to cause problems like this. I'm not
against open-coded constants (they make code much more readable), but
for fields that get filled in from possibly hostile objects this is
playing with fire.)

hey, this might be the first true security fix for GIT? ;-)

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Petr Baudis <pasky@ucw.cz>
2005-05-11 22:43:24 +02:00
Petr Baudis 071c41a047 Make update-cache be explicit about failed open() when doing
add_file_to_cache().
2005-05-11 22:37:58 +02:00
Junio C Hamano b3f94c4b55 Fix git-update-cache --cacheinfo error message.
The error detection logic was too lazy to distinguish parameter
error and unable-to-add case.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-05-08 15:31:33 -07:00
Junio C Hamano 4c5abf4282 Allow removal of "path" when "path/file" exists.
When we used to have "path" as a file or a symlink, but now we
have "path/file" (or in general, have "path" as a directory), we
would want to remove "path" before adding "path/file".  The
logic in add_file_to_cache() only runs lstat() and does not
detect this case and fails to allow removing it in this case.
In the opposite case of having "path/file" in the index and
having "path" on the filesystem as a file or a symlink we do
allow removal of "path/file", so to be symmetric we should allow
it as well, without forcing the user to say --force-remove.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-05-08 00:05:18 -07:00
Junio C Hamano 192268c197 Add git-update-cache --replace option.
When "path" exists as a file or a symlink in the index, an
attempt to add "path/file" is refused because it results in file
vs directory conflict.  Similarly when "path/file1",
"path/file2", etc. exist, an attempt to add "path" as a file or
a symlink is refused.  With git-update-cache --replace, these
existing entries that conflict with the entry being added are
automatically removed from the cache, with warning messages.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-05-07 21:55:21 -07:00
Linus Torvalds ee267527aa Revert bogus optimization that avoids index file writes
It didn't properly mark all cache updates as being dirty, and
causes merge errors due to that. In particular, it didn't notice
when a file was force-removed.

Besides, it was ugly as hell. I've put in place a slightly cleaner
version, but I've not enabled the optimization because I don't
want to be burned again.
2005-05-06 16:48:43 -07:00
Linus Torvalds 22b781051b update-cache: remove compiler warning
"Unused variable len"
2005-05-06 08:49:07 -07:00
Kay Sievers ffbe1addd5 [PATCH] fix compare symlink against readlink not data
Fix update-cache to compare the blob of a symlink against the link-target
and not the file it points to. Also ignore all permissions applied to
links.

Thanks to Greg for recognizing this while he added our list of symlinks
back to the udev repository.

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-06 08:41:12 -07:00
Junio C Hamano c4b83e618f Do not write out new index if nothing has changed.
The git-update-cache command, especially with --refresh, may not change
anything.  In such a case, writing 1.6MB of the same thing is a waste.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-05-05 15:29:06 -07:00
Kay Sievers 8ae0a8c514 [PATCH] git and symlinks as tracked content
Allow to store and track symlink in the repository. A symlink is stored
the same way as a regular file, only with the appropriate mode bits set.
The symlink target is therefore stored in a blob object.
This will hopefully make our udev repository fully functional. :)

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-05 08:23:01 -07:00
Junio C Hamano 0ff5bf7cfc Implement git-update-cache --force-remove <path>
This new flag tells git-update-cache to remove the named path even
when the work tree still happens to have the file.  It is used to
update git-merge-one-file-script not to smudge the work tree.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-05-01 23:50:51 -07:00
Junio C Hamano 74400e7175 Add git-write-blob.
A new command, git-write-blob, is introduced.  This registers
the contents of any file on the filesystem as a blob in the
object database and reports its SHA1 to the standard output.
To implement it, the patch promotes index_fd() from a static
function in update-cache.c to extern and moves it to a library
source, sha1_file.c.

This command is used to update git-merge-one-file-script so that
it does not smudge the work tree.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-05-01 23:45:49 -07:00
Junio C Hamano 90535218dd [PATCH] Make git-update-cache --refresh fail if update/merge needed.
Scripts may find it useful if they do not have to parse the
output from the command but just can rely on its exit status.

Earlier both Linus and myself thought this would be necessary to
make git-prune-script safer but it turns out that the issue was
somewhere else and not related to what this patch addresses.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-01 21:07:40 -07:00
Junio C Hamano e2a669bb2e [PATCH] Allow removing files in a subdirectory.
I found this during a conflict merge testing.  The original did
not have either DF (a file) or DF/DF (a file DF/DF under a
directory DF).  One side created DF, the other created DF/DF.  I
first resolved DF as a new file by taking what the first side
did.  After that, the entry DF/DF cannot be resolved by running
git-update-cache --remove although it does not exist on the
filesystem.

    $ /bin/ls -F
    AN  DF  MN  NM  NN  SS  Z/
    $ git-ls-files --stage | grep DF
    100644 71420ab81e254145d26d6fc0cddee64c1acd4787 0 DF
    100644 68a6d8b91da11045cf4aa3a5ab9f2a781c701249 2 DF/DF
    $ git-update-cache --remove DF/DF
    fatal: Unable to add DF/DF to database

It turns out that the errno from open() in this case was not
ENOENT but ENOTDIR, which the code did not check.  Here is a
fix.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-01 09:33:12 -07:00
Christopher Li 812666c8e6 [PATCH] introduce xmalloc and xrealloc
Introduce xmalloc and xrealloc to die gracefully with a descriptive
message when out of memory, rather than taking a SIGSEGV. 

Signed-off-by: Christopher Li<chrislgit@chrisli.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-04-26 12:00:58 -07:00
Linus Torvalds f2a19340ad update-cache: remove index lock file on SIGINT
This makes it a lot more pleasant to use when you
interrupt a long-running operation.
2005-04-26 11:55:42 -07:00
James Bottomley c6e007b094 [PATCH] update-cache: add "--ignore-missing" option
This adds an --ignore-missing option to update-cache, which makes it
ignore missing files.  Together with the "-n" option to checkout-cache,
it allows me to do

    checkout-cache -n -f -a && update-cache --ignore-missing --refresh

which only updates and refreshes the files I already have checked out.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-04-24 15:14:16 -07:00
Linus Torvalds bb233d690a Add support for a "GIT_INDEX_FILE" environment variable.
We use that to specify alternative index files, which can be useful
if you want to (for example) generate a temporary index file to do
some specific operation that you don't want to mess with your main
one with.

It defaults to the regular ".git/index" if it hasn't been specified.
2005-04-21 10:55:18 -07:00
Linus Torvalds f18ca73166 The recent hash/compression switch-over missed the blob creation.
Happily, convert-cache just magically fixes all errors.
2005-04-20 01:34:54 -07:00
Junio C Hamano 1bc992acac [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 <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-04-18 10:42:48 -07:00
Junio C Hamano c747fc6fac [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
debugging.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-04-17 10:02:22 -07:00
Linus Torvalds e44794706e 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
decide.
2005-04-16 22:26:31 -07:00
Linus Torvalds f5cabd13d8 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
merge.
2005-04-15 21:45:38 -07:00
Linus Torvalds 9945d98051 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.
2005-04-15 11:08:33 -07:00
Linus Torvalds ccc4feb579 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).
2005-04-15 10:44:27 -07:00
Petr Baudis 5ade862839 [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 <pasky@ucw.cz>
2005-04-13 02:38:44 -07:00
Ingo Molnar aebb267908 [PATCH] Whitespace Fixes
Trivial whitespace fixes.

From: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Petr Baudis <pasky@ucw.cz>
2005-04-13 02:35:04 -07:00
Petr Baudis 2de381f919 [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 <pasky@ucw.cz>
2005-04-13 02:28:48 -07:00
Linus Torvalds 3607c27f5f Allow zero-sized files to be checked in.
The kernel may not want it, but others probably do.

Noted (again) by Junio Hamano.
2005-04-11 18:02:00 -07:00
Linus Torvalds 4bb04f2190 Rename ".dircache" directory to ".git"
I started out calling the tool "dircache". That's clearly moronic.
2005-04-11 15:47:57 -07:00
Linus Torvalds 9614b8dcf8 Fix stale index.lock file removal using "atexit()".
Problem noted by Randy Dunlap.
2005-04-11 15:39:26 -07:00
Linus Torvalds 32d197f18d 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.
2005-04-11 11:33:58 -07:00
Linus Torvalds 711cf3a026 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.
2005-04-11 09:39:21 -07:00
Linus Torvalds 121481abf8 Make "update-cache" a bit friendlier to use (and harder to mis-use).
It now requires the "--add" flag before you add any new files, and
a "--remove" file if you want to mark files for removal. And giving
it the "--refresh" flag makes it just update all the files that it
already knows about.
2005-04-10 11:32:54 -07:00
Linus Torvalds 197ee8c970 Make "write_cache()" and friends available as generic routines.
This is needed for the change to make "read-tree" just read into the
cache (and then you do a "checkout-cache" to update your current dir
contents).
2005-04-09 12:09:27 -07:00
Linus Torvalds eb38c22f53 Make "cache_name_pos()" available to others.
It finds the cache entry position for a given name, and is
generally useful. Sure, everybody can just scan the active
cache array, but since it's sorted, you actually want to
search it with a binary search, so let's not duplicate that
logic all over the place.
2005-04-09 09:26:55 -07:00
Linus Torvalds 19b2860cba Use "-Wall -O2" for the compiler to get more warnings.
And fix up the warnings that it pointed out. Let's keep the tree
clean from early on.

Not that the code is very beautiful anyway ;)
2005-04-08 09:59:28 -07:00
Linus Torvalds 8bc9a0c769 Add copyright notices.
The tool interface sucks (especially "committing" information, which is just
me doing everything by hand from the command line), but I think this is in
theory actually a viable way of describing the world. So copyright it.
2005-04-07 15:16:10 -07:00
Linus Torvalds e83c516331 Initial revision of "git", the information manager from hell 2005-04-07 15:13:13 -07:00