
    9i7                     (   S SK r S SKrS SKrS SKrS SKrS SKJrJr  S SKJ	r	J
r
Jr  S SKJr  S SKJrJr  S SKJrJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJrJ r   \" 5       r!/ SQr"\RF                  S 5       r$ " S S5      r% " S S\5      r&g)    N)FutureThreadPoolExecutor)SEEK_ENDSEEK_SETBytesIO)Path)LockThread)DictListOptionalUnion)HubApi)
Visibility)DEFAULT_REPOSITORY_REVISION)
get_logger)
CommitInfo	RepoUtils)z.gitz.git/*z*/.gitz
**/.git/**c              #     ^ #    T R                   nUR                  n  SS[        [        [        [
        [           [
        [           4   S[        S[        [        [
        [           [        4      S[        [        [
        [           [        4      S[
        [        [        [        4      4
U 4S jjjn [        R                  " X15      Ul        Sv   X!l        g! X!l        f = f7f)	z'Patch upload_folder for CommitSchedulerNfolder_path_or_filespath_in_repoallow_patternsignore_patternsreturnc                    > TR                      [        U[        5      (       a  [        S5      e[        R
                  R                  U5      (       a  [        S5      e[        U5      R                  5       R                  5       n[        R                  S5        [        UR                  S5      5       Vs0 s H9  ofR                  5       (       d  M  UR                  U5      R!                  5       U_M;     nnU(       a  UR#                  S5       S3OSn/ n	0 n
[$        R&                  " UR)                  5       UUS9 H  nX{   nUR+                  5       nTR,                  R/                  U5       b  TR,                  U   UR0                  :w  d  MS  [3        XR4                  5      nU	R7                  X-   U45        UR0                  X'   M     U
Tl        U	(       d  [        R                  S	5        SSS5        U	$ s  snf ! , (       d  f       W	$ = f)
zH
Patched version that supports incremental updates for CommitScheduler.
zJUploading multiple files or folders is not supported for scheduled commit.z5Uploading file is not supported for scheduled commit.z-Listing files to upload for scheduled commit.z**/*/ )r   r   N0No changed files to upload for scheduled commit.)lock
isinstancelist
ValueErrorospathisfiler   
expanduserresolveloggerdebugsortedglobis_filerelative_toas_posixstripr   filter_repo_objectskeysstatlast_uploadedgetst_mtimePartialFileIOst_sizeappend_pending_tracker_updates)api_selfr   r   r   r   folder_pathr$   relpath_to_abspathprefixprepared_repo_objectsfiles_to_trackrelpath
local_pathr2   partial_filescheduler_instances                  _/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/hub/commit_scheduler.pypatched_prepare_upload_folderHpatch_upload_folder_for_scheduler.<locals>.patched_prepare_upload_folder   s     $$.55 `   455 KM M ##78CCEMMOLLHI #;#3#3F#;<"<D ?  -668$><  " 7C**3/02F$&!N$88&++-#1$35 08
!(%3377"/=="$'+}}5#0\\#JL)00)<8:15N.5 ;I7(FHO %T %$=" %$T %$s,   B(G>6G9$G96BG>AG>9G>>
H)NN)api_prepare_upload_folderr   strr   r   r   tupler!   types
MethodType)rC   rG   original_preparerE   s   `   rD   !patch_upload_folder_for_schedulerrN      s      
 
 C11 ;?;?4%#CtCy$t*$DE4% 4% !tCy#~!67	4%
 "%S	3"784% 
eE4K 	!4% 4%l6%*%5%5)&0"%5"%5"s   B2C'6C C'C$$C'c                   @   \ rS rSrSrSSS\\R                  SSSSS.	S\S\	\\
4   S\	\\4   S	\\   S
\\   S\\   S\\   S\\   S\\	\\   \4      S\\	\\   \4      S\\   SS4S jjrSS jrSS jrSS jrSS jrS\4S jrS\\   4S jrS\\   4S jrSrg)CommitScheduler]   a6  
A scheduler that automatically uploads a local folder to ModelScope Hub at
specified intervals (e.g., every 5 minutes).

