Liigu sisu juurde

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

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

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

shortFormat() väljastab giti lühivormingu:

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

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

PHP
echo $repo->statusPorcelainV2();

Väljund:

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

PHP
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: Deleted indeksi veerus
  • Indeksis, aga mitte HEAD-is: Added indeksi veerus
  • Mõlemas, kuid erineva räsiga: Modified indeksi veerus
  • Mõlemas sama räsiga: Unmodified indeksi veerus

3. samm: indeksi ja tööpuu võrdlemine

Iga faili kohta indeksis ja tööpuus:

  • Indeksis, aga kettal mitte: Deleted tööpuu veerus
  • Mõlemas, kuid sisu erineb: Modified tööpuu veerus
  • Mõlemas ja sisu kattub: Unmodified töö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.

PHP
use Pitmaster\Status\GitIgnore;

Klass GitIgnore parsib gitignore'i mustreid järgmistest asukohtadest:

  • .gitignore hoidla juurkataloogis
  • .gitignore alamkataloogides
  • .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:

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 kasutamine

Shell
./vendor/bin/pitmaster status

Väljund:

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

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