Code

git.git
15 years agoshow_stats(): fix stats width calculation
Olivier Marin [Fri, 27 Jun 2008 00:18:48 +0000 (02:18 +0200)]
show_stats(): fix stats width calculation

Before this patch, name_width becomes negative or null for width values
less than 15 and name_width values greater than 25 (default: 50). This
leads to output random data.

This patch checks for minimal width and name_width values.

Signed-off-by: Olivier Marin <dkr@freesurf.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoDocumentation: remove {show,whatchanged}.difftree config options
Olivier Marin [Fri, 27 Jun 2008 00:17:55 +0000 (02:17 +0200)]
Documentation: remove {show,whatchanged}.difftree config options

This removes, from the documentation and the bash completion script, the
two config options that were introduced by the git-whatchanged.sh script
and lost in the C rewrite. Today, we can use aliases as an alternative.

Signed-off-by: Olivier Marin <dkr@freesurf.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-svn: avoid filling up the disk with temp files.
Avery Pennarun [Sat, 28 Jun 2008 23:33:56 +0000 (19:33 -0400)]
git-svn: avoid filling up the disk with temp files.

Commit ffe256f9bac8a40ff751a9341a5869d98f72c285 ("git-svn: Speed up fetch")
introduced changes that create a temporary file for each object fetched by
svn.  These files should be deleted automatically, but perl apparently
doesn't do this until the process exits (or perhaps when its garbage
collector runs).

This means that on a large fetch, especially with lots of branches, we
sometimes fill up /tmp completely, which prevents the next temp file from
being written completely.  This is aggravated by the fact that a new temp
file is created for each updated file, even if that update produces a file
identical to one already in git.  Thus, it can happen even if there's lots
of disk space to store the finished repository.

We weren't adequately checking for write errors, so this would result in an
invalid file getting committed, which caused git-svn to fail later with an
invalid checksum.

This patch adds a check to syswrite() so similar problems don't lead to
corruption in the future.  It also unlink()'s each temp file explicitly
when we're done with it, so the disk doesn't need to fill up.

Signed-off-by: Avery Pennarun <apenwarr@gmail.com>
Tested-by: Björn Steinbrink <B.Steinbrink@gmx.de>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit cat-file: Fix memory leak in batch mode
Björn Steinbrink [Sun, 29 Jun 2008 01:21:25 +0000 (03:21 +0200)]
git cat-file: Fix memory leak in batch mode

When run in batch mode, git cat-file never frees the memory for the blob
contents it is printing. This quickly adds up and causes git-svn to be
hardly usable for imports of large svn repos, because it uses cat-file in
batch mode and cat-file's memory usage easily reaches several hundred MB
without any good reason.

Signed-off-by: Björn Steinbrink <B.Steinbrink@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-send-email: prevent undefined variable warnings if no encryption is set
Thomas Rast [Thu, 26 Jun 2008 21:03:21 +0000 (23:03 +0200)]
git-send-email: prevent undefined variable warnings if no encryption is set

With the previous patch, not configuring any encryption (either on or
off) would leave $smtp_encryption undefined.  We simply set it to the
empty string in that case.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agofix git config example syntax
Joey Hess [Sat, 28 Jun 2008 20:02:47 +0000 (16:02 -0400)]
fix git config example syntax

git-config expects a space, not '=' between option and value.

Also, quote the value since it contains globs, which some shells will not
pass through unchanged, or will abort if the glob doesn't expand.

Signed-off-by: Joey Hess <joey@kitenet.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoavoid off-by-one error in run_upload_archive
Jochen Voss [Sat, 28 Jun 2008 16:04:24 +0000 (17:04 +0100)]
avoid off-by-one error in run_upload_archive

Make sure that buf has enough space to store the trailing \0 of
the command line argument, too.

Signed-off-by: Jochen Voss <voss@seehuhn.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoGIT-VERSION-GEN: do not fail if a 'HEAD' file exists in the working copy
Lea Wiemann [Sat, 28 Jun 2008 17:13:29 +0000 (19:13 +0200)]
GIT-VERSION-GEN: do not fail if a 'HEAD' file exists in the working copy

Signed-off-by: Lea Wiemann <LeWiemann@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoAllow git-apply to recount the lines in a hunk (AKA recountdiff)
Johannes Schindelin [Fri, 27 Jun 2008 17:43:09 +0000 (18:43 +0100)]
Allow git-apply to recount the lines in a hunk (AKA recountdiff)

Sometimes, the easiest way to fix up a patch is to edit it directly, even
adding or deleting lines.  Now, many people are not as divine as certain
benevolent dictators as to update the hunk headers correctly at the first
try.

So teach the tool to do it for us.

[jc: with tests]

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agocommit-tree: lift completely arbitrary limit of 16 parents
Johannes Schindelin [Fri, 27 Jun 2008 12:24:47 +0000 (13:24 +0100)]
commit-tree: lift completely arbitrary limit of 16 parents

There is no really good reason to have a merge with more than 16
parents, but we have a history of giving our users rope.

Combined with the fact that there was no good reason for that
arbitrary limit in the first place, here is an all-too-easy to fix.

Kind of wished-for by Len Brown.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoshrink git-shell by avoiding redundant dependencies
Dmitry Potapov [Fri, 27 Jun 2008 20:46:42 +0000 (00:46 +0400)]
shrink git-shell by avoiding redundant dependencies

A lot of modules that have nothing to do with git-shell functionality
were linked in, bloating git-shell more than 8 times.

This patch cuts off redundant dependencies by:
1. providing stubs for three functions that make no sense for git-shell;
2. moving quote_path_fully from environment.c to quote.c to make the
   later self sufficient;
3. moving make_absolute_path into a new separate file.

The following numbers have been received with the default optimization
settings on master using GCC 4.1.2:

Before:
   text    data     bss     dec     hex filename
 143915    1348   93168  238431   3a35f git-shell

After:
   text    data     bss     dec     hex filename
  17670     788    8232   26690    6842 git-shell

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agohelp: check early if we have a command, if not try a documentation topic
Christian Couder [Sat, 28 Jun 2008 04:35:03 +0000 (06:35 +0200)]
help: check early if we have a command, if not try a documentation topic

