Olek
Pitmaster arvutab tööpuu oleku, võrreldes kolme olekut: HEAD-commit'i puud, indeksit (ettevalmistusala) ja tööpuud (kettal olevaid tegelikke faile). CLI väljastab selle põhjal git status-stiilis kokkuvõtte ning statusPorcelainV2() väljastab giti porcelaini v2-vormingus tulemuse.
Põhikasutus
$entries = $repo->status();
foreach ($entries as $entry) {
echo $entry->shortFormat() . "\n";
}
shortFormat() väljastab giti lühivormingu:
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
Iga faili olekut tähistab 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 enum
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() ei anna teada eiratavatest failidest, seega Ignored selle tulemuses ei esine.
Porcelaini v2 väljund
Masinloetava olekuväljundi saamiseks, mis vastab vormingule git status --porcelain=v2:
echo $repo->statusPorcelainV2();
Väljund:
1 .M N... 100644 100644 100644 ce013625030ba8dba906f756967f9e9ca394464a ce013625030ba8dba906f756967f9e9ca394464a modified-file.txt
? untracked-file.txt
Jälgitavad kirjed tulevad enne, seejärel jälgimata kirjed. Ümbernimetamised kasutavad 2 ridu ja konfliktid u ridu. git status --porcelain=v2 --branch päiseid # branch ei väljastata ning eiratavaid faile ei loetleta.
Kuidas olek arvutatakse
Klass WorkingTreeStatus teeb kolme oleku võrdluse:
use Pitmaster\Status\WorkingTreeStatus;
$status = new WorkingTreeStatus($repo->objectDatabase(), $repo->workDir(), $repo->gitDir());
$entries = $status->compute($repo->index(), $repo->resolve('HEAD'));
1. samm: HEAD-i puukaardi koostamine
Lamedaks kaardiks kujundatakse HEAD-commit'i puu, kus on path => blob hash. See esindab viimati commit'itud olekut.
2. samm: HEAD-i ja indeksi võrdlemine
Iga faili kohta HEAD-i puus ja indeksis:
- HEAD-is, aga mitte indeksis:
Deletedindeksi veerus - Indeksis, aga mitte HEAD-is:
Addedindeksi veerus - Mõlemas, kuid erineva räsiga:
Modifiedindeksi veerus - Mõlemas sama räsiga:
Unmodifiedindeksi veerus
3. samm: indeksi ja tööpuu võrdlemine
Iga faili kohta indeksis ja tööpuus:
- Indeksis, aga kettal mitte:
Deletedtööpuu veerus - Mõlemas, kuid sisu erineb:
Modifiedtööpuu veerus - Mõlemas ja sisu kattub:
Unmodifiedtööpuu veerus
4. samm: jälgimata failide tuvastamine
Käib tööpuu kataloogid läbi, jätab vahele .git/ ja eiratavad teed ning teatab failid, mida indeksis pole, märkides mõlemasse veergu Untracked.
.gitignore'i tugi
Pitmaster parsib .gitignore faile, et määrata, millised jälgimata failid tuleb märkida eiratavaks ja millised jälgimata failideks.
use Pitmaster\Status\GitIgnore;
Klass GitIgnore parsib gitignore'i mustreid järgmistest asukohtadest:
.gitignorehoidla juurkataloogis.gitignorealamkataloogides.git/info/exclude
Toetatud mustrisüntaks:
- Globbing-mustrid (
*.log,build/) - Eitus (
!important.log) - Ainult kataloogidele kehtivad mustrid (lõpus
/) - Alguses olev
/juurkataloogiga seotud mustrite jaoks **rekursiivseks sobitamiseks
Oleku kirjete kategoriseerimine
Levinud muster UI kuvamiseks:
$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;
}
}
CLI kasutamine
./vendor/bin/pitmaster status
Väljund:
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 sisaldab git fsmonitor-protokolli abifunktsiooni:
use Pitmaster\Status\Fsmonitor;
Klass Fsmonitor saab pärida core.fsmonitor hook'ilt (muutmisaja kontrollimise varuvariandiga), et teada saada, millised failid on pärast märgist muutunud. See lülitab end välja käitlejatel, mis on avatud valikuga ['processes' => false]. status() seda praegu ei kutsu; see võrdleb otse faili stat-andmeid ja sisu.