Recording source information in a build

Kelly O'Hair Kelly.Ohair at Sun.COM
Sat Apr 5 22:20:11 UTC 2008


Mercurial does not come with the forest extension by default, so I'm
reluctant to become dependent on it in the build process, and this needs
to be a loose build dependence on 'hg' as it is.
But 'hg fsnap' is the basic kind of thing that is needed.

-kto

Roman Kennke wrote:
> 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
>>



More information about the build-dev mailing list