]>
Commit | Line | Data |
---|---|---|
a7ede909 JW |
1 | # |
2 | # SPDX-License-Identifier: GPL-2.0-only | |
3 | # | |
4 | import os | |
5 | import subprocess | |
6 | import bb | |
7 | ||
8 | def get_source_date_epoch_from_known_files(d, sourcedir): | |
9 | source_date_epoch = None | |
10 | newest_file = None | |
11 | known_files = set(["NEWS", "ChangeLog", "Changelog", "CHANGES"]) | |
12 | for file in known_files: | |
13 | filepath = os.path.join(sourcedir, file) | |
14 | if os.path.isfile(filepath): | |
15 | mtime = int(os.lstat(filepath).st_mtime) | |
16 | # There may be more than one "known_file" present, if so, use the youngest one | |
17 | if not source_date_epoch or mtime > source_date_epoch: | |
18 | source_date_epoch = mtime | |
19 | newest_file = filepath | |
20 | if newest_file: | |
21 | bb.debug(1, "SOURCE_DATE_EPOCH taken from: %s" % newest_file) | |
22 | return source_date_epoch | |
23 | ||
24 | def find_git_folder(d, sourcedir): | |
25 | # First guess: WORKDIR/git | |
26 | # This is the default git fetcher unpack path | |
27 | workdir = d.getVar('WORKDIR') | |
28 | gitpath = os.path.join(workdir, "git/.git") | |
29 | if os.path.isdir(gitpath): | |
30 | return gitpath | |
31 | ||
32 | # Second guess: ${S} | |
33 | gitpath = os.path.join(sourcedir, ".git") | |
34 | if os.path.isdir(gitpath): | |
35 | return gitpath | |
36 | ||
37 | # Perhaps there was a subpath or destsuffix specified. | |
38 | # Go looking in the WORKDIR | |
39 | exclude = set(["build", "image", "license-destdir", "patches", "pseudo", | |
40 | "recipe-sysroot", "recipe-sysroot-native", "sysroot-destdir", "temp"]) | |
41 | for root, dirs, files in os.walk(workdir, topdown=True): | |
42 | dirs[:] = [d for d in dirs if d not in exclude] | |
43 | if '.git' in dirs: | |
44 | return root | |
45 | ||
46 | bb.warn("Failed to find a git repository in WORKDIR: %s" % workdir) | |
47 | return None | |
48 | ||
49 | def get_source_date_epoch_from_git(d, sourcedir): | |
50 | source_date_epoch = None | |
51 | if "git://" in d.getVar('SRC_URI'): | |
52 | gitpath = find_git_folder(d, sourcedir) | |
53 | if gitpath: | |
54 | import subprocess | |
55 | source_date_epoch = int(subprocess.check_output(['git','log','-1','--pretty=%ct'], cwd=gitpath)) | |
56 | bb.debug(1, "git repository: %s" % gitpath) | |
57 | return source_date_epoch | |
58 | ||
59 | def get_source_date_epoch_from_youngest_file(d, sourcedir): | |
60 | if sourcedir == d.getVar('WORKDIR'): | |
61 | # These sources are almost certainly not from a tarball | |
62 | return None | |
63 | ||
64 | # Do it the hard way: check all files and find the youngest one... | |
65 | source_date_epoch = None | |
66 | newest_file = None | |
67 | for root, dirs, files in os.walk(sourcedir, topdown=True): | |
68 | files = [f for f in files if not f[0] == '.'] | |
69 | ||
70 | for fname in files: | |
71 | filename = os.path.join(root, fname) | |
72 | try: | |
73 | mtime = int(os.lstat(filename).st_mtime) | |
74 | except ValueError: | |
75 | mtime = 0 | |
76 | if not source_date_epoch or mtime > source_date_epoch: | |
77 | source_date_epoch = mtime | |
78 | newest_file = filename | |
79 | ||
80 | if newest_file: | |
81 | bb.debug(1, "Newest file found: %s" % newest_file) | |
82 | return source_date_epoch | |
83 | ||
84 | def fixed_source_date_epoch(): | |
85 | bb.debug(1, "No tarball or git repo found to determine SOURCE_DATE_EPOCH") | |
86 | return 0 | |
87 | ||
88 | def get_source_date_epoch(d, sourcedir): | |
89 | return ( | |
90 | get_source_date_epoch_from_git(d, sourcedir) or | |
91 | get_source_date_epoch_from_known_files(d, sourcedir) or | |
92 | get_source_date_epoch_from_youngest_file(d, sourcedir) or | |
93 | fixed_source_date_epoch() # Last resort | |
94 | ) | |
95 |