From 7cb668e56e290cd7fcbb35b24950d701cb398a4d Mon Sep 17 00:00:00 2001 From: Zhang Qiang Date: Tue, 14 Aug 2012 14:20:19 +0800 Subject: [PATCH] refinement about temp file/dir management 1. create temp file/dir in $tmpdir setting in gbs.conf 2. catch OSError in Temp class --- gitbuildsys/cmd_build.py | 3 +-- gitbuildsys/cmd_export.py | 5 ++++- gitbuildsys/cmd_remotebuild.py | 17 ++++++----------- gitbuildsys/errors.py | 3 +++ gitbuildsys/utils.py | 31 ++++++++++++++++++++++--------- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/gitbuildsys/cmd_build.py b/gitbuildsys/cmd_build.py index e548dcc..7c5fa3f 100644 --- a/gitbuildsys/cmd_build.py +++ b/gitbuildsys/cmd_build.py @@ -367,8 +367,7 @@ def do(opts, args): # Only guess spec filename here, parse later when we have the correct # spec file at hand specfile = utils.guess_spec(workdir, opts.spec) - packaging_dir = os.path.join(workdir, 'packaging/', 'build_') - tmpd = utils.Temp(prefix=packaging_dir, directory=True) + tmpd = utils.Temp(prefix=os.path.join(tmpdir, '.gbs_build'), directory=True) export_dir = tmpd.path with utils.Workdir(workdir): if opts.commit: diff --git a/gitbuildsys/cmd_export.py b/gitbuildsys/cmd_export.py index 862d2a9..893453d 100644 --- a/gitbuildsys/cmd_export.py +++ b/gitbuildsys/cmd_export.py @@ -27,6 +27,7 @@ import msger import runner import utils import errors +from conf import configmgr from gbp.scripts.buildpackage_rpm import main as gbp_build from gbp.rpm.git import GitRepositoryError, RpmGitRepository @@ -81,7 +82,9 @@ def do(opts, args): outdir = opts.outdir mkdir_p(outdir) outdir = os.path.abspath(outdir) - tempd = utils.Temp(prefix='gbs_export_', dirn=outdir, directory=True) + tmpdir = configmgr.get('tmpdir', 'general') + tempd = utils.Temp(prefix=os.path.join(tmpdir, '.gbs_export_'), \ + directory=True) export_dir = tempd.path with utils.Workdir(workdir): diff --git a/gitbuildsys/cmd_remotebuild.py b/gitbuildsys/cmd_remotebuild.py index 9fd2211..15e75bc 100644 --- a/gitbuildsys/cmd_remotebuild.py +++ b/gitbuildsys/cmd_remotebuild.py @@ -88,13 +88,6 @@ def do(opts, args): utils.gitStatusChecker(repo, opts) workdir = repo.path - tmpdir = os.path.join(workdir, 'packaging', '.export') - if not os.path.exists(tmpdir): - os.makedirs(tmpdir) - - if not os.access(tmpdir, os.W_OK|os.R_OK|os.X_OK): - msger.error('No access permission to %s, please check' % tmpdir) - # TODO: check ./packaging dir at first specs = glob.glob('%s/packaging/*.spec' % workdir) if not specs: @@ -131,7 +124,10 @@ def do(opts, args): "passwdx": PASSWDX, } - tmpf = utils.Temp(dirn=tmpdir, prefix='.oscrc', content=oscrc) + tmpdir = configmgr.get('tmpdir', 'general') + tmpd = utils.Temp(prefix=os.path.join(tmpdir, '.gbs_remotebuild_'), directory=True) + exportdir = tmpd.path + tmpf = utils.Temp(dirn=exportdir, prefix='.oscrc', content=oscrc) oscrcpath = tmpf.path api = OSC(APISERVER, oscrc=oscrcpath) @@ -207,7 +203,7 @@ def do(opts, args): "--git-ignore-new", "--git-builder=osc", "--git-no-auto-patch-gen", "--git-upstream-tree=%s" % commit, - "--git-export-dir=%s" % tmpdir, + "--git-export-dir=%s" % exportdir, "--git-packaging-dir=packaging", "--git-specfile=%s" % relative_spec, "--git-export=%s" % commit]): @@ -223,12 +219,11 @@ def do(opts, args): msger.info('commit packaging files to build server ...') try: api.commit_files(target_prj, package, - glob.glob("%s/*" % tmpdir), commit_msg) + glob.glob("%s/*" % exportdir), commit_msg) except errors.ObsError, exc: msger.error('commit packages fail: %s, please check the permission '\ 'of target project:%s' % (exc, target_prj)) - shutil.rmtree(tmpdir) msger.info('local changes submitted to build server successfully') msger.info('follow the link to monitor the build progress:\n' diff --git a/gitbuildsys/errors.py b/gitbuildsys/errors.py index 5f08685..657001d 100644 --- a/gitbuildsys/errors.py +++ b/gitbuildsys/errors.py @@ -50,3 +50,6 @@ class Abort(CmdError): class UrlError(CmdError): keyword = '' + +class GbsError(CmdError): + keyword = '' diff --git a/gitbuildsys/utils.py b/gitbuildsys/utils.py index 7774748..8ccf2ec 100644 --- a/gitbuildsys/utils.py +++ b/gitbuildsys/utils.py @@ -82,21 +82,34 @@ class Temp(object): """ self.directory = directory + self.path = None - if directory: - path = tempfile.mkdtemp(suffix, prefix, dirn) - else: - (fds, path) = tempfile.mkstemp(suffix, prefix, dirn) - os.close(fds) - if content: - with file(path, 'w+') as fobj: - fobj.write(content) + try: + if dirn: + target_dir = os.path.abspath(os.path.join(dirn, prefix)) + else: + target_dir = os.path.abspath(prefix) + target_dir = os.path.dirname(target_dir) + if not os.path.exists(target_dir): + os.makedirs(target_dir) + + if directory: + path = tempfile.mkdtemp(suffix, prefix, dirn) + else: + (fds, path) = tempfile.mkstemp(suffix, prefix, dirn) + os.close(fds) + if content: + with file(path, 'w+') as fobj: + fobj.write(content) + except OSError, (e, msg): + raise errors.GbsError("Failed to create dir or file on %s: %s" % \ + (target_dir, msg)) self.path = path def __del__(self): """Remove it when object is destroyed.""" - if os.path.exists(self.path): + if self.path and os.path.exists(self.path): if self.directory: shutil.rmtree(self.path, True) else: -- 2.7.4