1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 from __future__
import print_function
, unicode_literals
10 from datetime
import datetime
12 SOURCESTAMP_FILENAME
= 'sourcestamp.txt'
15 def buildid_header(output
):
16 buildid
= os
.environ
.get('MOZ_BUILD_DATE')
17 if buildid
and len(buildid
) != 14:
18 print('Ignoring invalid MOZ_BUILD_DATE: %s' % buildid
, file=sys
.stderr
)
21 buildid
= datetime
.now().strftime('%Y%m%d%H%M%S')
22 output
.write("#define MOZ_BUILDID %s\n" % buildid
)
25 def get_program_output(*command
):
27 with
open(os
.devnull
) as stderr
:
28 return subprocess
.check_output(command
, stderr
=stderr
,
29 universal_newlines
=True)
34 def get_hg_info(workdir
):
35 repo
= get_program_output('hg', '-R', workdir
, 'path', 'default')
38 if repo
.startswith('ssh://'):
39 repo
= 'https://' + repo
[6:]
40 repo
= repo
.rstrip('/')
42 changeset
= get_hg_changeset(workdir
)
44 return repo
, changeset
47 def get_hg_changeset(path
):
48 return get_program_output('hg', '-R', path
, 'parent', '--template={node}')
51 def get_info_from_sourcestamp(sourcestamp_path
):
52 """Read the repository and changelog information from the sourcestamp
53 file. This assumes that the file exists and returns the results as a list
54 (either strings or None in case of error).
57 # Load the content of the file.
59 with
open(sourcestamp_path
) as f
:
60 lines
= f
.read().splitlines()
62 # Parse the repo and the changeset. The sourcestamp file is supposed to
63 # contain two lines: the first is the build id and the second is the source
65 if len(lines
) != 2 or not lines
[1].startswith('http'):
66 # Just return if the file doesn't contain what we expect.
69 # Return the repo and the changeset.
70 return lines
[1].split('/rev/')
73 def source_repo_header(output
):
74 # We allow the source repo and changeset to be specified via the
75 # environment (see configure)
77 repo
= buildconfig
.substs
.get('MOZ_SOURCE_REPO')
78 changeset
= buildconfig
.substs
.get('MOZ_SOURCE_CHANGESET')
82 sourcestamp_path
= os
.path
.join(
83 buildconfig
.topsrcdir
, SOURCESTAMP_FILENAME
)
84 if os
.path
.exists(os
.path
.join(buildconfig
.topsrcdir
, '.hg')):
85 repo
, changeset
= get_hg_info(buildconfig
.topsrcdir
)
86 elif os
.path
.exists(sourcestamp_path
):
87 repo
, changeset
= get_info_from_sourcestamp(sourcestamp_path
)
89 changeset
= get_hg_changeset(buildconfig
.topsrcdir
)
91 raise Exception('could not resolve changeset; '
92 'try setting MOZ_SOURCE_CHANGESET')
95 output
.write('#define MOZ_SOURCE_STAMP %s\n' % changeset
)
97 if repo
and buildconfig
.substs
.get('MOZ_INCLUDE_SOURCE_INFO'):
98 source
= '%s/rev/%s' % (repo
, changeset
)
99 output
.write('#define MOZ_SOURCE_REPO %s\n' % repo
)
100 output
.write('#define MOZ_SOURCE_URL %s\n' % source
)
105 func
= globals().get(args
[0])
107 return func(sys
.stdout
, *args
[1:])
110 if __name__
== '__main__':
111 sys
.exit(main(sys
.argv
[1:]))