Recording source information in a build

Roman Kennke roman.kennke at aicas.com
Thu Apr 3 18:43:47 UTC 2008


Hi Kelly,

I'm facing similar problems right now inside aicas (we also want to
transition to HG). I think you should look at hg fsnap, this gives you a
snapshot file, which uniquely identifies the state of a forest at a
given time. Maybe this is helpful?

/Roman

Am Donnerstag, den 03.04.2008, 11:36 -0700 schrieb Kelly O'Hair:
> Problem Statement:
> 
>    Given a build of the OpenJDK, how can you find out what source was used to
>      build this binary install?
> 
> Seed of a Solution:
> 
>    With Mercurial, a single repository changeset number identifies the state of
>      the complete source repository. If this changeset (or set of changesets)
>      could be somehow recorded with the built bits, then given any build you
>      could quickly and easily reconstruct the exact source files that were used
>      at build time.
> 
> Problems:
> 
>    We have a forest not a single repository.
>    We often create source bundles (sources minus the SCM management data, e.g. ".hg")
>      so we need this to work in the face of building from source bundles.
> 
> Possible Solution:
> 
>    First issue is identifying a repository of the forest relative to the root of the forest.
>      So each repository would get a managed file ".identification" which would contain
>        information to help identify the repository.
>        For example, the topmost OpenJDK one would have a ".identification" file containing:
>          root=.
>         directory=.
>         description=Root of the JDK Source Tree
>        and the corba one would have:
>          root=..
>          directory=corba
>          description=Corba Sources
>        etc. (the directory could be a deeper nested directory, like jdk/src/closed)
>      This .identification file would be a permanent file in the repository, at the root
>        of the repository. It's saying that to get to the root of the forest, you
>        'cd ${root}'. And if this repository is not located at ${root}/${directory}
>        something is wrong, or the repository is not currently part of a forest.
> 
>    Second issue, the changeset id.
>      A second file called ".changeset" would not be a managed file and would be created
>        before the source bundles are created, and be non-existent if they can't be created
>        because you don't have repositories (building from raw source trees) or don't have
>        access to 'hg'. These files would just contain a changeset=id, created with:
>           hg tip --template 'changeset={node}\n'
>        So somewhere this needs to happen, before source bundles are created and before
>          the use of this data:
>          TREES:=$(shell hg ftrees)
>          if [ "$(TREES)" != "" ] ; then
>            for i in $(TREES) ; do
>              (cd $i && hg tip --template 'changeset={node}\n' > .changeset )
>            done
>          fi
> 
>    Third, all this data needs to be merged together into a file that could be
>      used later to recreate the source tree by running:
>         hg clone -r ${changeset} http://hg.openjdk.java.net/jdk7/${directory} ${directory}
>      as many times as needed.
>      The Makefiles would be sensitive to the existence of the .changeset files and
>        allow for them to not exist where they are used, they might not be there in
>        all cases. But when they are there, do something like:
>          jdk_source_information.txt:
>                  $(RM) $@
>                  echo "# JDK Source Information" > $@
>                  if [ "$(TREES)" != "" ] ; then
>                    for i in $(TREES) ; do
>                      if [ -f ${i}/.identification ] ; then
>                        cat ${i}/.identification >> $@
>                        if [ -f ${i}/.changeset ] ; then
>                          cat ${i}/.changeset >> $@
>                        fi
>                      fi
>                    done
>                  fi
>         Resulting in a file:
>           # JDK Source Information
>           root=.
>           directory=.
>           description=Root of the JDK Source Tree
>           changeset=BIGHEXNUMBER
>           root=..
>           directory=corba
>           description=Corba Sources
>           changeset=BIGHEXNUMBER
>           ...
>         Left in the jdk install tree.
> 
> ---
> Just a first guess at a basic idea as to how this could work...
> 
> Please don't assume the above is also an implementation, it's the basic idea
> of having members of the forest identify themselves, and the idea of
> recording the changesets, and finally of leaving source information in
> the resulting binary build.
> 
> Comments?
> 
> -kto
> 
> P.S. Full RFE can be seen at: http://bugs.sun.com/view_bug.do?bug_id=6631003
> 
-- 
Dipl.-Inform. (FH) Roman Kennke, Software Engineer, http://kennke.org
aicas Allerton Interworks Computer Automated Systems GmbH
Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany
http://www.aicas.com   * Tel: +49-721-663 968-0
USt-Id: DE216375633, Handelsregister HRB 109481, AG Karlsruhe
Geschäftsführer: Dr. James J. Hunt




More information about the build-dev mailing list