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