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.pgm;
46
47 import java.text.MessageFormat;
48 import java.util.ArrayList;
49 import java.util.List;
50
51 import org.eclipse.jgit.api.CheckoutCommand;
52 import org.eclipse.jgit.api.Git;
53 import org.eclipse.jgit.api.errors.CheckoutConflictException;
54 import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
55 import org.eclipse.jgit.api.errors.RefNotFoundException;
56 import org.eclipse.jgit.lib.Constants;
57 import org.eclipse.jgit.lib.ObjectId;
58 import org.eclipse.jgit.lib.Ref;
59 import org.eclipse.jgit.lib.Repository;
60 import org.eclipse.jgit.lib.TextProgressMonitor;
61 import org.eclipse.jgit.pgm.internal.CLIText;
62 import org.kohsuke.args4j.Argument;
63 import org.kohsuke.args4j.Option;
64 import org.kohsuke.args4j.spi.RestOfArgumentsHandler;
65
66 @Command(common = true, usage = "usage_checkout")
67 class Checkout extends TextBuiltin {
68
69 @Option(name = "-b", usage = "usage_createBranchAndCheckout")
70 private boolean createBranch = false;
71
72 @Option(name = "--force", aliases = { "-f" }, usage = "usage_forceCheckout")
73 private boolean force = false;
74
75 @Option(name = "--orphan", usage = "usage_orphan")
76 private boolean orphan = false;
77
78 @Argument(required = false, index = 0, metaVar = "metaVar_name", usage = "usage_checkout")
79 private String name;
80
81 @Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
82 private List<String> paths = new ArrayList<>();
83
84
85 @Override
86 protected void run() throws Exception {
87 if (createBranch) {
88 final ObjectId head = db.resolve(Constants.HEAD);
89 if (head == null)
90 throw die(CLIText.get().onBranchToBeBorn);
91 }
92
93 try (Git git = new Git(db)) {
94 CheckoutCommand command = git.checkout()
95 .setProgressMonitor(new TextProgressMonitor(errw));
96 if (paths.size() > 0) {
97 command.setStartPoint(name);
98 if (paths.size() == 1 && paths.get(0).equals(".")) {
99 command.setAllPaths(true);
100 } else {
101 command.addPaths(paths);
102 }
103 } else {
104 command.setCreateBranch(createBranch);
105 command.setName(name);
106 command.setForce(force);
107 command.setOrphan(orphan);
108 }
109 try {
110 String oldBranch = db.getBranch();
111 Ref ref = command.call();
112 if (ref == null)
113 return;
114 if (Repository.shortenRefName(ref.getName()).equals(oldBranch)) {
115 outw.println(MessageFormat.format(
116 CLIText.get().alreadyOnBranch,
117 name));
118 return;
119 }
120 if (createBranch || orphan)
121 outw.println(MessageFormat.format(
122 CLIText.get().switchedToNewBranch, name));
123 else
124 outw.println(MessageFormat.format(
125 CLIText.get().switchedToBranch,
126 Repository.shortenRefName(ref.getName())));
127 } catch (RefNotFoundException e) {
128 throw die(MessageFormat
129 .format(CLIText.get().pathspecDidNotMatch, name), e);
130 } catch (RefAlreadyExistsException e) {
131 throw die(MessageFormat
132 .format(CLIText.get().branchAlreadyExists, name));
133 } catch (CheckoutConflictException e) {
134 StringBuilder builder = new StringBuilder();
135 builder.append(CLIText.get().checkoutConflict);
136 builder.append(System.lineSeparator());
137 for (String path : e.getConflictingPaths()) {
138 builder.append(MessageFormat.format(
139 CLIText.get().checkoutConflictPathLine, path));
140 builder.append(System.lineSeparator());
141 }
142 throw die(builder.toString(), e);
143 }
144 }
145 }
146 }