import Logs.Web
import Logs.Location
import Utility.Metered
+import qualified Database.Keys
+import Git.FilePath
+import Annex.Link
cmd :: Command
cmd = withAnnexOptions [backendOption, annexedMatchingOptions, jsonOptions] $
| updateOption o = do
unless (null (migrateThese o)) $
error "Cannot combine --update with files to migrate."
- commandAction update
+ streamNewDistributedMigrations $ \oldkey newkey ->
+ commandAction $ update oldkey newkey
| otherwise = do
withFilesInGitAnnex ww seeker =<< workTreeItems ww (migrateThese o)
commitMigration
| otherwise = k
afile = AssociatedFile (Just file)
-update :: CommandStart
-update = starting "migrate" (ActionItemOther Nothing) (SeekInput []) $ do
- streamNewDistributedMigrations $ \oldkey newkey ->
- unlessM (inAnnex newkey) $
- whenM (Command.ReKey.linkKey' oldkey newkey) $
- logStatus newkey InfoPresent
- next $ return True
+update :: Key -> Key -> CommandStart
+update oldkey newkey =
+ stopUnless ((not <$> inAnnex newkey) <&&> inAnnex oldkey) $ do
+ ai <- findworktreefile >>= return . \case
+ Just f -> ActionItemAssociatedFile (AssociatedFile (Just f)) newkey
+ Nothing -> ActionItemKey newkey
+ starting "migrate" ai (SeekInput []) $
+ ifM (Command.ReKey.linkKey' oldkey newkey)
+ ( do
+ logStatus newkey InfoPresent
+ next $ return True
+ , next $ return False
+ )
+ where
+ findworktreefile = do
+ fs <- Database.Keys.getAssociatedFiles newkey
+ g <- Annex.gitRepo
+ firstM (\f -> (== Just newkey) <$> isAnnexLink f) $
+ map (\f -> simplifyPath (fromTopFilePath f g)) fs
Changes the specified annexed files to use the default key-value backend
(or the one specified with `--backend`). Only files whose content
-is currently available are migrated.
+is currently present are migrated.
-Note that the content is also still available using the old key after
-migration. Use `git annex unused` to find and remove the old key.
+Note that the content is also still stored using the old keys after
+migration. When possible, hard links are used to avoid that taking up
+extra disk space. Use `git annex unused` to find and remove the old keys.
Normally, nothing will be done to files already using the new backend.
However, if a backend changes the information it uses to construct a key,