fix_gradle_deps.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python3
  2. import hashlib
  3. from pathlib import Path
  4. import os
  5. import re
  6. import shutil
  7. import sys
  8. from urllib.parse import urlparse
  9. from urllib.request import urlretrieve
  10. if len(sys.argv) < 3:
  11. print(
  12. f"Usage: {sys.argv[0]} project-name gradle-dep-num"
  13. )
  14. sys.exit(1)
  15. target = sys.argv[1]
  16. target_num = int(sys.argv[2])
  17. # We assume the script is in tor-browser-build/tools
  18. tbbuild = Path(__file__).parent.parent
  19. java_projects = sorted([
  20. txt.parent.name for txt in tbbuild.glob("projects/**/gradle-dependencies-list.txt")
  21. ])
  22. existing = {}
  23. for p in java_projects:
  24. p = tbbuild / "out" / p
  25. for gd in p.glob("gradle-dependencies-*"):
  26. for fname in gd.glob("**/*"):
  27. if fname.is_file():
  28. existing[fname.relative_to(gd)] = fname
  29. parser = re.compile(r"^([0-9a-fA-F]+)\s+\|\s+(\S+)\s*$")
  30. pairs = []
  31. with open(tbbuild / "projects" / target / "gradle-dependencies-list.txt") as f:
  32. for line in f.readlines():
  33. line = line.strip()
  34. if line[0] == '#' or line == 'sha256sum | url':
  35. continue
  36. m = parser.match(line)
  37. pairs.append((m.group(2), m.group(1)))
  38. dest_dir = tbbuild / "out" / target / f"gradle-dependencies-{target_num}"
  39. dest_dir.mkdir(parents=True, exist_ok=True)
  40. os.chdir(str(dest_dir))
  41. hashes = {}
  42. poms = set()
  43. for u, h in pairs:
  44. p = Path(urlparse(u).path[1:])
  45. if not p.exists():
  46. p.parent.mkdir(parents=True, exist_ok=True)
  47. if p in existing:
  48. print(f"Copying {p} from {existing[p]}")
  49. shutil.copyfile(existing[p], p)
  50. else:
  51. print(f"Downloading {u}")
  52. urlretrieve(u, p)
  53. if p.suffix != ".pom":
  54. m = hashlib.sha256()
  55. with p.open("rb") as f:
  56. m.update(f.read())
  57. if m.hexdigest() != h:
  58. print("Hash mismatch!", u)
  59. elif h in hashes:
  60. print("Duplicated item!", h, hashes[h].name, p)
  61. else:
  62. hashes[h] = p
  63. else:
  64. if p in poms:
  65. print(f"Duplicated pom: {p}")
  66. else:
  67. poms.add(p)