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
45 package org.eclipse.jgit.internal.storage.file;
46
47 import static org.eclipse.jgit.lib.Constants.encode;
48
49 import java.io.IOException;
50
51 import org.eclipse.jgit.lib.Ref;
52 import org.eclipse.jgit.lib.RefUpdate;
53 import org.eclipse.jgit.lib.Repository;
54
55
56 class RefDirectoryUpdate extends RefUpdate {
57 private final RefDirectory database;
58
59 private LockFile lock;
60
61 RefDirectoryUpdate(final RefDirectory r, final Ref ref) {
62 super(ref);
63 database = r;
64 }
65
66 @Override
67 protected RefDirectory getRefDatabase() {
68 return database;
69 }
70
71 @Override
72 protected Repository getRepository() {
73 return database.getRepository();
74 }
75
76 @Override
77 protected boolean tryLock(boolean deref) throws IOException {
78 Ref dst = getRef();
79 if (deref)
80 dst = dst.getLeaf();
81 String name = dst.getName();
82 lock = new LockFile(database.fileFor(name), getRepository().getFS());
83 if (lock.lock()) {
84 dst = database.getRef(name);
85 setOldObjectId(dst != null ? dst.getObjectId() : null);
86 return true;
87 } else {
88 return false;
89 }
90 }
91
92 @Override
93 protected void unlock() {
94 if (lock != null) {
95 lock.unlock();
96 lock = null;
97 }
98 }
99
100 @Override
101 protected Result doUpdate(final Result status) throws IOException {
102 WriteConfig wc = database.getRepository().getConfig()
103 .get(WriteConfig.KEY);
104
105 lock.setFSync(wc.getFSyncRefFiles());
106 lock.setNeedStatInformation(true);
107 lock.write(getNewObjectId());
108
109 String msg = getRefLogMessage();
110 if (msg != null) {
111 if (isRefLogIncludingResult()) {
112 String strResult = toResultString(status);
113 if (strResult != null) {
114 if (msg.length() > 0)
115 msg = msg + ": " + strResult;
116 else
117 msg = strResult;
118 }
119 }
120 database.log(this, msg, true);
121 }
122 if (!lock.commit())
123 return Result.LOCK_FAILURE;
124 database.stored(this, lock.getCommitSnapshot());
125 return status;
126 }
127
128 private String toResultString(final Result status) {
129 switch (status) {
130 case FORCED:
131 return "forced-update";
132 case FAST_FORWARD:
133 return "fast forward";
134 case NEW:
135 return "created";
136 default:
137 return null;
138 }
139 }
140
141 @Override
142 protected Result doDelete(final Result status) throws IOException {
143 if (getRef().getLeaf().getStorage() != Ref.Storage.NEW)
144 database.delete(this);
145 return status;
146 }
147
148 @Override
149 protected Result doLink(final String target) throws IOException {
150 WriteConfig wc = database.getRepository().getConfig()
151 .get(WriteConfig.KEY);
152
153 lock.setFSync(wc.getFSyncRefFiles());
154 lock.setNeedStatInformation(true);
155 lock.write(encode(RefDirectory.SYMREF + target + '\n'));
156
157 String msg = getRefLogMessage();
158 if (msg != null)
159 database.log(this, msg, false);
160 if (!lock.commit())
161 return Result.LOCK_FAILURE;
162 database.storedSymbolicRef(this, lock.getCommitSnapshot(), target);
163
164 if (getRef().getStorage() == Ref.Storage.NEW)
165 return Result.NEW;
166 return Result.FORCED;
167 }
168 }