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.