Merge remote-tracking branch 'paulus/master' into pm/gitk-update
[git] / t / helper / test-pkt-line.c
1 #include "cache.h"
2 #include "test-tool.h"
3 #include "pkt-line.h"
4
5 static void pack_line(const char *line)
6 {
7         if (!strcmp(line, "0000") || !strcmp(line, "0000\n"))
8                 packet_flush(1);
9         else if (!strcmp(line, "0001") || !strcmp(line, "0001\n"))
10                 packet_delim(1);
11         else
12                 packet_write_fmt(1, "%s", line);
13 }
14
15 static void pack(int argc, const char **argv)
16 {
17         if (argc) { /* read from argv */
18                 int i;
19                 for (i = 0; i < argc; i++)
20                         pack_line(argv[i]);
21         } else { /* read from stdin */
22                 char line[LARGE_PACKET_MAX];
23                 while (fgets(line, sizeof(line), stdin)) {
24                         pack_line(line);
25                 }
26         }
27 }
28
29 static void unpack(void)
30 {
31         struct packet_reader reader;
32         packet_reader_init(&reader, 0, NULL, 0,
33                            PACKET_READ_GENTLE_ON_EOF |
34                            PACKET_READ_CHOMP_NEWLINE);
35
36         while (packet_reader_read(&reader) != PACKET_READ_EOF) {
37                 switch (reader.status) {
38                 case PACKET_READ_EOF:
39                         break;
40                 case PACKET_READ_NORMAL:
41                         printf("%s\n", reader.line);
42                         break;
43                 case PACKET_READ_FLUSH:
44                         printf("0000\n");
45                         break;
46                 case PACKET_READ_DELIM:
47                         printf("0001\n");
48                         break;
49                 case PACKET_READ_RESPONSE_END:
50                         printf("0002\n");
51                         break;
52                 }
53         }
54 }
55
56 static void unpack_sideband(void)
57 {
58         struct packet_reader reader;
59         packet_reader_init(&reader, 0, NULL, 0,
60                            PACKET_READ_GENTLE_ON_EOF |
61                            PACKET_READ_CHOMP_NEWLINE);
62
63         while (packet_reader_read(&reader) != PACKET_READ_EOF) {
64                 int band;
65                 int fd;
66
67                 switch (reader.status) {
68                 case PACKET_READ_EOF:
69                         break;
70                 case PACKET_READ_NORMAL:
71                         band = reader.line[0] & 0xff;
72                         if (band < 1 || band > 2)
73                                 continue; /* skip non-sideband packets */
74                         fd = band;
75
76                         write_or_die(fd, reader.line + 1, reader.pktlen - 1);
77                         break;
78                 case PACKET_READ_FLUSH:
79                         return;
80                 case PACKET_READ_DELIM:
81                 case PACKET_READ_RESPONSE_END:
82                         break;
83                 }
84         }
85 }
86
87 int cmd__pkt_line(int argc, const char **argv)
88 {
89         if (argc < 2)
90                 die("too few arguments");
91
92         if (!strcmp(argv[1], "pack"))
93                 pack(argc - 2, argv + 2);
94         else if (!strcmp(argv[1], "unpack"))
95                 unpack();
96         else if (!strcmp(argv[1], "unpack-sideband"))
97                 unpack_sideband();
98         else
99                 die("invalid argument '%s'", argv[1]);
100
101         return 0;
102 }