Before this patch, something like "git help tutorial" did not work,
people had to use "git help gittutorial" which is not very intuitive.

This patch uses the "is_git_command" function to test early if the
argument passed to "git help" is a git command, and if this is not the
case then we prefix the argument with "git" instead of "git-".

This way, things like "git help tutorial" or "git help glossary" will
work fine.

The little downside of this patch is that the "is_git_command" is a
little bit slow.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-apply: handle a patch that touches the same path more than once better
Don Zickus [Fri, 27 Jun 2008 18:39:12 +0000 (14:39 -0400)]
git-apply: handle a patch that touches the same path more than once better

When working with a lot of people who backport patches all day long, every
once in a while I get a patch that modifies the same file more than once
inside the same patch.  git-apply either fails if the second change relies
on the first change or silently drops the first change if the second change
is independent.

The silent part is the scary scenario for us.  Also this behaviour is
different from the patch-utils.

I have modified git-apply to create a table of the filenames of files it
modifies such that if a later patch chunk modifies a file in the table it
will buffer the previously changed file instead of reading the original file
from disk.

Logic has been put in to handle creations/deletions/renames/copies.  All the
relevant tests of git-apply succeed.

A new test has been added to cover the cases I addressed.

The fix is relatively straight-forward.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agofetch: report local storage errors in status table
Jeff King [Fri, 27 Jun 2008 03:59:50 +0000 (23:59 -0400)]
fetch: report local storage errors in status table

Previously, if there was an error while storing a local
tracking ref, the low-level functions would report an error,
but fetch's status output wouldn't indicate any problem.
E.g., imagine you have an old "refs/remotes/origin/foo/bar" but
upstream has deleted "foo/bar" in favor of a new branch
"foo". You would get output like this:

  error: there are still refs under 'refs/remotes/origin/foo'
  From $url_of_repo
   * [new branch]      foo        -> origin/foo

With this patch, the output takes into account the status of
updating the local ref:

  error: there are still refs under 'refs/remotes/origin/foo'
  From $url_of_repo
   ! [new branch]      foo        -> origin/foo  (unable to update local ref)

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoclone: respect url.insteadOf setting in global configs
Johannes Schindelin [Fri, 27 Jun 2008 12:56:05 +0000 (13:56 +0100)]
clone: respect url.insteadOf setting in global configs

When we call "git clone" with a url that has a rewrite rule in either
$HOME/.gitconfig or /etc/gitconfig, the URL can be different from
what the command line expects it to be.

So, let's use the URL as the remote structure has it, not the literal
string from the command line.

Noticed by Pieter de Bie.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoDocument the double-dash "rev -- path" disambiguator
Junio C Hamano [Thu, 26 Jun 2008 05:16:37 +0000 (22:16 -0700)]
Document the double-dash "rev -- path" disambiguator

This is a very well established command line convention that old residents
of the git mailing list knew by heart and nobody even thought about
documenting it explicitly, which was not very nice.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoUpdate sample pre-commit hook to use "diff --check"
Junio C Hamano [Thu, 26 Jun 2008 23:08:05 +0000 (16:08 -0700)]
Update sample pre-commit hook to use "diff --check"

Now "diff --check" can detect not just whitespace errors but also notices
leftover conflict marker lines, we can use it in the sample pre-commit
hook script.

These days the object layer knows about the empty tree object without
actually having one in the repository, so we can run the test even for the
initial commit.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agodiff --check: detect leftover conflict markers
Junio C Hamano [Thu, 26 Jun 2008 22:37:21 +0000 (15:37 -0700)]
diff --check: detect leftover conflict markers

This teaches "diff --check" to detect and complain if the change
adds lines that look like leftover conflict markers.

We should be able to remove the old Perl script used in the sample
pre-commit hook and modernize the script with this facility.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoTeach "diff --check" about new blank lines at end
Junio C Hamano [Thu, 26 Jun 2008 22:36:59 +0000 (15:36 -0700)]
Teach "diff --check" about new blank lines at end

When a patch adds new blank lines at the end, "git apply --whitespace"
warns.  This teaches "diff --check" to do the same.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agocheckdiff: pass diff_options to the callback
Junio C Hamano [Thu, 26 Jun 2008 22:36:34 +0000 (15:36 -0700)]
checkdiff: pass diff_options to the callback

This way, we could later use more information from the diff_options.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoDon't use dash commands (git-foo) in tutorial-2
Ted Percival [Thu, 26 Jun 2008 13:22:19 +0000 (23:22 +1000)]
Don't use dash commands (git-foo) in tutorial-2

Signed-off-by: Ted Percival <ted@midg3t.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agotest-lib.sh: show git init output when in verbose mode
Lea Wiemann [Thu, 26 Jun 2008 18:35:19 +0000 (20:35 +0200)]
test-lib.sh: show git init output when in verbose mode

Signed-off-by: Lea Wiemann <LeWiemann@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agocheck_and_emit_line(): rename and refactor
Junio C Hamano [Thu, 26 Jun 2008 22:35:21 +0000 (15:35 -0700)]
check_and_emit_line(): rename and refactor

The function name was too bland and not explicit enough as to what it is
checking.  Split it into two, and call the one that checks if there is a
whitespace breakage "ws_check()", and call the other one that checks and
emits the line after color coding "ws_check_emit()".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agodiff --check: explain why we do not care whether old side is binary
Junio C Hamano [Thu, 26 Jun 2008 22:34:54 +0000 (15:34 -0700)]
diff --check: explain why we do not care whether old side is binary

All other codepaths refrain from running textual diff when either the old
or the new side is binary, but this function only checks the new side.  I
was almost going to change it to check both, but that would be a bad
change.  Explain why to prevent future mistakes.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoMerge branch 'maint'
Junio C Hamano [Fri, 27 Jun 2008 01:12:47 +0000 (18:12 -0700)]
Merge branch 'maint'

* maint:
  GIT 1.5.5.5
  GIT 1.5.4.6
  git-shell: accept "git foo" form
  diff --check: do not discard error status upon seeing a good line

15 years agoMerge branch 'maint-1.5.5' into maint
Junio C Hamano [Fri, 27 Jun 2008 01:08:51 +0000 (18:08 -0700)]
Merge branch 'maint-1.5.5' into maint

