John Swinney's flagship election vow to cap supermarket food prices is in disarray after he watered down his plans following a backlash.