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 package com.aragost.javahg.internals;
27
28 import java.io.ByteArrayInputStream;
29 import java.io.ByteArrayOutputStream;
30 import java.io.IOException;
31 import java.util.Collections;
32 import java.util.List;
33
34 import com.aragost.javahg.Changeset;
35 import com.aragost.javahg.Repository;
36 import com.aragost.javahg.commands.ExecutionException;
37 import com.aragost.javahg.commands.LogCommand;
38 import com.google.common.collect.Lists;
39 import com.google.common.io.ByteStreams;
40
41 public class PullPushHelper {
42
43 private static final byte[] BEGIN = "list of changesets:\n".getBytes();
44 private static final byte[] BEGIN_FALLBACK = "adding changesets\n"
45 .getBytes();
46 private static final byte[] LINE_BEGIN = "add changeset ".getBytes();
47 private static final byte[] REMOTE_ERROR = "remote: error: ".getBytes();
48
49 public static List<Changeset> parseStream(AbstractCommand command,
50 HgInputStream stream) throws IOException {
51 Repository repo = command.getRepository();
52 List<Changeset> result;
53
54
55
56
57
58
59
60
61
62 ByteArrayOutputStream bos = new ByteArrayOutputStream();
63 ByteStreams.copy(stream, bos);
64 stream.consumeAll();
65 stream = new HgInputStream(new ByteArrayInputStream(bos.toByteArray()), repo.newDecoder());
66
67 if (stream.find(BEGIN)) {
68 result = Lists.newArrayList();
69 while (!stream.isEof() && !stream.match(BEGIN_FALLBACK)) {
70 result.add(repo.changeset(stream.textUpTo('\n')));
71 }
72 } else {
73 stream = new HgInputStream(new ByteArrayInputStream(bos.toByteArray()), repo.newDecoder());
74
75 List<String> nodePrefixes = Lists.newArrayList();
76
77 if (stream.find(BEGIN_FALLBACK)) {
78 if (stream.find(LINE_BEGIN)) {
79
80 nodePrefixes.add(stream.textUpTo('\n'));
81 }
82 }
83 if (nodePrefixes.isEmpty()) {
84 result = Collections.emptyList();
85 } else {
86 result = LogCommand
87 .on(repo)
88 .rev(nodePrefixes.toArray(new String[nodePrefixes
89 .size()])).execute();
90 }
91 }
92
93 stream = new HgInputStream(new ByteArrayInputStream(bos.toByteArray()), repo.newDecoder());
94
95 if (stream.find(REMOTE_ERROR)) {
96 throw new ExecutionException(command, stream.textUpTo('\n'));
97 }
98
99 return result;
100 }
101 }