Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
Joe Mou committed Apr 12, 2019
1 parent 589de4c commit 37a02fd
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions add
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/python

# update-index.c:add_file_to_cache
import struct
import subprocess
import sys

# TODO write in C? do all macs have gcc?
# TODO if cache doesn't exist?
index = open('.zit/index').read()
assert index[0:4] == 'DIRC'
assert struct.unpack('>I', index[4:8]) == (2,)
num_entries, = struct.unpack('>I', index[8:12])
entries = []
i = 12
for _ in range(num_entries):
# ignore inode heuristics, file/symlink bit, permissions
i += 40
sha1 = index[i:i+20].encode('hex')
# just use NUL-terminated?
name_length = struct.unpack('>H', index[i+20:i+22])[0] & 0xfff
name = index[i+22:i+22+name_length]
i += (22 + name_length + 8) / 8 * 8
entries.append((name, sha1))

_, filename = sys.argv
# TODO handle deleted files?
sha1 = subprocess.check_output(['./hash-object', 'blob', filename]).strip()
# TODO canonicalize filename?
entries.append((filename, sha1))
entries.sort()

f = open('.zit/index', 'w')
f.write('DIRC')
f.write(struct.pack('>II', 2, len(entries)))
for filename, sha1 in entries:
f.write('\0' * 24)
f.write(struct.pack('>I', 0b1000000110100100)) # file 644
f.write('\0' * 12)
f.write(bytearray.fromhex(sha1))
f.write(struct.pack('>H', len(filename)))
f.write(filename)
f.write('\0' * (8 - (len(filename) + 6) % 8))

0 comments on commit 37a02fd

Please sign in to comment.