Merge branch 'sg/completion-worktree'
[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                 }
50         }
51 }
52
53 static void unpack_sideband(void)
54 {
55         struct packet_reader reader;
56         packet_reader_init(&reader, 0, NULL, 0,
57                            PACKET_READ_GENTLE_ON_EOF |
58                            PACKET_READ_CHOMP_NEWLINE);
59
60         while (packet_reader_read(&reader) != PACKET_READ_EOF) {
61                 int band;
62                 int fd;
63
64                 switch (reader.status) {
65                 case PACKET_READ_EOF:
66                         break;
67                 case PACKET_READ_NORMAL:
68                         band = reader.line[0] & 0xff;
69                         if (band < 1 || band > 2)
70                                 die("unexpected side band %d", band);
71                         fd = band;
72
73                         write_or_die(fd, reader.line + 1, reader.pktlen - 1);
74                         break;
75                 case PACKET_READ_FLUSH:
76                         return;
77                 case PACKET_READ_DELIM:
78                         break;
79                 }
80         }
81 }
82
83 int cmd__pkt_line(int argc, const char **argv)
84 {
85         if (argc < 2)
86                 die("too few arguments");
87
88         if (!strcmp(argv[1], "pack"))
89                 pack(argc - 2, argv + 2);
90         else if (!strcmp(argv[1], "unpack"))
91                 unpack();
92         else if (!strcmp(argv[1], "unpack-sideband"))
93                 unpack_sideband();
94         else
95                 die("invalid argument '%s'", argv[1]);
96
97         return 0;
98 }