make_makefiles: Merge the generated gitignores in dlls and programs into the top-level one.
diff --git a/.gitignore b/.gitignore
index 2439e8a..6e57152 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+# Automatically generated by make_makefiles; DO NOT EDIT!!
 *.[oa]
 *.avi
 *.bmp
@@ -11,20 +12,191 @@
 *.tlb
 *.yy.c
 *_[cips].c
-*~
+/Make.rules
 /TAGS
 /autom4te.cache
 /config.cache
 /config.log
 /config.status
 /tags
-Makefile
-# Everything below this line is generated by make_makefiles
-/Make.rules
 /wine
+Makefile
+dlls/*/tests/*.ok
+dlls/*/tests/testlist.c
 dlls/Makedll.rules
 dlls/Makeimplib.rules
 dlls/Maketest.rules
+dlls/activeds/libactiveds.def
+dlls/advapi32/libadvapi32.def
+dlls/advpack/libadvpack.def
+dlls/atl/atliface.h
+dlls/atl/libatl.def
+dlls/avicap32/libavicap32.def
+dlls/avifil32/libavifil32.def
+dlls/avifile.dll16
+dlls/cabinet/libcabinet.def
+dlls/capi2032/libcapi2032.def
+dlls/cards/libcards.def
+dlls/cfgmgr32/libcfgmgr32.def
+dlls/clusapi/libclusapi.def
+dlls/comctl32/libcomctl32.def
+dlls/comdlg32/libcomdlg32.def
+dlls/comm.drv16
+dlls/commdlg.dll16
+dlls/compobj.dll16
+dlls/compstui/libcompstui.def
+dlls/crtdll/libcrtdll.def
+dlls/crypt32/libcrypt32.def
+dlls/cryptdll/libcryptdll.def
+dlls/ctl3d.dll16
+dlls/ctl3d32/libctl3d32.def
+dlls/ctl3dv2.dll16
+dlls/d3d8/libd3d8.def
+dlls/d3d9/libd3d9.def
+dlls/d3dim/libd3dim.def
+dlls/d3drm/libd3drm.def
+dlls/d3dx8/libd3dx8.def
+dlls/d3dxof/libd3dxof.def
+dlls/dbghelp/libdbghelp.def
+dlls/dciman32/libdciman32.def
+dlls/ddeml.dll16
+dlls/ddraw/libddraw.def
+dlls/dinput/libdinput.def
+dlls/dinput8/libdinput8.def
+dlls/dispdib.dll16
+dlls/display.drv16
+dlls/dmusic32/libdmusic32.def
+dlls/dnsapi/libdnsapi.def
+dlls/dplay/libdplay.def
+dlls/dplayx/libdplayx.def
+dlls/dpnet/libdpnet.def
+dlls/dsound/libdsound.def
+dlls/gdi.exe16
+dlls/gdi32/libgdi32.def
+dlls/glu32/libglu32.def
+dlls/hid/libhid.def
+dlls/hlink/libhlink.def
+dlls/icmp/libicmp.def
+dlls/imagehlp/libimagehlp.def
+dlls/imm.dll16
+dlls/imm32/libimm32.def
+dlls/iphlpapi/libiphlpapi.def
+dlls/kernel32/libkernel32.def
+dlls/keyboard.drv16
+dlls/krnl386.exe16
+dlls/libwinspool.def
+dlls/lz32/liblz32.def
+dlls/lzexpand.dll16
+dlls/mapi32/libmapi32.def
+dlls/mlang/libmlang.def
+dlls/mmsystem.dll16
+dlls/mouse.drv16
+dlls/mpr/libmpr.def
+dlls/mprapi/libmprapi.def
+dlls/msacm.dll16
+dlls/msacm32/libmsacm32.def
+dlls/mscms/libmscms.def
+dlls/msdmo/libmsdmo.def
+dlls/mshtml/libmshtml.def
+dlls/mshtml/nsiface.h
+dlls/msi/libmsi.def
+dlls/msimg32/libmsimg32.def
+dlls/msvcrt/libmsvcrt.def
+dlls/msvcrt20/libmsvcrt20.def
+dlls/msvcrt40/libmsvcrt40.def
+dlls/msvcrtd/libmsvcrtd.def
+dlls/msvfw32/libmsvfw32.def
+dlls/msvideo.dll16
+dlls/mswsock/libmswsock.def
+dlls/nddeapi/libnddeapi.def
+dlls/netapi32/libnetapi32.def
+dlls/newdev/libnewdev.def
+dlls/ntdll/libntdll.def
+dlls/ntdsapi/libntdsapi.def
+dlls/odbc32/libodbc32.def
+dlls/odbccp32/libodbccp32.def
+dlls/ole2.dll16
+dlls/ole2conv.dll16
+dlls/ole2disp.dll16
+dlls/ole2nls.dll16
+dlls/ole2prox.dll16
+dlls/ole2thk.dll16
+dlls/ole32/dcom.h
+dlls/ole32/libole32.def
+dlls/oleacc/liboleacc.def
+dlls/oleaut32/liboleaut32.def
+dlls/olecli.dll16
+dlls/olecli32/libolecli32.def
+dlls/oledlg/liboledlg.def
+dlls/olepro32/libolepro32.def
+dlls/olesvr.dll16
+dlls/olesvr32/libolesvr32.def
+dlls/opengl32/libopengl32.def
+dlls/powrprof/libpowrprof.def
+dlls/psapi/libpsapi.def
+dlls/quartz/libquartz.def
+dlls/rasapi16.dll16
+dlls/rasapi32/librasapi32.def
+dlls/resutils/libresutils.def
+dlls/riched20/libriched20.def
+dlls/rpcrt4/librpcrt4.def
+dlls/rsaenh/librsaenh.def
+dlls/secur32/libsecur32.def
+dlls/sensapi/libsensapi.def
+dlls/serialui/libserialui.def
+dlls/setupapi/libsetupapi.def
+dlls/setupx.dll16
+dlls/sfc/libsfc.def
+dlls/shdocvw/libshdocvw.def
+dlls/shell.dll16
+dlls/shell32/libshell32.def
+dlls/shfolder/libshfolder.def
+dlls/shlwapi/libshlwapi.def
+dlls/snmpapi/libsnmpapi.def
+dlls/sound.drv16
+dlls/sti/libsti.def
+dlls/storage.dll16
+dlls/stress.dll16
+dlls/system.drv16
+dlls/tapi32/libtapi32.def
+dlls/toolhelp.dll16
+dlls/twain.dll16
+dlls/typelib.dll16
+dlls/unicows/libunicows.def
+dlls/url/liburl.def
+dlls/urlmon/liburlmon.def
+dlls/user.exe16
+dlls/user32/libuser32.def
+dlls/usp10/libusp10.def
+dlls/uxtheme/libuxtheme.def
+dlls/vdmdbg/libvdmdbg.def
+dlls/ver.dll16
+dlls/version/libversion.def
+dlls/w32sys.dll16
+dlls/win32s16.dll16
+dlls/win87em.dll16
+dlls/winaspi.dll16
+dlls/windebug.dll16
+dlls/wined3d/libwined3d.def
+dlls/winedos/libwinedos.def
+dlls/wineps16.drv16
+dlls/wing.dll16
+dlls/wininet/libwininet.def
+dlls/winmm/libwinmm.def
+dlls/winnls.dll16
+dlls/winnls32/libwinnls32.def
+dlls/winsock.dll16
+dlls/winspool.drv/libwinspool.def
+dlls/wintab.dll16
+dlls/wintab32/libwintab32.def
+dlls/wintrust/libwintrust.def
+dlls/wldap32/libwldap32.def
+dlls/wnaspi32/libwnaspi32.def
+dlls/wow32/libwow32.def
+dlls/wprocs.dll16
+dlls/ws2_32/libws2_32.def
+dlls/wsock32/libwsock32.def
+dlls/wtsapi32/libwtsapi32.def
 loader/wine
 loader/wine-glibc
 loader/wine-kthread
