683 ACTION_MASK = int("111" "00", 2) |
683 ACTION_MASK = int("111" "00", 2) |
684 # note: untouched file used as copy source will as `000` for this mask. |
684 # note: untouched file used as copy source will as `000` for this mask. |
685 ADDED_FLAG = int("001" "00", 2) |
685 ADDED_FLAG = int("001" "00", 2) |
686 MERGED_FLAG = int("010" "00", 2) |
686 MERGED_FLAG = int("010" "00", 2) |
687 REMOVED_FLAG = int("011" "00", 2) |
687 REMOVED_FLAG = int("011" "00", 2) |
688 # `100` is reserved for future use |
688 SALVAGED_FLAG = int("100" "00", 2) |
689 TOUCHED_FLAG = int("101" "00", 2) |
689 TOUCHED_FLAG = int("101" "00", 2) |
690 |
690 |
691 COPIED_MASK = int("11", 2) |
691 COPIED_MASK = int("11", 2) |
692 COPIED_FROM_P1_FLAG = int("10", 2) |
692 COPIED_FROM_P1_FLAG = int("10", 2) |
693 COPIED_FROM_P2_FLAG = int("11", 2) |
693 COPIED_FROM_P2_FLAG = int("11", 2) |
696 INDEX_HEADER = struct.Struct(">L") |
696 INDEX_HEADER = struct.Struct(">L") |
697 INDEX_ENTRY = struct.Struct(">bLL") |
697 INDEX_ENTRY = struct.Struct(">bLL") |
698 |
698 |
699 |
699 |
700 def encode_files_sidedata(files): |
700 def encode_files_sidedata(files): |
701 all_files = set(files.touched - files.salvaged) |
701 all_files = set(files.touched) |
702 all_files.update(files.copied_from_p1.values()) |
702 all_files.update(files.copied_from_p1.values()) |
703 all_files.update(files.copied_from_p2.values()) |
703 all_files.update(files.copied_from_p2.values()) |
704 all_files = sorted(all_files) |
704 all_files = sorted(all_files) |
705 file_idx = {f: i for (i, f) in enumerate(all_files)} |
705 file_idx = {f: i for (i, f) in enumerate(all_files)} |
706 file_idx[None] = 0 |
706 file_idx[None] = 0 |
716 flag |= ADDED_FLAG |
716 flag |= ADDED_FLAG |
717 elif f in files.merged: |
717 elif f in files.merged: |
718 flag |= MERGED_FLAG |
718 flag |= MERGED_FLAG |
719 elif f in files.removed: |
719 elif f in files.removed: |
720 flag |= REMOVED_FLAG |
720 flag |= REMOVED_FLAG |
|
721 elif f in files.salvaged: |
|
722 flag |= SALVAGED_FLAG |
721 elif f in files.touched: |
723 elif f in files.touched: |
722 flag |= TOUCHED_FLAG |
724 flag |= TOUCHED_FLAG |
723 |
725 |
724 copy = None |
726 copy = None |
725 if f in files.copied_from_p1: |
727 if f in files.copied_from_p1: |
766 md.mark_added(filename) |
768 md.mark_added(filename) |
767 elif flag & ACTION_MASK == MERGED_FLAG: |
769 elif flag & ACTION_MASK == MERGED_FLAG: |
768 md.mark_merged(filename) |
770 md.mark_merged(filename) |
769 elif flag & ACTION_MASK == REMOVED_FLAG: |
771 elif flag & ACTION_MASK == REMOVED_FLAG: |
770 md.mark_removed(filename) |
772 md.mark_removed(filename) |
|
773 elif flag & ACTION_MASK == SALVAGED_FLAG: |
|
774 md.mark_salvaged(filename) |
771 elif flag & ACTION_MASK == TOUCHED_FLAG: |
775 elif flag & ACTION_MASK == TOUCHED_FLAG: |
772 md.mark_touched(filename) |
776 md.mark_touched(filename) |
773 |
777 |
774 copied = None |
778 copied = None |
775 if flag & COPIED_MASK == COPIED_FROM_P1_FLAG: |
779 if flag & COPIED_MASK == COPIED_FROM_P1_FLAG: |