Preskoči na vsebino

Branje repozitorijev

Pitmaster bere repozitorije git tako, da neposredno razčleni oblike zapisov na disku: samostojne objekte (datoteke, stisnjene z zlib, v .git/objects/), paketne datoteke (.git/objects/pack/), reference (datoteke v .git/refs/ in packed-refs) ter indeks (.git/index).

Odpiranje repozitorija

PHP
use Pitmaster\Pitmaster;

$repo = Pitmaster::open('/path/to/project');

Pitmaster podpira tri postavitve repozitorijev:

  1. Običajni repozitoriji: .git je imenik v korenu projekta.
  2. Povezana delovna drevesa: .git je datoteka, ki vsebuje gitdir: <path> in kaže na .git/worktrees/<name>/.
  3. Goli repozitoriji: sama pot vsebuje HEAD, objects/ itd.
PHP
// Detection helpers
Pitmaster::isRepository('/path');  // true for any of the above
Pitmaster::isWorktree('/path');    // true only for linked worktrees

Branje objektov

Vsak podatek v repozitoriju git je shranjen kot objekt, določen z zgoščeno vrednostjo: privzeto SHA-1 (40 šestnajstiških znakov) ali SHA-256 (64 šestnajstiških znakov) v repozitorijih, ustvarjenih z Pitmaster::init($path, 'sha256'). Obstajajo štiri vrste objektov: blob, drevo, potrditev in oznaka.

Spodnje metode, ki uporabljajo zgoščeno vrednost, zahtevajo celotno šestnajstiško vrednost; okrajšane vrednosti niso sprejete.

readObject

PHP
use Pitmaster\Object\Blob;
use Pitmaster\Object\Tree;
use Pitmaster\Object\Commit;
use Pitmaster\Object\Tag;

$object = $repo->readObject('a1b2c3d4e5f6...');

match (true) {
    $object instanceof Blob   => handleBlob($object),
    $object instanceof Tree   => handleTree($object),
    $object instanceof Commit => handleCommit($object),
    $object instanceof Tag    => handleTag($object),
};

Objekti se najprej poiščejo v samostojni shrambi, nato v paketnih datotekah. Iskanje v paketnih datotekah za binarno iskanje uporablja razpršeno tabelo .idx za O(log n).

catFile

Za preprost priklic vsebine brez preverjanja vrste:

PHP
$content = $repo->catFile('a1b2c3d4e5f6...');
echo $content;

objectExists

PHP
if ($repo->objectExists('a1b2c3d4e5f6...')) {
    // Object is in the repository
}

listObjects

PHP
$hashes = $repo->listObjects();
// ['a1b2c3d4...', 'f6e5d4c3...', ...]

Vrne šestnajstiške zgoščene vrednosti vseh objektov (samostojnih in v paketih).

Delo z objekti blob

Objekt blob vsebuje neobdelano vsebino datoteke.

PHP
$blob = $repo->readObject($hash);
echo $blob->content;     // Raw file bytes
echo $blob->size();      // Content length
echo $blob->id->hex;     // Object hash

Delo z drevesi

Drevo je seznam imenikov. Vsak vnos ima način, ime in zgoščeno vrednost.

PHP
$tree = $repo->readObject($hash);

foreach ($tree->entries as $entry) {
    echo "{$entry->mode} {$entry->name} {$entry->hash->hex}\n";
    // 100644 README.md abc123...
    // 40000 src def456...
    // 100755 deploy.sh 789012...

    if ($entry->isTree()) {
        // Recurse into subdirectory (mode 40000)
    } elseif ($entry->isExecutable()) {
        // Executable file (mode 100755)
    } elseif ($entry->isBlob()) {
        // Regular file (any 10xxxx mode, so executables match too)
    } elseif ($entry->isSymlink()) {
        // Symbolic link (mode 120000)
    } elseif ($entry->isGitlink()) {
        // Submodule (mode 160000)
    }
}

Delo s potrditvami

Potrditev povezuje posnetek drevesa z njegovimi nadrejenimi elementi in metapodatki.

PHP
$commit = $repo->head();