@@ -32,9 +204,100 @@
 loader/wine-pthread
 loader/wine.man
 programs/Makeprog.rules
+programs/clock/clock
+programs/cmd/cmd
+programs/cmdlgtst/cmdlgtst
+programs/control/control
+programs/eject/eject
+programs/expand/expand
+programs/explorer/explorer
+programs/hh/hh
+programs/icinfo/icinfo
+programs/iexplore/iexplore
+programs/msiexec/msiexec
+programs/notepad/notepad
+programs/oleview/oleview
+programs/progman/progman
+programs/regedit/regedit
+programs/regsvr32/regsvr32
+programs/rpcss/rpcss
+programs/rundll32/rundll32
+programs/start/start
+programs/taskmgr/taskmgr
+programs/uninstaller/uninstaller
+programs/view/view
 programs/wineapploader
+programs/wineboot/wineboot
+programs/winebrowser/winebrowser
+programs/winecfg/winecfg
+programs/wineconsole/wineconsole
+programs/winedbg/winedbg
 programs/winedbg/winedbg.man
+programs/winefile/winefile
 programs/winelauncher
+programs/winemenubuilder/winemenubuilder
+programs/winemine/winemine
+programs/winepath/winepath
+programs/winetest/advapi32_test.exe
+programs/winetest/advpack_test.exe
+programs/winetest/cabinet_test.exe
+programs/winetest/comcat_test.exe
+programs/winetest/comctl32_test.exe
+programs/winetest/comdlg32_test.exe
+programs/winetest/crypt32_test.exe
+programs/winetest/d3d8_test.exe
+programs/winetest/d3d9_test.exe
+programs/winetest/ddraw_test.exe
+programs/winetest/dinput_test.exe
+programs/winetest/dnsapi_test.exe
+programs/winetest/dsound_test.exe
+programs/winetest/gdi32_test.exe
+programs/winetest/hlink_test.exe
+programs/winetest/infosoft_test.exe
+programs/winetest/iphlpapi_test.exe
+programs/winetest/itss_test.exe
+programs/winetest/kernel32_test.exe
+programs/winetest/localspl_test.exe
+programs/winetest/lz32_test.exe
+programs/winetest/mapi32_test.exe
+programs/winetest/mlang_test.exe
+programs/winetest/msacm32_test.exe
+programs/winetest/mscms_test.exe
+programs/winetest/mshtml_test.exe
+programs/winetest/msi_test.exe
+programs/winetest/msvcrt_test.exe
+programs/winetest/msvcrtd_test.exe
+programs/winetest/msxml3_test.exe
+programs/winetest/netapi32_test.exe
+programs/winetest/ntdll_test.exe
+programs/winetest/ole32_test.exe
+programs/winetest/oleaut32_test.exe
+programs/winetest/psapi_test.exe
+programs/winetest/quartz_test.exe
+programs/winetest/riched20_test.exe
+programs/winetest/rpcrt4_test.exe
+programs/winetest/rsabase_test.exe
+programs/winetest/rsaenh_test.exe
+programs/winetest/secur32_test.exe
+programs/winetest/setupapi_test.exe
+programs/winetest/shdocvw_test.exe
+programs/winetest/shell32_test.exe
+programs/winetest/shlwapi_test.exe
+programs/winetest/urlmon_test.exe
+programs/winetest/user32_test.exe
+programs/winetest/usp10_test.exe
+programs/winetest/uxtheme_test.exe
+programs/winetest/version_test.exe
+programs/winetest/winetest
+programs/winetest/wininet_test.exe
+programs/winetest/winmm_test.exe
+programs/winetest/winspool.drv_test.exe
+programs/winetest/wintrust_test.exe
+programs/winetest/ws2_32_test.exe
+programs/winevdm/winevdm
+programs/winhelp/winhelp
+programs/winver/winver
+programs/wordpad/wordpad
 server/wineserver
 server/wineserver.man
 tools/bin2res
