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 = "-B", usage = "usage_forcedSwitchBranch")
73 private boolean forceSwitchBranch = false;
74
75 @Option(name = "--force", aliases = { "-f" }, usage = "usage_forceCheckout")
76 private boolean forced = false;
77
78 @Option(name = "--orphan", usage = "usage_orphan")
79 private boolean orphan = false;
80
81 @Argument(required = false, index = 0, metaVar = "metaVar_name", usage = "usage_checkout")
82 private String name;
83
84 @Option(name = "--", metaVar = "metaVar_paths", handler = RestOfArgumentsHandler.class)
85 private List<String> paths = new ArrayList<>();
86
87
88 @Override
89 protected void run() throws Exception {
90 if (createBranch) {
91 final ObjectId head = db.resolve(Constants.HEAD);
92 if (head == null)
93 throw die(CLIText.get().onBranchToBeBorn);
94 }
95
96 try (Gitit.html#Git">Git git = new Git(db)) {
97 CheckoutCommand command = git.checkout()
98 .setProgressMonitor(new TextProgressMonitor(errw));
99 if (!paths.isEmpty()) {
100 command.setStartPoint(name);
101 if (paths.size() == 1 && paths.get(0).equals(".")) {
102 command.setAllPaths(true);
103 } else {
104 command.addPaths(paths);
105 }
106 } else {
107 command.setCreateBranch(createBranch);
108 command.setName(name);
109 command.setForceRefUpdate(forceSwitchBranch);
110 command.setForced(forced);
111 command.setOrphan(orphan);
112 }
113 try {
114 String oldBranch = db.getBranch();
115 Ref ref = command.call();
116 if (ref == null)
117 return;
118 if (Repository.shortenRefName(ref.getName()).equals(oldBranch)) {
119 outw.println(MessageFormat.format(
120 CLIText.get().alreadyOnBranch,
121 name));
122 return;
123 }
124 if (createBranch || orphan)
125 outw.println(MessageFormat.format(
126 CLIText.get().switchedToNewBranch, name));
127 else
128 outw.println(MessageFormat.format(
129 CLIText.get().switchedToBranch,
130 Repository.shortenRefName(ref.getName())));
131 } catch (RefNotFoundException e) {
132 throw die(MessageFormat
133 .format(CLIText.get().pathspecDidNotMatch, name), e);
134 } catch (RefAlreadyExistsException e) {
135 throw die(MessageFormat
136 .format(CLIText.get().branchAlreadyExists, name));
137 } catch (CheckoutConflictException e) {
138 StringBuilder builder = new StringBuilder();
139 builder.append(CLIText.get().checkoutConflict);
140 builder.append(System.lineSeparator());
141 for (String path : e.getConflictingPaths()) {
142 builder.append(MessageFormat.format(
143 CLIText.get().checkoutConflictPathLine, path));
144 builder.append(System.lineSeparator());
145 }
146 throw die(builder.toString(), e);
147 }
148 }
149 }
150 }