* maint-1.5.5:
  GIT 1.5.5.5
  GIT 1.5.4.6
  git-shell: accept "git foo" form

Conflicts:

GIT-VERSION-GEN
RelNotes

15 years agoGIT 1.5.5.5 v1.5.5.5
Junio C Hamano [Fri, 27 Jun 2008 00:16:50 +0000 (17:16 -0700)]
GIT 1.5.5.5

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoMerge branch 'maint-1.5.4' into maint-1.5.5
Junio C Hamano [Fri, 27 Jun 2008 00:14:03 +0000 (17:14 -0700)]
Merge branch 'maint-1.5.4' into maint-1.5.5

* maint-1.5.4:
  GIT 1.5.4.6
  git-shell: accept "git foo" form

Conflicts:

GIT-VERSION-GEN
RelNotes

15 years agoGIT 1.5.4.6 v1.5.4.6
Junio C Hamano [Fri, 27 Jun 2008 00:11:21 +0000 (17:11 -0700)]
GIT 1.5.4.6

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-shell: accept "git foo" form
Junio C Hamano [Sun, 2 Dec 2007 06:16:19 +0000 (22:16 -0800)]
git-shell: accept "git foo" form

This is a backport of 0a47dc110e042b5bcc63dc94c8d517e67efe9306
to 'maint' to be included in 1.5.6.2 so that older server side
can accept dashless form of request when clients are updated.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agodiff --check: do not discard error status upon seeing a good line
Junio C Hamano [Thu, 26 Jun 2008 20:16:33 +0000 (13:16 -0700)]
diff --check: do not discard error status upon seeing a good line

"git diff --check" should return non-zero when there was any whitespace
error but the code only paid attention to the error status of the last
new line in the patch.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoimprove for-each-ref test script
Jeff King [Thu, 26 Jun 2008 08:08:41 +0000 (04:08 -0400)]
improve for-each-ref test script

Previously, we did a sanity check by doing for-each-ref
using each possible format atom. However, we never checked
the actual output produced by that atom, which recently let
an obvious bug go undetected for some time.

While we're at it, also clean up a few '!' into
test_must_fail.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoAdd 'git-p4.allowSubmit' to git-p4
Jing Xue [Sun, 22 Jun 2008 18:12:39 +0000 (14:12 -0400)]
Add 'git-p4.allowSubmit' to git-p4

I'm working with a perforce repo using git-p4. There are some config
files which I need to change locally according to my environment. I'm
using a 'local' git branch to park these changes. And I want to avoid
accidentally checking them into p4 just by doing "git p4 submit"
mindlessly without realizing which branch I'm actually on.

This patch adds a new git config, 'git-p4.allowSubmit', which is a
whitelist of branch names. "git p4 submit" will only allow submissions
from local branches on the list. Useful for preventing inadvertently
submitting from a strictly local branch.

For backward compatibility, if this config is not set at all,
submissions from all branches are allowed.

Signed-off-by: Jing Xue <jingxue@digizenstudio.com>
Acked-By: Simon Hausmann <simon@lst.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoStart draft release notes for 1.6.0
Junio C Hamano [Thu, 26 Jun 2008 07:13:37 +0000 (00:13 -0700)]
Start draft release notes for 1.6.0

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agocompat/pread.c: Add a forward declaration to fix a warning
Steffen Prohaska [Sat, 17 Nov 2007 19:48:14 +0000 (20:48 +0100)]
compat/pread.c: Add a forward declaration to fix a warning

read_in_full()'s is used in compat/pread.c.  read_in_full() is
declared in cache.h. But we can't include cache.h because too
many macros are defined there.  Using read_in_full() without
including cache.h is dangerous because we wouldn't recognize if
its prototyp changed.  gcc issues a warning about that.

This commit adds a forward declaration to git-compat-util.h.
git-compat-util.h is included by compat/pread.c _and_ cache.h.
Hence, changes in cache.h would be detected.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Fix ntohl() related warnings about printf formatting
Steffen Prohaska [Sat, 17 Nov 2007 18:16:53 +0000 (19:16 +0100)]
Windows: Fix ntohl() related warnings about printf formatting

On Windows, ntohl() returns unsigned long.  On Unix it returns
uint32_t.  This makes choosing a suitable printf format string
hard.

This commit introduces a mingw specific helper function
git_ntohl() that casts to unsigned int before returning.  This
makes gcc's printf format check happy.  It should be safe because
we expect ntohl to use 32-bit numbers.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: TMP and TEMP environment variables specify a temporary directory.
Johannes Sixt [Sun, 22 Jun 2008 09:35:21 +0000 (11:35 +0200)]
Windows: TMP and TEMP environment variables specify a temporary directory.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Make 'git help -a' work.
Johannes Sixt [Mon, 14 Jan 2008 13:05:33 +0000 (14:05 +0100)]
Windows: Make 'git help -a' work.

git help -a scans the PATH for git commands. On Windows it failed for two
reasons:

- The PATH separator is ';', not ':' on Windows.

- stat() does not set the executable bit.

We now open the file and guess whether it is executable.

The result of the guess is good enough for the list of git commands, but
it is of no use for a general stat() implementation because (1) it is a
guess, (2) the user has no way to influence the outcome (via chmod or
similar), and (3) it would reduce stat() performance by an unacceptable
amount. Therefore, this strategy is a special-case local to help.c.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Work around an oddity when a pipe with no reader is written to.
Johannes Sixt [Fri, 17 Aug 2007 16:40:36 +0000 (18:40 +0200)]
Windows: Work around an oddity when a pipe with no reader is written to.

On Windows, write() is implemented using WriteFile(). After the reader
closed its end of the pipe, the first WriteFile() returns
ERROR_BROKEN_PIPE (which translates to EPIPE), subsequent WriteFile()s
return ERROR_NO_DATA, which is translated to EINVAL.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Make the pager work.
Johannes Sixt [Sat, 8 Dec 2007 20:28:41 +0000 (21:28 +0100)]
Windows: Make the pager work.

