assistant: Bug fix to avoid annexing the files that git uses to stand in for symlinks on FAT and other filesystem not supporting symlinks.
also, blog for the day..
This commit is contained in:
parent
271a919d14
commit
04a27ad926
4 changed files with 79 additions and 17 deletions
|
@ -80,7 +80,10 @@ runWatcher = do
|
||||||
startup <- asIO1 startupScan
|
startup <- asIO1 startupScan
|
||||||
matcher <- liftAnnex $ largeFilesMatcher
|
matcher <- liftAnnex $ largeFilesMatcher
|
||||||
direct <- liftAnnex isDirect
|
direct <- liftAnnex isDirect
|
||||||
addhook <- hook $ if direct then onAddDirect matcher else onAdd matcher
|
symlinkssupported <- liftAnnex $ coreSymlinks <$> Annex.getGitConfig
|
||||||
|
addhook <- hook $ if direct
|
||||||
|
then onAddDirect symlinkssupported matcher
|
||||||
|
else onAdd matcher
|
||||||
delhook <- hook onDel
|
delhook <- hook onDel
|
||||||
addsymlinkhook <- hook $ onAddSymlink direct
|
addsymlinkhook <- hook $ onAddSymlink direct
|
||||||
deldirhook <- hook onDelDir
|
deldirhook <- hook onDelDir
|
||||||
|
@ -188,9 +191,10 @@ onAdd matcher file filestatus
|
||||||
| otherwise = noChange
|
| otherwise = noChange
|
||||||
|
|
||||||
{- In direct mode, add events are received for both new files, and
|
{- In direct mode, add events are received for both new files, and
|
||||||
- modified existing files. -}
|
- modified existing files.
|
||||||
onAddDirect :: FileMatcher -> Handler
|
-}
|
||||||
onAddDirect matcher file fs = do
|
onAddDirect :: Bool -> FileMatcher -> Handler
|
||||||
|
onAddDirect symlinkssupported matcher file fs = do
|
||||||
v <- liftAnnex $ catKeyFile file
|
v <- liftAnnex $ catKeyFile file
|
||||||
case (v, fs) of
|
case (v, fs) of
|
||||||
(Just key, Just filestatus) ->
|
(Just key, Just filestatus) ->
|
||||||
|
@ -203,37 +207,59 @@ onAddDirect matcher file fs = do
|
||||||
( do
|
( do
|
||||||
link <- liftAnnex $ inRepo $ gitAnnexLink file key
|
link <- liftAnnex $ inRepo $ gitAnnexLink file key
|
||||||
addLink file link (Just key)
|
addLink file link (Just key)
|
||||||
, do
|
, guardSymlinkStandin (Just key) $ do
|
||||||
debug ["changed direct", file]
|
debug ["changed direct", file]
|
||||||
liftAnnex $ changedDirect key file
|
liftAnnex $ changedDirect key file
|
||||||
add matcher file
|
add matcher file
|
||||||
)
|
)
|
||||||
_ -> do
|
_ -> guardSymlinkStandin Nothing $ do
|
||||||
debug ["add direct", file]
|
debug ["add direct", file]
|
||||||
add matcher file
|
add matcher file
|
||||||
|
where
|
||||||
|
{- On a filesystem without symlinks, we'll get changes for regular
|
||||||
|
- files that git uses to stand-in for symlinks. Detect when
|
||||||
|
- this happens, and stage the symlink, rather than annexing the
|
||||||
|
- file. -}
|
||||||
|
guardSymlinkStandin mk a
|
||||||
|
| symlinkssupported = a
|
||||||
|
| otherwise = do
|
||||||
|
linktarget <- liftAnnex $ getAnnexLinkTarget file
|
||||||
|
liftIO $ print (file, linktarget)
|
||||||
|
case linktarget of
|
||||||
|
Nothing -> a
|
||||||
|
Just lt -> do
|
||||||
|
case fileKey $ takeFileName lt of
|
||||||
|
Nothing -> noop
|
||||||
|
Just key -> void $ liftAnnex $
|
||||||
|
addAssociatedFile key file
|
||||||
|
onAddSymlink' linktarget mk True file fs
|
||||||
|
|
||||||
{- A symlink might be an arbitrary symlink, which is just added.
|
{- A symlink might be an arbitrary symlink, which is just added.
|
||||||
- Or, if it is a git-annex symlink, ensure it points to the content
|
- Or, if it is a git-annex symlink, ensure it points to the content
|
||||||
- before adding it.
|
- before adding it.
|
||||||
-}
|
-}
|
||||||
onAddSymlink :: Bool -> Handler
|
onAddSymlink :: Bool -> Handler
|
||||||
onAddSymlink isdirect file filestatus = go =<< liftAnnex (Backend.lookupFile file)
|
onAddSymlink isdirect file filestatus = do
|
||||||
|
linktarget <- liftIO (catchMaybeIO $ readSymbolicLink file)
|
||||||
|
kv <- liftAnnex (Backend.lookupFile file)
|
||||||
|
onAddSymlink' linktarget (fmap fst kv) isdirect file filestatus
|
||||||
|
|
||||||
|
onAddSymlink' :: Maybe String -> Maybe Key -> Bool -> Handler
|
||||||
|
onAddSymlink' linktarget mk isdirect file filestatus = go mk
|
||||||
where
|
where
|
||||||
go (Just (key, _)) = do
|
go (Just key) = do
|
||||||
when isdirect $
|
when isdirect $
|
||||||
liftAnnex $ void $ addAssociatedFile key file
|
liftAnnex $ void $ addAssociatedFile key file
|
||||||
link <- liftAnnex $ inRepo $ gitAnnexLink file key
|
link <- liftAnnex $ inRepo $ gitAnnexLink file key
|
||||||
ifM ((==) (Just link) <$> liftIO (catchMaybeIO $ readSymbolicLink file))
|
if linktarget == Just link
|
||||||
( ensurestaged (Just link) (Just key) =<< getDaemonStatus
|
then ensurestaged (Just link) =<< getDaemonStatus
|
||||||
, do
|
else do
|
||||||
unless isdirect $
|
unless isdirect $
|
||||||
liftAnnex $ replaceFile file $
|
liftAnnex $ replaceFile file $
|
||||||
makeAnnexLink link
|
makeAnnexLink link
|
||||||
addLink file link (Just key)
|
addLink file link (Just key)
|
||||||
)
|
-- other symlink, not git-annex
|
||||||
go Nothing = do -- other symlink
|
go Nothing = ensurestaged linktarget =<< getDaemonStatus
|
||||||
mlink <- liftIO (catchMaybeIO $ readSymbolicLink file)
|
|
||||||
ensurestaged mlink Nothing =<< getDaemonStatus
|
|
||||||
|
|
||||||
{- This is often called on symlinks that are already
|
{- This is often called on symlinks that are already
|
||||||
- staged correctly. A symlink may have been deleted
|
- staged correctly. A symlink may have been deleted
|
||||||
|
@ -246,13 +272,13 @@ onAddSymlink isdirect file filestatus = go =<< liftAnnex (Backend.lookupFile fil
|
||||||
- (If the daemon has never ran before, avoid staging
|
- (If the daemon has never ran before, avoid staging
|
||||||
- links too.)
|
- links too.)
|
||||||
-}
|
-}
|
||||||
ensurestaged (Just link) mk daemonstatus
|
ensurestaged (Just link) daemonstatus
|
||||||
| scanComplete daemonstatus = addLink file link mk
|
| scanComplete daemonstatus = addLink file link mk
|
||||||
| otherwise = case filestatus of
|
| otherwise = case filestatus of
|
||||||
Just s
|
Just s
|
||||||
| not (afterLastDaemonRun (statusChangeTime s) daemonstatus) -> noChange
|
| not (afterLastDaemonRun (statusChangeTime s) daemonstatus) -> noChange
|
||||||
_ -> addLink file link mk
|
_ -> addLink file link mk
|
||||||
ensurestaged Nothing _ _ = noChange
|
ensurestaged Nothing _ = noChange
|
||||||
|
|
||||||
{- For speed, tries to reuse the existing blob for symlink target. -}
|
{- For speed, tries to reuse the existing blob for symlink target. -}
|
||||||
addLink :: FilePath -> FilePath -> Maybe Key -> Assistant (Maybe Change)
|
addLink :: FilePath -> FilePath -> Maybe Key -> Assistant (Maybe Change)
|
||||||
|
|
3
debian/changelog
vendored
3
debian/changelog
vendored
|
@ -19,6 +19,9 @@ git-annex (4.20130406) UNRELEASED; urgency=low
|
||||||
* webapp: Added animations.
|
* webapp: Added animations.
|
||||||
* assistant: Stop any transfers the assistant initiated on shutdown.
|
* assistant: Stop any transfers the assistant initiated on shutdown.
|
||||||
* assistant: Added sequence numbers to XMPP git push packets. (Not yet used.)
|
* assistant: Added sequence numbers to XMPP git push packets. (Not yet used.)
|
||||||
|
* assistant: Bug fix to avoid annexing the files that git uses
|
||||||
|
to stand in for symlinks on FAT and other filesystem not supporting
|
||||||
|
symlinks.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Sat, 06 Apr 2013 15:24:15 -0400
|
-- Joey Hess <joeyh@debian.org> Sat, 06 Apr 2013 15:24:15 -0400
|
||||||
|
|
||||||
|
|
|
@ -16,3 +16,7 @@ Linux
|
||||||
Please provide any additional information below.
|
Please provide any additional information below.
|
||||||
|
|
||||||
|
|
||||||
|
> Reproduced the core bug, which is that the assistant saw symlink standin
|
||||||
|
> files as new files, and annexed them. Now it doesn't, and I have
|
||||||
|
> it running on FAT with no trouble; can even rename symlink standin files
|
||||||
|
> and it commits symlink changes. Calling this [[done]]. --[[Joey]]
|
||||||
|
|
29
doc/design/assistant/blog/day_234__clean_shutdown.mdwn
Normal file
29
doc/design/assistant/blog/day_234__clean_shutdown.mdwn
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Short day because I spent 3 hours this morning explaining free software
|
||||||
|
and kickstarter to an accountant. And was away until 3 pm, so how did I get
|
||||||
|
all this done‽
|
||||||
|
|
||||||
|
Eliot pointed out that shutting down the assistant could leave transfers
|
||||||
|
running. This happened because `git annex transferkeys` is a separate
|
||||||
|
process, and so it was left to finish up any transfer that was in
|
||||||
|
process. I've made shutdown stop all transfers that the
|
||||||
|
assistant started. (Other paired computers could still be connecting to
|
||||||
|
make transfers even when the assistant is not running, and those are not
|
||||||
|
affected.)
|
||||||
|
|
||||||
|
Added sequence numbers to the XMPP messages used for git pushes. While
|
||||||
|
these numbers are not used yet, they're available for debugging, and will
|
||||||
|
help me determine if packets are lost or come out of order. So if you have
|
||||||
|
experienced problems with XMPP syncing sometimes failing, run tonight's
|
||||||
|
build of the assistant with `--debug` (or turn on debugging in the webapp
|
||||||
|
configuration screen), and send me a log by email to
|
||||||
|
<debuglogs201204@joeyh.name>
|
||||||
|
|
||||||
|
Changed the way that autobuilds and manual builds report their version
|
||||||
|
number. It now includes the date of the last commit, and the abbreviated
|
||||||
|
commit ID, rather than being some random date after the last release.
|
||||||
|
|
||||||
|
Frederik found a bug using the assistant on a FAT filesystem. It didn't
|
||||||
|
properly handle the files that git uses to stand-in for symlinks in that
|
||||||
|
situation, and annexed those files. I've fixed this, and even moving
|
||||||
|
around symlink stand-in files on a FAT filesystem now results in correct
|
||||||
|
changes to symlinks being committed.
|
Loading…
Add table
Reference in a new issue