openSUSE Commits
Threads by month
- ----- 2024 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
November 2010
- 1 participants
- 1023 discussions
Hello community,
here is the log from the commit of package mozilla-xulrunner20 for openSUSE:Factory
checked in at Wed Nov 10 20:43:29 CET 2010.
--------
--- mozilla-xulrunner20/mozilla-xulrunner20.changes 2010-08-05 08:12:50.000000000 +0200
+++ mozilla-xulrunner20/mozilla-xulrunner20.changes 2010-11-06 13:56:02.000000000 +0100
@@ -1,0 +2,10 @@
+Sat Nov 6 12:50:18 UTC 2010 - wr(a)rosenauer.org
+
+- update to 2.0b7 (20101105)
+- honour LANGUAGE environment variable (bmo#583793)
+- fixed wrong reference in pkgconfig files
+- use gio instead of gnome-vfs after 11.3
+- fix buildsymbols zip command and exclude dbg.gz from symbols.txt
+- fixed "KDE mode"
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
mozilla-language.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ mozilla-xulrunner20.spec ++++++
--- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100
+++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100
@@ -31,9 +31,9 @@
%endif
License: GPLv2+ ; LGPLv2.1+ ; MPLv1.1+
Version: 2.0b
-Release: 1
-%define releasedate 2010083100
-%define version_internal 2.0b5
+Release: 2
+%define releasedate 2010110500
+%define version_internal 2.0b7
%define apiversion 2.0
%define uaweight 199900
Summary: Mozilla Runtime Environment 2.0
@@ -71,6 +71,7 @@
# ---
Patch11: mozilla-cpuid.patch
Patch12: mozilla-buildsymbols.patch
+Patch13: mozilla-language.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires: mozilla-js20 = %{version}
Requires(post): update-alternatives coreutils
@@ -212,6 +213,7 @@
%patch11 -p1
%endif
%patch12 -p1
+%patch13 -p1
%build
kdehelperversion=$(cat toolkit/xre/nsKDEUtils.cpp | grep '#define KMOZILLAHELPER_VERSION' | cut -d ' ' -f 3)
@@ -261,6 +263,12 @@
ac_add_options --enable-shared-js
#ac_add_options --enable-debug
EOF
+%if %suse_version > 1130
+cat << EOF >> $MOZCONFIG
+ac_add_options --disable-gnomevfs
+ac_add_options --enable-gio
+EOF
+%endif
%if %has_system_nspr
cat << EOF >> $MOZCONFIG
ac_add_options --with-system-nspr
@@ -454,7 +462,9 @@
%{_libdir}/xulrunner-%{version_internal}/chrome/icons/
%{_libdir}/xulrunner-%{version_internal}/components/
%exclude %{_libdir}/xulrunner-%{version_internal}/components/libmozgnome.so
+%if %suse_version <= 1130
%exclude %{_libdir}/xulrunner-%{version_internal}/components/libnkgnomevfs.so
+%endif
%{_libdir}/xulrunner-%{version_internal}/defaults/
%{_libdir}/xulrunner-%{version_internal}/greprefs.js
%{_libdir}/xulrunner-%{version_internal}/icons/
@@ -519,7 +529,9 @@
%dir %{_libdir}/xulrunner-%{version_internal}/
%dir %{_libdir}/xulrunner-%{version_internal}/components/
%{_libdir}/xulrunner-%{version_internal}/components/libmozgnome.so
+%if %suse_version <= 1130
%{_libdir}/xulrunner-%{version_internal}/components/libnkgnomevfs.so
+%endif
%if %localize
++++++ compare-locales.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/Checks.py new/compare-locales/lib/Mozilla/Checks.py
--- old/compare-locales/lib/Mozilla/Checks.py 1970-01-01 01:00:00.000000000 +0100
+++ new/compare-locales/lib/Mozilla/Checks.py 2010-11-06 13:43:49.000000000 +0100
@@ -0,0 +1,265 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is l10n test automation.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Foundation
+# Portions created by the Initial Developer are Copyright (C) 2010
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# Axel Hecht <l10n(a)mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+import re
+import itertools
+from difflib import SequenceMatcher
+from xml import sax
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
+from Parser import DTDParser
+
+class Checker(object):
+ '''Abstract class to implement checks per file type.
+ '''
+ pattern = None
+
+ def use(self, file):
+ return self.pattern.match(file)
+
+ def check(self, refEnt, l10nEnt):
+ '''Given the reference and localized Entities, performs checks.
+
+ This is a generator yielding tuples of
+ - "warning" or "error", depending on what should be reported,
+ - tuple of line, column info for the error within the string
+ - description string to be shown in the report
+ '''
+ if True:
+ raise NotImplementedError, "Need to subclass"
+ yield ("error", (0,0), "This is an example error")
+
+class PrintfException(Exception):
+ def __init__(self, msg, pos):
+ self.pos = pos
+ self.msg = msg
+
+class PropertiesChecker(Checker):
+ '''Tests to run on .properties files.
+ '''
+ pattern = re.compile('.*\.properties$')
+ printf = re.compile(r'%(?P<good>%|(?:(?P<number>[1-9][0-9]*)\$)?(?P<width>\*|[0-9]+)?(?P<prec>\.(?:\*|[0-9]+)?)?(?P<spec>[duxXosScpfg]))?')
+
+ def check(self, refEnt, l10nEnt):
+ '''Test for the different variable formats.
+ '''
+ refValue, l10nValue = refEnt.val, l10nEnt.val
+ refSpecs = None
+ # check for PluralForm.jsm stuff, should have the docs in the
+ # comment
+ if 'Localization_and_Plurals' in refEnt.pre_comment:
+ # For plurals, common variable pattern is #1. Try that.
+ pats = set(int(m.group(1)) for m in re.finditer('#([0-9]+)',
+ refValue))
+ if len(pats)==0:
+ return
+ lpats = set(int(m.group(1)) for m in re.finditer('#([0-9]+)',
+ l10nValue))
+ if pats - lpats:
+ yield ('warning', 0, 'not all variables used in l10n')
+ return
+ if lpats - pats:
+ yield ('error', 0, 'unreplaced variables in l10n')
+ return
+ return
+ try:
+ refSpecs = self.getPrintfSpecs(refValue)
+ except PrintfException, e:
+ refSpecs = []
+ if refSpecs:
+ for t in self.checkPrintf(refSpecs, l10nValue):
+ yield t
+ return
+
+ def checkPrintf(self, refSpecs, l10nValue):
+ try:
+ l10nSpecs = self.getPrintfSpecs(l10nValue)
+ except PrintfException, e:
+ yield ('error', e.pos, e.msg)
+ return
+ if refSpecs != l10nSpecs:
+ sm = SequenceMatcher()
+ sm.set_seqs(refSpecs, l10nSpecs)
+ msgs = []
+ warn = None
+ for action, ls, le, rs, re in sm.get_opcodes():
+ if action == 'equal':
+ continue
+ if action == 'delete':
+ # missing argument in l10n
+ if le == len(refSpecs):
+ # trailing specs missing, that's just a warning
+ warn = ', '.join('trailing argument %d `%s` missing' %
+ (i+1, refSpecs[i])
+ for i in xrange(ls, le))
+ else:
+ for i in xrange(ls, le):
+ msgs.append('argument %d `%s` missing' %
+ (i+1, refSpecs[i]))
+ continue
+ if action == 'insert':
+ # obsolete argument in l10n
+ for i in xrange(rs, re):
+ msgs.append('argument %d `%s` obsolete' %
+ (i+1, l10nSpecs[i]))
+ continue
+ if action == 'replace':
+ for i, j in zip(xrange(ls, le), xrange(rs, re)):
+ msgs.append('argument %d `%s` should be `%s`' %
+ (j+1, l10nSpecs[j], refSpecs[i]))
+ if msgs:
+ yield ('error', 0, ', '.join(msgs))
+ if warn is not None:
+ yield ('warning', 0, warn)
+
+ def getPrintfSpecs(self, val):
+ hasNumber = False
+ specs = []
+ for m in self.printf.finditer(val):
+ if m.group("good") is None:
+ # found just a '%', signal an error
+ raise PrintfException('Found single %', m.start())
+ if m.group("good") == '%':
+ # escaped %
+ continue
+ if ((hasNumber and m.group('number') is None) or
+ (not hasNumber and specs and m.group('number') is not None)):
+ # mixed style, numbered and not
+ raise PrintfException('Mixed ordered and non-ordered args',
+ m.start())
+ hasNumber = m.group('number') is not None
+ if hasNumber:
+ pos = int(m.group('number')) - 1
+ ls = len(specs)
+ if pos >= ls:
+ # pad specs
+ nones = pos - ls
+ specs[ls:pos] = nones*[None]
+ specs.append(m.group('spec'))
+ else:
+ if specs[pos] is not None:
+ raise PrintfException('Double ordered argument %d' % (pos+1),
+ m.start())
+ specs[pos] = m.group('spec')
+ else:
+ specs.append(m.group('spec'))
+ # check for missing args
+ if hasNumber and not all(specs):
+ raise PrintfException('Ordered argument missing', 0)
+ return specs
+
+
+class DTDChecker(Checker):
+ '''Tests to run on DTD files.
+
+ Uses xml.sax for the heavy lifting of xml parsing.
+
+ The code tries to parse until it doesn't find any unresolved entities
+ anymore. If it finds one, it tries to grab the key, and adds an empty
+ <!ENTITY key ""> definition to the header.
+ '''
+ pattern = re.compile('.*\.dtd$')
+
+ eref = re.compile('&(%s);' % DTDParser.Name)
+ tmpl = '''<!DOCTYPE elem [%s]>
+<elem>
+%s
+</elem>
+'''
+ xmllist = set(('amp', 'lt', 'gt', 'apos', 'quot'))
+
+ def check(self, refEnt, l10nEnt):
+ '''Try to parse the refvalue inside a dummy element, and keep
+ track of entities that we need to define to make that work.
+
+ Return a checker that offers just those entities.
+ '''
+ refValue, l10nValue = refEnt.val, l10nEnt.val
+ # find entities the refValue references,
+ # reusing markup from DTDParser.
+ reflist = set(m.group(1).encode('utf-8')
+ for m in self.eref.finditer(refValue)) \
+ - self.xmllist
+ entities = ''.join('<!ENTITY %s "">' % s for s in sorted(reflist))
+ parser = sax.make_parser()
+ try:
+ parser.parse(StringIO(self.tmpl % (entities, refValue.encode('utf-8'))))
+ except sax.SAXParseException, e:
+ yield ('warning',
+ (0,0),
+ "can't parse en-US value")
+
+ # find entities the l10nValue references,
+ # reusing markup from DTDParser.
+ l10nlist = set(m.group(1).encode('utf-8')
+ for m in self.eref.finditer(l10nValue)) \
+ - self.xmllist
+ missing = sorted(l10nlist - reflist)
+ _entities = entities + ''.join('<!ENTITY %s "">' % s for s in missing)
+ warntmpl = 'Referencing unknown entity `%s`'
+ if reflist:
+ warntmpl += ' (%s known)' % ', '.join(sorted(reflist))
+ try:
+ parser.parse(StringIO(self.tmpl % (_entities, l10nValue.encode('utf-8'))))
+ except sax.SAXParseException, e:
+ # xml parse error, yield error
+ # sometimes, the error is reported on our fake closing
+ # element, make that the end of the last line
+ lnr = e.getLineNumber() - 2
+ lines = l10nValue.splitlines()
+ if lnr > len(lines):
+ lnr = len(lines)
+ col = len(lines[lnr-1])
+ else:
+ col = e.getColumnNumber()
+ yield ('error', (lnr, col), ' '.join(e.args))
+
+ for key in missing:
+ yield ('warning', (0,0), warntmpl % key)
+
+
+__checks = [DTDChecker(), PropertiesChecker()]
+
+def getChecks(file):
+ checks = map(lambda c: c.check, filter(lambda c: c.use(file), __checks))
+ def _checks(refEnt, l10nEnt):
+ return itertools.chain(*[c(refEnt, l10nEnt) for c in checks])
+ return _checks
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/CompareLocales.py new/compare-locales/lib/Mozilla/CompareLocales.py
--- old/compare-locales/lib/Mozilla/CompareLocales.py 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/lib/Mozilla/CompareLocales.py 2010-11-06 13:43:49.000000000 +0100
@@ -65,9 +65,15 @@
return True
return False
+try:
+ from json import dumps
+except:
+ from simplejson import dumps
+
import Parser
import Paths
+import Checks
class Tree(object):
def __init__(self, valuetype):
@@ -270,8 +276,60 @@
except KeyError:
self.details[file][category] = [data]
self.summary[file.locale]['errors'] += 1
+ elif category == 'warning':
+ try:
+ self.details[file][category].append(data)
+ except KeyError:
+ self.details[file][category] = [data]
+ self.summary[file.locale]['warnings'] += 1
return rv
+ def toExhibit(self):
+ items = []
+ for locale in sorted(self.summary.iterkeys()):
+ summary = self.summary[locale]
+ if locale is not None:
+ item = {'id': 'xxx/' + locale,
+ 'label': locale,
+ 'locale': locale}
+ else:
+ item = {'id': 'xxx',
+ 'label': 'xxx',
+ 'locale': 'xxx'}
+ item['type'] = 'Build'
+ total = sum([summary[k]
+ for k in ('changed','unchanged','report','missing',
+ 'missingInFiles')
+ if k in summary])
+ rate = (('changed' in summary and summary['changed'] * 100)
+ or 0) / total
+ item.update((k, summary.get(k, 0))
+ for k in ('changed','unchanged'))
+ item.update((k, summary[k])
+ for k in ('report','errors','warnings')
+ if k in summary)
+ item['missing'] = summary.get('missing', 0) + \
+ summary.get('missingInFiles', 0)
+ item['completion'] = rate
+ item['total'] = total
+ result = 'success'
+ if item.get('warnings',0):
+ result = 'warning'
+ if item.get('errors',0) or item.get('missing',0):
+ result = 'failure'
+ item['result'] = result
+ items.append(item)
+ data = {"properties": dict.fromkeys(
+ ("completion", "errors", "warnings", "missing", "report",
+ "unchanged", "changed", "obsolete"),
+ {"valueType": "number"}),
+ "types": {
+ "Build": {"pluralLabel": "Builds"}
+ }}
+ data['items'] = items
+ return dumps(data, indent=2)
def serialize(self, type="text/plain"):
+ if type=="application/json":
+ return self.toExhibit()
def tostr(t):
if t[1] == 'key':
return ' ' * t[0] + '/'.join(t[2])
@@ -279,6 +337,8 @@
indent = ' ' * (t[0] + 1)
if 'error' in t[2]:
o += [indent + 'ERROR: ' + e for e in t[2]['error']]
+ if 'warning' in t[2]:
+ o += [indent + 'WARNING: ' + e for e in t[2]['warning']]
if 'missingEntity' in t[2] or 'obsoleteEntity' in t[2]:
missingEntities = ('missingEntity' in t[2] and t[2]['missingEntity']) \
or []
@@ -314,6 +374,7 @@
class ContentComparer:
keyRE = re.compile('[kK]ey')
+ nl = re.compile('\n', re.M)
def __init__(self, filterObserver):
'''Create a ContentComparer.
filterObserver is usually a instance of Observer. The return values
@@ -331,7 +392,8 @@
self.observers.append(obs)
def set_merge_stage(self, merge_stage):
self.merge_stage = merge_stage
- def merge(self, ref_entities, ref_map, ref_file, l10n_file, missing, p):
+ def merge(self, ref_entities, ref_map, ref_file, l10n_file, missing, skips,
+ p):
outfile = os.path.join(self.merge_stage, l10n_file.module, l10n_file.file)
outdir = os.path.dirname(outfile)
if not os.path.isdir(outdir):
@@ -340,10 +402,22 @@
shutil.copyfile(ref_file.fullpath, outfile)
print "copied reference to " + outfile
return
- trailing = [ref_entities[ref_map[key]].all for key in missing]
- shutil.copyfile(l10n_file.fullpath, outfile)
+ trailing = (['\n'] +
+ [ref_entities[ref_map[key]].all for key in missing] +
+ [ref_entities[ref_map[skip.key]].all for skip in skips])
+ if skips:
+ # we need to skip a few errornous blocks in the input, copy by hand
+ f = codecs.open(outfile, 'wb', p.encoding)
+ offset = 0
+ for skip in skips:
+ chunk = skip.span
+ f.write(p.contents[offset:chunk[0]])
+ offset = chunk[1]
+ f.write(p.contents[offset:])
+ else:
+ shutil.copyfile(l10n_file.fullpath, outfile)
+ f = codecs.open(outfile, 'ab', p.encoding)
print "adding to " + outfile
- f = codecs.open(outfile, 'ab', p.encoding)
f.write(''.join(trailing))
f.close()
def notify(self, category, file, data):
@@ -363,6 +437,7 @@
def compare(self, ref_file, l10n):
try:
p = Parser.getParser(ref_file.file)
+ checks = Checks.getChecks(ref_file.file)
except UserWarning:
# no comparison, XXX report?
return
@@ -383,6 +458,17 @@
except Exception, e:
self.notify('error', l10n, str(e))
return
+ lines = []
+ def _getLine(offset):
+ if not lines:
+ lines.append(0)
+ for m in self.nl.finditer(p.contents):
+ lines.append(m.end())
+ _line = 1
+ for i in xrange(len(lines), 0, -1):
+ if offset >= lines[i-1]:
+ return (i, offset - lines[i-1])
+ return (1, offset)
l10n_list = l10n_map.keys()
l10n_list.sort()
ar = AddRemove()
@@ -390,6 +476,7 @@
ar.set_right(l10n_list)
report = missing = obsolete = changed = unchanged = keys = 0
missings = []
+ skips = []
for action, item_or_pair in ar:
if action == 'delete':
# missing entity
@@ -425,11 +512,31 @@
else:
self.doChanged(ref_file, refent, l10nent)
changed += 1
+ # run checks:
+ if checks:
+ for tp, pos, msg in checks(refent, l10nent):
+ # compute real src position, if first line, col needs adjustment
+ _l, _offset = _getLine(l10nent.val_span[0])
+ if isinstance(pos, tuple):
+ # line, column
+ if pos[0] == 1:
+ col = pos[1] + _offset
+ else:
+ col = pos[1]
+ _l += pos[0] - 1
+ else:
+ _l, col = _getLine(l10nent.val_span[0] + pos)
+ # skip error entities when merging
+ if tp == 'error' and self.merge_stage is not None:
+ skips.append(l10nent)
+ self.notify(tp, l10n,
+ "%s at line %d, column %d within %s" %
+ (msg, _l, col, refent.key))
pass
if missing:
self.notify('missing', l10n, missing)
- if self.merge_stage is not None and missings:
- self.merge(ref[0], ref[1], ref_file, l10n, missings, p)
+ if self.merge_stage is not None and (missings or skips):
+ self.merge(ref[0], ref[1], ref_file, l10n, missings, skips, p)
if report:
self.notify('report', l10n, report)
if obsolete:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/Parser.py new/compare-locales/lib/Mozilla/Parser.py
--- old/compare-locales/lib/Mozilla/Parser.py 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/lib/Mozilla/Parser.py 2010-11-06 13:43:49.000000000 +0100
@@ -182,8 +182,7 @@
m = self.reKey.match(contents, offset)
if m:
offset = m.end()
- entity = Entity(contents, self.postProcessValue,
- *[m.span(i) for i in xrange(7)])
+ entity = self.createEntity(contents, m)
return (entity, offset)
m = self.reKey.search(contents, offset)
if m:
@@ -192,6 +191,9 @@
junkend = m.start()
return (Junk(contents, (offset, junkend)), junkend)
return (None, offset)
+ def createEntity(self, contents, m):
+ return Entity(contents, self.postProcessValue,
+ *[m.span(i) for i in xrange(7)])
def getParser(path):
for item in __constructors:
@@ -215,30 +217,28 @@
class DTDParser(Parser):
- def __init__(self):
- # http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar
- #":" | [A-Z] | "_" | [a-z] |
- # [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF]
- # | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] |
- # [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
- # [#x10000-#xEFFFF]
- CharMinusDash = u'\x09\x0A\x0D\u0020-\u002C\u002E-\uD7FF\uE000-\uFFFD'
- XmlComment = '<!--(?:-?[%s])*?-->' % CharMinusDash
- NameStartChar = u':A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF' + \
- u'\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF'+\
- u'\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD'
- # + \U00010000-\U000EFFFF seems to be unsupported in python
-
- # NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 |
- # [#x0300-#x036F] | [#x203F-#x2040]
- NameChar = NameStartChar + ur'\-\.0-9' + u'\xB7\u0300-\u036F\u203F-\u2040'
- Name = '[' + NameStartChar + '][' + NameChar + ']*'
- self.reKey = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)(<!ENTITY\s+(' + Name + ')\s+(\"[^\"]*\"|\'[^\']*\')\s*>)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)')
- # add BOM to DTDs, details in bug 435002
- self.reHeader = re.compile(u'^\ufeff?(\s*<!--.*LICENSE BLOCK([^-]+-)*[^-]+-->)?')
- self.reFooter = re.compile('\s*(<!--([^-]+-)*[^-]+-->\s*)*$')
- self.rePE = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)(<!ENTITY\s+%\s+(' + Name + ')\s+SYSTEM\s+(\"[^\"]*\"|\'[^\']*\')\s*>\s*%' + Name + ';)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)')
- Parser.__init__(self)
+ # http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar
+ #":" | [A-Z] | "_" | [a-z] |
+ # [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF]
+ # | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] |
+ # [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
+ # [#x10000-#xEFFFF]
+ CharMinusDash = u'\x09\x0A\x0D\u0020-\u002C\u002E-\uD7FF\uE000-\uFFFD'
+ XmlComment = '<!--(?:-?[%s])*?-->' % CharMinusDash
+ NameStartChar = u':A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF' + \
+ u'\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF'+\
+ u'\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD'
+ # + \U00010000-\U000EFFFF seems to be unsupported in python
+
+ # NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 |
+ # [#x0300-#x036F] | [#x203F-#x2040]
+ NameChar = NameStartChar + ur'\-\.0-9' + u'\xB7\u0300-\u036F\u203F-\u2040'
+ Name = '[' + NameStartChar + '][' + NameChar + ']*'
+ reKey = re.compile('(?:(?P<pre>\s*)(?P<precomment>(?:' + XmlComment + '\s*)*)(?P<entity><!ENTITY\s+(?P<key>' + Name + ')\s+(?P<val>\"[^\"]*\"|\'[^\']*\'?)\s*>)(?P<post>[ \t]*(?:' + XmlComment + '\s*)*\n?)?)', re.DOTALL)
+ # add BOM to DTDs, details in bug 435002
+ reHeader = re.compile(u'^\ufeff?(\s*<!--.*LICENSE BLOCK([^-]+-)*[^-]+-->)?')
+ reFooter = re.compile('\s*(<!--([^-]+-)*[^-]+-->\s*)*$')
+ rePE = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)(<!ENTITY\s+%\s+(' + Name + ')\s+SYSTEM\s+(\"[^\"]*\"|\'[^\']*\')\s*>\s*%' + Name + ';)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)')
def getEntity(self, contents, offset):
'''
Overload Parser.getEntity to special-case ParsedEntities.
@@ -255,6 +255,13 @@
entity = Entity(contents, self.postProcessValue,
*[m.span(i) for i in xrange(7)])
return (entity, inneroffset)
+ def createEntity(self, contents, m):
+ valspan = m.span('val')
+ valspan = (valspan[0]+1, valspan[1]-1)
+ return Entity(contents, self.postProcessValue, m.span(),
+ m.span('pre'), m.span('precomment'),
+ m.span('entity'), m.span('key'), valspan,
+ m.span('post'))
class PropertiesParser(Parser):
def __init__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/Tests.py new/compare-locales/lib/Mozilla/Tests.py
--- old/compare-locales/lib/Mozilla/Tests.py 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/lib/Mozilla/Tests.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,394 +0,0 @@
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is l10n test automation.
-#
-# The Initial Developer of the Original Code is
-# Mozilla Foundation
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Axel Hecht <l10n(a)mozilla.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-import logging
-import Paths
-import Parser
-
-def getRegionProperties(loc):
- regprop = Paths.get_path('browser', loc,
- 'chrome/browser-region/region.properties')
- p = Parser.getParser(regprop)
- f = Paths.File(regprop, 'chrome/browser-region/region.properties')
- p.readContents(f.getContents())
- return p
-
-class Base:
- '''Base class for all tests'''
- def __init__(self):
- if not hasattr(self, 'leafName'):
- self.leafName = 'TODO'
- logging.warning(' ' + self + ' does not have leafName set, writing to TODO')
- def run(self):
- '''Run this test for all locales, returns a dictionary with results'''
- pass
- def serialize(self, result, saveHandler):
- '''Serialize the previously generated result, writes the dictionary
- by default'''
- return saveHandler(result, self.leafName)
- pass
- def failureTest(self, myResult, failureResult):
- pass
-
-import CompareLocales
-class CompareTest(Base):
- '''Test class to compare locales'''
- def __init__(self):
- '''Initializes the test object'''
- # nothing to be done here
- self.apps = ['browser', 'mail']
- pass
- def run(self):
- '''Runs CompareLocales.compareApp()'''
- app = Paths.EnumerateApp()
- for appname in self.apps:
- app.addApplication(appname)
- return CompareLocales.compareApp(app)
- def serialize(self, result, saveHandler):
- '''Serialize the CompareLocales result by locale into
- cmp-details-ab-CD
- and a compacted version into
- cmp-data
-
- '''
- #for locale, stats in result.details:
- # assert locale is not None
- # saveHandler(foo, 'cmp-details-%s.json' % locale)
- saveHandler(result.summary, 'cmp-data.json')
-
- def failureTest(self, myResult, failureResult):
- '''signal pass/warn/failure for each locale'''
- def sumdata(data, part):
- res = 0
- for mod in [u'browser', u'toolkit']:
- res += data[part][mod] + data[part + u'Files'][mod]
- return res
- def getState(data):
- ret = 0
- if sumdata(data, u'obsolete') > 0:
- ret |= 1
- if sumdata(data, u'missing') > 0:
- ret |= 2
- return ret
- for loc, val in myResult.iteritems():
- if not failureResult.has_key(loc):
- failureResult[loc] = getState(val)
- else:
- failureResult |= getState(val)
-
-from xml import sax
-from types import DictType, FunctionType
-import md5
-from codecs import utf_8_encode
-import re
-import os
-
-class SearchTest(Base):
- """Test class to collect information from search plugins and to
- verify that they're doing something good.
-
- """
- def __init__(self):
- '''Set up the test class with a good leaf name'''
- self.leafName = 'search-results.json'
- pass
- def run(self):
- '''Collect all data from the MozSearch plugins in both the /cvsroot
- repository for en-US and the /l10n repository for locales
-
- '''
- class DummyHandler(sax.handler.ContentHandler):
- def startDocument(self):
- self.md5 = md5.new()
- self.indent = ''
- self.engine = {'urls':[]}
- self.lNames = []
- self.textField = None
- self.content = ''
- return
- def endDocument(self):
- self.engine['md5'] = self.md5.hexdigest()
- return
- def startElementNS(self, (ns, local), qname, attrs):
- if self.textField:
- logging.warning('Found Element, but expected CDATA.')
- self.indent += ' '
- if ns != u'http://www.mozilla.org/2006/browser/search/':
- raise UserWarning, ('bad namespace: ' + ns)
- self.lNames.append(local)
- handler = self.getOpenHandler()
- if handler:
- handler(self, attrs)
- self.update(ns+local)
- for qna in attrs.getQNames():
- self.update(qna[0] + qna[1] + attrs.getValueByQName(qna))
- return
- def endElementNS(self, (ns, local), qname):
- if self.textField:
- self.engine[self.textField] = self.content
- self.textField = None
- self.content = ''
- self.lNames.pop()
- self.indent = self.indent[0:-2]
- def characters(self, content):
- self.update(content)
- if not self.textField:
- return
- self.content += content
- def update(self, content):
- self.md5.update(utf_8_encode(content)[0])
- def openURL(self, attrs):
- entry = {'params':{},
- 'type': attrs.getValueByQName(u'type'),
- 'template': attrs.getValueByQName(u'template')}
- self.engine['urls'].append(entry)
- def handleParam(self, attrs):
- try:
- self.engine['urls'][-1]['params'][attrs.getValueByQName(u'name')] = attrs.getValueByQName(u'value')
- except KeyError:
- raise UserWarning, 'bad param'
- return
- def handleMozParam(self, attrs):
- mp = None
- try:
- mp = { 'name': attrs.getValueByQName(u'name'),
- 'condition': attrs.getValueByQName(u'condition'),
- 'trueValue': attrs.getValueByQName(u'trueValue'),
- 'falseValue': attrs.getValueByQName(u'falseValue')}
- except KeyError:
- try:
- mp = {'name': attrs.getValueByQName(u'name'),
- 'condition': attrs.getValueByQName(u'condition'),
- 'pref': attrs.getValueByQName(u'pref')}
- except KeyError:
- raise UserWarning, 'bad mozParam'
- if self.engine['urls'][-1].has_key('MozParams'):
- self.engine['urls'][-1]['MozParams'].append(mp)
- else:
- self.engine['urls'][-1]['MozParams'] = [mp]
- return
- def handleShortName(self, attrs):
- self.textField = 'ShortName'
- return
- def handleImage(self, attrs):
- self.textField = 'Image'
- return
- def getOpenHandler(self):
- return self.getHandler(DummyHandler.openHandlers)
- def getHandler(self, handlers):
- for local in self.lNames:
- if type(handlers) != DictType or not handlers.has_key(local):
- return
- handlers = handlers[local]
- if handlers.has_key('_handler'):
- return handlers['_handler']
- return
- openHandlers = {'SearchPlugin':
- {'ShortName': {'_handler': handleShortName},
- 'Image': {'_handler': handleImage},
- 'Url':{'_handler': openURL,
- 'Param': {'_handler':handleParam},
- 'MozParam': {'_handler':handleMozParam}
- }
- }
- }
-
- handler = DummyHandler()
- parser = sax.make_parser()
- parser.setContentHandler(handler)
- parser.setFeature(sax.handler.feature_namespaces, True)
-
- locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')]
- locales.insert(0, 'en-US')
- sets = {}
- details = {}
-
- for loc in locales:
- l = logging.getLogger('locales.' + loc)
- try:
- lst = open(Paths.get_path('browser',loc,'searchplugins/list.txt'),'r')
- except IOError:
- l.error("Locale " + loc + " doesn't have search plugins")
- details[Paths.get_path('browser',loc,'searchplugins/list.txt')] = {
- 'error': 'not found'
- }
- continue
- sets[loc] = {'list': []}
- p = getRegionProperties(loc)
- orders = {}
- for entity in p:
- m = re.match('browser.search.order.([1-9])', entity.key)
- if m:
- orders[entity.val.strip()] = int(m.group(1))
- elif entity.key == 'browser.search.defaultenginename':
- sets[loc]['default'] = entity.val.strip()
- sets[loc]['orders'] = orders
- for fn in lst:
- name = fn.strip()
- if len(name) == 0:
- continue
- leaf = 'searchplugins/' + name + '.xml'
- _path = Paths.get_path('browser','en-US', leaf)
- if not os.access(_path, os.R_OK):
- _path = Paths.get_path('browser', loc, leaf)
- l.debug('testing ' + _path)
- sets[loc]['list'].append(_path)
- try:
- parser.parse(_path)
- except IOError:
- l.error("can't open " + _path)
- details[_path] = {'_name': name, 'error': 'not found'}
- continue
- except UserWarning, ex:
- l.error("error in searchplugin " + _path)
- details[_path] = {'_name': name, 'error': ex.args[0]}
- continue
- except sax._exceptions.SAXParseException, ex:
- l.error("error in searchplugin " + _path)
- details[_path] = {'_name': name, 'error': ex.args[0]}
- continue
- details[_path] = handler.engine
- details[_path]['_name'] = name
-
- engines = {'locales': sets,
- 'details': details}
- return engines
- def failureTest(self, myResult, failureResult):
- '''signal pass/warn/failure for each locale
- Just signaling errors in individual plugins for now.
-
- '''
- for loc, val in myResult['locales'].iteritems():
- l = logging.getLogger('locales.' + loc)
- # Verify that there are no errors in the engine parsing,
- # and that there default engine is the first one.
- if (not val['orders'].has_key(val['default'])) or val['orders'][val['default']] != 1:
- l.error('Default engine is not first in order in locale ' + loc)
- if not failureResult.has_key(loc):
- failureResult[loc] = 2
- else:
- failureResult[loc] |= 2
- for p in val['list']:
- # no logging, that is already reported above
- if myResult['details'][p].has_key('error'):
- if not failureResult.has_key(loc):
- failureResult[loc] = 2
- else:
- failureResult[loc] |= 2
-
-class RSSReaderTest(Base):
- """Test class to collect information about RSS readers and to
- verify that they might be working.
-
- """
- def __init__(self):
- '''Set up the test class with a good leaf name'''
- self.leafName = 'feed-reader-results.json'
- pass
- def run(self):
- '''Collect the data from browsers region.properties for all locales
-
- '''
- locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')]
- uri = re.compile('browser\\.contentHandlers\\.types\\.([0-5])\\.uri')
- title = re.compile('browser\\.contentHandlers\\.types\\.([0-5])\\.title')
- res = {}
- for loc in locales:
- l = logging.getLogger('locales.' + loc)
- p = getRegionProperties(loc)
- uris = {}
- titles = {}
- for entity in p:
- key = entity.key
- val = entity.val
- m = uri.match(key)
- if m:
- o = int(m.group(1))
- if uris.has_key(o):
- l.error('Double definition of RSS reader ' + o)
- uris[o] = val.strip()
- else:
- m = title.match(key)
- if m:
- o = int(m.group(1))
- if titles.has_key(o):
- l.error('Double definition of RSS reader ' + o)
- titles[o] = val.strip()
- ind = sorted(uris.keys())
- if ind != range(len(ind)) or ind != sorted(titles.keys()):
- l.error('RSS Readers are badly set up')
- res[loc] = [(titles[o], uris[o]) for o in ind]
- return res
-
-class BookmarksTest(Base):
- """Test class to collect information about bookmarks and check their
- structure.
-
- """
- def __init__(self):
- '''Set up the test class with a good leaf name'''
- self.leafName = 'bookmarks-results.json'
- pass
- def run(self):
- '''Collect the data from bookmarks.html for all locales
-
- '''
- locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')]
- bm = Parser.BookmarksParser()
- res = {}
- for loc in locales:
- try:
- bm.readFile('l10n/%s/browser/profile/bookmarks.html'%loc)
- res[loc] = bm.getDetails()
- except Exception, e:
- logging.getLogger('locale.%s'%loc).error('Bookmarks are busted, %s'%e)
- return res
- def failureTest(self, myResult, failureResult):
- '''signal pass/warn/failure for each locale
- Just signaling errors for now.
-
- '''
- locales = [loc.strip() for loc in open('mozilla/browser/locales/all-locales')]
- bm = Parser.BookmarksParser()
- bm.read('mozilla/browser/locales/en-US/profile/bookmarks.html')
- enUSDetails = bm.getDetails()
- for loc in locales:
- if not myResult.has_key(loc):
- if not failureResult.has_key(loc):
- failureResult[loc] = 2
- else:
- failureResult[loc] |= 2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/__init__.py new/compare-locales/lib/Mozilla/__init__.py
--- old/compare-locales/lib/Mozilla/__init__.py 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/lib/Mozilla/__init__.py 2010-11-06 13:43:49.000000000 +0100
@@ -1 +1 @@
-version="0.9pre"
+version="0.9"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/tests/unitChecks.py new/compare-locales/lib/Mozilla/tests/unitChecks.py
--- old/compare-locales/lib/Mozilla/tests/unitChecks.py 1970-01-01 01:00:00.000000000 +0100
+++ new/compare-locales/lib/Mozilla/tests/unitChecks.py 2010-11-06 13:43:49.000000000 +0100
@@ -0,0 +1,77 @@
+import unittest
+
+from Mozilla.Checks import getChecks
+from Mozilla.Parser import getParser
+
+
+class BaseHelper(unittest.TestCase):
+ filename = None
+ refContent = None
+
+ def setUp(self):
+ p = getParser(self.filename)
+ p.readContents(self.refContent)
+ self.refs = [e for e in p]
+
+ def _test(self, content, refWarnOrErrors):
+ p = getParser(self.filename)
+ p.readContents(content)
+ l10n = [e for e in p]
+ checks = getChecks(self.filename)
+ found = tuple(checks(self.refs[0], l10n[0]))
+ self.assertEqual(found, refWarnOrErrors)
+
+
+class TestPlurals(BaseHelper):
+ filename = 'foo.properties'
+ refContent = '''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of files
+# example: 111 files - Downloads
+downloadsTitleFiles=#1 file - Downloads;#1 files - #2
+'''
+
+ def testGood(self):
+ self._test('''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of files
+# example: 111 files - Downloads
+downloadsTitleFiles=#1 file - Downloads;#1 files - #2;#1 filers
+''',
+ tuple())
+
+ def testNotUsed(self):
+ self._test('''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of files
+# example: 111 files - Downloads
+downloadsTitleFiles=#1 file - Downloads;#1 files - Downloads;#1 filers
+''',
+ (('warning', 0, 'not all variables used in l10n'),))
+
+ def testNotDefined(self):
+ self._test('''# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of files
+# example: 111 files - Downloads
+downloadsTitleFiles=#1 file - Downloads;#1 files - #2;#1 #3
+''',
+ (('error', 0, 'unreplaced variables in l10n'),))
+
+
+class TestDTDs(BaseHelper):
+ filename = 'foo.dtd'
+ refContent = '''<!ENTITY foo "This is 'good'">
+'''
+ def testWarning(self):
+ self._test('''<!ENTITY foo "This is ¬ good">
+''',
+ (('warning',(0,0),'Referencing unknown entity `not`'),))
+ def testXMLEntity(self):
+ self._test('''<!ENTITY foo "This is "good"">
+''',
+ tuple())
+
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/tests/unitDTD.py new/compare-locales/lib/Mozilla/tests/unitDTD.py
--- old/compare-locales/lib/Mozilla/tests/unitDTD.py 1970-01-01 01:00:00.000000000 +0100
+++ new/compare-locales/lib/Mozilla/tests/unitDTD.py 2010-11-06 13:43:49.000000000 +0100
@@ -0,0 +1,52 @@
+import unittest
+import re
+
+from Mozilla.Parser import getParser, Junk
+
+class TestDTD(unittest.TestCase):
+
+ def testGood(self):
+ self._test('''<!ENTITY foo.label "stuff">''',
+ (('foo.label','stuff'),))
+
+
+ quoteContent = '''<!ENTITY good.one "one">
+<!ENTITY bad.one "bad " quote">
+<!ENTITY good.two "two">
+<!ENTITY bad.two "bad "quoted" word">
+<!ENTITY good.three "three">
+<!ENTITY good.four "good ' quote">
+<!ENTITY good.five "good 'quoted' word">
+'''
+ quoteRef = (
+ ('good.one', 'one'),
+ ('_junk_1_25-56', '<!ENTITY bad.one "bad " quote">'),
+ ('good.two', 'two'),
+ ('_junk_2_82-119', '<!ENTITY bad.two "bad "quoted" word">'),
+ ('good.three', 'three'),
+ ('good.four', 'good \' quote'),
+ ('good.five', 'good \'quoted\' word'),
+ )
+ def testQuote(self):
+ self._test(self.quoteContent, self.quoteRef)
+
+ def testApos(self):
+ qr = re.compile('[\'"]', re.M)
+ def quot2apos(s):
+ return qr.sub(lambda m: m.group(0)=='"' and "'" or '"', s)
+
+ self._test(quot2apos(self.quoteContent),
+ map(lambda t: (t[0], quot2apos(t[1])), self.quoteRef))
+
+ def _test(self, content, refs):
+ p = getParser('foo.dtd')
+ Junk.junkid = 0
+ p.readContents(content)
+ entities = [e for e in p]
+ self.assertEqual(len(entities), len(refs))
+ for e, ref in zip(entities, refs):
+ self.assertEqual(e.val, ref[1])
+ self.assertEqual(e.key, ref[0])
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/lib/Mozilla/tests/unitProperties.py new/compare-locales/lib/Mozilla/tests/unitProperties.py
--- old/compare-locales/lib/Mozilla/tests/unitProperties.py 1970-01-01 01:00:00.000000000 +0100
+++ new/compare-locales/lib/Mozilla/tests/unitProperties.py 2010-11-06 13:43:49.000000000 +0100
@@ -0,0 +1,34 @@
+import unittest
+
+from Mozilla.Parser import getParser
+
+class TestLineWraps(unittest.TestCase):
+
+ def setUp(self):
+ self.p = getParser('foo.properties')
+
+ def tearDown(self):
+ del self.p
+
+ def testBackslashes(self):
+ self.p.readContents(r'''one_line = This is one line
+two_line = This is the first \
+of two lines
+one_line_trailing = This line ends in \\
+and has junk
+two_lines_triple = This line is one of two and ends in \\\
+and still has another line coming
+''')
+ ref = ['This is one line',
+ u'This is the first \\\nof two lines',
+ r'This line ends in \\']
+ i = iter(self.p)
+ for r, e in zip(ref, i):
+ self.assertEqual(e.val, r)
+ e = i.next()
+ self.assertEqual(e.key, '_junk_1_113-126')
+ for r, e in zip(('This line is one of two and ends in \\\\\\\nand still has another line coming',), i):
+ self.assertEqual(e.val, r)
+
+if __name__ == '__main__':
+ unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/scripts/compare-locales new/compare-locales/scripts/compare-locales
--- old/compare-locales/scripts/compare-locales 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/scripts/compare-locales 2010-11-06 13:43:49.000000000 +0100
@@ -57,6 +57,8 @@
'localization. [default: en-US]')
parser.add_option('-m', '--merge',
help='Use this directory to stage merged files')
+parser.add_option('--json', action='store_true', dest='json',
+ help='Dump just summary as exhibit JSON')
(options, args) = parser.parse_args()
if len(args) < 3:
@@ -72,7 +74,10 @@
app.reference = options.reference
o = compareApp(app, merge_stage = options.merge)
-print codecs.utf_8_encode(o.serialize())[0]
+so = {}
+if options.json:
+ so['type']='application/json'
+print codecs.utf_8_encode(o.serialize(**so))[0]
if not options.merge:
# if not merging, error on really missing strings
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/scripts/test-locales new/compare-locales/scripts/test-locales
--- old/compare-locales/scripts/test-locales 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/scripts/test-locales 1970-01-01 01:00:00.000000000 +0100
@@ -1,245 +0,0 @@
-#! python
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is l10n test automation.
-#
-# The Initial Developer of the Original Code is
-# Mozilla Foundation
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Axel Hecht <l10n(a)mozilla.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-
-import logging
-import sys
-import os
-import os.path
-from datetime import datetime
-import time
-from optparse import OptionParser
-import gzip
-import codecs
-
-from Mozilla import Parser, CompareLocales, Paths, Tests
-import simplejson
-
-#
-# Helper classes
-#
-
-#
-# Logging
-#
-class LogHandler(logging.Handler):
- def __init__(self):
- self.log = []
- logging.Handler.__init__(self)
- def emit(self, record):
- self.log.append((record.name, record.levelname, record.getMessage().strip()))
-
-#
-# JSON with optional gzip
-#
-class Wrapper:
- def __init__(self, path, name):
- self.p = os.path.join(path, name)
- self.n = name
- self.f = None
- if opts.gzip:
- self.p += '.gz'
- def open(self, mode):
- if self.f:
- self.f.close()
- if opts.gzip:
- mode += 'b'
- self.f = open(self.p, mode)
- if opts.gzip:
- self.f = gzip.GzipFile(fileobj = self.f, filename = self.n)
- self.w = codecs.getwriter('utf-8')(self.f)
- self.r = codecs.getreader('utf-8')(self.f)
- def write(self, str):
- self.w.write(str)
- def read(self, size = -1):
- return self.r.read(size)
- def rewind(self):
- if opts.gzip:
- self.f.rewind()
- else:
- self.f.seek(0,0)
- def close(self):
- if opts.gzip:
- f = self.f.fileobj;
- self.f.close()
- if opts.gzip:
- f.close()
- self.w = self.r = self.f = None
-#
-# Helper function for JSON output with optional gzip
-#
-def saveJSON(dic, localName):
- name = os.path.join(basePath, localName) ;
- if opts.gzip:
- f = open(name + '.gz', 'wb')
- s = gzip.GzipFile(fileobj = f, filename = localName)
- else:
- f = open(name, 'w')
- s = f
- sw = codecs.getwriter('utf-8')(s)
- sw.write(simplejson.dumps(dic, sort_keys=True))
- sw.reset()
- if opts.gzip:
- s.close()
- f.close()
-
-
-lvl = logging.WARNING
-date = datetime.utcnow().replace(second=0,microsecond=0).isoformat(' ')
-# parse commandline arguments
-cp = OptionParser(version='0.2')
-cp.add_option('-v', '--verbose', action='count', dest='v', default=0,
- help='Make more noise')
-cp.add_option('-q', '--quiet', action='count', dest='q', default=0,
- help='Make less noise')
-cp.add_option('-O', '--base-dir', type='string', dest='target',
- default='results',
- help='Destination base directory')
-cp.add_option('-c', '--checkout', action='store_true', dest='checkout',
- default=False,
- help='Run make -f client.mk l10n-checkout [Default: not]')
-cp.add_option('-d', '--date', type='string', dest='date',
- help='Explicit start date or subdir [Default: now]')
-cp.add_option('-z',action="store_true", dest="gzip", default=False,
- help='Use gzip compression for output')
-cp.add_option('-w','--enable-waterfall', action="store_true",
- dest="waterfall", default=False,
- help='Update waterfall data')
-cp.add_option('--end-date', type='string', dest='enddate',
- help='Explicit (faked) end date')
-opts, optlist = cp.parse_args(sys.argv[1:])
-
-#
-# Set up Logging
-#
-logging.basicConfig(level=(logging.WARNING + 10*(opts.q - opts.v)))
-# Add a handler to store the output
-h = LogHandler()
-logging.getLogger('').addHandler(h)
-
-#
-# Check that we're in the right location and check out if requested
-#
-try:
- os.chdir('mozilla')
- if opts.checkout:
- env = ''
- l = logging.getLogger('cvsco')
- if opts.date:
- env = 'MOZ_CO_DATE="' + opts.date + ' +0" '
- fh = os.popen(env + 'make -f client.mk l10n-checkout')
- for ln in fh:
- l.info(ln.strip())
- if fh.close():
- raise Exception('cvs checkout failed')
- os.chdir('..')
-except Exception,e:
- sys.exit(str(e))
-
-if not opts.date:
- opts.date = date # use default set above
-
-logging.debug(' Ensure output directory')
-# replace : with -
-opts.date = opts.date.replace(':','-')
-if not os.path.isdir(opts.target):
- sys.exit('error: ' + opts.target + ' is not a directory')
-if opts.waterfall:
- startdate = time.mktime(time.strptime(opts.date, '%Y-%m-%d %H-%M-%S')) + time.altzone
-basePath = os.path.join(opts.target, opts.date)
-if not os.path.isdir(basePath):
- os.mkdir(basePath)
-
-
-tests = [Tests.CompareTest(),
- Tests.SearchTest(),
- Tests.RSSReaderTest()]
-# disable bookmarks test, that's hard to fix. XXX
-# Tests.BookmarksTest()]
-drop = {}
-for test in tests:
- res = test.run()
- test.serialize(res, saveJSON)
- if opts.waterfall:
- test.failureTest(res, drop)
-
-if not opts.waterfall:
- saveJSON(h.log, 'buildlog.json')
- sys.exit()
-
-
-if opts.enddate:
- endtime = time.mktime(time.strptime(opts.enddate, '%Y-%m-%d %H:%M:%S')) + time.altzone
-else:
- endtime = time.mktime(datetime.now().timetuple())
-f = None
-w = Wrapper(opts.target, 'waterfall.json')
-if os.path.isfile(w.p):
- w.open('r')
- water = simplejson.load(w)
-else:
- water = []
-
-water.append((opts.date, (startdate, endtime), drop))
-#
-# Check if we need to rotate the waterfall
-#
-rotateLen = 24
-if len(water) > rotateLen * 1.5:
- # rotate, maximum of 16 logs
- suffix = ''
- if opts.gzip:
- suffix = '.gz'
- fnames = [os.path.join(opts.target, 'waterfall-%x.json'%i) + suffix for i in range(16)]
- # remove oldest log
- if os.path.isfile(fnames[15]):
- os.remove(fnames[15])
- for l in range(14, -1, -1):
- if os.path.isfile(fnames[l]):
- os.rename(fnames[l], fnames[l+1])
- w0 = Wrapper('.', fnames[0])
- w0.open('w')
- simplejson.dump(water[:rotateLen], w0, sort_keys=True)
- w0.close()
- water = water[rotateLen:]
-
-w.open('w')
-simplejson.dump(water, w, sort_keys=True)
-w.close()
-
-saveJSON(h.log, 'buildlog.json')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/setup.py new/compare-locales/setup.py
--- old/compare-locales/setup.py 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/setup.py 2010-11-06 13:43:49.000000000 +0100
@@ -5,7 +5,7 @@
of the format, the Mozilla architecture does not provide fallback strings
at runtime. This library and the calling scripts provide a way to check
a given localization for completeness. For more information see
-http://developer.mozilla.org/en/docs/Compare-locales
+https://developer.mozilla.org/en/docs/Compare-locales
"""
docstrings = __doc__.split("\n")
@@ -41,7 +41,6 @@
description=docstrings[0],
long_description="\n".join(docstrings[2:]),
license="MPL 1.1/GPL 2.0/LGPL 2.1",
- url="http://developer.mozilla.org/en/docs/Compare-locales",
classifiers=filter(None, classifiers.split("\n")),
platforms=["any"],
scripts=['scripts/compare-locales',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compare-locales/tests/unitProperties.py new/compare-locales/tests/unitProperties.py
--- old/compare-locales/tests/unitProperties.py 2010-09-01 21:36:44.000000000 +0200
+++ new/compare-locales/tests/unitProperties.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,26 +0,0 @@
-import unittest
-
-from Mozilla.Parser import getParser
-
-class TestLineWraps(unittest.TestCase):
-
- def setUp(self):
- self.p = getParser('foo.properties')
-
- def tearDown(self):
- self.p = None
-
- def testBackslashes(self):
- self.p.readContents(r'''one_line = This is one line
-two_line = This is the first \
-of two lines
-one_line_trailing = This line ends in \\
-and has junk
-two_lines_triple = This line is one of two and ends in \\\
-and still has another line coming
-''')
- for e in self.p:
- print '"%s" => %s \n\n' % (e.key, e.val)
-
-if __name__ == '__main__':
- unittest.main()
++++++ create-tar.sh ++++++
--- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100
+++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100
@@ -1,7 +1,7 @@
#!/bin/bash
BRANCH="mozilla-central"
-RELEASE_TAG="FIREFOX_4_0b5_RELEASE"
+RELEASE_TAG="FIREFOX_4_0b7_RELEASE"
VERSION="2.0b"
# mozilla
++++++ l10n-2.0b.tar.bz2 ++++++
mozilla-xulrunner20/l10n-2.0b.tar.bz2 mozilla-xulrunner20/l10n-2.0b.tar.bz2 differ: char 11, line 1
++++++ mozilla-buildsymbols.patch ++++++
--- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100
+++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100
@@ -1,12 +1,12 @@
# HG changeset patch
# User Wolfgang Rosenauer <wr(a)rosenauer.org>
-# Parent 6637fa42939971816b5b0163e44cbdc0f7290066
+# Parent 7351fc8754c200b787fd701e7efa5fd2fc5864ff
Bug 588129 - symbols.txt file missing from *.crashreporter-symbols.zip
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
-@@ -186,17 +186,18 @@ ifdef MOZ_CRASHREPORTER
+@@ -183,17 +183,20 @@ ifdef MOZ_CRASHREPORTER
$(DIST)/crashreporter-symbols \
$(MAKE_SYM_STORE_PATH) > \
$(DIST)/crashreporter-symbols/$(SYMBOL_INDEX_NAME)
@@ -16,8 +16,10 @@
zip -r9D "../$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip" .
cd $(DIST)/crashreporter-symbols && \
- zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym"
-+ zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" \
-+ zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.txt"
++ grep "sym" $(SYMBOL_INDEX_NAME) > $(SYMBOL_INDEX_NAME).tmp && \
++ mv $(SYMBOL_INDEX_NAME).tmp $(SYMBOL_INDEX_NAME)
++ cd $(DIST)/crashreporter-symbols && \
++ zip -r9D "../$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip" . -i "*.sym" -i "*.txt"
else
ifdef WINCE
ifdef SYMBOLSTORE_PATH
++++++ mozilla-kde.patch ++++++
--- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100
+++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100
@@ -21,9 +21,9 @@
diff --git a/modules/libpref/src/nsPrefService.cpp b/modules/libpref/src/nsPrefService.cpp
--- a/modules/libpref/src/nsPrefService.cpp
+++ b/modules/libpref/src/nsPrefService.cpp
-@@ -51,16 +51,17 @@
- #include "nsILocalFile.h"
- #include "nsIObserverService.h"
+@@ -55,16 +55,17 @@
+ #include "nsIStringEnumerator.h"
+ #include "nsIZipReader.h"
#include "nsPrefBranch.h"
#include "nsXPIDLString.h"
#include "nsCRT.h"
@@ -39,7 +39,57 @@
#include "prefapi.h"
#include "prefread.h"
#include "prefapi_private_data.h"
-@@ -718,28 +719,40 @@ static nsresult pref_InitDefaults()
+@@ -760,30 +761,48 @@ pref_LoadPrefsInDir(nsIFile* aDir, char
+ }
+
+ static nsresult pref_LoadPrefsInDirList(const char *listId)
+ {
+ nsresult rv;
+ nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
+ if (NS_FAILED(rv)) return rv;
+
++ // make sure we load these special files after all the others
++ static const char* specialFiles[] = {
++#if defined(XP_UNIX)
++ ""
++#endif
++ };
++
++ if (nsKDEUtils::kdeSession()) {
++ for(int i = 0;
++ i < NS_ARRAY_LENGTH(specialFiles);
++ ++i ) {
++ if (*specialFiles[ i ] == '\0') {
++ specialFiles[ i ] = "kde.js";
++ break;
++ }
++ }
++ }
++
+ nsCOMPtr<nsISimpleEnumerator> dirList;
+ dirSvc->Get(listId,
+ NS_GET_IID(nsISimpleEnumerator),
+ getter_AddRefs(dirList));
+ if (dirList) {
+ PRBool hasMore;
+ while (NS_SUCCEEDED(dirList->HasMoreElements(&hasMore)) && hasMore) {
+ nsCOMPtr<nsISupports> elem;
+ dirList->GetNext(getter_AddRefs(elem));
+ if (elem) {
+ nsCOMPtr<nsIFile> dir = do_QueryInterface(elem);
+ if (dir) {
+ // Do we care if a file provided by this process fails to load?
+- pref_LoadPrefsInDir(dir, nsnull, 0);
++ pref_LoadPrefsInDir(dir, specialFiles, NS_ARRAY_LENGTH(specialFiles));
+ }
+ }
+ }
+ }
+ return NS_OK;
+ }
+
+ //----------------------------------------------------------------------------------------
+@@ -814,28 +833,40 @@ static nsresult pref_InitDefaults()
/* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */
static const char* specialFiles[] = {
#if defined(XP_MAC) || defined(XP_MACOSX)
@@ -117,7 +167,7 @@
#define DOWNLOAD_MANAGER_ALERT_ICON "chrome://mozapps/skin/downloads/downloadIcon.png"
#define PREF_BDM_SHOWALERTONCOMPLETE "browser.download.manager.showAlertOnComplete"
#define PREF_BDM_SHOWALERTINTERVAL "browser.download.manager.showAlertInterval"
-@@ -2188,16 +2192,25 @@ nsDownload::SetState(DownloadState aStat
+@@ -2192,16 +2196,25 @@ nsDownload::SetState(DownloadState aStat
nsCOMPtr<nsIPrefBranch> pref(do_GetService(NS_PREFSERVICE_CONTRACTID));
// Master pref to control this function.
@@ -143,7 +193,7 @@
PRInt64 goat = PR_Now() - mStartTime;
showTaskbarAlert = goat > alertIntervalUSec;
-@@ -2223,16 +2236,17 @@ nsDownload::SetState(DownloadState aStat
+@@ -2227,16 +2240,17 @@ nsDownload::SetState(DownloadState aStat
// because if it is, they'll click open the download manager and
// the items they downloaded will have been removed.
alerts->ShowAlertNotification(
@@ -484,7 +534,7 @@
+ case "cancel":
+ button.setAttribute("icon","cancel");
+ break;
-+ case "disclosue":
++ case "disclosure":
+ button.setAttribute("icon","properties");
+ break;
+ case "help":
@@ -2088,7 +2138,7 @@
diff --git a/toolkit/xre/Makefile.in b/toolkit/xre/Makefile.in
--- a/toolkit/xre/Makefile.in
+++ b/toolkit/xre/Makefile.in
-@@ -95,17 +95,18 @@ CMMSRCS = nsNativeAppSupportCocoa.mm
+@@ -97,17 +97,18 @@ CMMSRCS = nsNativeAppSupportCocoa.mm
else
ifeq ($(MOZ_WIDGET_TOOLKIT),os2)
CPPSRCS += nsNativeAppSupportOS2.cpp
@@ -2550,9 +2600,9 @@
ifeq ($(MOZ_WIDGET_TOOLKIT),android)
OSHELPER += nsMIMEInfoAndroid.cpp
OSHELPER += nsAndroidHandlerApp.cpp
+ OSHELPER += nsExternalSharingAppService.cpp
+ EXPORTS += nsExternalSharingAppService.h
endif
-
- ifeq ($(MOZ_WIDGET_TOOLKIT),qt)
diff --git a/uriloader/exthandler/unix/nsCommonRegistry.cpp b/uriloader/exthandler/unix/nsCommonRegistry.cpp
new file mode 100644
--- /dev/null
@@ -3104,7 +3154,7 @@
diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in
--- a/widget/src/gtk2/Makefile.in
+++ b/widget/src/gtk2/Makefile.in
-@@ -155,11 +155,14 @@ endif
+@@ -157,11 +157,14 @@ endif
DEFINES += -DCAIRO_GFX
@@ -3458,7 +3508,7 @@
diff --git a/xpcom/components/Makefile.in b/xpcom/components/Makefile.in
--- a/xpcom/components/Makefile.in
+++ b/xpcom/components/Makefile.in
-@@ -98,10 +98,11 @@ FORCE_STATIC_LIB = 1
+@@ -94,10 +94,11 @@ FORCE_STATIC_LIB = 1
# Force use of PIC
FORCE_USE_PIC = 1
@@ -3597,7 +3647,7 @@
diff --git a/xpcom/io/Makefile.in b/xpcom/io/Makefile.in
--- a/xpcom/io/Makefile.in
+++ b/xpcom/io/Makefile.in
-@@ -191,17 +191,17 @@ include $(topsrcdir)/config/rules.mk
+@@ -192,17 +192,17 @@ include $(topsrcdir)/ipc/chromium/chromi
DEFINES += -D_IMPL_NS_COM
ifeq ($(OS_ARCH),Linux)
@@ -3606,8 +3656,8 @@
endif
endif
--LOCAL_INCLUDES = -I..
-+LOCAL_INCLUDES = -I.. -I$(topsrcdir)/toolkit/xre
+-LOCAL_INCLUDES += -I..
++LOCAL_INCLUDES += -I.. -I$(topsrcdir)/toolkit/xre
ifeq ($(MOZ_PLATFORM_MAEMO),5)
CFLAGS += $(MOZ_DBUS_CFLAGS)
++++++ mozilla-language.patch ++++++
# HG changeset patch
# User Wolfgang Rosenauer <wr(a)rosenauer.org>
# Parent 4a8194d5971401441da4f4f3bbd2730e506da4bc
Bug 583793 - Firefox interface language set to LANG, ignores LANGUAGE
diff --git a/intl/locale/src/nsLocaleService.cpp b/intl/locale/src/nsLocaleService.cpp
--- a/intl/locale/src/nsLocaleService.cpp
+++ b/intl/locale/src/nsLocaleService.cpp
@@ -192,22 +192,24 @@ nsLocaleService::nsLocaleService(void)
return;
}
#ifdef MOZ_ENABLE_MEEGOTOUCH
// Create a snapshot of the gconf locale values into the
// corresponding environment variables to obey system settings
// as accurately as possible.
CopyGConfToEnv("/meegotouch/i18n/language", "LANG");
+ CopyGConfToEnv("/meegotouch/i18n/language", "LANGUAGE");
CopyGConfToEnv("/meegotouch/i18n/lc_collate", NSILOCALE_COLLATE);
CopyGConfToEnv("/meegotouch/i18n/lc_monetary", NSILOCALE_MONETARY);
CopyGConfToEnv("/meegotouch/i18n/lc_numeric", NSILOCALE_NUMERIC);
CopyGConfToEnv("/meegotouch/i18n/lc_time", NSILOCALE_TIME);
#endif
// Get system configuration
+ const char* language = getenv("LANGUAGE");
const char* lang = getenv("LANG");
for( i = 0; i < LocaleListLength; i++ ) {
nsresult result;
// setlocale( , "") evaluates LC_* and LANG
char* lc_temp = setlocale(posix_locale_category[i], "");
CopyASCIItoUTF16(LocaleList[i], category);
category_platform = category;
category_platform.AppendLiteral("##PLATFORM");
@@ -222,16 +224,21 @@ nsLocaleService::nsLocaleService(void)
else {
CopyASCIItoUTF16(lang, platformLocale);
result = posixConverter->GetXPLocale(lang, xpLocale);
}
}
if (NS_FAILED(result)) {
return;
}
+ // LANGUAGE is overriding LC_MESSAGES
+ if (i == LC_MESSAGES && language && *language) {
+ CopyASCIItoUTF16(language, platformLocale);
+ result = posixConverter->GetXPLocale(language, xpLocale);
+ }
resultLocale->AddCategory(category, xpLocale);
resultLocale->AddCategory(category_platform, platformLocale);
}
mSystemLocale = do_QueryInterface(resultLocale);
mApplicationLocale = do_QueryInterface(resultLocale);
} // if ( NS_SUCCEEDED )...
#endif // XP_UNIX || XP_BEOS
++++++ mozilla-pkgconfig.patch ++++++
--- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100
+++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100
@@ -14,7 +14,7 @@
include $(topsrcdir)/toolkit/mozapps/installer/packager.mk
+# the apilibdir always ends with 1.9 as every patch update will provide a link
-+apilibdir = $(dir $(installdir))xulrunner-1.9.2
++apilibdir = $(dir $(installdir))xulrunner-2.0
+
$(MOZILLA_VERSION).system.conf: $(topsrcdir)/config/milestone.txt Makefile
printf "[%s]\nGRE_PATH=%s\nxulrunner=true\nabi=%s" \
@@ -24,7 +24,7 @@
# to register xulrunner per-user, override this with $HOME/.gre.d
regdir = /etc/gre.d
-@@ -109,16 +112,17 @@ pkg_config_files += mozilla-nss.pc
+@@ -116,16 +119,17 @@ pkg_config_files += mozilla-nss.pc
endif
%.pc: $(srcdir)/%.pc.in $(GLOBAL_DEPS)
@@ -40,8 +40,8 @@
-e "s|%FULL_NSPR_LIBS%|$(FULL_NSPR_LIBS)|" \
-e "s|%FULL_NSPR_CFLAGS%|$(FULL_NSPR_CFLAGS)|" \
-e "s|%NSPR_NAME%|$(NSPR_NAME)|" \
- -e "s|%NSPR_VERSION%|$(NSPR_VERSION)|" > $@
- chmod 644 $@
+ -e "s|%NSPR_VERSION%|$(NSPR_VERSION)|" \
+ -e "s|%MOZ_XUL_LINK%|$(MOZ_XUL_LINK)|" \
diff --git a/xulrunner/installer/libxul-embedding.pc.in b/xulrunner/installer/libxul-embedding.pc.in
--- a/xulrunner/installer/libxul-embedding.pc.in
+++ b/xulrunner/installer/libxul-embedding.pc.in
@@ -72,7 +72,7 @@
Description: The Mozilla Runtime and Embedding Engine
Version: %MOZILLA_VERSION%
Requires: %NSPR_NAME% >= %NSPR_VERSION%
- Libs: -L${sdkdir}/lib -lxpcomglue_s -lxul -lxpcom
+ Libs: -L${sdkdir}/lib %MOZ_XUL_LINK%
diff --git a/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in b/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in
--- a/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in
+++ b/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in
@@ -112,6 +112,6 @@
Description: The Mozilla JavaScript Library
Version: %MOZILLA_VERSION%
Requires: %NSPR_NAME% >= %NSPR_VERSION%
--Libs: -L${sdkdir}/lib -lmozjs
-+Libs: -Wl,-rpath,${libdir} -L${sdkdir}/lib -lmozjs
+-Libs: -L${sdkdir}/lib %MOZ_JS_LINK%
++Libs: -Wl,-rpath,${libdir} -L${sdkdir}/lib %MOZ_JS_LINK%
Cflags: -I${includedir} -DXP_UNIX -DJS_THREADSAFE
++++++ mozilla-shared-nss-db.patch ++++++
--- /var/tmp/diff_new_pack.sFlihs/_old 2010-11-10 20:42:09.000000000 +0100
+++ /var/tmp/diff_new_pack.sFlihs/_new 2010-11-10 20:42:09.000000000 +0100
@@ -7,7 +7,7 @@
diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in
--- a/config/autoconf.mk.in
+++ b/config/autoconf.mk.in
-@@ -560,16 +560,20 @@ MOZ_ALSA_LIBS = @MOZ_ALSA_LIBS
+@@ -571,16 +571,20 @@ MOZ_ALSA_LIBS = @MOZ_ALSA_LIBS
GLIB_CFLAGS = @GLIB_CFLAGS@
GLIB_LIBS = @GLIB_LIBS@
@@ -22,16 +22,16 @@
+
MOZ_NATIVE_MAKEDEPEND = @SYSTEM_MAKEDEPEND@
+ export CL_INCLUDES_PREFIX = @CL_INCLUDES_PREFIX@
+
MOZ_AUTO_DEPS = @MOZ_AUTO_DEPS@
COMPILER_DEPEND = @COMPILER_DEPEND@
MDDEPDIR := @MDDEPDIR@
CC_WRAPPER = @CC_WRAPPER@
- CXX_WRAPPER = @CXX_WRAPPER@
-
diff --git a/configure.in b/configure.in
--- a/configure.in
+++ b/configure.in
-@@ -8452,16 +8452,31 @@ AC_SUBST(QCMS_LIBS)
+@@ -8610,16 +8610,31 @@ AC_SUBST(QCMS_LIBS)
dnl ========================================================
dnl HarfBuzz
@@ -43,7 +43,7 @@
+dnl Check for nss-shared-helper
+dnl ========================================================
+
-+ PKG_CHECK_MODULES(NSSHELPER, nss-shared-helper,
++ PKG_CHECK_MODULES(NSSHELPER, nss-shared-helper,
+ [MOZ_ENABLE_NSSHELPER=1],
+ [MOZ_ENABLE_NSSHELPER=])
+
@@ -55,18 +55,18 @@
+AC_SUBST(NSSHELPER_LIBS)
+
+dnl ========================================================
+ dnl OTS
+ dnl ========================================================
+ MOZ_OTS_LIBS='$(DEPTH)/gfx/ots/src/$(LIB_PREFIX)mozots.$(LIB_SUFFIX)'
+ AC_SUBST(MOZ_OTS_LIBS)
+
+ dnl ========================================================
dnl disable xul
dnl ========================================================
- MOZ_ARG_DISABLE_BOOL(xul,
- [ --disable-xul Disable XUL],
- MOZ_XUL= )
- if test "$MOZ_XUL"; then
- AC_DEFINE(MOZ_XUL)
- else
diff --git a/security/manager/ssl/src/Makefile.in b/security/manager/ssl/src/Makefile.in
--- a/security/manager/ssl/src/Makefile.in
+++ b/security/manager/ssl/src/Makefile.in
-@@ -112,19 +112,20 @@ CSRCS += md4.c
+@@ -117,19 +117,20 @@ CSRCS += md4.c
EXTRA_DEPS = $(NSS_DEP_LIBS)
@@ -115,7 +115,7 @@
#include "nsNetUtil.h"
#include "nsAppDirectoryServiceDefs.h"
-@@ -1647,18 +1654,34 @@ nsNSSComponent::InitializeNSS(PRBool sho
+@@ -1658,18 +1665,34 @@ nsNSSComponent::InitializeNSS(PRBool sho
ConfigureInternalPKCS11Token();
// The NSS_INIT_NOROOTINIT flag turns off the loading of the root certs
++++++ xulrunner-source-2.0b.tar.bz2 ++++++
mozilla-xulrunner20/xulrunner-source-2.0b.tar.bz2 mozilla-xulrunner20/xulrunner-source-2.0b.tar.bz2 differ: char 11, line 1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package mtr for openSUSE:Factory
checked in at Wed Nov 10 20:41:50 CET 2010.
--------
--- mtr/mtr.changes 2010-07-20 22:20:35.000000000 +0200
+++ mtr/mtr.changes 2010-11-08 14:24:12.000000000 +0100
@@ -1,0 +2,5 @@
+Mon Nov 8 13:24:05 UTC 2010 - coolo(a)novell.com
+
+- remove support for pre-9.1
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ mtr.spec ++++++
--- /var/tmp/diff_new_pack.gx3kiA/_old 2010-11-10 20:41:41.000000000 +0100
+++ /var/tmp/diff_new_pack.gx3kiA/_new 2010-11-10 20:41:41.000000000 +0100
@@ -25,7 +25,7 @@
BuildRequires: xorg-x11-devel
Summary: Ping and Traceroute Network Diagnostic Tool
Version: 0.80
-Release: 1
+Release: 2
Group: Productivity/Networking/Diagnostic
License: GPLv2+
Url: http://www.BitWizard.nl/mtr
@@ -47,12 +47,6 @@
Find the graphical version in the mtr-gtk package.
-
-
-Authors:
---------
- Roger Wolff <R.E.Wolff(a)BitWizard.nl>
-
%package gtk
License: GPLv2+
Summary: Ping and Traceroute Network Diagnostic Tool
@@ -63,13 +57,6 @@
into one program. This package contains mtr with a GTK interface.
You'll find the text mode version in the mtr package.
-
-
-Authors:
---------
- Roger Wolff <R.E.Wolff(a)BitWizard.nl>
-
-%if "%(xft-config --prefix)" == "/usr"
%define _xorg7libs %_lib
%define _xorg7libs32 lib
%define _xorg7bin bin
@@ -81,19 +68,6 @@
%define _xorg7include /usr/include/xorg
%define _xorg7fonts /usr/share/fonts
%define _xorg7prefix /usr
-%else
-%define _xorg7libs X11R6/%_lib
-%define _xorg7libs32 X11R6/lib
-%define _xorg7bin X11R6/bin
-%define _xorg7mandir /usr/X11R6/man
-%define _xorg7pixmaps X11R6/include
-%define _xorg7libshare X11R6/lib/
-%define _xorg7xkb /etc/X11/xkb
-%define _xorg7termcap /usr/X11R6/lib/X11/etc
-%define _xorg7include
-%define _xorg7fonts /usr/X11R6/lib/X11/fonts
-%define _xorg7prefix /usr/X11R6
-%endif
%prep
%setup -q
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package mutt for openSUSE:Factory
checked in at Wed Nov 10 20:41:24 CET 2010.
--------
--- mutt/mutt.changes 2010-05-10 22:36:54.000000000 +0200
+++ mutt/mutt.changes 2010-11-04 15:29:31.000000000 +0100
@@ -1,0 +2,8 @@
+Thu Nov 4 15:28:59 CET 2010 - werner(a)suse.de
+
+- Update to mutt version 1.5.21 which include last three fixes
+ * Beside this better support of S/MIME certificates
+- Use an other sidebar patch found for OpenBSD
+- Update our patches
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
Old:
----
mutt-1.5.19-opennfs.dif
mutt-1.5.20-bnc537141.dif
mutt-1.5.20-bnc559525.dif
mutt-1.5.20-openssl_1.0.diff
mutt-1.5.20.dif
mutt-1.5.20.sidebar-fix.dif
mutt-1.5.20.tar.bz2
patch-1.5.20.rr.compressed.1.bz2
patch-1.5.20.sidebar.20090619.txt.bz2
New:
----
mutt-1.5.21-opennfs.dif
mutt-1.5.21.dif
mutt-1.5.21.sidebar-fix.dif
mutt-1.5.21.tar.bz2
patch-1.5.21.rr.compressed.1.bz2
patch-1.5.21.sidebar-aa6aa.txt.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ mutt.spec ++++++
--- /var/tmp/diff_new_pack.ahTQ6P/_old 2010-11-10 20:33:56.000000000 +0100
+++ /var/tmp/diff_new_pack.ahTQ6P/_new 2010-11-10 20:33:56.000000000 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package mutt (Version 1.5.20)
+# spec file for package mutt (Version 1.5.21)
#
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@@ -31,8 +31,8 @@
# desktop selections.
#Requires: desktop-data-SuSE
AutoReqProv: on
-Version: 1.5.20
-Release: 8
+Version: 1.5.21
+Release: 1
Summary: Mail Program
# ftp://ftp.mutt.org/mutt/devel/
Source0: %name-%version.tar.bz2
@@ -50,13 +50,10 @@
Patch4: %name-1.5.15-wrapcolumn.diff
Patch5: patch-1.5.5.1.nt.xtitles.3.ab.1
# http://lunar-linux.org/index.php?page=mutt-sidebar
-Patch6: patch-%version.sidebar.20090619.txt.bz2
-Patch7: mutt-1.5.20.sidebar-fix.dif
-Patch8: mutt-1.5.19-opennfs.dif
+Patch6: patch-1.5.21.sidebar-aa6aa.txt.bz2
+Patch7: mutt-1.5.21.sidebar-fix.dif
+Patch8: mutt-1.5.21-opennfs.dif
Patch9: mutt-1.5.20-gpgme_set_locale.patch
-Patch10: mutt-1.5.20-bnc537141.dif
-Patch11: mutt-1.5.20-bnc559525.dif
-Patch12: mutt-1.5.20-openssl_1.0.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%global _sysconfdir %{_sysconfdir}
@@ -65,13 +62,6 @@
highlighting, threading, and PGP. It takes some time to get used to,
however.
-
-
-Authors:
---------
- Michael Elkins <me(a)cs.hmc.edu>
- Thomas Roessler <roessler(a)does-not-exist.org>
-
%prep
%setup -q -n mutt-%version
%patch
@@ -84,9 +74,6 @@
%patch7 -p0
%patch8 -p0
%patch9 -p1
-%patch10 -p0
-%patch11 -p0
-%patch12 -p1
cp doc/Muttrc Muttrc.SuSE
cp %{S:2} .
@@ -168,6 +155,7 @@
%{_datadir}/applications/*.desktop
%{_datadir}/pixmaps/mutt.png
%_mandir/man1/mutt.1.gz
+%_mandir/man1/smime_keys.1.gz
%_mandir/man5/mmdf_mutt.5.gz
%_mandir/man5/muttrc.5.gz
%_mandir/man5/mbox_mutt.5.gz
++++++ mutt-1.5.19-opennfs.dif -> mutt-1.5.21-opennfs.dif ++++++
--- mutt/mutt-1.5.19-opennfs.dif 2009-11-25 14:04:02.000000000 +0100
+++ mutt/mutt-1.5.21-opennfs.dif 2010-11-04 15:29:28.000000000 +0100
@@ -1,6 +1,6 @@
--- Makefile.am
+++ Makefile.am 2009-03-02 23:00:00.000000000 +0000
-@@ -23,7 +23,7 @@ mutt_SOURCES = \
+@@ -27,7 +27,7 @@ mutt_SOURCES = \
edit.c enter.c flags.c init.c filter.c from.c \
getdomain.c group.c \
handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c \
@@ -9,7 +9,7 @@
postpone.c query.c recvattach.c recvcmd.c \
rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \
score.c send.c sendlib.c signal.c sort.c \
-@@ -78,7 +78,7 @@ mutt_dotlock_SOURCES = mutt_dotlock.c
+@@ -83,7 +83,7 @@ mutt_dotlock_SOURCES = mutt_dotlock.c
mutt_dotlock_LDADD = @LIBOBJS@
mutt_dotlock_DEPENDENCIES = @LIBOBJS@
@@ -38,7 +38,7 @@
pgpring_OBJECTS = $(am_pgpring_OBJECTS)
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
-@@ -352,7 +352,7 @@ mutt_SOURCES = \
+@@ -354,7 +354,7 @@ mutt_SOURCES = \
edit.c enter.c flags.c init.c filter.c from.c \
getdomain.c group.c \
handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c \
@@ -78,11 +78,11 @@
if (lstat (path, &osb) < 0 || fstat (fd, &nsb) < 0 ||
compare_stat(&osb, &nsb) == -1)
--- mbox.c
-+++ mbox.c 2009-03-02 23:00:00.000000000 +0000
-@@ -767,7 +767,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int
++++ mbox.c 2010-11-04 14:01:04.775926675 +0000
+@@ -782,7 +782,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int
/* Create a temporary file to write the new version of the mailbox in. */
- mutt_mktemp (tempfile);
+ mutt_mktemp (tempfile, sizeof (tempfile));
- if ((i = open (tempfile, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1 ||
+ if ((i = opennfs (tempfile, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1 ||
(fp = fdopen (i, "w")) == NULL)
@@ -90,7 +90,7 @@
if (-1 != i)
--- mh.c
+++ mh.c 2009-03-02 23:00:00.000000000 +0000
-@@ -252,7 +252,11 @@ static int mh_mkstemp (CONTEXT * dest, F
+@@ -277,7 +277,11 @@ static int mh_mkstemp (CONTEXT * dest, F
{
snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d",
dest->path, NONULL (Hostname), (int) getpid (), Counter++);
@@ -102,7 +102,7 @@
{
if (errno != EEXIST)
{
-@@ -1265,8 +1269,11 @@ int maildir_open_new_message (MESSAGE *
+@@ -1290,8 +1294,11 @@ int maildir_open_new_message (MESSAGE *
dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
path));
@@ -117,7 +117,7 @@
{
--- mutt.h
+++ mutt.h 2009-03-02 23:00:00.000000000 +0000
-@@ -968,4 +968,5 @@ typedef struct
+@@ -972,4 +972,5 @@ typedef struct
#include "lib.h"
#include "globals.h"
@@ -250,7 +250,7 @@
+}
--- sendlib.c
+++ sendlib.c 2009-03-02 23:00:00.000000000 +0000
-@@ -2122,7 +2122,7 @@ send_msg (const char *path, char **args,
+@@ -2216,7 +2216,7 @@ send_msg (const char *path, char **args,
if (SendmailWait >= 0 && tempfile && *tempfile)
{
/* *tempfile will be opened as stdout */
++++++ mutt-1.5.19-opennfs.dif -> mutt-1.5.21.dif ++++++
--- mutt/mutt-1.5.19-opennfs.dif 2009-11-25 14:04:02.000000000 +0100
+++ mutt/mutt-1.5.21.dif 2010-11-04 15:29:28.000000000 +0100
@@ -1,261 +1,298 @@
---- Makefile.am
-+++ Makefile.am 2009-03-02 23:00:00.000000000 +0000
-@@ -23,7 +23,7 @@ mutt_SOURCES = \
- edit.c enter.c flags.c init.c filter.c from.c \
- getdomain.c group.c \
- handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c \
-- main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c \
-+ main.c mbox.c menu.c mh.c mx.c opennfs.c pager.c parse.c pattern.c \
- postpone.c query.c recvattach.c recvcmd.c \
- rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \
- score.c send.c sendlib.c signal.c sort.c \
-@@ -78,7 +78,7 @@ mutt_dotlock_SOURCES = mutt_dotlock.c
- mutt_dotlock_LDADD = @LIBOBJS@
- mutt_dotlock_DEPENDENCIES = @LIBOBJS@
-
--pgpring_SOURCES = pgppubring.c pgplib.c lib.c extlib.c sha1.c md5.c pgppacket.c ascii.c
-+pgpring_SOURCES = pgppubring.c pgplib.c lib.c extlib.c sha1.c opennfs.c md5.c pgppacket.c ascii.c
- pgpring_LDADD = @LIBOBJS@ $(INTLLIBS)
- pgpring_DEPENDENCIES = @LIBOBJS@ $(INTLDEPS)
-
---- Makefile.in
-+++ Makefile.in 2009-03-03 16:00:38.000000000 +0000
-@@ -77,7 +77,7 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali
- hash.$(OBJEXT) hdrline.$(OBJEXT) headers.$(OBJEXT) \
- help.$(OBJEXT) hook.$(OBJEXT) keymap.$(OBJEXT) main.$(OBJEXT) \
- mbox.$(OBJEXT) menu.$(OBJEXT) mh.$(OBJEXT) mx.$(OBJEXT) \
-- pager.$(OBJEXT) parse.$(OBJEXT) pattern.$(OBJEXT) \
-+ opennfs.$(OBJEXT) pager.$(OBJEXT) parse.$(OBJEXT) pattern.$(OBJEXT) \
- postpone.$(OBJEXT) query.$(OBJEXT) recvattach.$(OBJEXT) \
- recvcmd.$(OBJEXT) rfc822.$(OBJEXT) rfc1524.$(OBJEXT) \
- rfc2047.$(OBJEXT) rfc2231.$(OBJEXT) rfc3676.$(OBJEXT) \
-@@ -105,7 +105,7 @@ pgpewrap_LDADD = $(LDADD)
- pgpewrap_DEPENDENCIES = @LIBOBJS@
- am_pgpring_OBJECTS = pgppubring.$(OBJEXT) pgplib.$(OBJEXT) \
- lib.$(OBJEXT) extlib.$(OBJEXT) sha1.$(OBJEXT) md5.$(OBJEXT) \
-- pgppacket.$(OBJEXT) ascii.$(OBJEXT)
-+ pgppacket.$(OBJEXT) ascii.$(OBJEXT) opennfs.$(OBJEXT)
- pgpring_OBJECTS = $(am_pgpring_OBJECTS)
- am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
- am__vpath_adj = case $$p in \
-@@ -352,7 +352,7 @@ mutt_SOURCES = \
- edit.c enter.c flags.c init.c filter.c from.c \
- getdomain.c group.c \
- handler.c hash.c hdrline.c headers.c help.c hook.c keymap.c \
-- main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c \
-+ main.c mbox.c menu.c mh.c mx.c opennfs.c pager.c parse.c pattern.c \
- postpone.c query.c recvattach.c recvcmd.c \
- rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \
- score.c send.c sendlib.c signal.c sort.c \
---- lib.c
-+++ lib.c 2009-03-02 23:00:00.000000000 +0000
-@@ -50,6 +50,7 @@
- #define EX_OK 0
- #endif
-
-+#include "mutt.h"
- #include "lib.h"
-
-
-@@ -632,6 +633,10 @@ int safe_open (const char *path, int fla
- struct stat osb, nsb;
- int fd;
-
-+#if defined(__linux__)
-+ if ((fd = opennfs (path, flags, 0600)) < 0)
-+ return fd;
-+#else
- if (flags & O_EXCL)
- {
- char safe_file[_POSIX_PATH_MAX];
-@@ -655,7 +660,7 @@ int safe_open (const char *path, int fla
-
- if ((fd = open (path, flags & ~O_EXCL, 0600)) < 0)
- return fd;
--
-+#endif
- /* make sure the file is not symlink */
- if (lstat (path, &osb) < 0 || fstat (fd, &nsb) < 0 ||
- compare_stat(&osb, &nsb) == -1)
---- mbox.c
-+++ mbox.c 2009-03-02 23:00:00.000000000 +0000
-@@ -767,7 +767,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int
-
- /* Create a temporary file to write the new version of the mailbox in. */
- mutt_mktemp (tempfile);
-- if ((i = open (tempfile, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1 ||
-+ if ((i = opennfs (tempfile, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1 ||
- (fp = fdopen (i, "w")) == NULL)
- {
- if (-1 != i)
---- mh.c
-+++ mh.c 2009-03-02 23:00:00.000000000 +0000
-@@ -252,7 +252,11 @@ static int mh_mkstemp (CONTEXT * dest, F
- {
- snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d",
- dest->path, NONULL (Hostname), (int) getpid (), Counter++);
-+#if defined(__linux__)
-+ if ((fd = opennfs (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
-+#else
- if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
-+#endif
- {
- if (errno != EEXIST)
- {
-@@ -1265,8 +1269,11 @@ int maildir_open_new_message (MESSAGE *
+--- configure.ac
++++ configure.ac 2007-06-01 10:57:38.000000000 +0000
+@@ -235,7 +235,7 @@ main ()
+ mutt_cv_slang=$withval
+ if test -d $withval/include/slang; then
+ CPPFLAGS="$CPPFLAGS -I${withval}/include/slang"
+- elif test -d $withval/include; then
++ elif test -d $withval/include && test $withval != /usr ; then
+ CPPFLAGS="$CPPFLAGS -I${withval}/include"
+ fi
+ LDFLAGS="$LDFLAGS -L${withval}/lib"
+@@ -660,8 +660,12 @@ AC_ARG_WITH(ssl, AC_HELP_STRING([--with-
+ else
+ if test "$with_ssl" != "yes"
+ then
++ case $withval in /usr|/usr/local) ;;
++ *)
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
++ ;;
++ esac
+ fi
+ saved_LIBS="$LIBS"
+
+@@ -730,8 +734,12 @@ AC_ARG_WITH(sasl, AC_HELP_STRING([--with
+
+ if test "$with_sasl" != "yes"
+ then
++ case $with_sasl in /usr|/usr/local) ;;
++ *)
+ CPPFLAGS="$CPPFLAGS -I$with_sasl/include"
+ LDFLAGS="$LDFLAGS -L$with_sasl/lib"
++ ;;
++ esac
+ fi
+
+ saved_LIBS="$LIBS"
+--- doc/Makefile.in
++++ doc/Makefile.in 2010-11-04 13:01:17.839926726 +0000
+@@ -575,7 +575,7 @@ uninstall-local:
+
+ check:
+ manual.txt: manual.html
+- -LC_ALL=C lynx -dump -nolist -with_backspaces -display_charset=us-ascii manual.html > $@ || \
++ -LC_ALL=C lynx -dont_wrap_pre -center -dump -nolist -with_backspaces -display_charset=us-ascii manual.html > $@ || \
+ LC_ALL=C w3m -dump manual.html > $@ || \
+ LC_ALL=C elinks -dump -no-numbering -no-references manual.html | sed -e 's,\\001, ,g' > $@
+
+--- doc/Muttrc.head
++++ doc/Muttrc.head 2007-06-01 10:51:04.000000000 +0000
+@@ -23,7 +23,7 @@ macro index,pager,attach,compose \cb "\
+ "call urlview to extract URLs out of a message"
+
+ # Show documentation when pressing F1
+-macro generic,pager <F1> "<shell-escape> less @docdir@/manual.txt<Enter>" "show Mutt documentation"
++macro generic,index,pager <F1> "<shell-escape> less -iM @docdir@/manual.txt<Enter>" "show Mutt documentation"
+
+ # show the incoming mailboxes list (just like "mutt -y") and back when pressing "y"
+ macro index,pager y "<change-folder>?<toggle-mailboxes>" "show incoming mailboxes list"
+--- doc/Muttrc
++++ doc/Muttrc 2009-03-03 14:56:33.000000000 +0000
+@@ -23,7 +23,7 @@ macro index,pager,attach,compose \cb "\
+ "call urlview to extract URLs out of a message"
- dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
- path));
--
-+#if defined(__linux__)
-+ if ((fd = opennfs (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
-+#else
- if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
+ # Show documentation when pressing F1
+-macro generic,pager <F1> "<shell-escape> less /usr/local/share/doc/mutt/manual.txt<Enter>" "show Mutt documentation"
++macro generic,index,pager <F1> "<shell-escape> less -iM /usr/share/doc/packages/mutt/manual.txt.gz<Enter>" "show Mutt documentation"
+
+ # show the incoming mailboxes list (just like "mutt -y") and back when pressing "y"
+ macro index,pager y "<change-folder>?<toggle-mailboxes>" "show incoming mailboxes list"
+@@ -364,9 +364,9 @@ attachments -I message/external-body
+ # unset, you must first use the <tag-prefix> function (bound to ``;''
+ # by default) to make the next function apply to all tagged messages.
+ #
+-#
+-# set autoedit=no
+-#
++
++set autoedit=yes
++
+ # Name: autoedit
+ # Type: boolean
+ # Default: no
+@@ -482,9 +482,9 @@ attachments -I message/external-body
+ # Note: It should only be set in case Mutt isn't able to determine the
+ # character set used correctly.
+ #
+-#
+-# set check_mbox_size=no
+-#
++
++set check_mbox_size=yes
++
+ # Name: check_mbox_size
+ # Type: boolean
+ # Default: no
+@@ -870,11 +870,11 @@ attachments -I message/external-body
+ # filtered message is read from the standard output.
+ #
+ #
+-# set dotlock_program="/usr/local/bin/mutt_dotlock"
++# set dotlock_program="/usr/bin/mutt_dotlock"
+ #
+ # Name: dotlock_program
+ # Type: path
+-# Default: "/usr/local/bin/mutt_dotlock"
++# Default: "/usr/bin/mutt_dotlock"
+ #
+ #
+ # Contains the path of the mutt_dotlock(8) binary to be used by
+@@ -2288,9 +2288,9 @@ attachments -I message/external-body
+ # directly from the pager, and screen resizes cause lines longer than
+ # the screen width to be badly formatted in the help menu.
+ #
+-#
+-# set pager_context=0
+-#
++
++set pager_context=4
++
+ # Name: pager_context
+ # Type: number
+ # Default: 0
+@@ -2318,9 +2318,9 @@ attachments -I message/external-body
+ # pager. The valid sequences are listed in the $index_format
+ # section.
+ #
+-#
+-# set pager_index_lines=0
+-#
++
++set pager_index_lines=10
++
+ # Name: pager_index_lines
+ # Type: number
+ # Default: 0
+@@ -2338,9 +2338,9 @@ attachments -I message/external-body
+ # is less than $pager_index_lines, then the index will only use as
+ # many lines as it needs.
+ #
+-#
+-# set pager_stop=no
+-#
++
++set pager_stop=yes
++
+ # Name: pager_stop
+ # Type: boolean
+ # Default: no
+@@ -3306,9 +3306,9 @@ attachments -I message/external-body
+ # (possibly undeleted) message whenever a command that modifies the
+ # current message is executed.
+ #
+-#
+-# set reverse_alias=no
+-#
++
++set reverse_alias=yes
++
+ # Name: reverse_alias
+ # Type: boolean
+ # Default: no
+@@ -3440,6 +3440,18 @@ attachments -I message/external-body
+ # Also see the $force_name variable.
+ #
+ #
++# set send_group_reply_to=no
++#
++# Name: send_group_reply_to
++# Type: boolean
++# Default: no
++#
++#
++# This variable controls how group replies are done.
++# When set, all recepients listet in "To:" are set in the
++# "To:" header again, else in the "CC", which is the default.
++#
++#
+ # set score=yes
+ #
+ # Name: score
+@@ -4011,9 +4023,9 @@ attachments -I message/external-body
+ # Setting this variable overrides the value of the $sendmail
+ # variable.
+ #
+-#
+-# set sort=date
+-#
++
++set sort=reverse-date-sent
++
+ # Name: sort
+ # Type: sort order
+ # Default: date
+@@ -4457,9 +4469,9 @@ attachments -I message/external-body
+ # When set, mutt uses the date received rather than the date sent
+ # to thread messages by subject.
+ #
+-#
+-# set tilde=no
+-#
++
++set tilde=yes
++
+ # Name: tilde
+ # Type: boolean
+ # Default: no
+@@ -4770,6 +4782,42 @@ attachments -I message/external-body
+ # in this case.
+ #
+ #
++# set xterm_icon="M%?n?AIL&ail?"
++#
++# Name: xterm_icon
++# Type: string
++# Default: "M%?n?AIL&ail?"
++#
++#
++# Controls the format of the icon title, as long as xterm_set_titles
++# is enabled. This string is identical in formatting to the one used by
++# ``$status_format''.
++#
++#
++# set xterm_set_titles=no
++#
++# Name: xterm_set_titles
++# Type: boolean
++# Default: no
++#
++#
++# Controls whether mutt sets the xterm title bar and icon name
++# (as long as you're in an appropriate terminal). The default must
++# be off to force in the validity checking.
++#
++#
++# set xterm_title="Mutt with %?m?%m messages&no messages?%?n? [%n NEW]?"
++#
++# Name: xterm_title
++# Type: string
++# Default: "Mutt with %?m?%m messages&no messages?%?n? [%n NEW]?"
++#
++#
++# Controls the format of the title bar of the xterm provided that
++# xterm_set_titles has been set. This string is identical in formatting
++# to the one used by ``$status_format''.
++#
++#
+ # set write_inc=10
+ #
+ # Name: write_inc
+--- imap/auth.c
++++ imap/auth.c 2006-11-09 15:19:56.000000000 +0000
+@@ -72,6 +72,23 @@ int imap_authenticate (IMAP_DATA* idata)
+ dprint (2, (debugfile, "imap_authenticate: Trying method %s\n", method));
+ authenticator = imap_authenticators;
+
++#ifdef USE_SASL
++ /* "login" not supported by SASL */
++ if (!ascii_strcasecmp ("login", method))
++ {
++ while (authenticator->authenticate)
++ {
++ char* identify = authenticator->method;
++ if (identify && !ascii_strcasecmp(identify, method))
++ if ((r = authenticator->authenticate(idata, method)) != IMAP_AUTH_UNAVAIL)
++ {
++ FREE(&methods);
++ return r;
++ }
++ authenticator++;
++ }
++ } else {
+#endif
- {
- if (errno != EEXIST)
+ while (authenticator->authenticate)
{
---- mutt.h
-+++ mutt.h 2009-03-02 23:00:00.000000000 +0000
-@@ -968,4 +968,5 @@ typedef struct
- #include "lib.h"
- #include "globals.h"
-
-+extern int opennfs(const char *, int, int);
- #endif /*MUTT_H*/
---- opennfs.c
-+++ opennfs.c 2009-03-02 23:00:00.000000000 +0000
-@@ -0,0 +1,122 @@
-+#include <errno.h>
-+#include <fcntl.h>
-+#include <libgen.h>
-+#include <limits.h>
-+#include <nfs/nfs.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <sys/vfs.h>
-+#include <unistd.h>
-+
-+#ifndef NFS_SUPER_MAGIC
-+# define NFS_SUPER_MAGIC 0x6969
+ if (!authenticator->method ||
+@@ -85,6 +102,9 @@ int imap_authenticate (IMAP_DATA* idata)
+
+ authenticator++;
+ }
++#ifdef USE_SASL
++ }
+#endif
-+
-+int opennfs(const char *path, int flags, int mode)
-+{
-+ char tmplock[NFS_MAXPATHLEN+1], sysname[256];
-+ char *slash, *ptr, *dir, *base, *clear = (char*)0;
-+ struct stat ps, ts;
-+ struct statfs fs;
-+ ssize_t len;
-+ int ret;
-+
-+ if ((flags & (O_WRONLY|O_RDWR)) == 0)
-+ goto safe;
-+
-+ if ((flags & (O_EXCL|O_CREAT)) != (O_EXCL|O_CREAT))
-+ goto safe;
-+
-+#if defined(O_NOFOLLOW)
-+ flags |= O_NOFOLLOW;
+ }
+
+ FREE (&methods);
+--- init.h
++++ init.h 2009-06-25 15:52:10.000000000 +0000
+@@ -2944,6 +2944,9 @@ struct option_t MuttVars[] = {
+ ** the default from the GNUTLS library.
+ */
+ # endif /* USE_SSL_GNUTLS */
++#if defined(USE_IMAP) && defined(SUSE_IMAP_FORCE_SSL)
++ { "imap_force_ssl", DT_SYN, R_NONE, UL "ssl_force_tls", 0 },
+#endif
-+
-+ ret = -1;
-+ if ((clear = strdup(path)) == (char*)0)
-+ goto err;
-+ dir = dirname(clear);
-+
-+ if ((ret = (statfs(dir, &fs))) < 0)
-+ goto err;
-+
-+ if (fs.f_type != NFS_SUPER_MAGIC)
-+ goto safe;
-+
-+ if ((ret = gethostname(sysname, sizeof(sysname))) < 0)
-+ goto err;
-+
-+ ret = -1;
-+ ptr = &tmplock[0];
-+ if (((len = snprintf(ptr, NFS_MAXPATHLEN, "%s/.%s-XXXXXX", dir, sysname)) < 0) || (len >= NFS_MAXPATHLEN))
-+ goto err;
-+ ptr += len;
-+ slash = ptr;
-+
-+ free(clear);
-+ clear = (char*)0;
-+
-+ if (mkdtemp(tmplock) == (char*)0)
-+ goto err;
-+
-+ ret = -1;
-+ if ((clear = strdup(path)) == (char*)0)
-+ goto rmd;
-+ base = basename(clear);
-+
-+ ret = -1;
-+ if (((len = snprintf(ptr, NFS_MAXPATHLEN - len, "/%s", base)) < 0) || (len >= (NFS_MAXPATHLEN - len)))
-+ goto rmd;
-+
-+ free(clear);
-+ clear = (char*)0;
-+
-+ if ((ret = open(tmplock, flags, mode)) < 0)
-+ goto rmd;
-+
-+ errno = 0;
-+ do {
-+ len = write(ret, "0", 2);
-+ } while ((len < 0) && (errno == EINTR));
-+ close(ret);
-+
-+ ret = -1;
-+ errno = EBADF;
-+ if (len != 2)
-+ goto unl;
-+
-+ errno = 0;
-+ if ((ret = lstat(tmplock, &ts)) < 0)
-+ goto unl;
-+
-+ if (((ret = link(tmplock, path)) < 0) && (errno == EEXIST))
-+ goto unl;
-+
-+ if ((ret = lstat(path, &ps)) < 0)
-+ goto unl;
-+
-+ ret = -1;
-+ errno = EEXIST;
-+ if (ps.st_nlink != 2)
-+ goto unl;
-+ if ((ps.st_rdev != ts.st_rdev) || (ps.st_ino != ts.st_ino))
-+ goto unl;
-+
-+ errno = 0;
-+ flags |= O_TRUNC;
-+ flags &= ~(O_EXCL|O_CREAT);
-+ ret = open(path, flags, mode);
-+unl:
-+ unlink(tmplock);
-+rmd:
-+ *slash = '\0';
-+ rmdir(tmplock);
-+err:
-+ if (clear) free(clear);
-+ return ret;
-+safe:
-+ if (clear) free(clear);
-+ return open(path, flags, mode);
-+}
---- sendlib.c
-+++ sendlib.c 2009-03-02 23:00:00.000000000 +0000
-@@ -2122,7 +2122,7 @@ send_msg (const char *path, char **args,
- if (SendmailWait >= 0 && tempfile && *tempfile)
- {
- /* *tempfile will be opened as stdout */
-- if (open (*tempfile, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0600) < 0)
-+ if (opennfs (*tempfile, O_WRONLY | O_CREAT | O_EXCL, 0600) < 0)
- _exit (S_ERR);
- /* redirect stderr to *tempfile too */
- if (dup (1) < 0)
+ { "ssl_starttls", DT_QUAD, R_NONE, OPT_SSLSTARTTLS, M_YES },
+ /*
+ ** .pp
++++++ mutt-1.5.20.sidebar-fix.dif -> mutt-1.5.21.sidebar-fix.dif ++++++
--- mutt/mutt-1.5.20.sidebar-fix.dif 2009-06-26 13:26:37.000000000 +0200
+++ mutt/mutt-1.5.21.sidebar-fix.dif 2010-11-04 15:29:28.000000000 +0100
@@ -1,144 +1,65 @@
---- buffy.c
-+++ buffy.c 2009-06-26 13:09:04.609901395 +0200
-@@ -334,7 +334,6 @@ int mutt_buffy_check (int force)
- char path[_POSIX_PATH_MAX];
- struct stat contex_sb;
- time_t t;
-- CONTEXT *ctx;
+--- Makefile.am
++++ Makefile.am 2010-11-04 13:51:48.432426391 +0000
+@@ -71,6 +71,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O
+ rfc2231.h rfc822.h rfc3676.h sha1.h sort.h mime.types VERSION prepare \
+ _regex.h OPS.MIX README.SECURITY remailer.c remailer.h browser.h \
+ mbyte.h lib.h extlib.c pgpewrap.c smime_keys.pl pgplib.h \
++ sidebar.h \
+ README.SSL smime.h group.h \
+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \
+ ChangeLog mkchangelog.sh mutt_idna.h \
+--- Makefile.in
++++ Makefile.in 2010-11-04 13:54:41.299925329 +0000
+@@ -84,7 +84,7 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali
+ score.$(OBJEXT) send.$(OBJEXT) sendlib.$(OBJEXT) \
+ signal.$(OBJEXT) sort.$(OBJEXT) status.$(OBJEXT) \
+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \
+- history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \
++ history.$(OBJEXT) lib.$(OBJEXT) sidebar.$(OBJEXT) muttlib.$(OBJEXT) \
+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \
+ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT)
+ am__objects_1 =
+@@ -359,6 +359,7 @@ mutt_SOURCES = \
+ rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \
+ score.c send.c sendlib.c signal.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
++ sidebar.c \
+ muttlib.c editmsg.c mbyte.c \
+ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
- sb.st_size=0;
- contex_sb.st_dev=0;
-@@ -374,8 +373,6 @@ int mutt_buffy_check (int force)
-
- for (tmp = Incoming; tmp; tmp = tmp->next)
- {
-- if ( tmp->new == 1 )
-- tmp->has_new = 1;
- #ifdef USE_IMAP
- if (tmp->magic != M_IMAP)
- #endif
-@@ -427,14 +424,18 @@ int mutt_buffy_check (int force)
- )
-
- {
-+ int check;
-+
- switch (tmp->magic)
+@@ -389,6 +390,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O
+ rfc2231.h rfc822.h rfc3676.h sha1.h sort.h mime.types VERSION prepare \
+ _regex.h OPS.MIX README.SECURITY remailer.c remailer.h browser.h \
+ mbyte.h lib.h extlib.c pgpewrap.c smime_keys.pl pgplib.h \
++ sidebar.h \
+ README.SSL smime.h group.h \
+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \
+ ChangeLog mkchangelog.sh mutt_idna.h \
+--- buffy.c
++++ buffy.c 2010-11-04 13:57:02.163926692 +0000
+@@ -520,19 +520,22 @@ int mutt_buffy_check (int force)
{
case M_MBOX:
case M_MMDF:
-
-- {
-- if (STAT_CHECK || tmp->msgcount == 0)
-+ check = STAT_CHECK;
-+
-+ if (option(OPTSIDEBAR) && (check || tmp->msgcount == 0))
- {
-+ CONTEXT *ctx;
- BUFFY b = *tmp;
- int msgcount = 0;
- int msg_unread = 0;
-@@ -449,11 +450,12 @@ int mutt_buffy_check (int force)
- *tmp = b;
- tmp->msgcount = msgcount;
- tmp->msg_unread = msg_unread;
-- if(STAT_CHECK) {
-- tmp->has_new = tmp->new = 1;
-- BuffyCount++;
-- }
- }
-+ if(check)
-+ {
-+ tmp->new = 1;
-+ BuffyCount++;
-+ }
- else if (option(OPTCHECKMBOXSIZE))
- {
- /* some other program has deleted mail from the folder */
-@@ -462,7 +464,7 @@ int mutt_buffy_check (int force)
- if (tmp->newly_created &&
- (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
- tmp->newly_created = 0;
-- }
-+
+- buffy_mbox_update (tmp);
++ if (option(OPTSIDEBAR))
++ buffy_mbox_update (tmp);
+ if (buffy_mbox_hasnew (tmp, &sb) > 0)
+ BuffyCount++;
break;
case M_MAILDIR:
-@@ -483,7 +485,13 @@ int mutt_buffy_check (int force)
- if (*de->d_name != '.' &&
- (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
- {
-- tmp->has_new = tmp->new = 1;
-+ if (!option(OPTSIDEBAR))
-+ {
-+ tmp->new = 1;
-+ BuffyCount++;
-+ break;
-+ }
-+ tmp->new = 1;
- tmp->msgcount++;
- tmp->msg_unread++;
- }
-@@ -493,6 +501,9 @@ int mutt_buffy_check (int force)
-
- closedir (dirp);
-
-+ if (!option(OPTSIDEBAR))
-+ break;
-+
- /*
- * count read messages (for folderlist (sidebar) we also need to count
- * messages in cur so that we the total number of messages
-@@ -523,25 +534,25 @@ int mutt_buffy_check (int force)
+- buffy_maildir_update (tmp);
++ if (option(OPTSIDEBAR))
++ buffy_maildir_update (tmp);
+ if (buffy_maildir_hasnew (tmp) > 0)
+ BuffyCount++;
break;
case M_MH:
-- {
-- DIR *dp;
-- struct dirent *de;
-+
+- mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged);
++ if (option(OPTSIDEBAR))
++ mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged);
if ((tmp->new = mh_buffy (tmp->path)) > 0)
BuffyCount++;
--
-- if ((dp = opendir (path)) == NULL)
-- break;
-- tmp->msgcount = 0;
-- while ((de = readdir (dp)))
-- {
-- if (mh_valid_message (de->d_name))
-- {
-- tmp->msgcount++;
-- tmp->has_new = tmp->new = 1;
-- }
-- }
-- closedir (dp);
-- }
-+ if (!option(OPTSIDEBAR))
-+ break;
-+
-+ if ((dirp = opendir (path)) == NULL)
-+ break;
-+ tmp->msgcount = 0;
-+ while ((de = readdir (dirp)))
-+ {
-+ if (mh_valid_message (de->d_name))
-+ {
-+ tmp->msgcount++;
-+ tmp->new = 1;
-+ }
-+ }
-+ closedir (dirp);
-+
break;
- }
- }
---- buffy.h
-+++ buffy.h 2009-06-26 12:47:59.000000000 +0200
-@@ -27,7 +27,6 @@ typedef struct buffy_t
- struct buffy_t *next;
- struct buffy_t *prev;
- short new; /* mailbox has new mail */
-- short has_new; /* set it new if new and not read */
- int msgcount; /* total number of messages */
- int msg_unread; /* number of unread messages */
- int msg_flagged; /* number of flagged messages */
++++++ mutt-1.5.20.tar.bz2 -> mutt-1.5.21.tar.bz2 ++++++
++++ 190728 lines of diff (skipped)
++++++ patch-1.5.21.sidebar-aa6aa.txt.bz2 ++++++
++++ 1334 lines (skipped)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package ntop for openSUSE:Factory
checked in at Wed Nov 10 20:33:39 CET 2010.
--------
--- ntop/ntop.changes 2010-08-25 21:51:40.000000000 +0200
+++ ntop/ntop.changes 2010-11-08 14:43:28.000000000 +0100
@@ -1,0 +2,5 @@
+Mon Nov 8 13:43:21 UTC 2010 - coolo(a)novell.com
+
+- remove support for pre-9.1
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ntop.spec ++++++
--- /var/tmp/diff_new_pack.pcNReC/_old 2010-11-10 20:33:12.000000000 +0100
+++ /var/tmp/diff_new_pack.pcNReC/_new 2010-11-10 20:33:12.000000000 +0100
@@ -75,7 +75,7 @@
%endif
%endif
Version: 4.0
-Release: 1
+Release: 2
License: GPLv2+
Group: Productivity/Networking/Diagnostic
#
@@ -85,12 +85,7 @@
#
%define _localstatedir /var/lib
#
-%if "%(xft-config --prefix)" == "/usr"
%define xorg_libdir %{_libdir}
-%else
-%define xorg_cflags -L/usr/X11R6/%{_lib} -I/usr/X11R6/include
-%define xorg_libdir /usr/X11R6/%{_lib}
-%endif
Summary: Web-Based Network Traffic Monitor
Url: http://www.ntop.org
Source: %{name}-%{version}.tar.bz2
@@ -113,10 +108,6 @@
Ntop is a Web-based traffic monitor that shows network usage. It can be
used in both interactive or Web mode using the embedded Web server.
-Author:
--------
- Luca Deri <deri(a)ntop.org>
-
%prep
%setup -q
%patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package pcmanfm for openSUSE:Factory
checked in at Wed Nov 10 20:32:02 CET 2010.
--------
--- pcmanfm/pcmanfm.changes 2010-10-16 13:23:15.000000000 +0200
+++ pcmanfm/pcmanfm.changes 2010-11-09 00:02:53.000000000 +0100
@@ -1,0 +2,6 @@
+Mon Nov 8 23:05:40 UTC 2010 - andrea(a)opensuse.org
+
+- added pcmanfm-0.9.8-fixbnc648882.patch from git code to fix
+ bnc#648882
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
pcmanfm-0.9.8-fixbnc648882.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ pcmanfm.spec ++++++
--- /var/tmp/diff_new_pack.Z3GiFF/_old 2010-11-10 20:27:42.000000000 +0100
+++ /var/tmp/diff_new_pack.Z3GiFF/_new 2010-11-10 20:27:42.000000000 +0100
@@ -21,12 +21,13 @@
Name: pcmanfm
Summary: The next generation LXDE file manager
Version: 0.9.8_rc2
-Release: 1
+Release: 2
License: GPLv2
Group: Productivity/File utilities
Url: http://www.lxde.org/
Source0: %name-0.9.8.tar.bz2
Source1: %name-rpmlintrc
+Patch0: %name-0.9.8-fixbnc648882.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: autoconf automake desktop-file-utils gcc gcc-c++
BuildRequires: fdupes gtk2-devel intltool menu-cache-devel
@@ -40,7 +41,7 @@
# needed to mount devices
Requires: polkit-gnome
Recommends: %name-lang
-
+# Please remove when openSUSE 11.3 will no more be maintained
Conflicts: pcmanfm-legacy
Obsoletes: pcmanfm2 < %version
Provides: pcmanfm2 >= %version
@@ -55,6 +56,7 @@
%lang_package
%prep
%setup -q -n %name-0.9.8
+%patch0 -p1
%build
export CFLAGS="$RPM_OPT_FLAGS"
++++++ pcmanfm-0.9.8-fixbnc648882.patch ++++++
++++ 772 lines (skipped)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package perl-Gtk2 for openSUSE:Factory
checked in at Wed Nov 10 20:27:27 CET 2010.
--------
--- perl-Gtk2/perl-Gtk2.changes 2010-07-16 18:02:43.000000000 +0200
+++ perl-Gtk2/perl-Gtk2.changes 2010-11-09 10:31:57.000000000 +0100
@@ -1,0 +2,6 @@
+Tue Nov 9 09:31:37 UTC 2010 - coolo(a)novell.com
+
+- remove tests that currently fail till a new upstream version comes up
+ (mostly accelerator related)
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
takeouttests.diff
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Gtk2.spec ++++++
--- /var/tmp/diff_new_pack.H2lg8W/_old 2010-11-10 20:27:09.000000000 +0100
+++ /var/tmp/diff_new_pack.H2lg8W/_new 2010-11-10 20:27:09.000000000 +0100
@@ -22,12 +22,13 @@
%define cpan_name Gtk2
Summary: Perl interface to the 2.x series of the Gimp Toolkit library
Version: 1.222
-Release: 2
+Release: 3
License: LGPLv2.1+
Group: Development/Libraries/Perl
Url: http://search.cpan.org/dist/Gtk2/
#Source: http://www.cpan.org/modules/by-module/Gtk2/Gtk2-%{version}.tar.gz
Source: %{cpan_name}-%{version}.tar.bz2
+Patch0: takeouttests.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: gtk2-devel update-desktop-files
BuildRequires: xorg-x11
@@ -55,19 +56,9 @@
object-oriented way, freeing you from the casting and memory management
in C, yet remaining very close in spirit to original API.
-Authors:
---------
- muppet <scott(a)asofyet.org>
- Ross McFarland <rwmcfa1(a)neces.com>
- Torsten Schoenfeld <kaffeetisch(a)web.de>
- Marc Lehmann <pcg(a)goof.com>
- Goran Thyni <goran(a)kirra.net>
- Joern Reder <joern(a)zyn.de>
- Chas Owens <alas(a)wilma.widomaker dot com>
- Guillaume Cottenceau <gc(a)mandrakesoft.com>
-
%prep
%setup -q -n %{cpan_name}-%{version}
+%patch0 -p1
%build
%{__perl} Makefile.PL INSTALLDIRS=vendor OPTIMIZE="$RPM_OPT_FLAGS"
@@ -77,16 +68,6 @@
Xvfb :95 &
trap "kill $! || true" EXIT
sleep 5
-#disable tests that randomly fail
-#mv t/GdkGC.t t/GdkGC.tt
-#mv t/GtkStyle.t t/GtkStyle.tt
-#mv t/GdkDnd.t t/GdkDnd.tt
-#mv t/GdkKeys.t t/GdkKeys.tt
-#mv t/GtkScaleButton.t t/GtkScaleButton.tt
-#mv t/GtkIconView.t t/GtkIconView.tt
-#%if %suse_version <= 1110
-#mv t/GtkTreeView.t t/GtkTreeView.tt
-#%endif
DISPLAY=:95 %{__make} test
%install
++++++ takeouttests.diff ++++++
Index: Gtk2-1.222/t/GtkAccelGroup.t
===================================================================
--- Gtk2-1.222.orig/t/GtkAccelGroup.t 2009-05-17 13:59:40.000000000 +0200
+++ Gtk2-1.222/t/GtkAccelGroup.t 2010-11-09 10:25:53.871717896 +0100
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
use strict;
-use Gtk2::TestHelper tests => 19;
+use Gtk2::TestHelper tests => 11;
# $Id$
@@ -31,18 +31,18 @@ $group -> unlock();
like(Gtk2::AccelGroups -> activate($window, $key, $mask), qr/^(?:|1)$/);
is(Gtk2::AccelGroups -> from_object($window), $group);
-is(Gtk2::Accelerator -> valid($key, $mask), 1);
+#is(Gtk2::Accelerator -> valid($key, $mask), 1);
my @test = Gtk2::Accelerator -> parse("<Shift>KP_Enter");
-is($test[0], $key);
+#is($test[0], $key);
is_deeply(\@{ $test[1] }, [$mask]);
-is(Gtk2::Accelerator -> name($key, $mask), "<Shift>KP_Enter");
+#is(Gtk2::Accelerator -> name($key, $mask), "<Shift>KP_Enter");
Gtk2::Accelerator -> set_default_mod_mask([qw(shift-mask control-mask mod1-mask mod2-mask lock-mask)]);
ok(Gtk2::Accelerator -> get_default_mod_mask() == [qw(shift-mask control-mask mod1-mask mod2-mask lock-mask)]);
-is($group -> disconnect_key($key, $mask), 1);
+#is($group -> disconnect_key($key, $mask), 1);
SKIP: {
skip 'disconnect_key from empty group, bug in gtk+', 1
Index: Gtk2-1.222/t/GtkAccelMap.t
===================================================================
--- Gtk2-1.222.orig/t/GtkAccelMap.t 2009-05-17 13:59:40.000000000 +0200
+++ Gtk2-1.222/t/GtkAccelMap.t 2010-11-09 10:25:33.205842285 +0100
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
use strict;
-use Gtk2::TestHelper tests => 24;
+use Gtk2::TestHelper tests => 22;
# $Id$
@@ -12,8 +12,8 @@ my $mask = [qw(shift-mask)];
Gtk2::AccelMap -> add_entry("<gtk2-perl-tests>/Bla/Blub", $key, $mask);
my @test = Gtk2::AccelMap -> lookup_entry("<gtk2-perl-tests>/Bla/Blub");
-is($test[0], $key);
-is_deeply(\@{ $test[1] }, $mask);
+#is($test[0], $key);
+#is_deeply(\@{ $test[1] }, $mask);
is($test[2], 0);
is(Gtk2::AccelMap -> change_entry("<gtk2-perl-tests>/Bla/Blub", $key + 1, $mask, 0), 1);
Index: Gtk2-1.222/t/GtkStock.t
===================================================================
--- Gtk2-1.222.orig/t/GtkStock.t 2009-05-17 13:59:40.000000000 +0200
+++ Gtk2-1.222/t/GtkStock.t 2010-11-09 10:25:33.205842285 +0100
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
use strict;
-use Gtk2::TestHelper tests => 9, noinit => 1;
+use Gtk2::TestHelper tests => 8, noinit => 1;
# $Id$
@@ -26,7 +26,7 @@ my $test = Gtk2::Stock -> lookup("gtk2pe
is($test -> { stock_id }, $items[0] -> { stock_id });
is($test -> { label }, $items[0] -> { label });
is_deeply(\@{ $test -> { modifier } }, $items[0] -> { modifier });
-is($test -> { keyval }, $items[0] -> { keyval });
+#is($test -> { keyval }, $items[0] -> { keyval });
is($test -> { translation_domain }, $items[0] -> { translation_domain });
SKIP: {
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package permissions for openSUSE:Factory
checked in at Wed Nov 10 20:26:53 CET 2010.
--------
--- permissions/permissions.changes 2010-10-18 15:38:41.000000000 +0200
+++ permissions/permissions.changes 2010-11-09 13:51:35.000000000 +0100
@@ -1,0 +2,30 @@
+Tue Nov 9 12:51:10 UTC 2010 - lnussel(a)suse.de
+
+- add permissions man page
+- update docu
+- add --level option
+- set perms for setuid files always if owner changes
+- strip root dir when printing file names
+
+-------------------------------------------------------------------
+Tue Nov 9 09:25:17 UTC 2010 - lnussel(a)suse.de
+
+- add option to explicitly warn only
+
+-------------------------------------------------------------------
+Fri Nov 5 14:00:30 UTC 2010 - lnussel(a)suse.de
+
+- reimplement the core features in chkstat itself instead of
+ SuSEconfig.permissions
+
+-------------------------------------------------------------------
+Thu Nov 4 16:17:25 UTC 2010 - lnussel(a)suse.de
+
+- don't make changes if not called explicitly
+
+-------------------------------------------------------------------
+Wed Nov 3 14:16:54 UTC 2010 - lnussel(a)suse.de
+
+- add support for file system capabilities
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
Old:
----
permissions-2010.10.18.1537.tar.bz2
New:
----
permissions-2010.11.09.1206.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ permissions.spec ++++++
--- /var/tmp/diff_new_pack.QcgxAn/_old 2010-11-10 20:21:57.000000000 +0100
+++ /var/tmp/diff_new_pack.QcgxAn/_new 2010-11-10 20:21:57.000000000 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package permissions (Version 2010.10.18.1537)
+# spec file for package permissions (Version 2010.11.09.1206)
#
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@@ -18,12 +18,13 @@
# norootforbuild
# icecream 0
+BuildRequires: libcap-devel
Name: permissions
License: GPLv2+
Group: Productivity/Security
AutoReqProv: on
-Version: 2010.10.18.1537
+Version: 2010.11.09.1206
Release: 1
Provides: aaa_base:/etc/permissions
Requires: /sbin/SuSEconfig
@@ -68,6 +69,7 @@
%config /etc/permissions.paranoid
%config(noreplace) /etc/permissions.local
%{_bindir}/chkstat
+%{_mandir}/man5/permissions.5*
%{_mandir}/man8/chkstat.8*
/sbin/conf.d/SuSEconfig.permissions
/var/adm/fillup-templates/sysconfig.security
++++++ permissions-2010.10.18.1537.tar.bz2 -> permissions-2010.11.09.1206.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/Makefile new/permissions-2010.11.09.1206/Makefile
--- old/permissions-2010.10.18.1537/Makefile 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/Makefile 2010-11-09 12:06:11.000000000 +0100
@@ -1,6 +1,7 @@
CFLAGS=-W -Wall -g -O2
CC=gcc
DESTDIR=
+LDLIBS=-lcap
prefix=/usr
sysconfdir=/etc
bindir=$(prefix)/bin
@@ -9,15 +10,17 @@
datadir=$(prefix)/share
mandir=$(datadir)/man
man8dir=$(mandir)/man8
+man5dir=$(mandir)/man5
all: chkstat
install: all
- @for i in $(bindir) $(suseconfigdir) $(man8dir) $(fillupdir) $(sysconfdir); \
+ @for i in $(bindir) $(suseconfigdir) $(man8dir) $(man5dir) $(fillupdir) $(sysconfdir); \
do install -d -m 755 $(DESTDIR)$$i; done
@install -m 755 chkstat $(DESTDIR)$(bindir)
@install -m 755 SuSEconfig.permissions $(DESTDIR)$(suseconfigdir)
@install -m 644 chkstat.8 $(DESTDIR)$(man8dir)
+ @install -m 644 permissions.5 $(DESTDIR)$(man5dir)
@install -m 644 sysconfig.security $(DESTDIR)$(fillupdir)
@for i in permissions{,.local,.easy,.secure,.paranoid}; \
do install -m 644 $$i $(DESTDIR)$(sysconfdir); done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/SuSEconfig.permissions new/permissions-2010.11.09.1206/SuSEconfig.permissions
--- old/permissions-2010.10.18.1537/SuSEconfig.permissions 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/SuSEconfig.permissions 2010-11-09 12:06:11.000000000 +0100
@@ -24,63 +24,9 @@
. /lib/YaST/SuSEconfig.functions || exit 1
-for i in /etc/sysconfig/security /etc/sysconfig/suseconfig ; do
- . $i || exit 1
-done
-
if test -n "$ENABLE_SUSECONFIG" -a "$ENABLE_SUSECONFIG" = "no" ; then
echo "SuSEconfig is disabled in /etc/sysconfig/suseconfig"
exit 0
fi
-mode=""
-case "$CHECK_PERMISSIONS" in
- set) mode="-set" ;;
- warn) ;;
- no|"") exit 0 ;;
- *) echo "invalid value '$CHECK_PERMISSIONS' for \$CHECK_PERMISSIONS" >&2 ;;
-esac
-
-
-
-# collect files that contain permission specifications
-#
-# 1. central fixed permissions file
-files="/etc/permissions"
-
-# 2. central easy, secure paranoid as those are defined by SUSE
-for level in $PERMISSION_SECURITY; do
- case "$level" in
- easy|secure|paranoid)
- if [ -e /etc/permissions.$level ]; then
- files="$files /etc/permissions.$level"
- fi
- ;;
- esac
-done
-
-# 3. package specific permissions
-pkgfiles=(/etc/permissions.d/*)
-pkgfiles=(${pkgfiles[*]##*/})
-pkgfiles=(${pkgfiles[*]%%.*})
-pkgfiles=(`for i in ${pkgfiles[@]}; do echo $i; done | /usr/bin/sort -u`)
-
-for file in ${pkgfiles[@]}; do
- file=/etc/permissions.d/$file
- [ -e $file ] && files="$files $file"
- for level in $PERMISSION_SECURITY; do
- [ -e $file.$level ] && files="$files $file.$level"
- done
-done
-
-# 4. central permissions files with user defined level incl 'local'
-for level in $PERMISSION_SECURITY; do
- case "$level" in
- easy|secure|paranoid) continue ;;
- esac
- if [ -e /etc/permissions.$level ]; then
- files="$files /etc/permissions.$level"
- fi
-done
-
-/usr/bin/chkstat $mode $files
+/usr/bin/chkstat --suseconfig $mode
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/checkpermissionfiles.pl new/permissions-2010.11.09.1206/checkpermissionfiles.pl
--- old/permissions-2010.10.18.1537/checkpermissionfiles.pl 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/checkpermissionfiles.pl 2010-11-09 12:06:11.000000000 +0100
@@ -87,8 +87,11 @@
{
chomp;
s/#.*//;
+ s/^\s.*//;
next if(/^$/);
+ next if(/^\+/); # XXX ext line
+
my ($file, $owner, $mode) = split(/\s+/);
if(!$nodups && exists($perms{$file}{$level}))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/chkstat.8 new/permissions-2010.11.09.1206/chkstat.8
--- old/permissions-2010.10.18.1537/chkstat.8 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/chkstat.8 2010-11-09 12:06:11.000000000 +0100
@@ -3,7 +3,7 @@
.\"
.\" Author: Ruediger Oertel
.\"
-.TH CHKSTAT 8 "2008-04-17" "SUSE Linux" "Tool to check and set file permissions"
+.TH CHKSTAT 8 "2010-11-09" "SUSE Linux" "Tool to check and set file permissions"
.\"
.UC 8
.SH NAME
@@ -12,67 +12,81 @@
.SH SYNOPSIS
.\"
.B chkstat
-.RB \|[\| \-\-set|\-set ]
-.RB \|[\| \-\-noheader ]
-.RB \|[\|\|[\| \-\-examine\ file\ ] ... ]
-.RB \|[\|\|[\| \-\-files\ filelist\ ] ... ]
-.RB \|[\|\|[\| \-\-root\ directory\ ] ... ]
-.B permission-file ...
+.RB [OPTIONS]
+.B <permission-files...>
+
+.B chkstat
+.RB \-\-system
+.RB [OPTIONS]
+.B <files...>
.\"
.SH DESCRIPTION
The program
.I /usr/bin/chkstat
is a tool to check and set file permissions.
.PP
-Multiple permissions files can be given on the commandline.
-If the permission files contain multiple entries for a single
-file, the last entry found will be used.
+chkstat can either operate in system mode or on individually
+specified permission files. In system mode /etc/permissions/security
+determines which level to use and whether to actually apply
+permission changes.
.PP
.\"
-.SS General Options
+.SS OPTIONS
+.TP
+.IR \-\-system
+Run in system mode. Parses \fI/etc/sysconfig/security\fR to
+determine which security level to use (\fIPERMISSION_SECURITY\fR)
+and whether to set or merely warn about permission changes
+(\fICHECK_PERMISSIONS\fR). In system mode non-option arguments refer
+to files. Ie just as if the \-\-examine option was specified for them.
.TP
-.IR \-\-set ,\ \-set
-This option enables setting the file permissions,
-the default is to check and warn only.
+.IR \-\-set
+Actually apply the file permissions. The default is to check and
+warn only unless in system mode where \fICHECK_PERMISSIONS\fR
+specifies the default behavior.
+.TP
+.IR \-\-warn
+Opposite of --set, ie warn only but don't make actual changes
.TP
.IR \-\-noheader
Omit printing the output header lines.
.TP
+.IR \-\-fscaps,\ \-\-no\-fscaps
+Force or disable use of fscaps. Default is to automatically
+determine whether the running kernel supports fscaps.
+.TP
.IR \-\-examine\ file
-Check permissions for this file and not all files listed in the permissions files.
+Check permissions for this file instead of all files listed in the permissions files.
.TP
.IR \-\-files\ filelist
Check permissions for the files listed in
.IR filelist
-and not for all files listed in the permissions files.
+and instead of all files listed in the permissions files.
.TP
.IR \-\-root\ directory
-Prefix the files given in the permissions files by this directory.
-.PP
-.SH EXAMPLE
+Check files relative to the specified directory.
.PP
-The command
+.SH EXAMPLES
.PP
-.RS
-.B chkstat -set /etc/permissions
-.RE
+.B chkstat --set /etc/permissions /etc/permissions.secure
.PP
-will parse the file /etc/permissions and set the access mode and the
-user- and group memberships each file listed. The format
-for the input file is
+parses the files /etc/permissions and /etc/permissions and sets the
+access mode and the user- and group memberships for each file listed.
.PP
-.B FILEPATH
-.B OWNER:GROUP
-.B MODE
+.B chkstat --system /bin/ping
.PP
-and wildcards are not supported for the filepath. Lines starting
-with '#' and empty lines are treated as comments.
+Run in system mode and only correct permissions of /bin/ping
+.
+.SH "SEE ALSO"
+.sp
+permissions(5)
+.
.SH COPYRIGHT
1996-2003 SuSE Linux AG, Nuernberg, Germany.
-2008 SUSE LINUX Products GmbH
+2008-2010 SUSE LINUX Products GmbH
.SH AUTHORS
-Reinhold Sojer, Ruediger Oertel, Michael Schroeder
+Reinhold Sojer, Ruediger Oertel, Michael Schroeder, Ludwig Nussel
.PP
Useful changes and additions by Tobias Burnus
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/chkstat.c new/permissions-2010.11.09.1206/chkstat.c
--- old/permissions-2010.10.18.1537/chkstat.c 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/chkstat.c 2010-11-09 12:06:11.000000000 +0100
@@ -27,9 +27,13 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <dirent.h>
+#include <sys/capability.h>
#define __USE_GNU
#include <fcntl.h>
+#define BAD_LINE() \
+ fprintf(stderr, "bad permissions line %s:%d\n", argv[i], lcnt);
struct perm {
struct perm *next;
@@ -37,6 +41,7 @@
char *owner;
char *group;
mode_t mode;
+ cap_t caps;
};
struct perm *permlist;
@@ -45,8 +50,15 @@
uid_t euid;
char *root;
int rootl;
+int nlevel;
+char** level;
+int do_set = -1;
+int default_set = 0;
+char** permfiles = NULL;
+int npermfiles = 0;
+char* force_level;
-void
+struct perm*
add_permlist(char *file, char *owner, char *group, mode_t mode)
{
struct perm *ec, **epp;
@@ -94,8 +106,10 @@
ec->owner = owner;
ec->group = group;
ec->mode = mode;
+ ec->caps = NULL;
ec->next = 0;
*epp = ec;
+ return ec;
}
int
@@ -155,10 +169,244 @@
return 1;
}
+int
+in_level(char *e)
+{
+ int i;
+ for (i = 0; i < nlevel; i++)
+ if (!strcmp(e, level[i]))
+ return 1;
+ return 0;
+}
+
+void
+ensure_array(void** array, int* size)
+{
+ if ((*size & 63) == 0)
+ {
+ if (*array == NULL)
+ *array = malloc(sizeof(char *) * (*size + 64));
+ else
+ *array = realloc(*array, sizeof(char *) * (*size + 64));
+ if (*array == NULL)
+ {
+ perror("array alloc");
+ exit(1);
+ }
+ }
+}
+
+void
+add_level(char *e)
+{
+ if (in_level(e))
+ return;
+ e = strdup(e);
+ if (e == 0)
+ {
+ perror("level entry alloc");
+ exit(1);
+ }
+ ensure_array((void**)&level, &nlevel);
+ level[nlevel++] = e;
+}
+
+static inline int isquote(char c)
+{
+ return (c == '"' || c == '\'');
+}
+
+int
+parse_sysconf(const char* file)
+{
+ FILE* fp;
+ char line[1024];
+ char* p;
+ if ((fp = fopen(file, "r")) == 0)
+ {
+ fprintf(stderr, "error opening: %s: %s\n", file, strerror(errno));
+ return 0;
+ }
+ while (readline(fp, line, sizeof(line)))
+ {
+ if (!*line)
+ continue;
+ for (p = line; *p == ' '; ++p);
+ if (!*p || *p == '#')
+ continue;
+ if (!strncmp(p, "PERMISSION_SECURITY=", 20))
+ {
+ if (force_level)
+ continue;
+
+ p+=20;
+ if (isquote(*p))
+ ++p;
+ p = strtok(p, " ");
+ if (p && !isquote(*p))
+ {
+ do
+ {
+ if (isquote(p[strlen(p)-1]))
+ {
+ p[strlen(p)-1] = '\0';
+ }
+ if (*p && strcmp(p, "local"))
+ add_level(p);
+ }
+ while ((p = strtok(NULL, " ")));
+ }
+ }
+ else if (!strncmp(p, "CHECK_PERMISSIONS=", 18))
+ {
+ p+=18;
+ if (isquote(*p))
+ ++p;
+ if (!strncmp(p, "set", 3))
+ {
+ p+=3;
+ if (isquote(*p) || !*p)
+ default_set=1;
+ }
+ else if ((!strncmp(p, "no", 2) && (!p[3] || isquote(p[3]))) || !*p || isquote(*p))
+ {
+ p+=2;
+ if (isquote(*p) || !*p)
+ {
+ default_set = -1;
+ }
+ }
+ else
+ {
+ //fprintf(stderr, "invalid value for CHECK_PERMISSIONS (must be 'set', 'warn' or 'no')\n");
+ }
+ }
+ }
+ fclose(fp);
+ return 0;
+}
+
+static int
+compare(const void* a, const void* b)
+{
+ return strcmp(*(char* const*)a, *(char* const*)b);
+}
+
+static void
+collect_permfiles()
+{
+ int i;
+ DIR* dir;
+
+ ensure_array((void**)&permfiles, &npermfiles);
+ // 1. central fixed permissions file
+ permfiles[npermfiles++] = strdup("/etc/permissions");
+
+ // 2. central easy, secure paranoid as those are defined by SUSE
+ for (i = 0; i < nlevel; ++i)
+ {
+ if (!strcmp(level[i], "easy")
+ || !strcmp(level[i], "secure")
+ || !strcmp(level[i], "paranoid"))
+ {
+ char fn[4096];
+ snprintf(fn, sizeof(fn), "/etc/permissions.%s", level[i]);
+ if (access(fn, R_OK) == 0)
+ {
+ ensure_array((void**)&permfiles, &npermfiles);
+ permfiles[npermfiles++] = strdup(fn);
+ }
+ }
+ }
+ // 3. package specific permissions
+ dir = opendir("/etc/permissions.d");
+ if (dir)
+ {
+ char** files = NULL;
+ int nfiles = 0;
+ struct dirent* d;
+ while ((d = readdir(dir)))
+ {
+ char* p;
+ if (!strcmp("..", d->d_name) || !strcmp(".", d->d_name))
+ continue;
+ ensure_array((void**)&files, &nfiles);
+ if ((p = strchr(d->d_name, '.')))
+ {
+ *p = '\0';
+ }
+ files[nfiles++] = strdup(d->d_name);
+ }
+ closedir(dir);
+ if (nfiles)
+ {
+ qsort(files, nfiles, sizeof(char*), compare);
+ for (i = 0; i < nfiles; ++i)
+ {
+ char fn[4096];
+ int l;
+ // skip duplicates
+ if (i && !strcmp(files[i-1], files[i]))
+ continue;
+
+ snprintf(fn, sizeof(fn), "/etc/permissions.d/%s", files[i]);
+ if (access(fn, R_OK) == 0)
+ {
+ ensure_array((void**)&permfiles, &npermfiles);
+ permfiles[npermfiles++] = strdup(fn);
+ }
+
+ for (l = 0; l < nlevel; ++l)
+ {
+ snprintf(fn, sizeof(fn), "/etc/permissions.d/%s.%s", files[i], level[l]);
+
+ if (access(fn, R_OK) == 0)
+ {
+ ensure_array((void**)&permfiles, &npermfiles);
+ permfiles[npermfiles++] = strdup(fn);
+ }
+ }
+
+ }
+ }
+ }
+ // 4. central permissions files with user defined level incl 'local'
+ for (i = 0; i < nlevel; ++i)
+ {
+ char fn[4096];
+
+ if (!strcmp(level[i], "easy") || !strcmp(level[i], "secure") || !strcmp(level[i], "paranoid"))
+ continue;
+
+ snprintf(fn, sizeof(fn), "/etc/permissions.%s", level[i]);
+ if (access(fn, R_OK) == 0)
+ {
+ ensure_array((void**)&permfiles, &npermfiles);
+ permfiles[npermfiles++] = strdup(fn);
+ }
+ }
+}
+
+
void
usage(int x)
{
- fprintf(stderr, "Usage: chkstat [--set] [--noheader] [[--examine file] ...] [ [--files filelist] ...] permission-file ...\n");
+ printf("Usage:\n"
+"a) chkstat [OPTIONS] <permission-files>...\n"
+"b) chkstat --system [OPTIONS] <files>...\n"
+"\n"
+"Options:\n"
+" --set apply changes\n"
+" --warn only tell which changes are needed\n"
+" --noheader don't print intro message\n"
+" --fscaps force use of fscaps\n"
+" --no-fscaps disable use of fscaps\n"
+" --system system mode, act according to /etc/permissions/security\n"
+" --level LEVEL force use LEVEL (only with --system)\n"
+" --examine FILE apply to specified file only\n"
+" --files FILELIST read list of files to apply from FILELIST\n"
+" --root DIR check files relative to DIR\n"
+);
exit(x);
}
@@ -173,7 +421,7 @@
lcnt = 0;
l2 = strlen(path);
- if (l2 >= sizeof(pathbuf))
+ if ((unsigned)l2 >= sizeof(pathbuf))
return 0;
strcpy(pathbuf, path);
if (pathbuf[0] != '/')
@@ -192,11 +440,11 @@
if (++lcnt >= 256)
return 0;
l = readlink(pathbuf, linkbuf, sizeof(linkbuf));
- if (l <= 0 || l >= sizeof(linkbuf))
+ if (l <= 0 || (unsigned)l >= sizeof(linkbuf))
return 0;
while(l && linkbuf[l - 1] == '/')
l--;
- if (l + 1 >= sizeof(linkbuf))
+ if ((unsigned)l + 1 >= sizeof(linkbuf))
return 0;
linkbuf[l++] = '/';
linkbuf[l] = 0;
@@ -228,7 +476,7 @@
l2 -= (p - p2);
p = p2;
}
- if (l + l2 >= sizeof(pathbuf))
+ if ((unsigned)(l + l2) >= sizeof(pathbuf))
return 0;
memmove(p + l, p, pathbuf + l2 - p + 1);
memmove(p, linkbuf, l);
@@ -261,13 +509,39 @@
}
}
+/* that's really ugly. There should be sysctl or something */
+static int
+check_fscaps_cmdline()
+{
+ FILE* fp;
+ char line[4096];
+ if ((fp = fopen("/proc/cmdline", "r")) == 0)
+ {
+ return 0;
+ }
+ if (readline(fp, line, sizeof(line)))
+ {
+ char* p;
+ if ((p = strstr(line, "file_caps")))
+ {
+ if (p - line < 3 || strncmp("no_", p, 3))
+ {
+ return 1;
+ }
+ }
+ }
+ fclose(fp);
+ return 0;
+}
+
int
main(int argc, char **argv)
{
- char *opt, *p;
- int set = 0;
+ char *opt, *p, *str;
int told = 0;
int use_checklist = 0;
+ int systemmode = 0;
+ int suseconfig = 0;
FILE *fp;
char line[512];
char *part[4];
@@ -282,6 +556,8 @@
gid_t gid;
int fd, r;
int errors = 0;
+ cap_t caps = NULL;
+ int have_fscaps = -1;
while (argc > 1)
{
@@ -290,9 +566,46 @@
break;
if (*opt == '-' && opt[1] == '-')
opt++;
+ if (!strcmp(opt, "-system"))
+ {
+ argc--;
+ argv++;
+ systemmode = 1;
+ continue;
+ }
+ // hidden option for use by suseconfig only
+ if (!strcmp(opt, "-suseconfig"))
+ {
+ argc--;
+ argv++;
+ suseconfig = 1;
+ systemmode = 1;
+ continue;
+ }
+ if (!strcmp(opt, "-fscaps"))
+ {
+ argc--;
+ argv++;
+ have_fscaps = 1;
+ continue;
+ }
+ if (!strcmp(opt, "-no-fscaps"))
+ {
+ argc--;
+ argv++;
+ have_fscaps = 0;
+ continue;
+ }
if (!strcmp(opt, "-s") || !strcmp(opt, "-set"))
{
- set = 1;
+ do_set=1;
+ argc--;
+ argv++;
+ continue;
+ }
+ if (!strcmp(opt, "-warn"))
+ {
+ do_set=0;
argc--;
argv++;
continue;
@@ -319,6 +632,20 @@
argv++;
continue;
}
+ if (!strcmp(opt, "-level"))
+ {
+ argc--;
+ argv++;
+ if (argc == 1)
+ {
+ fprintf(stderr, "level: argument required\n");
+ exit(1);
+ }
+ force_level = argv[1];
+ argc--;
+ argv++;
+ continue;
+ }
if (!strcmp(opt, "-f") || !strcmp(opt, "-files"))
{
argc--;
@@ -369,18 +696,78 @@
usage(!strcmp(opt, "-h") || !strcmp(opt, "-help") ? 0 : 1);
break;
}
- if (argc <= 1)
+
+ if (have_fscaps == -1)
+ have_fscaps = check_fscaps_cmdline();
+
+ if (systemmode)
+ {
+ const char file[] = "/etc/sysconfig/security";
+ parse_sysconf(file);
+ if(do_set == -1)
+ {
+ if (default_set < 0)
+ {
+ fprintf(stderr, "permissions handling disabled in %s\n", file);
+ exit(0);
+ }
+ if (suseconfig && default_set)
+ {
+ char* module = getenv("ONLY_MODULE");
+ if (!module || strcmp(module, "permissions"))
+ {
+ puts("no permissions will be changed if not called explicitly");
+ default_set = 0;
+ }
+ }
+ do_set = default_set;
+ }
+ if (force_level)
+ {
+ char *p = strtok(force_level, " ");
+ do
+ {
+ add_level(p);
+ }
+ while ((p = strtok(NULL, " ")));
+ }
+
+ if (!nlevel)
+ add_level("secure");
+ add_level("local"); // always add local
+
+ for (i = 1; i < argc; i++)
+ {
+ add_checklist(argv[i]);
+ use_checklist = 1;
+ continue;
+ }
+ collect_permfiles();
+ }
+ else if (argc <= 1)
usage(1);
- for (i = 1; i < argc; i++)
+ else
{
- if ((fp = fopen(argv[i], "r")) == 0)
+ npermfiles = argc-1;
+ permfiles = &argv[1];
+ }
+
+ if (do_set == -1)
+ do_set = 0;
+
+ for (i = 0; i < npermfiles; i++)
+ {
+ if ((fp = fopen(permfiles[i], "r")) == 0)
{
perror(argv[i]);
exit(1);
}
lcnt = 0;
+ struct perm* last = NULL;
+ int extline;
while (readline(fp, line, sizeof(line)))
{
+ extline = 0;
lcnt++;
if (*line == 0 || *line == '#' || *line == '$')
continue;
@@ -398,6 +785,11 @@
}
continue;
}
+ if (pcnt == 0 && !inpart && *p == '+')
+ {
+ extline = 1;
+ break;
+ }
if (!inpart)
{
inpart = 1;
@@ -406,11 +798,34 @@
part[pcnt] = p;
}
}
+ if (extline)
+ {
+ if (!last)
+ {
+ BAD_LINE();
+ continue;
+ }
+ if (!strncmp(p, "+capabilities ", 14))
+ {
+ if (!have_fscaps)
+ continue;
+ p += 14;
+ caps = cap_from_text(p);
+ if (caps)
+ {
+ cap_free(last->caps);
+ last->caps = caps;
+ }
+ continue;
+ }
+ BAD_LINE();
+ continue;
+ }
if (inpart)
pcnt++;
if (pcnt != 3)
{
- fprintf(stderr, "bad permissions line %s:%d\n", argv[i], lcnt);
+ BAD_LINE();
continue;
}
part[3] = part[2];
@@ -419,17 +834,17 @@
part[2] = strchr(part[1], '.');
if (!part[2])
{
- fprintf(stderr, "bad permissions line %s:%d\n", argv[i], lcnt);
+ BAD_LINE();
continue;
}
*part[2]++ = 0;
mode = strtoul(part[3], part + 3, 8);
if (mode > 07777 || part[3][0])
{
- fprintf(stderr, "bad permissions line %s:%d\n", argv[i], lcnt);
+ BAD_LINE();
continue;
}
- add_permlist(part[0], part[1], part[2], mode);
+ last = add_permlist(part[0], part[1], part[2], mode);
}
fclose(fp);
}
@@ -445,33 +860,74 @@
continue;
if ((!pwd || strcmp(pwd->pw_name, e->owner)) && (pwd = getpwnam(e->owner)) == 0)
{
- fprintf(stderr, "%s: unknown user %s\n", e->file, e->owner);
+ fprintf(stderr, "%s: unknown user %s\n", e->file+rootl, e->owner);
continue;
}
if ((!grp || strcmp(grp->gr_name, e->group)) && (grp = getgrnam(e->group)) == 0)
{
- fprintf(stderr, "%s: unknown group %s\n", e->file, e->group);
+ fprintf(stderr, "%s: unknown group %s\n", e->file+rootl, e->group);
continue;
}
uid = pwd->pw_uid;
gid = grp->gr_gid;
- if ((stb.st_mode & 07777) == e->mode && stb.st_uid == uid && stb.st_gid == gid)
+ caps = cap_get_file(e->file);
+ if (!caps)
+ {
+ cap_free(caps);
+ caps = NULL;
+ if (errno == EOPNOTSUPP)
+ {
+ //fprintf(stderr, "%s: fscaps not supported\n", e->file+rootl);
+ cap_free(e->caps);
+ e->caps = NULL;
+ }
+ }
+ if (e->caps)
+ {
+ e->mode &= 0777;
+ }
+
+ int perm_ok = (stb.st_mode & 07777) == e->mode;
+ int owner_ok = stb.st_uid == uid && stb.st_gid == gid;
+ int caps_ok = 0;
+
+ if (!caps && !e->caps)
+ caps_ok = 1;
+ else if (caps && e->caps && !cap_compare(e->caps, caps))
+ caps_ok = 1;
+
+ if (perm_ok && owner_ok && caps_ok)
continue;
if (!told)
{
told = 1;
printf("Checking permissions and ownerships - using the permissions files\n");
- for (i = 1; i < argc; i++)
- printf("\t%s\n", argv[i]);
+ for (i = 0; i < npermfiles; i++)
+ printf("\t%s\n", permfiles[i]);
+ if (!have_fscaps)
+ {
+ printf("fscaps support disabled (file_caps missing in /proc/cmdline).\n");
+ }
+ if (rootl)
+ {
+ printf("Using root %s\n", root);
+ }
}
- if (!set)
- printf("%s should be %s:%s %04o.", e->file, e->owner, e->group, e->mode);
+ if (!do_set)
+ printf("%s should be %s:%s %04o", e->file+rootl, e->owner, e->group, e->mode);
else
- printf("setting %s to %s:%s %04o.", e->file, e->owner, e->group, e->mode);
- printf(" (wrong");
- if (stb.st_uid != uid || stb.st_gid != gid)
+ printf("setting %s to %s:%s %04o", e->file+rootl, e->owner, e->group, e->mode);
+
+ if (!caps_ok && e->caps)
+ {
+ str = cap_to_text(e->caps, NULL);
+ printf(" \"%s\"", str);
+ cap_free(str);
+ }
+ printf(". (wrong");
+ if (!owner_ok)
{
pwd = getpwuid(stb.st_uid);
grp = getgrgid(stb.st_gid);
@@ -486,12 +942,29 @@
pwd = 0;
grp = 0;
}
- if ((stb.st_mode & 07777) != e->mode)
+
+ if (!perm_ok)
printf(" permissions %04o", (int)(stb.st_mode & 07777));
+
+ if (!caps_ok)
+ {
+ if (!perm_ok || !owner_ok)
+ {
+ fputc(',', stdout);
+ }
+ if (caps)
+ {
+ str = cap_to_text(caps, NULL);
+ printf(" capabilities \"%s\"", str);
+ cap_free(str);
+ }
+ else
+ fputs(" missing capabilities", stdout);
+ }
putchar(')');
putchar('\n');
- if (!set)
+ if (!do_set)
continue;
fd = -1;
@@ -518,13 +991,13 @@
continue;
if (stb.st_mode != stb2.st_mode || stb.st_nlink != stb2.st_nlink || stb.st_dev != stb2.st_dev || stb.st_ino != stb2.st_ino)
{
- fprintf(stderr, "%s: too fluctuating\n", e->file);
+ fprintf(stderr, "%s: too fluctuating\n", e->file+rootl);
errors++;
continue;
}
if (stb.st_nlink > 1 && !safepath(e->file, 0, 0))
{
- fprintf(stderr, "%s: on an insecure path\n", e->file);
+ fprintf(stderr, "%s: on an insecure path\n", e->file+rootl);
errors++;
continue;
}
@@ -533,27 +1006,31 @@
/* extra checks for s-bits */
if (!safepath(e->file, (e->mode & 02000) == 0 ? uid : 0, (e->mode & 04000) == 0 ? gid : 0))
{
- fprintf(stderr, "%s: will not give away s-bits on an insecure path\n", e->file);
+ fprintf(stderr, "%s: will not give away s-bits on an insecure path\n", e->file+rootl);
errors++;
continue;
}
}
}
- else if (strncmp(e->file, "/dev/", 4) != 0)
+ else if (strncmp(e->file, "/dev/", 5) != 0) // handle special files only in /dev
{
- fprintf(stderr, "%s: don't know what to do with that type of file\n", e->file);
+ fprintf(stderr, "%s: don't know what to do with that type of file\n", e->file+rootl);
errors++;
continue;
}
- if (euid == 0 && (stb.st_uid != uid || stb.st_gid != gid))
+ if (euid == 0 && !owner_ok)
{
+ /* if we change owner or group of a setuid file the bit gets reset so
+ also set perms again */
+ if (e->mode & 06000)
+ perm_ok = 0;
if (fd >= 0)
r = fchown(fd, uid, gid);
else
r = chown(e->file, uid, gid);
if (r)
{
- fprintf(stderr, "%s: chown: %s\n", e->file, strerror(errno));
+ fprintf(stderr, "%s: chown: %s\n", e->file+rootl, strerror(errno));
errors++;
}
if (fd >= 0)
@@ -562,12 +1039,12 @@
r = lstat(e->file, &stb);
if (r)
{
- fprintf(stderr, "%s: too fluctuating\n", e->file);
+ fprintf(stderr, "%s: too fluctuating\n", e->file+rootl);
errors++;
continue;
}
}
- if ((stb.st_mode & 07777) != e->mode)
+ if (!perm_ok)
{
if (fd >= 0)
r = fchmod(fd, e->mode);
@@ -575,7 +1052,19 @@
r = chmod(e->file, e->mode);
if (r)
{
- fprintf(stderr, "%s: chmod: %s\n", e->file, strerror(errno));
+ fprintf(stderr, "%s: chmod: %s\n", e->file+rootl, strerror(errno));
+ errors++;
+ }
+ }
+ if (!caps_ok)
+ {
+ if (fd >= 0)
+ r = cap_set_fd(fd, e->caps);
+ else
+ r = cap_set_file(e->file, e->caps);
+ if (r)
+ {
+ fprintf(stderr, "%s: cap_set_file: %s\n", e->file+rootl, strerror(errno));
errors++;
}
}
@@ -589,3 +1078,5 @@
}
exit(0);
}
+
+// vim: sw=4 cino+={.5s,n-.5s,^-.5s
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/permissions.5 new/permissions-2010.11.09.1206/permissions.5
--- old/permissions-2010.10.18.1537/permissions.5 1970-01-01 01:00:00.000000000 +0100
+++ new/permissions-2010.11.09.1206/permissions.5 2010-11-09 12:06:11.000000000 +0100
@@ -0,0 +1,48 @@
+.TH "PERMISSIONS" "5" "07/11/2010" "" ""
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+permission - default permission settings
+.SH "SYNOPSIS"
+The chkstat program sets permissions and ownerships according to the
+permission files\.
+.SH "DESCRIPTION"
+\- The files /etc/permissions\.* are line based and space delimited\.
+.br
+\- Lines starting with # are comments\.
+.br
+\- The first column specifies the file name\. Directory names have to
+end with a slash\.
+.br
+\- The second column specifies the owner and group\.
+.br
+\- The third column specifies the file mode\.
+.br
+\- The special value \fB+capabilities\fR in the first column extends
+the information of the previous line with with file capabilites.
+.br
+.SH "FILES"
+.sp
+/etc/permissions
+.br
+/etc/permissions\.easy
+.br
+/etc/permissions\.secure
+.br
+/etc/permissions\.paranoid
+.br
+/etc/permissions\.d/*
+.br
+/etc/permissions\.local
+.br
+.SH "SEE ALSO"
+chkstat(8)
+.sp
+.SH "AUTHOR"
+Written by Ludwig Nussel
+.sp
+.SH "REPORTING BUGS"
+Report bugs to https://bugzilla\.novell\.com/
+.sp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/permissions.easy new/permissions-2010.11.09.1206/permissions.easy
--- old/permissions-2010.10.18.1537/permissions.easy 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/permissions.easy 2010-11-09 12:06:11.000000000 +0100
@@ -197,7 +197,9 @@
# networking (need root for the privileged socket)
#
/bin/ping root:root 4755
+ +capabilities cap_net_raw=ep
/bin/ping6 root:root 4755
+ +capabilities cap_net_raw=ep
# mtr is linked against ncurses. For dialout only.
/usr/sbin/mtr root:dialout 4750
/usr/bin/rcp root:root 4755
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/permissions-2010.10.18.1537/permissions.secure new/permissions-2010.11.09.1206/permissions.secure
--- old/permissions-2010.10.18.1537/permissions.secure 2010-10-18 15:37:12.000000000 +0200
+++ new/permissions-2010.11.09.1206/permissions.secure 2010-11-09 12:06:11.000000000 +0100
@@ -235,7 +235,9 @@
# networking (need root for the privileged socket)
#
/bin/ping root:root 4755
+ +capabilities cap_net_raw=ep
/bin/ping6 root:root 4755
+ +capabilities cap_net_raw=ep
# mtr is linked against ncurses. no suid bit, for root only:
/usr/sbin/mtr root:dialout 0755
/usr/bin/rcp root:root 4755
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package pixmap for openSUSE:Factory
checked in at Wed Nov 10 20:21:42 CET 2010.
--------
--- pixmap/pixmap.changes 2010-03-25 19:19:55.000000000 +0100
+++ pixmap/pixmap.changes 2010-11-08 15:12:28.000000000 +0100
@@ -1,0 +2,5 @@
+Mon Nov 8 14:12:20 UTC 2010 - coolo(a)novell.com
+
+- remove support for pre-9.1
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ pixmap.spec ++++++
--- /var/tmp/diff_new_pack.hAezfI/_old 2010-11-10 20:18:02.000000000 +0100
+++ /var/tmp/diff_new_pack.hAezfI/_new 2010-11-10 20:18:02.000000000 +0100
@@ -27,7 +27,7 @@
Conflicts: mmextra
AutoReqProv: on
Version: 2.6
-Release: 126
+Release: 134
Provides: pixmp = %version
Obsoletes: pixmp <= %version
Summary: XPM Pixel Editor for the X Window System
@@ -49,14 +49,6 @@
bitmaps). You can use them with every commonly used iconmanager and
even incorporate them in your own desktop environment.
-
-
-Authors:
---------
- Lionel Mallet <pixmap(a)sophia.inria.fr>
- Tim Wise <pixmap(a)sophia.inria.fr>
-
-%if "%(xft-config --prefix)" == "/usr"
%define _xorg7libs %_lib
%define _xorg7libs32 lib
%define _xorg7bin bin
@@ -68,19 +60,6 @@
%define _xorg7_serverincl /usr/include/xorg
%define _xorg7_fonts /usr/share/fonts
%define _xorg7_prefix /usr
-%else
-%define _xorg7libs X11R6/%_lib
-%define _xorg7libs32 X11R6/lib
-%define _xorg7bin X11R6/bin
-%define _xorg7_mandir /usr/X11R6/man
-%define _xorg7pixmaps X11R6/include
-%define _xorg7libshare X11R6/lib/
-%define _xorg7_xkb /etc/X11/xkb
-%define _xorg7_termcap /usr/X11R6/lib/X11/etc
-%define _xorg7_serverincl /usr/X11R6/lib/Server/include
-%define _xorg7_fonts /usr/X11R6/lib/X11/fonts
-%define _xorg7_prefix /usr/X11R6
-%endif
%prep
%setup -n pixmap
@@ -92,9 +71,7 @@
%patch5
%patch6
# use this patch only if new X.org 7.x or higher is present
-%if "%(xft-config --prefix)" == "/usr"
%patch7
-%endif
# contains data used for earlier versions of X.
rm -rf X11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package python-bsddb3 for openSUSE:Factory
checked in at Wed Nov 10 20:17:42 CET 2010.
--------
--- python-bsddb3/python-bsddb3.changes 2010-09-29 12:10:00.000000000 +0200
+++ python-bsddb3/python-bsddb3.changes 2010-11-10 13:44:34.000000000 +0100
@@ -1,0 +2,5 @@
+Wed Nov 10 12:44:22 UTC 2010 - coolo(a)novell.com
+
+- fix file list
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-bsddb3.spec ++++++
--- /var/tmp/diff_new_pack.hQKCwl/_old 2010-11-10 20:17:29.000000000 +0100
+++ /var/tmp/diff_new_pack.hQKCwl/_new 2010-11-10 20:17:29.000000000 +0100
@@ -20,7 +20,7 @@
Name: python-bsddb3
Version: 5.0.0
-Release: 4
+Release: 5
Summary: Python interface for Berkeley DB
Url: http://pypi.python.org/pypi/bsddb3
License: MIT License
@@ -44,7 +44,7 @@
python setup.py build
%install
-python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
+python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT --record-rpm=INSTALLED_FILES
%clean
rm -rf %{buildroot}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package python-cerealizer for openSUSE:Factory
checked in at Wed Nov 10 20:16:23 CET 2010.
--------
--- python-cerealizer/python-cerealizer.changes 2010-06-22 15:05:58.000000000 +0200
+++ python-cerealizer/python-cerealizer.changes 2010-11-10 13:47:23.000000000 +0100
@@ -1,0 +2,5 @@
+Wed Nov 10 12:44:55 UTC 2010 - coolo(a)novell.com
+
+- fix file list
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-cerealizer.spec ++++++
--- /var/tmp/diff_new_pack.yOBPxH/_old 2010-11-10 20:16:17.000000000 +0100
+++ /var/tmp/diff_new_pack.yOBPxH/_new 2010-11-10 20:16:17.000000000 +0100
@@ -20,7 +20,7 @@
Name: python-cerealizer
Version: 0.7
-Release: 1
+Release: 4
Summary: A secure pickle-like module
Url: http://pypi.python.org/pypi/Cerealizer
License: Python Software Foundation License
@@ -45,7 +45,7 @@
python setup.py build
%install
-python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
+python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT --record-rpm=INSTALLED_FILES
%clean
rm -rf %{buildroot}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0