Next: Selected Files Commit, Previous: Checking-in Changes, Up: Working With Arch
If you've followed along with the examples in earlier chapters, you should have:
Your First Archive which is also your default archive:
% tla my-default-archive lord@emf.net--2003-example % tla whereis-archive lord@emf.net--2003-example /usr/lord/examples/archives/2003-example
A hello-world Project in Your Archive
% tla categories hello-world % tla branches hello-world hello-world--mainline % tla versions hello-world--mainline hello-world--mainline--0.1
Two Revisions of the hello-world Project
% tla revisions hello-world--mainline--0.1 base-0 patch-1
In this chapter, you'll learn how to retrieve revisions from your archive.
You might also have a left-over project tree. If so, let's get rid of that:
% cd ~/wd % ls hello-world % rm -rf hello-world
Let's suppose that you now want to get the latest sources for the
hello world project. For that, you want to use the get
command:
% tla get hello-world--mainline--0.1 hello-world [...] % ls hello-world % ls hello-world hw.c main.c {arch}
Let's suppose we want to check out an earlier version of the
hello-world
project.
Notice that in the previous example, we asked just for a particular version of the project:
% tla get hello-world--mainline--0.1 hello-world ^^^^^^^^^^^ ^^^^^^^^ ^^^ ^^^^^^^^^^^ | | | | | | | target directory | | | | | | | | version number | | | branch name | category name
We can get an earlier revision name by specifying its patch level explicitly:
% tla get hello-world--mainline--0.1--base-0 hello-world-0 ^^^^^^^^^^^ ^^^^^^^^ ^^^ ^^^^^^ ^^^^^^^^^^^^^ | | | | | | | | | target directory | | | | | | | patch level name | | | | | version number | | | branch name | category name % ls hello-world hello-world-0 % ls hello-world-0 hw.c main.c {arch}
You can see the changes made from base-0
to patch-1
with, for
example, diff -r
:
% diff -r hello-world-0 hello-world diff -r hello-world-0/hw.c hello-world/hw.c 7c7 < (void)printf ("hello warld"); --- > (void)printf ("hello world\n"); [...]
Retrieving the base-0
revision is easy. As you should recall, the
base-0
revision is stored as a compressed tar file of the complete
source tree (see How it Works – What import Does in Importing the First Revision). When
asked to retrieve base-0
, the get
command essentially just unpacks
that tar file.
Retrieving the patch-1
revision happens in two steps. Recall that
patch-1
is stored as a changeset that describes the differences
between base-0
and patch-1
(see How it Works – commit of a New Revision in Checking-in Changes). Therefore, get
works by first retrieving the
base-0
revision, then retrieving the patch-1
changeset, then using
that changeset to modify the base-0
tree and turn it into a
patch-1
tree. Internally, get
uses a tla command called
dopatch
to apply a changeset, but if you are familiar with
diff/patch
patchsets, then you can think of dopatch
as "patch on
steroids".
Let's suppose that instead of committing just one change you'd
committed many changes: not just a patch-1
revision but patch-2
,
patch-3
and so forth. In essence, get
will apply each changeset
in order to create the revision you requested.
Note: In fact, get
is a bit more complicated than is described
here. On the one hand, there are performance optimizations that can
spare get
from having to apply a long list of changesets. On the
other hand, there can be revisions created by tag
rather than
commit
, for which different rules apply. You'll learn more about
these exceptions in later chapters.