From 452b080dba11f0d9d5251061acfc50729bf6f633 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 13 Feb 2023 14:30:54 -0400 Subject: [PATCH] better handling of multiple repositories with the same name Used to fail with a bad error message, indicating there was no repository with the specified name, or something like that. Now, suggest they use the uuid to disambiguate. * info, enableremotemote, renameremote: Avoid a confusing message when more than one repository matches the user provided name. * info: Exit nonzero when the input is not supported. Sponsored-by: Kevin Mueller on Patreon --- CHANGELOG | 3 ++ Command/EnableRemote.hs | 4 +-- Command/Info.hs | 31 +++++++++---------- Command/RenameRemote.hs | 4 +-- Remote.hs | 31 ++++++++++++------- ...te_descriptions_cause_confusing_error.mdwn | 1 + 6 files changed, 41 insertions(+), 33 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f3c2e0ecd1..4a520d5459 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -21,6 +21,9 @@ git-annex (10.20230127) UNRELEASED; urgency=medium * sync: Warn when the adjusted basis ref cannot be found, as happens eg when the user has renamed branches. * Sped up view branch construction by 50%. + * info, enableremotemote, renameremote: Avoid a confusing message when more + than one repository matches the user provided name. + * info: Exit nonzero when the input is not supported. -- Joey Hess Mon, 06 Feb 2023 13:39:18 -0400 diff --git a/Command/EnableRemote.hs b/Command/EnableRemote.hs index 9ddff9a49f..48f88b7b96 100644 --- a/Command/EnableRemote.hs +++ b/Command/EnableRemote.hs @@ -79,10 +79,10 @@ startSpecialRemote name config [] = do m <- SpecialRemote.specialRemoteMap confm <- Logs.Remote.remoteConfigMap Remote.nameToUUID' name >>= \case - Right u | u `M.member` m -> + ([u], _) | u `M.member` m -> startSpecialRemote name config $ [(u, fromMaybe M.empty (M.lookup u confm), Nothing)] - _ -> unknownNameError "Unknown remote name." + (_, msg) -> unknownNameError msg startSpecialRemote name config ((u, c, mcu):[]) = starting "enableremote" ai si $ do let fullconfig = config `M.union` c diff --git a/Command/Info.hs b/Command/Info.hs index 7eb7727f33..23e54ea1a2 100644 --- a/Command/Info.hs +++ b/Command/Info.hs @@ -165,28 +165,24 @@ autoenableInfo = showCustom "info" (SeekInput []) $ do itemInfo :: InfoOptions -> (SeekInput, String) -> Annex () itemInfo o (si, p) = ifM (isdir p) ( dirInfo o p si - , do - v <- Remote.byName' p - case v of - Right r -> remoteInfo o r si - Left _ -> do - v' <- Remote.nameToUUID' p - case v' of - Right u -> uuidInfo o u si - Left _ -> do - relp <- liftIO $ relPathCwdToFile (toRawFilePath p) - lookupKey relp >>= \case - Just k -> fileInfo o (fromRawFilePath relp) si k - Nothing -> treeishInfo o p si + , Remote.byName' p >>= \case + Right r -> remoteInfo o r si + Left _ -> Remote.nameToUUID' p >>= \case + ([], _) -> do + relp <- liftIO $ relPathCwdToFile (toRawFilePath p) + lookupKey relp >>= \case + Just k -> fileInfo o (fromRawFilePath relp) si k + Nothing -> treeishInfo o p si + ([u], _) -> uuidInfo o u si + (_us, msg) -> noInfo p si msg ) where isdir = liftIO . catchBoolIO . (isDirectory <$$> getFileStatus) -noInfo :: String -> SeekInput -> Annex () -noInfo s si = do +noInfo :: String -> SeekInput -> String -> Annex () +noInfo s si msg = do showStart "info" (encodeBS s) si - showNote $ "not a directory or an annexed file or a treeish or a remote or a uuid" - showEndFail + giveup msg dirInfo :: InfoOptions -> FilePath -> SeekInput -> Annex () dirInfo o dir si = showCustom (unwords ["info", dir]) si $ do @@ -203,6 +199,7 @@ treeishInfo o t si = do mi <- getTreeStatInfo o (Git.Ref (encodeBS t)) case mi of Nothing -> noInfo t si + "not a directory or an annexed file or a treeish or a remote or a uuid" Just i -> showCustom (unwords ["info", t]) si $ do stats <- selStats (tostats (tree_name:tree_fast_stats False)) diff --git a/Command/RenameRemote.hs b/Command/RenameRemote.hs index 3366182aa2..819fdc5b82 100644 --- a/Command/RenameRemote.hs +++ b/Command/RenameRemote.hs @@ -35,12 +35,12 @@ start ps@(oldname:newname:[]) = Annex.SpecialRemote.findExisting oldname >>= \ca -- as a fallback when there is nothing with the name in the -- special remote log. [] -> Remote.nameToUUID' oldname >>= \case - Left e -> giveup e - Right u -> do + ([u], _) -> do m <- Logs.Remote.remoteConfigMap case M.lookup u m of Nothing -> giveup "That is not a special remote." Just cfg -> go u cfg Nothing + (_, msg) -> giveup msg _ -> giveup $ "There are multiple special remotes named " ++ oldname ++ ". Provide instead the uuid or description of the remote to rename." where ai = ActionItemOther Nothing diff --git a/Remote.hs b/Remote.hs index 0d14d069c5..f6cdbcf697 100644 --- a/Remote.hs +++ b/Remote.hs @@ -173,26 +173,33 @@ noRemoteUUIDMsg r = "cannot determine uuid for " ++ name r ++ " (perhaps you nee - and returns its UUID. Finds even repositories that are not - configured in .git/config. -} nameToUUID :: RemoteName -> Annex UUID -nameToUUID = either giveup return <=< nameToUUID' +nameToUUID n = nameToUUID' n >>= \case + ([u], _) -> return u + (_, msg) -> giveup msg -nameToUUID' :: RemoteName -> Annex (Either String UUID) -nameToUUID' "." = Right <$> getUUID -- special case for current repo -nameToUUID' "here" = Right <$> getUUID -nameToUUID' n = byName' n >>= go +nameToUUID' :: RemoteName -> Annex ([UUID], String) +nameToUUID' n + | n == "." = currentrepo + | n == "here" = currentrepo + | otherwise = byName' n >>= go where + currentrepo = mkone <$> getUUID + go (Right r) = return $ case uuid r of - NoUUID -> Left $ noRemoteUUIDMsg r - u -> Right u + NoUUID -> ([], noRemoteUUIDMsg r) + u -> mkone u go (Left e) = do m <- uuidDescMap let descn = UUIDDesc (encodeBS n) return $ case M.keys (M.filter (== descn) m) of - [u] -> Right u - [] -> let u = toUUID n + [] -> + let u = toUUID n in case M.keys (M.filterWithKey (\k _ -> k == u) m) of - [] -> Left e - _ -> Right u - _us -> Left "Found multiple repositories with that description" + [] -> ([], e) + _ -> ([u], e) + us -> (us, "found multiple repositories with that description (use the uuid instead to disambiguate)") + + mkone u = ([u], "found a remote") {- Pretty-prints a list of UUIDs of remotes, with their descriptions, - for human display. diff --git a/doc/bugs/Duplicate_descriptions_cause_confusing_error.mdwn b/doc/bugs/Duplicate_descriptions_cause_confusing_error.mdwn index 6b5daf173a..ab40b4e527 100644 --- a/doc/bugs/Duplicate_descriptions_cause_confusing_error.mdwn +++ b/doc/bugs/Duplicate_descriptions_cause_confusing_error.mdwn @@ -43,3 +43,4 @@ local repository version: 10 ### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders) +> [[fixed|done]] --[[Joey]]