cerrado @ 4534dffb865eb1a50bfbc291a5c3798183081caf

feat: Add actual git listing implementation
  1diff --git a/go.mod b/go.mod
  2index ff4f2dd03286fea07e936a6b3961402b2971dae9..2122f6bb0e88ee0dacf217829b1693e79fb19e81 100644
  3--- a/go.mod
  4+++ b/go.mod
  5@@ -11,6 +11,28 @@ 	golang.org/x/sync v0.7.0
  6 )
  7 
  8 require (
  9+	dario.cat/mergo v1.0.0 // indirect
 10+	github.com/Microsoft/go-winio v0.6.1 // indirect
 11+	github.com/ProtonMail/go-crypto v1.0.0 // indirect
 12+	github.com/cloudflare/circl v1.3.7 // indirect
 13+	github.com/cyphar/filepath-securejoin v0.2.4 // indirect
 14 	github.com/dlclark/regexp2 v1.11.0 // indirect
 15+	github.com/emirpasic/gods v1.18.1 // indirect
 16+	github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
 17+	github.com/go-git/go-billy/v5 v5.5.0 // indirect
 18+	github.com/go-git/go-git/v5 v5.12.0 // indirect
 19+	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 20+	github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
 21+	github.com/kevinburke/ssh_config v1.2.0 // indirect
 22+	github.com/pjbgf/sha1cd v0.3.0 // indirect
 23+	github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
 24+	github.com/skeema/knownhosts v1.2.2 // indirect
 25 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 26+	github.com/xanzy/ssh-agent v0.3.3 // indirect
 27+	golang.org/x/crypto v0.21.0 // indirect
 28+	golang.org/x/mod v0.12.0 // indirect
 29+	golang.org/x/net v0.22.0 // indirect
 30+	golang.org/x/sys v0.18.0 // indirect
 31+	golang.org/x/tools v0.13.0 // indirect
 32+	gopkg.in/warnings.v0 v0.1.2 // indirect
 33 )
 34diff --git a/go.sum b/go.sum
 35index 15e574af4ac10ebbfb80200b39121f4d3cda7584..ba2d937337ab28a5ed189010a1aad51addbdac36 100644
 36--- a/go.sum
 37+++ b/go.sum
 38@@ -1,5 +1,12 @@
 39+dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
 40+dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
 41 git.sr.ht/~emersion/go-scfg v0.0.0-20240128091534-2ae16e782082 h1:9Udx5fm4vRtmgDIBjy2ef5QioHbzpw5oHabbhpAUyEw=
 42 git.sr.ht/~emersion/go-scfg v0.0.0-20240128091534-2ae16e782082/go.mod h1:ybgvEJTIx5XbaspSviB3KNa6OdPmAZqDoSud7z8fFlw=
 43+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
 44+github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
 45+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
 46+github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
 47+github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
 48 github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU=
 49 github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
 50 github.com/alecthomas/chroma/v2 v2.13.0 h1:VP72+99Fb2zEcYM0MeaWJmV+xQvz5v5cxRHd+ooU1lI=
 51@@ -8,32 +15,128 @@ github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
 52 github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
 53 github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
 54 github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 55+github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
 56+github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
 57+github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
 58+github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
 59+github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
 60+github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
 61+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 62 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 63 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 64 github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
 65 github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 66+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
 67+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
 68+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
 69+github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
 70+github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
 71+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
 72+github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys=
 73+github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
 74+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 75+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 76 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 77 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 78 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 79 github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
 80 github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
 81+github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 82+github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 83+github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
 84+github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 85 github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 86 github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 87+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 88+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 89+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 90+github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
 91+github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
 92+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 93+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 94+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
 95+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
 96+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 97+github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
 98+github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
 99+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