diff --git a/dlls/.gitignore b/dlls/.gitignore
deleted file mode 100644
index 0a3eebc..0000000
--- a/dlls/.gitignore
+++ /dev/null
@@ -1,174 +0,0 @@
-# Automatically generated by make_makefiles; DO NOT EDIT!!
-*/tests/*.ok
-*/tests/testlist.c
-/avifile.dll16
-/comm.drv16
-/commdlg.dll16
-/compobj.dll16
-/ctl3d.dll16
-/ctl3dv2.dll16
-/ddeml.dll16
-/dispdib.dll16
-/display.drv16
-/gdi.exe16
-/imm.dll16
-/keyboard.drv16
-/krnl386.exe16
-/libwinspool.def
-/lzexpand.dll16
-/mmsystem.dll16
-/mouse.drv16
-/msacm.dll16
-/msvideo.dll16
-/ole2.dll16
-/ole2conv.dll16
-/ole2disp.dll16
-/ole2nls.dll16
-/ole2prox.dll16
-/ole2thk.dll16
-/olecli.dll16
-/olesvr.dll16
-/rasapi16.dll16
-/setupx.dll16
-/shell.dll16
-/sound.drv16
-/storage.dll16
-/stress.dll16
-/system.drv16
-/toolhelp.dll16
-/twain.dll16
-/typelib.dll16
-/user.exe16
-/ver.dll16
-/w32sys.dll16
-/win32s16.dll16
-/win87em.dll16
-/winaspi.dll16
-/windebug.dll16
-/wineps16.drv16
-/wing.dll16
-/winnls.dll16
-/winsock.dll16
-/wintab.dll16
-/wprocs.dll16
-activeds/libactiveds.def
-advapi32/libadvapi32.def
-advpack/libadvpack.def
-atl/atliface.h
-atl/libatl.def
-avicap32/libavicap32.def
-avifil32/libavifil32.def
-cabinet/libcabinet.def
-capi2032/libcapi2032.def
-cards/libcards.def
-cfgmgr32/libcfgmgr32.def
-clusapi/libclusapi.def
-comctl32/libcomctl32.def
-comdlg32/libcomdlg32.def
-compstui/libcompstui.def
-crtdll/libcrtdll.def
-crypt32/libcrypt32.def
-cryptdll/libcryptdll.def
-ctl3d32/libctl3d32.def
-d3d8/libd3d8.def
-d3d9/libd3d9.def
-d3dim/libd3dim.def
-d3drm/libd3drm.def
-d3dx8/libd3dx8.def
-d3dxof/libd3dxof.def
-dbghelp/libdbghelp.def
-dciman32/libdciman32.def
-ddraw/libddraw.def
-dinput/libdinput.def
-dinput8/libdinput8.def
-dmusic32/libdmusic32.def
-dnsapi/libdnsapi.def
-dplay/libdplay.def
-dplayx/libdplayx.def
-dpnet/libdpnet.def
-dsound/libdsound.def
-gdi32/libgdi32.def
-glu32/libglu32.def
-hid/libhid.def
-hlink/libhlink.def
-icmp/libicmp.def
-imagehlp/libimagehlp.def
-imm32/libimm32.def
-iphlpapi/libiphlpapi.def
-kernel32/libkernel32.def
-lz32/liblz32.def
-mapi32/libmapi32.def
-mlang/libmlang.def
-mpr/libmpr.def
-mprapi/libmprapi.def
-msacm32/libmsacm32.def
-mscms/libmscms.def
-msdmo/libmsdmo.def
-mshtml/libmshtml.def
-mshtml/nsiface.h
-msi/libmsi.def
-msimg32/libmsimg32.def
-msvcrt/libmsvcrt.def
-msvcrt20/libmsvcrt20.def
-msvcrt40/libmsvcrt40.def
-msvcrtd/libmsvcrtd.def
-msvfw32/libmsvfw32.def
-mswsock/libmswsock.def
-nddeapi/libnddeapi.def
-netapi32/libnetapi32.def
-newdev/libnewdev.def
-ntdll/libntdll.def
-ntdsapi/libntdsapi.def
-odbc32/libodbc32.def
-odbccp32/libodbccp32.def
-ole32/dcom.h
-ole32/libole32.def
-oleacc/liboleacc.def
-oleaut32/liboleaut32.def
-olecli32/libolecli32.def
-oledlg/liboledlg.def
-olepro32/libolepro32.def
-olesvr32/libolesvr32.def
-opengl32/libopengl32.def
-powrprof/libpowrprof.def
-psapi/libpsapi.def
-quartz/libquartz.def
-rasapi32/librasapi32.def
-resutils/libresutils.def
-riched20/libriched20.def
-rpcrt4/librpcrt4.def
-rsaenh/librsaenh.def
-secur32/libsecur32.def
-sensapi/libsensapi.def
-serialui/libserialui.def
-setupapi/libsetupapi.def
-sfc/libsfc.def
-shdocvw/libshdocvw.def
-shell32/libshell32.def
-shfolder/libshfolder.def
-shlwapi/libshlwapi.def
-snmpapi/libsnmpapi.def
-sti/libsti.def
-tapi32/libtapi32.def
-unicows/libunicows.def
-url/liburl.def
-urlmon/liburlmon.def
-user32/libuser32.def
-usp10/libusp10.def
-uxtheme/libuxtheme.def
-vdmdbg/libvdmdbg.def
-version/libversion.def
-wined3d/libwined3d.def
-winedos/libwinedos.def
-wininet/libwininet.def
-winmm/libwinmm.def
-winnls32/libwinnls32.def
-winspool.drv/libwinspool.def
-wintab32/libwintab32.def
-wintrust/libwintrust.def
-wldap32/libwldap32.def
-wnaspi32/libwnaspi32.def
-wow32/libwow32.def
-ws2_32/libws2_32.def
-wsock32/libwsock32.def
-wtsapi32/libwtsapi32.def
diff --git a/programs/.gitignore b/programs/.gitignore
deleted file mode 100644
index 08910ef..0000000
--- a/programs/.gitignore
+++ /dev/null
@@ -1,37 +0,0 @@
-# Automatically generated by make_makefiles; DO NOT EDIT!!
-clock/clock
-cmd/cmd
-cmdlgtst/cmdlgtst
-control/control
-eject/eject
-expand/expand
-explorer/explorer
-hh/hh
-icinfo/icinfo
-iexplore/iexplore
-msiexec/msiexec
-notepad/notepad
-oleview/oleview
-progman/progman
-regedit/regedit
-regsvr32/regsvr32
-rpcss/rpcss
-rundll32/rundll32
-start/start
-taskmgr/taskmgr
-uninstaller/uninstaller
-view/view
-wineboot/wineboot
-winebrowser/winebrowser
-winecfg/winecfg
-wineconsole/wineconsole
-winedbg/winedbg
-winefile/winefile
-winemenubuilder/winemenubuilder
-winemine/winemine
-winepath/winepath
-winetest/winetest
-winevdm/winevdm
-winhelp/winhelp
-winver/winver
-wordpad/wordpad
diff --git a/programs/winetest/.gitignore b/programs/winetest/.gitignore
deleted file mode 100644
index 8d9f79a..0000000
--- a/programs/winetest/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/*_test.exe
diff --git a/tools/make_makefiles b/tools/make_makefiles
index c0bfbc6..db86f3c 100755
--- a/tools/make_makefiles
+++ b/tools/make_makefiles
@@ -67,6 +67,30 @@
   "winequartz.drv" => "QUARTZFILES"
 );
 
+# Default patterns for top-level .gitignore
+my @ignores = (
+    "*.[oa]",
+    "*.avi",
+    "*.bmp",
+    "*.chm",
+    "*.cur",
+    "*.ico",
+    "*.mc.rc",
+    "*.res",
+    "*.so",
+    "*.tab.[ch]",
+    "*.tlb",
+    "*.yy.c",
+    "*_[cips].c",
+    "/autom4te.cache",
+    "/config.cache",
+    "/config.log",
+    "/config.status",
+    "/TAGS",
+    "/tags",
+    "Makefile"
+);
+
 my (@makefiles, %makefiles);
 
 # update a file if changed
@@ -203,39 +227,34 @@
 ################################################################
 # update the tests list in programs/winetest/Makefile.in and programs/winetest/winetest.rc
 
-my %modules = ( "user" => "user32" );
-my %tests;
-@lines = ( "TESTBINS =" );
-
-foreach my $file (sort grep /^dlls\/.*\/tests\/Makefile/, @makefiles)
+sub update_winetest(@)
 {
-    if ($file =~ /^dlls\/(.*)\/tests\/Makefile/)
+    my (@tests, @lines);
+
+    foreach my $file (@_)
     {
-        my $dir = $1;
-        my $mod = $modules{$dir} || $dir;
-        $tests{$mod} = $dir;
-        push @lines, " \\\n\t${mod}_test.exe";
+        if ($file =~ /^dlls\/(.*)\/tests\/Makefile/) { push @tests, $1; }
     }
-}
-push @lines, "\n\n";
+    push @lines, "TESTBINS =";
+    push @lines, map { " \\\n\t" . $_ . "_test.exe"; } sort @tests;
+    push @lines, "\n\n";
 
-foreach my $test (sort keys %tests)
-{
-    my $dir = $tests{$test};
-    push @lines, "${test}_test.exe: \$(DLLDIR)/$dir/tests/${test}_test.exe\$(DLLEXT)\n";
-    push @lines, "\tcp \$(DLLDIR)/$dir/tests/${test}_test.exe\$(DLLEXT) \$\@ && \$(STRIP) \$\@\n";
-}
-push @lines, "\n# Special rules\n";
+    foreach my $test (sort @tests)
+    {
+        push @lines, "${test}_test.exe: \$(DLLDIR)/$test/tests/${test}_test.exe\$(DLLEXT)\n";
+        push @lines, "\tcp \$(DLLDIR)/$test/tests/${test}_test.exe\$(DLLEXT) \$\@ && \$(STRIP) \$\@\n";
+    }
+    push @lines, "\n# Special rules\n";
 
-replace_in_file( "programs/winetest/Makefile.in", '^TESTBINS\s*=', '^# Special rules', @lines );
+    replace_in_file( "programs/winetest/Makefile.in", '^TESTBINS\s*=', '^# Special rules', @lines );
 
-@lines = ();
-foreach my $test (sort keys %tests)
-{
-    push @lines, "${test}_test.exe TESTRES \"${test}_test.exe\"\n";
+    replace_in_file( "programs/winetest/winetest.rc", ' TESTRES ', undef,
+                     map { $_ . "_test.exe TESTRES \"" . $_ . "_test.exe\"\n"; } sort @tests );
+
+    # return a list of test exe files for .gitignore
+    return map { "programs/winetest/" . $_ . "_test.exe"; } sort @tests;
 }
 
-replace_in_file( "programs/winetest/winetest.rc", ' TESTRES ', undef, @lines );
 
 ################################################################
 # update the makefile list in Makefile.in
@@ -281,8 +300,8 @@
 
     my @ignores =
     (
-     "*/tests/testlist.c",
-     "*/tests/*.ok",
+     "dlls/*/tests/testlist.c",
+     "dlls/*/tests/*.ok",
     );
 
     sub needs_symlink($$)
