1 import os, errno, zlib, time, sha, subprocess
7 header = '%s %d\0' % (type, len(s))
14 dir = '.git/objects/%s' % hex[0:2]
15 fn = '%s/%s' % (dir, hex[2:])
16 if not os.path.exists(fn):
17 #log('creating %s' % fn)
21 if e.errno != errno.EEXIST:
23 tfn = '%s.%d' % (fn, os.getpid())
25 z = zlib.compressobj(1)
26 f.write(z.compress(header))
27 f.write(z.compress(s))
32 #log('exists %s' % fn)
39 return hash_raw('blob', blob)
42 def gen_tree(shalist):
43 shalist = sorted(shalist, key = lambda x: x[1])
44 l = ['%s %s\0%s' % (mode,name,hex.decode('hex'))
45 for (mode,name,hex) in shalist]
46 return hash_raw('tree', ''.join(l))
50 return time.strftime('%s %z', time.localtime(date))
54 os.environ['GIT_DIR'] = os.path.abspath(repo)
57 def _read_ref(repo, refname):
58 p = subprocess.Popen(['git', 'show-ref', '--', refname],
59 preexec_fn = lambda: _gitenv(repo),
60 stdout = subprocess.PIPE)
61 out = p.stdout.read().strip()
69 def _update_ref(repo, refname, newval, oldval):
72 p = subprocess.Popen(['git', 'update-ref', '--', refname, newval, oldval],
73 preexec_fn = lambda: _gitenv(repo))
78 def gen_commit(tree, parent, author, adate, committer, cdate, msg):
80 if tree: l.append('tree %s' % tree)
81 if parent: l.append('parent %s' % parent)
82 if author: l.append('author %s %s' % (author, _git_date(adate)))
83 if committer: l.append('committer %s %s' % (committer, _git_date(cdate)))
86 return hash_raw('commit', '\n'.join(l))
89 def gen_commit_easy(ref, tree, msg):
91 userline = '%s <%s@%s>' % (userfullname(), username(), hostname())
92 oldref = ref and _read_ref('.git', ref) or None
93 commit = gen_commit(tree, oldref, userline, now, userline, now, msg)
95 _update_ref('.git', ref, commit, oldref)