Show More
@@ -14,11 +14,13 b' urlreq = util.urlreq' | |||||
14 |
|
14 | |||
15 | import lfutil |
|
15 | import lfutil | |
16 | import basestore |
|
16 | import basestore | |
|
17 | import localstore | |||
17 |
|
18 | |||
18 | class remotestore(basestore.basestore): |
|
19 | class remotestore(basestore.basestore): | |
19 | '''a largefile store accessed over a network''' |
|
20 | '''a largefile store accessed over a network''' | |
20 | def __init__(self, ui, repo, url): |
|
21 | def __init__(self, ui, repo, url): | |
21 | super(remotestore, self).__init__(ui, repo, url) |
|
22 | super(remotestore, self).__init__(ui, repo, url) | |
|
23 | self._lstore = localstore.localstore(self.ui, self.repo, self.repo) | |||
22 |
|
24 | |||
23 | def put(self, source, hash): |
|
25 | def put(self, source, hash): | |
24 | if self.sendfile(source, hash): |
|
26 | if self.sendfile(source, hash): | |
@@ -65,27 +67,42 b' class remotestore(basestore.basestore):' | |||||
65 |
|
67 | |||
66 | return lfutil.copyandhash(chunks, tmpfile) |
|
68 | return lfutil.copyandhash(chunks, tmpfile) | |
67 |
|
69 | |||
|
70 | def _hashesavailablelocally(self, hashes): | |||
|
71 | existslocallymap = self._lstore.exists(hashes) | |||
|
72 | localhashes = [hash for hash in hashes if existslocallymap[hash]] | |||
|
73 | return localhashes | |||
|
74 | ||||
68 | def _verifyfiles(self, contents, filestocheck): |
|
75 | def _verifyfiles(self, contents, filestocheck): | |
69 | failed = False |
|
76 | failed = False | |
70 | expectedhashes = [expectedhash |
|
77 | expectedhashes = [expectedhash | |
71 | for cset, filename, expectedhash in filestocheck] |
|
78 | for cset, filename, expectedhash in filestocheck] | |
72 |
|
|
79 | localhashes = self._hashesavailablelocally(expectedhashes) | |
|
80 | stats = self._stat([expectedhash for expectedhash in expectedhashes | |||
|
81 | if expectedhash not in localhashes]) | |||
|
82 | ||||
73 | for cset, filename, expectedhash in filestocheck: |
|
83 | for cset, filename, expectedhash in filestocheck: | |
74 |
|
|
84 | if expectedhash in localhashes: | |
75 | if stat: |
|
85 | filetocheck = (cset, filename, expectedhash) | |
76 | if stat == 1: |
|
86 | verifyresult = self._lstore._verifyfiles(contents, | |
77 | self.ui.warn( |
|
87 | [filetocheck]) | |
78 | _('changeset %s: %s: contents differ\n') |
|
88 | if verifyresult: | |
79 | % (cset, filename)) |
|
|||
80 | failed = True |
|
89 | failed = True | |
81 |
|
|
90 | else: | |
82 | self.ui.warn( |
|
91 | stat = stats[expectedhash] | |
83 | _('changeset %s: %s missing\n') |
|
92 | if stat: | |
84 |
|
|
93 | if stat == 1: | |
85 |
|
|
94 | self.ui.warn( | |
86 | else: |
|
95 | _('changeset %s: %s: contents differ\n') | |
87 | raise RuntimeError('verify failed: unexpected response ' |
|
96 | % (cset, filename)) | |
88 | 'from statlfile (%r)' % stat) |
|
97 | failed = True | |
|
98 | elif stat == 2: | |||
|
99 | self.ui.warn( | |||
|
100 | _('changeset %s: %s missing\n') | |||
|
101 | % (cset, filename)) | |||
|
102 | failed = True | |||
|
103 | else: | |||
|
104 | raise RuntimeError('verify failed: unexpected response ' | |||
|
105 | 'from statlfile (%r)' % stat) | |||
89 | return failed |
|
106 | return failed | |
90 |
|
107 | |||
91 | def batch(self): |
|
108 | def batch(self): |
@@ -324,27 +324,59 b' largefiles should batch verify remote ca' | |||||
324 | $ hg serve -R batchverifymain -d -p $HGPORT --pid-file hg.pid \ |
|
324 | $ hg serve -R batchverifymain -d -p $HGPORT --pid-file hg.pid \ | |
325 | > -A access.log |
|
325 | > -A access.log | |
326 | $ cat hg.pid >> $DAEMON_PIDS |
|
326 | $ cat hg.pid >> $DAEMON_PIDS | |
327 | $ hg clone http://localhost:$HGPORT batchverifyclone |
|
327 | $ hg clone --noupdate http://localhost:$HGPORT batchverifyclone | |
328 | requesting all changes |
|
328 | requesting all changes | |
329 | adding changesets |
|
329 | adding changesets | |
330 | adding manifests |
|
330 | adding manifests | |
331 | adding file changes |
|
331 | adding file changes | |
332 | added 2 changesets with 2 changes to 2 files |
|
332 | added 2 changesets with 2 changes to 2 files | |
333 | updating to branch default |
|
333 | $ hg -R batchverifyclone verify --large --lfa | |
334 | getting changed largefiles |
|
|||
335 | 2 largefiles updated, 0 removed |
|
|||
336 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
|||
337 | $ hg -R batchverifyclone verify --large |
|
|||
338 | checking changesets |
|
334 | checking changesets | |
339 | checking manifests |
|
335 | checking manifests | |
340 | crosschecking files in changesets and manifests |
|
336 | crosschecking files in changesets and manifests | |
341 | checking files |
|
337 | checking files | |
342 | 2 files, 2 changesets, 2 total revisions |
|
338 | 2 files, 2 changesets, 2 total revisions | |
343 |
searching |
|
339 | searching 2 changesets for largefiles | |
344 | verified existence of 2 revisions of 2 largefiles |
|
340 | verified existence of 2 revisions of 2 largefiles | |
345 | $ tail -1 access.log |
|
341 | $ tail -1 access.log | |
346 | 127.0.0.1 - - [*] "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=statlfile+sha%3D972a1a11f19934401291cc99117ec614933374ce%3Bstatlfile+sha%3Dc801c9cfe94400963fcb683246217d5db77f9a9a (glob) |
|
342 | 127.0.0.1 - - [*] "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=statlfile+sha%3D972a1a11f19934401291cc99117ec614933374ce%3Bstatlfile+sha%3Dc801c9cfe94400963fcb683246217d5db77f9a9a (glob) | |
347 | $ rm access.log |
|
343 | $ hg -R batchverifyclone update | |
|
344 | getting changed largefiles | |||
|
345 | 2 largefiles updated, 0 removed | |||
|
346 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
347 | ||||
|
348 | Clear log file before next test | |||
|
349 | ||||
|
350 | $ printf "" > access.log | |||
|
351 | ||||
|
352 | Verify should check file on remote server only when file is not | |||
|
353 | available locally. | |||
|
354 | ||||
|
355 | $ echo "ccc" >> batchverifymain/c | |||
|
356 | $ hg -R batchverifymain status | |||
|
357 | ? c | |||
|
358 | $ hg -R batchverifymain add --large batchverifymain/c | |||
|
359 | $ hg -R batchverifymain commit -m "c" | |||
|
360 | Invoking status precommit hook | |||
|
361 | A c | |||
|
362 | $ hg -R batchverifyclone pull | |||
|
363 | pulling from http://localhost:$HGPORT/ | |||
|
364 | searching for changes | |||
|
365 | adding changesets | |||
|
366 | adding manifests | |||
|
367 | adding file changes | |||
|
368 | added 1 changesets with 1 changes to 1 files | |||
|
369 | (run 'hg update' to get a working copy) | |||
|
370 | $ hg -R batchverifyclone verify --lfa | |||
|
371 | checking changesets | |||
|
372 | checking manifests | |||
|
373 | crosschecking files in changesets and manifests | |||
|
374 | checking files | |||
|
375 | 3 files, 3 changesets, 3 total revisions | |||
|
376 | searching 3 changesets for largefiles | |||
|
377 | verified existence of 3 revisions of 3 largefiles | |||
|
378 | $ tail -1 access.log | |||
|
379 | 127.0.0.1 - - [*] "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=statlfile+sha%3Dc8559c3c9cfb42131794b7d8009230403b9b454c (glob) | |||
348 |
|
380 | |||
349 | $ killdaemons.py |
|
381 | $ killdaemons.py | |
350 |
|
382 |
General Comments 0
You need to be logged in to leave comments.
Login now