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 package org.eclipse.jgit.internal.storage.dfs;
45
46 import java.io.IOException;
47
48 import org.eclipse.jgit.lib.ObjectIdRef;
49 import org.eclipse.jgit.lib.Ref;
50 import org.eclipse.jgit.lib.Ref.Storage;
51 import org.eclipse.jgit.lib.RefUpdate;
52 import org.eclipse.jgit.lib.SymbolicRef;
53 import org.eclipse.jgit.revwalk.RevObject;
54 import org.eclipse.jgit.revwalk.RevTag;
55 import org.eclipse.jgit.revwalk.RevWalk;
56
57 final class DfsRefUpdate extends RefUpdate {
58 private final DfsRefDatabase refdb;
59
60 private Ref dstRef;
61
62 private RevWalk rw;
63
64 DfsRefUpdate(DfsRefDatabase refdb, Ref ref) {
65 super(ref);
66 this.refdb = refdb;
67 }
68
69 @Override
70 protected DfsRefDatabase getRefDatabase() {
71 return refdb;
72 }
73
74 @Override
75 protected DfsRepository getRepository() {
76 return refdb.getRepository();
77 }
78
79 @Override
80 protected boolean tryLock(boolean deref) throws IOException {
81 dstRef = getRef();
82 if (deref)
83 dstRef = dstRef.getLeaf();
84
85 if (dstRef.isSymbolic())
86 setOldObjectId(null);
87 else
88 setOldObjectId(dstRef.getObjectId());
89
90 return true;
91 }
92
93 @Override
94 protected void unlock() {
95
96 }
97
98 @Override
99 public Result update(RevWalk walk) throws IOException {
100 try {
101 rw = walk;
102 return super.update(walk);
103 } finally {
104 rw = null;
105 }
106 }
107
108 @Override
109 protected Result doUpdate(Result desiredResult) throws IOException {
110 ObjectIdRef newRef;
111 RevObject obj = rw.parseAny(getNewObjectId());
112 if (obj instanceof RevTag) {
113 newRef = new ObjectIdRef.PeeledTag(
114 Storage.PACKED,
115 dstRef.getName(),
116 getNewObjectId(),
117 rw.peel(obj).copy());
118 } else {
119 newRef = new ObjectIdRef.PeeledNonTag(
120 Storage.PACKED,
121 dstRef.getName(),
122 getNewObjectId());
123 }
124
125 if (getRefDatabase().compareAndPut(dstRef, newRef)) {
126 getRefDatabase().stored(newRef);
127 return desiredResult;
128 }
129 return Result.LOCK_FAILURE;
130 }
131
132 @Override
133 protected Result doDelete(Result desiredResult) throws IOException {
134 if (getRefDatabase().compareAndRemove(dstRef)) {
135 getRefDatabase().removed(dstRef.getName());
136 return desiredResult;
137 }
138 return Result.LOCK_FAILURE;
139 }
140
141 @Override
142 protected Result doLink(String target) throws IOException {
143 final SymbolicRef newRef = new SymbolicRef(
144 dstRef.getName(),
145 new ObjectIdRef.Unpeeled(
146 Storage.NEW,
147 target,
148 null));
149 if (getRefDatabase().compareAndPut(dstRef, newRef)) {
150 getRefDatabase().stored(newRef);
151 if (dstRef.getStorage() == Ref.Storage.NEW)
152 return Result.NEW;
153 return Result.FORCED;
154 }
155 return Result.LOCK_FAILURE;
156 }
157 }