Since we have neither fork() nor exec(), we have to spawn the pager and
feed it with the program's output.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWhen installing, be prepared that template_dir may be relative.
Johannes Sixt [Tue, 1 Jan 2008 21:15:21 +0000 (22:15 +0100)]
When installing, be prepared that template_dir may be relative.

Since the Makefile in the template/ subdirectory is only used to install
the templates, we do not simply pass down the setting of template_dir
when it is relative, but construct the intended destination in a new
variable: A relative template_dir is relative to gitexecdir.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Use a relative default template_dir and ETC_GITCONFIG
Johannes Sixt [Fri, 30 Nov 2007 21:28:38 +0000 (22:28 +0100)]
Windows: Use a relative default template_dir and ETC_GITCONFIG

With this definition the templates and system config file will be found
irrespective of the installation location.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Compute the fallback for exec_path from the program invocation.
Johannes Sixt [Wed, 11 Apr 2007 14:02:45 +0000 (16:02 +0200)]
Windows: Compute the fallback for exec_path from the program invocation.

Since on Windows the user is fairly free where to install programs, we
cannot rely on a hard-coded path. We use the program name to derive the
installation directory and use that as exec_path.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoTurn builtin_exec_path into a function.
Johannes Sixt [Wed, 11 Apr 2007 13:26:08 +0000 (15:26 +0200)]
Turn builtin_exec_path into a function.

builtin_exec_path returns the hard-coded installation path, which is used
as the ultimate fallback to look for git commands. Making it into a function
enables us in a follow-up patch to return a computed value instead of just
a constant string.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Use a customized struct stat that also has the st_blocks member.
Johannes Sixt [Mon, 12 Nov 2007 11:52:41 +0000 (12:52 +0100)]
Windows: Use a customized struct stat that also has the st_blocks member.

Windows's struct stat does not have a st_blocks member. Since we already
have our own stat/lstat/fstat implementations, we can just as well use
a customized struct stat. This patch introduces just that, and also fills
in the st_blocks member. On the other hand, we don't provide members that
are never used.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Add a custom implementation for utime().
Johannes Sixt [Fri, 7 Sep 2007 11:05:00 +0000 (13:05 +0200)]
Windows: Add a custom implementation for utime().

This is a necessary pendant to our lstat implementation: MSVCRT's
implementations of lstat and utime do some adjustments if daylight
saving time is in effect, but our lstat implementation doesn't do these
adjustments and report the correct UTC time.  With this implementation
we omit the adjustments in utime() as well and always write UTC.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Add a new lstat and fstat implementation based on Win32 API.
Marius Storm-Olsen [Mon, 3 Sep 2007 18:40:26 +0000 (20:40 +0200)]
Windows: Add a new lstat and fstat implementation based on Win32 API.

This gives us a significant speedup when adding, committing and stat'ing files.
Also, since Windows doesn't really handle symlinks, we let stat just uses lstat.
We also need to replace fstat, since our implementation and the standard stat()
functions report slightly different timestamps, possibly due to timezones.

We simply report UTC in our implementation, and do our FILETIME to time_t
conversion based on the document at http://support.microsoft.com/kb/167296.

With Moe's repo structure (100K files in 100 dirs, containing 2-4 bytes)
    mkdir bummer && cd bummer; for ((i=0;i<100;i++)); do
      mkdir $i && pushd $i;
        for ((j=0;j<1000;j++)); do echo "$j" >$j; done;
      popd;
    done

We get the following performance boost:

    With normal lstat & stat  Custom lstat/fstat
    ------------------------  ------------------------
    Command: git init         Command: git init
    ------------------------  ------------------------
    real    0m 0.047s          real   0m 0.063s
    user    0m 0.031s          user   0m 0.015s
    sys     0m 0.000s          sys    0m 0.015s
    ------------------------  ------------------------
    Command: git add .        Command: git add .
    ------------------------  ------------------------
    real    0m19.390s         real    0m12.031s       1.6x
    user    0m 0.015s         user    0m 0.031s
    sys     0m 0.030s         sys     0m 0.000s
    ------------------------  ------------------------
    Command: git commit -a..  Command: git commit -a..
    ------------------------  ------------------------
    real    0m30.812s         real    0m16.875s       1.8x
    user    0m 0.015s         user    0m 0.015s
    sys     0m 0.000s         sys     0m 0.015s
    ------------------------  ------------------------
    3x Command: git-status    3x Command: git-status
    ------------------------  ------------------------
    real    0m11.860s         real    0m 5.266s       2.2x
    user    0m 0.015s         user    0m 0.015s
    sys     0m 0.015s         sys     0m 0.015s

    real    0m11.703s         real    0m 5.234s
    user    0m 0.015s         user    0m 0.015s
    sys     0m 0.000s         sys     0m 0.000s

    real    0m11.672s         real    0m 5.250s
    user    0m 0.031s         user    0m 0.015s
    sys     0m 0.000s         sys     0m 0.000s
    ------------------------  ------------------------
    Command: git commit...    Command: git commit...
    (single file)             (single file)
    ------------------------  ------------------------
    real    0m14.234s         real    0m 7.735s       1.8x
    user    0m 0.015s         user    0m 0.031s
    sys     0m 0.000s         sys     0m 0.000s

Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Implement a custom spawnve().
Johannes Sixt [Sat, 24 Nov 2007 21:49:16 +0000 (22:49 +0100)]
Windows: Implement a custom spawnve().

The problem with Windows's own implementation is that it tries to be
clever when a console program is invoked from a GUI application: In this
case it sometimes automatically allocates a new console window. As a
consequence, the IO channels of the spawned program are directed to the
console, but the invoking application listens on channels that are now
directed to nowhere.

In this implementation we use the lowlevel facilities of CreateProcess(),
which offers a flag to tell the system not to open a console. As a side
effect, only stdin, stdout, and stderr channels will be accessible from
C programs that are spawned. Other channels (file handles, pipe handles,
etc.) are still inherited by the spawned program, but it doesn't get
enough information to access them.

Johannes Schindelin integrated path quoting and unified the various
*execv* and *spawnv* helpers. Eric Raible suggested to also quote '{'.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Implement wrappers for gethostbyname(), socket(), and connect().
Johannes Sixt [Wed, 26 Dec 2007 12:51:18 +0000 (13:51 +0100)]
Windows: Implement wrappers for gethostbyname(), socket(), and connect().

