
# Kom igång

## Installation

Installera Pitmaster via Composer:

```bash
composer require pitmaster/pitmaster
```

## Krav

- **PHP 8.2+** med skrivskyddade klasser, enum-typer och konstruktorfrämjande
- **ext-zlib** för objektkomprimering/dekomprimering (inbyggt i de flesta installationer)
- **ext-json** för åtgärdstillståndsfiler och Git LFS-API-nyttolaster
- **ext-mbstring**, deklarerat i `composer.json`, så Composer kräver det vid installationen
- **ext-ctype** för hashvalidering (aktiverat i de flesta PHP-byggen, men inte deklarerat i `composer.json`)

Grundläggande förrådsåtgärder kräver inte binärfilen `git`, FFI eller externa hjälpverktyg. Valfria funktioner har ytterligare körningskrav: körning av hooks använder `proc_open()`, och transport via SSH använder `ext-ssh2` när det är inläst; annars startas systemets binärfil `ssh` via `proc_open()`.

## Öppna ett befintligt förråd

```php
use Pitmaster\Pitmaster;

$repo = Pitmaster::open('/path/to/project');
```

Detta öppnar förrådet på den angivna sökvägen. Pitmaster hittar katalogen `.git` (eller löser en `.git`-fil för länkade arbetskataloger) och initierar objektdatabasen, referensdatabasen och konfigurationen.

`open()`, `init()` och `clone()` accepterar en alternativmatris som sitt sista argument:

```php
// Do not run .git/hooks scripts for this handle
$repo = Pitmaster::open('/path/to/project', ['hooks' => false]);

// Do not start any process: no hooks, no fsmonitor hook, no clone/fetch/push, no SSH
$repo = Pitmaster::open('/path/to/project', Pitmaster::processFreeOptions());
```

Hooks körs som standard. `Pitmaster::processFreeOptions()` returnerar `['processes' => false, 'hooks' => false]`; lokala läsningar och skrivningar fungerar fortfarande med ett sådant handtag.

## Kontrollera om en sökväg är ett förråd

```php
if (Pitmaster::isRepository('/path/to/project')) {
    $repo = Pitmaster::open('/path/to/project');
}
```

## Initiera ett nytt förråd

```php
$repo = Pitmaster::init('/path/to/new-project');
```

Detta skapar katalogstrukturen `.git` med objekt, referenser, HEAD (som pekar på `refs/heads/main`) och en standardkonfiguration.

Skapa ett förråd av typen SHA-256 genom att ange objektformatet som det andra argumentet:

```php
$repo = Pitmaster::init('/path/to/new-project', 'sha256');
```

Objekt-ID:n i det förrådet är 64 hexadecimala tecken, och konfigurationen registrerar `extensions.objectformat = sha256`. Förråd som öppnas senare hämtar formatet från den konfigurationsposten.

## Läs HEAD-committen

```php
$head = $repo->head();

echo "Commit: {$head->id->hex}\n";
echo "Author: {$head->author}\n";
echo "Message: {$head->message}\n";
```

Metoden `head()` löser upp HEAD (följer symboliska referenser) och returnerar ett `Commit`-objekt.

## Lista grenar och taggar

```php
// All branch names
$branches = $repo->branches();
// ['main', 'feature/login', 'bugfix/typo']

// Current branch name (null if detached)
$current = $repo->branch();
// 'main'

// All tag names
$tags = $repo->tags();
// ['v1.0.0', 'v1.1.0']
```

## Gå igenom commit-historiken

```php
// Last 20 commits from HEAD
$commits = $repo->log(20);

foreach ($commits as $commit) {
    echo substr($commit->id->hex, 0, 7) . " {$commit->message}\n";
}
```

Du kan också börja från en specifik commit:

```php
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);
```

## Kontrollera arbetskatalogens status

```php
use Pitmaster\Status\FileStatus;

$entries = $repo->status();

foreach ($entries as $entry) {
    if ($entry->index === FileStatus::Untracked) {
        echo "?? {$entry->path}\n";
    } elseif ($entry->index === FileStatus::Modified) {
        echo "M  {$entry->path}\n";
    } elseif ($entry->worktree === FileStatus::Modified) {
        echo " M {$entry->path}\n";
    }
}
```

## Lägg till filer i staging och skapa en commit

```php
// Stage specific files
$repo->add('src/Feature.php', 'tests/FeatureTest.php');

// Create a commit
$commitId = $repo->commit('Add new feature with tests');

echo "Created commit: {$commitId->hex}\n";
```

