def download(self): logger.warning( 'Processing: Station "%s-%s", AC "%s", District "%s"...' % (self.num, self.name, self.ac_name, self.dist_name)) self.__fetch_pdf('telugu') self.__fetch_pdf('english') row = (self.dist_name, self.ac_name, self.num, self.name, self.location, relpath(self.telugu_file) if self.telugu_file is not None else DOWNLOAD_FAILED, relpath(self.english_file) if self.english_file is not None else DOWNLOAD_FAILED) append_csv(self.session.track.output, row) self.session.track.set_done_station(self.num)
def _build(t): if (os.path.exists(t) and not state.is_generated(t) and not os.path.exists('%s.do' % t)): # an existing source file that is not marked as a generated file. # This step is mentioned by djb in his notes. It turns out to be # important to prevent infinite recursion. For example, a rule # called default.c.do could be used to try to produce hello.c, # which is undesirable since hello.c existed already. state.stamp(t) return # success state.start(t) (dofile, basename, ext) = _find_do_file(t) if not dofile: raise BuildError('no rule to make %r' % t) state.stamp(dofile) tmpname = '%s.redo.tmp' % t unlink(tmpname) f = open(tmpname, 'w+') # this will run in the dofile's directory, so use only basenames here argv = ['sh', '-e', os.path.basename(dofile), os.path.basename(basename), # target name (extension removed) ext, # extension (if any), including leading dot os.path.basename(tmpname) # randomized output file name ] if vars.VERBOSE: argv[1] += 'v' log_('\n') log('%s\n' % relpath(t, vars.STARTDIR)) rv = subprocess.call(argv, preexec_fn=lambda: _preexec(t), stdout=f.fileno()) if rv==0: if os.path.exists(tmpname) and os.stat(tmpname).st_size: # there's a race condition here, but if the tmpfile disappears # at *this* point you deserve to get an error, because you're # doing something totally scary. os.rename(tmpname, t) else: unlink(tmpname) state.stamp(t) else: unlink(tmpname) state.unstamp(t) f.close() if rv != 0: raise BuildError('%s: exit code %d' % (t,rv)) if vars.VERBOSE: log('%s (done)\n\n' % relpath(t, vars.STARTDIR))
def main(targets, buildfunc): retcode = [0] # a list so that it can be reassigned from done() if vars.SHUFFLE: random.shuffle(targets) locked = [] def done(t, rv): if rv: err('%s: exit code was %r\n' % (t, rv)) retcode[0] = 1 for i in range(len(targets)): t = targets[i] if os.path.exists('%s/all.do' % t): # t is a directory, but it has a default target targets[i] = '%s/all' % t for t in targets: jwack.get_token(t) lock = state.Lock(t) lock.trylock() if not lock.owned: log('%s (locked...)\n' % relpath(t, vars.STARTDIR)) locked.append(t) else: jwack.start_job(t, lock, lambda: buildfunc(t), lambda t,rv: done(t,rv)) while locked or jwack.running(): jwack.wait_all() if locked: t = locked.pop(0) lock = state.Lock(t) while not lock.owned: lock.wait() lock.trylock() assert(lock.owned) relp = relpath(t, vars.STARTDIR) log('%s (...unlocked!)\n' % relp) if state.stamped(t) == None: err('%s: failed in another thread\n' % relp) retcode[0] = 2 lock.unlock() else: jwack.start_job(t, lock, lambda: buildfunc(t), lambda t,rv: done(t,rv)) return retcode[0]
def _sname(typ, t, fromdir=None): # FIXME: t.replace(...) is non-reversible and non-unique here! if fromdir: t = os.path.join(fromdir, t) tnew = relpath(t, vars.BASE) v = vars.BASE + ("/.redo/%s^%s" % (typ, tnew.replace("/", "^"))) debug2("sname: (%r) %r -> %r\n" % (os.getcwd(), t, tnew)) return v
def download(self): try: self.file = urldown(url=self.url, dest=self.outdir) except AssertionError: pass row = (self.ac_num, self.ac_name, self.station_num, self.station_name, self.lang, relpath(self.file) if self.file is not None else 'Not available / Unable to download') append_csv(OUTPUT_FILE, row)
def download(self): try: js = urlget(self.js_url) except AssertionError: return self.js_content = js parsed = self.parse_js() for item in parsed: ac, polls = item ac_num, ac_name = ac for i in range(polls): poll_num = i + 1 url = self.get_pdf_url(ac_num, poll_num) try: file = urldown(url=url, dest=getpath(TRIPURA_PDF_DIR)) except AssertionError: file = None row = (self.name, str(ac_num), ac_name, str(poll_num), relpath(file) if file is not None else 'Not available / Unable to download') self.rolls.append(row) append_csv(OUTPUT_FILE, row)
def add_dep(t, mode, dep): debug2("add-dep(%r)\n" % t) open(_sname("dep", t), "a").write("%s %s\n" % (mode, relpath(dep, vars.BASE)))
def run_args_from_fn(self, fn): return ['python', helpers.relpath('runner.py'), fn]