-
Notifications
You must be signed in to change notification settings - Fork 0
/
repo_import.py
60 lines (40 loc) · 1.1 KB
/
repo_import.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/python
import git
import __builtin__
import imp
real_import = __builtin__.__import__
repo = git.Repo('.')
global dtree
dtree = repo.commit('4ee2add').tree
def walk_repo(tree, name, fromlist, lname = None):
if not name:
lookfor = '__init__'
else:
lookfor = name[0]
for k in tree.blobs:
if k.name.split(".")[0] == lookfor:
if lookfor == '__init__':
lookfor = lname
m = imp.new_module(lookfor)
global dtree
tmp, dtree = dtree, tree
exec k.data_stream.read() in m.__dict__
dtree = tmp
return m
for k in tree.trees:
if k.name == lookfor:
return walk_repo(k, name[1:], fromlist, lookfor)
def import_from_repo(*args):
name = args[0]
fromlist = args[2]
global dtree
result = walk_repo(dtree, name.split("."), fromlist)
if result:
return result
return real_import(*args)
__builtin__.__import__ = import_from_repo
import foo
foo.bar()
dtree = repo.commit('40bf5f7').tree
import foo
foo.bar()