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
$entries = $repo->status();
foreach ($entries as $entry) {
echo $entry->shortFormat() . "\n";
}
shortFormat() skriver ut gits korta format:
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:
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
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:
echo $repo->statusPorcelainV2();
Utdata:
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:
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:
Deletedi indexkolumnen - Finns i indexet men inte i HEAD:
Addedi indexkolumnen - Finns i båda men har olika hash:
Modifiedi indexkolumnen - Finns i båda med samma hash:
Unmodifiedi 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:
Deletedi arbetsträdeskolumnen - Finns i båda men innehållet skiljer sig:
Modifiedi arbetsträdeskolumnen - Finns i båda med matchande innehåll:
Unmodifiedi 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.
use Pitmaster\Status\GitIgnore;
Klassen GitIgnore tolkar gitignore-mönster från:
.gitignorei arkivets rot.gitignorei 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:
$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
./vendor/bin/pitmaster status
Utdata:
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:
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.