Hoppa till innehåll

Status

Pitmaster beräknar arbetsträdets status genom att jämföra tre tillstånd: HEAD-incheckningens träd, indexet (mellanlagringsområdet) och arbetsträdet (de faktiska filerna på disken). CLI skriver ut en sammanfattning i git status-stil, och statusPorcelainV2() skriver ut gits porcelain-format v2.

Grundläggande användning

PHP
$entries = $repo->status();

foreach ($entries as $entry) {
    echo $entry->shortFormat() . "\n";
}

shortFormat() skriver ut gits korta format:

Kod
M  src/Modified.php          (staged modification)
 M src/WorktreeModified.php  (unstaged modification)
A  src/NewFile.php           (staged new file)
 D src/Deleted.php           (deleted in worktree)
?? untracked.txt             (untracked file)

StatusEntry

Varje fils status representeras av en StatusEntry:

PHP
use Pitmaster\Status\StatusEntry;

$entry->path;       // File path relative to repo root
$entry->index;      // FileStatus: HEAD-to-index state
$entry->worktree;   // FileStatus: index-to-worktree state
$entry->origPath;   // Original path for renamed entries, otherwise null
$entry->renameScore; // Similarity score for renamed entries, otherwise null
$entry->shortFormat(); // "XY path", "?? path", or "R  old -> new"

FileStatus-uppräkning

PHP
use Pitmaster\Status\FileStatus;

FileStatus::Added;      // 'A' - new file
FileStatus::Modified;   // 'M' - content changed
FileStatus::Deleted;    // 'D' - file removed
FileStatus::Renamed;    // 'R' - file renamed
FileStatus::Copied;     // 'C' - file copied
FileStatus::Unmerged;   // 'U' - unresolved merge conflict
FileStatus::Untracked;  // '?' - not in index
FileStatus::Ignored;    // '!' - matched by .gitignore
FileStatus::Unmodified; // ' ' - no change

status() rapporterar inte ignorerade filer, så Ignored förekommer inte i resultatet.

Utdata i porcelain-format v2

För maskinläsbar statusutdata som matchar git status --porcelain=v2:

PHP
echo $repo->statusPorcelainV2();

Utdata:

Kod
1 .M N... 100644 100644 100644 ce013625030ba8dba906f756967f9e9ca394464a ce013625030ba8dba906f756967f9e9ca394464a modified-file.txt
? untracked-file.txt

Spårade poster kommer först, följt av ospårade. Namnbyten använder rader av typen 2 och konflikter rader av typen u. Rubrikerna # branch för git status --porcelain=v2 --branch skrivs inte ut, och ignorerade filer listas inte.

Så beräknas status

Klassen WorkingTreeStatus utför jämförelsen mellan de tre tillstånden:

PHP
use Pitmaster\Status\WorkingTreeStatus;

$status = new WorkingTreeStatus($repo->objectDatabase(), $repo->workDir(), $repo->gitDir());
$entries = $status->compute($repo->index(), $repo->resolve('HEAD'));

Steg 1: Skapa en mappning av HEAD-trädet

Platta till HEAD-incheckningens träd till en mappning av path => blob hash. Den representerar det senast incheckade tillståndet.

Steg 2: Jämför HEAD med indexet

För varje fil i HEAD-trädet och indexet:

  • Finns i HEAD men inte i indexet: Deleted i indexkolumnen
  • Finns i indexet men inte i HEAD: Added i indexkolumnen
  • Finns i båda men har olika hash: Modified i indexkolumnen
  • Finns i båda med samma hash: Unmodified i indexkolumnen

Steg 3: Jämför indexet med arbetsträdet

För varje fil i indexet och arbetsträdet:

  • Finns i indexet men inte på disken: Deleted i arbetsträdeskolumnen
  • Finns i båda men innehållet skiljer sig: Modified i arbetsträdeskolumnen
  • Finns i båda med matchande innehåll: Unmodified i arbetsträdeskolumnen

Steg 4: Identifiera ospårade filer

Gå igenom arbetsträdets katalog, hoppa över .git/ och ignorerade sökvägar och rapportera filer som inte finns i indexet som Untracked i båda kolumnerna.

Stöd för .gitignore

Pitmaster tolkar .gitignore-filer för att avgöra vilka ospårade filer som ska rapporteras som ignorerade respektive ospårade.

PHP
use Pitmaster\Status\GitIgnore;

Klassen GitIgnore tolkar gitignore-mönster från:

  • .gitignore i arkivets rot
  • .gitignore i underkataloger
  • .git/info/exclude

Syntax för mönster som stöds:

  • Globmönster (*.log, build/)
  • Negering (!important.log)
  • Mönster som endast gäller kataloger (avslutande /)
  • Inledande / för mönster relativa till roten
  • ** för rekursiv matchning

Kategorisera statusposter

Ett vanligt mönster för visning av UI:

PHP
$staged = [];
$unstaged = [];
$untracked = [];

foreach ($repo->status() as $entry) {
    if ($entry->index === FileStatus::Untracked) {
        $untracked[] = $entry;
    } elseif ($entry->index !== FileStatus::Unmodified) {
        $staged[] = $entry;
    }

    if ($entry->worktree !== FileStatus::Unmodified
        && $entry->index !== FileStatus::Untracked
    ) {
        $unstaged[] = $entry;
    }
}

Användning av CLI

Shell
./vendor/bin/pitmaster status

Utdata:

Kod
On branch main

Changes to be committed:
	new file:   src/Feature.php

Changes not staged for commit:
	modified:   src/Existing.php

Untracked files:
	notes.txt

Fsmonitor

Pitmaster innehåller en hjälpfunktion för gits fsmonitor-protokoll:

PHP
use Pitmaster\Status\Fsmonitor;

Klassen Fsmonitor kan fråga kroken core.fsmonitor (och falla tillbaka på en skanning av ändringstider) för att ta reda på vilka filer som ändrats sedan en token. Den stänger av sig själv för handtag som öppnats med ['processes' => false]. status() anropar den inte för tillfället; den jämför stat-data och innehåll direkt.