@@ -209,34 +209,7 @@ public static function downloadFile(string $name, string $url, string $filename,
209209 if ($ download_as === SPC_DOWNLOAD_PRE_BUILT ) {
210210 $ name = self ::getPreBuiltLockName ($ name );
211211 }
212- self ::lockSource ($ name , ['source_type ' => SPC_SOURCE_ARCHIVE , 'filename ' => $ filename , 'move_path ' => $ move_path , 'lock_as ' => $ download_as ]);
213- }
214-
215- /**
216- * Try to lock source.
217- *
218- * @param string $name Source name
219- * @param array{
220- * source_type: string,
221- * dirname: ?string,
222- * filename: ?string,
223- * move_path: ?string,
224- * lock_as: int
225- * } $data Source data
226- * @throws FileSystemException
227- */
228- public static function lockSource (string $ name , array $ data ): void
229- {
230- if (!file_exists (FileSystem::convertPath (DOWNLOAD_PATH . '/.lock.json ' ))) {
231- $ lock = [];
232- } else {
233- $ lock = json_decode (FileSystem::readFile (DOWNLOAD_PATH . '/.lock.json ' ), true ) ?? [];
234- }
235- // calculate hash
236- $ hash = self ::getLockSourceHash ($ data );
237- $ data ['hash ' ] = $ hash ;
238- $ lock [$ name ] = $ data ;
239- FileSystem::writeFile (DOWNLOAD_PATH . '/.lock.json ' , json_encode ($ lock , JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ));
212+ LockFile::lockSource ($ name , ['source_type ' => SPC_SOURCE_ARCHIVE , 'filename ' => $ filename , 'move_path ' => $ move_path , 'lock_as ' => $ download_as ]);
240213 }
241214
242215 /**
@@ -282,7 +255,7 @@ public static function downloadGit(string $name, string $url, string $branch, ?s
282255 }
283256 // Lock
284257 logger ()->debug ("Locking git source {$ name }" );
285- self ::lockSource ($ name , ['source_type ' => SPC_SOURCE_GIT , 'dirname ' => $ name , 'move_path ' => $ move_path , 'lock_as ' => $ lock_as ]);
258+ LockFile ::lockSource ($ name , ['source_type ' => SPC_SOURCE_GIT , 'dirname ' => $ name , 'move_path ' => $ move_path , 'lock_as ' => $ lock_as ]);
286259
287260 /*
288261 // 复制目录过去
@@ -378,7 +351,7 @@ public static function downloadPackage(string $name, ?array $pkg = null, bool $f
378351 case 'local ' :
379352 // Local directory, do nothing, just lock it
380353 logger ()->debug ("Locking local source {$ name }" );
381- self ::lockSource ($ name , [
354+ LockFile ::lockSource ($ name , [
382355 'source_type ' => SPC_SOURCE_LOCAL ,
383356 'dirname ' => $ pkg ['dirname ' ],
384357 'move_path ' => $ pkg ['extract ' ] ?? null ,
@@ -497,7 +470,7 @@ public static function downloadSource(string $name, ?array $source = null, bool
497470 case 'local ' :
498471 // Local directory, do nothing, just lock it
499472 logger ()->debug ("Locking local source {$ name }" );
500- self ::lockSource ($ name , [
473+ LockFile ::lockSource ($ name , [
501474 'source_type ' => SPC_SOURCE_LOCAL ,
502475 'dirname ' => $ source ['dirname ' ],
503476 'move_path ' => $ source ['extract ' ] ?? null ,
@@ -621,43 +594,6 @@ public static function getPreBuiltLockName(string $source): string
621594 return "{$ source }- " . PHP_OS_FAMILY . '- ' . getenv ('GNU_ARCH ' ) . '- ' . (getenv ('SPC_LIBC ' ) ?: 'default ' ) . '- ' . (SystemUtil::getLibcVersionIfExists () ?? 'default ' );
622595 }
623596
624- /**
625- * Get the hash of the lock source based on the lock options.
626- *
627- * @param array $lock_options Lock options
628- * @return string Hash of the lock source
629- * @throws RuntimeException
630- */
631- public static function getLockSourceHash (array $ lock_options ): string
632- {
633- $ result = match ($ lock_options ['source_type ' ]) {
634- SPC_SOURCE_ARCHIVE => sha1_file (DOWNLOAD_PATH . '/ ' . $ lock_options ['filename ' ]),
635- SPC_SOURCE_GIT => exec ('cd ' . escapeshellarg (DOWNLOAD_PATH . '/ ' . $ lock_options ['dirname ' ]) . ' && ' . SPC_GIT_EXEC . ' rev-parse HEAD ' ),
636- SPC_SOURCE_LOCAL => 'LOCAL HASH IS ALWAYS DIFFERENT ' ,
637- default => filter_var (getenv ('SPC_IGNORE_BAD_HASH ' ), FILTER_VALIDATE_BOOLEAN ) ? '' : throw new RuntimeException ("Unknown source type: {$ lock_options ['source_type ' ]}" ),
638- };
639- if ($ result === false && !filter_var (getenv ('SPC_IGNORE_BAD_HASH ' ), FILTER_VALIDATE_BOOLEAN )) {
640- throw new RuntimeException ("Failed to get hash for source: {$ lock_options ['source_type ' ]}" );
641- }
642- return $ result ?: '' ;
643- }
644-
645- /**
646- * @param array $lock_options Lock options
647- * @param string $destination Target directory
648- * @throws FileSystemException
649- * @throws RuntimeException
650- */
651- public static function putLockSourceHash (array $ lock_options , string $ destination ): void
652- {
653- $ hash = self ::getLockSourceHash ($ lock_options );
654- if ($ lock_options ['source_type ' ] === SPC_SOURCE_LOCAL ) {
655- logger ()->debug ("Source [ {$ lock_options ['dirname ' ]}] is local, no hash will be written. " );
656- return ;
657- }
658- FileSystem::writeFile ("{$ destination }/.spc-hash " , $ hash );
659- }
660-
661597 /**
662598 * Register CTRL+C event for different OS.
663599 *
@@ -693,32 +629,24 @@ private static function getRetryAttempts(): int
693629
694630 /**
695631 * @throws FileSystemException
632+ * @throws WrongUsageException
696633 */
697634 private static function isAlreadyDownloaded (string $ name , bool $ force , int $ download_as = SPC_DOWNLOAD_SOURCE ): bool
698635 {
699- if (!file_exists (DOWNLOAD_PATH . '/.lock.json ' )) {
700- $ lock = [];
701- } else {
702- $ lock = json_decode (FileSystem::readFile (DOWNLOAD_PATH . '/.lock.json ' ), true ) ?? [];
703- }
704- // If lock file exists, skip downloading for source mode
705- if (!$ force && $ download_as === SPC_DOWNLOAD_SOURCE && isset ($ lock [$ name ])) {
706- if (
707- $ lock [$ name ]['source_type ' ] === SPC_SOURCE_ARCHIVE && file_exists (DOWNLOAD_PATH . '/ ' . $ lock [$ name ]['filename ' ]) ||
708- $ lock [$ name ]['source_type ' ] === SPC_SOURCE_GIT && is_dir (DOWNLOAD_PATH . '/ ' . $ lock [$ name ]['dirname ' ])
709- ) {
710- logger ()->notice ("Source [ {$ name }] already downloaded: " . ($ lock [$ name ]['filename ' ] ?? $ lock [$ name ]['dirname ' ]));
636+ // If the lock file exists, skip downloading for source mode
637+ $ lock_item = LockFile::get ($ name );
638+ if (!$ force && $ download_as === SPC_DOWNLOAD_SOURCE && $ lock_item !== null ) {
639+ if (file_exists ($ path = LockFile::getLockFullPath ($ lock_item ))) {
640+ logger ()->notice ("Source [ {$ name }] already downloaded: {$ path }" );
711641 return true ;
712642 }
713643 }
714- // If lock file exists for current arch and glibc target, skip downloading
715- if (!$ force && $ download_as === SPC_DOWNLOAD_PRE_BUILT && isset ($ lock [$ lock_name = self ::getPreBuiltLockName ($ name )])) {
644+ $ lock_name = self ::getPreBuiltLockName ($ name );
645+ $ lock_item = LockFile::get ($ lock_name );
646+ if (!$ force && $ download_as === SPC_DOWNLOAD_PRE_BUILT && $ lock_item !== null ) {
716647 // lock name with env
717- if (
718- $ lock [$ lock_name ]['source_type ' ] === SPC_SOURCE_ARCHIVE && file_exists (DOWNLOAD_PATH . '/ ' . $ lock [$ lock_name ]['filename ' ]) ||
719- $ lock [$ lock_name ]['source_type ' ] === SPC_SOURCE_GIT && is_dir (DOWNLOAD_PATH . '/ ' . $ lock [$ lock_name ]['dirname ' ])
720- ) {
721- logger ()->notice ("Pre-built content [ {$ name }] already downloaded: " . ($ lock [$ lock_name ]['filename ' ] ?? $ lock [$ lock_name ]['dirname ' ]));
648+ if (file_exists ($ path = LockFile::getLockFullPath ($ lock_item ))) {
649+ logger ()->notice ("Pre-built content [ {$ name }] already downloaded: {$ path }" );
722650 return true ;
723651 }
724652 }
0 commit comments