Exemple #1
0
 /**
  * @brief Fetch an object in its binary representation by name.
  *
  * Throws an exception if the object cannot be found.
  *
  * @param $object_name (string) name of the object (binary SHA1)
  * @return (array) an array consisting of the object type name (string) and the
  * binary representation of the object (string)
  */
 public function getRawObject(SHA $sha)
 {
     static $cache = array();
     /* FIXME allow limiting the cache to a certain size */
     if (!isset($cache[(string) $sha])) {
         $path = sprintf('%s/objects/%s/%s', $this->dir, substr($sha->hex(), 0, 2), substr($sha->hex(), 2));
         if (file_exists($path)) {
             list($hdr, $object_data) = explode("", gzuncompress(file_get_contents($path)), 2);
             sscanf($hdr, "%s %d", $type, $object_size);
             $cache[(string) $sha] = array($type, $object_data);
         } else {
             if ($x = $this->findPackedObject($sha)) {
                 list($pack_sha, $object_offset) = $x;
                 $pack = fopen(sprintf('%s/objects/pack/pack-%s.pack', $this->dir, $pack_sha->hex()), 'rb');
                 flock($pack, LOCK_SH);
                 /* check magic and version */
                 $magic = fread($pack, 4);
                 $version = Binary::fuint32($pack);
                 if ($magic != 'PACK' || $version != 2) {
                     throw new Exception('unsupported pack format');
                 }
                 $cache[(string) $sha] = $this->unpackObject($pack, $object_offset);
                 fclose($pack);
             } else {
                 throw new Exception(sprintf('object not found: %s', $sha->hex()));
             }
         }
     }
     return $cache[(string) $sha];
 }