@@ -337,7 +356,7 @@
 
         if (defined $makefile{"IDL_H_SRCS"})
         {
-            push @ignores, map { $_ =~ s/(.*)\.idl$/$dir\/$1.h/; $_; } @{$makefile{"IDL_H_SRCS"}};
+            push @ignores, map { $_ =~ s/(.*)\.idl$/dlls\/$dir\/$1.h/; $_; } @{$makefile{"IDL_H_SRCS"}};
         }
     }
 
@@ -508,29 +527,27 @@
 
     foreach my $mod (sort @lib_symlinks)
     {
-        push @ignores, "/$importlibs{$mod}.def";
+        push @ignores, "dlls/$importlibs{$mod}.def";
     }
     foreach my $mod (sort keys %directories)
     {
         next unless defined $altnames{$mod};
-        push @ignores, map { "/" . $_ . "16"; } @{$altnames{$mod}};
+        push @ignores, map { "dlls/" . $_ . "16"; } @{$altnames{$mod}};
     }
     foreach my $mod (sort keys %importlibs)
     {
         my $dir = $directories{$mod};
         my $def = $mod;
         $def =~ s/\.(dll|drv)$//;
-        push @ignores, "$dir/lib$def.def";
+        push @ignores, "dlls/$dir/lib$def.def";
     }
 
