support character classes in `gix::refspec::parse`
Current behavior 😯
so I'm not sure if maybe I am not doing it right, but I know git servers support queries which can include wildcards and character classes as a sort of minimal subset of more complex regex.
As far as I can tell though, any attempt to actually query a remote with a character class fails, and it seems to be when I parse a string to a RefSpecRef via gix::refspec::parse. I get the error: "A reference must be a valid tag name as well"
Expected behavior 🤔
Ideally we should support any kinda of query a git server can support including character classes.
Git behavior
for example git ls-remote origin "refs/tags/v[0.9]* would return all tags that sorta look like a version
Steps to reproduce 🕹
Just include a character class in a call to the aforementioned parse function.
Thanks so much for making me aware of this feature!
It is true that Git globs include character classes, Gitoxide also implements them, and that it's possible to pass specs with globs to the server.
Doing the same with gix today results in the following:
❯ gix remote ref-map "refs/tags/v[0.9]*"
Error: A reference must be a valid tag name as well
Caused by:
A ref must not contain invalid bytes or ascii control characters: "["
Git on the other hand is fine with it:
❯ git ls-remote origin "refs/tags/v[0.9]*"
2ecf0dbadd08cf56c749663ff511d25f268de01b refs/tags/v0.0.24
f8c04842e5fa921cac398e4a37103644b5d84072 refs/tags/v0.0.25
a7d283ff6fca28e05c0ac0dbebd90596280c18a7 refs/tags/v0.1.0
[..]
But there is more:
❯ git ls-remote origin "refs/tags/v*"
e2ecf0dbadd08cf56c749663ff511d25f268de01b refs/tags/v0.0.24
f8c04842e5fa921cac398e4a37103644b5d84072 refs/tags/v0.0.25
a7d283ff6fca28e05c0ac0dbebd90596280c18a7 refs/tags/v0.1.0
[..]
❯ gix remote ref-map "refs/tags/v*"
Error: Both sides of the specification need a pattern, like 'a/*:b/*'
This basically is a whole new class of refspecs, i.e. refspecs which don't follow the typical pattern and that are just globs, effectively. Maybe this is also something special for git ls-remote which gix doesn't try to emulate with its remote ref-map subcommand.
However, since this works:
❯ gix remote ref-map "refs/heads/master"
04:45:48 remote-refs Connecting to "https://github.com/Byron/gitbutler"
refs/heads/master
3377495f544a2e166792638ff988bf53d5516708 refs/heads/master (fetch only)
server sent 40 tips, 39 were filtered due to 1 refspec(s).
I think that globs should also work. Maybe this could be implemented by a new type of refspec, one that is just a glob with everything allowed in it.
It took a while, but left-sided glob patterns are now fully implemented. Compare what ref-map now produces, compared to Git.
06:19:48 remote-refs Connecting to "https://github.com/GitoxideLabs/gitoxide"
refs/tags/v[0.9]*
df1d23e4e6c489a74ab6c6845de49e54fe5a8f4d refs/tags/v0.1.0 object:19e7fec7deb5a6419f36a2732c90006377414181 (fetch only)
c6f5c8970bb15de3f5b8781e63db51e61b1586ca refs/tags/v0.10.0 object:b47c64df9c8274bd97878138778aa60b87d566d5 (fetch only)
952dce5fdbbc009177849a930d1662aea07bbfef refs/tags/v0.11.0 object:ab08a7f066fb65671868424315d958ae985d76d8 (fetch only)
56f5fc287ced4100feddd164321c9b28b529fd71 refs/tags/v0.12.0 object:f041c00a7df2455ca52fac7b83af1e9f335f5688 (fetch only)
5c01a216b7e98534e2975d75a85ab95b3b3968dd refs/tags/v0.13.0 object:d4df661dbf60dad75d07002ef9979cabe8a86935 (fetch only)
e10d539f6f1b0e664d6273c7c133ea1715e14670 refs/tags/v0.14.0 object:183c0488a808ef760a9f6795f5c040e73926c3a8 (fetch only)
b72c0fc65e359d202371d03301634d4206b6c8ab refs/tags/v0.15.0 object:1fb931a7ea59f1cf895a6c1392fd8615b723c743 (fetch only)
676e356ce326a167bd5a41886d602621c2191d8f refs/tags/v0.16.0 object:f5c36d85755d1f0f503b77d9a565fad6aecf6728 (fetch only)
8eba271e3db1ea72bde5363e2c794ff0cca2456c refs/tags/v0.17.0 object:d071583c5576fdf5f7717765ffed5681792aa81f (fetch only)
3a77acc9f5d3d6bebd78d3ab08ac519e0d7cf73d refs/tags/v0.18.0 object:0c253b15143dcedfe4c66d64ab1ea6e097030651 (fetch only)
ce82400447c954fa1fc3a44cc92484c1faf927e5 refs/tags/v0.19.0 object:b2c301ef131ffe1871314e19f387cf10a8d2ac16 (fetch only)
3c1714244c83f7920e512806b83b46aa7d93c3b0 refs/tags/v0.20.0 object:08ec3a93d77a1018439a5c41c23729ffed27c5a5 (fetch only)
a0a33b85e6e3a7aaf302ed47b0552995fa60c5f1 refs/tags/v0.21.0 object:230a11f8fb9625587f7a1ce0911e54f0d8579fd6 (fetch only)
b29145fa4cc74a79082690a25c7bc45c9d8647de refs/tags/v0.22.0 object:3262cdeee90f249fdb4b24aeb03f1bed60ed6fef (fetch only)
1a911685f3343f4d54acd424b66b9c0ee638e8f7 refs/tags/v0.22.1 object:e0a54c735ddc796a6cb30e387f12e411dc1cf6fc (fetch only)
3101557b593aa4e32a000df50f0b356134c14bc2 refs/tags/v0.23.0 object:9982949cab401501d5ce3cba4e2ba900bc249c53 (fetch only)
0d2971849db9119d58f0f98f66d65f6cdf601d08 refs/tags/v0.24.0 object:9f2317f2514872001168d2be6e33e2ee2872420e (fetch only)
9fdea6c3f165b57725a8ba5af6ef7178a6fddc03 refs/tags/v0.25.0 object:234aee07b3693f5cf08ed375b9257b1327e0f7d1 (fetch only)
bfa1b8b3c060286816f20ab1b8af0e0757cc16c7 refs/tags/v0.26.0 object:6c4e470783fb40d135b7ef76cbd31e4ce335a2a4 (fetch only)
877b9819ad4c5e157256bdf4f884b1bf8289fea6 refs/tags/v0.27.0 object:4454d737b66ea71ae26d79be1f535781cbd076d3 (fetch only)
ffbba6de0e624b108ccd3b8ad67e7dc826bc11f6 refs/tags/v0.28.0 object:b61d6375170c500b2ec0bfbf8820f45ec3e1f2c8 (fetch only)
7ac7b7c3d711f5150d28b27175b67ef6a005d5c1 refs/tags/v0.29.0 object:6c62e748240ac0980fc23fdf30f8477dea8b9bc3 (fetch only)
7443892cb6b7925d98687903ab6d7ee0bdd1e9cf refs/tags/v0.3.0 object:e8df6c1ffb7afa27aff9abbe11c7e4b80d19b61e (fetch only)
05f69f211977ee160715df00e850bf7abb0ee544 refs/tags/v0.30.0 object:7891fb17348ec2f4c997665f9a25be36e2713da4 (fetch only)
f5fefe87e272ca75cfd8788535a8377a8e208fdc refs/tags/v0.31.0 object:db0b85192deb3a41c56970cfe4c5a87bfeefb8c7 (fetch only)
785027fccafa8368388bb0daa6cd792f5266c6b2 refs/tags/v0.31.1 object:1955a57f003f7d731d04e582e70ea86f15e8e7d9 (fetch only)
924c11b9a4913ad81b7880fcfcc0fe4891ba33cc refs/tags/v0.32.0 object:a96956b0978c3618e7d3f2da049696f55a3b3c82 (fetch only)
58004b7ced55a3812704a4dd0af9b604ad68454c refs/tags/v0.33.0 object:e1aae191d7421c748913c92e2c5883274331dd20 (fetch only)
763c07aa1e3c2fd467e8e59bad813c3c1f57407c refs/tags/v0.34.0 object:45b447045bc826f252129c300c531acde2652c64 (fetch only)
f8771d27b5dc4faca48440482a0f402b96e49b67 refs/tags/v0.35.0 object:095c6739b2722a8b9af90776b435ef2da454c0e6 (fetch only)
81540fc2e1454dc796ad05b17482ba1a0a1e3877 refs/tags/v0.36.0 object:4f98e94e0e8b79ed2899b35bef40f3c30b3025b0 (fetch only)
0f3e07918a4db8535b020ede097e03f48991d273 refs/tags/v0.37.0 object:0e8508a629c74068a1e667ea4222c3e69ae0b861 (fetch only)
2e4a6a16e786c8a3542b0df36d604a5970188787 refs/tags/v0.38.0 object:f1364dcb8aa66e3d8730e38445b045c5b63c56e6 (fetch only)
609d0295013cc1bdcdc331300fb43c2742553fd1 refs/tags/v0.39.0 object:4000197ecc8cf1a5d79361620e4c114f86476703 (fetch only)
2476875bd5952c3413076c467c892c0cefec408e refs/tags/v0.4.0 object:f667785e9e9db16e1afb498c06ff89246e4f6aef (fetch only)
e147d47193636744658ddb9089ac38904d8b4658 refs/tags/v0.4.1 object:64fff36dcfdade887b7f417605d81b9d5750f000 (fetch only)
f4e917fde5aae4f921efc3537e300a5dc51851a3 refs/tags/v0.4.3 object:5b47a1a051243ec2aa407297a19d41b30447bfab (fetch only)
7a8dffb30497106dafcfa2911a604d95b7b7a99f refs/tags/v0.40.0 object:beb0ea8c4ff94c64b7773772a9d388ccb403f3c1 (fetch only)
95fca4b80adc75dd2168562aa4bdf40cc3513a82 refs/tags/v0.41.0 object:dea106a8c4fecc1f0a8f891a2691ad9c63964d25 (fetch only)
1de4a5aab6a0a467dd25f980143a93f39c587555 refs/tags/v0.42.0 object:d248e3d87d45ca3983cb9fd7c6143dacbd8301cc (fetch only)
a38b18538961bdeefac2f21903325472b1a2c2d9 refs/tags/v0.43.0 object:cc5b696b7b73277ddcc3ef246714cf80a092cf76 (fetch only)
918ea038965488bcf9e2650aa6199f22eee43382 refs/tags/v0.44.0 object:e104545b78951ca882481d4a58f4425a8bc81c87 (fetch only)
bdde1af330d9b40b88c0cd6781cd7ee23a25ad98 refs/tags/v0.45.0 object:5a919c48393020d47c7034946108577dd213b80a (fetch only)
200aeb49b6bc9990702fce7c0c720f5ec4b31b5e refs/tags/v0.46.0 object:49f8d5373501c82699fec76809f4d445c3327c5a (fetch only)
08c01b6f712996b96bd83ef0c5b0da76a430e923 refs/tags/v0.5.0 object:28763eee35f8475ba9d7505a2176c9691b11afdb (fetch only)
5c78b7da979df5fd50ea3aabcb5f0b42dbf18673 refs/tags/v0.6.0 object:b5c270dbe095753bd63e753fae3a6bfc8c5a3aac (fetch only)
cfafe6ef3f54978c041538d89bc2827c479b28a1 refs/tags/v0.7.0 object:bafc17c0ea7cfbbd958a617c2225e641badc7352 (fetch only)
1533400ede97307b550bff0e94512391a25c0ab8 refs/tags/v0.8.1 object:da419d1932494ba82f7e20543fb89cc71f9ffc7b (fetch only)
08fd086e0fe12a8d37fc2894b77c7f8e4f37c269 refs/tags/v0.8.2 (fetch only)
d3b20949d887c95e20753658d3e90897f625ccea refs/tags/v0.8.3 (fetch only)
effb2a612d5912ea7bd9e7c65465ca3da3797a7a refs/tags/v0.8.4 (fetch only)
bdf9fa5874bb72ad158a5e28fd60d95eab78e9cb refs/tags/v0.9.0 object:960eb0e5e5a7df117ed2ae2a8e2ec167b074c332 (fetch only)
server sent 2769 tips, 2717 were filtered due to 1 refspec(s).
gitoxide ( copilot/update-refspec-parsing-logic) +5 -1 [$!⇕⇡1⇣1] took 13s
❯ cargo run --bin gix -- remote ref-map "refs/tags/v[0.9]*"
gitoxide ( copilot/update-refspec-parsing-logic) +5 -1 [$!⇕⇡1⇣1]
❯ git ls-remote origin "refs/tags/v[0.9]*"
df1d23e4e6c489a74ab6c6845de49e54fe5a8f4d refs/tags/v0.1.0
19e7fec7deb5a6419f36a2732c90006377414181 refs/tags/v0.1.0^{}
c6f5c8970bb15de3f5b8781e63db51e61b1586ca refs/tags/v0.10.0
b47c64df9c8274bd97878138778aa60b87d566d5 refs/tags/v0.10.0^{}
952dce5fdbbc009177849a930d1662aea07bbfef refs/tags/v0.11.0
ab08a7f066fb65671868424315d958ae985d76d8 refs/tags/v0.11.0^{}
56f5fc287ced4100feddd164321c9b28b529fd71 refs/tags/v0.12.0
f041c00a7df2455ca52fac7b83af1e9f335f5688 refs/tags/v0.12.0^{}
5c01a216b7e98534e2975d75a85ab95b3b3968dd refs/tags/v0.13.0
d4df661dbf60dad75d07002ef9979cabe8a86935 refs/tags/v0.13.0^{}
e10d539f6f1b0e664d6273c7c133ea1715e14670 refs/tags/v0.14.0
183c0488a808ef760a9f6795f5c040e73926c3a8 refs/tags/v0.14.0^{}
b72c0fc65e359d202371d03301634d4206b6c8ab refs/tags/v0.15.0
1fb931a7ea59f1cf895a6c1392fd8615b723c743 refs/tags/v0.15.0^{}
676e356ce326a167bd5a41886d602621c2191d8f refs/tags/v0.16.0
f5c36d85755d1f0f503b77d9a565fad6aecf6728 refs/tags/v0.16.0^{}
8eba271e3db1ea72bde5363e2c794ff0cca2456c refs/tags/v0.17.0
d071583c5576fdf5f7717765ffed5681792aa81f refs/tags/v0.17.0^{}
3a77acc9f5d3d6bebd78d3ab08ac519e0d7cf73d refs/tags/v0.18.0
0c253b15143dcedfe4c66d64ab1ea6e097030651 refs/tags/v0.18.0^{}
ce82400447c954fa1fc3a44cc92484c1faf927e5 refs/tags/v0.19.0
b2c301ef131ffe1871314e19f387cf10a8d2ac16 refs/tags/v0.19.0^{}
3c1714244c83f7920e512806b83b46aa7d93c3b0 refs/tags/v0.20.0
08ec3a93d77a1018439a5c41c23729ffed27c5a5 refs/tags/v0.20.0^{}
a0a33b85e6e3a7aaf302ed47b0552995fa60c5f1 refs/tags/v0.21.0
230a11f8fb9625587f7a1ce0911e54f0d8579fd6 refs/tags/v0.21.0^{}
b29145fa4cc74a79082690a25c7bc45c9d8647de refs/tags/v0.22.0
3262cdeee90f249fdb4b24aeb03f1bed60ed6fef refs/tags/v0.22.0^{}
1a911685f3343f4d54acd424b66b9c0ee638e8f7 refs/tags/v0.22.1
e0a54c735ddc796a6cb30e387f12e411dc1cf6fc refs/tags/v0.22.1^{}
3101557b593aa4e32a000df50f0b356134c14bc2 refs/tags/v0.23.0
9982949cab401501d5ce3cba4e2ba900bc249c53 refs/tags/v0.23.0^{}
0d2971849db9119d58f0f98f66d65f6cdf601d08 refs/tags/v0.24.0
9f2317f2514872001168d2be6e33e2ee2872420e refs/tags/v0.24.0^{}
9fdea6c3f165b57725a8ba5af6ef7178a6fddc03 refs/tags/v0.25.0
234aee07b3693f5cf08ed375b9257b1327e0f7d1 refs/tags/v0.25.0^{}
bfa1b8b3c060286816f20ab1b8af0e0757cc16c7 refs/tags/v0.26.0
6c4e470783fb40d135b7ef76cbd31e4ce335a2a4 refs/tags/v0.26.0^{}
877b9819ad4c5e157256bdf4f884b1bf8289fea6 refs/tags/v0.27.0
4454d737b66ea71ae26d79be1f535781cbd076d3 refs/tags/v0.27.0^{}
ffbba6de0e624b108ccd3b8ad67e7dc826bc11f6 refs/tags/v0.28.0
b61d6375170c500b2ec0bfbf8820f45ec3e1f2c8 refs/tags/v0.28.0^{}
7ac7b7c3d711f5150d28b27175b67ef6a005d5c1 refs/tags/v0.29.0
6c62e748240ac0980fc23fdf30f8477dea8b9bc3 refs/tags/v0.29.0^{}
7443892cb6b7925d98687903ab6d7ee0bdd1e9cf refs/tags/v0.3.0
e8df6c1ffb7afa27aff9abbe11c7e4b80d19b61e refs/tags/v0.3.0^{}
05f69f211977ee160715df00e850bf7abb0ee544 refs/tags/v0.30.0
7891fb17348ec2f4c997665f9a25be36e2713da4 refs/tags/v0.30.0^{}
f5fefe87e272ca75cfd8788535a8377a8e208fdc refs/tags/v0.31.0
db0b85192deb3a41c56970cfe4c5a87bfeefb8c7 refs/tags/v0.31.0^{}
785027fccafa8368388bb0daa6cd792f5266c6b2 refs/tags/v0.31.1
1955a57f003f7d731d04e582e70ea86f15e8e7d9 refs/tags/v0.31.1^{}
924c11b9a4913ad81b7880fcfcc0fe4891ba33cc refs/tags/v0.32.0
a96956b0978c3618e7d3f2da049696f55a3b3c82 refs/tags/v0.32.0^{}
58004b7ced55a3812704a4dd0af9b604ad68454c refs/tags/v0.33.0
e1aae191d7421c748913c92e2c5883274331dd20 refs/tags/v0.33.0^{}
763c07aa1e3c2fd467e8e59bad813c3c1f57407c refs/tags/v0.34.0
45b447045bc826f252129c300c531acde2652c64 refs/tags/v0.34.0^{}
f8771d27b5dc4faca48440482a0f402b96e49b67 refs/tags/v0.35.0
095c6739b2722a8b9af90776b435ef2da454c0e6 refs/tags/v0.35.0^{}
81540fc2e1454dc796ad05b17482ba1a0a1e3877 refs/tags/v0.36.0
4f98e94e0e8b79ed2899b35bef40f3c30b3025b0 refs/tags/v0.36.0^{}
0f3e07918a4db8535b020ede097e03f48991d273 refs/tags/v0.37.0
0e8508a629c74068a1e667ea4222c3e69ae0b861 refs/tags/v0.37.0^{}
2e4a6a16e786c8a3542b0df36d604a5970188787 refs/tags/v0.38.0
f1364dcb8aa66e3d8730e38445b045c5b63c56e6 refs/tags/v0.38.0^{}
609d0295013cc1bdcdc331300fb43c2742553fd1 refs/tags/v0.39.0
4000197ecc8cf1a5d79361620e4c114f86476703 refs/tags/v0.39.0^{}
2476875bd5952c3413076c467c892c0cefec408e refs/tags/v0.4.0
f667785e9e9db16e1afb498c06ff89246e4f6aef refs/tags/v0.4.0^{}
e147d47193636744658ddb9089ac38904d8b4658 refs/tags/v0.4.1
64fff36dcfdade887b7f417605d81b9d5750f000 refs/tags/v0.4.1^{}
f4e917fde5aae4f921efc3537e300a5dc51851a3 refs/tags/v0.4.3
5b47a1a051243ec2aa407297a19d41b30447bfab refs/tags/v0.4.3^{}
7a8dffb30497106dafcfa2911a604d95b7b7a99f refs/tags/v0.40.0
beb0ea8c4ff94c64b7773772a9d388ccb403f3c1 refs/tags/v0.40.0^{}
95fca4b80adc75dd2168562aa4bdf40cc3513a82 refs/tags/v0.41.0
dea106a8c4fecc1f0a8f891a2691ad9c63964d25 refs/tags/v0.41.0^{}
1de4a5aab6a0a467dd25f980143a93f39c587555 refs/tags/v0.42.0
d248e3d87d45ca3983cb9fd7c6143dacbd8301cc refs/tags/v0.42.0^{}
a38b18538961bdeefac2f21903325472b1a2c2d9 refs/tags/v0.43.0
cc5b696b7b73277ddcc3ef246714cf80a092cf76 refs/tags/v0.43.0^{}
918ea038965488bcf9e2650aa6199f22eee43382 refs/tags/v0.44.0
e104545b78951ca882481d4a58f4425a8bc81c87 refs/tags/v0.44.0^{}
bdde1af330d9b40b88c0cd6781cd7ee23a25ad98 refs/tags/v0.45.0
5a919c48393020d47c7034946108577dd213b80a refs/tags/v0.45.0^{}
200aeb49b6bc9990702fce7c0c720f5ec4b31b5e refs/tags/v0.46.0
49f8d5373501c82699fec76809f4d445c3327c5a refs/tags/v0.46.0^{}
08c01b6f712996b96bd83ef0c5b0da76a430e923 refs/tags/v0.5.0
28763eee35f8475ba9d7505a2176c9691b11afdb refs/tags/v0.5.0^{}
5c78b7da979df5fd50ea3aabcb5f0b42dbf18673 refs/tags/v0.6.0
b5c270dbe095753bd63e753fae3a6bfc8c5a3aac refs/tags/v0.6.0^{}
cfafe6ef3f54978c041538d89bc2827c479b28a1 refs/tags/v0.7.0
bafc17c0ea7cfbbd958a617c2225e641badc7352 refs/tags/v0.7.0^{}
1533400ede97307b550bff0e94512391a25c0ab8 refs/tags/v0.8.1
da419d1932494ba82f7e20543fb89cc71f9ffc7b refs/tags/v0.8.1^{}
08fd086e0fe12a8d37fc2894b77c7f8e4f37c269 refs/tags/v0.8.2
d3b20949d887c95e20753658d3e90897f625ccea refs/tags/v0.8.3
effb2a612d5912ea7bd9e7c65465ca3da3797a7a refs/tags/v0.8.4
bdf9fa5874bb72ad158a5e28fd60d95eab78e9cb refs/tags/v0.9.0
960eb0e5e5a7df117ed2ae2a8e2ec167b074c332 refs/tags/v0.9.0^{}