patch-git: Do not use --filter with --unshallow on old git versions
Before git 2.28, --filter cannot be used if the clone did not use it. Related: RHEL-111490
This commit is contained in:
parent
df18ac835e
commit
d88424cfec
124
patch-git.lua
124
patch-git.lua
@ -283,6 +283,74 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Sort the list lexicographically, in place, treating sequences of
|
||||||
|
-- digits as a single positive decimal number.
|
||||||
|
local function version_sort(list)
|
||||||
|
-- Sorting is only needed for two or more elements.
|
||||||
|
if #list <= 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Maximum length of a sequence of consecutive digits in patch names.
|
||||||
|
local max_width = 1
|
||||||
|
for i=1,#list do
|
||||||
|
local s = list[i]
|
||||||
|
for number in string.gmatch(s, '%d+') do
|
||||||
|
if #number > max_width then
|
||||||
|
max_width = #number
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pad the number argument with leading '0' to max_width.
|
||||||
|
local function pad(s)
|
||||||
|
return string.rep('0', max_width - #s) .. s
|
||||||
|
end
|
||||||
|
|
||||||
|
local padded = {}
|
||||||
|
for i=1,#list do
|
||||||
|
local s = list[i]
|
||||||
|
padded[s] = string.gsub(s, '%d+', pad)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(list, function (a, b)
|
||||||
|
return padded[a] < padded[b]
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
-- Tests for version_sort.
|
||||||
|
do
|
||||||
|
local test = {'b2-30b', 'b1', 'b10', 'b2', 'a', 'b2-30', 'b2-4'}
|
||||||
|
version_sort(test)
|
||||||
|
assert(#test == 7)
|
||||||
|
assert(test[1] == 'a')
|
||||||
|
assert(test[2] == 'b1')
|
||||||
|
assert(test[3] == 'b2')
|
||||||
|
assert(test[4] == 'b2-4')
|
||||||
|
assert(test[5] == 'b2-30')
|
||||||
|
assert(test[6] == 'b2-30b')
|
||||||
|
assert(test[7] == 'b10')
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Returns true if the git command version is at least that of the
|
||||||
|
-- argument string.
|
||||||
|
local check_git_version
|
||||||
|
do
|
||||||
|
-- Cached version of the git command.
|
||||||
|
local git_version
|
||||||
|
|
||||||
|
function check_git_version(reference)
|
||||||
|
if not git_version then
|
||||||
|
local output = run_git('version')
|
||||||
|
git_version = assert(
|
||||||
|
string.match(output, '^git version (%d[^\n]*)\n'), output)
|
||||||
|
end
|
||||||
|
-- If the reference version sorts first, the version check succeeds.
|
||||||
|
local sorted = {git_version, reference}
|
||||||
|
version_sort(sorted)
|
||||||
|
return sorted[1] == reference
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Called to generate the files (if HEAD or the script version has changed).
|
-- Called to generate the files (if HEAD or the script version has changed).
|
||||||
local function generate_files()
|
local function generate_files()
|
||||||
-- True if %_sourcedir refers to a Git repository and git is installed.
|
-- True if %_sourcedir refers to a Git repository and git is installed.
|
||||||
@ -311,7 +379,13 @@ local function generate_files()
|
|||||||
do
|
do
|
||||||
local shallow = run_git('rev-parse --is-shallow-repository')
|
local shallow = run_git('rev-parse --is-shallow-repository')
|
||||||
if shallow == 'true\n' then
|
if shallow == 'true\n' then
|
||||||
check_git('fetch --unshallow --filter=blob:none')
|
if check_git_version('2.28') then
|
||||||
|
check_git('fetch --unshallow --filter=blob:none')
|
||||||
|
else
|
||||||
|
-- 2.27 and earlier error out if the original clone did not
|
||||||
|
-- use --filter.
|
||||||
|
check_git('fetch --unshallow')
|
||||||
|
end
|
||||||
else
|
else
|
||||||
assert(shallow == 'false\n', shallow)
|
assert(shallow == 'false\n', shallow)
|
||||||
end
|
end
|
||||||
@ -499,54 +573,6 @@ local function parse_commits()
|
|||||||
patchgit.commits = commits
|
patchgit.commits = commits
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Sort the list lexicographically, in place, treating sequences of
|
|
||||||
-- digits as a single positive decimal number.
|
|
||||||
local function version_sort(list)
|
|
||||||
-- Sorting is only needed for two or more elements.
|
|
||||||
if #list <= 1 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Maximum length of a sequence of consecutive digits in patch names.
|
|
||||||
local max_width = 1
|
|
||||||
for i=1,#list do
|
|
||||||
local s = list[i]
|
|
||||||
for number in string.gmatch(s, '%d+') do
|
|
||||||
if #number > max_width then
|
|
||||||
max_width = #number
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Pad the number argument with leading '0' to max_width.
|
|
||||||
local function pad(s)
|
|
||||||
return string.rep('0', max_width - #s) .. s
|
|
||||||
end
|
|
||||||
|
|
||||||
local padded = {}
|
|
||||||
for i=1,#list do
|
|
||||||
local s = list[i]
|
|
||||||
padded[s] = string.gsub(s, '%d+', pad)
|
|
||||||
end
|
|
||||||
|
|
||||||
table.sort(list, function (a, b)
|
|
||||||
return padded[a] < padded[b]
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
-- Tests for version_sort.
|
|
||||||
do
|
|
||||||
local test = {'b2-30b', 'b1', 'b10', 'b2', 'a', 'b2-30', 'b2-4'}
|
|
||||||
version_sort(test)
|
|
||||||
assert(#test == 7)
|
|
||||||
assert(test[1] == 'a')
|
|
||||||
assert(test[2] == 'b1')
|
|
||||||
assert(test[3] == 'b2')
|
|
||||||
assert(test[4] == 'b2-4')
|
|
||||||
assert(test[5] == 'b2-30')
|
|
||||||
assert(test[6] == 'b2-30b')
|
|
||||||
assert(test[7] == 'b10')
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Inject the Patch: lines into the spec file, in the appropriate
|
-- Inject the Patch: lines into the spec file, in the appropriate
|
||||||
-- (commit) order. Unapplied patches found in the source directory
|
-- (commit) order. Unapplied patches found in the source directory
|
||||||
-- and that are not present in the Git history are applied last.
|
-- and that are not present in the Git history are applied last.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user