From 66c5e8e3e80061993642c974909e3563006aaa0a Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 14 Oct 2022 12:06:21 -0400 Subject: Added in tag support. --- lpm.c | 4 +--- lpm.lua | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/lpm.c b/lpm.c index 944a98a..c8584a5 100644 --- a/lpm.c +++ b/lpm.c @@ -287,9 +287,7 @@ static git_repository* luaL_checkgitrepo(lua_State* L, int index) { static git_commit* git_retrieve_commit(git_repository* repository, const char* commit_name) { git_oid commit_id; git_commit* commit; - if (git_get_id(&commit_id, repository, commit_name)) - return NULL; - if (git_commit_lookup(&commit, repository, &commit_id)) + if (git_get_id(&commit_id, repository, commit_name) || git_commit_lookup(&commit, repository, &commit_id)) return NULL; return commit; } diff --git a/lpm.lua b/lpm.lua index 81dd721..c0752f0 100644 --- a/lpm.lua +++ b/lpm.lua @@ -353,6 +353,10 @@ function json.decode(str) end -- End JSON library. +local function is_commit_hash(hash) + return #hash == 40 and not hash:find("[^a-z0-9]") +end + local common = {} function common.merge(dst, src) for k, v in pairs(src) do dst[k] = v end return dst end @@ -421,6 +425,13 @@ function common.rename(src, dst) local _, err = os.rename(src, dst) if err then error("can't rename file " .. src .. " to " .. dst .. ": " .. err) end end +function common.reset(path, ref, type) + if is_commit_hash(ref) then + system.reset(path, ref, type) + else + if not pcall(system.reset, path, "refs/tags/" .. ref, type) then system.reset(path, "refs/remotes/origin/" .. ref, type) end + end +end local HOME, USERDIR, CACHEDIR, JSON, VERBOSE, MOD_VERSION, QUIET, FORCE, AUTO_PULL_REMOTES, ARCH, ASSUME_YES, NO_INSTALL_OPTIONAL, TMPDIR, repositories, lite_xls, system_bottle @@ -482,10 +493,6 @@ local function match_version(version, pattern) end -local function is_commit_hash(hash) - return #hash == 40 and not hash:find("[^a-z0-9]") -end - function Plugin.__index(self, idx) return rawget(self, idx) or Plugin[idx] end function Plugin.new(repository, metadata) @@ -586,7 +593,7 @@ function Plugin:install(bottle, installing) common.mkdirp(temporary_install_path) local _, _, url, branch = self.remote:find("^(.*):(.*)$") system.init(temporary_install_path, url) - system.reset(temporary_install_path, branch) + common.reset(temporary_install_path, branch) else local path = install_path .. (self.organization == 'complex' and self.path and system.stat(self.local_path).type ~= "dir" and (PATHSEP .. "init.lua") or "") local temporary_path = temporary_install_path .. (self.organization == 'complex' and self.path and system.stat(self.local_path).type ~= "dir" and (PATHSEP .. "init.lua") or "") @@ -713,7 +720,7 @@ function Repository:parse_manifest(already_pulling) table.insert(self.lite_xls, LiteXL.new(self, metadata)) end end - self.remotes = common.map(self.manifest["remotes"] or {}, function(r) return Repository.url(remote) end) + self.remotes = common.map(self.manifest["remotes"] or {}, function(r) return Repository.url(r) end) end return self.manifest, self.remotes end @@ -791,17 +798,17 @@ function Repository:add(pull_remotes) else local path = self.local_path .. PATHSEP .. (self.commit or self.branch) common.mkdirp(path) - log_action("Retrieving " .. self.remote .. ":master/main...") + log_action("Retrieving " .. self.remote .. ":" .. (self.commit or self.branch) .. "...") system.init(path, self.remote) system.fetch(path) - system.reset(path, self.commit or ("refs/remotes/origin/" .. self.branch), "hard") + common.reset(path, self.commit or self.branch, "hard") log_action("Retrieved " .. self:url() .. "...") self.manifest = nil end local manifest, remotes = self:parse_manifest() if pull_remotes then -- any remotes we don't have in our listing, call add, and add into the list for i, remote in ipairs(remotes) do - if common.first(repositories, function(repo) return repo.remote == remote.remote and repo.branch == remote.branch and repo.commit == remote.comit end) then + if not common.first(repositories, function(repo) return repo.remote == remote.remote and repo.branch == remote.branch and repo.commit == remote.commit end) then remote:add(pull_remotes == "recursive" and "recursive" or false) table.insert(repositories, remote) end @@ -816,7 +823,7 @@ function Repository:update(pull_remotes) if self.branch then local path = self.local_path .. PATHSEP .. self.branch system.fetch(path) - system.reset(path, "refs/remotes/origin/" .. self.branch, "hard") + common.reset(path, self.branch, "hard") log_action("Updated " .. self:url()) self.manifest = nil manifest, remotes = self:parse_manifest() @@ -881,7 +888,7 @@ function LiteXL:install() else if self.remote then system.init(self.local_path, self.remote) - system.reset(self.local_path, self.commit or self.branch) + common.reset(self.local_path, self.commit or self.branch) end for i,file in ipairs(self.files or {}) do if file.arch and file.arch == ARCH then @@ -1342,8 +1349,9 @@ local function error_handler(err) end local function run_command(ARGS) - if not ARGS[2]:find("%S") then return end - if ARGS[2] == "repo" and ARGV[3] == "add" then lpm_repo_add(table.unpack(common.slice(ARGS, 4))) + if not ARGS[2]:find("%S") then return + elseif ARGS[2] == "init" then return + elseif ARGS[2] == "repo" and ARGV[3] == "add" then lpm_repo_add(table.unpack(common.slice(ARGS, 4))) elseif ARGS[2] == "repo" and ARGS[3] == "rm" then lpm_repo_rm(table.unpack(common.slice(ARGS, 4))) elseif ARGS[2] == "add" then lpm_repo_add(table.unpack(common.slice(ARGS, 3))) elseif ARGS[2] == "rm" then lpm_repo_rm(table.unpack(common.slice(ARGS, 3))) @@ -1408,6 +1416,9 @@ but others can be added, and this base one can be removed. It has the following commands: + lpm init Implicitly called before all commands + if necessary, but can be called + independently to save time later. lpm repo list List all extant repos. lpm [repo] add Add a source repository. [...] -- cgit v1.2.3