Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commands.py @ 35606:4b68ca118d8d
pull: hold wlock for the full operation when --update is used
With now, the wlock is not held between the pull and the update. This can lead
to race condition and make logic checking to post pull results more complicated
(eg: with _afterlock).
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Thu, 11 Jan 2018 11:57:59 +0000 |
parents | dda3cae3c9c5 |
children | a177c6aa055a |
comparison
equal
deleted
inserted
replaced
35605:45a816361926 | 35606:4b68ca118d8d |
---|---|
4005 except error.CapabilityError: | 4005 except error.CapabilityError: |
4006 err = _("other repository doesn't support revision lookup, " | 4006 err = _("other repository doesn't support revision lookup, " |
4007 "so a rev cannot be specified.") | 4007 "so a rev cannot be specified.") |
4008 raise error.Abort(err) | 4008 raise error.Abort(err) |
4009 | 4009 |
4010 pullopargs.update(opts.get('opargs', {})) | 4010 wlock = util.nullcontextmanager() |
4011 modheads = exchange.pull(repo, other, heads=revs, | 4011 if opts.get('update'): |
4012 force=opts.get('force'), | 4012 wlock = repo.wlock() |
4013 bookmarks=opts.get('bookmark', ()), | 4013 with wlock: |
4014 opargs=pullopargs).cgresult | 4014 pullopargs.update(opts.get('opargs', {})) |
4015 | 4015 modheads = exchange.pull(repo, other, heads=revs, |
4016 # brev is a name, which might be a bookmark to be activated at | 4016 force=opts.get('force'), |
4017 # the end of the update. In other words, it is an explicit | 4017 bookmarks=opts.get('bookmark', ()), |
4018 # destination of the update | 4018 opargs=pullopargs).cgresult |
4019 brev = None | 4019 |
4020 | 4020 # brev is a name, which might be a bookmark to be activated at |
4021 if checkout: | 4021 # the end of the update. In other words, it is an explicit |
4022 checkout = str(repo.changelog.rev(checkout)) | 4022 # destination of the update |
4023 | 4023 brev = None |
4024 # order below depends on implementation of | 4024 |
4025 # hg.addbranchrevs(). opts['bookmark'] is ignored, | 4025 if checkout: |
4026 # because 'checkout' is determined without it. | 4026 checkout = str(repo.changelog.rev(checkout)) |
4027 if opts.get('rev'): | 4027 |
4028 brev = opts['rev'][0] | 4028 # order below depends on implementation of |
4029 elif opts.get('branch'): | 4029 # hg.addbranchrevs(). opts['bookmark'] is ignored, |
4030 brev = opts['branch'][0] | 4030 # because 'checkout' is determined without it. |
4031 else: | 4031 if opts.get('rev'): |
4032 brev = branches[0] | 4032 brev = opts['rev'][0] |
4033 repo._subtoppath = source | 4033 elif opts.get('branch'): |
4034 try: | 4034 brev = opts['branch'][0] |
4035 ret = postincoming(ui, repo, modheads, opts.get('update'), | 4035 else: |
4036 checkout, brev) | 4036 brev = branches[0] |
4037 | 4037 repo._subtoppath = source |
4038 finally: | 4038 try: |
4039 del repo._subtoppath | 4039 ret = postincoming(ui, repo, modheads, opts.get('update'), |
4040 checkout, brev) | |
4041 | |
4042 finally: | |
4043 del repo._subtoppath | |
4040 | 4044 |
4041 finally: | 4045 finally: |
4042 other.close() | 4046 other.close() |
4043 return ret | 4047 return ret |
4044 | 4048 |