diff --git a/GNUmakefile b/GNUmakefile
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -8,10 +8,13 @@
 PREPROCHTML=--html
 TEXSOURCES = src/darcs.tex $(wildcard src/*.tex) $(filter %.lhs,$(DARCS_FILES))
 doc/manual/darcs.tex: $(TEXSOURCES) $(DARCS)
+	mkdir -p doc/manual
 	$(PREPROC) darcs.tex $(PREPROCHTML) >$@
 doc/manual/darcs_print.tex: $(TEXSOURCES) $(DARCS)
+	mkdir -p doc/manual
 	$(PREPROC) darcs.tex >$@
 doc/manual/patch-theory.tex: $(TEXSOURCES) $(UNIT_FILES) $(DARCS)
+	mkdir -p doc/manual
 	$(PREPROC) Darcs/Patch/Properties.lhs >$@
 
 %.pdf: %.tex
@@ -55,8 +58,14 @@
 
 clean:
 	rm -f TAGS tags
-	rm -f doc/manual/bigpage.tex
+	rm -f doc/manual/bigpage.tex doc/manual/bigpage.css
+	rm -f doc/manual/bigimg*.png doc/manual/bigimages.*
 	rm -f doc/manual/*.html doc/manual/darcs*.??? doc/manual/darcs.lg
+	rm -f doc/manual/darcs.html
 	rm -f doc/manual/darcs.xref c_context.c doc/darcs_print.ps
+	rm -f doc/manual/patch-theory.??? doc/manual/patch-theory.ps
+	rm -f doc/manual/WARNINGS doc/manual/*.pl
+	rm -f doc/manual/images.* doc/manual/img*.png doc/manual/*.html
+	rm -f doc/manual/darcs_print.ps doc/manual/darcs.ps
 
 .PHONY: ps pdf html clean website
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,25 @@
+Darcs 2.4.3, 9 May 2010
+
+ * Important changes in Darcs 2.4.3
+
+   * darcs builds on Windows with GHC 6.12.
+
+Darcs 2.4.2, 8 May 2010
+
+ * Important changes in Darcs 2.4.2
+
+   * darcs will no longer give "mmap of _darcs_index" errors on Windows
+   * darcs convert performance regression (against 2.3.x) solved
+   * darcs get --partial no longer produces inconsistent repositories
+
+ * Issues resolved in Darcs 2.4.2
+
+   * 1761: mmap of '_darcs/index' failed on Windows mapped drives
+   * 1814: include contrib/darcs-errors.hlint in release tarball
+   * 1823: read (mmap) _darcs/index file correctly on Windows
+   * 1826: error building on Windows with GHC 6.12
+   * 1837: inconsistent repository upon darcs get --partial
+
 Darcs 2.4.1, 31 March 2010
 
  * Important changes in Darcs 2.4.1
diff --git a/contrib/darcs-errors.hlint b/contrib/darcs-errors.hlint
new file mode 100644
--- /dev/null
+++ b/contrib/darcs-errors.hlint
@@ -0,0 +1,45 @@
+-- Only report errors, since we use this as part of the testsuite. It needs to
+-- be easy to see what tripped up the testcase.
+
+ignore "Eta reduce" = ""
+ignore "Use camelCase" = ""
+ignore "Use const" = ""
+ignore "Use on" = ""
+ignore "Use foldr" = ""
+ignore "Use String" = ""
+ignore "Use string literal" = ""
+ignore "Use guards" = ""
+ignore "Use :" = ""
+ignore "Redundant brackets" = ""
+ignore "Redundant do" = ""
+ignore "Redundant return" = ""
+ignore "Redundant $" = ""
+ignore "Redundant lambda" = ""
+
+ignore "Use fewer imports" = ""
+ignore "Use better pragmas" = ""
+ignore "Use let" = ""
+ignore "Operator rotate" = ""
+ignore "Use foldl" = ""
+ignore "Unused LANGUAGE pragma" = ""
+
+-- The problem with Prelude readFile is that it's based on hGetContents, which
+-- is lazy by definition. This also means that unless you force consumption of
+-- the produced list, it will keep an fd open for the file, possibly
+-- indefinitely.  This is called a fd leak. Other than being annoying and if done
+-- often, leading to fd exhaustion and failure to open any new files (which is
+-- usually fatal), it also prevents the file to be unlinked (deleted) on win32.
+
+-- On the other hand, *strict* bytestring version of readFile will read the whole
+-- file into a contiguous buffer, *close the fd* and return. This is perfectly
+-- safe with regards to fd leaks. Btw., this is *not* the case with lazy
+-- bytestring variant of readFile, so that one is unsafe as well.
+
+error "Avoid Prelude.readFile" = Prelude.readFile ==> Data.ByteString.readFile
+error "Avoid hGetContents" = System.IO.hGetContents ==> Data.ByteString.hGetContents
+error "Avoid BL.hGetContents" = Data.ByteString.Lazy.hGetContents
+                              ==> Data.ByteString.hGetContents
+error "Avoid BL.hGetContents" = Data.ByteString.Lazy.Char8.hGetContents
+                              ==> Data.ByteString.hGetContents
+error "Avoid BL.readFile" = Data.ByteString.Lazy.Char8.readFile ==> Data.ByteString.readFile
+error "Avoid BL.readFile" = Data.ByteString.Lazy.readFile ==> Data.ByteString.readFile
diff --git a/darcs.cabal b/darcs.cabal
--- a/darcs.cabal
+++ b/darcs.cabal
@@ -1,5 +1,5 @@
 Name:           darcs
-version:        2.4.1
+version:        2.4.3
 License:        GPL
 License-file:   COPYING
 Author:         David Roundy <droundy@darcs.net>, <darcs-users@darcs.net>
@@ -44,6 +44,7 @@
   -- The contrib directory would make a sensible 'darcs-contrib' package
   contrib/_darcs.zsh, contrib/darcs_completion,
   contrib/cygwin-wrapper.bash, contrib/update_roundup.pl, contrib/upload.cgi,
+  contrib/darcs-errors.hlint,
 
   -- documentation files
   src/best_practices.tex, src/building_darcs.tex, src/configuring_darcs.tex,
@@ -150,6 +151,7 @@
                     System.Posix.IO
     cpp-options:    -DWIN32
     c-sources:      src/win32/send_email.c
+    build-depends:  unix-compat >= 0.1.2
 
 -- ----------------------------------------------------------------------
 -- darcs library
@@ -314,6 +316,7 @@
                     System.Posix.Files
                     System.Posix.IO
     cpp-options:    -DWIN32
+    build-depends:  unix-compat >= 0.1.2
 
   if os(solaris)
     cc-options:     -DHAVE_SIGINFO_H
@@ -325,7 +328,7 @@
                    html         == 1.0.*,
                    filepath     == 1.1.*,
                    haskeline    >= 0.6.1 && < 0.7,
-                   hashed-storage == 0.4.11
+                   hashed-storage == 0.4.13
 
   if !os(windows)
     build-depends: unix >= 1.0 && < 2.5
@@ -444,6 +447,7 @@
                     Preproc
     cpp-options:    -DWIN32
     c-sources:      src/win32/send_email.c
+    build-depends:  unix-compat >= 0.1.2
 
   if os(solaris)
     cc-options:     -DHAVE_SIGINFO_H
@@ -455,7 +459,7 @@
                    html         == 1.0.*,
                    filepath     == 1.1.*,
                    haskeline    >= 0.6.1 && < 0.7,
-                   hashed-storage == 0.4.11
+                   hashed-storage == 0.4.13
 
   if !os(windows)
     build-depends: unix >= 1.0 && < 2.5
@@ -583,6 +587,7 @@
                     System.Posix.IO
     cpp-options:    -DWIN32
     c-sources:      src/win32/send_email.c
+    build-depends:  unix-compat >= 0.1.2
 
   if os(solaris)
     cc-options:     -DHAVE_SIGINFO_H
diff --git a/release/distributed-context b/release/distributed-context
--- a/release/distributed-context
+++ b/release/distributed-context
@@ -1,1 +1,1 @@
-Just "\nContext:\n\n[TAG 2.4.1\nReinier Lamers <tux_rocker@reinier.de>**20100412161826\n Ignore-this: 17bcd98358f6da527cd14ab1a725f0b7\n] \n"
+Just "\nContext:\n\n[TAG 2.4.3\nEric Kow <kowey@darcs.net>**20100509132315\n Ignore-this: 1a920525d0cd01c352d5a2893bbea10d\n] \n"
diff --git a/src/Darcs/Bug.hs b/src/Darcs/Bug.hs
--- a/src/Darcs/Bug.hs
+++ b/src/Darcs/Bug.hs
@@ -12,7 +12,7 @@
 _bugDoc :: BugStuff -> Doc -> a
 _bugDoc bs s = errorDoc $
    text ("bug at " ++ _bugLoc bs) $$ s $$
-   text ("See http://wiki.darcs.net/index.html/BugTrackerHowto " ++
+   text ("See http://wiki.darcs.net/BugTracker/Reporting " ++
          "for help on bug reporting.")
 
 _bugLoc :: BugStuff -> String
diff --git a/src/Darcs/Commands/Convert.lhs b/src/Darcs/Commands/Convert.lhs
--- a/src/Darcs/Commands/Convert.lhs
+++ b/src/Darcs/Commands/Convert.lhs
@@ -44,7 +44,8 @@
                           slurp_recorded, optimizeInventory,
                           tentativelyMergePatches, patchSetToPatches,
                           createPristineDirectoryTree,
-                          revertRepositoryChanges, finalizeRepositoryChanges )
+                          revertRepositoryChanges, finalizeRepositoryChanges,
+                          applyToWorking )
 import Darcs.Global ( darcsdir )
 import Darcs.Patch ( RealPatch, Patch, Named, showPatch, patch2patchinfo, fromPrims, infopatch,
                      modernizePatch,
@@ -59,7 +60,7 @@
 import Darcs.Repository.Motd ( show_motd )
 import Darcs.Utils ( clarifyErrors, askUser )
 import Darcs.ProgressPatches ( progressFL )
-import Darcs.Witnesses.Sealed ( FlippedSeal(..) )
+import Darcs.Witnesses.Sealed ( FlippedSeal(..), Sealed(..) )
 import Printer ( text, ($$) )
 import Darcs.ColorPrinter ( traceDoc )
 import Darcs.SlurpDirectory ( list_slurpy_files )
@@ -199,9 +200,11 @@
                                    (map convertInfo $ concatMap fixDep $ getdeps n)
           convertInfo n | n `elem` inOrderTags = n
                         | otherwise = maybe n (\t -> pi_rename n ("old tag: "++t)) $ pi_tag n
-          applySome xs = do tentativelyMergePatches repository "convert" (AllowConflicts:opts) NilFL xs
+          applySome xs = do Sealed pw <- tentativelyMergePatches repository "convert" (AllowConflicts:opts) NilFL xs
                             finalizeRepositoryChanges repository -- this is to clean out pristine.hashed
                             revertRepositoryChanges repository
+                            revertable $ applyToWorking repository opts pw
+                            invalidateIndex repository
       sequence_ $ mapFL applySome $ bunchFL 100 $ progressFL "Converting patch" patches
       invalidateIndex repository
       revertable $ createPristineDirectoryTree repository "."
diff --git a/src/Darcs/Commands/Optimize.lhs b/src/Darcs/Commands/Optimize.lhs
--- a/src/Darcs/Commands/Optimize.lhs
+++ b/src/Darcs/Commands/Optimize.lhs
@@ -206,9 +206,9 @@
 
 doOptimizePristine :: RepoPatch p => Repository p -> IO ()
 doOptimizePristine repo = do
-  hashed <- doesFileExist $ "_darcs" </> "hashed_inventory"
+  hashed <- doesFileExist $ darcsdir </> "hashed_inventory"
   when hashed $ do
-    inv <- BS.readFile ("_darcs" </> "hashed_inventory")
+    inv <- BS.readFile (darcsdir </> "hashed_inventory")
     let linesInv = BS.split '\n' inv
     case linesInv of
       [] -> return ()
diff --git a/src/Darcs/Repository.hs b/src/Darcs/Repository.hs
--- a/src/Darcs/Repository.hs
+++ b/src/Darcs/Repository.hs
@@ -45,7 +45,7 @@
 
 import System.Exit ( ExitCode(..), exitWith )
 
-import Darcs.Repository.State( readRecorded, readUnrecorded, unrecordedChanges
+import Darcs.Repository.State( readRecorded, readUnrecorded, readWorking, unrecordedChanges
                              , readPending, pendingChanges, readIndex, invalidateIndex
                              , readRecordedAndPending )
 
@@ -113,7 +113,7 @@
 
 import Storage.Hashed.Tree( Tree, emptyTree )
 import Storage.Hashed.Hash( encodeBase16 )
-import Storage.Hashed.Darcs( writeDarcsHashed )
+import Storage.Hashed.Darcs( writeDarcsHashed, darcsAddMissingHashes )
 import Storage.Hashed( writePlainTree )
 import ByteStringUtils( gzReadFilePS )
 
@@ -317,9 +317,10 @@
 replacePristine (Repo r _opts _rf (DarcsRepository pris _c)) tree =
     withCurrentDirectory r $ replace pris
     where replace HashedPristine =
-              do let t = "_darcs" </> "hashed_inventory"
+              do let t = darcsdir </> "hashed_inventory"
                  i <- gzReadFilePS t
-                 root <- writeDarcsHashed tree $ "_darcs" </> "pristine.hashed"
+                 tree' <- darcsAddMissingHashes tree
+                 root <- writeDarcsHashed tree' $ darcsdir </> "pristine.hashed"
                  writeDocBinFile t $ pris2inv (BS.unpack $ encodeBase16 root) i
           replace (PlainPristine n) =
               do rm_recursive nold `catchall` return ()
@@ -334,7 +335,7 @@
 pristineFromWorking :: RepoPatch p => Repository p C(r u t) -> IO ()
 pristineFromWorking repo@(Repo dir _ rf _)
     | formatHas HashedInventory rf =
-        withCurrentDirectory dir $ readUnrecorded repo >>= replacePristine repo
+        withCurrentDirectory dir $ readWorking >>= replacePristine repo
 pristineFromWorking (Repo dir _ _ (DarcsRepository p _)) =
   withCurrentDirectory dir $ createPristineFromWorking p
 
diff --git a/src/Darcs/Repository/State.hs b/src/Darcs/Repository/State.hs
--- a/src/Darcs/Repository/State.hs
+++ b/src/Darcs/Repository/State.hs
@@ -28,7 +28,7 @@
     -- * Diffs.
     , unrecordedChanges, readPending, pendingChanges
     -- * Trees.
-    , readRecorded, readUnrecorded, readRecordedAndPending
+    , readRecorded, readUnrecorded, readRecordedAndPending, readWorking
     -- * Index.
     , readIndex, invalidateIndex ) where
 
@@ -51,6 +51,7 @@
 import Darcs.Witnesses.Sealed ( Sealed(Sealed), seal )
 import Darcs.Diff ( treeDiff )
 import Darcs.Flags ( DarcsFlag( LookForAdds ), willIgnoreTimes )
+import Darcs.Global ( darcsdir )
 import Darcs.Utils ( filterPaths )
 
 import Darcs.Repository.InternalTypes ( Repository )
@@ -66,6 +67,7 @@
 import Storage.Hashed.Darcs( darcsTreeHash, readDarcsHashed, decodeDarcsHash, decodeDarcsSize )
 import Storage.Hashed.Hash( Hash( NoHash ) )
 import qualified Storage.Hashed.Index as I
+import qualified Storage.Hashed.Tree as Tree
 
 #include "gadts.h"
 
@@ -100,7 +102,7 @@
 restrictBoring :: forall t m. Tree m -> IO (FilterTree t m => t m -> t m)
 restrictBoring guide = do
   boring <- boringRegexps
-  let boring' (AnchoredPath (Name x:_)) | x == BSC.pack "_darcs" = False
+  let boring' (AnchoredPath (Name x:_)) | x == BSC.pack darcsdir = False
       boring' p = not $ any (\rx -> isJust $ matchRegex rx p') boring
           where p' = anchorPath "" p
       restrictTree :: FilterTree t m => t m -> t m
@@ -161,8 +163,7 @@
 -- construction.
 readRecorded :: (RepoPatch p) => Repository p C(r u t) -> IO (Tree IO)
 readRecorded _repo = do
-  let darcs = "_darcs"
-      h_inventory = darcs </> "hashed_inventory"
+  let h_inventory = darcsdir </> "hashed_inventory"
   hashed <- doesFileExist h_inventory
   if hashed
      then do inv <- BS.readFile h_inventory
@@ -173,18 +174,26 @@
                           let hash = decodeDarcsHash $ BS.drop 9 pris_line
                               size = decodeDarcsSize $ BS.drop 9 pris_line
                           when (hash == NoHash) $ fail $ "Bad pristine root: " ++ show pris_line
-                          readDarcsHashed (darcs </> "pristine.hashed") (size, hash)
-     else do have_pristine <- doesDirectoryExist $ darcs </> "pristine"
-             have_current <- doesDirectoryExist $ darcs </> "current"
+                          readDarcsHashed (darcsdir </> "pristine.hashed") (size, hash)
+     else do have_pristine <- doesDirectoryExist $ darcsdir </> "pristine"
+             have_current <- doesDirectoryExist $ darcsdir </> "current"
              case (have_pristine, have_current) of
-               (True, _) -> readPlainTree $ darcs </> "pristine"
-               (False, True) -> readPlainTree $ darcs </> "current"
+               (True, _) -> readPlainTree $ darcsdir </> "pristine"
+               (False, True) -> readPlainTree $ darcsdir </> "current"
                (_, _) -> fail "No pristine tree is available!"
 
 -- | Obtains a Tree corresponding to the "unrecorded" state of the repository:
 -- the working tree plus the "pending" patch.
 readUnrecorded :: (RepoPatch p) => Repository p C(r u t) -> IO (Tree IO)
 readUnrecorded repo = readIndex repo >>= I.updateIndex
+
+-- | Obtains a Tree corresponding to the working copy of the
+-- repository. NB. Almost always, using readUnrecorded is the right
+-- choice. This function is only useful in not-completely-constructed
+-- repositories.
+readWorking :: IO (Tree IO)
+readWorking = expand =<< (nodarcs `fmap` readPlainTree ".")
+  where nodarcs = Tree.filter (\(AnchoredPath (Name x:_)) _ -> x /= BSC.pack "_darcs")
 
 readRecordedAndPending :: (RepoPatch p) => Repository p C(r u t) -> IO (Tree IO)
 readRecordedAndPending repo = do
diff --git a/src/Darcs/SlurpDirectory/Internal.hs b/src/Darcs/SlurpDirectory/Internal.hs
--- a/src/Darcs/SlurpDirectory/Internal.hs
+++ b/src/Darcs/SlurpDirectory/Internal.hs
@@ -69,7 +69,7 @@
 
 import Darcs.Patch.FileName ( FileName, fn2fp, fp2fn, norm_path, break_on_dir,
                               own_name, superName )
-#if mingw32_HOST_OS
+#if mingw32_HOST_OS && __GLASGOW_HASKELL__ < 612
 import Data.Int ( Int64 )
 #else
 import System.Posix.Types ( FileOffset )
@@ -77,7 +77,7 @@
 
 #include "impossible.h"
 
-#if mingw32_HOST_OS
+#if mingw32_HOST_OS && __GLASGOW_HASKELL__ < 612
 type FileOffset = Int64
 #endif
 
diff --git a/src/win32/System/Posix/Files.hsc b/src/win32/System/Posix/Files.hsc
--- a/src/win32/System/Posix/Files.hsc
+++ b/src/win32/System/Posix/Files.hsc
@@ -1,96 +1,21 @@
 {-# OPTIONS_GHC -cpp #-}
-module System.Posix.Files where
-
-import Foreign.Marshal.Alloc ( allocaBytes )
-import Foreign.C.Error ( throwErrnoIfMinus1Retry, throwErrnoPathIf_ )
-import Foreign.C.String ( withCString, withCWString, CWString )
-import Foreign.C.Types ( CTime, CInt )
-import Foreign.Ptr ( Ptr, nullPtr )
-
-import System.Posix.Internals
-          ( FDType, CStat, c_fstat, lstat, 
-            sizeof_stat, statGetType, 
-            st_mode, st_size, st_mtime,
-            s_isreg, s_isdir, s_isfifo, c_stat )
-import System.Posix.Types ( Fd(..), CMode, EpochTime, FileMode )
-
-import Data.Bits ( (.|.) )
-
-#if mingw32_HOST_OS
-import Data.Int ( Int64 )
-#else
-import System.Posix.Types ( FileOffset )
-#endif
-
-##if mingw32_HOST_OS
-type FileOffset = Int64
-##endif
-
-data FileStatus = FileStatus {
-    fst_type :: FDType,
-    fst_mode :: CMode,
-    fst_mtime :: CTime,
-    fst_size :: FileOffset
- }
-
-getFdStatus :: Fd -> IO FileStatus
-getFdStatus (Fd fd) = do
-  do_stat (c_fstat fd)
-
-do_stat :: (Ptr CStat -> IO CInt) -> IO FileStatus
-do_stat stat_func = do
-  allocaBytes sizeof_stat $ \p -> do
-    throwErrnoIfMinus1Retry "do_stat" $
-      stat_func p
-    tp <- statGetType p
-    mode <- st_mode p
-    mtime <- st_mtime p
-    size <- st_size p
-    return (FileStatus tp mode mtime (fromIntegral size))
-
-isNamedPipe :: FileStatus -> Bool
-isNamedPipe = s_isfifo . fst_mode
-
-isDirectory :: FileStatus -> Bool
-isDirectory = s_isdir . fst_mode
+module System.Posix.Files( isNamedPipe, isDirectory, isRegularFile, isSymbolicLink
+                               , getFdStatus, getFileStatus, getSymbolicLinkStatus
+                               , modificationTime, setFileMode, fileSize, fileMode
+                               , stdFileMode, linkCount, createLink ) where
 
-isRegularFile :: FileStatus -> Bool
-isRegularFile = s_isreg . fst_mode
+import System.PosixCompat.Files( isNamedPipe, isDirectory, isRegularFile, isSymbolicLink
+                               , getFdStatus, getFileStatus, getSymbolicLinkStatus
+                               , modificationTime, setFileMode, fileSize, fileMode
+                               , stdFileMode, FileStatus )
 
-isSymbolicLink :: FileStatus -> Bool
-isSymbolicLink = const False
+import Foreign.C.String( CWString, withCWString )
+import Foreign.C.Error( throwErrnoPathIf_ )
+import Foreign.Ptr( Ptr, nullPtr )
+import Foreign.C( CInt )
 
 linkCount :: FileStatus -> Int
 linkCount _ = 1
-
-modificationTime :: FileStatus -> EpochTime
-modificationTime = fst_mtime
-
-fileSize :: FileStatus -> FileOffset
-fileSize = fst_size
-
-fileMode :: a -> ()
-fileMode _ = ()
-
-setFileMode :: FilePath -> () -> IO ()
-setFileMode _ _ = return ()
-
-#include <sys/stat.h>
-stdFileMode :: FileMode
-stdFileMode = (#const S_IRUSR) .|. (#const S_IWUSR)
-
-getFileStatus :: FilePath -> IO FileStatus
-getFileStatus fp =
-  do_stat (\p -> (fp `withCString` (`c_stat` p)))
-
--- lstat is broken on win32 with at least GHC 6.10.3
-getSymbolicLinkStatus :: FilePath -> IO FileStatus
-##if mingw32_HOST_OS
-getSymbolicLinkStatus = getFileStatus
-##else
-getSymbolicLinkStatus fp =
-  do_stat (\p -> (fp `withCString` (`lstat` p)))
-##endif
 
 #define _WIN32_WINNT 0x0500
 foreign import stdcall "winbase.h CreateHardLinkW" c_CreateHardLink :: CWString -> CWString -> Ptr a -> IO CInt
diff --git a/src/win32/System/Posix/IO.hsc b/src/win32/System/Posix/IO.hsc
--- a/src/win32/System/Posix/IO.hsc
+++ b/src/win32/System/Posix/IO.hsc
@@ -1,6 +1,11 @@
 module System.Posix.IO where
 
+#if mingw32_HOST_OS && __GLASGOW_HASKELL__ >= 612
+import Foreign.C.String( withCWString )
+#else
 import Foreign.C.String ( withCString )
+#endif
+
 import Foreign.C.Error ( throwErrnoIfMinus1, throwErrnoIfMinus1_ )
 
 import GHC.Handle ( fdToHandle )
@@ -33,7 +38,11 @@
 
 openFd :: FilePath -> OpenMode -> Maybe FileMode -> OpenFileFlags -> IO Fd
 openFd name how maybe_mode off = do
+#if mingw32_HOST_OS && __GLASGOW_HASKELL__ >= 612
+  withCWString name $ \s -> do
+#else
   withCString name $ \s -> do
+#endif
    fd <- throwErrnoIfMinus1 "openFd" (c_open s all_flags mode_w)
    return (Fd fd)
  where
diff --git a/tests/EXAMPLE.sh b/tests/EXAMPLE.sh
--- a/tests/EXAMPLE.sh
+++ b/tests/EXAMPLE.sh
@@ -24,7 +24,7 @@
 ## CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 ## SOFTWARE.
 
-. ../tests/lib                  # Load some portability helpers.
+. lib                           # Load some portability helpers.
 rm -rf R S                      # Another script may have left a mess.
 darcs init      --repo R        # Create our test repos.
 darcs init      --repo S
diff --git a/tests/issue1645-ignore-symlinks-case-fold.sh b/tests/issue1645-ignore-symlinks-case-fold.sh
--- a/tests/issue1645-ignore-symlinks-case-fold.sh
+++ b/tests/issue1645-ignore-symlinks-case-fold.sh
@@ -60,7 +60,6 @@
 darcs w -l >log 2>&1                                             # should report only "non-recorded-file"
 darcs rec -alm "added ./non-recorded-file2" >>log 2>&1            # should add only file, not symlink
 darcs changes -s --patch="added ./non-recorded-file2" >>log 2>&1  # should report only file, not symlink
-cat log
 not grep -vE "(^ *$|^\+|[0-9]:[0-9][0-9]:[0-9]|./non-recorded-file2)" log
 rm Non-Recorded-File2 ./Non-ReCoRdEd-File2
 
diff --git a/tests/issue1645-ignore-symlinks.sh b/tests/issue1645-ignore-symlinks.sh
--- a/tests/issue1645-ignore-symlinks.sh
+++ b/tests/issue1645-ignore-symlinks.sh
@@ -48,6 +48,7 @@
 add_to_boring '^log$'
 
 unset pwd # Since this test is pretty much linux-specific, hspwd.hs is not needed
+abort_windows # and skip if we are on win32...
 
 # Case 1: looping symlink to non-recorded non-boring dir
 mkdir non-recorded-dir
diff --git a/tests/issue1837_get-partial.sh b/tests/issue1837_get-partial.sh
new file mode 100644
--- /dev/null
+++ b/tests/issue1837_get-partial.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+## Test for issue1837 - darcs get --partial should produce a
+## consistent repository
+##
+## Copyright (C) 2010 Petr Rockai
+## Copyright (C) 2010 Eric Kow
+##
+## Permission is hereby granted, free of charge, to any person
+## obtaining a copy of this software and associated documentation
+## files (the "Software"), to deal in the Software without
+## restriction, including without limitation the rights to use, copy,
+## modify, merge, publish, distribute, sublicense, and/or sell copies
+## of the Software, and to permit persons to whom the Software is
+## furnished to do so, subject to the following conditions:
+##
+## The above copyright notice and this permission notice shall be
+## included in all copies or substantial portions of the Software.
+##
+## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+## BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+## ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+## CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+## SOFTWARE.
+
+# not relevant to old-fashioned
+if grep old-fashioned .darcs/defaults; then exit 200; fi
+
+. lib                           # Load some portability helpers.
+rm -rf R S                      # Another script may have left a mess.
+
+tar xzf repos/old-with-checkpoint.tgz
+
+darcs get old-with-checkpoint R
+cd R
+  darcs check
+cd ..
+
+darcs get --partial old-with-checkpoint S
+cd S
+  darcs check
+cd ..
