xref: /aosp_15_r20/external/pdfium/update_pdfium.py (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1#!/usr/bin/python
2
3import urllib2
4import os
5import sys
6from subprocess import call
7
8CHROMIUM_VERSION_TRACKING_URL = "https://omahaproxy.appspot.com/all"
9CHROMIUM_BUILD_TYPE = "stable"
10CHROMIUM_OS = "android"
11
12CHROMIUM_SOURCE_URL = "https://chromium.googlesource.com/chromium/src/+/refs/tags"
13CHROMIUM_DEPS_FILE = "DEPS"
14
15PDFIUM_GIT_REPO = "https://pdfium.googlesource.com/pdfium.git"
16
17MAKE_FILES = ["Android.bp",
18              "constants/Android.bp",
19              "core/fdrm/Android.bp",
20              "core/fpdfapi/cmaps/Android.bp",
21              "core/fpdfapi/edit/Android.bp",
22              "core/fpdfapi/font/Android.bp",
23              "core/fpdfapi/page/Android.bp",
24              "core/fpdfapi/parser/Android.bp",
25              "core/fpdfapi/render/Android.bp",
26              "core/fpdfdoc/Android.bp",
27              "core/fpdftext/Android.bp",
28              "core/fxcodec/Android.bp",
29              "core/fxcrt/Android.bp",
30              "core/fxge/Android.bp",
31              "fpdfsdk/Android.bp",
32              "fpdfsdk/formfiller/Android.bp",
33              "fpdfsdk/pwl/Android.bp",
34              "fxjs/Android.bp",
35              "third_party/Android.bp"]
36
37OWNERS_FILES = ["OWNERS", "docs/OWNERS", "third_party/base/numerics/OWNERS"]
38
39COPY_FILES = [os.path.basename(__file__), ".git", "MODULE_LICENSE_BSD"] + MAKE_FILES
40REMOVE_FILES = [os.path.basename(__file__), ".git", ".gitignore"] + OWNERS_FILES
41
42def getStableChromiumVersion():
43   """ :return the latest chromium version """
44
45   chromiumVersions = urllib2.urlopen(CHROMIUM_VERSION_TRACKING_URL)
46
47   for chromiumVersionStr in chromiumVersions.read().split("\n"):
48       chromiumVersion = chromiumVersionStr.split(",")
49
50       if chromiumVersion[0] == CHROMIUM_OS and chromiumVersion[1] == CHROMIUM_BUILD_TYPE:
51           return chromiumVersion[2]
52
53   raise Exception("Could not find latest %s chromium version for %s at %s"
54                   % (CHROMIUM_BUILD_TYPE, CHROMIUM_OS, CHROMIUM_VERSION_TRACKING_URL))
55
56
57def getPdfiumRevision():
58    """ :return the pdfium version used by the latest chromium version """
59
60    try:
61        deps = urllib2.urlopen("%s/%s/%s" % (CHROMIUM_SOURCE_URL, getStableChromiumVersion(),
62                                             CHROMIUM_DEPS_FILE))
63
64        # I seem to not be able to get the raw file, hence grep the html file
65        return deps.read().split("pdfium_revision&")[1].split("'")[1]
66    except Exception as e:
67        raise Exception("Could not extract pdfium revision from %s/%s/%s: %s"
68                       % (CHROMIUM_SOURCE_URL, getStableChromiumVersion(), CHROMIUM_DEPS_FILE, e))
69
70
71def downloadPdfium(newDir, rev):
72    """ Download the newest version of pdfium to the new directory
73
74    :param newDir: The new files
75    :param rev: The revision to change to
76    """
77
78    call(["git", "clone", PDFIUM_GIT_REPO, newDir])
79    os.chdir(newDir)
80    call(["git", "reset", "--hard", rev])
81
82
83def removeFiles(newDir):
84    """ Remove files that should not be checked in from the original download
85
86    :param newDir: The new files
87    """
88
89    for fileName in REMOVE_FILES:
90        call(["rm", "-rf", os.path.join(newDir, fileName)])
91
92
93def copyFiles(currentDir, newDir):
94    """ Copy files needed to make pdfium work with android
95
96    :param currentDir: The current files
97    :param newDir: The new files
98    """
99
100    for fileName in COPY_FILES:
101        call(["cp", "-r", os.path.join(currentDir, fileName), os.path.join(newDir, fileName)])
102
103
104def exchange(currentDir, newDir, oldDir):
105    """ Update current to new and save current in old.
106
107    :param currentDir: The current files
108    :param newDir: The new files
109    :param oldDir: The old files
110    """
111
112    call(["mv", currentDir, oldDir])
113    call(["mv", newDir, currentDir])
114
115
116if __name__ == "__main__":
117   rev = getPdfiumRevision()
118   targetDir = os.path.dirname(os.path.realpath(__file__))
119   newDir = targetDir + ".new"
120   oldDir = targetDir + ".old"
121
122   try:
123       downloadPdfium(newDir, rev)
124       removeFiles(newDir)
125       copyFiles(targetDir, newDir)
126       exchange(targetDir, newDir, oldDir)
127       print("Updated pdfium to " + rev + " (Chrome " + getStableChromiumVersion() + "). Old files "
128             "are in " + oldDir + ". Please verify if build files need to be updated.")
129
130       sys.exit(0)
131   except:
132       call(["rm", "-rf", newDir])
133       sys.exit(1)
134
135