1
2
3
4
5
6
7
8
9
10
11
12 package org.jenkinsci.plugins.darcs;
13
14 import hudson.Extension;
15 import hudson.Launcher;
16 import hudson.Util;
17 import hudson.XmlFile;
18 import hudson.model.Hudson;
19 import hudson.model.TaskListener;
20 import hudson.scm.RepositoryBrowser;
21 import hudson.scm.SCM;
22 import hudson.scm.SCMDescriptor;
23 import hudson.util.FormValidation;
24 import java.io.File;
25 import java.io.IOException;
26 import java.lang.reflect.Field;
27 import java.util.logging.Level;
28 import static java.util.logging.Level.WARNING;
29 import java.util.logging.Logger;
30 import jenkins.model.Jenkins;
31 import net.sf.json.JSONObject;
32 import org.jenkinsci.plugins.darcs.browsers.DarcsRepositoryBrowser;
33 import org.kohsuke.stapler.QueryParameter;
34 import org.kohsuke.stapler.StaplerRequest;
35 import org.kohsuke.stapler.framework.io.ByteBuffer;
36
37
38
39
40
41
42
43
44 @Extension
45 public class DarcsScmDescriptor extends SCMDescriptor<DarcsScm> {
46
47
48
49
50 private static final Logger LOGGER = Logger.getLogger(DarcsScmDescriptor.class.getName());
51
52
53
54 private static final String DISPLAY_NAME = "Darcs";
55
56
57
58 private static final String DEFAULT_EXE = "darcs";
59
60
61
62
63
64 private String darcsExe;
65
66
67
68
69 public DarcsScmDescriptor() {
70 super(DarcsScm.class, DarcsRepositoryBrowser.class);
71 load();
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 @Override
90 public void load() {
91 final XmlFile file = new XmlFile(Jenkins.XSTREAM2,
92 new File(Jenkins.getInstance().getRootDir(), getId() + ".xml"));
93 if (!file.exists()) {
94 return;
95 }
96
97 try {
98 file.unmarshal(this);
99 } catch (IOException e) {
100 LOGGER.log(Level.WARNING, "Failed to load " + file, e);
101 }
102
103 final Class<? extends RepositoryBrowser> rb = repositoryBrowser;
104 if (repositoryBrowser != rb) {
105 try {
106 final Field f = SCMDescriptor.class.getDeclaredField("repositoryBrowser");
107 f.setAccessible(true);
108 f.set(this, rb);
109 } catch (NoSuchFieldException e) {
110 LOGGER.log(WARNING, "Failed to overwrite the repositoryBrowser field", e);
111 } catch (IllegalAccessException e) {
112 LOGGER.log(WARNING, "Failed to overwrite the repositoryBrowser field", e);
113 }
114 }
115 }
116
117
118
119
120
121
122 public String getDisplayName() {
123 return DISPLAY_NAME;
124 }
125
126
127
128
129
130
131 public String getDarcsExe() {
132 return null == darcsExe
133 ? DEFAULT_EXE
134 : darcsExe;
135 }
136
137 @Override
138 public SCM newInstance(StaplerRequest req, JSONObject formData) throws FormException {
139 return super.newInstance(req, formData);
140 }
141
142 @Override
143 public boolean configure(final StaplerRequest req, final JSONObject formData) throws FormException {
144 darcsExe = Util.fixEmpty(req.getParameter("darcs.darcsExe").trim());
145 save();
146
147 return true;
148 }
149
150
151
152
153
154
155
156 public FormValidation doDarcsExeCheck(@QueryParameter final String value) {
157 return FormValidation.validateExecutable(value, new FormValidation.FileValidator() {
158 @Override
159 public FormValidation validate(final File exe) {
160 try {
161 final Launcher launcher = Hudson.getInstance().createLauncher(TaskListener.NULL);
162 final Launcher.ProcStarter proc = launcher.launch()
163 .cmds(exe, "--version")
164 .stdout(new ByteBuffer());
165
166 if (proc.join() == 0) {
167 return FormValidation.ok();
168 } else {
169 return FormValidation.warning("Could not locate the executable in path");
170 }
171 } catch (IOException e) {
172
173 LOGGER.log(Level.WARNING, e.toString());
174 } catch (InterruptedException e) {
175
176 LOGGER.log(Level.WARNING, e.toString());
177 }
178
179 return FormValidation.error("Unable to check darcs version");
180 }
181 });
182 }
183 }