Christophe Laporte sprinted to victory on stage 19 as overall leader Jonas Vingegaard moved another day closer to winning the 2022 Tour de France.
Frenchman Laporte beat Jasper Philipsen and Alberto Dainese to claim his first stage win at the Tour in Cahors.
Denmark’s Vingegaard remains three minutes 26 seconds clear of defending champion Tadej Pogacar, with one day to go until the ride into Paris on Sunday.
Fred Wright was the last man standing from a break but was caught late on.
Wright, 23, led until the final 500m after joining Alexis Gougeard and Jasper Stuyven in a three-man breakaway with 30km remaining.
But Jumbo Visma, having successfully taken team-leader Vingegaard within touching distance of a maiden Tour de France triumph after he prevailed on stage 18, once again executed their plan to perfection as Laporte darted past the tiring Wright to give the team their fifth stage win of the Tour.
Pogacar, who temporarily lost touch with the peloton in tricky crosswinds after suffering a puncture earlier in the stage, ignited the race as he attacked shortly before Wright’s group managed to ride clear.
The Slovenian, 23, finished fifth on Friday’s stage as he reduced Vingegaard’s lead in the general classification by five seconds.
The riders had to briefly stop because of a protest on the road with over 150km remaining, before the day’s first lead group were allowed to resume one minute and 20 seconds ahead of the peloton.
It is the third stage of the race which has encountered a protest, with climate activists forcing a 10-minute delay in Megeve on stage 10.
Helped along by team-mate Wout van Aert in the closing stages, Laporte’s win ensured France eventually had its first stage winner of the 2022 Tour.
Only in 1926 and 1999 has the host nation ended up with no winners.
“It’s hard to realise but I’m super happy. The team trusted me today,” Laporte said.
“We first reached our goal to bring Jonas [Vingegaard] safely to the 3km to go mark,” he added.
“It’s more than a reward, it’s huge. I was already super happy with this Tour de France even though I got no result for myself.
“Now the team gave me the opportunity to go for a stage win, it’s exceptional to win after I came twice second in the past. Wout [van Aert] could have ridden for himself instead.
“It’s important to get a French win. If it makes the crowd and my family happy, I’m happy too.”
Saturday’s 40.7km individual time-trial is the final day of serious competition in the general classification, before the race ends with a traditional processional final stage into Paris on Sunday.
Stage 19 results
1. Christophe Laporte (Fra/Jumbo-Visma) 3hrs 52mins 04secs
2. Jasper Philipsen (Bel/Alpecin-Deceuninck) +1
3. Alberto Dainese (Ita/Team DSM) same time
4. Florian Senechal (Fra/Quick-Step-Alpha Vinyl Team)
5. Tadej Pogacar (Slo/UAE Team Emirates)
6. Amaury Capiot (Bel/Team Arkea-Samsic)
7. Dylan Groenewegen (Ned/Team BikeExchange-Jayco)
8. Hugo Hofstetter (Fra/Team Arkea-Samsic)
9. Luka Mezgec (Slo/Team BikeExchange-Jayco)
10. Caleb Ewan (Aus/Lotto-Soudal)
General classification after stage 19
1. Jonas Vingegaard (Den/Jumbo-Visma) 75hrs 45mins 44secs
2. Tadej Pogacar (Slo/UAE Team Emirates) +3:26
3. Geraint Thomas (GB/Ineos Grenadiers) +8:00
4. David Gaudu (Fra/Groupama-FDJ) +11:05
5. Nairo Quintana (Col/Team Arkea-Samsic) +13:35
6. Louis Meintjes (SA/Intermarche-Wanty Gobert Materiaux) +13:43
7. Aleksandr Vlasov (Bora-hansgrohe) +14:10
8. Romain Bardet (Fra/Team DSM) +16:11
9. Alexey Lutsenko (Kaz/Astana-Qazaqstan Team) +20:29
10. Adam Yates (GB/Ineos Grenadiers) +20:37