diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2025-06-28 09:16:17 +0200 | 
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-06-28 09:16:17 +0200 | 
| commit | a9ca7d47f22b37c43ac97f1f04181fe114f3ce58 (patch) | |
| tree | 832557703035691d0ed492192fa4daa866d03661 | |
| parent | bdd1d73969ff9015f444239099ed4cdd6afff910 (diff) | |
Fix extrating subtree hash in a bare repository
Changelog: Fix getting (sub)directory in a bare repository
| -rw-r--r-- | src/Command/Subtree.hs | 1 | ||||
| -rw-r--r-- | src/Repo.hs | 22 | ||||
| -rw-r--r-- | test/script/repo.et | 26 | 
3 files changed, 39 insertions, 10 deletions
| diff --git a/src/Command/Subtree.hs b/src/Command/Subtree.hs index 8d42d73..15cb2db 100644 --- a/src/Command/Subtree.hs +++ b/src/Command/Subtree.hs @@ -44,3 +44,4 @@ cmdSubtree (SubtreeCommand SubtreeOptions args) = do      subtree <- getSubtree Nothing (T.unpack path) =<< readTree repo subdir tree      outputMessage out $ textTreeId $ treeId subtree +    outputEvent out $ TestMessage $ "path " <> T.pack (treeSubdir subtree) diff --git a/src/Repo.hs b/src/Repo.hs index 98178e6..b154209 100644 --- a/src/Repo.hs +++ b/src/Repo.hs @@ -280,15 +280,19 @@ getCommitMessage = fmap commitMessage . getCommitDetails  getSubtree :: (MonadIO m, MonadFail m) => Maybe Commit -> FilePath -> Tree -> m Tree  getSubtree mbCommit path tree = liftIO $ do      let GitRepo {..} = treeRepo tree -    readProcessWithExitCode "git" [ "--git-dir=" <> gitDir, "rev-parse", "--verify", "--quiet", showTreeId (treeId tree) <> ":./" <> path <> "/" ] "" >>= \case -        ( ExitSuccess, out, _ ) | tid : _ <- lines out -> do -            return Tree -                { treeRepo = treeRepo tree -                , treeId = TreeId (BC.pack tid) -                , treeSubdir = treeSubdir tree </> path -                } -        _ -> do -            fail $ "subtree ‘" <> path <> "’ not found" <> maybe "" ((" in revision ‘" <>) . (<> "’") . showCommitId . commitId) mbCommit +        dirs = dropWhile (`elem` [ ".", "/" ]) $ splitDirectories path + +    case dirs of +        [] -> return tree +        _ -> readProcessWithExitCode "git" [ "--git-dir=" <> gitDir, "rev-parse", "--verify", "--quiet", showTreeId (treeId tree) <> ":" <> joinPath dirs ] "" >>= \case +            ( ExitSuccess, out, _ ) | tid : _ <- lines out -> do +                return Tree +                    { treeRepo = treeRepo tree +                    , treeId = TreeId (BC.pack tid) +                    , treeSubdir = joinPath $ treeSubdir tree : dirs +                    } +            _ -> do +                fail $ "subtree ‘" <> path <> "’ not found" <> maybe "" ((" in revision ‘" <>) . (<> "’") . showCommitId . commitId) mbCommit  checkoutAt :: (MonadIO m, MonadFail m) => Tree -> FilePath -> m () diff --git a/test/script/repo.et b/test/script/repo.et index 7a34a1c..d93f700 100644 --- a/test/script/repo.et +++ b/test/script/repo.et @@ -14,52 +14,76 @@ test RepoSubtree:          git -C work rev-parse HEAD:first          git -C work rev-parse HEAD:first/second +        git clone -q --bare work bare.git +      expect /([0-9a-f]+)/ from git_init capture commit      expect /([0-9a-f]+)/ from git_init capture root      expect /([0-9a-f]+)/ from git_init capture sub1      expect /([0-9a-f]+)/ from git_init capture sub2 -    for repo in [ "./work" ]: +    for repo in [ "./work", "./bare.git" ]:          local:              spawn as p on n args [ repo, "subtree", commit, "" ]              expect from p /msg $root/ +            expect from p /path (.*)/ capture path +            guard (path == "")          local:              spawn as p on n args [ repo, "subtree", commit, "." ]              expect from p /msg $root/ +            expect from p /path (.*)/ capture path +            guard (path == "")          local:              spawn as p on n args [ repo, "subtree", commit, "/" ]              expect from p /msg $root/ +            expect from p /path (.*)/ capture path +            guard (path == "")          local:              spawn as p on n args [ repo, "subtree", commit, "first" ]              expect from p /msg $sub1/ +            expect from p /path (.*)/ capture path +            guard (path == "first")          local:              spawn as p on n args [ repo, "subtree", commit, "./first" ]              expect from p /msg $sub1/ +            expect from p /path (.*)/ capture path +            guard (path == "first")          local:              spawn as p on n args [ repo, "subtree", commit, "/first" ]              expect from p /msg $sub1/ +            expect from p /path (.*)/ capture path +            guard (path == "first")          local:              spawn as p on n args [ repo, "subtree", commit, "./first/second" ]              expect from p /msg $sub2/ +            expect from p /path (.*)/ capture path +            guard (path == "first/second")          local:              spawn as p on n args [ repo, "subtree", commit, "/first/second" ]              expect from p /msg $sub2/ +            expect from p /path (.*)/ capture path +            guard (path == "first/second")          local:              spawn as p on n args [ repo, "subtree", "$sub1(first)", "second" ]              expect from p /msg $sub2/ +            expect from p /path (.*)/ capture path +            guard (path == "first/second")          local:              spawn as p on n args [ repo, "subtree", "$sub1(first)", "./second" ]              expect from p /msg $sub2/ +            expect from p /path (.*)/ capture path +            guard (path == "first/second")          local:              spawn as p on n args [ repo, "subtree", "$sub1(first)", "/second/" ]              expect from p /msg $sub2/ +            expect from p /path (.*)/ capture path +            guard (path == "first/second") |