Skip to content

Commit f55a29f

Browse files
committed
init continued
1 parent e55aff0 commit f55a29f

2 files changed

Lines changed: 25 additions & 36 deletions

File tree

git-incrypt

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -144,19 +144,26 @@ class CryptRepo:
144144
plugin.globalinit(clearname.encode('utf-8'), url.encode('utf-8'))
145145
if init:
146146
plugin.initbare(clearname.encode('utf-8'))
147-
template = plugin.mktemplate(
147+
plugin.mktemplate(
148148
init.name.encode('utf-8') if init.name else None,
149149
init.email.encode('utf-8') if init.email else None,
150150
init.date.encode('utf-8') if init.date else None,
151151
'\n\n'.join(init.m).encode('utf-8') if init.m else None)
152+
plugin.metainit()
153+
# params: init.keys, 'refs/heads/master'
154+
output = ctypes.create_string_buffer(41)
155+
poutput = ctypes.c_char_p(ctypes.addressof(output))
156+
plugin.writemeta(poutput)
152157
self.repo = pygit2.Repository('.')
153-
self.meta = MetaData(self.repo).init(
154-
init.keys, template, 'refs/heads/master')
158+
blubs = self.repo.get(output.value.decode('utf-8')).id
159+
self.repo.create_reference(
160+
plugin.getprefix().decode('utf-8') + '1/_', blubs, force=True)
161+
self.meta = MetaData(self.repo)
155162
self.trust(force=True, sign=True)
156163
else:
157164
self.repo = pygit2.Repository('.')
158165
plugin.fetchpattern('_'.encode('utf-8')[0])
159-
self.meta = MetaData(self.repo).read()
166+
self.meta = MetaData(self.repo)
160167
if forcetrust:
161168
self.trust(force=forcetrust)
162169

@@ -257,8 +264,8 @@ class CryptRepo:
257264
cryptmap, cwd=self.repo.path),
258265
decryptobject)
259266
for r in refs:
260-
self.repo.create_reference(
261-
r[1], decryptdata(r[2].tree['0'].read_raw())[0:20].hex(), force=True)
267+
self.repo.create_reference(r[1], decryptdata(
268+
r[2].tree['0'].read_raw())[0:20].hex(), force=True)
262269
expected = [r[1] for r in refs]
263270
result = [['HEAD', f'@{self.meta.defaultbranch}']]
264271
for r in self.repo.references:
@@ -434,42 +441,14 @@ class MetaData:
434441
self.template = None
435442
self.defaultbranch = None
436443
self.gpgkeys = []
444+
self.read()
437445

438446
def _gpg(self, args, inp):
439447
'run gpg'
440448
return subprocess.check_output(
441449
[f'gpg@incrypt::{plugin.geturl().decode("utf-8")}'] + args,
442450
executable='gpg', input=inp)
443451

444-
def init(self, gpgkeys, template, defaultbranch):
445-
'initialize the metadata'
446-
self.files = {}
447-
plugin.metainit()
448-
output = ctypes.create_string_buffer(41)
449-
poutput = ctypes.c_char_p(ctypes.addressof(output))
450-
plugin.writemeta(poutput)
451-
blubs = self.repo.get(output.value.decode('utf-8')).id
452-
self.files['ver'] = self.repo.create_blob(MetaData.VER)
453-
self.key = ctypes.string_at(plugin.getcryptkey(), 48) # os.urandom(48)
454-
keyhashbase = MetaData.KEYVER + b'\x00' + self.key
455-
self.keyhash = sha1hex(keyhashbase)
456-
cryptedkey = self._gpg(
457-
['-q', '-e'] + ['-r' + k for k in gpgkeys], keyhashbase)
458-
self.files['key'] = self.repo.create_blob(cryptedkey)
459-
self.files['sig'] = self.repo.TreeBuilder().write()
460-
self.template = template
461-
self.files['msg'] = self.repo.create_blob(encryptdata(
462-
sha1(template) + template))
463-
self.defaultbranch = defaultbranch
464-
encodedbranch = defaultbranch.encode('utf-8')
465-
self.files['def'] = self.repo.create_blob(encryptdata(
466-
sha1(encodedbranch) + encodedbranch))
467-
# self.write()
468-
commit = self.secretcommit(blubs, [])
469-
self.repo.create_reference(
470-
plugin.getprefix().decode('utf-8') + '1/_', commit, force=True)
471-
return self
472-
473452
def addkey(self, gpgkeys):
474453
'add gpg key'
475454
self.gpgkeys += gpgkeys

incrypt-plugin.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,16 @@ void metainit(void) {
434434
free(defaultbranchencrypted);
435435
}
436436

437+
static void secretcommit(struct object_id* tid, struct object_id* oid) {
438+
struct strbuf commit = STRBUF_INIT;
439+
strbuf_addf(&commit, "tree %s\n", oid_to_hex(tid));
440+
strbuf_add(&commit, template.buf, template.len);
441+
odb_write_object(the_repository->objects, commit.buf, commit.len, OBJ_COMMIT, oid);
442+
strbuf_release(&commit);
443+
}
444+
437445
char* writemeta(char* output) {
446+
struct object_id oid;
438447
struct object_id tid;
439448
struct strbuf tb = STRBUF_INIT;
440449
struct strbuf map = STRBUF_INIT;
@@ -467,7 +476,8 @@ char* writemeta(char* output) {
467476
strbuf_add(&tb, obj_ver.hash, the_hash_algo->rawsz);
468477
odb_write_object(the_repository->objects, tb.buf, tb.len, OBJ_TREE, &tid);
469478
strbuf_release(&tb);
470-
memcpy(output, oid_to_hex(&tid), 41);
479+
secretcommit(&tid, &oid);
480+
memcpy(output, oid_to_hex(&oid), 41);
471481
return output;
472482
}
473483

0 commit comments

Comments
 (0)