-    replace_in_file( "dlls/.gitignore", undef, undef,
-                     "# Automatically generated by make_makefiles; DO NOT EDIT!!\n",
-                     join("\n", sort @ignores), "\n" );
+    return @ignores;
 }
 
 
 ################################################################
-# update programs/Makefile.in and programs/.gitignore
+# update programs/Makefile.in
 
 sub update_progs(@)
 {
@@ -546,7 +563,7 @@
         die "Invalid module $module in $make" unless "$dir.exe" eq $module;
         next if defined $makefile{"=skip"};
         push @subdirs, $dir;
-        push @ignores, "$dir/$dir";
+        push @ignores, "programs/$dir/$dir";
         push @install_subdirs, $dir unless $dont_install{$dir};
         push @install_progs, $dir if $bin_install{$dir};
     }
@@ -560,20 +577,16 @@
                      join( " \\\n\t", @install_progs ),
                      "\n\nINSTALLDIRS = \$(DESTDIR)\$(bindir)\n" );
 
-    replace_in_file( "programs/.gitignore", undef, undef,
-                     "# Automatically generated by make_makefiles; DO NOT EDIT!!\n",
-                     join("\n", sort @ignores), "\n" );
+    return @ignores;
 }
 
 
 ################################################################
 # update the main .gitignore
 
