@@ -208,34 +208,7 @@ public static function downloadFile(string $name, string $url, string $filename,
208208 if ($ download_as === SPC_DOWNLOAD_PRE_BUILT ) {
209209 $ name = self ::getPreBuiltLockName ($ name );
210210 }
211- self ::lockSource ($ name , ['source_type ' => SPC_SOURCE_ARCHIVE , 'filename ' => $ filename , 'move_path ' => $ move_path , 'lock_as ' => $ download_as ]);
212- }
213-
214- /**
215- * Try to lock source.
216- *
217- * @param string $name Source name
218- * @param array{
219- * source_type: string,
220- * dirname: ?string,
221- * filename: ?string,
222- * move_path: ?string,
223- * lock_as: int
224- * } $data Source data
225- * @throws FileSystemException
226- */
227- public static function lockSource (string $ name , array $ data ): void
228- {
229- if (!file_exists (FileSystem::convertPath (DOWNLOAD_PATH . '/.lock.json ' ))) {
230- $ lock = [];
231- } else {
232- $ lock = json_decode (FileSystem::readFile (DOWNLOAD_PATH . '/.lock.json ' ), true ) ?? [];
233- }
234- // calculate hash
235- $ hash = self ::getLockSourceHash ($ data );
236- $ data ['hash ' ] = $ hash ;
237- $ lock [$ name ] = $ data ;
238- FileSystem::writeFile (DOWNLOAD_PATH . '/.lock.json ' , json_encode ($ lock , JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ));
211+ LockFile::lockSource ($ name , ['source_type ' => SPC_SOURCE_ARCHIVE , 'filename ' => $ filename , 'move_path ' => $ move_path , 'lock_as ' => $ download_as ]);
239212 }
240213
241214 /**
@@ -281,7 +254,7 @@ public static function downloadGit(string $name, string $url, string $branch, ?s
281254 }
282255 // Lock
283256 logger ()->debug ("Locking git source {$ name }" );
284- self ::lockSource ($ name , ['source_type ' => SPC_SOURCE_GIT , 'dirname ' => $ name , 'move_path ' => $ move_path , 'lock_as ' => $ lock_as ]);
257+ LockFile ::lockSource ($ name , ['source_type ' => SPC_SOURCE_GIT , 'dirname ' => $ name , 'move_path ' => $ move_path , 'lock_as ' => $ lock_as ]);
285258
286259 /*
287260 // 复制目录过去
@@ -377,7 +350,7 @@ public static function downloadPackage(string $name, ?array $pkg = null, bool $f
377350 case 'local ' :
378351 // Local directory, do nothing, just lock it
379352 logger ()->debug ("Locking local source {$ name }" );
380- self ::lockSource ($ name , [
353+ LockFile ::lockSource ($ name , [
381354 'source_type ' => SPC_SOURCE_LOCAL ,
382355 'dirname ' => $ pkg ['dirname ' ],
383356 'move_path ' => $ pkg ['extract ' ] ?? null ,
@@ -493,7 +466,7 @@ public static function downloadSource(string $name, ?array $source = null, bool
493466 case 'local ' :
494467 // Local directory, do nothing, just lock it
495468 logger ()->debug ("Locking local source {$ name }" );
496- self ::lockSource ($ name , [
469+ LockFile ::lockSource ($ name , [
497470 'source_type ' => SPC_SOURCE_LOCAL ,
498471 'dirname ' => $ source ['dirname ' ],
499472 'move_path ' => $ source ['extract ' ] ?? null ,
@@ -617,43 +590,6 @@ public static function getPreBuiltLockName(string $source): string
617590 return "{$ source }- " . PHP_OS_FAMILY . '- ' . getenv ('GNU_ARCH ' ) . '- ' . (getenv ('SPC_LIBC ' ) ?: 'default ' ) . '- ' . (SystemUtil::getLibcVersionIfExists () ?? 'default ' );
618591 }
619592
620- /**
621- * Get the hash of the lock source based on the lock options.
622- *
623- * @param array $lock_options Lock options
624- * @return string Hash of the lock source
625- * @throws RuntimeException
626- */
627- public static function getLockSourceHash (array $ lock_options ): string
628- {
629- $ result = match ($ lock_options ['source_type ' ]) {
630- SPC_SOURCE_ARCHIVE => sha1_file (DOWNLOAD_PATH . '/ ' . $ lock_options ['filename ' ]),
631- SPC_SOURCE_GIT => exec ('cd ' . escapeshellarg (DOWNLOAD_PATH . '/ ' . $ lock_options ['dirname ' ]) . ' && ' . SPC_GIT_EXEC . ' rev-parse HEAD ' ),
632- SPC_SOURCE_LOCAL => 'LOCAL HASH IS ALWAYS DIFFERENT ' ,
633- default => filter_var (getenv ('SPC_IGNORE_BAD_HASH ' ), FILTER_VALIDATE_BOOLEAN ) ? '' : throw new RuntimeException ("Unknown source type: {$ lock_options ['source_type ' ]}" ),
634- };
635- if ($ result === false && !filter_var (getenv ('SPC_IGNORE_BAD_HASH ' ), FILTER_VALIDATE_BOOLEAN )) {
636- throw new RuntimeException ("Failed to get hash for source: {$ lock_options ['source_type ' ]}" );
637- }
638- return $ result ?: '' ;
639- }
640-
641- /**
642- * @param array $lock_options Lock options
643- * @param string $destination Target directory
644- * @throws FileSystemException
645- * @throws RuntimeException
646- */
647- public static function putLockSourceHash (array $ lock_options , string $ destination ): void
648- {
649- $ hash = self ::getLockSourceHash ($ lock_options );
650- if ($ lock_options ['source_type ' ] === SPC_SOURCE_LOCAL ) {
651- logger ()->debug ("Source [ {$ lock_options ['dirname ' ]}] is local, no hash will be written. " );
652- return ;
653- }
654- FileSystem::writeFile ("{$ destination }/.spc-hash " , $ hash );
655- }
656-
657593 /**
658594 * Register CTRL+C event for different OS.
659595 *
@@ -689,33 +625,24 @@ private static function getRetryAttempts(): int
689625
690626 /**
691627 * @throws FileSystemException
628+ * @throws WrongUsageException
692629 */
693630 private static function isAlreadyDownloaded (string $ name , bool $ force , int $ download_as = SPC_DOWNLOAD_SOURCE ): bool
694631 {
695- if (!file_exists (DOWNLOAD_PATH . '/.lock.json ' )) {
696- $ lock = [];
697- } else {
698- $ lock = json_decode (FileSystem::readFile (DOWNLOAD_PATH . '/.lock.json ' ), true ) ?? [];
699- }
700- // If lock file exists, skip downloading for source mode
701- if (!$ force && $ download_as === SPC_DOWNLOAD_SOURCE && isset ($ lock [$ name ])) {
702- if (
703- $ lock [$ name ]['source_type ' ] === SPC_SOURCE_ARCHIVE && file_exists (DOWNLOAD_PATH . '/ ' . $ lock [$ name ]['filename ' ]) ||
704- $ lock [$ name ]['source_type ' ] === SPC_SOURCE_GIT && is_dir (DOWNLOAD_PATH . '/ ' . $ lock [$ name ]['dirname ' ])
705- ) {
706- logger ()->notice ("Source [ {$ name }] already downloaded: " . ($ lock [$ name ]['filename ' ] ?? $ lock [$ name ]['dirname ' ]));
632+ // If the lock file exists, skip downloading for source mode
633+ $ lock_item = LockFile::get ($ name );
634+ if (!$ force && $ download_as === SPC_DOWNLOAD_SOURCE && $ lock_item !== null ) {
635+ if (file_exists ($ path = LockFile::getLockFullPath ($ lock_item ))) {
636+ logger ()->notice ("Source [ {$ name }] already downloaded: {$ path }" );
707637 return true ;
708638 }
709639 }
710- // If lock file exists for current arch and glibc target, skip downloading
711-
712- if (!$ force && $ download_as === SPC_DOWNLOAD_PRE_BUILT && isset ( $ lock [ $ lock_name = self :: getPreBuiltLockName ( $ name )]) ) {
640+ $ lock_name = self :: getPreBuiltLockName ( $ name );
641+ $ lock_item = LockFile:: get ( $ lock_name );
642+ if (!$ force && $ download_as === SPC_DOWNLOAD_PRE_BUILT && $ lock_item !== null ) {
713643 // lock name with env
714- if (
715- $ lock [$ lock_name ]['source_type ' ] === SPC_SOURCE_ARCHIVE && file_exists (DOWNLOAD_PATH . '/ ' . $ lock [$ lock_name ]['filename ' ]) ||
716- $ lock [$ lock_name ]['source_type ' ] === SPC_SOURCE_GIT && is_dir (DOWNLOAD_PATH . '/ ' . $ lock [$ lock_name ]['dirname ' ])
717- ) {
718- logger ()->notice ("Pre-built content [ {$ name }] already downloaded: " . ($ lock [$ lock_name ]['filename ' ] ?? $ lock [$ lock_name ]['dirname ' ]));
644+ if (file_exists ($ path = LockFile::getLockFullPath ($ lock_item ))) {
645+ logger ()->notice ("Pre-built content [ {$ name }] already downloaded: {$ path }" );
719646 return true ;
720647 }
721648 }
0 commit comments