Hi,

I just found a little bug in the multiarch patch I've attached in the
last message. Line 68 was:

+            archs[0] = arch

But should actually be:

+            archs.append(arch)

I'm attaching a new patch with the above fix plus a new command for
the network client, which lets dump a specific job, for example:

[EMAIL PROTECTED]> job status
E: usage: job status <name> <ver> <dist> [arch]

[EMAIL PROTECTED]> job status liblscp 0.5.5-0.1 sid
I: Job 1 for liblscp_0.5.5-0.1 is status BUILD_OK on sid/i386 for None

[EMAIL PROTECTED]> job status liblscp 0.5.5-0.1 sid amd64
I: Job 2 for liblscp_0.5.5-0.1 is status BUILD_OK on sid/amd64 for None

Ciao!

Free
Index: rebuildd/Job.py
===================================================================
--- rebuildd/Job.py	(revision 144)
+++ rebuildd/Job.py	(working copy)
@@ -101,10 +101,15 @@
         with self.status_lock:
             self.status = JobStatus.BUILDING
 
+        arch = self.arch
+        # if arch is 'any' use the first arch defined
+        if arch == 'any':
+            arch = RebuilddConfig().get('build', 'archs').split(' ')[0]
+
         # execute commands
         for cmd, failed_status in ([Dists().dists[self.dist].get_source_cmd(self.package),
                                     JobStatus.SOURCE_FAILED],
-                                   [Dists().dists[self.dist].get_build_cmd(self.package),
+                                   [Dists().dists[self.dist].get_build_cmd(self.package, arch),
                                     JobStatus.BUILD_FAILED],
                                    [Dists().dists[self.dist].get_post_build_cmd(self.package),
                                     JobStatus.POST_BUILD_FAILED]):
Index: rebuildd/Rebuildd.py
===================================================================
--- rebuildd/Rebuildd.py	(revision 144)
+++ rebuildd/Rebuildd.py	(working copy)
@@ -126,7 +126,8 @@
                 return 0
 
             jobs = []
-            jobs.extend(Job.selectBy(status=JobStatus.WAIT, arch=self.cfg.arch)[:max_new])
+            for arch in self.cfg.get('build', 'archs').split(' '):
+                jobs.extend(Job.selectBy(status=JobStatus.WAIT, arch=arch)[:max_new])
             if self.cfg.getboolean('build', 'build_arch_any'):
                 jobs.extend(Job.selectBy(status=JobStatus.WAIT, arch='any')[:max_new])
 
@@ -146,11 +147,11 @@
                     # try to see if there's a job for us
                     for cpackage in candidate_packages:
                         candidate_jobs = []
-                        candidate_jobs.extend(Job.selectBy(package=cpackage, arch=self.cfg.arch))
+                        candidate_jobs.extend(Job.selectBy(package=cpackage, arch=job.arch))
                         if self.cfg.getboolean('build', 'build_arch_any'):
                             candidate_jobs.extend(Job.selectBy(package=cpackage, arch='any'))
                         for cjob in candidate_jobs:
-                            if newjob and newjob.arch == self.cfg.arch and cjob.arch == self.cfg.arch and cjob.status == JobStatus.WAIT:
+                            if newjob and newjob.arch == job.arch and cjob.arch == job.arch and cjob.status == JobStatus.WAIT:
                                 cjob.status = JobStatus.GIVEUP
                             elif newjob and newjob.arch == "any" and cjob.status == JobStatus.WAIT:
                                 cjob.status = JobStatus.GIVEUP
@@ -231,6 +232,32 @@
 
         return ret
 
+    def dump_job(self, name, version, dist, arch=None):
+        """Dump a particular job"""
+
+        if not arch:
+            # if arch is not set use the first arch defined
+            arch = RebuilddConfig().get('build', 'archs').split(' ')[0]
+
+        pkgs = Package.selectBy(name=name, version=version)
+        if not pkgs.count():
+            return ''
+        pkg = pkgs[0]
+
+        jobs = Job.selectBy(package=pkg, dist=dist, arch=arch)
+        if not jobs.count():
+            return ''
+        job = jobs[0]
+            
+        return "I: Job %s for %s_%s is status %s on %s/%s for %s\n" % \
+               (job.id,
+                job.package.name,
+                job.package.version,
+                JobStatus.whatis(job.status),
+                job.dist,
+                job.arch,
+                job.mailto)
+
     def cancel_job(self, jobid):
         """Cancel a job"""
 
@@ -271,30 +298,38 @@
         if not Dists().dists.has_key(dist):
             return False
 
+        archs = []
         if not arch:
-            arch = self.cfg.arch
-
-        pkgs = Package.selectBy(name=name, version=version)
-        if pkgs.count():
-            # If several packages exists, just take the first
-            pkg = pkgs[0]
+            # Add a job for every arch we support
+            archs = self.cfg.get('build', 'archs').split(' ')
         else:
-            # Maybe we found no packages, so create a brand new one!
-            pkg = Package(name=name, version=version, priority=priority)
+            # Just add one job
+            archs.append(arch)
 
-        jobs_count = Job.selectBy(package=pkg, dist=dist, arch=arch, mailto=mailto, status=JobStatus.WAIT).count()
-        if jobs_count:
-            RebuilddLog.error("Job already existing for %s_%s on %s/%s, don't adding it" \
-                           % (pkg.name, pkg.version, dist, arch))
-            return False
+        for arch in archs:
 
-        job = Job(package=pkg, dist=dist, arch=arch)
-        job.status = JobStatus.WAIT
-        job.arch = arch
-        job.mailto = mailto
+            pkgs = Package.selectBy(name=name, version=version)
+            if pkgs.count():
+                # If several packages exists, just take the first
+                pkg = pkgs[0]
+            else:
+                # Maybe we found no packages, so create a brand new one!
+                pkg = Package(name=name, version=version, priority=priority)
 
-        RebuilddLog.info("Added job for %s_%s on %s/%s for %s" \
-                      % (name, version, dist, arch, mailto))
+            jobs_count = Job.selectBy(package=pkg, dist=dist, arch=arch, mailto=mailto, status=JobStatus.WAIT).count()
+            if jobs_count:
+                RebuilddLog.error("Job already existing for %s_%s on %s/%s, don't adding it" \
+                                      % (pkg.name, pkg.version, dist, arch))
+                return False
+
+            job = Job(package=pkg, dist=dist, arch=arch)
+            job.status = JobStatus.WAIT
+            job.arch = arch
+            job.mailto = mailto
+
+            RebuilddLog.info("Added job for %s_%s on %s/%s for %s" \
+                                 % (name, version, dist, arch, mailto))
+
         return True
 
     def clean_jobs(self):
Index: rebuildd/Distribution.py
===================================================================
--- rebuildd/Distribution.py	(revision 144)
+++ rebuildd/Distribution.py	(working copy)
@@ -35,20 +35,20 @@
             RebuilddLog.error("get_source_cmd has invalid format: %s" % error)
             return None
  
-    def get_build_cmd(self, package):
+    def get_build_cmd(self, package, arch):
         """Return command used for building source for this distribution"""
 
         # Strip epochs (x:) away
         try:
             index = package.version.index(":")
             return RebuilddConfig().get('build', 'build_cmd') \
-                    % (self.name, package.name, package.version[index+1:])
+                    % (self.name, arch, package.name, package.version[index+1:])
         except ValueError:
             pass
 
         try:
             return RebuilddConfig().get('build', 'build_cmd') \
-                    % (self.name, package.name, package.version)
+                    % (self.name, arch, package.name, package.version)
         except TypeError, error:
             RebuilddLog.error("get_build_cmd has invalid format: %s" % error)
             return None
Index: rebuildd/RebuilddConfig.py
===================================================================
--- rebuildd/RebuilddConfig.py	(revision 144)
+++ rebuildd/RebuilddConfig.py	(working copy)
@@ -46,13 +46,16 @@
         self.set('build', 'max_jobs', '5')
         self.set('build', 'kill_timeout', '90')
         self.set('build', 'source_cmd', 'apt-get -q --download-only -t %s source %s=%s')
-        self.set('build', 'build_cmd', 'pbuilder build --basetgz /var/cache/pbuilder/%s.tgz %s_%s.dsc')
+        self.set('build', 'build_cmd', 'pbuilder build --basetgz /var/cache/pbuilder/%s-%s.tgz %s_%s.dsc')
         self.set('build', 'post_build_cmd', '')
         self.set('build', 'dists', 'etch lenny sid')
         self.set('build', 'work_dir', '/var/cache/rebuildd/build')
         self.set('build', 'database_uri', 'sqlite:///var/lib/rebuildd/rebuildd.db')
         self.set('build', 'build_more_recent', '1')
         self.set('build', 'build_arch_any', '1')
+        parch = os.popen("dpkg --print-architecture")
+        self.set('build', 'archs', parch.readline().strip())
+        parch.close()
 
         self.set('mail', 'from', '[EMAIL PROTECTED]')
         self.set('mail', 'mailto', '[EMAIL PROTECTED]')
@@ -77,10 +80,6 @@
         self.set('log', 'mail_failed', '1')
         self.set('log', 'mail_successful', '0')
 
-        parch = os.popen("dpkg --print-architecture")
-        self.arch = parch.readline().strip()
-        parch.close()
-
         if not dontparse:
             self.reload()
 
Index: rebuildd/RebuilddNetworkClient.py
===================================================================
--- rebuildd/RebuilddNetworkClient.py	(revision 144)
+++ rebuildd/RebuilddNetworkClient.py	(working copy)
@@ -129,6 +129,9 @@
         if len(args) > 0 and args[0] == "reload":
             return self.exec_cmd_job_reload(*args)
 
+        if len(args) > 0 and args[0] == "status":
+            return self.exec_cmd_job_status(*args)
+
         return "E: usage: job <command> [args]\n"
 
     def exec_cmd_job_add(self, *args):
@@ -163,6 +166,24 @@
             return "I: job added\n"
         return "E: error adding job\n"
 
+    def exec_cmd_job_status(self, *args):
+        """Add job"""
+        ret = False
+        if len(args) < 3:
+            return "E: usage: job status <name> <ver> <dist> [arch]\n"
+
+        if len(args) == 4:
+            return self.rebuildd.dump_job(name=args[1],
+                                        version=args[2],
+                                        dist=args[3])
+
+        if len(args) == 5:
+            return self.rebuildd.dump_job(name=args[1],
+                                        version=args[2],
+                                        dist=args[3],
+                                        arch=args[4])
+        return "E: error dumping job\n"
+
     def exec_cmd_job_cancel(self, *args):
         """Cancel job"""
 

|--==> Free Ekanayaka writes:

  FE> Hi Julien,
|--==> Julien Danjou writes:

  FE> [...]

  >>>I'll attach it as soon as I'm done!

  JD> Thanks :)

  FE> Here you go.. The patch seems to work fine in most situations, but
  FE> probably needs to be checked against corner cases (especially when the
  FE> build_more_recent and build_arch_any options are used).

  FE> I've made a few comments to the new code, hope that's clear enough,
  FE> anyway the changes are very few.

  FE> While I am at it I attach another patch which fixes the renaming from
  FE> Job.build_status to Job.build in the webpy templates (maybe you did it
  FE> yourself but didn't commit).

  FE> If you don't mind I'd like to be added to the rebuildd Alioth project
  FE> (I'm free-guest), so that if I play more with the code I can commit it
  FE> in a branch, and you can review it more easily.

  FE> Ciao!

  FE> Free

Reply via email to