Skip to content
  • Joey Hess's avatar
    fully support core.symlinks=false in all relevant symlink handling code · d7c93b89
    Joey Hess authored
    Refactored annex link code into nice clean new library.
    
    Audited and dealt with calls to createSymbolicLink.
    Remaining calls are all safe, because:
    
    Annex/Link.hs:  ( liftIO $ createSymbolicLink linktarget file
      only when core.symlinks=true
    Assistant/WebApp/Configurators/Local.hs:                createSymbolicLink link link
      test if symlinks can be made
    Command/Fix.hs: liftIO $ createSymbolicLink link file
      command only works in indirect mode
    Command/FromKey.hs:     liftIO $ createSymbolicLink link file
      command only works in indirect mode
    Command/Indirect.hs:                    liftIO $ createSymbolicLink l f
      refuses to run if core.symlinks=false
    Init.hs:                createSymbolicLink f f2
      test if symlinks can be made
    Remote/Directory.hs:    go [file] = catchBoolIO $ createSymbolicLink file f >> return True
      fast key linking; catches failure to make symlink and falls back to copy
    Remote/Git.hs:          liftIO $ catchBoolIO $ createSymbolicLink loc file >> return True
      ditto
    Upgrade/V1.hs:                          liftIO $ createSymbolicLink link f
      v1 repos could not be on a filesystem w/o symlinks
    
    Audited and dealt with calls to readSymbolicLink.
    Remaining calls are all safe, because:
    
    Annex/Link.hs:		( liftIO $ catchMaybeIO $ readSymbolicLink file
      only when core.symlinks=true
    Assistant/Threads/Watcher.hs:		ifM ((==) (Just link) <$> liftIO (catchMaybeIO $ readSymbolicLink file))
      code that fixes real symlinks when inotify sees them
      It's ok to not fix psdueo-symlinks.
    Assistant/Threads/Watcher.hs:		mlink <- liftIO (catchMaybeIO $ readSymbolicLink file)
      ditto
    Command/Fix.hs:	stopUnless ((/=) (Just link) <$> liftIO (catchMaybeIO $ readSymbolicLink file)) $ do
      command only works in indirect mode
    Upgrade/V1.hs:	getsymlink = takeFileName <$> readSymbolicLink file
      v1 repos could not be on a filesystem w/o symlinks
    
    Audited and dealt with calls to isSymbolicLink.
    (Typically used with getSymbolicLinkStatus, but that is just used because
    getFileStatus is not as robust; it also works on pseudolinks.)
    Remaining calls are all safe, because:
    
    Assistant/Threads/SanityChecker.hs:                             | isSymbolicLink s -> addsymlink file ms
      only handles staging of symlinks that were somehow not staged
      (might need to be updated to support pseudolinks, but this is
      only a belt-and-suspenders check anyway, and I've never seen the code run)
    Command/Add.hs:         if isSymbolicLink s || not (isRegularFile s)
      avoids adding symlinks to the annex, so not relevant
    Command/Indirect.hs:                            | isSymbolicLink s -> void $ flip whenAnnexed f $
      only allowed on systems that support symlinks
    Command/Indirect.hs:            whenM (liftIO $ not . isSymbolicLink <$> getSymbolicLinkStatus f) $ do
      ditto
    Seek.hs:notSymlink f = liftIO $ not . isSymbolicLink <$> getSymbolicLinkStatus f
      used to find unlocked files, only relevant in indirect mode
    Utility/FSEvents.hs:                    | Files.isSymbolicLink s = runhook addSymlinkHook $ Just s
    Utility/FSEvents.hs:                                            | Files.isSymbolicLink s ->
    Utility/INotify.hs:                             | Files.isSymbolicLink s ->
    Utility/INotify.hs:                     checkfiletype Files.isSymbolicLink addSymlinkHook f
    Utility/Kqueue.hs:              | Files.isSymbolicLink s = callhook addSymlinkHook (Just s) change
      all above are lower-level, not relevant
    
    Audited and dealt with calls to isSymLink.
    Remaining calls are all safe, because:
    
    Annex/Direct.hs:			| isSymLink (getmode item) =
      This is looking at git diff-tree objects, not files on disk
    Command/Unused.hs:		| isSymLink (LsTree.mode l) = do
      This is looking at git ls-tree, not file on disk
    Utility/FileMode.hs:isSymLink :: FileMode -> Bool
    Utility/FileMode.hs:isSymLink = checkMode symbolicLinkMode
      low-level
    
    Done!!
    d7c93b89