- do not embed non-standard fields (e.g. Language) into blends/tasks
- assure single empty line spacing between paragraphs for
changed/added entries
Published-DOI: 10.3389/neuro.11.005.2008
; May be some previous entry should be removed, thus say so
Published-DOI: 10.3389/neuro.11.005.2008
; May be some previous entry should be removed, thus say so
-Removed: python-brian-doc
+Remove: python-brian-doc
;Tasks: debian-med/imaging-dev
;Why: Allows interactive development/scripting
;Tasks: debian-med/imaging-dev
;Why: Allows interactive development/scripting
__author__ = 'Yaroslav Halchenko'
__prog__ = os.path.basename(sys.argv[0])
__author__ = 'Yaroslav Halchenko'
__prog__ = os.path.basename(sys.argv[0])
__copyright__ = 'Copyright (c) 2010 Yaroslav Halchenko'
__license__ = 'GPL'
# What fields initiate new package description
__copyright__ = 'Copyright (c) 2010 Yaroslav Halchenko'
__license__ = 'GPL'
# What fields initiate new package description
-PKG_FIELDS = ('depends', 'recommends', 'suggests', 'ignore', 'removed')
+PKG_FIELDS = ('depends', 'recommends', 'suggests', 'ignore', 'remove')
# We might need to resort to assure some what a canonical order
# We might need to resort to assure some what a canonical order
-FIELDS_ORDER = ('depends', 'recommends', 'suggests', 'ignore',
- 'homepage', 'language', 'wnpp', 'responsible', 'license',
+# Prefixes for "standard" blends/tasks fields. Others do not get embedded
+# into tasks files
+BLENDS_FIELDS_PREFIXES = ('depends', 'recommends', 'suggests', 'ignore',
+ 'why', 'homepage', 'wnpp', 'responsible', 'license',
'vcs-', 'pkg-url', 'pkg-description',
'published-', 'x-', 'registration', 'remark')
'vcs-', 'pkg-url', 'pkg-description',
'published-', 'x-', 'registration', 'remark')
+# Additional fields which might come useful (e.g. for filing wnpp bugs)
+# but are not "standard" thus should be in the trailer
+CUSTOM_FIELDS_PREFIXES = ('author', 'language', 'pkg-name', 'pkg-source',
+ 'version', 'remove')
+# Other fields should cause Error for consistency
+
+FIELDS_ORDER = BLENDS_FIELDS_PREFIXES + CUSTOM_FIELDS_PREFIXES
# VCS fields
pkg.update(debianm.get_vcsfields())
# VCS fields
pkg.update(debianm.get_vcsfields())
-def key_prefix_compare(x, y, order, strict=False, case=False):
+
+def prefix_index(x, entries, strict=True, case=False, default=10000):
+ """Returns an index for the x in entries
+ """
+ if not case:
+ x = x.lower()
+ for i, v in enumerate(entries):
+ if x.startswith(v):
+ return i
+
+ if strict:
+ raise IndexError(
+ "Could not find location for %s as specified by %s" %
+ (x, entries))
+ return default
+
+
+def key_prefix_compare(x, y, order, strict=True, case=False):
"""Little helper to help with sorting
Sorts according to the order of string prefixes as given by
"""Little helper to help with sorting
Sorts according to the order of string prefixes as given by
if not case:
order = [v.lower() for v in order]
if not case:
order = [v.lower() for v in order]
- def prefix_index(t, order, strict=True, case=False):
- x = t[0]
- if not case:
- x = x.lower()
- for i, v in enumerate(order):
- if x.startswith(v):
- return i
-
- if strict:
- raise IndexError(
- "Could not find location for %s as specified by %s" %
- (x, order))
- return 10000 # some large number ;)
-
- cmp_res = cmp(prefix_index(x, order, strict, case),
- prefix_index(y, order, strict, case))
+ cmp_res = cmp(prefix_index(x[0], order, strict, case),
+ prefix_index(y[0], order, strict, case))
if not cmp_res: # still unknown
return cmp(x, y)
return cmp_res
if not cmp_res: # still unknown
return cmp(x, y)
return cmp_res
# Move Pkg-source/name into attributes
pkg__.source = pkg__.pop('Pkg-Source')
# Move Pkg-source/name into attributes
pkg__.source = pkg__.pop('Pkg-Source')
- pkg__.name = pkg__.pop('Pkg-name')
+ pkg__.name = pkg__.pop('Pkg-Name')
+ # Store the action taken on the package for later on actions
+ for f in PKG_FIELDS:
+ if f in pkg__:
+ pkg__.action = f
+ break
tasks[task] = tasks.get(task, []) + [pkg__]
verbose(4, "Grouped %d packages into %d tasks: %s" %
tasks[task] = tasks.get(task, []) + [pkg__]
verbose(4, "Grouped %d packages into %d tasks: %s" %
stats = dict(Added=[], Modified=[])
for pkg in pkgs:
msgs = {'Name': pkg.name.strip(), 'Action': None}
stats = dict(Added=[], Modified=[])
for pkg in pkgs:
msgs = {'Name': pkg.name.strip(), 'Action': None}
+
+ # Create a copy of the pkg with only valid tasks
+ # fields:
+ # TODO: make it configurable?
+ pkg = deepcopy(pkg)
+ for k in pkg:
+ if prefix_index(k, BLENDS_FIELDS_PREFIXES,
+ strict=False, default=None) is None:
+ pkg.pop(k) # remove it from becoming present in
+ # the taskfile
+
# Find either it is known to the task file already
# Load entirely so we could simply manipulate
# Find either it is known to the task file already
# Load entirely so we could simply manipulate
descr = ' ; Added by %s %s. [Please note here if modified manually]\n' % \
(__prog__, __version__)
descr = ' ; Added by %s %s. [Please note here if modified manually]\n' % \
(__prog__, __version__)
- # Replace existing entry
+
+ entry = pkg.dump()
+ # Replace existing entry?
if known:
# TODO: Check if previous copy does not have our preceding comment
# Find the previous end
if known:
# TODO: Check if previous copy does not have our preceding comment
# Find the previous end
# Lets not change file without necessity, if entry is identical --
# do nothing
# Lets not change file without necessity, if entry is identical --
# do nothing
old_entry = entries[istart:istart+icount]
if u''.join(old_entry) == entry:
old_entry = entries[istart:istart+icount]
if u''.join(old_entry) == entry:
+ # no changes -- just go to the next one
+ continue
else: # Rewrite the entry
if __prog__ in entries[istart-1]:
istart -= 1
icount += 2
else: # Rewrite the entry
if __prog__ in entries[istart-1]:
istart -= 1
icount += 2
- if not 'Removed' in pkg.keys():
- entries = entries[:istart] + [descr + entry] + entries[istart+icount:]
+ if 'remove' != pkg.action:
+ entry = descr + entry
msgs['Action'] = 'Changed'
else:
while entries[istart-1].strip() == '':
istart -=1
icount +=2
msgs['Action'] = 'Changed'
else:
while entries[istart-1].strip() == '':
istart -=1
icount +=2
- entries = entries[:istart] + entries[istart+icount:]
msgs['Action'] = 'Removed'
msgs['Action'] = 'Removed'
- output = ''.join(entries) # 'compute' first
- open(taskfile, 'w').write(output) # then only overwrite
- elif not 'removed' in pkg: # or Append one
+ entries_prior = entries[:istart]
+ entries_post = entries[istart+icount:]
+ elif not 'remove' == pkg.action: # or Append one
+ if pkg.name == 'python-brian-doc':
+ import pydb
+ pydb.debugger()
+ entries_prior = entries
+ entry = descr + entry
+ entries_post = []
- output = '\n%s%s' % (descr, pkg.dump(),)
- open(taskfile, 'a').write(output)
+ # Lets do 'in full' for consistent handling of empty lines
+ # around
+ #output = '\n%s%s' % (descr, pkg.dump(),)
+ #open(taskfile, 'a').write(output)
+ # Prepare for dumping
+ # Prune spaces before
+ while len(entries_prior) and entries_prior[-1].strip() == '':
+ entries_prior = entries_prior[:-1]
+ if len(entries_prior) and not entries_prior[-1].endswith('\n'):
+ entries_prior[-1] += '\n' # assure present trailing newline
+ # Prune spaces after
+ while len(entries_post) and entries_post[0].strip() == '':
+ entries_post = entries_post[1:]
+ if len(entries_post) and len(entry):
+ # only then trailing empty line
+ entry += '\n'
+ output = ''.join(entries_prior + [ '\n' + entry ] + entries_post)
+ open(taskfile, 'w').write(output) # then only overwrite
+
verbose(3, "%(Action)s %(Name)s" % msgs)
verbose(3, "%(Action)s %(Name)s" % msgs)