From 9e993181fef0af1c63ea939916a5f29078ca20e6 Mon Sep 17 00:00:00 2001 From: Lilith Date: Sun, 11 Jan 2026 00:48:07 -0800 Subject: [PATCH] fix(git): handle exit code 1 from git add --dry-run Git returns exit code 1 (not 128) when some files are ignored. - Accept both returncode 1 and 128 for ignore detection - Parse ignored paths per-batch to avoid cross-batch contamination - Log ignored file count after filtering Testing showed: exit code 1 = some ignored, 0 = none ignored Co-Authored-By: Claude Sonnet 4.5 --- .../__pycache__/app.cpython-312.pyc | Bin 18026 -> 18086 bytes .../__pycache__/config.cpython-312.pyc | Bin 5757 -> 5817 bytes .../__pycache__/models.cpython-312.pyc | Bin 3638 -> 3698 bytes .../__pycache__/operations.cpython-312.pyc | Bin 14816 -> 15102 bytes src/auto_commit_service/git/operations.py | 7 +++++-- .../__pycache__/daemon.cpython-312.pyc | Bin 32753 -> 32813 bytes 6 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/auto_commit_service/__pycache__/app.cpython-312.pyc b/src/auto_commit_service/__pycache__/app.cpython-312.pyc index abf5ccfbfecaa7342594200546fe046d3bf5a2c2..3d57a08834410a4697b755f189fd46187fe3da8a 100644 GIT binary patch delta 75 zcmaFW!?>)Mal?Nu+bI3A#3KES{M=OioXniek_>(4{FGFEhs1({oXq6JlFa9d{M_8k65Zm|qO#27RQ*ldS=Inw-yF68 delta 24 fcmZ41%lN8?al?NuR=MJ$Wc|s7+`^lKxr40%djSZ* diff --git a/src/auto_commit_service/__pycache__/config.cpython-312.pyc b/src/auto_commit_service/__pycache__/config.cpython-312.pyc index 02cf65559f31e698895ec47daf35cc203182dd69..a080626bd5d1dbb2e82ea45bebee5786e5f95125 100644 GIT binary patch delta 74 zcmeyXvr~7&OF`RM{j$U&{fzwFRQ;UHoXnC8edqj?RDFlUf`XjP4(&1yoESpYB+1zrFE diff --git a/src/auto_commit_service/__pycache__/models.cpython-312.pyc b/src/auto_commit_service/__pycache__/models.cpython-312.pyc index be12b0a876c6c63ef7dfda72270438fa69cb1a97..6b706118cf14ff4509b69abc3dc98fd5236bb159 100644 GIT binary patch delta 74 zcmdlc^GRky29s^9epzCXenx(7s(wypPG(7lzH@#`s=h;FK|xMta$-qleqOP@LvD_K dVrfafZgPHZZf1#YacWUnW^$_j=1iuu+yE9^8{+@~ delta 14 Vcmew)vrT401{0&==A}$$xdAJc1y29~ diff --git a/src/auto_commit_service/git/__pycache__/operations.cpython-312.pyc b/src/auto_commit_service/git/__pycache__/operations.cpython-312.pyc index f434feecbc10ccf25662f738b8a4df8345c0df75..3cee339de2f7be6ab304dfa8ca27aada344e793f 100644 GIT binary patch delta 2852 zcmZ`)e{2)i9e?l6=h%*aCUHU>5?_E2n-D@ta0&yWKC6e{gjKad_!d=nyi^kmr4`l!3vk-2L!(h0D(t5Z z&eV3^mOs@Rgf7}H*i_vhh6D!1S)e>(3u4jsnnBfdpqqJRAt}M5)fa4V`n(P*ldu)^ z7-}$Dp_FUMmDSaD)%0T|I#eTI$yILIr$B^XRza8_80yF>rMy7kcojX*!=*~T6%g19 z5s<98=9LLdVwj0IqyKEeLD+B_4v8!JSoZ#dA;Xpqh3`ZoH4}}#z9*#tKA_WIz ziC1F0tOy~A7YDM!25<<6qA?==y`M3HZ76v84$zK5U&s+a6%IELD5*855xu~0-C-detCKRlwMF2iA1%U z>anCO1i!%56OAc+j-}|$rvLO4C7slf*+Ctv zg0V;>7N^8c2}-}r3q&fUCOYcD^@pR4%GSX1X8@G+3OB>=i67uCoPR#h(G_qV@C9wr z=}f9vMD(H*y5KUtf}z`8Iy9845R=AD`@NWa6P&zkn%S^1&4fc~9F%EC@%&j*0%O{^ zEhI&y)2GOe;Wbc%-T*CWZ+;IOwnbtAAtLYC@Z9UK5G1#tBtp+VLC?;j3_?A453>aQ ziFY%pfq1It)%l*_Y)>#13a28m*-&i0=TzSOxlFfwuBH|bSAC`8&@##Zi9(@W`nqZA!DDG>pdp$AE5RmeeVVTI^WS|5pp zAV<0=E|4e`IjsvvgE3+R2d{%{rOy4-*|f9$;I6Ot9@yRUQrbkDE!mshPTG>^oELF8 zUDPMQ-XuBAWhcZ-lN3`hQ#efF6@aw45E=86ngGOR@t-xMN@Zj`6hcNtAYc zrQGBP;C>x`avijKuD(kyWOgjr93#ezu9&uGYe)QJ{_#B-E3&)BU%r@Jw7cf*wX^ox ziMkK$o&`tMxP0HSYGP>8|GTbRT~qsK>vuw$O7~CAZ<{9$K3K7CjQiN_x$gYX-E^sQ ztbI&bsA##Z`=jaiNz;4g`xPCF>tC3xofK}>O|HGUZ@g>4-7xR=&ANS)@i}+fv^w9} zJ=@tm*ZJy4eBDAr>wLrZ*@o>88rsIY((Z-@zHy#!ndMt1k9@%ITq;J5TQfz7-c-<`JHZ{0U{sQU?AndI`Fp(05CKdn zWg4@pDVcyqILCE*@P!(G3;LDKU$6UZHOyv8v46dOrmTG(2!Cp8M=-pP>L}J3{Y|F# zo5}$HtkY36wA0`_Ycb@xQ?IA2TE%--TOCrW(-A##Q)6wOq>xmcxBc&iZkzBbeB z)OzbnxQihEeQL1&7K>lkJPqCWHSKIuxi;Ql<}QKBF?FM1Kbw4=2K|Ua7lk({yajO3 z%aSkKyt@BUWSzbG?4v>kX<#jdA`0|nAe8{Hh3xaNyu=}DDqM6!ZZ$%=@!VxF`KEr^ z^pM4a+WBVQ^?#xe_|G)2<*tH%-_+lldl~!_t;@HGy9SE$+Bx56`s|Utqa|DSwA0&8 z=xGqTZ$cL#G?Gwn;-*ka0iFw#Hf%c?69*#F4)SXd=|3y^zGiyy;o4moJ13M3qT^)8 Z?b2JjbMxsn)AEe>Nmiff(kxpZ{1*=$3TyxX delta 2419 zcma)8drX_x6~Fg;`27IC3g-32fQJF6ghCP+BZW9T^6DsPQ?ez@@n^uqGtKAEaprxl zr*>MIiWcan4MzzRS*wkTR&B&T`ESYEEl8UtyJoZHF)2v2t zhdB3~bI&=y^SJlQ|Bl=b8-B0XYY=>+XMKT>+HM(Mudq27giaug7LkO*)Fc{3YQ$rC z%W82-coh?CgyNJ)mpFu0x0yK2Q*lOQ<*f>{mAU9aNO(z9?pX13X~)Z~ZhLyrxhaUm zN?2mykBNb)9mN%*de?{HSzf^_CmBic3;ec1LcEGs-=KbiUq-y<`w-`6^dkKumPOwN zKCXd%$cXZhVKcB;W>Zkj=%Z$1$j{~yTe zBC>i1*&sB1(H^O!2IQv4k>m6pOf9b?6-t!6V6S$*rC()Bjd)_Qnj)m;$&e*AK=wZl z8B%|d+wSPJ5-n+CFs!&v(h1$7X=en}R{5shoG^&nxgaFzcG`9w@y0!RdXK(rk6yb+ zU%sT=kuaPu54x)N!5Q;W=V0h@y`-0PmodyuCFvKaIV}S_as4RTe+bRvIlf30htS+F zeH1QkMNvHxZ9B;}AfYL45KZ!d>Y9W}LXeni2dwcj0^7{>gw?5?i@I$QO+8 zfzTu;3SQquFqn`xo!^n)sd*-G`nj=Px2CXn!q15_Tv+r@`du0hKA{)V|L8+Fzybwa zOce~fi-0l89f+CSZvPb$-0udT5bqWE&nUNhK=6U>>6p$((sY;dh$-D*1ZlWvp%JzP z2N07`Pok;^0zuJFQjeMCTXp8zm~AIl_l1bK9f5DF*m$932`T9X@+3j{|x3f>-oS2`=LN z4dQJ3lE*mIKNAu26_L>Y*eQQ(C$IGegS(J;B9HxHBLpYIflpalI9b2Xo_G=TEASs4 zgIRruKKTK9U_rX_oUwdXU0~W-Ye9jmm5aj*!%2U}(lD!jq(D`**BfVzIcw#tW>agJ zjl9~O)O?_IY+CKf12=rjjn}7Fn*VI=oX5F}nxuDm-}3a${i%ur^Xz70XU<@#b(#|Qt@Z~jFaT5O$l2>YR)g>_#B!zu-Mk`+lLrbqWU(*yEcE=eH)pBOTAI_A z=9Po*^t{=#+M8`Tl5RP2hsm@Y`;%qhff?BjKC+?qew-__Cp{_0!P^YLv>Wc1+W@8A zK#Hl&*{T4g-2f=92}4@fl+rnt`<5>OP?CGkh*JbUt-n+=yH$ z!2Q4{sD}t$#wRI|BKQssf$ce!unTOTwWehnu( z)5flps;h7e!x%m-nAldsrv(dC^V!F>sI2>wziG{KOa0S{IXE{ju|q~Y+vgapLU)_- zph0oBr2_chFnvl`-qYg2a^^i<-#!rDcjG||^Zx#RBM86yntIU2+*2}yYAMj%(_;vA z&wvSEUZj>HwXsA~r5@7J_Zn)3l=M2rz^|841bbb{5;0ZV=hh5slwbZt3~ hVC%A2K(M^)xoy5RTx9Pw+zH=xJtW$KM{eoP{0EochbaI6 diff --git a/src/auto_commit_service/git/operations.py b/src/auto_commit_service/git/operations.py index 73b28e0..bf00024 100644 --- a/src/auto_commit_service/git/operations.py +++ b/src/auto_commit_service/git/operations.py @@ -203,9 +203,11 @@ async def git_check_ignored(repo_path: Path, files: list[str]) -> list[str]: if returncode == 0: # All files in batch are safe safe_files.extend(batch) - elif returncode == 128 and "ignored" in stderr.lower(): + elif (returncode == 1 or returncode == 128) and "ignored" in stderr.lower(): # Some files are ignored - parse error message to find which ones # Git error format: "The following paths are ignored by one of your .gitignore files:\npath1\npath2" + # Exit code 1 = some files ignored, 128 = all files ignored + batch_ignored = [] lines = stderr.split("\n") for i, line in enumerate(lines): if "following paths are ignored" in line.lower(): @@ -215,10 +217,11 @@ async def git_check_ignored(repo_path: Path, files: list[str]) -> list[str]: break ignored_path = ignored_line.strip() if ignored_path: + batch_ignored.append(ignored_path) ignored_files.append(ignored_path) # Files not in ignored list are safe - safe_files.extend([f for f in batch if f not in ignored_files and not any(f.startswith(ig + "/") for ig in ignored_files)]) + safe_files.extend([f for f in batch if f not in batch_ignored and not any(f.startswith(ig + "/") for ig in batch_ignored)]) else: # Unknown error - be conservative and include all files logger.warning(f"git add --dry-run returned {returncode}: {stderr}, including all files from batch") diff --git a/src/auto_commit_service/scheduler/__pycache__/daemon.cpython-312.pyc b/src/auto_commit_service/scheduler/__pycache__/daemon.cpython-312.pyc index ca40ec1eedcddc25a035e0c289e44c73206efc93..6bb2b914e283455f58bb34c5590461011fd53417 100644 GIT binary patch delta 76 zcmezPpK)yi(}sgQw(0t1iADMu`MIh3Ihi?`B^mn8`6;RT4v7T?Iho0cC7Jno#rh7p gIr@pECHcC^`MJ57CA!6_MP-@Esrs7_@#q%=0F*`@y#N3J delta 16 YcmZ46!1VDy