1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-11-06 17:23:00 +01:00
Commit graph

2508 commits

Author SHA1 Message Date
Linus Torvalds
0910e8cab8 Optimize common case of git-rev-list
I took a look at webgit, and it looks like at least for the "projects"
page, the most common operation ends up being basically

	git-rev-list --header --parents --max-count=1 HEAD

Now, the thing is, the way "git-rev-list" works, it always keeps on
popping the parents and parsing them in order to build the list of
parents, and it turns out that even though we just want a single commit,
git-rev-list will invariably look up _three_ generations of commits.

It will parse:
 - the commit we want (it obviously needs this)
 - it's parent(s) as part of the "pop_most_recent_commit()" logic
 - it will then pop one of the parents before it notices that it doesn't
   need any more
 - and as part of popping the parent, it will parse the grandparent (again
   due to "pop_most_recent_commit()".

Now, I've strace'd it, and it really is pretty efficient on the whole, but
if things aren't nicely cached, and with long-latency IO, doing those two
extra objects (at a minimum - if the parent is a merge it will be more) is
just wasted time, and potentially a lot of it.

So here's a quick special-case for the trivial case of "just one commit,
and no date-limits or other special rules".

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-19 00:01:01 -07:00
H. Peter Anvin
e51fd86ab3 revised^2: git-daemon extra paranoia, and path DWIM
This patch adds some extra paranoia to the git-daemon filename test.  In
particular, it now rejects pathnames containing //; it also adds a
redundant test for pathname absoluteness (belts and suspenders.)

A single / at the end of the path is still permitted, however, and the
.git and /.git append DWIM stuff is now handled in an integrated manner,
which means the resulting path will always be subjected to pathname checks.

[jc: backported to 0.99.8 maintenance branch]

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-19 00:01:01 -07:00
Linus Torvalds
844ac7f818 git-fetch-pack: avoid unnecessary zero packing
If everything is up-to-date locally, we don't need to even ask for a
pack-file from the remote, or try to unpack it.

This is especially important for tags - since the pack-file common commit
logic is based purely on the commit history, it will never be able to find
a common tag, and will thus always end up re-fetching them.

Especially notably, if the tag points to a non-commit (eg a tagged tree),
the pack-file would be unnecessarily big, just because it cannot any most
recent common point between commits for pruning.

Short-circuiting the case where we already have that reference means that
we avoid a lot of these in the common case.

NOTE! This only matches remote ref names against the same local name,
which works well for tags, but is not as generic as it could be. If we
ever need to, we could match against _any_ local ref (if we have it, we
have it), but this "match against same name" is simpler and more
efficient, and covers the common case.

Renaming of refs is common for branch heads, but since those are always
commits, the pack-file generation can optimize that case.

In some cases we might still end up fetching pack-files unnecessarily, but
this at least avoids the re-fetching of tags over and over if you use a
regular

	git fetch --tags ...

which was the main reason behind the change.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 23:52:08 -07:00
Junio C Hamano
ea5a65a599 Do not ask for objects known to be complete.
On top of optimization by Linus not to ask refs that already match, we
can walk our refs and not issue "want" for things that are known to be
reachable from them.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 18:42:19 -07:00
Junio C Hamano
f8765797a4 Even when overwriting tags, report if they are changed or not.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 18:42:14 -07:00
Linus Torvalds
fe5f51ce27 Optimize common case of git-rev-list
I took a look at webgit, and it looks like at least for the "projects"
page, the most common operation ends up being basically

	git-rev-list --header --parents --max-count=1 HEAD

Now, the thing is, the way "git-rev-list" works, it always keeps on
popping the parents and parsing them in order to build the list of
parents, and it turns out that even though we just want a single commit,
git-rev-list will invariably look up _three_ generations of commits.

It will parse:
 - the commit we want (it obviously needs this)
 - it's parent(s) as part of the "pop_most_recent_commit()" logic
 - it will then pop one of the parents before it notices that it doesn't
   need any more
 - and as part of popping the parent, it will parse the grandparent (again
   due to "pop_most_recent_commit()".

Now, I've strace'd it, and it really is pretty efficient on the whole, but
if things aren't nicely cached, and with long-latency IO, doing those two
extra objects (at a minimum - if the parent is a merge it will be more) is
just wasted time, and potentially a lot of it.

So here's a quick special-case for the trivial case of "just one commit,
and no date-limits or other special rules".

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 18:41:28 -07:00
H. Peter Anvin
3e04c62daa revised^2: git-daemon extra paranoia, and path DWIM
This patch adds some extra paranoia to the git-daemon filename test.  In
particular, it now rejects pathnames containing //; it also adds a
redundant test for pathname absoluteness (belts and suspenders.)

A single / at the end of the path is still permitted, however, and the
.git and /.git append DWIM stuff is now handled in an integrated manner,
which means the resulting path will always be subjected to pathname checks.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 18:26:52 -07:00
Junio C Hamano
5e5f8091e5 Remove unused include.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 15:41:43 -07:00
Linus Torvalds
2759cbc774 git-fetch-pack: avoid unnecessary zero packing
If everything is up-to-date locally, we don't need to even ask for a
pack-file from the remote, or try to unpack it.

This is especially important for tags - since the pack-file common commit
logic is based purely on the commit history, it will never be able to find
a common tag, and will thus always end up re-fetching them.

Especially notably, if the tag points to a non-commit (eg a tagged tree),
the pack-file would be unnecessarily big, just because it cannot any most
recent common point between commits for pruning.

Short-circuiting the case where we already have that reference means that
we avoid a lot of these in the common case.

NOTE! This only matches remote ref names against the same local name,
which works well for tags, but is not as generic as it could be. If we
ever need to, we could match against _any_ local ref (if we have it, we
have it), but this "match against same name" is simpler and more
efficient, and covers the common case.

Renaming of refs is common for branch heads, but since those are always
commits, the pack-file generation can optimize that case.

In some cases we might still end up fetching pack-files unnecessarily, but
this at least avoids the re-fetching of tags over and over if you use a
regular

	git fetch --tags ...

which was the main reason behind the change.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 11:35:17 -07:00
Johannes Schindelin
5f93926c3c No funny names on cygwin...
On FAT/NTFS, filenames cannot contain tabs. So t3300-funny-names would
reliably fail already when trying to create such files.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 11:35:17 -07:00
Johannes Schindelin
542a01e489 Ignore more generated files
Since git-status now shows the "other" files, too, bring .gitignore
up-to-date.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 11:35:17 -07:00
Johannes Schindelin
e175768954 Fix cvsimport warning when called without --no-cvs-direct
Perl was warning that $opt_p was undefined in that case.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 11:35:16 -07:00
Junio C Hamano
4aaa702794 git-checkout: revert specific paths to either index or a given tree-ish.
When extra paths arguments are given, git-checkout reverts only those
paths to either the version recorded in the index or the version
recorded in the given tree-ish.

This has been on the TODO list for quite a while.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 01:29:27 -07:00
Junio C Hamano
4bfe1199ea Teach git-add and git-commit to handle filenames starting with '-'.
Recent '--' fixes to "git diff" by Linus made it possible to specify
filenames that start with '-'.  But in order to do that, you need to
be able to add and commit such file to begin with.

Teach git-add and git-commit to honor the same '--' convention.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 00:27:50 -07:00
Linus Torvalds
694a764fc2 Handle "-" at beginning of filenames, part 3
This fixes the default built-in exec() of "diff" to add a "--" before the
filenames, so that if a filename starts with a "-", the diff program won't
think it's an option.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 00:16:45 -07:00
Linus Torvalds
ea51d416c0 Teach "git diff" to handle filenames starting with '-'
It adds "--" to the git-diff.sh scripts, to keep any filenames that start
with a "-" from being confused with an option.

But in order to do that, it needs to teach git-diff-files to honor "--".

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 00:16:45 -07:00
Linus Torvalds
7a3dd472ad Avoid ambiguity between refname and filename in rev-parse
Although it really is very convenient, not requiring explicit
'-r' option to name revs is sometimes ambiguous.

Usually we allow a "--" to say where a filename starts when it
_is_ ambiguous.  However, we fail that at times. In particular,
git-rev-parse fails it.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-18 00:16:45 -07:00
Junio C Hamano
c99ec048bf GIT 0.99.8e
Linus Torvalds:
      make checkout-index '-a' flag saner.

Junio C Hamano:
      whatchanged: document -m option from git-diff-tree.
      Functions to quote and unquote pathnames in C-style.
      Update git-apply to use C-style quoting for funny pathnames.
      Do not quote SP.
      git-checkout-index: documentation updates.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 21:52:10 -07:00
Junio C Hamano
cdb3950801 Forward port the "funny ref avoidance" in clone and fetch from maint branch.
Somehow I forgot to forward port these fixes.  "git clone" from a
repository prepared with the latest update-server-info would fail
without this patch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 21:47:06 -07:00
Junio C Hamano
508c1d1c9b Adjust tests for not quoting SP.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:59 -07:00
Junio C Hamano
28fba290e3 Do not quote SP.
Follow the "encode minimally" principle -- our tools, including
git-apply and git-status, can handle pathnames with embedded SP just
fine.  The only problematic ones are TAB and LF, and we need to quote
the metacharacters introduced for quoting.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:58 -07:00
Junio C Hamano
58452f9442 git-apply: remove unused --show-files flag.
Linus says he does not use it (and the thinking behind its initial
introduction), and neither Cogito nor StGIT uses it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:58 -07:00
Junio C Hamano
973d6a2015 update-index --index-info: adjust for funny-path quoting.
Although the sole current user uses -z to read this, we should be
prepared for somebody to feed non-z format to the command.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:57 -07:00
Junio C Hamano
4d2060efeb Add tests for funny pathnames.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:57 -07:00
Junio C Hamano
d88156e943 Update documentation for C-style quoting.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:56 -07:00
Junio C Hamano
71ac8356d8 Update git-status to new git-diff-* and git-ls-files output.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:56 -07:00
Junio C Hamano
cf9dfc669e Update git-diff-* to use C-style quoting for funny pathnames.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:56 -07:00
Junio C Hamano
caf4f582b2 Improve "git add" again.
This makes it possible to add paths that have funny characters (TAB
and LF) in them, and makes adding many paths more efficient in
general.

New flag "--stdin" to update-index was initially added for different
purpose, but it turns out to be a perfect match for feeding "ls-files
--others -z" output to improve "git add".

It also adds "--verbose" flag to update-index for use with "git add"
command.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:55 -07:00
Junio C Hamano
22ddf71979 Update ls-files and ls-tree to use C-style quoting for funny pathnames.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:55 -07:00
Junio C Hamano
22943f1a52 Update git-apply to use C-style quoting for funny pathnames.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:54 -07:00
Junio C Hamano
4f6fbcdcf9 Functions to quote and unquote pathnames in C-style.
Following the list discussion, define two functions, quote_c_style and
unquote_c_style, to help adopting the proposed way for quoting funny
pathname letters for GNU patch.  The rule is described in:

    http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2

Currently we do not support the leading '!', but we probably should
barf upon seeing it.  Rule B4. is interpreted to require always 3
octal digits in \XYZ notation.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:41:54 -07:00
Junio C Hamano
2b2dabc29f Merge branch 'fixes' 2005-10-17 17:41:37 -07:00
Junio C Hamano
82ed2bcd92 Merge branch 'fixes' 2005-10-17 17:39:11 -07:00
Junio C Hamano
fd25c82a80 git-checkout-index: documentation updates.
Now the behaviour of '-a' has been straightened out, document it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:38:09 -07:00
Linus Torvalds
a65a686f49 make checkout-index '-a' flag saner.
The original semantics of pretending as if all files were
specified where '-a' appeared and using only the flags given so
far was too confusing.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 17:32:12 -07:00
Junio C Hamano
25785195ee Do not quote SP.
Follow the "encode minimally" principle -- our tools, including
git-apply and git-status, can handle pathnames with embedded SP just
fine.  The only problematic ones are TAB and LF, and we need to quote
the metacharacters introduced for quoting.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-17 13:34:42 -07:00
Junio C Hamano
622ef9df19 ref-format documentation.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 22:41:59 -07:00
Junio C Hamano
b8041fe4d8 Sparse-directory safety fix.
This will be removed when merging the second phase of Linus' "Create
object subdirectories on demand" change anyway, but the code to
recreate the empty .git/objects/??/ directory was confused.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 14:09:50 -07:00
Junio C Hamano
f865a2ad98 Merge branch 'fixes' 2005-10-16 12:23:59 -07:00
Junio C Hamano
b71d01ef3c Merge branch 'fixes' 2005-10-16 12:21:38 -07:00
Junio C Hamano
a34484e1c9 We do not depend on patch.
Deb packaging claim we depend on patch, but I think we use git-apply
where it matters.  When a patch does not apply with git-apply, using
GNU patch still is helpful sometimes.  So demote it from "Depends" to
"Suggests".

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 12:01:28 -07:00
Junio C Hamano
29504118f8 Merge branch 'svn' of http://netz.smurf.noris.de/git/git
[jc: I have my pre-commit hook enabled to catch trailing whitespaces,
 and fixed them up while merging.]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 11:55:35 -07:00
Junio C Hamano
ea56188a24 Update git-apply to use C-style quoting for funny pathnames.
This is a backport so that maintenance branch can understand
diff output that uses C-style quoting produced by newer tools.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 11:05:14 -07:00
Junio C Hamano
585793d96c Functions to quote and unquote pathnames in C-style.
Following the list discussion, define two functions, quote_c_style and
unquote_c_style, to help adopting the proposed way for quoting funny
pathname letters for GNU patch.  The rule is described in:

    http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2

Currently we do not support the leading '!', but we probably should
barf upon seeing it.  Rule B4. is interpreted to require always 3
octal digits in \XYZ notation.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 10:58:30 -07:00
Matthias Urlichs
40dad96e41 svn commit: re-word the exit-due-to-memory-leak message
Reworded the exit message, as per Kalle Valo's suggestion (but shorter).

Signed-Off-By: Matthias Urlichs <smurf@smurf.noris.de>
2005-10-16 19:57:38 +02:00
Kalle Valo
f005dba7c1 Makefile entry for git-svnimport contained a small typo.
Signed-Off-By: Matthias Urlichs <smurf@smurf.noris.de>
2005-10-16 19:37:25 +02:00
Junio C Hamano
6abf5c0c6f Squelch compiler warnings from connect.c
Forgot to include necessary header file to get the function declaration.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 00:25:26 -07:00
Junio C Hamano
c09a69a83e Disable hooks during tests.
Individual tests for hooks would want to have their own tests when
written.  Also we should not pick up from random templates the user
happens to have.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 00:24:34 -07:00
Peter Hagervall
f5dce80611 Sparse fixes for http-fetch
This patch cleans out all sparse warnings from http-fetch.c

I'm a bit uncomfortable with adding extra #ifdefs to avoid either
'mixing declaration with code' or 'unused variable' warnings, but I
figured that since those functions are already littered with #ifdefs I
might just get away with it. Comments?

[jc: I adjusted Peter's patch to address uncomfortableness issues.]

Signed-off-by: Peter Hagervall <hager@cs.umu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-16 00:01:08 -07:00
Junio C Hamano
15fad5f4d7 whatchanged: document -m option from git-diff-tree.
The documentation for git-whatchanged is meant to describe only
the most frequently used options from git-diff-tree.  Because "why
doesn't it show merges" was asked more than once, we'd better
describe '-m' option there.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-10-15 23:49:27 -07:00