-sub update_gitignore()
+sub update_gitignore(@)
 {
-    my @ignores = ();
-
-    push @ignores, values %makerules;
+    my @ignores = values %makerules;
 
     foreach my $make (@makefiles)
     {
@@ -592,14 +605,15 @@
     # prepend a slash to paths that don't have one
     @ignores = map { $_ =~ s/^([^\/]+)$/\/$1/; $_; } @ignores;
 
-    replace_in_file( ".gitignore",
-                     '^# Everything below this line is generated by make_makefiles',
-                     undef,
-                     "# Everything below this line is generated by make_makefiles\n",
+    push @ignores, @_;
+
+    replace_in_file( ".gitignore", undef, undef,
+                     "# Automatically generated by make_makefiles; DO NOT EDIT!!\n",
                      join("\n", sort @ignores), "\n" );
 }
 
 
-update_dlls( sort grep /^dlls\//, @makefiles );
-update_progs( sort grep /^programs\/.*\/Makefile$/, @makefiles );
-update_gitignore();
+push @ignores, update_winetest( @makefiles );
+push @ignores, update_dlls( sort grep /^dlls\//, @makefiles );
+push @ignores, update_progs( sort grep /^programs\/.*\/Makefile$/, @makefiles );
+update_gitignore( @ignores );