It's recommended to use the scheduler as a context manager to ensure proper
cleanup and final commit execution when your script completes. Alternatively,
you can manually stop the scheduler using the `stop` method.

Args:
    repo_id (`str`):
        The id of the repo to commit to.
    folder_path (`str` or `Path`):
        Local folder path that will be monitored and uploaded periodically.
    interval (`int` or `float`, *optional*):
        Time interval in minutes between each upload operation. Defaults to 5 minutes.
    path_in_repo (`str`, *optional*):
        Target directory path within the repository, such as `"models/"`.
        If not specified, files are uploaded to the repository root.
    repo_type (`str`, *optional*):
        Repository type for the target repo. Defaults to `model`.
    revision (`str`, *optional*):
        Target branch or revision for commits. Defaults to `master`.
    visibility (`str`, *optional*):
        The visibility of the repo,
        could be `public`, `private`, `internal`, default to `public`.
    token (`str`, *optional*):
        The token to use to commit to the repo. Defaults to the token saved on the machine.
    allow_patterns (`List[str]` or `str`, *optional*):
        File patterns to include in uploads. Only files matching these patterns will be uploaded.
    ignore_patterns (`List[str]` or `str`, *optional*):
        File patterns to exclude from uploads. Files matching these patterns will be skipped.
    hub_api (`HubApi`, *optional*):
        Custom [`HubApi`] instance for Hub operations. Allows for customized
        configurations like user agent or token settings.

Example:
```py
>>> from pathlib import Path
>>> from modelscope.hub import CommitScheduler

# Create scheduler with 10-minute intervals
>>> data_file = Path("workspace/experiment.log")
>>> scheduler = CommitScheduler(
...     repo_id="my_experiments",
...     repo_type="dataset",
...     folder_path=data_file.parent,
...     interval=10
... )

>>> with data_file.open("a") as f:
...     f.write("experiment started")

# Later in the workflow...
>>> with data_file.open("a") as f:
...     f.write("experiment completed")
```

Context manager usage:
```py
>>> from pathlib import Path
>>> from modelscope.hub import CommitScheduler

>>> with CommitScheduler(
...     repo_id="my_experiments",
...     repo_type="dataset",
...     folder_path="workspace",
...     interval=10
... ) as scheduler:
...     log_file = Path("workspace/progress.log")
...     with log_file.open("a") as f:
...         f.write("starting process")
...     # ... perform work ...
...     with log_file.open("a") as f:
...         f.write("process finished")

# Scheduler automatically stops and performs final upload
```
   N)	intervalr   	repo_typerevision
