2013-04-22 21:18:53 +00:00
|
|
|
{- git-annex command
|
|
|
|
-
|
rmurl: remove all forms of an url, no matter what the downloader is set to
* rmurl: When youtube-dl was used for an url, it no longer needs to be
prefixed with "yt:" in order to be removed.
* rmurl: If an url is both used by the web and also claimed by another
special remote, fix a bug that caused the url to to not be removed.
The youtube-dl change is a consequence of how the bug fix is implemented.
But I also think it's the right thing to do. Consider that, before,
git-annex addurl $url followed by git-annex rmurl $url would not remove the
url in the case where youtube-dl was used. That was surprising behavior.
In the unlikely case where a special remote claims an url, and it's been
added using OtherDownloader, but it was also added already as a web url,
it seems better for rmurl to remove both than to arbitrarily remove only one.
And in the case the bug report was filed for, when an url was added as a
web url, but a special remote now claims it, that should not prevent rmurl
removing the web url.
Calling setUrlMissing lets other callers of it behave differently.
Probably the calls to it in eg, Remote.External and Remote.BitTorrent are
fine, since they don't mangle the url and just remove what was provided,
and the OtherDownloader form of a bittorrent url, respectively.
I suspect unregisterurl needs to have a similar change made to rmurl, for
similar reasons.
2021-03-22 16:09:15 +00:00
|
|
|
- Copyright 2013-2021 Joey Hess <id@joeyh.name>
|
2013-04-22 21:18:53 +00:00
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2013-04-22 21:18:53 +00:00
|
|
|
-}
|
|
|
|
|
|
|
|
module Command.RmUrl where
|
|
|
|
|
|
|
|
import Command
|
|
|
|
import Logs.Web
|
2022-10-26 17:58:20 +00:00
|
|
|
import Annex.WorkTree
|
2013-04-22 21:18:53 +00:00
|
|
|
|
2015-07-08 16:33:27 +00:00
|
|
|
cmd :: Command
|
|
|
|
cmd = notBareRepo $
|
2015-07-08 19:08:02 +00:00
|
|
|
command "rmurl" SectionCommon
|
|
|
|
"record file is not available at url"
|
2016-12-05 16:10:07 +00:00
|
|
|
(paramRepeating (paramPair paramFile paramUrl))
|
|
|
|
(seek <$$> optParser)
|
2013-04-22 21:18:53 +00:00
|
|
|
|
2016-12-05 16:10:07 +00:00
|
|
|
data RmUrlOptions = RmUrlOptions
|
|
|
|
{ rmThese :: CmdParams
|
|
|
|
, batchOption :: BatchMode
|
|
|
|
}
|
2013-04-22 21:18:53 +00:00
|
|
|
|
2016-12-05 16:10:07 +00:00
|
|
|
optParser :: CmdParamsDesc -> Parser RmUrlOptions
|
|
|
|
optParser desc = RmUrlOptions
|
|
|
|
<$> cmdParams desc
|
2021-08-25 18:20:33 +00:00
|
|
|
<*> parseBatchOption False
|
2016-12-05 16:10:07 +00:00
|
|
|
|
|
|
|
seek :: RmUrlOptions -> CommandSeek
|
|
|
|
seek o = case batchOption o of
|
2022-01-26 16:59:55 +00:00
|
|
|
Batch fmt -> batchOnly Nothing (rmThese o) $
|
|
|
|
batchInput fmt batchParser (batchCommandAction . start)
|
2018-10-01 18:12:06 +00:00
|
|
|
NoBatch -> withPairs (commandAction . start) (rmThese o)
|
2016-12-05 16:10:07 +00:00
|
|
|
|
|
|
|
-- Split on the last space, since a FilePath can contain whitespace,
|
|
|
|
-- but a url should not.
|
2020-04-15 20:04:05 +00:00
|
|
|
batchParser :: String -> Annex (Either String (FilePath, URLString))
|
2016-12-05 16:10:07 +00:00
|
|
|
batchParser s = case separate (== ' ') (reverse s) of
|
|
|
|
(ru, rf)
|
2020-04-15 20:04:05 +00:00
|
|
|
| null ru || null rf -> return $ Left "Expected: \"file url\""
|
|
|
|
| otherwise -> do
|
|
|
|
let f = reverse rf
|
2020-11-02 20:31:28 +00:00
|
|
|
f' <- liftIO $ fromRawFilePath
|
|
|
|
<$> relPathCwdToFile (toRawFilePath f)
|
2020-04-15 20:04:05 +00:00
|
|
|
return $ Right (f', reverse ru)
|
2016-12-05 16:10:07 +00:00
|
|
|
|
2020-09-14 20:49:33 +00:00
|
|
|
start :: (SeekInput, (FilePath, URLString)) -> CommandStart
|
use lookupKeyStaged in --batch code paths
Make --batch mode handle unstaged annexed files consistently whether the
file is unlocked or not. Before this, a unstaged locked file
would have the symlink on disk examined and operated on in --batch mode,
while an unstaged unlocked file would be skipped.
Note that, when not in batch mode, unstaged files are skipped over too.
That is actually somewhat new behavior; as late as 7.20191114 a
command like `git-annex whereis .` would operate on unstaged locked
files and skip over unstaged unlocked files. That changed during
optimisation of CmdLine.Seek with apparently little fanfare or notice.
Turns out that rmurl still behaved that way when given an unstaged file
on the command line. It was changed to use lookupKeyStaged to
handle its --batch mode. That also affected its non-batch mode, but
since that's just catching up to the change earlier made to most
other commands, I have not mentioed that in the changelog.
It may be that other uses of lookupKey should also change to
lookupKeyStaged. But it may also be that would slow down some things,
or lead to unwanted behavior changes, so I've kept the changes minimal
for now.
An example of a place where the use of lookupKey is better than
lookupKeyStaged is in Command.AddUrl, where it looks to see if the file
already exists, and adds the url to the file when so. It does not matter
there whether the file is staged or not (when it's locked). The use of
lookupKey in Command.Unused likewise seems good (and faster).
Sponsored-by: Nicholas Golder-Manning on Patreon
2022-10-26 18:23:06 +00:00
|
|
|
start (si, (file, url)) = lookupKeyStaged file' >>= \case
|
2022-10-26 17:58:20 +00:00
|
|
|
Nothing -> stop
|
|
|
|
Just key -> do
|
|
|
|
let ai = mkActionItem (key, AssociatedFile (Just file'))
|
|
|
|
starting "rmurl" ai si $
|
|
|
|
next $ cleanup url key
|
2019-12-05 18:36:43 +00:00
|
|
|
where
|
|
|
|
file' = toRawFilePath file
|
2013-04-22 21:18:53 +00:00
|
|
|
|
|
|
|
cleanup :: String -> Key -> CommandCleanup
|
|
|
|
cleanup url key = do
|
rmurl: remove all forms of an url, no matter what the downloader is set to
* rmurl: When youtube-dl was used for an url, it no longer needs to be
prefixed with "yt:" in order to be removed.
* rmurl: If an url is both used by the web and also claimed by another
special remote, fix a bug that caused the url to to not be removed.
The youtube-dl change is a consequence of how the bug fix is implemented.
But I also think it's the right thing to do. Consider that, before,
git-annex addurl $url followed by git-annex rmurl $url would not remove the
url in the case where youtube-dl was used. That was surprising behavior.
In the unlikely case where a special remote claims an url, and it's been
added using OtherDownloader, but it was also added already as a web url,
it seems better for rmurl to remove both than to arbitrarily remove only one.
And in the case the bug report was filed for, when an url was added as a
web url, but a special remote now claims it, that should not prevent rmurl
removing the web url.
Calling setUrlMissing lets other callers of it behave differently.
Probably the calls to it in eg, Remote.External and Remote.BitTorrent are
fine, since they don't mangle the url and just remove what was provided,
and the OtherDownloader form of a bittorrent url, respectively.
I suspect unregisterurl needs to have a similar change made to rmurl, for
similar reasons.
2021-03-22 16:09:15 +00:00
|
|
|
-- Remove the url, no matter what downloader.
|
|
|
|
forM_ [minBound..maxBound] $ \dl ->
|
|
|
|
setUrlMissing key (setDownloader url dl)
|
2013-04-22 21:18:53 +00:00
|
|
|
return True
|
2023-04-05 20:59:44 +00:00
|
|
|
-- Unlike addurl, this does not update location tracking
|
|
|
|
-- for remotes other than the web special remote. Doing so with
|
|
|
|
-- a remote that git-annex can drop content from would rather
|
|
|
|
-- unexpectedly leave content stranded on that remote.
|