fix(pack): use full hashes in lockfile and revision description

Problem: Using abbreviated version of commit hashes might be unreliable
  in the long term (although highly unlikely).

Solution: Use full hashes in lockfile and revision description (in
  confirmation buffer and log). Keep abbreviated hashes when displaying
  update changes (for brevity).
This commit is contained in:
Evgeni Chasnovski
2025-11-06 18:42:36 +02:00
parent f2bfde9140
commit f3f5095630
2 changed files with 24 additions and 20 deletions

View File

@@ -193,7 +193,7 @@ end
local function git_get_hash(ref, cwd) local function git_get_hash(ref, cwd)
-- Using `rev-list -1` shows a commit of reference, while `rev-parse` shows -- Using `rev-list -1` shows a commit of reference, while `rev-parse` shows
-- hash of reference. Those are different for annotated tags. -- hash of reference. Those are different for annotated tags.
return git_cmd({ 'rev-list', '-1', '--abbrev-commit', ref }, cwd) return git_cmd({ 'rev-list', '-1', ref }, cwd)
end end
--- @async --- @async

View File

@@ -103,6 +103,10 @@ local function git_add_commit(msg, repo_name)
end end
local function git_get_hash(rev, repo_name) local function git_get_hash(rev, repo_name)
return git_cmd({ 'rev-list', '-1', rev }, repo_name)
end
local function git_get_short_hash(rev, repo_name)
return git_cmd({ 'rev-list', '-1', '--abbrev-commit', rev }, repo_name) return git_cmd({ 'rev-list', '-1', '--abbrev-commit', rev }, repo_name)
end end
@@ -906,8 +910,9 @@ describe('vim.pack', function()
describe('update()', function() describe('update()', function()
-- Lua source code for the tested plugin named "fetch" -- Lua source code for the tested plugin named "fetch"
local fetch_lua_file = vim.fs.joinpath(pack_get_plug_path('fetch'), 'lua', 'fetch.lua') local fetch_lua_file = vim.fs.joinpath(pack_get_plug_path('fetch'), 'lua', 'fetch.lua')
-- Table with hashes used to test confirmation buffer and log content -- Tables with hashes used to test confirmation buffer and log content
local hashes --- @type table<string,string> local hashes --- @type table<string,string>
local short_hashes --- @type table<string,string>
before_each(function() before_each(function()
-- Create a dedicated clean repo for which "push changes" will be mocked -- Create a dedicated clean repo for which "push changes" will be mocked
@@ -920,6 +925,7 @@ describe('vim.pack', function()
git_add_commit('Commit from `main` to be removed', 'fetch') git_add_commit('Commit from `main` to be removed', 'fetch')
hashes = { fetch_head = git_get_hash('HEAD', 'fetch') } hashes = { fetch_head = git_get_hash('HEAD', 'fetch') }
short_hashes = { fetch_head = git_get_short_hash('HEAD', 'fetch') }
-- Install initial versions of tested plugins -- Install initial versions of tested plugins
exec_lua(function() exec_lua(function()
@@ -1027,7 +1033,8 @@ describe('vim.pack', function()
screen = Screen.new(85, 35) screen = Screen.new(85, 35)
hashes.fetch_new = git_get_hash('main', 'fetch') hashes.fetch_new = git_get_hash('main', 'fetch')
hashes.fetch_new_prev = git_get_hash('main~', 'fetch') short_hashes.fetch_new = git_get_short_hash('main', 'fetch')
short_hashes.fetch_new_prev = git_get_short_hash('main~', 'fetch')
hashes.semver_head = git_get_hash('v0.3.0', 'semver') hashes.semver_head = git_get_hash('v0.3.0', 'semver')
local tab_name = 'n' .. (t.is_os('win') and ':' or '') .. '//2/confirm-update' local tab_name = 'n' .. (t.is_os('win') and ':' or '') .. '//2/confirm-update'
@@ -1050,22 +1057,18 @@ describe('vim.pack', function()
'{101:## fetch} |', '{101:## fetch} |',
'Path: {103:FETCH_PATH} |', 'Path: {103:FETCH_PATH} |',
'Source: {103:FETCH_SRC} |', 'Source: {103:FETCH_SRC} |',
('State before: {103:%s} |'):format( ('State before: {103:%s} |'):format(hashes.fetch_head),
hashes.fetch_head ('State after: {103:%s} {102:(main)} |'):format(hashes.fetch_new),
),
('State after: {103:%s} {102:(main)} |'):format(
hashes.fetch_new
),
' |', ' |',
'Pending updates: |', 'Pending updates: |',
('{19:< %s │ Commit from `main` to be removed} |'):format( ('{19:< %s │ Commit from `main` to be removed} |'):format(
hashes.fetch_head short_hashes.fetch_head
), ),
('{104:> %s │ Commit to be added 2} |'):format( ('{104:> %s │ Commit to be added 2} |'):format(
hashes.fetch_new short_hashes.fetch_new
), ),
('{104:> %s │ Commit to be added 1 (tag: dev-tag)} |'):format( ('{104:> %s │ Commit to be added 1 (tag: dev-tag)} |'):format(
hashes.fetch_new_prev short_hashes.fetch_new_prev
), ),
' |', ' |',
'{102:# Same ─────────────────────────────────────────────────────────────────────────} |', '{102:# Same ─────────────────────────────────────────────────────────────────────────} |',
@@ -1129,9 +1132,9 @@ describe('vim.pack', function()
fetch_src, fetch_src,
hashes.fetch_head, hashes.fetch_head,
hashes.fetch_new, hashes.fetch_new,
hashes.fetch_head, short_hashes.fetch_head,
hashes.fetch_new, short_hashes.fetch_new,
hashes.fetch_new_prev short_hashes.fetch_new_prev
) )
eq(vim.text.indent(0, ref_log_lines), vim.trim(log_rest)) eq(vim.text.indent(0, ref_log_lines), vim.trim(log_rest))
end) end)
@@ -1456,7 +1459,8 @@ describe('vim.pack', function()
-- Write to log file -- Write to log file
hashes.fetch_new = git_get_hash('main', 'fetch') hashes.fetch_new = git_get_hash('main', 'fetch')
hashes.fetch_new_prev = git_get_hash('main~', 'fetch') short_hashes.fetch_new = git_get_short_hash('main', 'fetch')
short_hashes.fetch_new_prev = git_get_short_hash('main~', 'fetch')
local log_path = vim.fs.joinpath(fn.stdpath('log'), 'nvim-pack.log') local log_path = vim.fs.joinpath(fn.stdpath('log'), 'nvim-pack.log')
local log_text = fn.readblob(log_path) local log_text = fn.readblob(log_path)
@@ -1479,9 +1483,9 @@ describe('vim.pack', function()
fetch_src, fetch_src,
hashes.fetch_head, hashes.fetch_head,
hashes.fetch_new, hashes.fetch_new,
hashes.fetch_head, short_hashes.fetch_head,
hashes.fetch_new, short_hashes.fetch_new,
hashes.fetch_new_prev short_hashes.fetch_new_prev
) )
eq(vim.text.indent(0, ref_log_lines), vim.trim(log_rest)) eq(vim.text.indent(0, ref_log_lines), vim.trim(log_rest))