1#!/usr/bin/env python3
2#
3# Conversion script to update SRC_URI to add branch to git urls
4#
5# Copyright (C) 2021 Richard Purdie
6#
7# SPDX-License-Identifier: GPL-2.0-only
8#
9
10import re
11import os
12import sys
13import tempfile
14import shutil
15import mimetypes
16
17if len(sys.argv) < 2:
18    print("Please specify a directory to run the conversion script against.")
19    sys.exit(1)
20
21def processfile(fn):
22    def matchline(line):
23        if "MIRROR" in line or ".*" in line or "GNOME_GIT" in line:
24            return False
25        return True
26    print("processing file '%s'" % fn)
27    try:
28        if "distro_alias.inc" in fn or "linux-yocto-custom.bb" in fn:
29            return
30        fh, abs_path = tempfile.mkstemp()
31        modified = False
32        with os.fdopen(fh, 'w') as new_file:
33            with open(fn, "r") as old_file:
34                for line in old_file:
35                    if ("git://" in line or "gitsm://" in line) and "branch=" not in line and matchline(line):
36                        if line.endswith('"\n'):
37                            line = line.replace('"\n', ';branch=master"\n')
38                        elif re.search('\s*\\\\$', line):
39                            line = re.sub('\s*\\\\$', ';branch=master \\\\', line)
40                        modified = True
41                    if ("git://" in line or "gitsm://" in line) and "github.com" in line and "protocol=https" not in line and matchline(line):
42                        if "protocol=git" in line:
43                            line = line.replace('protocol=git', 'protocol=https')
44                        elif line.endswith('"\n'):
45                            line = line.replace('"\n', ';protocol=https"\n')
46                        elif re.search('\s*\\\\$', line):
47                            line = re.sub('\s*\\\\$', ';protocol=https \\\\', line)
48                        modified = True
49                    new_file.write(line)
50        if modified:
51            shutil.copymode(fn, abs_path)
52            os.remove(fn)
53            shutil.move(abs_path, fn)
54    except UnicodeDecodeError:
55        pass
56
57ourname = os.path.basename(sys.argv[0])
58ourversion = "0.1"
59
60if os.path.isfile(sys.argv[1]):
61    processfile(sys.argv[1])
62    sys.exit(0)
63
64for targetdir in sys.argv[1:]:
65    print("processing directory '%s'" % targetdir)
66    for root, dirs, files in os.walk(targetdir):
67        for name in files:
68            if name == ourname:
69                continue
70            fn = os.path.join(root, name)
71            if os.path.islink(fn):
72                continue
73            if "/.git/" in fn or fn.endswith(".html") or fn.endswith(".patch") or fn.endswith(".m4") or fn.endswith(".diff"):
74                continue
75            processfile(fn)
76
77print("All files processed with version %s" % ourversion)
78