Browse Source

Merge branch 'maint'

* maint:
  Fix checkout of large files to network shares on Windows XP
  start_command: close cmd->err descriptor when fork/spawn fails
  Fix "Out of memory? mmap failed" for files larger than 4GB on Windows
maint
Junio C Hamano 15 years ago
parent
commit
1be270cbdf
  1. 17
      compat/mingw.c
  2. 3
      compat/mingw.h
  3. 6
      compat/win32mmap.c
  4. 2
      run-command.c
  5. 2
      t/t5516-fetch-push.sh
  6. 12
      t/t5705-clone-2gb.sh

17
compat/mingw.c

@ -140,6 +140,23 @@ int mingw_open (const char *filename, int oflags, ...) @@ -140,6 +140,23 @@ int mingw_open (const char *filename, int oflags, ...)
return fd;
}

#undef write
ssize_t mingw_write(int fd, const void *buf, size_t count)
{
/*
* While write() calls to a file on a local disk are translated
* into WriteFile() calls with a maximum size of 64KB on Windows
* XP and 256KB on Vista, no such cap is placed on writes to
* files over the network on Windows XP. Unfortunately, there
* seems to be a limit of 32MB-28KB on X64 and 64MB-32KB on x86;
* bigger writes fail on Windows XP.
* So we cap to a nice 31MB here to avoid write failures over
* the net without changing the number of WriteFile() calls in
* the local case.
*/
return write(fd, buf, min(count, 31 * 1024 * 1024));
}

#undef fopen
FILE *mingw_fopen (const char *filename, const char *otype)
{

3
compat/mingw.h

@ -170,6 +170,9 @@ int link(const char *oldpath, const char *newpath); @@ -170,6 +170,9 @@ int link(const char *oldpath, const char *newpath);
int mingw_open (const char *filename, int oflags, ...);
#define open mingw_open

ssize_t mingw_write(int fd, const void *buf, size_t count);
#define write mingw_write

FILE *mingw_fopen (const char *filename, const char *otype);
#define fopen mingw_fopen


6
compat/win32mmap.c

@ -4,19 +4,19 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of @@ -4,19 +4,19 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
{
HANDLE hmap;
void *temp;
size_t len;
off_t len;
struct stat st;
uint64_t o = offset;
uint32_t l = o & 0xFFFFFFFF;
uint32_t h = (o >> 32) & 0xFFFFFFFF;

if (!fstat(fd, &st))
len = xsize_t(st.st_size);
len = st.st_size;
else
die("mmap: could not determine filesize");

if ((length + offset) > len)
length = len - offset;
length = xsize_t(len - offset);

if (!(flags & MAP_PRIVATE))
die("Invalid usage of mmap when built with USE_WIN32_MMAP");

2
run-command.c

@ -383,6 +383,8 @@ fail_pipe: @@ -383,6 +383,8 @@ fail_pipe:
close(cmd->out);
if (need_err)
close_pair(fderr);
else if (cmd->err)
close(cmd->err);
errno = failed_errno;
return -1;
}

2
t/t5516-fetch-push.sh

@ -528,7 +528,7 @@ test_expect_success 'push does not update local refs on failure' ' @@ -528,7 +528,7 @@ test_expect_success 'push does not update local refs on failure' '
mk_test heads/master &&
mk_child child &&
mkdir testrepo/.git/hooks &&
echo exit 1 >testrepo/.git/hooks/pre-receive &&
echo "#!/no/frobnication/today" >testrepo/.git/hooks/pre-receive &&
chmod +x testrepo/.git/hooks/pre-receive &&
(cd child &&
git pull .. master

12
t/t5705-clone-2gb.sh

@ -12,7 +12,7 @@ test_expect_success 'setup' ' @@ -12,7 +12,7 @@ test_expect_success 'setup' '

git config pack.compression 0 &&
git config pack.depth 0 &&
blobsize=$((20*1024*1024)) &&
blobsize=$((100*1024*1024)) &&
blobcount=$((2*1024*1024*1024/$blobsize+1)) &&
i=1 &&
(while test $i -le $blobcount
@ -36,9 +36,15 @@ test_expect_success 'setup' ' @@ -36,9 +36,15 @@ test_expect_success 'setup' '

'

test_expect_success 'clone' '
test_expect_success 'clone - bare' '

git clone --bare --no-hardlinks . clone
git clone --bare --no-hardlinks . clone-bare

'

test_expect_success 'clone - with worktree, file:// protocol' '

git clone file://. clone-wt

'


Loading…
Cancel
Save