Pāriet uz saturu

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

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

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

shortFormat() izvada git īso formātu:

Kods
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:

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 enum

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() 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:

PHP
echo $repo->statusPorcelainV2();

Izvade:

Kods
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:

PHP
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: Deleted indeksa kolonnā
  • Indeksā ir, bet HEAD nav: Added indeksa kolonnā
  • Ir abos, bet atšķiras jaucējvērtība: Modified indeksa kolonnā
  • Ir abos ar vienādu jaucējvērtību: Unmodified indeksa kolonnā

3. darbība: indeksa salīdzināšana ar darba koku

Katram failam indeksā un darba kokā:

  • Ir indeksā, bet nav diskā: Deleted darba koka kolonnā
  • Ir abos, bet saturs atšķiras: Modified darba koka kolonnā
  • Ir abos ar vienādu saturu: Unmodified darba 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.

PHP
use Pitmaster\Status\GitIgnore;

Klase GitIgnore parsē gitignore šablonus no:

  • .gitignore repozitorija saknē
  • .gitignore apakš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:

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;
    }
}

CLI lietojums

Apvalks
./vendor/bin/pitmaster status

Izvade:

Kods
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:

PHP
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.