summaryrefslogtreecommitdiff
path: root/doc/bugs/On_Windows__44___annex_get_fails_with_HTTP_Remote__44___but_believes_it_has_succeeded..mdwn
blob: b34befcc0b7de85352c42a50450df8edb1589830 (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
### Please describe the problem.
On Windows, with a remote annex configured for HTTP access, attempting to annex get a file will not result in the content being downloaded, but will download a 404 error page as the file.

### What steps will reproduce the problem?
1. Create an annex (A1) on a Linux system.
2. "git update-server-info"
3. run an HTTP server with, a directory up. python -m SimpleHTTPServer
4. on a Windows system, clone the annex with 'git clone http://remote_host/annex_dir/.git'
5. "git annex get <file>"

the resulting file will not have the correct content, but rather a 404 error page. In addition, subsequent attempts to "git annex get <file>" will fail, unless you "git annex drop <file>" first. (it appears to believe it correctly retrieved the file).


### What version of git-annex are you using? On what operating system?
Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page)

Debian Linux: 3.20120629 (from the package manager)

### Please provide any additional information below.
After some debugging, I believe the issue is related to the way git-annex uses curl. it appears that git-annex uses the return code of curl or wget to determine if a download was successful, but curl by default will return status code 0 on a 404, unless the -f option is used (which it is not).

getting git-annex on windows to use wget works around the issue.



###Full Transcript

#### 1. setup of linux repo
[[!format sh """
test-git-annex@linux_host:~/test_annex$ git version
git version 1.7.10.4
test-git-annex@linux_host:~/test_annex$ git annex version
git-annex version: 3.20120629
local repository version: 3
default repository version: 3
supported repository versions: 3
upgrade supported from repository versions: 0 1 2
test-git-annex@linux_host: ~test-git-annex@linux_host:~$ mkdir test_annex
test-git-annex@linux_host: ~test-git-annex@linux_host:~$ cd test_annex/
test-git-annex@linux_host:~/test_annex$ git init .
Initialized empty Git repository in /home/test-git-annex/test_annex/.git/
test-git-annex@linux_host:~/test_annex$ annex init laptop
init laptop ok
(Recording state in git...)
~/test_annextest-git-annex@linux_host:~/test_annex$ echo "this is some content" > file1.txt
test-git-annex@linux_host:~/test_annex$ git annex add file1.txt
add file1.txt (checksum...) ok
(Recording state in git...)
test-git-annex@linux_host:~/test_annex$ git commit -a -m "initial commit"
[master (root-commit) 821c6c1] initial commit
 1 file changed, 1 insertion(+)
 create mode 120000 file1.txt
test-git-annex@linux_host:~/test_annex$ ls -l
total 4
lrwxrwxrwx 1 test-git-annex test-git-annex 178 Jul  6 11:33 file1.txt -> .git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729
test-git-annex@linux_host:~/test_annex$ cat file1.txt 
this is some content
"""]]

#### 2. set up and run http server
[[!format sh """
test-git-annex@MrLinuxTablet:~/test_annex$ git update-server-info
cd ..
test-git-annex@MrLinuxTablet:~$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

"""]]

#### 3. Set up Windows, clone repo, init annex

[[!format sh """

#Windows 7
#download and install git from git-scm.com/download/win
#Git-1.8.3-preview20130601.exe
#on install, selecting "Run Git from the Windows Command Prompt"
#on install, selecting "checkout as-is, commit as-is"
#installs to C:\Program Files (x86)\Git
#download and install git-annex from http://git-annex.branchable.com/install/
#git-annex-installer.exe
#need to right-click 'run as administrator', per reported bug (link here)
#installs to C:\Program Files (x86)\Git\cmd
#also installs some utilities, including wget.exe

C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git
Cloning into 'test_annex'...

C:\Users\test-git-annex>cd test_annex

C:\Users\test-git-annex\test_annex>dir
 Volume in drive C has no label.

 Directory of C:\Users\test-git-annex\test_annex

<DIR>          .
<DIR>          ..
              178 file1.txt
               1 File(s)            178 bytes

C:\Users\test-git-annex\test_annex>type file1.txt
.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729

C:\Users\test-git-annex\test_annex>git annex init windows
init windows
  Detected a crippled filesystem.

  Enabling direct mode.

  Detected a filesystem without fifo support.

  Disabling ssh connection caching.
ok
(Recording state in git...)

"""]]

