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/.
8 from datetime
import datetime
10 SOURCESTAMP_FILENAME
= "sourcestamp.txt"
13 def buildid_header(output
):
14 buildid
= os
.environ
.get("MOZ_BUILD_DATE")
15 if buildid
and len(buildid
) != 14:
16 print("Ignoring invalid MOZ_BUILD_DATE: %s" % buildid
, file=sys
.stderr
)
19 buildid
= datetime
.now().strftime("%Y%m%d%H%M%S")
20 output
.write("#define MOZ_BUILDID %s\n" % buildid
)
23 def get_program_output(*command
):
25 with
open(os
.devnull
) as stderr
:
26 return subprocess
.check_output(
27 command
, stderr
=stderr
, universal_newlines
=True
33 def get_hg_info(workdir
):
34 repo
= get_program_output("hg", "-R", workdir
, "path", "default")
37 if repo
.startswith("ssh://"):
38 repo
= "https://" + repo
[6:]
39 repo
= repo
.rstrip("/")
41 changeset
= get_hg_changeset(workdir
)
43 return repo
, changeset
46 def get_hg_changeset(path
):
47 return get_program_output("hg", "-R", path
, "parent", "--template={node}")
50 def get_info_from_sourcestamp(sourcestamp_path
):
51 """Read the repository and changelog information from the sourcestamp
52 file. This assumes that the file exists and returns the results as a list
53 (either strings or None in case of error).
56 # Load the content of the file.
58 with
open(sourcestamp_path
) as f
:
59 lines
= f
.read().splitlines()
61 # Parse the repo and the changeset. The sourcestamp file is supposed to
62 # contain two lines: the first is the build id and the second is the source
64 if len(lines
) != 2 or not lines
[1].startswith("http"):
65 # Just return if the file doesn't contain what we expect.
68 # Return the repo and the changeset.
69 return lines
[1].split("/rev/")
72 def source_repo_header(output
):
73 # We allow the source repo and changeset to be specified via the
74 # 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(buildconfig
.topsrcdir
, SOURCESTAMP_FILENAME
)
83 if os
.path
.exists(os
.path
.join(buildconfig
.topsrcdir
, ".hg")):
84 repo
, changeset
= get_hg_info(buildconfig
.topsrcdir
)
85 elif os
.path
.exists(sourcestamp_path
):
86 repo
, changeset
= get_info_from_sourcestamp(sourcestamp_path
)
88 changeset
= get_hg_changeset(buildconfig
.topsrcdir
)
91 "could not resolve changeset; " "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:]))