change: decode and print file moves

laumann
Jun 26, 2023, 8:47 PM
NEORNIZEGPZAVZV2J6TTCWPZAQM3N7MH7SMS3NDT4WKTXI34NSUAC

Dependencies

  • [2] JVU3TTT5 all: switch away from typedefing anonymous structs
  • [3] TGT4VSME change: decode FILE_ADD
  • [*] JAGXXSR7 change: initial work on decoding hunks
  • [*] Q7TKZCJP Add initial support for reading the offsets from a (fixed) change
  • [*] FMYCPGKD change: extract hash list decoding into reused function
  • [*] XTVLIC24 change: refactor to print_change()

Change contents

  • edit in hunk.h at line 81
    [2.1166]
    [2.1166]
    };
    struct filemetadata {
    /*
    * metadata - DIR_BIT = 0x200, unix permissions are in
    * 0x1ff. See libpijul/src/pristine/inode_metadata
    */
    uint16_t inodemetadata;
    str basename;
    str encoding; /* Optional<Encoding> */
  • edit in change.c at line 335
    [7.593]
    [7.593]
    case FILE_MOVE:
    change_decode_atom(binstat, &bhunk->filemove.del);
    change_decode_atom(binstat, &bhunk->filemove.add);
    slen = bincode_getu64(binstat);
    bhunk->filemove.path = bincode_getstr(binstat, slen);
    break;
  • edit in change.c at line 558
    [8.253]
    [8.253]
    /**
    * decode a filemetadata struct from the given contents - the input
    * (contents) are also bincoded, so we need to deserialize it
    */
    static void
    read_filemetadata(struct filemetadata *m, uint8_t *contents, size_t contents_len)
    {
    size_t len;
    struct bincode bc = { .avail = contents_len, .buf = contents };
    m->inodemetadata = bincode_getu16(&bc);
    len = bincode_getu64(&bc);
    m->basename = bincode_getstr(&bc, len);
    if (bincode_getu8(&bc)) {
    len = bincode_getu64(&bc);
    m->encoding = bincode_getstr(&bc, len);
    }
    }
  • edit in change.c at line 653
    [3.1193]
    [8.1789]
    case FILE_MOVE: {
    /* read filemetadata from contents */
    struct filemove *f = &hunk->filemove;
    struct filemetadata metadata = { 0 };
    uint64_t start, end;
    start = f->add.newvertex.start;
    end = f->add.newvertex.end;
    read_filemetadata(
    &metadata, &contents[start], end - start
    );
    printf(" %s -> %s\n", f->path, metadata.basename);
    free(metadata.basename);
    if (metadata.encoding)
    free(metadata.encoding);
    break;
    }