Windows: Fix handling of absolute unix-style git repository paths.
Note that on Windows a remote with a path like /home/foo/bar is interpreted by git as being some screwy relative path (relative to what exactly seems ill-defined -- it seemed relative to C:\Program Files\Git\ in my tests!) So no attempt has been made to handle such a path sanely, just not to crash when encountering it. Note that "C:\\foo" </> "/home/foo/bar" yields /home/foo/bar even though that is not absolute! I don't know what to make of all this, except that I will be very happy when this crock of **** vanishes from the face of the earth.
This commit is contained in:
		
					parent
					
						
							
								f068f4e579
							
						
					
				
			
			
				commit
				
					
						c95d0cf7a8
					
				
			
		
					 6 changed files with 28 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -9,6 +9,7 @@ module CmdLine.GitAnnexShell.Fields where
 | 
			
		|||
 | 
			
		||||
import Common.Annex
 | 
			
		||||
import qualified Annex
 | 
			
		||||
import Git.FilePath
 | 
			
		||||
 | 
			
		||||
import Data.Char
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +30,7 @@ remoteUUID = Field "remoteuuid" $
 | 
			
		|||
associatedFile :: Field
 | 
			
		||||
associatedFile = Field "associatedfile" $ \f ->
 | 
			
		||||
	-- is the file a safe relative filename?
 | 
			
		||||
	not (isAbsolute f) && not ("../" `isPrefixOf` f)
 | 
			
		||||
	not (absoluteGitPath f) && not ("../" `isPrefixOf` f)
 | 
			
		||||
 | 
			
		||||
direct :: Field
 | 
			
		||||
direct = Field "direct" $ \f -> f == "1"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ gitCommandLine params r@(Repo { location = l@(Local _ _ ) }) =
 | 
			
		|||
#ifdef mingw32_HOST_OS
 | 
			
		||||
	-- despite running on windows, msysgit wants a unix-formatted path
 | 
			
		||||
	gitpath s
 | 
			
		||||
		| isAbsolute s = "/" ++ dropDrive (toInternalGitPath s)
 | 
			
		||||
		| absoluteGitPath s = "/" ++ dropDrive (toInternalGitPath s)
 | 
			
		||||
		| otherwise = s
 | 
			
		||||
#else
 | 
			
		||||
	gitpath = id
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ import Common
 | 
			
		|||
import Git.Types
 | 
			
		||||
import Git
 | 
			
		||||
import Git.Remote
 | 
			
		||||
import Git.FilePath
 | 
			
		||||
import qualified Git.Url as Url
 | 
			
		||||
import Utility.UserInfo
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +58,7 @@ fromPath dir = fromAbsPath =<< absPath dir
 | 
			
		|||
 - specified. -}
 | 
			
		||||
fromAbsPath :: FilePath -> IO Repo
 | 
			
		||||
fromAbsPath dir
 | 
			
		||||
	| isAbsolute dir = ifM (doesDirectoryExist dir') ( ret dir' , hunt )
 | 
			
		||||
	| absoluteGitPath dir = ifM (doesDirectoryExist dir') ( ret dir' , hunt )
 | 
			
		||||
	| otherwise =
 | 
			
		||||
		error $ "internal error, " ++ dir ++ " is not absolute"
 | 
			
		||||
  where
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,12 +20,15 @@ module Git.FilePath (
 | 
			
		|||
	asTopFilePath,
 | 
			
		||||
	InternalGitPath,
 | 
			
		||||
	toInternalGitPath,
 | 
			
		||||
	fromInternalGitPath
 | 
			
		||||
	fromInternalGitPath,
 | 
			
		||||
	absoluteGitPath
 | 
			
		||||
) where
 | 
			
		||||
 | 
			
		||||
import Common
 | 
			
		||||
import Git
 | 
			
		||||
 | 
			
		||||
import qualified System.FilePath.Posix
 | 
			
		||||
 | 
			
		||||
{- A FilePath, relative to the top of the git repository. -}
 | 
			
		||||
newtype TopFilePath = TopFilePath { getTopFilePath :: FilePath }
 | 
			
		||||
	deriving (Show)
 | 
			
		||||
| 
						 | 
				
			
			@ -66,3 +69,10 @@ fromInternalGitPath = id
 | 
			
		|||
#else
 | 
			
		||||
fromInternalGitPath = replace "/" "\\"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
{- isAbsolute on Windows does not think "/foo" or "\foo" is absolute,
 | 
			
		||||
 - so try posix paths.
 | 
			
		||||
 -}
 | 
			
		||||
absoluteGitPath :: FilePath -> Bool
 | 
			
		||||
absoluteGitPath p = isAbsolute p ||
 | 
			
		||||
	System.FilePath.Posix.isAbsolute (toInternalGitPath p)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								debian/changelog
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								debian/changelog
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -29,12 +29,14 @@ git-annex (5.20140128) UNRELEASED; urgency=medium
 | 
			
		|||
  * Windows: Fix deletion of repositories by test suite and webapp.
 | 
			
		||||
  * Windows: Test suite 100% passes again.
 | 
			
		||||
  * Windows: Fix bug in symlink calculation code.
 | 
			
		||||
  * Windows: Fix handling of absolute unix-style git repository paths.
 | 
			
		||||
  * Fix initremote with encryption=pubkey to work with S3, glacier, webdav,
 | 
			
		||||
    and external special remotes.
 | 
			
		||||
  * Android: Avoid crashing when unable to set file mode for ssh config file
 | 
			
		||||
    due to Android filesystem horribleness.
 | 
			
		||||
  * Avoid building with DAV 0.6 which is badly broken (see #737902).
 | 
			
		||||
  * Fix build on platforms not supporting the webapp.
 | 
			
		||||
  * Fix dropping of unused keys with spaces in their name.
 | 
			
		||||
 | 
			
		||||
 -- Joey Hess <joeyh@debian.org>  Tue, 28 Jan 2014 13:57:19 -0400
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,9 +6,18 @@ internal error, /home/michele/assistannex is not absolute
 | 
			
		|||
 | 
			
		||||
### What steps will reproduce the problem?
 | 
			
		||||
 | 
			
		||||
create a transfer repository on a usb drive (from windows) merge it with a repository on linux, try to merge it on another target windows machine
 | 
			
		||||
create a transfer repository on a usb drive (from windows) merge it with a
 | 
			
		||||
repository on linux, try to merge it on another target windows machine
 | 
			
		||||
 | 
			
		||||
### What version of git-annex are you using? On what operating system?
 | 
			
		||||
 | 
			
		||||
git-annex version 5.20140128-g29aea74
 | 
			
		||||
 | 
			
		||||
> I'm not able to follow the steps to reproduce this, but I think 
 | 
			
		||||
> I see what the problem is. `isAbsolute` on windows does not think that
 | 
			
		||||
> unix-style path is absolute. Such a path can appear in a remote of a git
 | 
			
		||||
> repository, particularly if part of that repository was set up on a
 | 
			
		||||
> non-Windows system. While the remote won't be usable on Windows with a
 | 
			
		||||
> path like that, git-annex should not choke on the path either.
 | 
			
		||||
> I have fixed the code to deal with this.
 | 
			
		||||
> [[done]] --[[Joey]] 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue