| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*-" |
| # Copyright 2021 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Update rebase database with new information from upstream and next database""" |
| |
| from __future__ import print_function |
| import sqlite3 |
| import re |
| from common import rebasedb, upstreamdb, nextdb |
| |
| subject = re.compile( |
| '(ANDROID: *|CHROMIUM: *|CHROMEOS: *|UPSTREAM: *|FROMGIT: *|FROMLIST: *|BACKPORT: *)*(.*)' |
| ) |
| |
| |
| def findsha(uconn, sha, patchid, desc): |
| """Try to find matching SHA in provided database. |
| |
| Return updated SHA, or None if not found. |
| """ |
| |
| c = uconn.cursor() |
| |
| if sha is not None: |
| c.execute("select sha from commits where sha is '%s'" % sha) |
| usha = c.fetchone() |
| if usha: |
| # print(" Found SHA %s in upstream database" % usha) |
| return usha[0] |
| |
| # Now look for patch id if provided |
| if patchid is not None: |
| c.execute("select sha from commits where patchid is '%s'" % patchid) |
| usha = c.fetchone() |
| if usha: |
| # print(" Found SHA %s in upstream database based on patch ID" % usha) |
| return usha[0] |
| |
| # The SHA is not upstream, or not known at all. |
| # See if we can find the commit subject. |
| s = subject.search(desc) |
| if s: |
| sdesc = s.group(2).replace("'", "''") |
| c.execute("select sha from commits where subject is '%s'" % sdesc) |
| usha = c.fetchone() |
| if usha: |
| # print(" Found upstream SHA '%s' based on subject line" % usha) |
| return usha[0] |
| |
| return None |
| |
| |
| def update_commits(): |
| """Validate 'usha' field in rebase database. |
| |
| Verify if the upstream SHA actually exists by looking it up in the upstream |
| database. If it doesn't exist, and if a matching commit is not found either, |
| remove it. |
| """ |
| |
| conn = sqlite3.connect(rebasedb) |
| uconn = sqlite3.connect(upstreamdb) |
| nconn = sqlite3.connect(nextdb) if nextdb else None |
| c = conn.cursor() |
| |
| c.execute('select sha, usha, patchid, subject from commits') |
| for (sha, usha, patchid, desc) in c.fetchall(): |
| uusha = findsha(uconn, usha, patchid, desc) |
| # if it is not in the upstream database, maybe it is in -next. |
| # Try to pick it up from there. |
| if uusha is None and nconn: |
| uusha = findsha(nconn, usha, None, desc) |
| if not uusha: |
| uusha = '' |
| if usha != uusha: |
| print("SHA '%s': Updating usha '%s' with '%s'" % (sha, usha, uusha)) |
| c.execute("UPDATE commits set usha='%s' where sha='%s'" % |
| (uusha, sha)) |
| |
| conn.commit() |
| conn.close() |
| uconn.close() |
| if nconn: |
| nconn.close() |
| |
| |
| if __name__ == '__main__': |
| update_commits() |