Statuss
Pitmaster aprēķina darba koka statusu, salīdzinot trīs stāvokļus: HEAD komita koku, indeksu (pievienošanas apgabalu) un darba koku (faktiskos failus diskā). CLI izvada kopsavilkumu git status stilā, bet statusPorcelainV2() izvada git porcelāna formātu v2.
Pamata lietojums
$entries = $repo->status();
foreach ($entries as $entry) {
echo $entry->shortFormat() . "\n";
}
shortFormat() izvada git īso formātu:
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
Katra faila statusu attēlo 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() neziņo par ignorētajiem failiem, tāpēc Ignored tā rezultātā nav redzams.
Porcelāna v2 izvade
Mašīnlasāmai statusa izvadei, kas atbilst git status --porcelain=v2:
echo $repo->statusPorcelainV2();
Izvade:
1 .M N... 100644 100644 100644 ce013625030ba8dba906f756967f9e9ca394464a ce013625030ba8dba906f756967f9e9ca394464a modified-file.txt
? untracked-file.txt
Vispirms tiek parādīti izsekotie ieraksti, pēc tam neizsekotie. Pārdēvēšanā tiek izmantotas 2 rindas, bet konfliktos — u rindas. git status --porcelain=v2 --branch galvenes # branch netiek izvadītas, un ignorētie faili netiek uzskaitīti.
Statusa aprēķināšana
Klase WorkingTreeStatus veic trīsvirzienu salīdzināšanu:
use Pitmaster\Status\WorkingTreeStatus;
$status = new WorkingTreeStatus($repo->objectDatabase(), $repo->workDir(), $repo->gitDir());
$entries = $status->compute($repo->index(), $repo->resolve('HEAD'));
1. darbība: HEAD koka kartes izveide
Izlīdzina HEAD komita koku līdz path => blob hash kartei. Tā attēlo pēdējo komitēto stāvokli.
2. darbība: HEAD salīdzināšana ar indeksu
Katram failam HEAD kokā un indeksā:
- HEAD ir, bet indeksā nav:
Deletedindeksa kolonnā - Indeksā ir, bet HEAD nav:
Addedindeksa kolonnā - Ir abos, bet atšķiras jaucējvērtība:
Modifiedindeksa kolonnā - Ir abos ar vienādu jaucējvērtību:
Unmodifiedindeksa kolonnā
3. darbība: indeksa salīdzināšana ar darba koku
Katram failam indeksā un darba kokā:
- Ir indeksā, bet nav diskā:
Deleteddarba koka kolonnā - Ir abos, bet saturs atšķiras:
Modifieddarba koka kolonnā - Ir abos ar vienādu saturu:
Unmodifieddarba koka kolonnā
4. darbība: neizsekoto failu noteikšana
Pārlūko darba koka direktoriju, izlaiž .git/ un ignorētos ceļus un ziņo par failiem, kuru nav indeksā, kā Untracked abās kolonnās.
.gitignore atbalsts
Pitmaster parsē .gitignore failus, lai noteiktu, kuri neizsekotie faili jāuzrāda kā ignorēti un kuri — kā neizsekoti.
use Pitmaster\Status\GitIgnore;
Klase GitIgnore parsē gitignore šablonus no:
.gitignorerepozitorija saknē.gitignoreapakšdirektorijos.git/info/exclude
Atbalstītā šablonu sintakse:
- Glob šabloni (
*.log,build/) - Noliegums (
!important.log) - Tikai direktorijiem paredzēti šabloni (beigu
/) - Sākuma
/saknes relatīvajiem šabloniem **rekursīvai atbilstības noteikšanai
Statusa ierakstu kategorizēšana
Izplatīts UI attēlošanas paņēmiens:
$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 lietojums
./vendor/bin/pitmaster status
Izvade:
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 ietver palīgfunkciju git failu sistēmas pārraudzības protokolam:
use Pitmaster\Status\Fsmonitor;
Fsmonitor klase var vaicāt core.fsmonitor āķim (ja tas nav pieejams, tiek pārbaudīti failu modificēšanas laiki), lai noskaidrotu, kuri faili ir mainījušies kopš norādītā marķiera. Tā tiek izslēgta failu deskriptoriem, kas atvērti ar ['processes' => false]. Pašlaik status() to neizsauc; tā tieši salīdzina stat datus un saturu.