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
70 @Override
71 protected DfsRefDatabase getRefDatabase() {
72 return refdb;
73 }
74
75
76 @Override
77 protected DfsRepository getRepository() {
78 return refdb.getRepository();
79 }
80
81
82 @Override
83 protected boolean tryLock(boolean deref) throws IOException {
84 dstRef = getRef();
85 if (deref)
86 dstRef = dstRef.getLeaf();
87
88 if (dstRef.isSymbolic())
89 setOldObjectId(null);
90 else
91 setOldObjectId(dstRef.getObjectId());
92
93 return true;
94 }
95
96
97 @Override
98 protected void unlock() {
99
100 }
101
102
103 @Override
104 public Result update(RevWalk walk) throws IOException {
105 try {
106 rw = walk;
107 return super.update(walk);
108 } finally {
109 rw = null;
110 }
111 }
112
113
114 @Override
115 protected Result doUpdate(Result desiredResult) throws IOException {
116 ObjectIdRef newRef;
117 RevObject obj = rw.parseAny(getNewObjectId());
118 if (obj instanceof RevTag) {
119 newRef = new ObjectIdRef.PeeledTag(
120 Storage.PACKED,
121 dstRef.getName(),
122 getNewObjectId(),
123 rw.peel(obj).copy());
124 } else {
125 newRef = new ObjectIdRef.PeeledNonTag(
126 Storage.PACKED,
127 dstRef.getName(),
128 getNewObjectId());
129 }
130
131 if (getRefDatabase().compareAndPut(dstRef, newRef)) {
132 getRefDatabase().stored(newRef);
133 return desiredResult;
134 }
135 return Result.LOCK_FAILURE;
136 }
137
138
139 @Override
140 protected Result doDelete(Result desiredResult) throws IOException {
141 if (getRefDatabase().compareAndRemove(dstRef)) {
142 getRefDatabase().removed(dstRef.getName());
143 return desiredResult;
144 }
145 return Result.LOCK_FAILURE;
146 }
147
148
149 @Override
150 protected Result doLink(String target) throws IOException {
151 final SymbolicReficRef.html#SymbolicRef">SymbolicRef newRef = new SymbolicRef(
152 dstRef.getName(),
153 new ObjectIdRef.Unpeeled(
154 Storage.NEW,
155 target,
156 null));
157 if (getRefDatabase().compareAndPut(dstRef, newRef)) {
158 getRefDatabase().stored(newRef);
159 if (dstRef.getStorage() == Ref.Storage.NEW)
160 return Result.NEW;
161 return Result.FORCED;
162 }
163 return Result.LOCK_FAILURE;
164 }
165 }