DfsRefUpdate.java

  1. /*
  2.  * Copyright (C) 2011, Google Inc. and others
  3.  *
  4.  * This program and the accompanying materials are made available under the
  5.  * terms of the Eclipse Distribution License v. 1.0 which is available at
  6.  * https://www.eclipse.org/org/documents/edl-v10.php.
  7.  *
  8.  * SPDX-License-Identifier: BSD-3-Clause
  9.  */

  10. package org.eclipse.jgit.internal.storage.dfs;

  11. import java.io.IOException;

  12. import org.eclipse.jgit.lib.ObjectIdRef;
  13. import org.eclipse.jgit.lib.Ref;
  14. import org.eclipse.jgit.lib.Ref.Storage;
  15. import org.eclipse.jgit.lib.RefUpdate;
  16. import org.eclipse.jgit.lib.SymbolicRef;
  17. import org.eclipse.jgit.revwalk.RevObject;
  18. import org.eclipse.jgit.revwalk.RevTag;
  19. import org.eclipse.jgit.revwalk.RevWalk;

  20. final class DfsRefUpdate extends RefUpdate {
  21.     private final DfsRefDatabase refdb;

  22.     private Ref dstRef;

  23.     private RevWalk rw;

  24.     DfsRefUpdate(DfsRefDatabase refdb, Ref ref) {
  25.         super(ref);
  26.         this.refdb = refdb;
  27.     }

  28.     /** {@inheritDoc} */
  29.     @Override
  30.     protected DfsRefDatabase getRefDatabase() {
  31.         return refdb;
  32.     }

  33.     /** {@inheritDoc} */
  34.     @Override
  35.     protected DfsRepository getRepository() {
  36.         return refdb.getRepository();
  37.     }

  38.     /** {@inheritDoc} */
  39.     @Override
  40.     protected boolean tryLock(boolean deref) throws IOException {
  41.         dstRef = getRef();
  42.         if (deref)
  43.             dstRef = dstRef.getLeaf();

  44.         if (dstRef.isSymbolic())
  45.             setOldObjectId(null);
  46.         else
  47.             setOldObjectId(dstRef.getObjectId());

  48.         return true;
  49.     }

  50.     /** {@inheritDoc} */
  51.     @Override
  52.     protected void unlock() {
  53.         // No state is held while "locked".
  54.     }

  55.     /** {@inheritDoc} */
  56.     @Override
  57.     public Result update(RevWalk walk) throws IOException {
  58.         try {
  59.             rw = walk;
  60.             return super.update(walk);
  61.         } finally {
  62.             rw = null;
  63.         }
  64.     }

  65.     /** {@inheritDoc} */
  66.     @Override
  67.     protected Result doUpdate(Result desiredResult) throws IOException {
  68.         ObjectIdRef newRef;
  69.         RevObject obj = rw.parseAny(getNewObjectId());
  70.         if (obj instanceof RevTag) {
  71.             newRef = new ObjectIdRef.PeeledTag(
  72.                     Storage.PACKED,
  73.                     dstRef.getName(),
  74.                     getNewObjectId(),
  75.                     rw.peel(obj).copy());
  76.         } else {
  77.             newRef = new ObjectIdRef.PeeledNonTag(
  78.                     Storage.PACKED,
  79.                     dstRef.getName(),
  80.                     getNewObjectId());
  81.         }

  82.         if (getRefDatabase().compareAndPut(dstRef, newRef)) {
  83.             getRefDatabase().stored(newRef);
  84.             return desiredResult;
  85.         }
  86.         return Result.LOCK_FAILURE;
  87.     }

  88.     /** {@inheritDoc} */
  89.     @Override
  90.     protected Result doDelete(Result desiredResult) throws IOException {
  91.         if (getRefDatabase().compareAndRemove(dstRef)) {
  92.             getRefDatabase().removed(dstRef.getName());
  93.             return desiredResult;
  94.         }
  95.         return Result.LOCK_FAILURE;
  96.     }

  97.     /** {@inheritDoc} */
  98.     @Override
  99.     protected Result doLink(String target) throws IOException {
  100.         final SymbolicRef newRef = new SymbolicRef(
  101.                 dstRef.getName(),
  102.                 new ObjectIdRef.Unpeeled(
  103.                         Storage.NEW,
  104.                         target,
  105.                         null));
  106.         if (getRefDatabase().compareAndPut(dstRef, newRef)) {
  107.             getRefDatabase().stored(newRef);
  108.             if (dstRef.getStorage() == Ref.Storage.NEW)
  109.                 return Result.NEW;
  110.             return Result.FORCED;
  111.         }
  112.         return Result.LOCK_FAILURE;
  113.     }
  114. }