gethostbyname() is the first function that calls into the Winsock library,
and it is wrapped only to initialize the library.

socket() is wrapped for two reasons:
- Windows's socket() creates things that are like low-level file handles,
  and they must be converted into file descriptors first.
- And these handles cannot be used with plain ReadFile()/WriteFile()
  because they are opened for "overlapped IO". We have to use WSASocket()
  to create non-overlapped IO sockets.

connect() must be wrapped because Windows's connect() expects the low-level
sockets, not file descriptors, and we must first unwrap the file descriptor
before we can pass it on to Windows's connect().

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Work around incompatible sort and find.
Johannes Sixt [Fri, 30 Nov 2007 21:06:30 +0000 (22:06 +0100)]
Windows: Work around incompatible sort and find.

If the PATH lists the Windows system directories before the MSYS
directories, Windows's own incompatible sort and find commands would be
picked up. We implement these commands as functions and call the real
tools by absolute path.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Implement asynchronous functions as threads.
Johannes Sixt [Sat, 8 Dec 2007 21:19:14 +0000 (22:19 +0100)]
Windows: Implement asynchronous functions as threads.

In upload-pack we must explicitly close the output channel of rev-list.
(On Unix, the channel is closed automatically because process that runs
rev-list terminates.)

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Disambiguate DOS style paths from SSH URLs.
Johannes Sixt [Fri, 30 Nov 2007 21:51:10 +0000 (22:51 +0100)]
Windows: Disambiguate DOS style paths from SSH URLs.

If on Windows a path is specified as C:/path, then this is also a valid
SSH URL. To disambiguate between the two interpretations we take an URL
that looks like a path with a drive letter as a local URL.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: A rudimentary poll() emulation.
Johannes Sixt [Sat, 1 Dec 2007 21:00:56 +0000 (22:00 +0100)]
Windows: A rudimentary poll() emulation.

This emulation of poll() is by far not general. It assumes that the
fds that are to be waited for are connected to pipes. The pipes are
polled in a loop until data becomes available in at least one of them.
If only a single fd is waited for, the implementation actually does
not wait at all, but assumes that a subsequent read() will block.

In order not to needlessly burn CPU time, the CPU is yielded to other
processes before the next round in the poll loop using Sleep(0). Note that
any sleep timeout greater than zero will reduce the efficiency by a
magnitude.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoupdate-hook-example: optionally allow non-fast-forward
Dmitry Potapov [Wed, 25 Jun 2008 23:14:31 +0000 (03:14 +0400)]
update-hook-example: optionally allow non-fast-forward

Sometimes it is desirable to have non-fast-forward branches in a
shared repository. A typical example of that is the 'pu' branch.
This patch extends the format of allowed-users and allow-groups
files by using the '+' sign at the beginning as the mark that
non-fast-forward pushes are permitted to the branch.

Signed-off-by: Dmitry Potapov <dpotapov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-send-email: add support for TLS via Net::SMTP::SSL
Thomas Rast [Wed, 25 Jun 2008 19:42:43 +0000 (21:42 +0200)]
git-send-email: add support for TLS via Net::SMTP::SSL

We do this by handing over the Net::SMTP instance to Net::SMTP::SSL,
which avoids Net::SMTP::TLS and its weird error checking.  This trick
is due to Brian Evins.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-send-email: Accept fifos as well as files
Kevin Ballard [Wed, 25 Jun 2008 22:44:40 +0000 (15:44 -0700)]
git-send-email: Accept fifos as well as files

When a fifo is given, validation must be skipped because we can't
read the fifo twice. Ideally git-send-email would cache the read
data instead of attempting to read twice, but for now just skip
validation.

Signed-off-by: Kevin Ballard <kevin@sb.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agopack.indexversion config option now defaults to 2
Nicolas Pitre [Wed, 25 Jun 2008 04:25:53 +0000 (00:25 -0400)]
pack.indexversion config option now defaults to 2

As announced for 1.6.0.

Git older than version 1.5.2 (or any other git version with this option
set to 1) may revert to version 1 of the pack index by manually deleting
all .idx files and recreating them using 'git index-pack'.  Communication
over the git native protocol is unaffected since the pack index is never
transferred.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoMerge branch 'maint'
Junio C Hamano [Thu, 26 Jun 2008 01:29:14 +0000 (18:29 -0700)]
Merge branch 'maint'

* maint:
  GIT 1.5.6.1
  fix update-hook-example to work with packed tag references
  clone: create intermediate directories of destination repo
  for-each-ref: implement missing tag values
  git-rebase.sh: Add check if rebase is in progress

15 years agoAllow "git-reset path" when unambiguous
Junio C Hamano [Thu, 26 Jun 2008 01:16:36 +0000 (18:16 -0700)]
Allow "git-reset path" when unambiguous

Resetting a selected set of index entries is done with
"git reset -- paths" syntax, but we did not allow -- to be omitted
even when the command is unambiguous.

This updates the command to follow the general rule:

 * When -- appears, revs come before it, and paths come after it;

 * When there is no --, earlier ones are revs and the rest are paths, and
   we need to guess.  When lack of -- marker forces us to guess, we
   protect from user errors and typoes by making sure what we treat as
   revs do not appear as filenames in the work tree, and what we treat as
   paths do appear as filenames in the work tree, and by erroring out if
   that is not the case.  We tell the user to disambiguate by using -- in
   such a case.

which is employed elsewhere in the system.

When this rule is applied to "reset", because we can have only zero or one
rev to the command, the check can be slightly simpler than other programs.
We have to check only the first one or two tokens after the command name
and options, and when they are:

    -- A:
     no explicit rev given; "A" and whatever follows it are paths.

    A --:
        explicit rev "A" given and whatever follows the "--" are paths.

    A B:
       "A" could be rev or path and we need to guess.  "B" could
       be missing but if exists that (and everything that follows) would
       be paths.

So we apply the guess only in the last case and only to "A" (not "B" and
what comes after it).

 * As long as "A" is unambiguously a path, index entries for "A", "B" (and
   everything that follows) are reset to the HEAD revision.

 * If "A" is unambiguously a rev, on the other hand, the index entries for
   "B" (and everything that follows) are reset to the "A" revision.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoFix use of "perl -i" on Windows
