clean_logs.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import glob, re, os.path, textwrap
  2. from colorama import Fore, Back, Style
  3. def mod_prefix(dir):
  4. if dir.startswith("net"):
  5. return "net"
  6. elif dir.startswith("serial"):
  7. return "serial"
  8. elif dir.startswith("util"):
  9. return "util"
  10. elif dir.startswith("runtime"):
  11. return "runtime"
  12. elif dir.startswith("zk"):
  13. return "zk"
  14. elif dir.startswith("raft"):
  15. return "raft"
  16. elif dir.startswith("sdk/src/crypto"):
  17. return "sdk::crypto"
  18. elif dir.startswith("sdk"):
  19. return "sdk"
  20. elif dir.startswith("contract/dao"):
  21. return "dao"
  22. elif dir.startswith("contract/money"):
  23. return "money"
  24. elif dir.startswith("rpc"):
  25. return "rpc"
  26. elif dir.startswith("system"):
  27. return "system"
  28. elif dir.startswith("dht"):
  29. return "dht"
  30. elif dir.startswith("consensus"):
  31. return "consensus"
  32. elif dir.startswith("zkas"):
  33. return "zkas"
  34. elif dir.startswith("blockchain"):
  35. return "blockchain"
  36. elif dir.startswith("wallet"):
  37. return "wallet"
  38. else:
  39. assert not dir or dir == "tx"
  40. return ""
  41. def mod_suffix(base):
  42. if base in ("mod.rs", "lib.rs"):
  43. return ""
  44. return base.removesuffix(".rs")
  45. def log_target(fname):
  46. dir, base = os.path.dirname(fname), os.path.basename(fname)
  47. prefix, suffix = mod_prefix(dir), mod_suffix(base)
  48. # you don't need :: when the suffix is empty
  49. if not suffix and not prefix:
  50. return ""
  51. if not suffix:
  52. return prefix
  53. if not prefix:
  54. return suffix
  55. return f"{prefix}::{suffix}"
  56. def replace(fname, contents):
  57. target = log_target(fname)
  58. print(f"Replacing {target}" + " "*(40 - len(target)) + f"[{fname}]")
  59. result = ""
  60. lines = contents.split("\n")
  61. i = 0
  62. while i < len(lines):
  63. line = lines[i]
  64. # only used for debug output
  65. old_line = None
  66. new_line = None
  67. # This is used as a debug goto
  68. line_modified = False
  69. log_level = None
  70. if "trace!(" in line:
  71. log_level = "trace"
  72. elif "debug!(" in line:
  73. log_level = "debug"
  74. elif "info!(" in line:
  75. log_level = "info"
  76. elif "warn!(" in line:
  77. log_level = "warn"
  78. elif "error!(" in line:
  79. log_level = "error"
  80. if log_level is not None:
  81. if not target:
  82. print(
  83. " "
  84. + Back.RED + "Skip [no target]:" + Style.RESET_ALL
  85. + f" {line}"
  86. )
  87. elif f"{log_level}!(target: L_TGT," in line:
  88. old_line = f"{i}: {line}"
  89. line = line.replace(
  90. f"{log_level}!(target: L_TGT,",
  91. f'{log_level}!(target: "{target}",',
  92. )
  93. line_modified = True
  94. new_line = f"{i}: {line}"
  95. elif f"{log_level}!(target:" in line:
  96. old_line = f"{i}: {line}"
  97. # Normal single lines with a target
  98. line = re.sub(f'{log_level}!\\(target: "[a-z:_]+",',
  99. f'{log_level}!(target: "{target}",',
  100. line)
  101. line_modified = True
  102. new_line = f"{i}: {line}"
  103. elif f'{log_level}!("' in line:
  104. old_line = f"{i}: {line}"
  105. # Normal single lines with no target set
  106. #print(f" No target: {line}")
  107. line = line.replace(f'{log_level}!(',
  108. f'{log_level}!(target: "{target}", ')
  109. line_modified = True
  110. new_line = f"{i}: {line}"
  111. else:
  112. old_line = f"{i}: {line}"
  113. new_line = f"{i}: {line}"
  114. # Multiline debugs
  115. # Read the next line instead
  116. result += line + "\n"
  117. i += 1
  118. assert i < len(lines)
  119. line = lines[i]
  120. old_line += f"\n{i}: {line}"
  121. # one place has a constant defined.
  122. if "target: L_TGT" in line:
  123. print(repr(line))
  124. line = line.replace("target: L_TGT,", f'target: "{target}",')
  125. new_line += f"\n{i}: {line}"
  126. elif "target:" in line:
  127. line = re.sub( 'target: "[a-z:_]+",',
  128. f'target: "{target}",',
  129. line)
  130. new_line += f"\n{i}: {line}"
  131. else:
  132. leading_space = lambda line: len(line) - len(line.lstrip())
  133. added_line = (" "*leading_space(line)
  134. + f'target: "{target}",')
  135. result += f"{added_line}\n"
  136. new_line += f"\n{i}: {added_line}\n{i + 1}: {line}"
  137. line_modified = True
  138. if line_modified:
  139. assert old_line is not None and new_line is not None
  140. print(
  141. Fore.RED
  142. + textwrap.indent(old_line, " < ")
  143. + Style.RESET_ALL
  144. )
  145. print(
  146. Fore.GREEN
  147. + textwrap.indent(new_line, " > ")
  148. + Style.RESET_ALL
  149. )
  150. result += f"{line}\n"
  151. i += 1
  152. return result
  153. def main():
  154. for fname in glob.glob("**/*.rs", root_dir="src/", recursive=True):
  155. with open(f"src/{fname}", "r") as f:
  156. contents = f.read()
  157. contents = replace(fname, contents)
  158. # Doesn't write anything yet
  159. #with open(fname, "w") as f:
  160. # f.write(contents)
  161. if __name__ == "__main__":
  162. main()