= Working With The Repository = == Background == The "central" Athena repository is located on `git.mit.edu` (aka `drugstore`), accessible via git+ssh. You must be on the `athena-commiters` [yes, the typo is deliberate] list in order to read or write to any of the Athena repositories on this server. Our git repository is automatically mirrored to the `mit-athena` organization on Github, and anyone without `drugstore` access should clone from there. **NOTE**: * This document will use the canonical paths. In general, you can replace `git+ssh://git.mit.edu/git/athena` with `https://github.com/mit-athena` in a repository URL. * This document assumes that the remote named `origin` is the repository on `git.mit.edu`. This is the default behavior if you follow the instructions here. === Submodules === Because of the vast number of repositories, we use submodules. The `debathena` repository is the parent repository, and its `.gitmodules` file contains all the submodule information. If you're not familiar with submodules, please check out [[https://git-scm.com/book/en/v2/Git-Tools-Submodules]] Submodule configuration is stored in the `.gitmodules` file, which is itself under version control. Submodules know both their path, and the last SHA1 they were updated with. In theory, we would update the central repository every time we make a change to a submodule, so it always points to the submodule's `HEAD`, or at least a reasonable tag. However, we don't. It is therefore vital that you ensure your submodule is up to date and that you're on `master` before working on it, lest you find yourself attempt to commit to a detached `HEAD`. === Repository Layout === At the top level of the repository are 4 sub-directories: * `athena` - This typically contains software we write. These are "non-native" packages (i.e. packages that consist of more than just a `debian/` directory and some configuration files). Basically, if something is of value on distributions other than Ubuntu and Debian, it should go in here. * `debathena` - This typically contains "native" packages (i.e. packages which are "native" to Ubuntu and Debian, and which would not make sense on other distributions) * `misc` - Things needed as part of the Debathena build infrastructure. * `build-system` - The "new" build system components * `debathena-common` - Along with manual-config (below), used for manual-config packages * `installer` - The installer, both the PXE versions and the script * `manual-config` - The "manual-config" packages. These have the same names as debathena-config packages, but only provide dependencies, and are otherwise empty. Used by a few users so that, for example, they can install something that depends on `debathena-printing-config` without actually configuring printing. * `scripts` - Various scripts, and the "old" build system components * `third` - A few packages that we build, but for which we are not the upstream source. These count as "non-native" packages. == Initial Repository Cloning == If you're only working on a single project, you can of course clone that project as you would any other Git repository. However, core developers should clone all the submodules at once for simplicity. This is about 150MB or so. {{{ $ git clone git+ssh://git.mit.edu/git/athena/debathena athena-source-tree $ cd athena-source-tree $ git submodule init $ git submodule update }}} (You can of course replace `athena-source-tree` with whatever you'd like your local clone to be called.) This will checkout specific SHA1s for each submodule (specifically, whatever the SHA1 was when it was first added as a submodule), but *will not switch to the master branch*. == Working on a Package == In the example below, we will prepare to work on the `getcluster` package: {{{ jdreed@infinite-loop:~/src/athena-source-tree$ cd athena/getcluster jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ git status HEAD detached at 3f5c288 nothing to commit, working directory clean }}} As you can see, this is a deatched HEAD, because the `getcluster` submodule was at `3f5c288` when initially added to the parent repository. So to work on it, we should ensure we're up to date: {{{ jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ git checkout master Previous HEAD position was 3f5c288... Revert unintended changelog changes from r25887 Switched to branch 'master' Your branch is up-to-date with 'origin/master'. jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ git pull remote: Counting objects: 6, done. remote: Compressing objects: 100% (4/4), done. remote: Total 5 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (5/5), done. From git+ssh://git.mit.edu/git/athena/getcluster db5520e..772d62f pristine-tar -> origin/pristine-tar * [new tag] 10.2.2-0debathena2 -> 10.2.2-0debathena2 Already up-to-date. }}} We checked out the master branch, and then did a `git pull`. There were no changes to fetch, but there was a new branch (`pristine-tar`) and a new tag. == Branches == Native packages have a single `master` branch. Non-native packages have two branches: `debian` and `master`. The `master` branch contains the software itself, but no `debian` directory. The `debian` branch contains the software plus a `debian/` directory. There is also a `pristine-tar` branch, where "pristine" upstream tarballs are stored as part of the build process. You can check it out remotely, but you basically never want to be working on it. Continuing from the `getcluster` example above: {{{ jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ ls getcluster getcluster.1 setup.py tests.sh jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ git branch debian * master jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ git checkout origin/pristine-tar Note: checking out 'origin/pristine-tar'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b HEAD is now at 772d62f... pristine-tar data for getcluster-10.2.2.tar.gz jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ ls getcluster-10.2.1.tar.gz.delta getcluster-10.2.1.tar.gz.id getcluster-10.2.2.tar.gz.delta getcluster-10.2.2.tar.gz.id jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ git checkout master Previous HEAD position was 772d62f... pristine-tar data for getcluster-10.2.2.tar.gz Switched to branch 'master' Your branch is up-to-date with 'origin/master'. jdreed@infinite-loop:~/src/athena-source-tree/athena/getcluster$ ls getcluster getcluster.1 setup.py tests.sh }}}