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 package org.eclipse.jgit.pgm;
39
40 import java.util.ArrayList;
41 import java.util.List;
42
43 import org.eclipse.jgit.api.CommitCommand;
44 import org.eclipse.jgit.api.Git;
45 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
46 import org.eclipse.jgit.api.errors.JGitInternalException;
47 import org.eclipse.jgit.api.errors.NoHeadException;
48 import org.eclipse.jgit.api.errors.NoMessageException;
49 import org.eclipse.jgit.lib.Constants;
50 import org.eclipse.jgit.lib.Ref;
51 import org.eclipse.jgit.pgm.internal.CLIText;
52 import org.eclipse.jgit.revwalk.RevCommit;
53 import org.eclipse.jgit.util.RawParseUtils;
54 import org.kohsuke.args4j.Argument;
55 import org.kohsuke.args4j.Option;
56
57 @Command(common = true, usage = "usage_recordChangesToRepository")
58 class Commit extends TextBuiltin {
59
60
61
62 @Option(name = "--author", metaVar = "metaVar_author", usage = "usage_CommitAuthor")
63 private String author;
64
65 @Option(name = "--message", aliases = { "-m" }, metaVar = "metaVar_message", usage = "usage_CommitMessage", required = true)
66 private String message;
67
68 @Option(name = "--only", aliases = { "-o" }, usage = "usage_CommitOnly")
69 private boolean only;
70
71 @Option(name = "--all", aliases = { "-a" }, usage = "usage_CommitAll")
72 private boolean all;
73
74 @Option(name = "--amend", usage = "usage_CommitAmend")
75 private boolean amend;
76
77 @Argument(metaVar = "metaVar_commitPaths", usage = "usage_CommitPaths")
78 private List<String> paths = new ArrayList<>();
79
80
81 @Override
82 protected void run() throws NoHeadException, NoMessageException,
83 ConcurrentRefUpdateException, JGitInternalException, Exception {
84 try (Git git = new Git(db)) {
85 CommitCommand commitCmd = git.commit();
86 if (author != null)
87 commitCmd.setAuthor(RawParseUtils.parsePersonIdent(author));
88 if (message != null)
89 commitCmd.setMessage(message);
90 if (only && paths.isEmpty())
91 throw die(CLIText.get().pathsRequired);
92 if (only && all)
93 throw die(CLIText.get().onlyOneOfIncludeOnlyAllInteractiveCanBeUsed);
94 if (!paths.isEmpty())
95 for (String p : paths)
96 commitCmd.setOnly(p);
97 commitCmd.setAmend(amend);
98 commitCmd.setAll(all);
99 Ref head = db.exactRef(Constants.HEAD);
100 if (head == null) {
101 throw die(CLIText.get().onBranchToBeBorn);
102 }
103 RevCommit commit;
104 try {
105 commit = commitCmd.call();
106 } catch (JGitInternalException e) {
107 throw die(e.getMessage());
108 }
109
110 String branchName;
111 if (!head.isSymbolic())
112 branchName = CLIText.get().branchDetachedHEAD;
113 else {
114 branchName = head.getTarget().getName();
115 if (branchName.startsWith(Constants.R_HEADS))
116 branchName = branchName.substring(Constants.R_HEADS.length());
117 }
118 outw.println("[" + branchName + " " + commit.name() + "] "
119 + commit.getShortMessage());
120 }
121 }
122 }