ctx-tui 2.0.4

Manage repo-scoped work contexts: fresh checkouts wrapped in terminal multiplexer sessions
Documentation
�

"�j,���SSKrSSKrSSKrSSKrSSKJr SSKJr SSKJ	r	 SSK
Jr SSKJ
r
Jr \"SS9"S	S
55rSrS\S
\S\S\4SjrS\S\4SjrS\S\\4SjrS\S\\4SjrS\S\S\4SjrSS.S\S\S\S-SS4SjjrS\S\SS4SjrSrSrS\S\4SjrS.S\S
\S\S\S-S\4
S jjrS\S
\S\S\4S!jrS\S\\4S"jr S\S\S\4S#jr!S\S\S\4S$jr"S\S\S\#4S%jr$S\S\S\4S&jr%S\S\S\4S'jr&S\S\4S(jr'S\S\#4S)jr(S\S\\4S*jr)S\SS4S+jr*S\SS4S,jr+S\SS4S-jr,g)/�N)�	dataclass)�Path)�repos)�Config)�git�	git_asyncT)�frozenc�L�\rSrSr%\\S'\\S'\\S'\S\4Sj5rSr	g)	�Context�
�repo�name�path�returnc�8�URSUR3$)N�/)r
r)�selfs �F/Users/michael/dev/contexts/ctx/rewrite-it-in-rust/src/ctx/contexts.py�	qualified�Context.qualifieds���)�)��A�d�i�i�[�)�)��N)
�__name__�
__module__�__qualname__�__firstlineno__�str�__annotations__r�propertyr�__static_attributes__rrrrr
s*��

�I�

�I�
�J�
�*�3�*��*rrz	.deleting�cfgr
rrc�&�URU-U-$�N)�contexts_dir�r!r
rs   r�context_pathr&s�����d�"�T�)�)r�ctxc�0�URS-S-S-URS-S-4nUVs/sH3o"R5(dMUR5RPM5 nn[	X0RR5RS9$s snf)aProxy for the last interaction: the latest git activity in the checkout.

`.git/logs/HEAD` is appended to on commits, checkouts, and resets;
`.git/index` is rewritten by staging and status refreshes. Neither sees
plain file edits, but agent-driven work touches git constantly.
�.git�logs�HEAD�index)�default)r�exists�stat�st_mtime�max)r'�
candidatesr�timess    r�last_activer4"sy���(�(�V�#�f�,�v�5�s�x�x�&�7H�7�7R�S�J�.8�J�j�d�K�K�M�
!�T�Y�Y�[�
!�
!�j�E�J��u�h�h�m�m�o�6�6�7�7��
Ks�B�B�rootc	���UR5(d/$/n[UR55H�nUR5(dM[UR55HsnURR	[
5(aM)US-R
5(dMCUR[URURU55 Mu M� URSS9 U$)zGContexts under a <root>/<repo>/<name> tree, most recently active first.r)c�2�[U5*UR4$r#)r4r)�cs r�<lambda>�_scan.<locals>.<lambda>;s��{�1�~�o�q�{�{�;r)�key)
�is_dir�sorted�iterdirr�endswith�_DELETING_SUFFIXr.�appendr�sort)r5�found�repo_dir�ctx_dirs    r�_scanrF.s����;�;�=�=��	��E��4�<�<�>�*����� � ���h�.�.�0�1�G��|�|�$�$�%5�6�6���&� �(�(�*�*����W�X�]�]�G�L�L�'�J�K�	2�+�
�J�J�;�J�<��Lrc�,�[UR5$)z)All contexts, most recently active first.)rFr$�r!s r�
list_contextsrI?s����!�!�"�"rc��[U5Vs/sHo"RU:XdMUPM nnU(d[SUS35eUS$s snf)z2Resolve a context name; names are globally unique.�no context '�'r)rIr�LookupError�r!rr8�matchess    r�find_contextrPDsL��'��,�?�,�Q���$��q�,�G�?���L���a�0�1�1��1�:���@�
�A�A��excluderSc�@�[U5H@nURU:XdMURU:wdM'[SUSUR35e [U5H@nURU:XdMURU:wdM'[SUSUR35e g)z�Names are unique across live and archived contexts alike.

Sharing a name with an archived context would leave that archive
unrestorable, so the two pools compete for the same names.
�context name 'z' is already used by z' is already used by archived N)rIrr�FileExistsErrorr�
list_archived)r!rrSr's    r�_check_name_freerXLs����S�!���8�8�t�����G� 3�!�N�4�&�8M�c�m�m�_�"]�^�^�"��S�!���8�8�t�����G� 3�!� ���&D�S�]�]�O�T��
�"r�branchc��UR5(d[S5eSU;dUS;a[SUS35eURS5(a[SUS35eUR[5(a[SUS[S	35e[
R"S
SSU3/S
SS9nURS:wa[SUSUS35eg)zCReject names that break the paths, branches, or commands they feed.zcontext name must not be emptyr>�.�..rUz!' must be a single path component�-z' must not start with '-'z' must not end with 'rLrzcheck-ref-format�refs/heads/T)�capture_output�cwdrz&' does not make a valid branch name ('z')N)�strip�
ValueError�
startswithr?r@�
subprocess�run�
returncode)rrY�checks   r�_check_namerh\s����:�:�<�<��9�:�:�
�d�{�d�k�)��>�$��/P�Q�R�R����s����>�$��/H�I�J�J��}�}�%�&�&��>�$��/D�EU�DV�VW�X�Y�Y��N�N�	�"�k�&��$:�;�D�VY�
�E�
���1���>�$��/U�V\�U]�]_�`�a�a�r)2�amber�bold�brave�breezy�bright�calm�cheeky�clever�cosmic�cozy�curious�daring�dapper�dusty�eager�fancy�fluffy�frosty�fuzzy�gentle�golden�happy�hazy�holy�humble�jolly�keen�lively�lucky�mellow�merry�mighty�misty�nimble�perky�plucky�proud�quiet�rosy�rusty�shiny�sleepy�sly�snappy�snug�stormy�sunny�swift�vivid�witty)2�badger�bear�beaver�bison�crane�dingo�dolphin�eagle�falcon�ferret�finch�fox�gecko�goose�hare�hawk�heron�husky�jaguar�koala�lemur�llama�lynx�magpie�marmot�moose�narwhal�otter�owl�panda�pelican�penguin�puffin�quail�raccoon�raven�robin�seal�sparrow�stork�swan�tiger�toucan�trout�turtle�walrus�weasel�wombat�wren�yakc�X�[U5[U5-Vs1sHoRiM nn[VVs/sHn[H	oCSU3PM M nnnUVs/sHofU;dM
UPM nnU(d[S5e[R"U5$s snfs snnfs snf)zIA free adjective-animal name for when the user would rather not pick one.r]z0all generated names are taken; pick one yourself)rIrWr�_ADJECTIVES�_ANIMALSrV�random�choice)r!r8�taken�	adjective�animal�namesr�frees        r�random_namer��s���*�3�/�-��2D�D�E�D��V�V�D�E�E�6A�Y�k��PX�PX�f�{�!�F�8�
$�PX�
$�k�E�Y�"�8�U�T�%�&7�D�U�D�8���P�Q�Q��=�=�����
F��Y��8s�B�B!�	B'�,B'�basec	��# �URURSS5-n[X$5 [R"X5nUR5(d[
SUS35e[X5 [XU5nUc?[R"X5IShv�N [R"X5IShv�NnSnOSnURRSSS9 UR5n[S[U5[U55IShv�N [S	S
S[R"X5US9IShv�N U(a[S
SX6S9IShv�N U(d.[SSU3US9IShv�N(a[SXFS9IShv�N OJ[SSU3US9IShv�N(a[SSSUSU3US9IShv�N O[SSSXFS9IShv�N ['XU5$GNIGN.N�N�N�![ R"a-n	[%['XU55 [
SUSUS35U	eSn	A	ff=fN�N�N�N|Ni![(R*[ R"4a U(d[,R."USS9 ef=f7f)N� r]zrepo 'z(' is not registered (ctx repo add <url>)FT��parents�exist_ok�clone�remotezset-url�origin�r`�fetchzbranch 'z' not found on origin of 'rLzfor-each-refr^�checkoutzrefs/remotes/origin/z
--no-trackz-bzorigin/��
ignore_errors)�
branch_prefix�replacerhr�	repo_pathr.�FileNotFoundErrorrXr&�update_repo�default_branch�parent�mkdirrr�repo_urlrd�CalledProcessError�remove_contextr�asyncio�CancelledError�shutil�rmtree)
r!r
rr�rY�mirrorr�
fetch_base�preexisting�excs
          r�create_contextr��sY����
�
����c�3�!7�
7�F����
�_�_�S�
'�F��=�=�?�?��&���.V� W�X�X��S����4�(�D��|�����*�*�*��)�)�#�4�4���
��
��K�K���d�T��2��+�+�-�K�����V��c�$�i�8�8�8���)�X�u�~�~�c�7P�VZ�[�[�[��
e����4�B�B�B��I�n��F�8�>T�Z^�$_�_�_��J��9�9�9��^�/C�D�6�-J�PT�U�
U�
U��J��d�F�g�d�V�DT�Z^�_�_�_��J��d�F�M�M�M��4�t�$�$�A	+�4�	9�[�C���0�0�
e��w�t�4�8�9�'�(�4�&�8R�SW�RX�XY�(Z�[�ad�d��
e��`�
:�
U�_�
N���"�"�J�$A�$A�B����M�M�$�d�3�
�	�s�BJ�G#�J�8G&�93J�-"H=�G)�(H=�8G+�9H=�G/�G-�G/�H=�0H3�1H=�H5�H=�J�
H=�H7�H=�<H9�=H=�J�H=�H;�H=�J�&J�)H=�+H=�-G/�/H0�(H+�+H0�0H=�5H=�7H=�9H=�;H=�=AI?�?Jc�&�URU-U-$r#)�archive_dirr%s   r�archive_pathr��s���?�?�T�!�D�(�(rc�,�[UR5$)z2All archived contexts, most recently active first.)rFr�rHs rrWrW�s������!�!rc��[U5Vs/sHo"RU:XdMUPM nnU(d[SUS35eUS$s snf)z$Resolve an archived context by name.zno archived context 'rLr)rWrrMrNs    r�
find_archivedr��sM��'��,�?�,�Q���$��q�,�G�?���1�$��q�9�:�:��1�:���@rQc��[U5[U5-Vs/sHo"RU:XdMUPM nnU(d[SUS35eUS$s snf)z>Resolve a context name among live and archived contexts alike.rKrLr)rIrWrrMrNs    r�find_anyr�sV��'��,�}�S�/A�A�T�A�Q�V�V�t�^�q�A�G�T���L���a�0�1�1��1�:���Us
�A�Ac�L�URRUR5$r#)r�is_relative_tor��r!r's  r�is_archivedr�s���8�8�"�"�3�?�?�3�3rc��[XRURS9 [XRUR5nUR5(a[
SURS35eURRSSS9 [R"URU5 [URURU5$)z+Move a context's checkout into the archive.rRrLz' is already archivedTr�)
rXrrr�r
r.rVrr�r�r��mover�r!r'�dests   r�archive_contextr
�s����S�(�(�C�H�H�5���X�X�s�x�x�0�D��{�{�}�}���#�-�-��0E�F�G�G��K�K���d�T��2�
�K�K����$���3�8�8�S�X�X�t�,�,rc�6�[XRURS9 [XRUR5nUR
R
SSS9 [R"URU5 [URURU5$)z7Move an archived checkout back among the live contexts.rRTr�)
rXrrr&r
r�r�r�rrrs   r�unarchive_contextr�sh���S�(�(�C�H�H�5���X�X�s�x�x�0�D��K�K���d�T��2�
�K�K����$���3�8�8�S�X�X�t�,�,rc���URS-S-R5R5nSnUR	U5(aURU5$S$![a gf=f)aThe checkout's branch, read from `.git/HEAD` to spare a subprocess.

Anything but a symbolic ref to a branch (e.g. a detached HEAD's raw
hash) reads as no branch, like `git branch --show-current`. So does an
unreadable HEAD: a checkout damaged on disk must not break listings.
r)r+�zref: refs/heads/)r�	read_textra�OSErrorrc�removeprefix)r'�head�prefixs   r�current_branchr�sk������6�!�F�*�5�5�7�=�=�?�� �F�(,����(?�(?�4���V�$�G�R�G������s�.A�
A(�'A(c�>�[[SSURS95$)N�statusz--porcelainr�)�boolrr)r's r�is_dirtyr�s����H�m����:�;�;rc	�d�[SSSSSURS9nU(aUR5$/$)N�logz
--branchesz--notz	--remotesz	--oneliner�)rr�
splitlines)r'�outs  r�unpushed_commitsrs.��

�e�\�7�K��#�(�(�
S�C�"�3�>�>��*��*rc�&�URRURR[-5nUR	5(a[
R"USS9 URRU5 [
R"U5 g)NTr�)r�	with_namerr@r.r�r��rename)r'�doomeds  rr�r�sY��
�X�X�
�
����
�
�0@� @�
A�F�
�}�}����
�
�f�D�1��H�H�O�O�F��
�M�M�&�rc��URUR4H�nUR5(dMUR5H�nUR5(dMUR5HUnURR[5(dM)UR5(dM@[R"USS9 MW M� M� g)z<Finish removals that a crash or kill interrupted mid-delete.Tr�N)	r$r�r<r>rr?r@r�r�)r!r5rD�entrys    r�sweep_deletingr$
s����!�!�3�?�?�3���{�{�}�}������H��?�?�$�$��!�)�)�+���:�:�&�&�'7�8�8�U�\�\�^�^��M�M�%�t�<�,�'�4rc�>�[U5Hn[U5 M g)z*Permanently delete every archived context.N)rWr�rs  r�
empty_archiver&s���S�!���s��"rr#)-r�r�r�rd�dataclassesr�pathlibrr'r�
ctx.configr�ctx.gitrrrr@rr&�floatr4�listrFrIrPrXrhr�r�r�r�r�rWr�rrrr
rrrrr�r$r&rrr�<module>r-s����
�
��!����"��$��*�*��*���*�f�*�C�*�s�*�t�*�	8�W�	8��	8�����g���"#�v�#�$�w�-�#�
�f��C��G��HL�
�&�
��
����
�PT�
� b�c�b�3�b�4�b�$�����V����,%�f�,%�C�,%�s�,%�#��*�,%�X_�,%�^)�f�)�C�)�s�)�t�)�"�v�"�$�w�-�"�
�v��S��W���&������4�V�4�'�4�d�4�-��-�g�-�'�-�-�6�-��-�G�-�H��H�C�H�<�'�<�d�<�+�'�+�d�3�i�+�
���D��
=��
=�4�
=��v��$�r