1 ### Please describe the problem.
3 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.
5 ### What steps will reproduce the problem?
7 * Init two shared repositories and create a file
8 * Modify that file in repo1 as user u1
9 * Move the file to repo2 as "repository maintenance" user u2
10 - this gives permission denied error
12 Alternatively -- mabye better understandable usecase(repository maintainer moves unused files to backup):
14 * Init two shared repositories and create a file
15 * Modify that file in repo1 as user u1
16 * Modify that file in repo1 a second time (regardless which user) -- this makes the version edited by u1 unused
17 * Display unused files as repository maintenance user u2
18 - this gives permission denied error
19 * Move unused files to repo2 as "repository maintenance" user u2
20 - this gives permission denied error
22 ### What version of git-annex are you using? On what operating system?
25 stefan@atom-linux:/tmp/git-annex-test/a$ git --version
27 stefan@atom-linux:/tmp/git-annex-test/a$ git annex version
28 git-annex version: 5.20150610+gitg608172f-1~ndall+1
29 build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA
30 key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL
31 remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external
32 local repository version: 5
33 supported repository version: 5
34 upgrade supported from repository versions: 0 1 2 4
35 stefan@atom-linux:/tmp/git-annex-test/a$ uname -a
36 Linux atom-linux 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:21:40 UTC 2015 i686 i686 i686 GNU/Linux
39 ### Please provide any additional information below.
43 # init two shared repositories and create a file "file.txt"
45 stefan@atom-linux:/tmp/git-annex-test$ mkdir a
46 stefan@atom-linux:/tmp/git-annex-test$ mkdir b
47 stefan@atom-linux:/tmp/git-annex-test$ sudo chown :fileadmin-data *
48 stefan@atom-linux:/tmp/git-annex-test$ sudo chmod g+s *
49 stefan@atom-linux:/tmp/git-annex-test$ cd a
50 stefan@atom-linux:/tmp/git-annex-test/a$ git init --shared .
51 Initialized empty shared Git repository in /tmp/git-annex-test/a/.git/
52 stefan@atom-linux:/tmp/git-annex-test/a$ git config core.sharedrepository group
53 stefan@atom-linux:/tmp/git-annex-test/a$ echo "test" >> file.txt
54 stefan@atom-linux:/tmp/git-annex-test/a$ ls -al
56 drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:41 .
57 drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 ..
58 -rw-rw-r-- 1 stefan fileadmin-data 5 Nov 1 16:41 file.txt
59 drwxrwsr-x 7 stefan fileadmin-data 4096 Nov 1 16:40 .git
60 stefan@atom-linux:/tmp/git-annex-test/a$ git annex init
62 (recording state in git...)
63 stefan@atom-linux:/tmp/git-annex-test/a$ git annex add file.txt
65 (recording state in git...)
66 stefan@atom-linux:/tmp/git-annex-test/a$ git commit -m "new file"
67 [master (root-commit) 7aeaa5f] new file
68 1 file changed, 1 insertion(+)
69 create mode 120000 file.txt
70 stefan@atom-linux:/tmp/git-annex-test/a$ cd ..
71 stefan@atom-linux:/tmp/git-annex-test$ cd b
72 stefan@atom-linux:/tmp/git-annex-test/b$ git clone -o a ssh://127.0.0.1/tmp/git-annex-test/a .
74 remote: Counting objects: 13, done.
75 remote: Compressing objects: 100% (9/9), done.
76 remote: Total 13 (delta 0), reused 0 (delta 0)
77 Receiving objects: 100% (13/13), done.
78 Checking connectivity... done.
79 stefan@atom-linux:/tmp/git-annex-test/b$ git config core.sharedrepository group
80 stefan@atom-linux:/tmp/git-annex-test/b$ git annex init "B"
81 init B (merging a/git-annex into git-annex...)
82 (recording state in git...)
84 (recording state in git...)
85 stefan@atom-linux:/tmp/git-annex-test/b$ cd ..
86 stefan@atom-linux:/tmp/git-annex-test$ cd a
87 stefan@atom-linux:/tmp/git-annex-test/a$ git remote add b ssh://127.0.0.1/tmp/git-annex-test/b
88 stefan@atom-linux:/tmp/git-annex-test/a$ git annex sync
91 remote: Counting objects: 6, done.
92 remote: Compressing objects: 100% (5/5), done.
93 remote: Total 6 (delta 0), reused 1 (delta 0)
94 Unpacking objects: 100% (6/6), done.
95 From ssh://127.0.0.1/tmp/git-annex-test/b
96 * [new branch] git-annex -> b/git-annex
97 * [new branch] master -> b/master
99 (merging b/git-annex into git-annex...)
101 Total 0 (delta 0), reused 0 (delta 0)
102 To ssh://127.0.0.1/tmp/git-annex-test/b
103 * [new branch] git-annex -> synced/git-annex
104 * [new branch] master -> synced/master
106 stefan@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b
107 move file.txt (checking b...) (to b...)
108 SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2.txt
109 5 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
111 (recording state in git...)
113 ## ok, everything fine so far - we have a file "file.txt" which was created in a and moved to b successfully.
114 ## Now we go to a different user account and modify "file.txt"
115 ## -------------------------------------- userswitch
117 unison@atom-linux:/tmp/git-annex-test/a$ git annex get file.txt
118 get file.txt (from b...)
119 SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2.txt
120 5 100% 4.88kB/s 0:00:00 (xfr#1, to-chk=0/1)
122 (recording state in git...)
123 unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt
124 unlock file.txt (copying...) ok
125 unison@atom-linux:/tmp/git-annex-test/a$ ls -al
127 drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:48 .
128 drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 ..
129 -rw-rw-r-- 1 unison fileadmin-data 5 Nov 1 16:47 file.txt
130 drwxrwsr-x 9 stefan fileadmin-data 4096 Nov 1 16:44 .git
131 unison@atom-linux:/tmp/git-annex-test/a$ echo "a change by unison user" >> file.txt
132 unison@atom-linux:/tmp/git-annex-test/a$ git annex add .
134 (recording state in git...)
135 unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "unison change"
136 [master 37bd55d] unison change
137 1 file changed, 1 insertion(+), 1 deletion(-)
139 ## now the original user / repository maintainer wants to move the file
140 ## out to b which gives an permission denied error for setFileMode
141 ## git annex does copy it to b, but not remove it from a
142 ## -------------------------------------- userswitch
144 stefan@atom-linux:/tmp/git-annex-test/a$ ls -al
146 drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:48 .
147 drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 ..
148 lrwxrwxrwx 1 unison fileadmin-data 188 Nov 1 16:48 file.txt -> .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.tx
149 t/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt
150 drwxrwsr-x 9 stefan fileadmin-data 4096 Nov 1 16:48 .git
151 stefan@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b
152 move file.txt (checking b...) (to b...)
153 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt
154 29 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
155 git-annex: failed to lock content: .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29--6aec68aad4745c6
156 eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt: setFileMode: permission denied (Operation not permitted)
158 # which makes sense - the file is owned by other user:
159 stefan@atom-linux:/tmp/git-annex-test/a$ ls -al .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29--6
160 aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt
161 -r--r--r-- 1 unison fileadmin-data 29 Nov 1 16:48 .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29-
162 -6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt
164 ## the last editor of the file can move it, though:
165 ## -------------------------------------- userswitch
166 unison@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b
167 move file.txt (checking b...) ok
168 (recording state in git...)
170 ## continued - for second usecase...
171 ## edit file two more times as unison user:
173 unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt
174 unlock file.txt (copying...) ok
175 unison@atom-linux:/tmp/git-annex-test/a$ echo "another unison modification" >> file.txt
176 unison@atom-linux:/tmp/git-annex-test/a$ ls
178 unison@atom-linux:/tmp/git-annex-test/a$ git annex add
180 (recording state in git...)
181 unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "another unison change"
182 [master df85491] another unison change
183 1 file changed, 1 insertion(+), 1 deletion(-)
184 unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt
185 unlock file.txt (copying...) ok
186 (recording state in git...)
187 unison@atom-linux:/tmp/git-annex-test/a$ echo "changes once more" >> file.txt
188 unison@atom-linux:/tmp/git-annex-test/a$ git annex add .
190 (recording state in git...)
191 unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "1 more"
192 [master 099a2c7] 1 more
193 1 file changed, 1 insertion(+), 1 deletion(-)
195 unison@atom-linux:/tmp/git-annex-test/a$ git annex unused
196 unused . (checking for unused data...) (checking b/master...) (checking master...)
197 Some annexed data is no longer used by any files:
199 1 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt
200 2 SHA256E-s57--dc131ed3874c3b51a6801c43f5d5c0706a9aea58134459eeddf3436626adc89f.txt
201 (To see where data was previously used, try: git log --stat -S'KEY')
203 To remove unwanted data: git-annex dropunused NUMBER
207 ## switch to repository maintenance user and list unused:
208 ## -------------------------------------- userswitch
210 stefan@atom-linux:/tmp/git-annex-test/a$ git annex unused --debug
211 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","
213 [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","symbolic-ref","-q","HEAD"]
214 [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/master"]
215 [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref"]
216 (checking b/master...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]
217 [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]
218 [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","--"]
219 [2015-11-01 17:35:09 CET] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]
220 (checking master...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]
221 [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]
222 [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","--"]
224 Some annexed data is no longer used by any files:
226 1 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt
227 2 SHA256E-s57--dc131ed3874c3b51a6801c43f5d5c0706a9aea58134459eeddf3436626adc89f.txt
228 (To see where data was previously used, try: git log --stat -S'KEY')
230 To remove unwanted data: git-annex dropunused NUMBER
233 git-annex: .git/annex/unused: openFile: permission denied (Permission denied)
235 git-annex: unused: 1 failed
238 stefan@atom-linux:/tmp/git-annex-test/a$ git annex move --unused --to b
239 git-annex: .git/annex/unused: openFile: permission denied (Permission denied)
240 stefan@atom-linux:/tmp/git-annex-test/a$ git annex move --debug --unused --to b
241 [2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","git-annex"]
242 [2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"]
243 [2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","log","refs/heads/git-annex..4cdcc1b4550b2737e018d382022f3ce3e1dcb029","-n1","
245 [2015-11-01 17:38:48 CET] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]
246 git-annex: .git/annex/unused: openFile: permission denied (Permission denied)
248 # End of transcript or log.