Alex Riesen [Wed, 25 Jun 2008 18:35:13 +0000 (20:35 +0200)]
Fix use of "perl -i" on Windows

The perldiag(1) has following to say about this:

    "Can't do inplace edit without backup"

(F) You're on a system such as MS-DOS that gets confused if
you try reading from a deleted (but still opened) file. You
have to say -i.bak, or some such.

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoGIT 1.5.6.1 v1.5.6.1
Junio C Hamano [Thu, 26 Jun 2008 00:09:40 +0000 (17:09 -0700)]
GIT 1.5.6.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-gui: Don't select the wrong file if the last listed file is staged.
Abhijit Menon-Sen [Wed, 25 Jun 2008 10:36:50 +0000 (16:06 +0530)]
git-gui: Don't select the wrong file if the last listed file is staged.

Johannes Sixt noticed that if the last file in the list was staged, my
earlier patch would display the diff for the penultimate file, but show
the file _before_ that as being selected.

This was due to my misunderstanding the lno argument to show_diff.

This patch fixes the problem: lno is not decremented in the special case
to handle the last item in the list (though we still need to use $lno-1
to find the right path for the next diff).

Signed-off-by: Abhijit Menon-Sen <ams@toroid.org>
Tested-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
15 years agoMerge branch 'sb/rebase'
Junio C Hamano [Wed, 25 Jun 2008 20:20:26 +0000 (13:20 -0700)]
Merge branch 'sb/rebase'

* sb/rebase:
  t3404: stricter tests for git-rebase--interactive
  api-builtin.txt: update and fix typo

15 years agoMerge branch 'lw/gitweb'
Junio C Hamano [Wed, 25 Jun 2008 20:19:53 +0000 (13:19 -0700)]
Merge branch 'lw/gitweb'

* lw/gitweb:
  gitweb: standarize HTTP status codes

15 years agoMerge branch 'lt/config-fsync'
Junio C Hamano [Wed, 25 Jun 2008 20:19:49 +0000 (13:19 -0700)]
Merge branch 'lt/config-fsync'

* lt/config-fsync:
  Add config option to enable 'fsync()' of object files
  Split up default "i18n" and "branch" config parsing into helper routines
  Split up default "user" config parsing into helper routine
  Split up default "core" config parsing into helper routine

15 years agoMerge branch 'sr/tests'
Junio C Hamano [Wed, 25 Jun 2008 20:19:22 +0000 (13:19 -0700)]
Merge branch 'sr/tests'

