diff --git a/doc/bugs/Repo_manipulation_breaks_git-annex_drop_--all.mdwn b/doc/bugs/Repo_manipulation_breaks_git-annex_drop_--all.mdwn new file mode 100644 index 0000000000..9cbb3926ff --- /dev/null +++ b/doc/bugs/Repo_manipulation_breaks_git-annex_drop_--all.mdwn @@ -0,0 +1,57 @@ +I am working with a bare repository to transfer two keys from a custom backend to and from a special remote. This seems to be working fine. + +In order to be able to make use of export remotes (exporttree=yes), I need to be able to specific a tree to be exported. For technical reasons, I want to keep using a bare repository, and use a `hash-object`, `update-index`, and `write-tree` manually in order to create a tree. The Python code snippet that does this looks like this: + +``` + for key, prefix, fname in ( + # the prefixes are constant hashdir-lower + (RepoAnnexGitRemote.refs_key, 'a11/1c8', '.datalad/dotgit/refs'), + (RepoAnnexGitRemote.repo_export_key, '6b2/c13', + '.datalad/dotgit/repo-export.zip')): + # create a blob for the annex link + out = repo._git_runner.run( + ['git', 'hash-object', '-w', '--stdin'], + stdin=bytes( + f'../../.git/annex/objects/{prefix}/{key}/{key}', 'utf-8'), + protocol=StdOutCapture) + linkhash = out['stdout'].strip() + # place link into a tree + out = repo._git_runner.run( + ['git', 'update-index', '--add', '--cacheinfo', '120000', + linkhash, fname], + protocol=StdOutCapture) + # write the complete tree, and return ID + out = repo._git_runner.run( + ['git', 'write-tree'], + protocol=StdOutCapture) + exporttree = out['stdout'].strip() + ``` + +It essentially creates the two blobs for the annex links, puts them together in a tree, and writes it to the repo. + +However, after this code ran, git-annex is not longer operating properly in the bare repo: + +``` +% git annex drop --all +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +fatal: relative path syntax can't be used outside working tree +git-annex: fd:21: Data.ByteString.hGetLine: end of file +``` + +(fatal error messages are from cat-file batch calls inside) + +When I comment this code out, everything goes back to normal. It seems to makes no difference whether I follow the problematic code up with a `commit-tree` and `update-ref` to actually have the mainline branch point to a commit with that tree. It also seems to make no difference, when I explicitly `setpresentkey 0`. + +AFAICS this creates the same records as if I would have done this in a regular worktree using high-level git-annex tooling. Other git-annex commands like `fsck` seem to be working fine. If a create a branch with that tree, also `findref` seems to be working properly. + +Is this a bug, or am I doing something wrong? Thanks in advance for your time! +