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 package org.eclipse.jgit.http.test;
45
46 import static org.junit.Assert.assertEquals;
47 import static org.junit.Assert.assertNotNull;
48 import static org.junit.Assert.assertTrue;
49
50 import java.io.ByteArrayOutputStream;
51 import java.io.OutputStream;
52 import java.util.Collection;
53 import java.util.Collections;
54 import java.util.List;
55
56 import javax.servlet.http.HttpServletRequest;
57
58 import org.eclipse.jetty.servlet.ServletContextHandler;
59 import org.eclipse.jetty.servlet.ServletHolder;
60 import org.eclipse.jgit.errors.RepositoryNotFoundException;
61 import org.eclipse.jgit.http.server.GitServlet;
62 import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
63 import org.eclipse.jgit.junit.TestRepository;
64 import org.eclipse.jgit.junit.http.AccessEvent;
65 import org.eclipse.jgit.junit.http.HttpTestCase;
66 import org.eclipse.jgit.lib.Constants;
67 import org.eclipse.jgit.lib.NullProgressMonitor;
68 import org.eclipse.jgit.lib.ObjectId;
69 import org.eclipse.jgit.lib.Repository;
70 import org.eclipse.jgit.lib.StoredConfig;
71 import org.eclipse.jgit.revwalk.RevBlob;
72 import org.eclipse.jgit.revwalk.RevCommit;
73 import org.eclipse.jgit.transport.PreReceiveHook;
74 import org.eclipse.jgit.transport.PushResult;
75 import org.eclipse.jgit.transport.ReceiveCommand;
76 import org.eclipse.jgit.transport.ReceivePack;
77 import org.eclipse.jgit.transport.RemoteRefUpdate;
78 import org.eclipse.jgit.transport.Transport;
79 import org.eclipse.jgit.transport.URIish;
80 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
81 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
82 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
83 import org.junit.Before;
84 import org.junit.Test;
85
86 public class HookMessageTest extends HttpTestCase {
87 private Repository remoteRepository;
88
89 private URIish remoteURI;
90
91 @Override
92 @Before
93 public void setUp() throws Exception {
94 super.setUp();
95
96 final TestRepository<Repository> src = createTestRepository();
97 final String srcName = src.getRepository().getDirectory().getName();
98
99 ServletContextHandler app = server.addContext("/git");
100 GitServlet gs = new GitServlet();
101 gs.setRepositoryResolver(new RepositoryResolver<HttpServletRequest>() {
102 @Override
103 public Repository open(HttpServletRequest req, String name)
104 throws RepositoryNotFoundException,
105 ServiceNotEnabledException {
106 if (!name.equals(srcName))
107 throw new RepositoryNotFoundException(name);
108
109 final Repository db = src.getRepository();
110 db.incrementOpen();
111 return db;
112 }
113 });
114 gs.setReceivePackFactory(new DefaultReceivePackFactory() {
115 @Override
116 public ReceivePack create(HttpServletRequest req, Repository db)
117 throws ServiceNotEnabledException,
118 ServiceNotAuthorizedException {
119 ReceivePack recv = super.create(req, db);
120 recv.setPreReceiveHook(new PreReceiveHook() {
121 @Override
122 public void onPreReceive(ReceivePack rp,
123 Collection<ReceiveCommand> commands) {
124 rp.sendMessage("message line 1");
125 rp.sendError("no soup for you!");
126 rp.sendMessage("come back next year!");
127 }
128 });
129 return recv;
130 }
131
132 });
133 app.addServlet(new ServletHolder(gs), "/*");
134
135 server.setUp();
136
137 remoteRepository = src.getRepository();
138 remoteURI = toURIish(app, srcName);
139
140 StoredConfig cfg = remoteRepository.getConfig();
141 cfg.setBoolean("http", null, "receivepack", true);
142 cfg.save();
143 }
144
145 @Test
146 public void testPush_CreateBranch() throws Exception {
147 final TestRepository src = createTestRepository();
148 final RevBlob Q_txt = src.blob("new text");
149 final RevCommit Q = src.commit().add("Q", Q_txt).create();
150 final Repository db = src.getRepository();
151 final String dstName = Constants.R_HEADS + "new.branch";
152 Transport t;
153 PushResult result;
154
155 t = Transport.open(db, remoteURI);
156 try {
157 final String srcExpr = Q.name();
158 final boolean forceUpdate = false;
159 final String localName = null;
160 final ObjectId oldId = null;
161
162 RemoteRefUpdate update = new RemoteRefUpdate(src.getRepository(),
163 srcExpr, dstName, forceUpdate, localName, oldId);
164 result = t.push(NullProgressMonitor.INSTANCE, Collections
165 .singleton(update));
166 } finally {
167 t.close();
168 }
169
170 assertTrue(remoteRepository.hasObject(Q_txt));
171 assertNotNull("has " + dstName, remoteRepository.exactRef(dstName));
172 assertEquals(Q, remoteRepository.exactRef(dstName).getObjectId());
173 fsck(remoteRepository, Q);
174
175 List<AccessEvent> requests = getRequests();
176 assertEquals(2, requests.size());
177
178 AccessEvent service = requests.get(1);
179 assertEquals("POST", service.getMethod());
180 assertEquals(join(remoteURI, "git-receive-pack"), service.getPath());
181 assertEquals(200, service.getStatus());
182
183 assertEquals("message line 1\n"
184 + "error: no soup for you!\n"
185 + "come back next year!\n",
186 result.getMessages());
187 }
188
189 @Test
190 public void testPush_HookMessagesToOutputStream() throws Exception {
191 final TestRepository src = createTestRepository();
192 final RevBlob Q_txt = src.blob("new text");
193 final RevCommit Q = src.commit().add("Q", Q_txt).create();
194 final Repository db = src.getRepository();
195 final String dstName = Constants.R_HEADS + "new.branch";
196 Transport t;
197 PushResult result;
198
199 t = Transport.open(db, remoteURI);
200 OutputStream out = new ByteArrayOutputStream();
201 try {
202 final String srcExpr = Q.name();
203 final boolean forceUpdate = false;
204 final String localName = null;
205 final ObjectId oldId = null;
206
207 RemoteRefUpdate update = new RemoteRefUpdate(src.getRepository(),
208 srcExpr, dstName, forceUpdate, localName, oldId);
209 result = t.push(NullProgressMonitor.INSTANCE,
210 Collections.singleton(update), out);
211 } finally {
212 t.close();
213 }
214
215 String expectedMessage = "message line 1\n"
216 + "error: no soup for you!\n"
217 + "come back next year!\n";
218 assertEquals(expectedMessage,
219 result.getMessages());
220
221 assertEquals(expectedMessage, out.toString());
222 }
223
224 }