gitweb.git
builtin-reflog.c: don't install new reflog on write... Brandon Casey Fri, 22 Feb 2008 18:47:08 +0000 (12:47 -0600)

builtin-reflog.c: don't install new reflog on write failure

When expiring reflog entries, a new temporary log is written which contains
only the entries to retain. After it is written, it is renamed to replace
the existing reflog. Currently, we check that writing of the new log is
successful and print a message on failure, but the original reflog is still
replaced with the new reflog even on failure. This patch causes the
original reflog to be retained if we fail when writing the new reflog.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

send-email: fix In-Reply-To regressionJay Soffian Fri, 22 Feb 2008 00:16:04 +0000 (19:16 -0500)

send-email: fix In-Reply-To regression

Fix a regression introduced by

1ca3d6e (send-email: squelch warning due to comparing undefined $_ to "")

where if the user was prompted for an initial In-Reply-To and didn't
provide one, messages would be sent out with an invalid In-Reply-To of
"<>"

Also add test cases for the regression and the fix. A small modification
was needed to allow send-email to take its replies from stdin if the
environment variable GIT_SEND_EMAIL_NOTTY is set.

Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

gitweb: Clearly distinguish regexp / exact match searchesPetr Baudis Tue, 26 Feb 2008 12:22:08 +0000 (13:22 +0100)

gitweb: Clearly distinguish regexp / exact match searches

This patch does a couple of things:

* Makes commit/author/committer search case insensitive

To be consistent with the grep search; I see no convincing
reason for the search to be case sensitive, and you might
get in trouble especially with contributors e.g. from Japan
or France where they sometimes like to uppercase their last
name.

* Makes grep search by default search for fixed strings.

* Introduces 're' checkbox that enables POSIX extended regexp searches

This works for all the search types. The idea comes from Jakub.

It does not make much sense (and is not easy at all) to untangle most
of these changes from each other, thus they all go in a single patch.

