From patchwork Fri Apr 13 14:06:13 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel,3/3] fetch2/git: quote arguments Date: Fri, 13 Apr 2012 14:06:13 -0000 From: Enrico Scholz X-Patchwork-Id: 25759 Message-Id: <1334325973-15760-3-git-send-email-enrico.scholz@informatik.tu-chemnitz.de> To: bitbake-devel@lists.openembedded.org Cc: Enrico Scholz Patch makes sure that arguments given to 'git' are quoted properly. It uses the newly added runfetchcmd2() function or quotes them manually when special shell functionality (pipes, io redirections) are used. Signed-off-by: Enrico Scholz --- lib/bb/fetch2/git.py | 53 +++++++++++++++++++++++++++---------------------- 1 files changed, 29 insertions(+), 24 deletions(-) diff --git a/lib/bb/fetch2/git.py b/lib/bb/fetch2/git.py index 61fdc4b..52adb9a 100644 --- a/lib/bb/fetch2/git.py +++ b/lib/bb/fetch2/git.py @@ -65,8 +65,9 @@ import os import bb from bb import data from bb.fetch2 import FetchMethod -from bb.fetch2 import runfetchcmd +from bb.fetch2 import runfetchcmd, runfetchcmd2 from bb.fetch2 import logger +import pipes class Git(FetchMethod): """Class to fetch a module or modules from git repositories""" @@ -115,6 +116,7 @@ class Git(FetchMethod): ud.branches[name] = branch ud.basecmd = data.getVar("FETCHCMD_git", d, True) or "git" + ud.runfetch = lambda args,d,**opts: runfetchcmd2(ud.basecmd, args, d, **opts) ud.write_tarballs = ((data.getVar("BB_GENERATE_MIRROR_TARBALLS", d, True) or "0") != "0") or ud.rebaseable @@ -177,15 +179,15 @@ class Git(FetchMethod): if not os.path.exists(ud.clonedir) and os.path.exists(ud.fullmirror): bb.utils.mkdirhier(ud.clonedir) os.chdir(ud.clonedir) - runfetchcmd("tar -xzf %s" % (ud.fullmirror), d) + runfetchcmd(['tar', '-xzf', ud.fullmirror], d) repourl = "%s://%s%s%s" % (ud.proto, username, ud.host, ud.path) # If the repo still doesn't exist, fallback to cloning it if not os.path.exists(ud.clonedir): - clone_cmd = "%s clone --bare --mirror %s %s" % (ud.basecmd, repourl, ud.clonedir) - bb.fetch2.check_network_access(d, clone_cmd) - runfetchcmd(clone_cmd, d) + clone_cmd = ['clone', '--bare', '--mirror', repourl, ud.clonedir] + bb.fetch2.check_network_access(d, clone_cmd, base_cmd = ud.basecmd, url = repourl) + ud.runfetch(clone_cmd, d) os.chdir(ud.clonedir) # Update the checkout if needed @@ -200,10 +202,10 @@ class Git(FetchMethod): except bb.fetch2.FetchError: logger.debug(1, "No Origin") - runfetchcmd("%s remote add --mirror=fetch origin %s" % (ud.basecmd, repourl), d) - fetch_cmd = "%s fetch -f --prune %s refs/*:refs/*" % (ud.basecmd, repourl) - bb.fetch2.check_network_access(d, fetch_cmd, ud.url) - runfetchcmd(fetch_cmd, d) + ud.runfetch(['remote', 'add', '--mirror=fetch', 'origin', repourl], d) + fetch_cmd = ['fetch', '-f', '--prune', repourl, 'refs/*:refs/*'] + bb.fetch2.check_network_access(d, fetch_cmd, base_cmd = ud.basecmd, url = ud.url) + ud.runfetch(fetch_cmd, d) runfetchcmd("%s prune-packed" % ud.basecmd, d) runfetchcmd("%s pack-redundant --all | xargs -r rm" % ud.basecmd, d) ud.repochanged = True @@ -213,8 +215,8 @@ class Git(FetchMethod): if ud.write_tarballs and (ud.repochanged or not os.path.exists(ud.fullmirror)): os.chdir(ud.clonedir) logger.info("Creating tarball of git repository") - runfetchcmd("tar -czf %s %s" % (ud.fullmirror, os.path.join(".") ), d) - runfetchcmd("touch %s.done" % (ud.fullmirror), d) + runfetchcmd(['tar', '-czf', ud.fullmirror, os.path.join(".")], d) + runfetchcmd(['touch', ud.fullmirror + '.done'], d) def unpack(self, ud, destdir, d): """ unpack the downloaded src to destdir""" @@ -232,18 +234,20 @@ class Git(FetchMethod): if os.path.exists(destdir): bb.utils.prunedir(destdir) - cloneflags = "-s -n" + cloneflags = ['clone', '-s', '-n'] if ud.bareclone: - cloneflags += " --mirror" + cloneflags.append("--mirror") + + cloneflags.extend(["%s/" % ud.clonedir, destdir]) + ud.runfetch(cloneflags, d) - runfetchcmd("git clone %s %s/ %s" % (cloneflags, ud.clonedir, destdir), d) if not ud.nocheckout: os.chdir(destdir) if subdir != "": - runfetchcmd("%s read-tree %s%s" % (ud.basecmd, ud.revisions[ud.names[0]], readpathspec), d) + ud.runfetch(['read-tree', '%s%s' % ud.revisions[ud.names[0]], readpathspec]) runfetchcmd("%s checkout-index -q -f -a" % ud.basecmd, d) else: - runfetchcmd("%s checkout %s" % (ud.basecmd, ud.revisions[ud.names[0]]), d) + ud.runfetch(['checkout', ud.revisions[ud.names[0]]], d) return True def clean(self, ud, d): @@ -257,7 +261,7 @@ class Git(FetchMethod): def _contains_ref(self, tag, d): basecmd = data.getVar("FETCHCMD_git", d, True) or "git" - cmd = "%s log --pretty=oneline -n 1 %s -- 2> /dev/null | wc -l" % (basecmd, tag) + cmd = "%s log --pretty=oneline -n 1 %s -- 2> /dev/null | wc -l" % (basecmd, pipes.quote(tag)) output = runfetchcmd(cmd, d, quiet=True) if len(output.split()) > 1: raise bb.fetch2.FetchError("The command '%s' gave output with more then 1 line unexpectedly, output: '%s'" % (cmd, output)) @@ -279,10 +283,12 @@ class Git(FetchMethod): username = "" basecmd = data.getVar("FETCHCMD_git", d, True) or "git" - cmd = "%s ls-remote %s://%s%s%s %s" % \ - (basecmd, ud.proto, username, ud.host, ud.path, ud.branches[name]) - bb.fetch2.check_network_access(d, cmd) - output = runfetchcmd(cmd, d, True) + cmd = ['ls-remote', + '%s://%s%s%s' % (ud.proto, username, ud.host, ud.path), + ud.branches[name]] + + bb.fetch2.check_network_access(d, cmd, base_cmd = ud.basecmd) + output = ud.runfetch(cmd, d, quiet=True) if not output: raise bb.fetch2.FetchError("The command %s gave empty output unexpectedly" % cmd, url) return output.split()[0] @@ -315,7 +321,7 @@ class Git(FetchMethod): if not self._contains_ref(rev, d): self.download(None, ud, d) - output = runfetchcmd("%s rev-list %s -- 2> /dev/null | wc -l" % (ud.basecmd, rev), d, quiet=True) + output = runfetchcmd("%s rev-list %s -- 2> /dev/null | wc -l" % (ud.basecmd, pipes.quote(rev)), d, quiet=True) os.chdir(cwd) buildindex = "%s" % output.split()[0] @@ -323,9 +329,8 @@ class Git(FetchMethod): return buildindex def checkstatus(self, uri, ud, d): - fetchcmd = "%s ls-remote %s" % (ud.basecmd, uri) try: - runfetchcmd(fetchcmd, d, quiet=True) + ud.runfetch(['ls-remote', uri], d, quiet=True) return True except FetchError: return False