####4. annex get

[[!format sh """
#copy Git\bin\libcurl.dll to Git\bin\libcurl-4.dll

C:\Users\test-git-annex\test_annex>git annex -vd get file1.txt
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","ls-files","--cached","-z","--","file1.txt"]
get file1.txt [<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","git-annex"]
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","--hash","refs/heads/git-annex"]
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..36508d74a05fd93daee965f2f73c977852e4b626","--oneline","-n1"]
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..304263841906c0b4dda39d0fdbe54e4af4307cb8","--oneline","-n1"]
(merging origin/git-annex into git-annex...)
[<datetime>] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","cat-file","--batch"]
[<datetime>] feed: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-index","-z","--index-info"]
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","304263841906c0b4dda39d0fdbe54e4af4307cb8"]
[<datetime>] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","hash-object","-t","blob","-w","--stdin","--no-filters"]
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","304263841906c0b4dda39d0fdbe54e4af4307cb8..refs/heads/git-annex","--oneline","-n1"]
(Recording state in git...)
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","write-tree"]
[<datetime>] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","commit-tree","103a0273cf24deec587295845f761b172a63ea19","-p","refs/heads/git-annex","-p","304263841906c0b4dda39d0fdbe54e4af4307cb8"]
[<datetime>] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-ref","refs/heads/git-annex","538f6b44a762be415ec6fef2b6644c10bc1f3780"]
[<datetime>] call: curl ["-s","-L","-C","-","-#","-o","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex8156.tmp","http://192.168.0.8:8000/test_annex/.git/config"]
[<datetime>] read: git ["config","--null","--list","--file","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex8156.tmp"]
[<datetime>] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","config","remote.origin.annex-uuid","64000156-e66a-11e2-aa76-131bb0a453f3"]
[<datetime>] read: git ["config","--null","--list"]
(from origin...) [<datetime>] call: curl ["-L","-C","-","-#","-o","C:\\Users\\test-git-annex\\test_annex\\.git\\annex\\tmp\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729","http://192.168.0.8:8000/test_annex/.git/annex\\objects\\c96\\53e\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729"]
######################################################################## 100.0%
ok
[<datetime>] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","hash-object","-w","--stdin-paths","--no-filters"]
[<datetime>] feed: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-index","-z","--index-info"]
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","--hash","refs/heads/git-annex"]
(Recording state in git...)
[<datetime>] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","write-tree"]
[<datetime>] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","commit-tree","b81dc8e53f4c02d433288d7f073be501d27c3648","-p","refs/heads/git-annex"]
[<datetime>] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-ref","refs/heads/git-annex","949181f4978c2654e156f1e4250f67135ddc2774"]

C:\Users\test-git-annex\test_annex>git annex find .
file1.txt

C:\Users\test-git-annex\test_annex>type file1.txt
<head>
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code 404.
<p>Message: File not found.
<p>Error code explanation: 404 = Nothing matches the given URI.
</body>
"""]]

#### http server output from above

[[!format sh """
192.168.0.2 - - [<datetime>] "GET /test_annex/.git/annex\objects\c96\53e\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 HTTP/1.1" 404 -
192.168.0.2 - - [<datetime>] code 404, message File not found
"""]]

> This seems to be two distinct bugs. First, curl was not propigating the exit
> status. I already fixed that. 
> 
> Second, it's using DOS style path separators when constructing the url.
> `http://192.168.0.8:8000/test_annex/.git/annex\\objects\\c96`
> I've put in an (ugly) fix for that. [[done]] --[[Joey]]