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.StopOptionHandler;
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 = true, index = 0, metaVar = "metaVar_name", usage = "usage_checkout")
78 private String name;
79
80 @Argument(index = 1)
81 @Option(name = "--", metaVar = "metaVar_paths", multiValued = true, handler = StopOptionHandler.class)
82 private List<String> paths = new ArrayList<String>();
83
84 @Override
85 protected void run() throws Exception {
86 if (createBranch) {
87 final ObjectId head = db.resolve(Constants.HEAD);
88 if (head == null)
89 throw die(CLIText.get().onBranchToBeBorn);
90 }
91
92 CheckoutCommand command = new Git(db).checkout();
93 if (paths.size() > 0) {
94 command.setStartPoint(name);
95 for (String path : paths)
96 command.addPath(path);
97 } else {
98 command.setCreateBranch(createBranch);
99 command.setName(name);
100 command.setForce(force);
101 command.setOrphan(orphan);
102 }
103 try {
104 String oldBranch = db.getBranch();
105 Ref ref = command.call();
106 if (ref == null)
107 return;
108 if (Repository.shortenRefName(ref.getName()).equals(oldBranch)) {
109 outw.println(MessageFormat.format(
110 CLIText.get().alreadyOnBranch,
111 name));
112 return;
113 }
114 if (createBranch || orphan)
115 outw.println(MessageFormat.format(
116 CLIText.get().switchedToNewBranch, name));
117 else
118 outw.println(MessageFormat.format(
119 CLIText.get().switchedToBranch,
120 Repository.shortenRefName(ref.getName())));
121 } catch (RefNotFoundException e) {
122 outw.println(MessageFormat.format(
123 CLIText.get().pathspecDidNotMatch,
124 name));
125 } catch (RefAlreadyExistsException e) {
126 throw die(MessageFormat.format(CLIText.get().branchAlreadyExists,
127 name));
128 } catch (CheckoutConflictException e) {
129 outw.println(CLIText.get().checkoutConflict);
130 for (String path : e.getConflictingPaths())
131 outw.println(MessageFormat.format(
132 CLIText.get().checkoutConflictPathLine, path));
133 }
134 }
135 }