# Git/lookaside
Package sources checked into git.centos.org are in exploded SRPM format. This means that the package working directory should have at least a SPECS/ subdirectory.
## New Package (from source)
If the package you'd like to build isn't yet on https://git.centos.org, create first a ticket on https://pagure.io/centos-infra/issues to request the git repo for /rpms/<your_package> to be created
Once it will be created, it will be possible for you to push to *specific* branches, based on the following rules: c{7,8}-<sig_name>*
So that means that if I'm member of the sig-core group (in ACO), I'll be able to commit/push to c8-sig-core or c8-sig-core-whatever-I-want branches
Let's use the following example : I need to create a branch for pkg centpkg-minimal, and I'm member of the sig-core SIG group. We have to push two things to git.centos.org :
* .spec files to build a src.rpm
* eventually blob (.tar.gz archive) that will need to be pushed to lookaside cache
!!! warning
To push to lookaside cache you need to have already a local check out from [https://git.centos.org/centos-git-common](https://git.centos.org/centos-git-common)
## Pushing first to lookaside cache
Let's assume that my pkg centpkg-minimal that I want to build has an archive called centpkg.minimal.tar.gz. To be able to push to lookaside cache, we need the following :
* a valid TLS cert (also needed to build on cbs.centos.org) obtained through [centos-cert](../auth/) util
* lookaside_upload script in your $PATH (coming from centos-git-common git repo, see above)
This simple script would need some paramters:
```
lookaside_upload
You need to call the script like this : ~/bin/lookaside_upload -arguments
-f : filename/source to upload (required, default:none)
-n : package name for that source (requred, default:none, example "httpd")
-b : "branch" where to upload to (required, default:none, example "c7-sig-core")
-h : display this help
```
So back to our example, the pkg name is centpkg-minimal, file is centpkg-minimal.tar.gz and I'm member of the sig-core group, and want to build it for c7, so we'll call it like this :
```
lookaside_upload -f centpkg-minimal.tar.gz -n centpkg-minimal -b c7-sig-core
[+] CentOS Lookaside upload tool -> Checking if file already uploaded
[+] CentOS Lookaside upload tool -> Initialing new upload to lookaside
[+] CentOS Lookaside upload tool -> URL : https://git.centos.org
[+] CentOS Lookaside upload tool -> Source to upload : centpkg-minimal.tar.gz
[+] CentOS Lookaside upload tool -> Package name: centpkg-minimal
[+] CentOS Lookaside upload tool -> sha1sum: d6616b89617914a0dd0fd5cfa06b0afc7a4541c4
[+] CentOS Lookaside upload tool -> Remote branch: c7-sig-core
[+] CentOS Lookaside upload tool -> ====== Trying to upload =======
################################################################################################################ 100.0%
File centpkg-minimal.tar.gz size 15178 CHECKSUM d6616b89617914a0dd0fd5cfa06b0afc7a4541c4 stored OK
[+] CentOS Lookaside upload tool -> Validating that source was correctly uploaded ....
[+] CentOS Lookaside upload tool -> [SUCCESS] Source should be available at https://git.centos.org/sources/centpkg-minimal/c7-sig-core/d6616b89617914a0dd0fd5cfa06b0afc7a4541c4
```
Now that we have uploaded to lookaside cache, we can reference it in our /rpms/centpkg-minimal git repository on git.centos.org, see below
## Pushing to git.centos.org
We should already have a local checkout of the git repository for the pkg we'd like to work on. In our case, the git repo url is https://git.centos.org/rpms/centpkg-minimal
So the way to git clone/pull over ssh is so ssh://git@git.centos.org/rpms/centpkg-minimal.git :
```
git clone ssh://git@git.centos.org/rpms/centpkg-minimal.git
Cloning into 'centpkg-minimal'...
remote: Counting objects: 15, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 15 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (15/15), done.
Resolving deltas: 100% (2/2), done.
```
!!! important
You can clone over https, but then it wouldn't let you push back to it, as it needs ssh with key verification and based on group membership for acls
Let's create a new c7-sig-core branch (still based on the assumption that I want to build for c7) :
```
git checkout -b c7-sig-core
```
You can now create your SPECS/<pkg_name>.spec and add also other text patches under SOURCES/ We still need also to point to /sources/ for the lookaside cache, so we'll use the value of the hash returned when we successfully uploaded to lookaside cache and we'll write a .`<pkg_name>`.metadata file in the root dir that will look like this in our example:
```
d6616b89617914a0dd0fd5cfa06b0afc7a4541c4 SOURCES/centpkg-minimal.tar.gz
```
Now that we have pointer to lookaside cache, and also .spec, we can push back to git and we should be able to proceed with the "build-from-git" on cbs.centos.org. Let's commit first :
!!! important
Even if your package doesn't contain any source pushed to lookaside cache (like for a package just having some small files in SOURCES/ dir, you *need* to have the `.<pkg_name>.metadata` package present and pushed in git repository
Here is what the git repository for a pkg should look like :
```
.
├── .<pkg_name>.metadata
├── SOURCES
│ ├── <optional_file>
│ └── <optional_patch>
└── SPECS
└── <pkg_name>.spec
```
You can now push to to git, as usual:
```
# git add <files> # if needed
git commit -a
git push origin c7-sig-core # to create the c7-sig-core branch on git.centos.org if not existing yet
```
Now that we have our sources pushed to both git.centos.org and lookaside cache, we can now proceed with a build in cbs/koji
!!! note
It's worth knowing that the documented process and structure is the default one, aka `rpmbuild style` layout for how your files/sources should be declared in your git repository/branch. But since 2022-02-21, the `flat layout` (as used also on [Fedora](https://src.fedoraproject.org) dist-git server) can also be used on git.centos.org. You still need to push tarballs to lookaside but you can use the flat layout when importing from Fedora/Epel, and it's purely an opt-in choice, and so not the default one that SIGs are using for years now