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.reftree;
45
46 import static org.eclipse.jgit.lib.Constants.HEAD;
47 import static org.eclipse.jgit.lib.RefUpdate.Result.REJECTED;
48 import static org.eclipse.jgit.lib.RefUpdate.Result.RENAMED;
49
50 import java.io.IOException;
51 import java.util.ArrayList;
52 import java.util.List;
53
54 import org.eclipse.jgit.lib.ObjectId;
55 import org.eclipse.jgit.lib.ObjectIdRef;
56 import org.eclipse.jgit.lib.Ref;
57 import org.eclipse.jgit.lib.RefRename;
58 import org.eclipse.jgit.lib.RefUpdate;
59 import org.eclipse.jgit.lib.RefUpdate.Result;
60 import org.eclipse.jgit.lib.SymbolicRef;
61 import org.eclipse.jgit.revwalk.RevWalk;
62
63
64 class RefTreeRename extends RefRename {
65 private final RefTreeDatabase refdb;
66
67 RefTreeRename(RefTreeDatabase refdb, RefUpdate src, RefUpdate dst) {
68 super(src, dst);
69 this.refdb = refdb;
70 }
71
72 @Override
73 protected Result doRename() throws IOException {
74 try (RevWalk rw = new RevWalk(refdb.getRepository())) {
75 RefTreeBatch batch = new RefTreeBatch(refdb);
76 batch.setRefLogIdent(getRefLogIdent());
77 batch.setRefLogMessage(getRefLogMessage(), false);
78 batch.init(rw);
79
80 Ref head = batch.exactRef(rw.getObjectReader(), HEAD);
81 Ref oldRef = batch.exactRef(rw.getObjectReader(), source.getName());
82 if (oldRef == null) {
83 return REJECTED;
84 }
85
86 Ref newRef = asNew(oldRef);
87 List<Command> mv = new ArrayList<>(3);
88 mv.add(new Command(oldRef, null));
89 mv.add(new Command(null, newRef));
90 if (head != null && head.isSymbolic()
91 && head.getTarget().getName().equals(oldRef.getName())) {
92 mv.add(new Command(
93 head,
94 new SymbolicRef(head.getName(), newRef)));
95 }
96 batch.execute(rw, mv);
97 return RefTreeUpdate.translate(mv.get(1).getResult(), RENAMED);
98 }
99 }
100
101 private Ref asNew(Ref src) {
102 String name = destination.getName();
103 if (src.isSymbolic()) {
104 return new SymbolicRef(name, src.getTarget());
105 }
106
107 ObjectId peeled = src.getPeeledObjectId();
108 if (peeled != null) {
109 return new ObjectIdRef.PeeledTag(
110 src.getStorage(),
111 name,
112 src.getObjectId(),
113 peeled);
114 }
115
116 return new ObjectIdRef.PeeledNonTag(
117 src.getStorage(),
118 name,
119 src.getObjectId());
120 }
121 }