Författarens namn och e-postadress hämtas i följande ordning: miljövariablerna `PITMASTER_AUTHOR_NAME` / `PITMASTER_AUTHOR_EMAIL`, miljövariablerna `GIT_AUTHOR_NAME` / `GIT_AUTHOR_EMAIL`, konstanterna `PITMASTER_AUTHOR_NAME` / `PITMASTER_AUTHOR_EMAIL`, förrådets egen `.git/config` (`user.name` och `user.email`) och slutligen `Pitmaster <pitmaster@localhost>`. Endast förrådets konfigurationsfil (och filer som den inkluderar) läses, inte `~/.gitconfig`. Commit-författaren hämtas på samma sätt från namnen `*_COMMITTER_*` och faller tillbaka på författarkonstanterna.

## Beräkna skillnader

```php
// Unstaged changes (worktree vs index)
$diffs = $repo->diff();

foreach ($diffs as $diff) {
    echo $diff->format(); // Unified diff output
}

// Staged changes (index vs HEAD)
$staged = $repo->diffStaged();
```

## Klona ett fjärrförråd

```php
$repo = Pitmaster::clone('https://github.com/user/repo.git', '/path/to/destination');
```

Det här upptäcker referenser, hämtar pack-filen, konfigurerar fjärrspårningsgrenar och checkar ut standardgrenen. HTTP(S) URL:er använder smart HTTP och faller tillbaka på dumb HTTP; SSH-URL:er använder transporten SSH. Ange ett djup som det tredje argumentet för en ytlig klon: `Pitmaster::clone($url, $path, 1)`.

## Läs valfritt objekt med hash

```php
$object = $repo->readObject($fullHash); // full 40-character (or 64 for SHA-256) hex hash

if ($object instanceof \Pitmaster\Object\Blob) {
    echo $object->content;
} elseif ($object instanceof \Pitmaster\Object\Commit) {
    echo $object->message;
}
```

## Konfiguration

Pitmaster följer repositoryts `.git/config` för författarinformation och fjärr-URL:er. Du kan också ange globala standardvärden med konstanterna PHP som definieras innan Pitmaster körs:

```php
define('PITMASTER_AUTHOR_NAME', 'Your Name');
define('PITMASTER_AUTHOR_EMAIL', 'you@example.com');
define('PITMASTER_HTTP_TIMEOUT', 60);        // Seconds
define('PITMASTER_MAX_DELTA_CHAIN', 50);     // Max delta chain depth
define('PITMASTER_OBJECT_CACHE_BYTES', '64M');
```

| Konstant | Standardvärde | Effekt |
|----------|---------|--------|
| `PITMASTER_AUTHOR_NAME`, `PITMASTER_AUTHOR_EMAIL` | none | Författaridentitet (se ordningen ovan) |
| `PITMASTER_COMMITTER_NAME`, `PITMASTER_COMMITTER_EMAIL` | författarvärden | Committeridentitet |
| `PITMASTER_HTTP_TIMEOUT` | `30` | Timeout i sekunder för smart HTTP (heltal) |
| `PITMASTER_MAX_DELTA_CHAIN` | `50` | Maximalt djup för deltakedjor vid läsning av pack-filer (heltal) |
| `PITMASTER_OBJECT_CACHE_ENTRIES` | `1024` | Objekt som behålls i objektcachen i minnet |
| `PITMASTER_OBJECT_CACHE_BYTES` | `16M` | Bytegräns för objektcachen |
| `PITMASTER_PACK_RESOLVED_CACHE_ENTRIES` | `4096` | Lösta deltaobjekt som cachas per pack |
| `PITMASTER_PACK_RESOLVED_CACHE_BYTES` | `32M` | Bytegräns för den packcachen |
| `PITMASTER_MAX_PACK_MEMORY` | none | Äldre namn för packcachens bytegräns, används endast när `PITMASTER_PACK_RESOLVED_CACHE_BYTES` inte är definierad |

Bytevärden godtar ett heltal eller en sträng med suffixet `k`, `m` eller `g` (`'256M'`). Ogiltiga värden återgår till standardvärdet.

Miljövariabler åsidosätter identitetskonstanterna: `PITMASTER_AUTHOR_NAME`, `PITMASTER_AUTHOR_EMAIL`, `PITMASTER_AUTHOR_DATE`, motsvarande `PITMASTER_COMMITTER_*`-variabler samt gits egna variabler `GIT_AUTHOR_*` och `GIT_COMMITTER_*`. Transporten SSH läser variablerna `PITMASTER_SSH_*`, som beskrivs i [Protokoll](https://pitmaster.inline0.dev/sv/docs/network/protocols).

Det finns ingen konstant för hash-algoritmen. Objektformatet väljs när repot skapas (`Pitmaster::init($path, 'sha256')` eller `init --object-format=sha256` på CLI) och läses därefter från repots konfiguration.
