multigource.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env python3
  2. from argparse import ArgumentParser,Namespace
  3. import re
  4. STMT_CREATE='''
  5. CREATE TABLE IF NOT EXISTS gourcelog (
  6. time DATETIME NOT NULL,
  7. user text,
  8. action text,
  9. path text
  10. );
  11. '''
  12. STMT_INSERT='''
  13. INSERT INTO gourcelog VALUES (@time,@user,@action,@path)
  14. '''
  15. STMT_SELECT='''
  16. SELECT time,user,action,path FROM gourcelog ORDER BY time ASC
  17. '''
  18. def main():
  19. p = parser()
  20. args = p.parse_args()
  21. import sys
  22. sys.exit(args.func(args) or 0)
  23. def parser():
  24. p = ArgumentParser()
  25. p.set_defaults(func=lambda x: p.print_help())
  26. sub = p.add_subparsers()
  27. p_render = sub.add_parser('render')
  28. p_render.set_defaults(func=render)
  29. p_render.add_argument('--gource', default='gource')
  30. p_join = sub.add_parser('gitjoin')
  31. p_join.set_defaults(func=gitjoin)
  32. p_join.add_argument('source')
  33. p_join.add_argument('output')
  34. p_join.add_argument('-p','--prefix')
  35. return p
  36. def gitjoin(args: Namespace):
  37. print(args)
  38. import os
  39. import subprocess
  40. import sqlite3
  41. GIT_CMD = ["git", "log", "--all", '--pretty=format:user:%aN%n%ct', "--reverse", "--raw", "--encoding=UTF-8", "--no-renames"]
  42. with sqlite3.connect(args.output) as db:
  43. db.execute(STMT_CREATE)
  44. db.commit()
  45. for fp in gitwalk(args.source):
  46. p = fp[len(args.source):]
  47. proc = subprocess.run(GIT_CMD, cwd=fp, stdout=subprocess.PIPE)
  48. if not proc.returncode == 0:
  49. continue
  50. print(fp)
  51. try:
  52. gitlog = proc.stdout.decode()
  53. except Exception as ex:
  54. print(ex)
  55. continue
  56. for l in gource_format(gitlog):
  57. l[3] = os.path.join(p, l[3].lstrip('/'))
  58. db.execute(STMT_INSERT, {
  59. 'time': int(l[0]),
  60. 'user': l[1],
  61. 'action': l[2],
  62. 'path': l[3],
  63. })
  64. # print('|'.join(l))
  65. db.commit()
  66. for it in db.execute(STMT_SELECT):
  67. print(it)
  68. def gource_format(inp: str):
  69. import subprocess
  70. GOURCE_CMD = ["gource", "--log-format", "git", "--output-custom-log", "-", "-"]
  71. with subprocess.Popen(GOURCE_CMD, stdout=subprocess.PIPE, stdin=subprocess.PIPE) as proc:
  72. out, err = proc.communicate(input=inp.encode())
  73. if proc.returncode != 0:
  74. return
  75. for l in out.decode().splitlines():
  76. ls = l.split('|')
  77. if len(ls) != 4:
  78. continue
  79. yield ls
  80. # sed "s, \([ACDMRTU]\)\t, \1\t$REL/," | gource --log-format git --output-custom-log - -
  81. def gitwalk(root: str):
  82. import os
  83. if not os.path.isdir(root):
  84. return
  85. if root.endswith('.git'):
  86. yield root
  87. else:
  88. ls = os.listdir(root)
  89. for d in ls:
  90. dj = os.path.join(root,d)
  91. for p in gitwalk(dj):
  92. yield p
  93. def tmpid(key: str):
  94. import hashlib
  95. return hashlib.sha256(key).hexdigest()
  96. def render(args: Namespace):
  97. print(args)
  98. if __name__=='__main__':
  99. main()