141
return 0;
142
}
143
144
+static int feed_msg_to_hook(int fd, const char *fmt, ...)
145
+{
146
+ int cnt;
147
+ char buf[1024];
148
+ va_list params;
149
+
150
+ va_start(params, fmt);
151
+ cnt = vsprintf(buf, fmt, params);
152
+ va_end(params);
153
+ return write_in_full(fd, buf, cnt) != cnt;
154
+}
155
+
156
+static int feed_obj_to_hook(const char *label, struct object_array *oa, int i, int fd)
157
+{
158
+ return feed_msg_to_hook(fd, "%s %s\n", label,
159
+ sha1_to_hex(oa->objects[i].item->sha1));
160
+}
161
+
162
+static int run_post_upload_pack_hook(size_t total, struct timeval *tv)
163
+{
164
+ const char *argv[2];
165
+ struct child_process proc;
166
+ int err, i;
167
+
168
+ argv[0] = "hooks/post-upload-pack";
169
+ argv[1] = NULL;
170
+
171
+ if (access(argv[0], X_OK) < 0)
172
+ return 0;
173
+
174
+ memset(&proc, 0, sizeof(proc));
175
+ proc.argv = argv;
176
+ proc.in = -1;
177
+ proc.stdout_to_stderr = 1;
178
+ err = start_command(&proc);
179
+ if (err)
180
+ return err;
181
+ for (i = 0; !err && i < want_obj.nr; i++)
182
+ err |= feed_obj_to_hook("want", &want_obj, i, proc.in);
183
+ for (i = 0; !err && i < have_obj.nr; i++)
184
+ err |= feed_obj_to_hook("have", &have_obj, i, proc.in);
185
+ if (!err)
186
+ err |= feed_msg_to_hook(proc.in, "time %ld.%06ld\n",
187
+ (long)tv->tv_sec, (long)tv->tv_usec);
188
+ if (!err)
189
+ err |= feed_msg_to_hook(proc.in, "size %ld\n", (long)total);
190
+ if (close(proc.in))
191
+ err = 1;
192
+ if (finish_command(&proc))
193
+ err = 1;
194
+ return err;
195
+}
196
+
197
static void create_pack_file(void)
198
{
199
+ struct timeval start_tv, tv;
200
struct async rev_list;
201
struct child_process pack_objects;
202
int create_full_pack = (nr_our_refs == want_obj.nr && !have_obj.nr);
204
char abort_msg[] = "aborting due to possible repository "
205
"corruption on the remote side.";
206
int buffered = -1;
153
- ssize_t sz;
207
+ ssize_t sz, total_sz;
208
const char *argv[10];
209
int arg = 0;
210
211
+ gettimeofday(&start_tv, NULL);
212
+ total_sz = 0;
213
if (shallow_nr) {
214
rev_list.proc = do_rev_list;
215
rev_list.data = 0;
318
sz = xread(pack_objects.out, cp,
319
sizeof(data) - outsz);
320
if (0 < sz)
265
- ;
321
+ total_sz += sz;
322
else if (sz == 0) {
323
close(pack_objects.out);
324
pack_objects.out = -1;
370
}
371
if (use_sideband)
372
packet_flush(1);
373
+
374
+ gettimeofday(&tv, NULL);
375
+ tv.tv_sec -= start_tv.tv_sec;
376
+ if (tv.tv_usec < start_tv.tv_usec) {
377
+ tv.tv_sec--;
378
+ tv.tv_usec += 1000000;
379
+ }
380
+ tv.tv_usec -= start_tv.tv_usec;
381
+ if (run_post_upload_pack_hook(total_sz, &tv))
382
+ warning("post-upload-hook failed");
383
return;
384
385
fail: