refinement about temp file/dir management
authorZhang Qiang <qiang.z.zhang@intel.com>
Tue, 14 Aug 2012 06:20:19 +0000 (14:20 +0800)
committerZhang Qiang <qiang.z.zhang@intel.com>
Tue, 14 Aug 2012 06:20:19 +0000 (14:20 +0800)
1. create temp file/dir in $tmpdir setting in gbs.conf
2. catch OSError in Temp class

gitbuildsys/cmd_build.py
gitbuildsys/cmd_export.py
gitbuildsys/cmd_remotebuild.py
gitbuildsys/errors.py
gitbuildsys/utils.py

index e548dcc..7c5fa3f 100644 (file)
@@ -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:
index 862d2a9..893453d 100644 (file)
@@ -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):
index 9fd2211..15e75bc 100644 (file)
@@ -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'
index 5f08685..657001d 100644 (file)
@@ -50,3 +50,6 @@ class Abort(CmdError):
 
 class UrlError(CmdError):
     keyword = '<url>'
+
+class GbsError(CmdError):
+    keyword = '<gbs>'
index 7774748..8ccf2ec 100644 (file)
@@ -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: