aboutsummaryrefslogtreecommitdiff
path: root/doc/bugs/Move_out_of_shared_repository_as___34__maintenance_user__34___gives_permission_denied_for_files_edited_by_others.mdwn
blob: f67d73ba43a881ee63933e7c94d89deb30c8fb49 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
### 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.
"""]]

> [[fixed|done]] --[[Joey]]