### Please describe the problem. For shared repositories git annex refuses to move file out of repository (git annex move --to) if user triggering the move is not the owner of the file. ### What steps will reproduce the problem? * Init two shared repositories and create a file * Modify that file in repo1 as user u1 * Move the file to repo2 as "repository maintenance" user u2 - this gives permission denied error Alternatively -- mabye better understandable usecase(repository maintainer moves unused files to backup): * Init two shared repositories and create a file * Modify that file in repo1 as user u1 * Modify that file in repo1 a second time (regardless which user) -- this makes the version edited by u1 unused * Display unused files as repository maintenance user u2 - this gives permission denied error * Move unused files to repo2 as "repository maintenance" user u2 - this gives permission denied error ### What version of git-annex are you using? On what operating system? [[!format sh """ stefan@atom-linux:/tmp/git-annex-test/a$ git --version git version 2.6.2 stefan@atom-linux:/tmp/git-annex-test/a$ git annex version git-annex version: 5.20150610+gitg608172f-1~ndall+1 build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external local repository version: 5 supported repository version: 5 upgrade supported from repository versions: 0 1 2 4 stefan@atom-linux:/tmp/git-annex-test/a$ uname -a Linux atom-linux 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:21:40 UTC 2015 i686 i686 i686 GNU/Linux """]] ### Please provide any additional information below. [[!format sh """ # init two shared repositories and create a file "file.txt" stefan@atom-linux:/tmp/git-annex-test$ mkdir a stefan@atom-linux:/tmp/git-annex-test$ mkdir b stefan@atom-linux:/tmp/git-annex-test$ sudo chown :fileadmin-data * stefan@atom-linux:/tmp/git-annex-test$ sudo chmod g+s * stefan@atom-linux:/tmp/git-annex-test$ cd a stefan@atom-linux:/tmp/git-annex-test/a$ git init --shared . Initialized empty shared Git repository in /tmp/git-annex-test/a/.git/ stefan@atom-linux:/tmp/git-annex-test/a$ git config core.sharedrepository group stefan@atom-linux:/tmp/git-annex-test/a$ echo "test" >> file.txt stefan@atom-linux:/tmp/git-annex-test/a$ ls -al total 16 drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:41 . drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 .. -rw-rw-r-- 1 stefan fileadmin-data 5 Nov 1 16:41 file.txt drwxrwsr-x 7 stefan fileadmin-data 4096 Nov 1 16:40 .git stefan@atom-linux:/tmp/git-annex-test/a$ git annex init init ok (recording state in git...) stefan@atom-linux:/tmp/git-annex-test/a$ git annex add file.txt add file.txt ok (recording state in git...) stefan@atom-linux:/tmp/git-annex-test/a$ git commit -m "new file" [master (root-commit) 7aeaa5f] new file 1 file changed, 1 insertion(+) create mode 120000 file.txt stefan@atom-linux:/tmp/git-annex-test/a$ cd .. stefan@atom-linux:/tmp/git-annex-test$ cd b stefan@atom-linux:/tmp/git-annex-test/b$ git clone -o a ssh://127.0.0.1/tmp/git-annex-test/a . Cloning into '.'... remote: Counting objects: 13, done. remote: Compressing objects: 100% (9/9), done. remote: Total 13 (delta 0), reused 0 (delta 0) Receiving objects: 100% (13/13), done. Checking connectivity... done. stefan@atom-linux:/tmp/git-annex-test/b$ git config core.sharedrepository group stefan@atom-linux:/tmp/git-annex-test/b$ git annex init "B" init B (merging a/git-annex into git-annex...) (recording state in git...) ok (recording state in git...) stefan@atom-linux:/tmp/git-annex-test/b$ cd .. stefan@atom-linux:/tmp/git-annex-test$ cd a stefan@atom-linux:/tmp/git-annex-test/a$ git remote add b ssh://127.0.0.1/tmp/git-annex-test/b stefan@atom-linux:/tmp/git-annex-test/a$ git annex sync commit ok pull b remote: Counting objects: 6, done. remote: Compressing objects: 100% (5/5), done. remote: Total 6 (delta 0), reused 1 (delta 0) Unpacking objects: 100% (6/6), done. From ssh://127.0.0.1/tmp/git-annex-test/b * [new branch] git-annex -> b/git-annex * [new branch] master -> b/master ok (merging b/git-annex into git-annex...) push b Total 0 (delta 0), reused 0 (delta 0) To ssh://127.0.0.1/tmp/git-annex-test/b * [new branch] git-annex -> synced/git-annex * [new branch] master -> synced/master ok stefan@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b move file.txt (checking b...) (to b...) SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2.txt 5 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) ok (recording state in git...) ## ok, everything fine so far - we have a file "file.txt" which was created in a and moved to b successfully. ## Now we go to a different user account and modify "file.txt" ## -------------------------------------- userswitch unison@atom-linux:/tmp/git-annex-test/a$ git annex get file.txt get file.txt (from b...) SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2.txt 5 100% 4.88kB/s 0:00:00 (xfr#1, to-chk=0/1) ok (recording state in git...) unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt unlock file.txt (copying...) ok unison@atom-linux:/tmp/git-annex-test/a$ ls -al total 16 drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:48 . drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 .. -rw-rw-r-- 1 unison fileadmin-data 5 Nov 1 16:47 file.txt drwxrwsr-x 9 stefan fileadmin-data 4096 Nov 1 16:44 .git unison@atom-linux:/tmp/git-annex-test/a$ echo "a change by unison user" >> file.txt unison@atom-linux:/tmp/git-annex-test/a$ git annex add . add file.txt ok (recording state in git...) unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "unison change" [master 37bd55d] unison change 1 file changed, 1 insertion(+), 1 deletion(-) ## now the original user / repository maintainer wants to move the file ## out to b which gives an permission denied error for setFileMode ## git annex does copy it to b, but not remove it from a ## -------------------------------------- userswitch stefan@atom-linux:/tmp/git-annex-test/a$ ls -al total 16 drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:48 . drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 .. lrwxrwxrwx 1 unison fileadmin-data 188 Nov 1 16:48 file.txt -> .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.tx t/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt drwxrwsr-x 9 stefan fileadmin-data 4096 Nov 1 16:48 .git stefan@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b move file.txt (checking b...) (to b...) SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt 29 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) git-annex: failed to lock content: .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29--6aec68aad4745c6 eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt: setFileMode: permission denied (Operation not permitted) # which makes sense - the file is owned by other user: stefan@atom-linux:/tmp/git-annex-test/a$ ls -al .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29--6 aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt -r--r--r-- 1 unison fileadmin-data 29 Nov 1 16:48 .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29- -6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt ## the last editor of the file can move it, though: ## -------------------------------------- userswitch unison@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b move file.txt (checking b...) ok (recording state in git...) ## continued - for second usecase... ## edit file two more times as unison user: unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt unlock file.txt (copying...) ok unison@atom-linux:/tmp/git-annex-test/a$ echo "another unison modification" >> file.txt unison@atom-linux:/tmp/git-annex-test/a$ ls file.txt unison@atom-linux:/tmp/git-annex-test/a$ git annex add add file.txt ok (recording state in git...) unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "another unison change" [master df85491] another unison change 1 file changed, 1 insertion(+), 1 deletion(-) unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt unlock file.txt (copying...) ok (recording state in git...) unison@atom-linux:/tmp/git-annex-test/a$ echo "changes once more" >> file.txt unison@atom-linux:/tmp/git-annex-test/a$ git annex add . add file.txt ok (recording state in git...) unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "1 more" [master 099a2c7] 1 more 1 file changed, 1 insertion(+), 1 deletion(-) unison@atom-linux:/tmp/git-annex-test/a$ git annex unused unused . (checking for unused data...) (checking b/master...) (checking master...) Some annexed data is no longer used by any files: NUMBER KEY 1 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt 2 SHA256E-s57--dc131ed3874c3b51a6801c43f5d5c0706a9aea58134459eeddf3436626adc89f.txt (To see where data was previously used, try: git log --stat -S'KEY') To remove unwanted data: git-annex dropunused NUMBER ok ## switch to repository maintenance user and list unused: ## -------------------------------------- userswitch stefan@atom-linux:/tmp/git-annex-test/a$ git annex unused --debug unused . (checking for unused data...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","ls-files","--cached","--others","-z"," --","."] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","symbolic-ref","-q","HEAD"] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/master"] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref"] (checking b/master...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","diff-index","-z","--raw","--no-renames","-l0","refs/remotes/b/master","--"] [2015-11-01 17:35:09 CET] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"] (checking master...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"] [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","diff-index","-z","--raw","--no-renames","-l0","refs/heads/master","--"] Some annexed data is no longer used by any files: NUMBER KEY 1 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt 2 SHA256E-s57--dc131ed3874c3b51a6801c43f5d5c0706a9aea58134459eeddf3436626adc89f.txt (To see where data was previously used, try: git log --stat -S'KEY') To remove unwanted data: git-annex dropunused NUMBER git-annex: .git/annex/unused: openFile: permission denied (Permission denied) failed git-annex: unused: 1 failed stefan@atom-linux:/tmp/git-annex-test/a$ git annex move --unused --to b git-annex: .git/annex/unused: openFile: permission denied (Permission denied) stefan@atom-linux:/tmp/git-annex-test/a$ git annex move --debug --unused --to b [2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","git-annex"] [2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"] [2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","log","refs/heads/git-annex..4cdcc1b4550b2737e018d382022f3ce3e1dcb029","-n1"," --pretty=%H"] [2015-11-01 17:38:48 CET] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"] git-annex: .git/annex/unused: openFile: permission denied (Permission denied) # End of transcript or log. """]]