t / helper / test-pkt-line.con commit Merge branch 'so/cherry-pick-always-allow-m1' (77fbd96)
   1#include "cache.h"
   2#include "test-tool.h"
   3#include "pkt-line.h"
   4
   5static 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
  15static 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
  29static 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
  53static 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
  83int 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}