visibilitytokenr   r   hub_apirepo_idr;   rS   r   rT   rU   rV   rW   r   r   rX   r   c          	         U=(       d
    [        5       U l        [        U5      R                  5       R	                  5       U l        U R
                  R                  5       (       d  [        SU 35      eU=(       d    SU l        Xl	        U
c  / n
O[        U
[        5      (       a  U
/n
U
[        -   U l        U R                  R                  UUUUSSS9U l        Xl        XPl        X`l        Xl        0 U l        US::  a  [        SU S35      e[+        5       U l        X0l        SU l        [2        R5                  S	U R
                   S
U R                    SU R.                   S35        [7        SS9U l        [;        U R<                  SS9U l        U R>                  RA                  5         [B        RD                  " U RF                  5        g )NzFolder path does not exist: r   TF)rY   rW   rT   rV   exist_okcreate_default_configr   z,"interval" must be a positive integer, not "z".zScheduled job to push z to z at an interval of z	 minutes.   )max_workers)targetdaemon)$r   rG   r   r&   r'   r;   existsr"   r   r   r    rI   IGNORE_GIT_FOLDER_PATTERNSr   create_reporepo_urlrY   rT   rU   rW   r3   r	   r   rS   _CommitScheduler__stoppedr(   infor   executorr
   _run_scheduler_scheduler_threadstartatexitregistercommit_scheduled_changes)selfrY   r;   rS   r   rT   rU   rV   rW   r   r   rX   s               rD   __init__CommitScheduler.__init__   s    &fh,779AAC&&((;K=IJJ(.B," O--./O.1KK,,!"' - 
 " 
 13q=>xjKM MF	 $T%5%5$6d4<<.H[\`\i\i[jjst	
 +q9!'&&t"5$$&556    c                     SU l         g)zStop the scheduler.TN)re   rn   s    rD   stopCommitScheduler.stop   s	    rq   c                     U $ N rs   s    rD   	__enter__CommitScheduler.__enter__   s    rq   c                 `    U R                  5       R                  5         U R                  5         g rw   )triggerresultrt   )rn   exc_type	exc_value	tracebacks       rD   __exit__CommitScheduler.__exit__   s     		rq   c                     U R                   (       dL  U R                  5       U l        [        R                  " U R
                  S-  5        U R                   (       d  MK  g g )N<   )re   r|   last_futuretimesleeprS   rs   s    rD   rh   CommitScheduler._run_scheduler   s7    ..#||~DJJt}}r)* ...rq   c                 L    U R                   R                  U R                  5      $ )z0Trigger a background commit and return a future.)rg   submit_commit_scheduled_changesrs   s    rD   r|   CommitScheduler.trigger   s    }}##D$B$BCCrq   c                     U R                   (       a  g [        R                  S5         U R                  5       nU$ ! [         a  n[        R                  SU 35        e S nAff = f)Nz((Background) scheduled commit triggered.zError while pushing to Hub: )re   r(   rf   rm   	Exceptionerror)rn   valuees      rD   r   )CommitScheduler._commit_scheduled_changes   sX    >>>?	113EL 	LL7s;<	s   ; 
A#AA#c                 X    0 U l         [        U 5         U R                  R                  U R                  U R
                  U R                  SU R                  U R                  U R                  U R                  U R                  S9	nSSS5        Wc  [        R                  S5        gU R                     [        U S5      (       aS  U R                   R#                  U R                   5        [        R                  S[%        U R                   5       S35        U ? SSS5        U$ ! , (       d  f       N= f! , (       d  f       U$ = f! [&         aZ  nS[)        U5      ;   a  [        R                  S5         SnAg[        U S5      (       a  U ? [        R+                  S	U 35        e SnAff = f)
zCPush folder to the Hub and return commit info if changes are found.zScheduled Commit)	rY   r;   r   commit_messagerW   rT   r   r   rU   Nr   r9   z!Updated modification tracker for z files.zNo files to uploadzError during scheduled commit: )r9   rN   rG   upload_folderrY   r;   r   rW   rT   r   r   rU   r(   r)   r   hasattrr3   updatelenr   rI   r   )rn   commit_infor   s      rD   rm   (CommitScheduler.commit_scheduled_changes  sn   (	,.D)248"hh44 LL $ 0 0!%!2!2#5**"nn#'#6#6$($8$8!]] 5 
 9 "FH4!;<<&&--d.K.KLLL;C@]@]<^;__fg 5  5 98$   
	#s1v-FHt7881LL:1#>?
	sZ   E A2D" E 'E 3A%D3	E "
D0,E 3
E=E E 
F)$F$8,F$$F))	__stoppedr9   ri   r   rG   rg   r;   r   rS   r   r3   r   r   rY   rT   rd   rU   rW   r   N)r   rP   )__name__
__module____qualname____firstlineno____doc__r   r   PUBLICrI   r   r   intfloatr   r   r   ro   rt   ry   r   rh   r   r|   r   r   rm   __static_attributes__rx   rq   rD   rP   rP   ]   s=   Mh '(&*#'"=$.$5$5#:>;?$(<7 <7 39%	<7
 U
#<7 sm<7 C=<7 3-<7 SM<7 }<7 !tCy#~!67<7 "%S	3"78<7 &!<7 
<7|
+
D D
8J+? 
*(:*> *rq   rP   c                      ^  \ rS rSrSrS\\\4   S\SS4S jr	SS jr
SS	 jrSU 4S
 jjrS\4S jrS\4S jrS\4U 4S jjrS\4S jr\4S\S\S\4S jjrSS\\   S\4S jjrSrU =r$ )r6   i9  z<A file-like object that reads only the first part of a file.	file_path
size_limitr   Nc                 ^    [        U5      U l        S U l        X l        U R	                  5         g rw   )r   
_file_path_file_size_limitopen)rn   r   r   s      rD   ro   PartialFileIO.__init__<  s#    y/
%		rq   c                    U R                   b  g U R                  R                  S5      U l         [        U R                  =(       d    [        S5      [        R                  " U R                   R                  5       5      R                  5      U l        g! [         a+  n[        R                  SU R                   SU 35        e SnAff = f)z(Open the file and initialize size limit.NrbinfzFailed to open file z: )r   r   r   minr   r   r#   fstatfilenor7   OSErrorr(   r   )rn   r   s     rD   r   PartialFileIO.openB  s    ::!	--d3DJ"  0E%L**,-55 7D  	LL//@1#FG	s   BB 
C	&CC	c                 b    U R                   b"  U R                   R                  5         SU l         gg)zClose the file if it's open.N)r   closers   s    rD   r   PartialFileIO.closeO  s(    ::!JJDJ "rq   c                 @   > U R                  5         [        TU ]	  5       $ rw   )r   super__del__)rn   	__class__s    rD   r   PartialFileIO.__del__U  s    

w  rq   c                 <    SU R                    SU R                   S3$ )Nz<PartialFileIO file_path=z size_limit=>)r   r   rs   s    rD   __repr__PartialFileIO.__repr__Y  s$    *4??*;<HXHXGYYZ[[rq   c                     U R                   $ rw   )r   rs   s    rD   __len__PartialFileIO.__len__\  s    rq   namec                 x   > UR                  S5      (       d  US;   a  [        TU ]	  U5      $ [        SU S35      e)N_>   r   readseektellr   z PartialFileIO does not support 'z'.)
startswithr   __getattribute__NotImplementedError)rn   r   r   s     rD   r   PartialFileIO.__getattribute___  sE    ??34 ,
 $
 7+D11!$DTF""MNNrq   c                 6    U R                   R                  5       $ rw   )r   r   rs   s    rD   r   PartialFileIO.tellf  s    zz  rq   _PartialFileIO__offset_PartialFileIO__whencec                     U[         :X  a  [        U 5      U-   n[        nU R                  R	                  X5      nX0R
                  :  a%  U R                  R	                  U R
                  5      $ U$ )z<Seek to a position in the file, but never beyond size_limit.)r   r   r   r   r   r   )rn   r   r   poss       rD   r   PartialFileIO.seeki  sY    x4y8+HHjjooh1!!!::??4#3#344
rq   _PartialFileIO__sizec                     U R                  5       nUb  US:  a  U R                  U-
  nO[        XR                  U-
  5      nU R                  R	                  U5      $ )z3Read at most _size bytes from the current position.r   )r   r   r   r   r   )rn   r   currenttruncated_sizes       rD   r   PartialFileIO.readt  sR    ))+>VaZ!--7N !)9)9G)CDNzz~..rq   )r   r   r   r   ))r   r   r   r   r   r   rI   r   r   ro   r   r   r   r   r   r   r   r   r   r   bytesr   r   __classcell__)r   s   @rD   r6   r6   9  s    F%T	"2   !\# \   OS O!c ! 3; 	S 	C 	s 		/8C= 	/% 	/ 	/rq   r6   )'rk   
contextlibr#   r   rK   concurrent.futuresr   r   ior   r   r   pathlibr   	threadingr	   r
   typingr   r   r   r   modelscope.hub.apir   modelscope.hub.constantsr   modelscope.utils.constantr   modelscope.utils.loggerr   modelscope.utils.repo_utilsr   r   r(   rb   contextmanagerrN   rP   r6   rx   rq   rD   <module>r      s      	   9 * *  " . . % / A . =	G  @6 @6FY YxD/G D/rq   