Mercurial > hg4j
diff src/org/tmatesoft/hg/internal/CompleteRepoLock.java @ 617:65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 15 May 2013 20:10:09 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/tmatesoft/hg/internal/CompleteRepoLock.java Wed May 15 20:10:09 2013 +0200 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2013 TMate Software Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * For information on how to redistribute this software under + * the terms of a license other than GNU General Public License + * contact TMate Software at support@hg4j.com + */ +package org.tmatesoft.hg.internal; + +import static org.tmatesoft.hg.util.LogFacility.Severity.Error; + +import org.tmatesoft.hg.core.HgRepositoryLockException; +import org.tmatesoft.hg.repo.HgRepository; +import org.tmatesoft.hg.repo.HgRepositoryLock; +import org.tmatesoft.hg.util.LogFacility; + +/** + * Helper to lock both storage and working directory + * + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public final class CompleteRepoLock { + + private final HgRepository repo; + private HgRepositoryLock wdLock, storeLock; + + public CompleteRepoLock(HgRepository hgRepo) { + repo = hgRepo; + } + + public void acquire() throws HgRepositoryLockException { + wdLock = repo.getWorkingDirLock(); + storeLock = repo.getStoreLock(); + wdLock.acquire(); + try { + storeLock.acquire(); + } catch (HgRepositoryLockException ex) { + try { + wdLock.release(); + } catch (HgRepositoryLockException e2) { + final LogFacility log = repo.getSessionContext().getLog(); + log.dump(getClass(), Error, e2, "Nested exception ignored once failed to acquire store lock"); + } + throw ex; + } + + } + + public void release() throws HgRepositoryLockException { + try { + storeLock.release(); + } catch (HgRepositoryLockException ex) { + try { + wdLock.release(); + } catch (HgRepositoryLockException e2) { + final LogFacility log = repo.getSessionContext().getLog(); + log.dump(getClass(), Error, e2, "Nested exception ignored when releasing working directory lock"); + } + throw ex; + } + wdLock.release(); + } +}