* sr/tests:
  Hook up the result aggregation in the test makefile.
  A simple script to parse the results from the testcases
  Modify test-lib.sh to output stats to t/test-results/*

Conflicts:

t/test-lib.sh

15 years agoMerge branch 'jh/clone-packed-refs'
Junio C Hamano [Wed, 25 Jun 2008 20:18:54 +0000 (13:18 -0700)]
Merge branch 'jh/clone-packed-refs'

* jh/clone-packed-refs:
  Teach "git clone" to pack refs
  Prepare testsuite for a "git clone" that packs refs
  Move pack_refs() and friends into libgit
  Incorporate fetched packs in future object traversal

15 years agoMerge branch 'lw/perlish'
Junio C Hamano [Wed, 25 Jun 2008 20:18:46 +0000 (13:18 -0700)]
Merge branch 'lw/perlish'

* lw/perlish:
  Git.pm: add test suite
  t/test-lib.sh: add test_external and test_external_without_stderr

15 years agofix update-hook-example to work with packed tag references
Dmitry Potapov [Wed, 25 Jun 2008 08:26:55 +0000 (12:26 +0400)]
fix update-hook-example to work with packed tag references

The update-hook-example used 'test -f' to check the tag present, which
does not work if the checked reference is packed. This check has been
changed to use 'git rev-parse $tag' instead.

Signed-off-by: Dmitry Potapov <dpotapov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoclone: create intermediate directories of destination repo
Jeff King [Wed, 25 Jun 2008 05:41:34 +0000 (01:41 -0400)]
clone: create intermediate directories of destination repo

The shell version used to use "mkdir -p" to create the repo
path, but the C version just calls "mkdir". Let's replicate
the old behavior. We have to create the git and worktree
leading dirs separately; while most of the time, the
worktree dir contains the git dir (as .git), the user can
override this using GIT_WORK_TREE.

We can reuse safe_create_leading_directories, but we need to
make a copy of our const buffer to do so. Since
merge-recursive uses the same pattern, we can factor this
out into a global function. This has two other cleanup
advantages for merge-recursive:

  1. mkdir_p wasn't a very good name. "mkdir -p foo/bar" actually
     creates bar, but this function just creates the leading
     directories.

  2. mkdir_p took a mode argument, but it was completely
     ignored.

Acked-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoMerge branch 'jc/maint-combine-diff-pre-context' into maint
Junio C Hamano [Wed, 25 Jun 2008 18:20:01 +0000 (11:20 -0700)]
Merge branch 'jc/maint-combine-diff-pre-context' into maint

* jc/maint-combine-diff-pre-context:
  diff -c/--cc: do not include uninteresting deletion before leading context

15 years agoMerge branch 'lt/maint-gitdir-relative' into maint
Junio C Hamano [Wed, 25 Jun 2008 18:19:33 +0000 (11:19 -0700)]
Merge branch 'lt/maint-gitdir-relative' into maint

* lt/maint-gitdir-relative:
  Make git_dir a path relative to work_tree in setup_work_tree()

15 years agoMerge branch 'sb/maint-rebase' into maint
Junio C Hamano [Wed, 25 Jun 2008 18:18:39 +0000 (11:18 -0700)]
Merge branch 'sb/maint-rebase' into maint

* sb/maint-rebase:
  git-rebase.sh: Add check if rebase is in progress

15 years agofor-each-ref: implement missing tag values
Jeff King [Wed, 25 Jun 2008 16:08:15 +0000 (12:08 -0400)]
for-each-ref: implement missing tag values

The "type" and "object" fields for tags were accepted as
valid atoms, but never implemented. Consequently, they
simply returned the empty string, even for valid tags.

Noticed by Lea Wiemann.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agorepack.usedeltabaseoffset config option now defaults to "true"
Nicolas Pitre [Wed, 25 Jun 2008 04:24:53 +0000 (00:24 -0400)]
repack.usedeltabaseoffset config option now defaults to "true"

As announced for 1.6.0.

Access over the native protocol by old git versions is unaffected as
this capability is negociated by the protocol.  Otherwise setting this
config option to "false" and doing a 'git repack -a -d' is enough to
remain compatible with ancient git versions (older than 1.4.4).

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoverify-pack: test for detection of index v2 object CRC mismatch
Nicolas Pitre [Wed, 25 Jun 2008 03:19:44 +0000 (23:19 -0400)]
verify-pack: test for detection of index v2 object CRC mismatch

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoverify-pack: check packed object CRC when using index version 2
Nicolas Pitre [Wed, 25 Jun 2008 03:19:02 +0000 (23:19 -0400)]
verify-pack: check packed object CRC when using index version 2

To do so, check_pack_crc() moved from builtin-pack-objects.c to
pack-check.c where it is more logical to share.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agomove show_pack_info() where it belongs
Nicolas Pitre [Wed, 25 Jun 2008 03:18:17 +0000 (23:18 -0400)]
move show_pack_info() where it belongs

This is called when verify_pack() has its verbose argument set, and
verbose in this context makes sense only for the actual 'git verify-pack'
command.  Therefore let's move show_pack_info() to builtin-verify-pack.c
instead and remove useless verbose argument from verify_pack().

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agooptimize verify-pack a bit
Nicolas Pitre [Wed, 25 Jun 2008 03:17:12 +0000 (23:17 -0400)]
optimize verify-pack a bit

Using find_pack_entry_one() to get object offsets is rather suboptimal
when nth_packed_object_offset() can be used directly.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoclone: create intermediate directories of destination repo
Jeff King [Wed, 25 Jun 2008 05:41:34 +0000 (01:41 -0400)]
clone: create intermediate directories of destination repo

The shell version used to use "mkdir -p" to create the repo
path, but the C version just calls "mkdir". Let's replicate
the old behavior. We have to create the git and worktree
leading dirs separately; while most of the time, the
worktree dir contains the git dir (as .git), the user can
override this using GIT_WORK_TREE.

We can reuse safe_create_leading_directories, but we need to
make a copy of our const buffer to do so. Since
merge-recursive uses the same pattern, we can factor this
out into a global function. This has two other cleanup
advantages for merge-recursive:

  1. mkdir_p wasn't a very good name. "mkdir -p foo/bar" actually
     creates bar, but this function just creates the leading
     directories.

  2. mkdir_p took a mode argument, but it was completely
     ignored.

Acked-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoKeep some git-* programs in $(bindir)
Junio C Hamano [Wed, 25 Jun 2008 02:58:11 +0000 (19:58 -0700)]
Keep some git-* programs in $(bindir)

Otherwise remote executions directly over ssh won't find them as they used
to.  --upload-pack and --receive-pack options _could_ be used on the
client side, but things should keep working out-of-box for older clients.

Later versions of clients (fetch-pack and send-pack) probably could start
asking for these programs with dashless form, but that is a different
topic.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoShip sample hooks with .sample suffix
Junio C Hamano [Wed, 25 Jun 2008 01:45:21 +0000 (18:45 -0700)]
Ship sample hooks with .sample suffix

We used to mark hooks we ship as samples by making them unexecutable, but
some filesystems cannot tell what is executable and what is not.

This makes it much more explicit.  The hooks are suffixed with .sample
(but now are made executable), so enabling it is still one step operation
(instead of "chmod +x $hook", you would do "mv $hook.sample $hook") but
now they won't get accidentally enabled on systems without executable bit.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agopre-rebase hook update
Junio C Hamano [Wed, 25 Jun 2008 02:05:45 +0000 (19:05 -0700)]
pre-rebase hook update

This hook is what I have been using to manage topic branches in git.git,
but have not been updated to the Real Thing for a while.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agorefactor pack structure allocation
Nicolas Pitre [Tue, 24 Jun 2008 22:58:06 +0000 (18:58 -0400)]
refactor pack structure allocation

New pack structures are currently allocated in 2 different places
and all members have to be initialized explicitly.  This is prone
to errors leading to segmentation faults as found by Teemu Likonen.

Let's have a common place where this structure is allocated, and have
all members explicitly initialized to zero.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoPrepare execv_git_cmd() for removal of builtins from the filesystem
Junio C Hamano [Sun, 2 Dec 2007 06:09:22 +0000 (22:09 -0800)]
Prepare execv_git_cmd() for removal of builtins from the filesystem

Currently, execv_git_cmd() always try running the dashed form, which
means we cannot easily remove the git-foo hardlinks for built-in
commands.  This updates the function to always exec "git foo" form, and
makes sure "git" potty does not infinitely recurse to itself.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agogit-shell: accept "git foo" form
Junio C Hamano [Sun, 2 Dec 2007 06:16:19 +0000 (22:16 -0800)]
git-shell: accept "git foo" form

Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agotest case for pack resilience against corruptions
Nicolas Pitre [Tue, 24 Jun 2008 01:24:28 +0000 (21:24 -0400)]
test case for pack resilience against corruptions

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoimplement some resilience against pack corruptions
Nicolas Pitre [Tue, 24 Jun 2008 01:23:39 +0000 (21:23 -0400)]
implement some resilience against pack corruptions

We should be able to fall back to loose objects or alternative packs when
a pack becomes corrupted.  This is especially true when an object exists
in one pack only as a delta but its base object is corrupted.  Currently
there is no way to retrieve the former object even if the later is
available in another pack or loose.

This patch allows for a delta to be resolved (with a performance cost)
using a base object from a source other than the pack where that delta
is located.  Same thing for non-delta objects: rather than failing
outright, a search is made in other packs or used loose when the
currently active pack has it but corrupted.

Of course git will become extremely noisy with error messages when that
happens.  However, if the operation succeeds nevertheless, a simple
'git repack -a -f -d' will "fix" the corrupted repository given that all
corrupted objects have a good duplicate somewhere in the object store,
possibly manually copied from another source.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agocall init_pack_revindex() lazily
Nicolas Pitre [Tue, 24 Jun 2008 01:22:14 +0000 (21:22 -0400)]
call init_pack_revindex() lazily

This makes life much easier for next patch, as well as being more efficient
when the revindex is actually not used.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoMerge branch 'maint'
Junio C Hamano [Tue, 24 Jun 2008 00:52:02 +0000 (17:52 -0700)]
Merge branch 'maint'

* maint:
  git-svn: make rebuild respect rewriteRoot option
  Workaround for AIX mkstemp()

15 years agogit-svn: make rebuild respect rewriteRoot option
Jan Krüger [Tue, 24 Jun 2008 00:17:36 +0000 (02:17 +0200)]
git-svn: make rebuild respect rewriteRoot option

Suppose someone fetches git-svn-ified commits from another repo and then
attempts to use 'git-svn init --rewrite-root=foo bar'. Using git svn rebase
after that will fail badly:

 * For each commit tried by working_head_info, rebuild is called indirectly.
 * rebuild will iterate over all commits and skip all of them because the
   URL does not match. Because of that no rev_map file is generated at all.
 * Thus, rebuild will run once for every commit. This takes ages.
 * In the end there still isn't any rev_map file and thus working_head_info
   fails.

Addressing this behaviour fixes an apparently not too uncommon problem with
providing git-svn mirrors of Subversion repositories. Some repositories are
accessed using different URLs depending on whether the user has push
privileges or not. In the latter case, an anonymous URL is often used that
differs from the push URL. Providing a mirror that is usable in both cases
becomes a lot more possible with this change.

Signed-off-by: Jan Krüger <jk@jk.gs>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoWorkaround for AIX mkstemp()
Patrick Higgins [Mon, 23 Jun 2008 21:33:41 +0000 (15:33 -0600)]
Workaround for AIX mkstemp()

The AIX mkstemp will modify it's template parameter to an empty string if
the call fails. This caused a subsequent mkdir to fail.

Signed-off-by: Patrick Higgins <patrick.higgins@cexp.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agot9301-fast-export.sh: Remove debug line
Michele Ballabio [Mon, 23 Jun 2008 16:19:23 +0000 (18:19 +0200)]
t9301-fast-export.sh: Remove debug line

Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
15 years agoWindows: Implement start_command().
Johannes Sixt [Fri, 7 Dec 2007 21:08:59 +0000 (22:08 +0100)]
Windows: Implement start_command().

On Windows, we have spawnv() variants to run a child process instead of
fork()/exec(). In order to attach pipe ends to stdin, stdout, and stderr,
we have to use this idiom:

    save1 = dup(1);
    dup2(pipe[1], 1);
    spawnv();
    dup2(save1, 1);
    close(pipe[1]);

assuming that the descriptors created by pipe() are not inheritable.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: A pipe() replacement whose ends are not inherited to children.
Johannes Sixt [Fri, 7 Dec 2007 21:05:36 +0000 (22:05 +0100)]
Windows: A pipe() replacement whose ends are not inherited to children.

On Unix the idiom to use a pipe is as follows:

    pipe(fd);
    pid = fork();
    if (!pid) {
        dup2(fd[1], 1);
        close(fd[1]);
        close(fd[0]);
        ...
     }
     close(fd[1]);

i.e. the child process closes the both pipe ends after duplicating one
to the file descriptors where they are needed.

On Windows, which does not have fork(), we never have an opportunity to
(1) duplicate a pipe end in the child, (2) close unused pipe ends. Instead,
we must use this idiom:

    save1 = dup(1);
    pipe(fd);
    dup2(fd[1], 1);
    spawn(...);
    dup2(save1, 1);
    close(fd[1]);

i.e. save away the descriptor at the destination slot, replace by the pipe
end, spawn process, restore the saved file.

But there is a problem: Notice that the child did not only inherit the
dup2()ed descriptor, but also *both* original pipe ends. Although the one
end that was dup()ed could be closed before the spawn(), we cannot close
the other end - the child inherits it, no matter what.

The solution is to generate non-inheritable pipes. At the first glance,
this looks strange: The purpose of pipes is usually to be inherited to
child processes. But notice that in the course of actions as outlined
above, the pipe descriptor that we want to inherit to the child is
dup2()ed, and as it so happens, Windows's dup2() creates inheritable
duplicates.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Wrap execve so that shell scripts can be invoked.
Johannes Sixt [Tue, 4 Dec 2007 11:38:32 +0000 (12:38 +0100)]
Windows: Wrap execve so that shell scripts can be invoked.

When an external git command is invoked, it can be a Bourne shell script.
This patch looks into the command file to see whether it is one.
In this case, the command line is rearranged to invoke the shell
with the proper arguments.

With this change, scripted git commands work. Command line arguments
to those scripts cannot be complex (contain spaces or double-quotes), yet.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Implement setitimer() and sigaction().
Johannes Sixt [Tue, 13 Nov 2007 09:14:45 +0000 (10:14 +0100)]
Windows: Implement setitimer() and sigaction().

The timer is implemented using a thread that calls the signal handler
at regular intervals.

We also replace Windows's signal() function because we must intercept
that SIGALRM is set (which is used when a timer is canceled).

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Fix PRIuMAX definition.
Johannes Sixt [Fri, 23 Mar 2007 09:57:05 +0000 (10:57 +0100)]
Windows: Fix PRIuMAX definition.

Since GIT calls into Microsoft's MSVCRT.DLL, it must use the printf
format that this DLL uses for 64-bit integers, which is %I64u instead
of %llu.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoWindows: Implement gettimeofday().
Johannes Sixt [Sat, 1 Dec 2007 20:51:20 +0000 (21:51 +0100)]
Windows: Implement gettimeofday().

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
15 years agoMake my_mktime() public and rename it to tm_to_time_t()
Johannes Sixt [Mon, 23 Jun 2008 06:31:41 +0000 (08:31 +0200)]
Make my_mktime() public and rename it to tm_to_time_t()

We will use it from the MinGW port's gettimeofday() substitution.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>