[jn: Cherry-picked from Pasky's http://repo.or.cz/git/gitweb.git]

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

gitweb: Simplify fixed string searchJakub Narebski Tue, 26 Feb 2008 12:22:07 +0000 (13:22 +0100)

gitweb: Simplify fixed string search

Use '--fixed-strings' option to git-rev-list to simplify and improve
searching commit messages (commit search). It allows to search for
example for "don't" successfully from gitweb.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

gitweb: Change parse_commits signature to allow for... Jakub Narebski Tue, 26 Feb 2008 12:22:06 +0000 (13:22 +0100)

gitweb: Change parse_commits signature to allow for multiple options

Change order of parameters in parse_commits() to have $filename
before @args (extra options), to allow for multiple extra options,
for example both '--grep=<pattern>' and '--fixed-strings'.

Change all callers to follow new calling convention.

Originally by Petr Baudis, in http://repo.or.cz/git/gitweb.git:

b98f0a7c gitweb: Clearly distinguish regexp / exact match searches

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-svn: Don't prompt for client cert password everytime.Sebastian Noack Mon, 25 Feb 2008 14:56:28 +0000 (15:56 +0100)

git-svn: Don't prompt for client cert password everytime.

Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git.el: Do not display empty directories.Alexandre Julliard Fri, 22 Feb 2008 15:48:53 +0000 (16:48 +0100)

git.el: Do not display empty directories.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Tested-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'jm/free'Junio C Hamano Wed, 27 Feb 2008 21:03:50 +0000 (13:03 -0800)

Merge branch 'jm/free'

* jm/free:
Avoid unnecessary "if-before-free" tests.

Conflicts:

builtin-branch.c

Merge branch 'js/branch-track'Junio C Hamano Wed, 27 Feb 2008 21:02:57 +0000 (13:02 -0800)

Merge branch 'js/branch-track'

* js/branch-track:
doc: documentation update for the branch track changes
branch: optionally setup branch.*.merge from upstream local branches

Conflicts:

Documentation/config.txt
Documentation/git-branch.txt
Documentation/git-checkout.txt
builtin-branch.c
cache.h
t/t7201-co.sh

Merge branch 'db/checkout'Junio C Hamano Wed, 27 Feb 2008 20:53:26 +0000 (12:53 -0800)

Merge branch 'db/checkout'

* db/checkout: (21 commits)
checkout: error out when index is unmerged even with -m
checkout: show progress when checkout takes long time while switching branches
Add merge-subtree back
checkout: updates to tracking report
builtin-checkout.c: Remove unused prefix arguments in switch_branches path
checkout: work from a subdirectory
checkout: tone down the "forked status" diagnostic messages
Clean up reporting differences on branch switch
builtin-checkout.c: fix possible usage segfault
checkout: notice when the switched branch is behind or forked
Build in checkout
Move code to clean up after a branch change to branch.c
Library function to check for unmerged index entries
Use diff -u instead of diff in t7201
Move create_branch into a library file
Build-in merge-recursive
Add "skip_unmerged" option to unpack_trees.
Discard "deleted" cache entries after using them to update the working tree
Send unpack-trees debugging output to stderr
Add flag to make unpack_trees() not print errors.
...

Conflicts:

Makefile

Merge branch 'db/cover-letter'Junio C Hamano Wed, 27 Feb 2008 20:06:41 +0000 (12:06 -0800)

Merge branch 'db/cover-letter'

* db/cover-letter:
Improve collection of information for format-patch --cover-letter
Add API access to shortlog
t4014: Replace sed's non-standard 'Q' by standard 'q'
Support a --cc=<email> option in format-patch
Combine To: and Cc: headers
Fix format.headers not ending with a newline
Add tests for extra headers in format-patch
Add a --cover-letter option to format-patch
Export some email and pretty-printing functions
Improve message-id generation flow control for format-patch
Add more tests for format-patch

Conflicts:

builtin-log.c
builtin-shortlog.c
pretty.c

git-svn: Don't prompt for client cert password everytime.Sebastian Noack Mon, 25 Feb 2008 14:56:28 +0000 (15:56 +0100)

git-svn: Don't prompt for client cert password everytime.

Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'js/merge'Junio C Hamano Wed, 27 Feb 2008 19:57:19 +0000 (11:57 -0800)

Merge branch 'js/merge'

* js/merge:
xdl_merge(): introduce XDL_MERGE_ZEALOUS_ALNUM
xdl_merge(): make XDL_MERGE_ZEALOUS output simpler

Merge branch 'cw/bisect'Junio C Hamano Wed, 27 Feb 2008 19:56:08 +0000 (11:56 -0800)

Merge branch 'cw/bisect'

* cw/bisect:
Eliminate confusing "won't bisect on seeked tree" failure

Merge branch 'jk/help-alias'Junio C Hamano Wed, 27 Feb 2008 19:55:43 +0000 (11:55 -0800)

Merge branch 'jk/help-alias'

* jk/help-alias:
help: respect aliases
make alias lookup a public, procedural function
help: use parseopt

Merge branch 'js/run-command'Junio C Hamano Wed, 27 Feb 2008 19:55:32 +0000 (11:55 -0800)

Merge branch 'js/run-command'

* js/run-command:
start_command(), if .in/.out > 0, closes file descriptors, not the callers
start_command(), .in/.out/.err = -1: Callers must close the file descriptor

Merge branch 'jc/diff-relative'Junio C Hamano Wed, 27 Feb 2008 19:55:28 +0000 (11:55 -0800)

Merge branch 'jc/diff-relative'

* jc/diff-relative:
diff --relative: help working in a bare repository
diff --relative: output paths as relative to the current subdirectory

Merge branch 'gp/hash-stdin'Junio C Hamano Wed, 27 Feb 2008 19:55:22 +0000 (11:55 -0800)

Merge branch 'gp/hash-stdin'

* gp/hash-stdin:
hash-object: cleanup handling of command line options

Merge branch 'db/push-single-with-HEAD'Junio C Hamano Wed, 27 Feb 2008 19:54:28 +0000 (11:54 -0800)

Merge branch 'db/push-single-with-HEAD'

* db/push-single-with-HEAD:
Resolve value supplied for no-colon push refspecs

Merge branch 'db/host-alias'Junio C Hamano Wed, 27 Feb 2008 19:54:13 +0000 (11:54 -0800)

Merge branch 'db/host-alias'

* db/host-alias:
url rewriting: take longest and first match
Add support for url aliases in config files
Use ALLOC_GROW in remote.{c,h}

Merge branch 'ae/pack-autothread'Junio C Hamano Wed, 27 Feb 2008 19:54:03 +0000 (11:54 -0800)

Merge branch 'ae/pack-autothread'

* ae/pack-autothread:
Revert "pack-objects: Print a message describing the number of threads for packing"
pack-objects: Print a message describing the number of threads for packing
pack-objects: Add runtime detection of online CPU's

Merge branch 'bc/reflog-fix'Junio C Hamano Wed, 27 Feb 2008 19:53:48 +0000 (11:53 -0800)

Merge branch 'bc/reflog-fix'

* bc/reflog-fix:
builtin-reflog.c: don't install new reflog on write failure

Merge branch 'sp/describe'Junio C Hamano Wed, 27 Feb 2008 19:52:20 +0000 (11:52 -0800)

Merge branch 'sp/describe'

* sp/describe:
Use git-describe --exact-match in bash prompt on detached HEAD
Teach git-describe --exact-match to avoid expensive tag searches
Avoid accessing non-tag refs in git-describe unless --all is requested
Teach git-describe to use peeled ref information when scanning tags
Optimize peel_ref for the current ref of a for_each_ref callback

Fix 'git cvsexportcommit -w $cvsdir ...' when used... Johan Herland Mon, 11 Feb 2008 23:43:41 +0000 (00:43 +0100)

Fix 'git cvsexportcommit -w $cvsdir ...' when used with relative $GIT_DIR

When using the '-w $cvsdir' option to cvsexportcommit, it will chdir into
$cvsdir before executing several other git commands. If $GIT_DIR is set to
a relative path (e.g. '.'), the git commands executed by cvsexportcommit
will naturally fail.

Therefore, ensure that $GIT_DIR is absolute before the chdir to $cvsdir.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Add testcase for 'git cvsexportcommit -w $cvsdir .... Johan Herland Wed, 13 Feb 2008 03:11:22 +0000 (04:11 +0100)

Add testcase for 'git cvsexportcommit -w $cvsdir ...' with relative $GIT_DIR

The testcase verifies that 'git cvsexportcommit' functions correctly when
the '-w' option is used, and GIT_DIR is set to a relative path (e.g. '.').

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Prompt to continue when editing during rebase --interactiveJonathan del Strother Wed, 27 Feb 2008 12:50:22 +0000 (12:50 +0000)

Prompt to continue when editing during rebase --interactive

On hitting an edit point in an interactive rebase, git should prompt
the user to run "git rebase --continue"

Signed-off-by: Jonathan del Strother <jon.delStrother@bestbefore.tv>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation/git svn log: add a note about timezones.Miklos Vajna Wed, 27 Feb 2008 13:13:00 +0000 (14:13 +0100)

Documentation/git svn log: add a note about timezones.

git svn log mimics the timezone converting behaviour of svn log, but
this was undocumented.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'js/maint-http-push' into maintJunio C Hamano Wed, 27 Feb 2008 19:09:44 +0000 (11:09 -0800)

Merge branch 'js/maint-http-push' into maint

* js/maint-http-push:
http-push: avoid a needless goto
http-push: do not get confused by submodules
http-push: avoid invalid memory accesses

git-p4: Support usage of perforce client specTor Arvid Lund Mon, 18 Feb 2008 14:22:08 +0000 (15:22 +0100)

git-p4: Support usage of perforce client spec

When syncing, git-p4 will only download files that are included in the active
perforce client spec. This does not change the default behaviour - it requires
that the user either supplies the command line argument --use-client-spec, or
sets the git config option p4.useclientspec to "true".

Signed-off-by: Tor Arvid Lund <torarvid@gmail.com>
Signed-off-by: Simon Hausmann <simon@lst.de>

git-p4: git-p4 submit cleanups.Simon Hausmann Tue, 19 Feb 2008 08:37:16 +0000 (09:37 +0100)

git-p4: git-p4 submit cleanups.

Removed storing the list of commits in a configuration file. We only need the list
of commits at run-time.

Signed-off-by: Simon Hausmann <simon@lst.de>

git-p4: Removed git-p4 submit --direct.Simon Hausmann Tue, 19 Feb 2008 08:33:08 +0000 (09:33 +0100)

git-p4: Removed git-p4 submit --direct.

This feature was originally meant to allow for quicker direct submits into perforce, but
it turns out that it is not actually quicker than doing a git commit and then running
git-p4 submit.

Signed-off-by: Simon Hausmann <simon@lst.de>

git-p4: Clean up git-p4 submit's log message handling.Simon Hausmann Tue, 19 Feb 2008 08:29:06 +0000 (09:29 +0100)

git-p4: Clean up git-p4 submit's log message handling.

Instead of trying to substitute fields in the p4 submit template we now simply
replace the description of the submit with the log message of the git commit.

Signed-off-by: Simon Hausmann <simon@lst.de>

git-p4: Remove --log-substitutions feature.Simon Hausmann Tue, 19 Feb 2008 08:12:29 +0000 (09:12 +0100)

git-p4: Remove --log-substitutions feature.

This turns out to be rarely useful and is already covered by git's commit.template configuration variable.

Signed-off-by: Simon Hausmann <simon@lst.de>

git-p4: support exclude pathsTommy Thorn Sun, 3 Feb 2008 18:38:51 +0000 (10:38 -0800)

git-p4: support exclude paths

Teach git-p4 about the -/ option which adds depot paths to the exclude
list, used when cloning. The option is chosen such that the natural
Perforce syntax works, eg:

git p4 clone //branch/path/... -//branch/path/{large,old}/...

Trailing ... on exclude paths are optional.

This is a generalization of a change by Dmitry Kakurin (thanks).

Signed-off-by: Tommy Thorn <tommy-git@thorn.ws>
Signed-off-by: Simon Hausmann <simon@lst.de>

Don't use GIT_CONFIG in t5505-remoteDaniel Barkalow Tue, 26 Feb 2008 22:15:31 +0000 (17:15 -0500)

Don't use GIT_CONFIG in t5505-remote

For some reason, t5505-remote was setting GIT_CONFIG to .git/config
and exporting it. This should have been no-op, as test framework did
the same for a long time anyway.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Add '--fixed-strings' option to "git log --grep" and... Jakub Narebski Tue, 26 Feb 2008 12:22:05 +0000 (13:22 +0100)

Add '--fixed-strings' option to "git log --grep" and friends

Add support for -F | --fixed-strings option to "git log --grep"
and friends: "git log --author", "git log --committer=<pattern>".
Code is based on implementation of this option in "git grep".

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Revert "pack-objects: Print a message describing the... Junio C Hamano Wed, 27 Feb 2008 07:27:31 +0000 (23:27 -0800)

Revert "pack-objects: Print a message describing the number of threads for packing"

This reverts commit 6c723f5e6bc579e06a904874f1ceeb8ff2b5a17c.
The additional message may be interesting for git developers,
but not useful for the end users, and clutters the output.

git-apply --whitespace=fix: fix off by one thinkoJunio C Hamano Tue, 26 Feb 2008 20:24:40 +0000 (12:24 -0800)

git-apply --whitespace=fix: fix off by one thinko

When a patch adds a whitespace followed by end-of-line, the
trailing whitespace error was detected correctly but was not
fixed, due to misconversion in 42ab241 (builtin-apply.c: do not
feed copy_wsfix() leading '+').

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'maint'Junio C Hamano Tue, 26 Feb 2008 08:14:22 +0000 (00:14 -0800)

Merge branch 'maint'

* maint:
Documentation/git-am.txt: Pass -r in the example invocation of rm -f .dotest
timezone_names[]: fixed the tz offset for New Zealand.
filter-branch documentation: non-zero exit status in command abort the filter
rev-parse: fix potential bus error with --parseopt option spec handling
Use a single implementation and API for copy_file()
Documentation/git-filter-branch: add a new msg-filter example
Correct fast-export file mode strings to match fast-import standard

add common fsck error printing functionMartin Koegler Mon, 25 Feb 2008 21:46:09 +0000 (22:46 +0100)

add common fsck error printing function

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin-fsck: move common object checking code to fsck.cMartin Koegler Mon, 25 Feb 2008 21:46:08 +0000 (22:46 +0100)

builtin-fsck: move common object checking code to fsck.c

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin-fsck: reports missing parent commitsMartin Koegler Mon, 25 Feb 2008 21:46:07 +0000 (22:46 +0100)

builtin-fsck: reports missing parent commits

parse_commit ignores parent commits with certain errors
(eg. a non commit object is already loaded under the sha1 of
the parent). To make fsck reports such errors, it has to compare
the nummer of parent commits returned by parse commit with the
number of parent commits in the object or in the graft/shallow file.

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Remove unused object-ref codeMartin Koegler Mon, 25 Feb 2008 21:46:06 +0000 (22:46 +0100)

Remove unused object-ref code

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin-fsck: move away from object-refs to fsck_walkMartin Koegler Mon, 25 Feb 2008 21:46:05 +0000 (22:46 +0100)

builtin-fsck: move away from object-refs to fsck_walk

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add generic, type aware object chain walkerMartin Koegler Mon, 25 Feb 2008 21:46:04 +0000 (22:46 +0100)

add generic, type aware object chain walker

The requirements are:
* it may not crash on NULL pointers
* a callback function is needed, as index-pack/unpack-objects
need to do different things
* the type information is needed to check the expected <-> real type
and print better error messages

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

gitweb: Better cutting matched string and its contextJakub Narebski Mon, 25 Feb 2008 20:07:57 +0000 (21:07 +0100)

gitweb: Better cutting matched string and its context

Improve look of commit search output ('search' view) by better cutting
of matched string and its context in match info, as suggested by Junio.
For example, if you are looking for "very long search string" in the
following line:

Could somebody test this with very long search string, and see how

you would now see:

...this with <<very long ... string>>, and see...

instead of:

Could som... <<very long search...>>, and see...

(where <<something>> denotes emphasized / colored fragment; matched
fragment to be more exact).

For this feature, support for fourth [optional] parameter to chop_str
subroutine was added. This fourth parameter is used to denote where
to cut string to make it shorter. chop_str can now cut at the
beginning (from the _left_ side of the string), in the middle
(_center_ of the string), or at the end (from the _right_ side of
the string); cutting from right is the default:

chop_str(somestring, len, slop, 'left') -> ' ...string'
chop_str(somestring, len, slop, 'center') -> 'som ... ing'
chop_str(somestring, len, slop, 'right') -> 'somestr... '

If you want to use default slop (default additional length), use undef
as value for third parameter to chop_str.

While at it, return from chop_str early if given string is so short
that chop_str couldn't shorten it. Simplify also regexp used by
chop_str. Make ellipsis (dots) stick to shortened fragment for
cutting at ends, to better see which part got shortened.

Simplify passing all arguments to chop_str in chop_and_escape_str
subroutine. This was needed to pass additional options to chop_str.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation/git-am.txt: Pass -r in the example invoca... Bryan Donlan Mon, 25 Feb 2008 22:40:19 +0000 (17:40 -0500)

Documentation/git-am.txt: Pass -r in the example invocation of rm -f .dotest

Signed-off-by: Bryan Donlan <bdonlan@fushizen.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

timezone_names[]: fixed the tz offset for New Zealand.Steven Drake Tue, 26 Feb 2008 00:45:53 +0000 (13:45 +1300)

timezone_names[]: fixed the tz offset for New Zealand.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

filter-branch documentation: non-zero exit status in... Caio Marcelo de Oliveira Filho Tue, 26 Feb 2008 02:14:31 +0000 (23:14 -0300)

filter-branch documentation: non-zero exit status in command abort the filter

Since commit 8c1ce0f46b85d40f215084eed7313896300082df filter-branch fails
when a <command> has a non-zero exit status. This commit makes it clear
in the documentation and also fixes the parent-filter example, that was
incorrectly returning non-zero when the commit being tested wasn't the
one to be rewritten.

Signed-off-by: Caio Marcelo de Oliveira Filho <cmarcelo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rev-parse: fix potential bus error with --parseopt... Jay Soffian Tue, 26 Feb 2008 04:07:39 +0000 (23:07 -0500)

rev-parse: fix potential bus error with --parseopt option spec handling

A non-empty line containing no spaces should be treated by --parseopt as
an option group header, but was causing a bus error. Also added a test
script for rev-parse --parseopt.

Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Improve collection of information for format-patch... Daniel Barkalow Mon, 25 Feb 2008 23:24:17 +0000 (18:24 -0500)

Improve collection of information for format-patch --cover-letter

Use the "boundary" feature to find the origin (or find that there are
multiple origins), and use the actual list of commits to pass to
shortlog.

This makes all cover letter include shortlogs, and all cover letters
for series with a single boundary commit include diffstats (if there
are multiple boundary commits it's unclear what would be meaningful as
a diffstat). Note that the single boundary test is empirical, not
theoretical; even a -2 limiting condition will give a diffstat if there's
only one boundary commit in this particular case.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>

Add API access to shortlogDaniel Barkalow Mon, 25 Feb 2008 23:24:14 +0000 (18:24 -0500)

Add API access to shortlog

Shortlog is gives a pretty simple API for cases where you're already
identifying all of the individual commits. Make this available to
other code instead of requiring them to use the revision API and
command line.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>

git-describe: --long shows the object name even for... Santi Béjar Mon, 25 Feb 2008 09:43:33 +0000 (10:43 +0100)

git-describe: --long shows the object name even for a tagged commit

This is useful when you want to see parts of the commit object name
in "describe" output, even when the commit in question happens to be
a tagged version. Instead of just emitting the tag name, it will
describe such a commit as v1.2-0-deadbeef (0th commit since tag v1.2
that points at object deadbeef....).

Signed-off-by: Santi Béjar <sbejar@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Add tests for filesystem challenges (case and unicode... Steffen Prohaska Sun, 24 Feb 2008 17:19:09 +0000 (18:19 +0100)

Add tests for filesystem challenges (case and unicode normalization)

Git has difficulties on file systems that do not properly
distinguish case or modify filenames in unexpected ways. The two
major examples are Windows and Mac OS X. Both systems preserve
case of file names but do not distinguish between filenames that
differ only by case. Simple operations such as "git mv" or
"git merge" can fail unexpectedly. In addition, Mac OS X normalizes
unicode, which make git's life even harder.

This commit adds tests that currently fail but should pass if
file system as decribed above are fully supported. The test need
to be run on Windows and Mac X as they already pass on Linux.

Mitch Tishmack is the original author of the tests for unicode
normalization.

[jc: fixed-up so that it will use test_expect_success to test
on sanely behaving filesystems.]

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Use a single implementation and API for copy_file()Daniel Barkalow Mon, 25 Feb 2008 19:24:48 +0000 (14:24 -0500)

Use a single implementation and API for copy_file()

Originally by Kristian Hï¿œgsberg; I fixed the conversion of rerere, which
had a different API.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation/git-filter-branch: add a new msg-filter... Miklos Vajna Mon, 25 Feb 2008 14:43:53 +0000 (15:43 +0100)

Documentation/git-filter-branch: add a new msg-filter example

There were no example on how to edit commit messages, so add an msg-filter
example.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

url rewriting: take longest and first matchJunio C Hamano Mon, 25 Feb 2008 06:25:04 +0000 (22:25 -0800)

url rewriting: take longest and first match

Earlier we had a cop-out in the documentation to make the
behaviour "undefined" if configuration had more than one
insteadOf that would match the target URL, like this:

[url "git://git.or.cz/"]
insteadOf = "git.or.cz:" ; (1)
insteadOf = "repo.or.cz:" ; (2)
[url "/local/mirror/"]
insteadOf = "git.or.cz:myrepo" ; (3)
insteadOf = "repo.or.cz:" ; (4)

It would be most natural to take the longest and first match, i.e.

- rewrite "git.or.cz:frotz" to "git://git.or.cz/frotz" by using
(1),

- rewrite "git.or.cz:myrepo/xyzzy" to "/local/mirror/xyzzy" by favoring
(3) over (1), and

- rewrite "repo.or.cz:frotz" to "git://git.or.cz/frotz" by
favoring (2) over (4).

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Correct fast-export file mode strings to match fast... Shawn O. Pearce Mon, 25 Feb 2008 03:57:29 +0000 (22:57 -0500)

Correct fast-export file mode strings to match fast-import standard

The fast-import file format does not expect leading '0' in front
of a file mode; that is we want '100644' and '0100644'.

Thanks to Ian Clatworthy of the Bazaar project for noticing the
difference in output/input.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Add support for url aliases in config filesDaniel Barkalow Wed, 20 Feb 2008 18:43:53 +0000 (13:43 -0500)

Add support for url aliases in config files

This allows users with different preferences for access methods to the
same remote repositories to rewrite each other's URLs by pattern
matching across a large set of similiarly set up repositories to each
get the desired access.

For example, if you don't have a kernel.org account, you might want
settings like:

[url "git://git.kernel.org/pub/"]
insteadOf = master.kernel.org:/pub

Then, if you give git a URL like:

master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git

it will act like you gave it:

git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git

and you can cut-and-paste pull requests in email without fixing them
by hand, for example.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-bundle.txt: Add different strategies to create... Santi Béjar Sun, 24 Feb 2008 13:42:40 +0000 (14:42 +0100)

git-bundle.txt: Add different strategies to create the bundle

Signed-off-by: Santi Béjar <sbejar@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin-for-each-ref.c: fix typo in error messageMichele Ballabio Sun, 24 Feb 2008 23:16:04 +0000 (00:16 +0100)

builtin-for-each-ref.c: fix typo in error message

Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

help: respect aliasesJeff King Sun, 24 Feb 2008 22:17:37 +0000 (17:17 -0500)

help: respect aliases

If we have an alias "foo" defined, then the help text for
"foo" (via "git help foo" or "git foo --help") now shows the
definition of the alias.

Before showing an alias definition, we make sure that there
is no git command which would override the alias (so that
even though you may have a "log" alias, even though it will
not work, we don't want to it supersede "git help log").

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

make alias lookup a public, procedural functionJeff King Sun, 24 Feb 2008 22:17:14 +0000 (17:17 -0500)

make alias lookup a public, procedural function

This converts git_config_alias to the public alias_lookup
function. Because of the nature of our config parser, we
still have to rely on setting static data. However, that
interface is wrapped so that you can just say

value = alias_lookup(key);

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

help: use parseoptJeff King Sun, 24 Feb 2008 22:16:55 +0000 (17:16 -0500)

help: use parseopt

This patch converts cmd_help to use parseopt, along with a
few style cleanups, including:

- enum constants are now ALL_CAPS

- parse_help_format returns an enum value rather than
setting a global as a side effect

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

send-email: test compose functionalityJeff King Sun, 24 Feb 2008 21:04:14 +0000 (16:04 -0500)

send-email: test compose functionality

This is just a basic sanity check that --compose works at
all.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t9001: enhance fake sendmail test harnessJeff King Sun, 24 Feb 2008 21:03:52 +0000 (16:03 -0500)

t9001: enhance fake sendmail test harness

Previously, the fake.sendmail test harness would write its
output to a hardcoded file, allowing only a single message
to be tested. Instead, let's have it save the messages for
all of its invocations so that we can see which messages
were sent, and in which order.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'lt/dirstat'Junio C Hamano Mon, 25 Feb 2008 02:14:53 +0000 (18:14 -0800)

Merge branch 'lt/dirstat'

* lt/dirstat:
diff --dirstat: saner handling of binary and unmerged files
Add "--dirstat" for some directory statistics

Eliminate confusing "won't bisect on seeked tree" failureCarl Worth Sun, 24 Feb 2008 01:14:17 +0000 (17:14 -0800)

Eliminate confusing "won't bisect on seeked tree" failure

This error message is very confusing---it doesn't tell the user
anything about how to fix the situation. And the actual fix
for the situation ("git bisect reset") does a checkout of a
potentially random branch, (compared to what the user wants to
be on for the bisect she is starting).

The simplest way to eliminate the confusion is to just make
"git bisect start" do the cleanup itself. There's no significant
loss of safety here since we already have a general safety in
the form of the reflog.

Note: We preserve the warning for any cogito users. We do this
by switching from .git/head-name to .git/BISECT_START for the
extra state, (which is a more descriptive name anyway).

Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff --dirstat: saner handling of binary and unmerged... Junio C Hamano Mon, 25 Feb 2008 01:37:15 +0000 (17:37 -0800)

diff --dirstat: saner handling of binary and unmerged files

We do not account binary nor unmerged files when --shortstat is
asked for (or the summary stat at the end of --stat).

The new option --dirstat should work the same way as it is about
summarizing the changes of multiple files by adding them up.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'jc/apply-whitespace'Junio C Hamano Mon, 25 Feb 2008 01:23:17 +0000 (17:23 -0800)

Merge branch 'jc/apply-whitespace'

* jc/apply-whitespace:
ws_fix_copy(): move the whitespace fixing function to ws.c
apply: do not barf on patch with too large an offset
core.whitespace: cr-at-eol
git-apply --whitespace=fix: fix whitespace fuzz introduced by previous run
builtin-apply.c: pass ws_rule down to match_fragment()
builtin-apply.c: move copy_wsfix() function a bit higher.
builtin-apply.c: do not feed copy_wsfix() leading '+'
builtin-apply.c: simplify calling site to apply_line()
builtin-apply.c: clean-up apply_one_fragment()
builtin-apply.c: mark common context lines in lineinfo structure.
builtin-apply.c: optimize match_beginning/end processing a bit.
builtin-apply.c: make it more line oriented
builtin-apply.c: push match-beginning/end logic down
builtin-apply.c: restructure "offset" matching
builtin-apply.c: refactor small part that matches context

Use git-describe --exact-match in bash prompt on detach... Shawn O. Pearce Sun, 24 Feb 2008 08:07:33 +0000 (03:07 -0500)

Use git-describe --exact-match in bash prompt on detached HEAD

Most of the time when I am on a detached HEAD and I am not doing
a rebase or bisect operation the working directory is sitting on a
tagged release of the repository. Showing the tag name instead of
the commit SHA-1 is much more descriptive and a much better reminder
of the state of this working directory.

Now that git-describe --exact-match is available as a cheap means
of obtaining the exact annotated tag or nothing at all, we can
favor the annotated tag name over the abbreviated commit SHA-1.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Teach git-describe --exact-match to avoid expensive... Shawn O. Pearce Sun, 24 Feb 2008 08:07:31 +0000 (03:07 -0500)

Teach git-describe --exact-match to avoid expensive tag searches

Sometimes scripts want (or need) the annotated tag name that exactly
matches a specific commit, or no tag at all. In such cases it can be
difficult to determine if the output of `git describe $commit` is a
real tag name or a tag+abbreviated commit. A common idiom is to run
git-describe twice:

if test $(git describe $commit) = $(git describe --abbrev=0 $commit)
...

but this is a huge waste of time if the caller is just going to pick a
different method to describe $commit or abort because it is not exactly
an annotated tag.

Setting the maximum number of candidates to 0 allows the caller to ask
for only a tag that directly points at the supplied commit, or to have
git-describe abort if no such item exists.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Avoid accessing non-tag refs in git-describe unless... Shawn O. Pearce Sun, 24 Feb 2008 08:07:28 +0000 (03:07 -0500)

Avoid accessing non-tag refs in git-describe unless --all is requested

If we aren't going to use a ref there is no reason for us to open
its object from the object database. This avoids opening any of
the head commits reachable from refs/heads/ unless they are also
reachable through the commit we have been asked to describe and
we need to walk through it to find a tag.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Teach git-describe to use peeled ref information when... Shawn O. Pearce Sun, 24 Feb 2008 08:07:25 +0000 (03:07 -0500)

Teach git-describe to use peeled ref information when scanning tags

By using the peeled ref information inside of the packed-refs file we
can avoid opening tag objects to obtain the commits they reference.
This speeds up git-describe when there are a large number of tags
in the repository as we have less objects to parse before we can
start commit matching.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Optimize peel_ref for the current ref of a for_each_ref... Shawn O. Pearce Sun, 24 Feb 2008 08:07:22 +0000 (03:07 -0500)

Optimize peel_ref for the current ref of a for_each_ref callback

Currently the only caller of peel_ref is show-ref, which is using
this function to show the peeled tag information if it is available
from an existing packed-refs file. The call happens during the
for_each_ref callback function, so we have the proper struct ref_list
already on the call stack but it is not easily available to return
the peeled information to the caller.

We now save the current struct ref_list item before calling back
into the callback function so that future calls to peel_ref from
within the callback function can quickly access the current ref.
Doing so will save us an lstat() per ref processed as we no longer
have to check the filesystem to see if the ref exists as a loose
file or is packed. This current ref caching also saves a linear
scan of the cached packed refs list.

As a micro-optimization we test the address of the passed ref name
against the current_ref->name before we go into the much more costly
strcmp(). Nearly any caller of peel_ref will be passing us the same
string do_for_each_ref passed them, which is current_ref->name.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'maint'Junio C Hamano Sun, 24 Feb 2008 18:01:19 +0000 (10:01 -0800)

Merge branch 'maint'

* maint:
Protect peel_ref fallback case from NULL parse_object result
Ensure 'make dist' compiles git-archive.exe on Cygwin

Be more verbose when checkout takes a long timeLinus Torvalds Sat, 23 Feb 2008 21:36:08 +0000 (13:36 -0800)

Be more verbose when checkout takes a long time

So I find it irritating when git thinks for a long time without telling me
what's taking so long. And by "long time" I definitely mean less than two
seconds, which is already way too long for me.

This hits me when doing a large pull and the checkout takes a long time,
or when just switching to another branch that is old and again checkout
takes a while.

Now, git read-tree already had support for the "-v" flag that does nice
updates about what's going on, but it was delayed by two seconds, and if
the thing had already done more than half by then it would be quiet even
after that, so in practice it meant that we migth be quiet for up to four
seconds. Much too long.

So this patch changes the timeout to just one second, which makes it much
more palatable to me.

The other thing this patch does is that "git checkout" now doesn't disable
the "-v" flag when doing its thing, and only disables the output when
given the -q flag. When allowing "checkout -m" to fall back to a 3-way
merge, the users will see the error message from straight "checkout",
so we will tell them that we do fall back to make them look less scary.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Protect peel_ref fallback case from NULL parse_object... Shawn O. Pearce Sun, 24 Feb 2008 08:07:19 +0000 (03:07 -0500)

Protect peel_ref fallback case from NULL parse_object result

If the SHA-1 we are requesting the object for does not exist in
the object database we get a NULL back. Accessing the type from
that is not likely to succeed on any system.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ensure 'make dist' compiles git-archive.exe on CygwinShawn O. Pearce Sun, 24 Feb 2008 05:38:04 +0000 (00:38 -0500)

Ensure 'make dist' compiles git-archive.exe on Cygwin

On Cygwin we have to use git-archive.exe as the target, otherwise
running 'make dist' does not compile git-archive in the current
directory. That may cause 'make dist' to fail on a clean source
tree that has never been built before.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

checkout: error out when index is unmerged even with -mJunio C Hamano Sat, 23 Feb 2008 23:45:19 +0000 (15:45 -0800)

checkout: error out when index is unmerged even with -m

Even when -m is given to allow fallilng back to 3-way merge
while switching branches, we should refuse if the original index
is unmerged.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Acked-by: Daniel Barkalow <barkalow@iabervon.org>

t4014: Replace sed's non-standard 'Q' by standard 'q'Steffen Prohaska Sat, 23 Feb 2008 08:41:56 +0000 (09:41 +0100)

t4014: Replace sed's non-standard 'Q' by standard 'q'

t4014 test used GNU extension 'Q' in its sed scripts, but the
uses can safely be replaced with 'q'. Among other platforms,
sed on Mac OS X 10.4 does not accept the former.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

ws_fix_copy(): move the whitespace fixing function... Junio C Hamano Sun, 24 Feb 2008 00:59:16 +0000 (16:59 -0800)

ws_fix_copy(): move the whitespace fixing function to ws.c

This is used by git-apply but we can use it elsewhere by slightly
generalizing it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

checkout: show progress when checkout takes long time... Junio C Hamano Sat, 23 Feb 2008 23:37:48 +0000 (15:37 -0800)

checkout: show progress when checkout takes long time while switching branches

Signed-off-by: Junio C Hamano <gitster@pobox.com>

gitweb: Fix bugs in git_search_grep_body: it's length... Jakub Narebski Sat, 23 Feb 2008 21:37:08 +0000 (22:37 +0100)

gitweb: Fix bugs in git_search_grep_body: it's length(), not len()

Use int(<expr>/2) to get integer value for a substring length.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pack-objects: Print a message describing the number... Brandon Casey Sat, 23 Feb 2008 02:12:58 +0000 (20:12 -0600)

pack-objects: Print a message describing the number of threads for packing

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pack-objects: Add runtime detection of online CPU'sAndreas Ericsson Sat, 23 Feb 2008 02:11:56 +0000 (20:11 -0600)

pack-objects: Add runtime detection of online CPU's

Packing objects can be done in parallell nowadays, but it's
only done if the config option pack.threads is set to a value
above 1. Because of that, the code-path used is often not the
most optimal one.

This patch adds a routine to detect the number of online CPU's
at runtime (online_cpus()). When pack.threads (or --threads=) is
given a value of 0, the number of threads is set to the number of
online CPU's. This feature is also documented.

As per Nicolas Pitre's recommendations, the default is still to
run pack-objects single-threaded unless explicitly activated,
either by configuration or by command line parameter.

The routine online_cpus() is a rework of "numcpus.c", written by
one Philip Willoughby <pgw99@doc.ic.ac.uk>. numcpus.c is in the
public domain and can presently be downloaded from
http://csgsoft.doc.ic.ac.uk/numcpus/

Signed-off-by: Andreas Ericsson <ae@op5.se>
Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

start_command(), if .in/.out > 0, closes file descripto... Johannes Sixt Thu, 21 Feb 2008 22:42:56 +0000 (23:42 +0100)

start_command(), if .in/.out > 0, closes file descriptors, not the callers

Callers of start_command() can set the members .in and .out of struct
child_process to a value > 0 to specify that this descriptor is used as
the stdin or stdout of the child process.

Previously, if start_command() was successful, this descriptor was closed
upon return. Here we now make sure that the descriptor is also closed in
case of failures. All callers are updated not to close the file descriptor
themselves after start_command() was called.

Note that earlier run_gpg_verify() of git-verify-tag set .out = 1, which
worked because start_command() treated this as a special case, but now
this is incorrect because it closes the descriptor. The intent here is to
inherit stdout to the child, which is achieved by .out = 0.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

start_command(), .in/.out/.err = -1: Callers must close... Johannes Sixt Sat, 16 Feb 2008 17:36:38 +0000 (18:36 +0100)

start_command(), .in/.out/.err = -1: Callers must close the file descriptor

By setting .in, .out, or .err members of struct child_process to -1, the
callers of start_command() can request that a pipe is allocated that talks
to the child process and one end is returned by replacing -1 with the
file descriptor.

Previously, a flag was set (for .in and .out, but not .err) to signal
finish_command() to close the pipe end that start_command() had handed out,
so it was optional for callers to close the pipe, and many already do so.
Now we make it mandatory to close the pipe.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Sync with 1.5.4.3Junio C Hamano Sat, 23 Feb 2008 19:49:34 +0000 (11:49 -0800)

Sync with 1.5.4.3

Signed-off-by: Junio C Hamano <gitster@pobox.com>

GIT 1.5.4.3 v1.5.4.3Junio C Hamano Sat, 23 Feb 2008 19:31:04 +0000 (11:31 -0800)

GIT 1.5.4.3

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'maint' of git://repo.or.cz/git-gui into... Junio C Hamano Sat, 23 Feb 2008 19:23:59 +0000 (11:23 -0800)

Merge branch 'maint' of git://repo.or.cz/git-gui into maint

* 'maint' of git://repo.or.cz/git-gui:
git-gui: Focus insertion point at end of strings in repository chooser
git-gui: Avoid hardcoded Windows paths in Cygwin package files
git-gui: Default TCL_PATH to same location as TCLTK_PATH
git-gui: Paper bag fix error dialogs opening over the main window
git-gui: Ensure error dialogs always appear over all other windows
git-gui: relax "dirty" version detection
git-gui: support Git Gui.app under OS X 10.5

Add merge-subtree backJunio C Hamano Sat, 23 Feb 2008 19:08:25 +0000 (11:08 -0800)

Add merge-subtree back

An earlier commit e1b3a2c (Build-in merge-recursive) made the
subtree merge strategy backend unavailable. This resurrects
it.

A new test t6029 currently only tests the strategy is available,
but it should be enhanced to check the real "subtree" case.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin-reflog.c: don't install new reflog on write... Brandon Casey Fri, 22 Feb 2008 18:47:08 +0000 (12:47 -0600)

builtin-reflog.c: don't install new reflog on write failure

When expiring reflog entries, a new temporary log is written which contains
only the entries to retain. After it is written, it is renamed to replace
the existing reflog. Currently, we check that writing of the new log is
successful and print a message on failure, but the original reflog is still
replaced with the new reflog even on failure. This patch causes the
original reflog to be retained if we fail when writing the new reflog.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

pull: pass --strategy along to to rebaseJay Soffian Sat, 23 Feb 2008 00:52:29 +0000 (19:52 -0500)

pull: pass --strategy along to to rebase

rebase supports --strategy, so pull should pass the option along to it.

Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Use helper function for copying index entry informationLinus Torvalds Sat, 23 Feb 2008 04:41:17 +0000 (20:41 -0800)

Use helper function for copying index entry information

We used to just memcpy() the index entry when we copied the stat() and
SHA1 hash information, which worked well enough back when the index
entry was just an exact bit-for-bit representation of the information on
disk.

However, these days we actually have various management information in
the cache entry too, and we should be careful to not overwrite it when
we copy the stat information from another index entry.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Name hash fixups: export (and rename) remove_hash_entryLinus Torvalds Sat, 23 Feb 2008 04:39:21 +0000 (20:39 -0800)

Name hash fixups: export (and rename) remove_hash_entry

This makes the name hash removal function (which really just sets the
bit that disables lookups of it) available to external routines, and
makes read_cache_unmerged() use it when it drops an unmerged entry from
the index.

It's renamed to remove_index_entry(), and we drop the (unused) 'istate'
argument.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Fix name re-hashing semanticsLinus Torvalds Sat, 23 Feb 2008 04:37:40 +0000 (20:37 -0800)

Fix name re-hashing semantics

We handled the case of removing and re-inserting cache entries badly,
which is something that merging commonly needs to do (removing the
different stages, and then re-inserting one of them as the merged
state).

We even had a rather ugly special case for this failure case, where
replace_index_entry() basically turned itself into a no-op if the new
and the old entries were the same, exactly because the hash routines
didn't handle it on their own.

So what this patch does is to not just have the UNHASHED bit, but a
HASHED bit too, and when you insert an entry into the name hash, that
involves:

- clear the UNHASHED bit, because now it's valid again for lookup
(which is really all that UNHASHED meant)

- if we're being lazy, we're done here (but we still want to clear the
UNHASHED bit regardless of lazy mode, since we can become unlazy
later, and so we need the UNHASHED bit to always be set correctly,
even if we never actually insert the entry into the hash list)

- if it was already hashed, we just leave it on the list

- otherwise mark it HASHED and insert it into the list

this all means that unhashing and rehashing a name all just works
automatically. Obviously, you cannot change the name of an entry (that
would be a serious bug), but nothing can validly do that anyway (you'd
have to allocate a new struct cache_entry anyway since the name length
could change), so that's not a new limitation.

The code actually gets simpler in many ways, although the lazy hashing
does mean that there are a few odd cases (ie something can be marked
unhashed even though it was never on the hash in the first place, and
isn't actually marked hashed!).

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Avoid unnecessary "if-before-free" tests.Jim Meyering Thu, 31 Jan 2008 17:26:32 +0000 (18:26 +0100)

Avoid unnecessary "if-before-free" tests.

This change removes all obvious useless if-before-free tests.
E.g., it replaces code like this:

if (some_expression)
free (some_expression);

with the now-equivalent:

free (some_expression);

It is equivalent not just because POSIX has required free(NULL)
to work for a long time, but simply because it has worked for
so long that no reasonable porting target fails the test.
Here's some evidence from nearly 1.5 years ago:

http://www.winehq.org/pipermail/wine-patches/2006-October/031544.html

FYI, the change below was prepared by running the following:

git ls-files -z | xargs -0 \
perl -0x3b -pi -e \
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+(free\s*\(\s*\1\s*\))/$2/s'

Note however, that it doesn't handle brace-enclosed blocks like
"if (x) { free (x); }". But that's ok, since there were none like
that in git sources.

Beware: if you do use the above snippet, note that it can
produce syntactically invalid C code. That happens when the
affected "if"-statement has a matching "else".
E.g., it would transform this

if (x)
free (x);
else
foo ();

into this:

free (x);
else
foo ();

There were none of those here, either.

If you're interested in automating detection of the useless
tests, you might like the useless-if-before-free script in gnulib:
[it *does* detect brace-enclosed free statements, and has a --name=S
option to make it detect free-like functions with different names]

http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob;f=build-aux/useless-if-before-free

Addendum:
Remove one more (in imap-send.c), spotted by Jean-Luc Herren <jlh@gmx.ch>.

Signed-off-by: Jim Meyering <meyering@redhat.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'maint'Junio C Hamano Fri, 22 Feb 2008 22:01:43 +0000 (14:01 -0800)

Merge branch 'maint'

* maint:
hash: fix lookup_hash semantics

hash: fix lookup_hash semanticsJeff King Fri, 22 Feb 2008 19:47:27 +0000 (14:47 -0500)

hash: fix lookup_hash semantics

We were returning the _address of_ the stored item (or NULL)
instead of the item itself. While this sort of indirection
is useful for insertion (since you can lookup and then
modify), it is unnecessary for read-only lookup. Since the
hash code splits these functions between the internal
lookup_hash_entry function and the public lookup_hash
function, it makes sense for the latter to provide what
users of the library expect.

The result of this was that the index caching returned bogus
results on lookup. We unfortunately didn't catch this
because we were returning a "struct cache_entry **" as a
"void *", and accidentally assigning it to a "struct
cache_entry *".

As it happens, this actually _worked_ most of the time,
because the entries were defined as:

struct cache_entry {
struct cache_entry *next;
...
};

meaning that interpreting a "struct cache_entry **" as a
"struct cache_entry *" would yield an entry where all fields
were totally bogus _except_ for the next pointer, which
pointed to the actual cache entry. When walking the list, we
would look at the bogus "name" field, which was unlikely to
match our lookup, and then proceed to the "real" entry.

The reading of bogus data was silently ignored most of the
time, but could cause a segfault for some data (which seems
to be more common on OS X).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>