echo $commit->id->hex;      // Full object hash
echo $commit->tree->hex;    // Tree object hash
echo $commit->author;       // "Name <email> timestamp tz"
echo $commit->committer;    // "Name <email> timestamp tz"
echo $commit->message;      // Full commit message

// Parent commits
foreach ($commit->parents as $parentId) {
    $parent = $repo->readObject($parentId->hex);
}

// Merge detection
if ($commit->isMerge()) {
    // Two or more parents
}

Delo z oznakami

Označene oznake so objekti s ciljem, vrsto, imenom, avtorjem oznake in sporočilom.

PHP
$tag = $repo->readObject($hash);

echo $tag->object->hex;           // Target object hash
echo $tag->objectType->value;     // 'commit', 'tree', 'blob', or 'tag'
echo $tag->name;            // Tag name
echo $tag->tagger;          // "Name <email> timestamp tz"
echo $tag->message;         // Tag message

Branje sklicev

Trenutni HEAD

PHP
$commit = $repo->head();

Razreši HEAD (po simboličnih sklicih, kot je HEAD -> refs/heads/main -> commit hash) in vrne objekt potrditve.

Trenutna veja

PHP
$branch = $repo->branch();  // 'main' or null if detached

Seznam vej in oznak

PHP
$branches = $repo->branches();  // ['bugfix/typo', 'feature/login', 'main']
$tags = $repo->tags();          // ['v1.0.0', 'v1.1.0']

Vsi sklici

PHP
$refs = $repo->allRefs();
// [
//     'refs/heads/main' => 'abc123...',
//     'refs/heads/feature' => 'def456...',
//     'refs/tags/v1.0.0' => '789012...',
//     'refs/remotes/origin/main' => 'abc123...',
// ]

Razreševanje revizij

PHP
$id = $repo->resolve('HEAD');
$id = $repo->resolve('main');
$id = $repo->resolve('v1.0.0');
$id = $repo->resolve('HEAD~3');
$id = $repo->resolve('main^2');
$id = $repo->resolve('3f2c1e0b9d6a4f8e7c5b2a1d0e9f8c7b6a5d4e3f');

Razčlenjevalnik revizij podpira operatorja ~N (prednik) in ^N (nadrejeni element), ki ju je mogoče poljubno verižno povezati. Zgoščene vrednosti je treba navesti v celoti.

Pregledovanje zgodovine potrditev

log

Potrditve so vrnjene od najnovejše do najstarejše, razvrščene po časovnem žigu potrditelja.

PHP
// Last 20 commits from HEAD
$commits = $repo->log(20);

foreach ($commits as $commit) {
    $short = substr($commit->id->hex, 0, 7);
    echo "{$short} {$commit->message}\n";
}

Dnevnik od določene potrditve

PHP
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);

Dnevnik, filtriran po poti datoteke

PHP
$commits = $repo->logPath('src/Repository.php', 20);

Vrne samo potrditve, v katerih je bila navedena datoteka spremenjena (dodana, urejena, izbrisana ali preimenovana) glede na prvega nadrejenega elementa. Pot mora biti natančna pot do datoteke; imeniki se ne ujemajo. Pregleda se samo najnovejših 5 * $limit potrditev, zato starejša ujemanja lahko manjkajo (#7).

show

PHP
$result = $repo->show('HEAD');
$commit = $result['commit'];
$diffs = $result['diff'];

echo "Author: {$commit->author}\n";
echo "Message: {$commit->message}\n\n";

foreach ($diffs as $diff) {
    echo $diff->format();
}

Zaznavanje privzete veje

PHP
$default = $repo->defaultBranch();
// Checks: remote HEAD symref -> local HEAD -> main/master fallback

Ko je nastavljen remote.origin.url in so procesi omogočeni, prvo preverjanje pošlje oddaljenemu repozitoriju pametno zahtevo HTTP. Omrežne napake so prezrte, nato se izvedejo lokalna preverjanja.

Predništvo pri združevanju

PHP
// Is feature fully merged into main?
$merged = $repo->isBranchMerged('feature/done', 'main');

// Find the merge base of two commits
$base = $repo->mergeBase(
    $repo->resolve('main'),
    $repo->resolve('feature/login'),
);