100+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
101+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
102 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
103 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
104 github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
105 github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM=
106 github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8=
107 github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
108+github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
109+github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
110+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
111+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
112 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
113+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
114+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
115+golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
116+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
117+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
118+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
119+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
120+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
121+golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
122+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
123+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
124 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
125 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
126+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
127+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
128+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
129+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
130+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
131+golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
132+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
133+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
134+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
135+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
136 golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
137 golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
138+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
139+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
140 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
141+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
142 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
143 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
144+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
145+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
146+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
147+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
148+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
149+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
150+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
151+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
152+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
153+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
154 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
155+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
156+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
157+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
158+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
159+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
160 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
161 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
162+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
163+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
164+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
165+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
166 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
167+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
168+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
169+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
170+golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
171+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
172+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
173+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
174+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
175+gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
176+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
177+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
178+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
179+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
180diff --git a/main.go b/main.go
181index 0ba2dbc9553dcab2cbb3b5c0b3172c79c7dda650..644b96caba69614ba0b5c8ff33fd1280cba9eaf7 100644
182--- a/main.go
183+++ b/main.go
184@@ -9,6 +9,8 @@ 	"os"
185 	"os/signal"
186 	"time"
187 
188+	"git.gabrielgio.me/cerrado/pkg/config"
189+	"git.gabrielgio.me/cerrado/pkg/git"
190 	"git.gabrielgio.me/cerrado/pkg/handler"
191 	"git.gabrielgio.me/cerrado/pkg/service"
192 	"git.gabrielgio.me/cerrado/pkg/worker"
193@@ -38,8 +40,21 @@ 	if err != nil {
194 		return err
195 	}
196 
197+	f, err := os.Open(*configPath)
198+	if err != nil {
199+		return err
200+	}
201+
202+	config, err := config.Parse(f)
203+	if err != nil {
204+		return err
205+	}
206+
207+	// repositories
208+	gitServer := git.NewGitServerRepository(config.Scan.Path)
209+
210 	// services
211-	gitService := service.NewGitService()
212+	gitService := service.NewGitService(gitServer)
213 
214 	//handlers
215 	gitHandler := handler.NewGitHandler(gitService)
216diff --git a/pkg/git/git.go b/pkg/git/git.go
217new file mode 100644
218index 0000000000000000000000000000000000000000..85a3b9560ac63e1915751dc8407365e72539c8fc
219--- /dev/null
220+++ b/pkg/git/git.go
221@@ -0,0 +1,82 @@
222+package git
223+
224+import (
225+	"errors"
226+	"os"
227+	"path"
228+
229+	"git.gabrielgio.me/cerrado/pkg/u"
230+	"github.com/go-git/go-git/v5"
231+	"github.com/go-git/go-git/v5/plumbing/object"
232+)
233+
234+var (
235+	ScanPathErr    = errors.New("Scan path does not exist")
236+	RepoPathErr    = errors.New("Repository path does not exist")
237+	missingHeadErr = errors.New("Head not found")
238+)
239+
240+type (
241+	GitServerRepository struct {
242+		scanPath string
243+	}
244+
245+	GitRepository struct {
246+		path string
247+	}
248+)
249+
250+func NewGitServerRepository(scanPath string) *GitServerRepository {
251+	return &GitServerRepository{scanPath}
252+}
253+
254+func NewGitRepository(dir string) *GitRepository {
255+	return &GitRepository{
256+		path: dir,
257+	}
258+}
259+
260+func (g *GitServerRepository) List() ([]*GitRepository, error) {
261+	if !u.FileExist(g.scanPath) {
262+		return nil, ScanPathErr
263+	}
264+
265+	entries, err := os.ReadDir(g.scanPath)
266+	if err != nil {
267+		return nil, err
268+	}
269+
270+	repos := make([]*GitRepository, 0)
271+	for _, e := range entries {
272+		if !e.IsDir() {
273+			continue
274+		}
275+
276+		fullPath := path.Join(g.scanPath, e.Name())
277+		repos = append(repos, NewGitRepository(fullPath))
278+	}
279+
280+	return repos, nil
281+}
282+
283+func (g *GitRepository) Path() string {
284+	return g.path
285+}
286+
287+func (g *GitRepository) LastCommit() (*object.Commit, error) {
288+	repo, err := git.PlainOpen(g.path)
289+	if err != nil {
290+		return nil, err
291+	}
292+
293+	ref, err := repo.Head()
294+	if err != nil {
295+		return nil, errors.Join(missingHeadErr, err)
296+	}
297+
298+	c, err := repo.CommitObject(ref.Hash())
299+	if err != nil {
300+		return nil, err
301+	}
302+	return c, nil
303+}
304diff --git a/pkg/handler/git.go b/pkg/handler/git.go
305index 5b0912187f278158f0ab3ff7287a1a2f06e0e6df..1ed2c49d357ffbb4b74f2a2331cd84fd6a660794 100644
306--- a/pkg/handler/git.go
307+++ b/pkg/handler/git.go
308@@ -1,6 +1,7 @@
309 package handler
310 
311 import (
312+	"log/slog"
313 	"net/http"
314 
315 	"git.gabrielgio.me/cerrado/pkg/service"
316@@ -16,6 +17,12 @@ 	return &GitHandler{gitService}
317 }
318 
319 func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) {
320-	gitList := &templates.GitListPage{g.gitService.ListRepositories()}
321+	repos, err := g.gitService.ListRepositories()
322+	if err != nil {
323+		slog.Error("Error listing repo", "error", err)
324+		return
325+	}
326+
327+	gitList := &templates.GitListPage{repos}
328 	templates.WritePageTemplate(w, gitList)
329 }
330diff --git a/pkg/handler/status.go b/pkg/handler/status.go
331index 2a84a7e0e00ce79a7236eda6e444c6c3220209b9..1ca7f706241b1bce139bef2eb71b704b9e1c76aa 100644
332--- a/pkg/handler/status.go
333+++ b/pkg/handler/status.go
334@@ -19,7 +19,7 @@ func ConfigFile(configPath string) func(http.ResponseWriter, *http.Request) {
335 	return func(w http.ResponseWriter, _ *http.Request) {
336 		f, err := os.Open(configPath)
337 		if err != nil {
338-			slog.Error("Error openning config file json", "error", err, "path", configPath)
339+			slog.Error("Error openning config file", "error", err, "path", configPath)
340 			return
341 		}
342 
343diff --git a/pkg/service/git.go b/pkg/service/git.go
344index 0415ceeee803e69b7e73d69b5875edd6321cfffd..94ca75e454f3af3b40f834ea5f858b37b6e56efd 100644
345--- a/pkg/service/git.go
346+++ b/pkg/service/git.go
347@@ -1,30 +1,53 @@
348 package service
349 
350-import "fmt"
351+import (
352+	"path"
353+
354+	"git.gabrielgio.me/cerrado/pkg/git"
355+)
356 
357 type (
358-	GitService struct{}
359+	GitService struct {
360+		server *git.GitServerRepository
361+	}
362 	Repository struct {
363-		Name        string
364-		Title       string
365-		Description string
366+		Name              string
367+		Title             string
368+		LastCommitMessage string
369+		LastCommitDate    string
370 	}
371 )
372 
373-func NewGitService() *GitService {
374-	return &GitService{}
375+// TODO: make it configurable
376+const timeFormat = "2006.01.02 15:04:05"
377+
378+func NewGitService(server *git.GitServerRepository) *GitService {
379+	return &GitService{
380+		server: server,
381+	}
382 }
383 
384-func (g *GitService) ListRepositories() []*Repository {
385-	repos := make([]*Repository, 10)
386+func (g *GitService) ListRepositories() ([]*Repository, error) {
387+	rs, err := g.server.List()
388+	if err != nil {
389+		return nil, err
390+	}
391+
392+	repos := make([]*Repository, len(rs))
393+	for i, r := range rs {
394+		obj, err := r.LastCommit()
395+		if err != nil {
396+			return nil, err
397+		}
398 
399-	for i := range 10 {
400+		baseName := path.Base(r.Path())
401 		repos[i] = &Repository{
402-			Name:        fmt.Sprintf("repository-%d", i),
403-			Title:       fmt.Sprintf("Repository %d", i),
404-			Description: fmt.Sprintf("This is a description for repository %d", i),
405+			Name:              baseName,
406+			Title:             baseName,
407+			LastCommitMessage: obj.Message,
408+			LastCommitDate:    obj.Author.When.Format(timeFormat),
409 		}
410 	}
411 
412-	return repos
413+	return repos, nil
414 }
415diff --git a/pkg/u/file.go b/pkg/u/file.go
416new file mode 100644
417index 0000000000000000000000000000000000000000..cf86c7513b5e1d802fb9a7f0afc6d4442bae3ba4
418--- /dev/null
419+++ b/pkg/u/file.go
420@@ -0,0 +1,21 @@
421+package u
422+
423+import (
424+	"errors"
425+	"log/slog"
426+	"os"
427+)
428+
429+func FileExist(filename string) bool {
430+	if _, err := os.Stat(filename); err == nil {
431+		return true
432+
433+	} else if errors.Is(err, os.ErrNotExist) {
434+		return false
435+	} else {
436+		slog.Warn("Schrödinger's file: it may or may not exist", "file", filename) 
437+		// Schrodinger: file may or may not exist. To be extra safe it will
438+		// report the file doest not exist
439+		return false
440+	}
441+}
442diff --git a/pkg/u/util.go b/pkg/u/list.go
443rename from pkg/u/util.go
444rename to pkg/u/list.go
445diff --git a/pkg/u/util_test.go b/pkg/u/list_test.go
446rename from pkg/u/util_test.go
447rename to pkg/u/list_test.go
448diff --git a/scss/main.scss b/scss/main.scss
449index eb8a6fe7dc52e09b62850258544a966c374925d2..26218e875bfea6718f40e7173d5d7b7528a4db9c 100644
450--- a/scss/main.scss
451+++ b/scss/main.scss
452@@ -1,7 +1,8 @@
453 //$card-border-width: 0;
454 $card-border-radius: 0;
455 $card-cap-padding-y: 0;
456-$card-cap-padding-x: 0;
457+$card-cap-padding-x: 5px;
458+$card-group-margin: 10 px;
459 
460 // basic functionality
461 @import "bootstrap/scss/_functions.scss";
462@@ -24,3 +25,7 @@ body {
463     font-family: $font-family-monospace;
464     margin: 0;
465 }
466+
467+.card-body {
468+  padding: 5px;
469+}
470diff --git a/templates/base.qtpl b/templates/base.qtpl
471index 6bef9863b93963da9f9b9cc854c830a3757b6c66..df6c6fc96023c9c6e0254ff2457e91d4a20ac08c 100644
472--- a/templates/base.qtpl
473+++ b/templates/base.qtpl
474@@ -25,6 +25,7 @@ {% func PageTemplate(p Page) %}
475 <html lang="en">
476     <head>
477         <meta charset="utf-8">
478+        <link rel="icon" href="data:,">
479         <title>cerrado | {%= p.Title() %}</title> 
480         <link rel="stylesheet" href="/static/main.css">
481         <meta name="viewport" content="width=device-width, initial-scale=1" />
482diff --git a/templates/base.qtpl.go b/templates/base.qtpl.go
483index ffee940f7a00b30ecf95ca6d7fa2bce970300ead..f78744dd11eaa501772cc9945807fc405f570cf2 100644
484--- a/templates/base.qtpl.go
485+++ b/templates/base.qtpl.go
486@@ -63,10 +63,11 @@ 	qw422016.N().S(`
487 <html lang="en">
488     <head>
489         <meta charset="utf-8">
490+        <link rel="icon" href="data:,">
491         <title>cerrado | `)
492-//line base.qtpl:28
493+//line base.qtpl:29
494 	p.StreamTitle(qw422016)
495-//line base.qtpl:28
496+//line base.qtpl:29
497 	qw422016.N().S(`</title> 
498         <link rel="stylesheet" href="/static/main.css">
499         <meta name="viewport" content="width=device-width, initial-scale=1" />
500@@ -84,144 +85,144 @@           </div>
501         </nav>
502         <div class="container">
503             `)
504-//line base.qtpl:44
505+//line base.qtpl:45
506 	p.StreamContent(qw422016)
507-//line base.qtpl:44
508+//line base.qtpl:45
509 	qw422016.N().S(`
510         </div>
511     </body>
512     `)
513-//line base.qtpl:47
514+//line base.qtpl:48
515 	p.StreamScript(qw422016)
516-//line base.qtpl:47
517+//line base.qtpl:48
518 	qw422016.N().S(`
519 </html>
520 `)
521-//line base.qtpl:49
522+//line base.qtpl:50
523 }
524 
525-//line base.qtpl:49
526+//line base.qtpl:50
527 func WritePageTemplate(qq422016 qtio422016.Writer, p Page) {
528-//line base.qtpl:49
529+//line base.qtpl:50
530 	qw422016 := qt422016.AcquireWriter(qq422016)
531-//line base.qtpl:49
532+//line base.qtpl:50
533 	StreamPageTemplate(qw422016, p)
534-//line base.qtpl:49
535+//line base.qtpl:50
536 	qt422016.ReleaseWriter(qw422016)
537-//line base.qtpl:49
538+//line base.qtpl:50
539 }
540 
541-//line base.qtpl:49
542+//line base.qtpl:50
543 func PageTemplate(p Page) string {
544-//line base.qtpl:49
545+//line base.qtpl:50
546 	qb422016 := qt422016.AcquireByteBuffer()
547-//line base.qtpl:49
548+//line base.qtpl:50
549 	WritePageTemplate(qb422016, p)
550-//line base.qtpl:49
551+//line base.qtpl:50
552 	qs422016 := string(qb422016.B)
553-//line base.qtpl:49
554+//line base.qtpl:50
555 	qt422016.ReleaseByteBuffer(qb422016)
556-//line base.qtpl:49
557+//line base.qtpl:50
558 	return qs422016
559-//line base.qtpl:49
560+//line base.qtpl:50
561 }
562 
563-//line base.qtpl:51
564+//line base.qtpl:52
565 type BasePage struct{}
566 
567-//line base.qtpl:52
568+//line base.qtpl:53
569 func (p *BasePage) StreamTitle(qw422016 *qt422016.Writer) {
570-//line base.qtpl:52
571+//line base.qtpl:53
572 	qw422016.N().S(`Empty`)
573-//line base.qtpl:52
574+//line base.qtpl:53
575 }
576 
577-//line base.qtpl:52
578+//line base.qtpl:53
579 func (p *BasePage) WriteTitle(qq422016 qtio422016.Writer) {
580-//line base.qtpl:52
581+//line base.qtpl:53
582 	qw422016 := qt422016.AcquireWriter(qq422016)
583-//line base.qtpl:52
584+//line base.qtpl:53
585 	p.StreamTitle(qw422016)
586-//line base.qtpl:52
587+//line base.qtpl:53
588 	qt422016.ReleaseWriter(qw422016)
589-//line base.qtpl:52
590+//line base.qtpl:53
591 }
592 
593-//line base.qtpl:52
594+//line base.qtpl:53
595 func (p *BasePage) Title() string {
596-//line base.qtpl:52
597+//line base.qtpl:53
598 	qb422016 := qt422016.AcquireByteBuffer()
599-//line base.qtpl:52
600+//line base.qtpl:53
601 	p.WriteTitle(qb422016)
602-//line base.qtpl:52
603+//line base.qtpl:53
604 	qs422016 := string(qb422016.B)
605-//line base.qtpl:52
606+//line base.qtpl:53
607 	qt422016.ReleaseByteBuffer(qb422016)
608-//line base.qtpl:52
609+//line base.qtpl:53
610 	return qs422016
611-//line base.qtpl:52
612+//line base.qtpl:53
613 }
614 
615-//line base.qtpl:53
616+//line base.qtpl:54
617 func (p *BasePage) StreamBody(qw422016 *qt422016.Writer) {
618-//line base.qtpl:53
619+//line base.qtpl:54
620 	qw422016.N().S(`HelloWorld`)
621-//line base.qtpl:53
622+//line base.qtpl:54
623 }
624 
625-//line base.qtpl:53
626+//line base.qtpl:54
627 func (p *BasePage) WriteBody(qq422016 qtio422016.Writer) {
628-//line base.qtpl:53
629+//line base.qtpl:54
630 	qw422016 := qt422016.AcquireWriter(qq422016)
631-//line base.qtpl:53
632+//line base.qtpl:54
633 	p.StreamBody(qw422016)
634-//line base.qtpl:53
635+//line base.qtpl:54
636 	qt422016.ReleaseWriter(qw422016)
637-//line base.qtpl:53
638+//line base.qtpl:54
639 }
640 
641-//line base.qtpl:53
642+//line base.qtpl:54
643 func (p *BasePage) Body() string {
644-//line base.qtpl:53
645+//line base.qtpl:54
646 	qb422016 := qt422016.AcquireByteBuffer()
647-//line base.qtpl:53
648+//line base.qtpl:54
649 	p.WriteBody(qb422016)
650-//line base.qtpl:53
651+//line base.qtpl:54
652 	qs422016 := string(qb422016.B)
653-//line base.qtpl:53
654+//line base.qtpl:54
655 	qt422016.ReleaseByteBuffer(qb422016)
656-//line base.qtpl:53
657+//line base.qtpl:54
658 	return qs422016
659-//line base.qtpl:53
660+//line base.qtpl:54
661 }
662 
663-//line base.qtpl:54
664+//line base.qtpl:55
665 func (p *BasePage) StreamScript(qw422016 *qt422016.Writer) {
666-//line base.qtpl:54
667+//line base.qtpl:55
668 }
669 
670-//line base.qtpl:54
671+//line base.qtpl:55
672 func (p *BasePage) WriteScript(qq422016 qtio422016.Writer) {
673-//line base.qtpl:54
674+//line base.qtpl:55
675 	qw422016 := qt422016.AcquireWriter(qq422016)
676-//line base.qtpl:54
677+//line base.qtpl:55
678 	p.StreamScript(qw422016)
679-//line base.qtpl:54
680+//line base.qtpl:55
681 	qt422016.ReleaseWriter(qw422016)
682-//line base.qtpl:54
683+//line base.qtpl:55
684 }
685 
686-//line base.qtpl:54
687+//line base.qtpl:55
688 func (p *BasePage) Script() string {
689-//line base.qtpl:54
690+//line base.qtpl:55
691 	qb422016 := qt422016.AcquireByteBuffer()
692-//line base.qtpl:54
693+//line base.qtpl:55
694 	p.WriteScript(qb422016)
695-//line base.qtpl:54
696+//line base.qtpl:55
697 	qs422016 := string(qb422016.B)
698-//line base.qtpl:54
699+//line base.qtpl:55
700 	qt422016.ReleaseByteBuffer(qb422016)
701-//line base.qtpl:54
702+//line base.qtpl:55
703 	return qs422016
704-//line base.qtpl:54
705+//line base.qtpl:55
706 }
707diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl
708index 10a89da1a91734e006f2ef7e191ae51bc269ec01..84a42f944fbfbd91ab43d14fc93c03a35a3092aa 100644
709--- a/templates/gitlist.qtpl
710+++ b/templates/gitlist.qtpl
711@@ -14,14 +14,17 @@ {% func (p *GitListPage) Content() %}
712 {% for _, c := range u.ChunkBy(p.Respositories, 3) %}
713 <div class="row">
714   {% for _, r := range c %}
715-  <div class="col-md-4 g-0">
716+  <div class="col-md g-1">
717     <div class="card">
718       <div class="card-header">
719-        {%s r.Title %}
720+        <a href="/{%s r.Name %}" class="btn btn-primary">{%s r.Title %}</a>
721       </div>
722       <div class="card-body">
723-        <p class="card-text">{%s r.Description %}</p>
724-        <a href="/{%s r.Name %}" class="btn btn-primary">go to repository</a>
725+        <p class="card-text lead">{%s r.LastCommitMessage %}</p> 
726+        <p class="card-text"><small>{%s r.LastCommitDate %}</small></p> 
727+        <a href="#" class="card-link">summary</a>
728+        <a href="#" class="card-link">log</a>
729+        <a href="#" class="card-link">tree</a>
730       </div>
731     </div>
732   </div>
733diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go
734index b02eeadf929a41ad4b3621deb6f5b7cb34be5454..d16b8d5e143d4bd3c1c7f32faec093186c9ee319 100644
735--- a/templates/gitlist.qtpl.go
736+++ b/templates/gitlist.qtpl.go
737@@ -76,100 +76,107 @@ //line gitlist.qtpl:16
738 		for _, r := range c {
739 //line gitlist.qtpl:16
740 			qw422016.N().S(`
741-  <div class="col-md-4 g-0">
742+  <div class="col-md g-1">
743     <div class="card">
744       <div class="card-header">
745-        `)
746+        <a href="/`)
747+//line gitlist.qtpl:20
748+			qw422016.E().S(r.Name)
749+//line gitlist.qtpl:20
750+			qw422016.N().S(`" class="btn btn-primary">`)
751 //line gitlist.qtpl:20
752 			qw422016.E().S(r.Title)
753 //line gitlist.qtpl:20
754-			qw422016.N().S(`
755+			qw422016.N().S(`</a>
756       </div>
757       <div class="card-body">
758-        <p class="card-text">`)
759+        <p class="card-text lead">`)
760 //line gitlist.qtpl:23
761-			qw422016.E().S(r.Description)
762+			qw422016.E().S(r.LastCommitMessage)
763 //line gitlist.qtpl:23
764-			qw422016.N().S(`</p>
765-        <a href="/`)
766+			qw422016.N().S(`</p> 
767+        <p class="card-text"><small>`)
768 //line gitlist.qtpl:24
769-			qw422016.E().S(r.Name)
770+			qw422016.E().S(r.LastCommitDate)
771 //line gitlist.qtpl:24
772-			qw422016.N().S(`" class="btn btn-primary">go to repository</a>
773+			qw422016.N().S(`</small></p> 
774+        <a href="#" class="card-link">summary</a>
775+        <a href="#" class="card-link">log</a>
776+        <a href="#" class="card-link">tree</a>
777       </div>
778     </div>
779   </div>
780   `)
781-//line gitlist.qtpl:28
782+//line gitlist.qtpl:31
783 		}
784-//line gitlist.qtpl:28
785+//line gitlist.qtpl:31
786 		qw422016.N().S(`
787 </div>
788 `)
789-//line gitlist.qtpl:30
790+//line gitlist.qtpl:33
791 	}
792-//line gitlist.qtpl:30
793+//line gitlist.qtpl:33
794 	qw422016.N().S(`
795 `)
796-//line gitlist.qtpl:31
797+//line gitlist.qtpl:34
798 }
799 
800-//line gitlist.qtpl:31
801+//line gitlist.qtpl:34
802 func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer) {
803-//line gitlist.qtpl:31
804+//line gitlist.qtpl:34
805 	qw422016 := qt422016.AcquireWriter(qq422016)
806-//line gitlist.qtpl:31
807+//line gitlist.qtpl:34
808 	p.StreamContent(qw422016)
809-//line gitlist.qtpl:31
810+//line gitlist.qtpl:34
811 	qt422016.ReleaseWriter(qw422016)
812-//line gitlist.qtpl:31
813+//line gitlist.qtpl:34
814 }
815 
816-//line gitlist.qtpl:31
817+//line gitlist.qtpl:34
818 func (p *GitListPage) Content() string {
819-//line gitlist.qtpl:31
820+//line gitlist.qtpl:34
821 	qb422016 := qt422016.AcquireByteBuffer()
822-//line gitlist.qtpl:31
823+//line gitlist.qtpl:34
824 	p.WriteContent(qb422016)
825-//line gitlist.qtpl:31
826+//line gitlist.qtpl:34
827 	qs422016 := string(qb422016.B)
828-//line gitlist.qtpl:31
829+//line gitlist.qtpl:34
830 	qt422016.ReleaseByteBuffer(qb422016)
831-//line gitlist.qtpl:31
832+//line gitlist.qtpl:34
833 	return qs422016
834-//line gitlist.qtpl:31
835+//line gitlist.qtpl:34
836 }
837 
838-//line gitlist.qtpl:33
839+//line gitlist.qtpl:36
840 func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer) {
841-//line gitlist.qtpl:33
842+//line gitlist.qtpl:36
843 	qw422016.N().S(`
844 `)
845-//line gitlist.qtpl:34
846+//line gitlist.qtpl:37
847 }
848 
849-//line gitlist.qtpl:34
850+//line gitlist.qtpl:37
851 func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer) {
852-//line gitlist.qtpl:34
853+//line gitlist.qtpl:37
854 	qw422016 := qt422016.AcquireWriter(qq422016)
855-//line gitlist.qtpl:34
856+//line gitlist.qtpl:37
857 	p.StreamScript(qw422016)
858-//line gitlist.qtpl:34
859+//line gitlist.qtpl:37
860 	qt422016.ReleaseWriter(qw422016)
861-//line gitlist.qtpl:34
862+//line gitlist.qtpl:37
863 }
864 
865-//line gitlist.qtpl:34
866+//line gitlist.qtpl:37
867 func (p *GitListPage) Script() string {
868-//line gitlist.qtpl:34
869+//line gitlist.qtpl:37
870 	qb422016 := qt422016.AcquireByteBuffer()
871-//line gitlist.qtpl:34
872+//line gitlist.qtpl:37
873 	p.WriteScript(qb422016)
874-//line gitlist.qtpl:34
875+//line gitlist.qtpl:37
876 	qs422016 := string(qb422016.B)
877-//line gitlist.qtpl:34
878+//line gitlist.qtpl:37
879 	qt422016.ReleaseByteBuffer(qb422016)
880-//line gitlist.qtpl:34
881+//line gitlist.qtpl:37
882 	return qs422016
883-//line gitlist.qtpl:34
884+//line gitlist.qtpl:37
885 }