public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2012-04-23  3:02 Christian Ruppert
  0 siblings, 0 replies; 20+ messages in thread
From: Christian Ruppert @ 2012-04-23  3:02 UTC (permalink / raw
  To: gentoo-commits

commit:     430f15ddbd8405d7e82a332cbd9c242405923800
Author:     Christian Ruppert <idl0r <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 23 02:24:09 2012 +0000
Commit:     Christian Ruppert <idl0r <AT> gentoo <DOT> org>
CommitDate: Mon Apr 23 02:24:09 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=430f15dd

More cleanup

---
 src/ekeyword/ekeyword |   13 ++++++-------
 1 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/ekeyword/ekeyword b/src/ekeyword/ekeyword
index 0c68773..5f94fc6 100755
--- a/src/ekeyword/ekeyword
+++ b/src/ekeyword/ekeyword
@@ -112,7 +112,6 @@ for my $f (@ARGV) {
 
 	open(my $fh_in, "<", $f) or die "Can't read $f: $!\n";
 	open(my $fh_out, ">", "${f}.new") or die "Can't create ${f}.new: ${!}\n";
-	select($fh_out);
 
 	my $count = 0;
 	while(<$fh_in>) {
@@ -121,10 +120,10 @@ for my $f (@ARGV) {
 	seek($fh_in, 0, 0);
 
 	while (<$fh_in>) {
-		if (/^\s*KEYWORDS=/) {
+		if (m/^\s*KEYWORDS=/) {
 
 			# extract the quoted section from KEYWORDS
-			while (not /^\s*KEYWORDS=["'].*?["']/) {
+			while (not m/^\s*KEYWORDS=["'].*?["']/) {
 				chomp;
 				my $next = <$fh_in>;
 				$_ = join " ", $_, $next;
@@ -134,7 +133,7 @@ for my $f (@ARGV) {
 			if($count > 1 && length($quoted) eq 0) {
 				# Skip empty KEYWORDS variables in case they occur more than
 				# once, bug 321475.
-				print $_;
+				print $fh_out $_;
 				next;
 			}
 
@@ -218,15 +217,15 @@ for my $f (@ARGV) {
 			# re-insert quoted to KEYWORDS
 			s/(["']).*?["']/$1$quoted$1/;
 
-			print $_ or die "Can't write $f.new: $!\n";
+			print $fh_out $_ or die "Can't write $f.new: $!\n";
 		} else {
-			print, next;
+			print $fh_out $_;
+			next;
 		}
 	}
 
 	close($fh_in);
 	close($fh_out);
-	select STDOUT;
 
 	system("diff -U 0 ${f} ${f}.new");
 	rename("$f.new", "$f") or die "Can't rename: $!\n";



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2012-04-23  3:02 Christian Ruppert
  0 siblings, 0 replies; 20+ messages in thread
From: Christian Ruppert @ 2012-04-23  3:02 UTC (permalink / raw
  To: gentoo-commits

commit:     7d28b4f65d8c6964b9493eb46815522d6d72df8e
Author:     Christian Ruppert <idl0r <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 23 02:47:23 2012 +0000
Commit:     Christian Ruppert <idl0r <AT> gentoo <DOT> org>
CommitDate: Mon Apr 23 02:47:23 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=7d28b4f6

More cleanup

---
 src/ekeyword/ekeyword |   31 ++++++++++++++++---------------
 1 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/src/ekeyword/ekeyword b/src/ekeyword/ekeyword
index 5f94fc6..d680e26 100755
--- a/src/ekeyword/ekeyword
+++ b/src/ekeyword/ekeyword
@@ -93,6 +93,7 @@ get_architectures();
 get_architectures_status();
 
 my $files = 0;
+my $line;
 for my $f (@ARGV) {
 	if ($f =~ m/$kw_re/o) {
 		my $arch = $2;
@@ -104,7 +105,7 @@ for my $f (@ARGV) {
 			}
 		}
 
-		push @kw, $f;
+		push(@kw, $f);
 		next;
 	}
 
@@ -114,26 +115,26 @@ for my $f (@ARGV) {
 	open(my $fh_out, ">", "${f}.new") or die "Can't create ${f}.new: ${!}\n";
 
 	my $count = 0;
-	while(<$fh_in>) {
-		$count++ if m/^\s*KEYWORDS=/;
+	while($line = <$fh_in>) {
+		$count++ if $line =~ m/^\s*KEYWORDS=/;
 	}
 	seek($fh_in, 0, 0);
 
-	while (<$fh_in>) {
-		if (m/^\s*KEYWORDS=/) {
+	while ($line = <$fh_in>) {
+		if ($line =~ m/^\s*KEYWORDS=/) {
 
 			# extract the quoted section from KEYWORDS
-			while (not m/^\s*KEYWORDS=["'].*?["']/) {
-				chomp;
+			while ($line !~ m/^\s*KEYWORDS=["'](?:.+)?["']/) {
+				chomp($line);
 				my $next = <$fh_in>;
-				$_ = join " ", $_, $next;
+				$line = join(" ", $line, $next);
 			}
-			(my $quoted = $_) =~ s/^.*?["'](.*?)["'].*/$1/s;
+			(my $quoted = $line) =~ s/^.*?["'](.*?)["'].*/$1/s;
 
 			if($count > 1 && length($quoted) eq 0) {
 				# Skip empty KEYWORDS variables in case they occur more than
 				# once, bug 321475.
-				print $fh_out $_;
+				print $fh_out $line;
 				next;
 			}
 
@@ -145,7 +146,7 @@ for my $f (@ARGV) {
 
 				# handle -* and ^*
 				if (defined $star) {
-					$leader = substr $star,0,1;
+					$leader = substr($star, 0, 1);
 					$arch = 'STAR';
 				}
 
@@ -212,14 +213,14 @@ for my $f (@ARGV) {
 				$sa =~ s/([a-z0-9]+)-([a-z0-9]*)/$2-$1/g;
 				$sb =~ s/([a-z0-9]+)-([a-z0-9]*)/$2-$1/g;
 				$sa cmp $sb;
-			} split " ", $quoted;
+			} split(/\s+/, $quoted);
 
 			# re-insert quoted to KEYWORDS
-			s/(["']).*?["']/$1$quoted$1/;
+			$line =~ s/(["']).*?["']/$1$quoted$1/;
 
-			print $fh_out $_ or die "Can't write $f.new: $!\n";
+			print $fh_out $line or die "Can't write $f.new: $!\n";
 		} else {
-			print $fh_out $_;
+			print $fh_out $line;
 			next;
 		}
 	}



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-01-20  6:17 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-01-20  6:17 UTC (permalink / raw
  To: gentoo-commits

commit:     14522d53c0088a0087376366f2b09c32704e791d
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 20 06:15:33 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jan 20 06:15:33 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=14522d53

ekeyword: make sure ~all does not expand into entire arch list

---
 src/ekeyword/ekeyword.py          | 2 +-
 src/ekeyword/ekeyword_unittest.py | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 37a25ee..b53daef 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -146,7 +146,7 @@ def process_keywords(keywords, ops, arch_status=None):
 				# Process all possible keywords.  We use the arch_status as a
 				# master list.  If it lacks some keywords, then we might miss
 				# somethings here, but not much we can do.
-				arches = set(arch_status.keys()) | old_arches
+				arches = old_arches
 		else:
 			arches = (oarch,)
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 9ccde0e..a1d8d85 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -169,6 +169,9 @@ class TestProcessKeywords(unittest.TestCase):
 			'arm': 'stable',
 			'arm64': 'exp',
 			'm68k': 'dev',
+			'mips': 'dev',
+			's390': 'dev',
+			'sh': 'dev',
 		}
 		self._test('alpha arm arm64 m68k mips arm-linux', ops,
 		           '~alpha ~arm ~arm64 ~m68k ~mips ~arm-linux', arch_status)


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-01-20 16:29 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-01-20 16:29 UTC (permalink / raw
  To: gentoo-commits

commit:     b7014219ba7425daa9fafda82fafcc129f8628ce
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 20 16:24:53 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jan 20 16:24:53 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=b7014219

ekeyword: fix keyword sorting between platforms

We need to sort first upon the platform (part after the '-') before we
look at the arch at all.

Reported-by: Ulrich Mueller <ulm <AT> gentoo.org>

---
 src/ekeyword/ekeyword             |  1 +
 src/ekeyword/ekeyword.py          | 24 ++++++++++++++++--------
 src/ekeyword/ekeyword_unittest.py |  9 ++++++++-
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/src/ekeyword/ekeyword b/src/ekeyword/ekeyword
new file mode 120000
index 0000000..8374306
--- /dev/null
+++ b/src/ekeyword/ekeyword
@@ -0,0 +1 @@
+ekeyword.py
\ No newline at end of file

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index b53daef..66cf48a 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -78,15 +78,23 @@ def sort_keywords(arches):
 		a1 = keyword_to_arch(a1)
 		a2 = keyword_to_arch(a2)
 
-		# If a keyword has a "-" in it, then it always comes after ones
-		# that do not.  We want things like alpha/mips/sparc showing up
-		# before amd64-fbsd and amd64-linux.
-		if '-' in a1 and not '-' in a2:
-			return 1
-		elif '-' not in a1 and '-' in a2:
-			return -1
+		# A keyword may have a "-" in it.  We split on that and sort
+		# by the two resulting items.  The part after the hyphen is
+		# the primary key.
+		if '-' in a1:
+			arch1, plat1 = a1.split('-', 1)
 		else:
-			return cmp(a1, a2)
+			arch1, plat1 = a1, ''
+		if '-' in a2:
+			arch2, plat2 = a2.split('-', 1)
+		else:
+			arch2, plat2 = a2, ''
+
+		ret = cmp(plat1, plat2)
+		if ret:
+			return ret
+		else:
+			return cmp(arch1, arch2)
 
 	keywords += sorted(arches, cmp=arch_cmp)
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index a1d8d85..5096c71 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -31,14 +31,21 @@ class TestSortKeywords(unittest.TestCase):
 		self._test('arm -* x86', '-* arm x86')
 		self._test('hppa ~* amd64', '~* amd64 hppa')
 
-	def testNonLinux(self):
+	def testMixedPlatform(self):
+		"""Verify core arches get sorted before all w/suffix"""
 		self._test('arm-linux alpha amd64-fbsd hppa',
 		           'alpha hppa amd64-fbsd arm-linux')
 
 	def testPrefixes(self):
+		"""Verify -/~ and such get ignored for sorting"""
 		self._test('-hppa arm ~alpha -* ~arm-linux',
 		           '-* ~alpha arm -hppa ~arm-linux')
 
+	def testPlatform(self):
+		"""Verify we sort based on platform first"""
+		self._test('x86-linux ppc-macos x86-fbsd amd64-linux amd64-fbsd',
+		           'amd64-fbsd x86-fbsd amd64-linux x86-linux ppc-macos')
+
 
 class TestDiffKeywords(unittest.TestCase):
 	"""Tests for diff_keywords"""


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-01-25 22:00 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-01-25 22:00 UTC (permalink / raw
  To: gentoo-commits

commit:     a8d9d1e301afbdd794d3a95f0ef61e78ca39edcf
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 20 20:05:18 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jan 20 20:05:18 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=a8d9d1e3

ekeyword: make quiet/verbose flags a bit more flexible

This allows for multiple levels of verbose/quiet.

---
 src/ekeyword/ekeyword.py          | 16 ++++++++--------
 src/ekeyword/ekeyword_unittest.py |  6 +++---
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 66cf48a..7a6c630 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -190,15 +190,15 @@ def process_keywords(keywords, ops, arch_status=None):
 	return new_keywords
 
 
-def process_content(ebuild, data, ops, arch_status=None, verbose=False,
-                    quiet=False, format='color-inline'):
+def process_content(ebuild, data, ops, arch_status=None, verbose=0,
+                    quiet=0, format='color-inline'):
 	"""Process |ops| for |data|"""
 	# Set up the user display style based on verbose/quiet settings.
-	if verbose:
+	if verbose > 1:
 		disp_name = ebuild
 		def logit(msg):
 			print('%s: %s' % (disp_name, msg))
-	elif quiet:
+	elif quiet > 1:
 		def logit(msg):
 			pass
 	else:
@@ -225,7 +225,7 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=False,
 			old_keywords, ops, arch_status=arch_status)
 
 		# Finally let's present the results to the user.
-		if new_keywords != old_keywords:
+		if (new_keywords != old_keywords) or verbose:
 			# Only do the diff work if something actually changed.
 			updated = True
 			old_keywords = sort_keywords(old_keywords)
@@ -256,7 +256,7 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=False,
 	return updated, content
 
 
-def process_ebuild(ebuild, ops, arch_status=None, verbose=False, quiet=False,
+def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
                    dry_run=False, format='color-inline'):
 	"""Process |ops| for |ebuild|"""
 	with open(ebuild, 'rb') as f:
@@ -369,9 +369,9 @@ def get_parser():
 		formatter_class=argparse.RawDescriptionHelpFormatter)
 	parser.add_argument('-n', '--dry-run', default=False, action='store_true',
 		help='Show what would be changed, but do not commit')
-	parser.add_argument('-v', '--verbose', default=False, action='store_true',
+	parser.add_argument('-v', '--verbose', action='count',
 		help='Be verbose while processing things')
-	parser.add_argument('-q', '--quiet', default=False, action='store_true',
+	parser.add_argument('-q', '--quiet', action='count',
 		help='Be quiet while processing things (only show errors)')
 	parser.add_argument('--format', default='auto',
 		choices=('auto', 'color-inline', 'inline', 'short-multi', 'long-multi'),

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 5096c71..00c295f 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -245,7 +245,7 @@ class TestProcessContent(unittest.TestCase):
 		self.assertFalse(updated)
 		self.assertEqual(ret, [' KEYWORDS=\n'])
 
-	def _testSmoke(self, format='color-inline', verbose=False, quiet=False):
+	def _testSmoke(self, format='color-inline', verbose=0, quiet=0):
 		ops = (
 			ekeyword.Op(None, 'arm', None),
 			ekeyword.Op('~', 'sparc', None),
@@ -256,11 +256,11 @@ class TestProcessContent(unittest.TestCase):
 
 	def testSmokeQuiet(self):
 		"""Smoke test for quiet mode"""
-		self._testSmoke(quiet=True)
+		self._testSmoke(quiet=10)
 
 	def testSmokeVerbose(self):
 		"""Smoke test for verbose mode"""
-		self._testSmoke(verbose=True)
+		self._testSmoke(verbose=10)
 
 	def testSmokeFormatColor(self):
 		"""Smoke test for color-inline format"""


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-01-25 22:00 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-01-25 22:00 UTC (permalink / raw
  To: gentoo-commits

commit:     080519f882c622f4fbd44858801b39aaad4e88ad
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 20 20:06:15 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jan 20 20:06:15 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=080519f8

ekeyword: skip known paths rather than fail

There are commonly files in an ebuild dir that we don't care about.
Issue a warning, but otherwise skip them without aborting.  This let's
you do things like:
	ekeyword x86 some-package/*

Which is nice when you know there's only one or two ebuilds in there.

---
 src/ekeyword/ekeyword.py | 37 ++++++++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 7a6c630..d8e0ed1 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -54,6 +54,10 @@ VERSION = '1.0 awesome'
 Op = collections.namedtuple('Op', ('op', 'arch', 'ref_arch'))
 
 
+def warning(msg):
+	print('warning: %s' % msg, file=sys.stderr)
+
+
 def keyword_to_arch(keyword):
 	"""Given a keyword, strip it down to its arch value
 
@@ -309,8 +313,8 @@ def load_profile_data(portdir=None, repo='gentoo'):
 	if arch_status:
 		arch_status['all'] = None
 	else:
-		print('warning: could not read profile files: %s' % arch_list, file=sys.stderr)
-		print('warning: will not be able to verify args are correct', file=sys.stderr)
+		warning('could not read profile files: %s' % arch_list)
+		warning('will not be able to verify args are correct')
 
 	return arch_status
 
@@ -334,7 +338,30 @@ def arg_to_op(arg):
 	return Op(op, arch, refarch)
 
 
-def args_to_work(args, arch_status=None, repo='gentoo'):
+def ignorable_arg(arg, quiet=0):
+	"""Whether it's ok to ignore this argument"""
+	if os.path.isdir(arg):
+		if not quiet:
+			warning('ignoring directory %s' % arg)
+		return True
+
+	WHITELIST = (
+		'Manifest',
+		'metadata.xml',
+	)
+	base = os.path.basename(arg)
+	if (base.startswith('ChangeLog') or
+	    base in WHITELIST or
+	    base.startswith('.') or
+	    base.endswith('~')):
+		if not quiet:
+			warning('ignoring file: %s' % arg)
+		return True
+
+	return False
+
+
+def args_to_work(args, arch_status=None, repo='gentoo', quiet=0):
 	"""Process |args| into a list of work itmes (ebuild/arches to update)"""
 	work = []
 	todo_arches = []
@@ -353,7 +380,7 @@ def args_to_work(args, arch_status=None, repo='gentoo'):
 			op = arg_to_op(arg)
 			if not arch_status or op.arch in arch_status:
 				todo_arches.append(op)
-			else:
+			elif not ignorable_arg(arg, quiet=quiet):
 				raise ValueError('unknown arch/argument: %s' % arg)
 
 	if todo_arches:
@@ -425,7 +452,7 @@ def main(argv):
 
 	arch_status = load_profile_data()
 	try:
-		work = args_to_work(work_args, arch_status=arch_status)
+		work = args_to_work(work_args, arch_status=arch_status, quiet=opts.quiet)
 	except ValueError as e:
 		parser.error(e)
 


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-01-25 22:00 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-01-25 22:00 UTC (permalink / raw
  To: gentoo-commits

commit:     0482abe75ed71c5d0b6bb55f0d98bf9388861c08
Author:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 25 22:00:07 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Jan 25 22:00:07 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=0482abe7

ekeyword: fix python3 compat issues

Get the unittests passing w/python-3.3.

---
 src/ekeyword/ekeyword.py | 36 ++++++++++++++----------------------
 1 file changed, 14 insertions(+), 22 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index d8e0ed1..3fa74c1 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -41,6 +41,7 @@ from __future__ import print_function
 import argparse
 import collections
 import difflib
+import io
 import os
 import re
 import sys
@@ -77,30 +78,21 @@ def sort_keywords(arches):
 			arches.remove(g)
 			keywords.append(g)
 
-	def arch_cmp(a1, a2):
+	def arch_key(keyword):
 		# Sort independent of leading marker (~ or -).
-		a1 = keyword_to_arch(a1)
-		a2 = keyword_to_arch(a2)
+		arch = keyword_to_arch(keyword)
 
 		# A keyword may have a "-" in it.  We split on that and sort
 		# by the two resulting items.  The part after the hyphen is
 		# the primary key.
-		if '-' in a1:
-			arch1, plat1 = a1.split('-', 1)
+		if '-' in arch:
+			arch, plat = arch.split('-', 1)
 		else:
-			arch1, plat1 = a1, ''
-		if '-' in a2:
-			arch2, plat2 = a2.split('-', 1)
-		else:
-			arch2, plat2 = a2, ''
+			arch, plat = arch, ''
 
-		ret = cmp(plat1, plat2)
-		if ret:
-			return ret
-		else:
-			return cmp(arch1, arch2)
+		return (plat, arch)
 
-	keywords += sorted(arches, cmp=arch_cmp)
+	keywords += sorted(arches, key=arch_key)
 
 	return keywords
 
@@ -133,8 +125,8 @@ def diff_keywords(old_keywords, new_keywords, format='color-inline'):
 
 		return output
 
-	sold = ' '.join(old_keywords)
-	snew = ' '.join(new_keywords)
+	sold = str(' '.join(old_keywords))
+	snew = str(' '.join(new_keywords))
 	s = difflib.SequenceMatcher(str.isspace, sold, snew, autojunk=False)
 	return show_diff(s)
 
@@ -263,12 +255,12 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=0,
 def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
                    dry_run=False, format='color-inline'):
 	"""Process |ops| for |ebuild|"""
-	with open(ebuild, 'rb') as f:
+	with io.open(ebuild, encoding='utf8') as f:
 		updated, content = process_content(
 			ebuild, f, ops, arch_status=arch_status,
 			verbose=verbose, quiet=quiet, format=format)
 		if updated and not dry_run:
-			with open(ebuild, 'wb') as f:
+			with io.open(ebuild, 'w', encoding='utf8') as f:
 				f.writelines(content)
 
 
@@ -396,9 +388,9 @@ def get_parser():
 		formatter_class=argparse.RawDescriptionHelpFormatter)
 	parser.add_argument('-n', '--dry-run', default=False, action='store_true',
 		help='Show what would be changed, but do not commit')
-	parser.add_argument('-v', '--verbose', action='count',
+	parser.add_argument('-v', '--verbose', action='count', default=0,
 		help='Be verbose while processing things')
-	parser.add_argument('-q', '--quiet', action='count',
+	parser.add_argument('-q', '--quiet', action='count', default=0,
 		help='Be quiet while processing things (only show errors)')
 	parser.add_argument('--format', default='auto',
 		choices=('auto', 'color-inline', 'inline', 'short-multi', 'long-multi'),


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-01-27 23:14 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-01-27 23:14 UTC (permalink / raw
  To: gentoo-commits

commit:     465c0532f88df7bf3af08e84172ea5a908105fc1
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 27 23:13:43 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jan 27 23:13:43 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=465c0532

ekeyword: ignore "*" when processing "all"

Reported-by: Jeroen Roovers <jer <AT> gentoo.org>

---
 src/ekeyword/ekeyword.py          | 3 +++
 src/ekeyword/ekeyword_unittest.py | 9 ++++-----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 3fa74c1..080e04f 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -151,6 +151,9 @@ def process_keywords(keywords, ops, arch_status=None):
 				# master list.  If it lacks some keywords, then we might miss
 				# somethings here, but not much we can do.
 				arches = old_arches
+			# We ignore the glob arch as we never want to tweak it.
+			if '*' in arches:
+				arches.remove('*')
 		else:
 			arches = (oarch,)
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 00c295f..b491db0 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -176,12 +176,11 @@ class TestProcessKeywords(unittest.TestCase):
 			'arm': 'stable',
 			'arm64': 'exp',
 			'm68k': 'dev',
-			'mips': 'dev',
 			's390': 'dev',
 			'sh': 'dev',
 		}
-		self._test('alpha arm arm64 m68k mips arm-linux', ops,
-		           '~alpha ~arm ~arm64 ~m68k ~mips ~arm-linux', arch_status)
+		self._test('-* ~* * alpha arm arm64 m68k arm-linux', ops,
+		           '-* ~* * ~alpha ~arm ~arm64 ~m68k ~arm-linux', arch_status)
 
 	def testAllMultiUnstableStable(self):
 		ops = (
@@ -194,8 +193,8 @@ class TestProcessKeywords(unittest.TestCase):
 			'arm64': 'exp',
 			'm68k': 'dev',
 		}
-		self._test('alpha arm arm64 m68k', ops,
-		           '~alpha arm ~arm64 ~m68k', arch_status)
+		self._test('-* ~* * alpha arm arm64 m68k', ops,
+		           '-* ~* * ~alpha arm ~arm64 ~m68k', arch_status)
 
 
 class TestProcessContent(unittest.TestCase):


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-11-13 22:51 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2014-11-13 22:51 UTC (permalink / raw
  To: gentoo-commits

commit:     a9e7d0e7211b5f7816667e0ab9bb2c17653c890e
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 13 22:51:01 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Thu Nov 13 22:51:01 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=a9e7d0e7

ekeyword: fill out documentation and tweak API

Basically clean things up for people using ekeyword as a module.

---
 src/ekeyword/ekeyword.py | 73 +++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 63 insertions(+), 10 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 080e04f..a35d58d 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -18,22 +18,22 @@ The ^ leader instructs ekeyword to remove the specified arch.
 Examples:
 
   # Mark all existing arches in the ebuild as stable.
-  $ ekeyword all foo-1.ebuild
+  $ %(prog)s all foo-1.ebuild
 
   # Mark arm as stable and x86 as unstable.
-  $ ekeyword arm ~x86 foo-1.ebuild
+  $ %(prog)s arm ~x86 foo-1.ebuild
 
   # Mark hppa as unsupported (explicitly adds -hppa).
-  $ ekeyword -hppa foo-1.ebuild
+  $ %(prog)s -hppa foo-1.ebuild
 
   # Delete alpha keywords from all ebuilds.
-  $ ekeyword ^alpha *.ebuild
+  $ %(prog)s ^alpha *.ebuild
 
   # Mark sparc as stable for foo-1 and m68k as unstable for foo-2.
-  $ ekeyword sparc foo-1.ebuild ~m68k foo-2.ebuild
+  $ %(prog)s sparc foo-1.ebuild ~m68k foo-2.ebuild
 
   # Mark s390 as the same state as amd64.
-  $ ekeyword s390=amd64 foo-1.ebuild
+  $ %(prog)s s390=amd64 foo-1.ebuild
 """
 
 from __future__ import print_function
@@ -52,10 +52,20 @@ from portage.output import colorize, nocolor
 
 VERSION = '1.0 awesome'
 
+# Operation object that describes how to perform a change.
+# Args:
+#  op: The operation to perform when |ref_arch| is not set:
+#      None: Mark |arch| stable
+#      '-': Mark |arch| as not applicable (e.g. -foo)
+#      '~': Mark |arch| as unstable (e.g. ~foo)
+#      '^': Delete |arch| so it isn't listed at all
+#  arch: The required arch to update
+#  ref_arch: Set |arch| status to this arch (ignoring |op|)
 Op = collections.namedtuple('Op', ('op', 'arch', 'ref_arch'))
 
 
 def warning(msg):
+	"""Write |msg| as a warning to stderr"""
 	print('warning: %s' % msg, file=sys.stderr)
 
 
@@ -69,7 +79,17 @@ def keyword_to_arch(keyword):
 
 
 def sort_keywords(arches):
-	"""Sort |arches| list in the order developers expect"""
+	"""Sort |arches| list in the order developers expect
+
+	This is vaguely defined because it is kind of vaguely defined once you get
+	past the basic (Linux-only) keywords.
+
+	Args:
+	  arches: An iterable of ARCH values.
+
+	Returns:
+	  A sorted list of |arches|
+	"""
 	keywords = []
 
 	# Globs always come first.
@@ -98,7 +118,16 @@ def sort_keywords(arches):
 
 
 def diff_keywords(old_keywords, new_keywords, format='color-inline'):
-	"""Show pretty diff between list of keywords"""
+	"""Show pretty diff between list of keywords
+
+	Args:
+	  old_keywords: The old set of KEYWORDS
+	  new_keywords: The new set of KEYWORDS
+	  format: The diff style
+
+	Returns:
+	  A string containing the diff output ready to shown to the user
+	"""
 	def show_diff(s):
 		output = ''
 
@@ -257,7 +286,21 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=0,
 
 def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
                    dry_run=False, format='color-inline'):
-	"""Process |ops| for |ebuild|"""
+	"""Process |ops| for |ebuild|
+
+	Args:
+	  ebuild: The ebuild file to operate on & update in place
+	  ops: An iterable of operations (Op objects) to perform on |ebuild|
+	  arch_status: A dict mapping default arches to their stability; see the
+	               load_profile_data function for more details
+	  verbose: Be verbose; show various status messages
+	  quiet: Be quiet; only show errors
+	  dry_run: Do not make any changes to |ebuild|; show what would be done
+	  format: The diff style
+
+    Returns:
+      Whether any updates were processed
+	"""
 	with io.open(ebuild, encoding='utf8') as f:
 		updated, content = process_content(
 			ebuild, f, ops, arch_status=arch_status,
@@ -265,10 +308,20 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 		if updated and not dry_run:
 			with io.open(ebuild, 'w', encoding='utf8') as f:
 				f.writelines(content)
+        return updated
 
 
 def load_profile_data(portdir=None, repo='gentoo'):
-	"""Load the list of known arches from the tree"""
+	"""Load the list of known arches from the tree
+
+	Args:
+	  portdir: The repository to load all data from (and ignore |repo|)
+	  repo: Look up this repository by name to locate profile data
+
+	Returns:
+	  A dict mapping the keyword to its preferred state:
+	  {'x86': 'stable', 'mips': 'dev', ...}
+	"""
 	if portdir is None:
 		portdir = portage.db['/']['vartree'].settings.repositories[repo].location
 


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2014-11-18 18:24 Mike Gilbert
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Gilbert @ 2014-11-18 18:24 UTC (permalink / raw
  To: gentoo-commits

commit:     8054e7f40cd07cac63dc67488aa22871fb29b7c6
Author:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 18 18:21:50 2014 +0000
Commit:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
CommitDate: Tue Nov 18 18:21:50 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/gentoolkit.git;a=commit;h=8054e7f4

ekeyword: Fix inconsistent use of tabs for indentation.

---
 src/ekeyword/ekeyword.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index a35d58d..cac6298 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -308,7 +308,7 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 		if updated and not dry_run:
 			with io.open(ebuild, 'w', encoding='utf8') as f:
 				f.writelines(content)
-        return updated
+	return updated
 
 
 def load_profile_data(portdir=None, repo='gentoo'):


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2015-04-04 21:26 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2015-04-04 21:26 UTC (permalink / raw
  To: gentoo-commits

commit:     53883043dd23eecf033756bff14d50fa994e4525
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  4 21:21:31 2015 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Apr  4 21:21:31 2015 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=53883043

ekeyword: change "format" to "style" to avoid pylint warning

Python provides a builtin "format" we don't want to clobber.

 src/ekeyword/ekeyword.py          | 32 ++++++++++++++++----------------
 src/ekeyword/ekeyword_unittest.py | 36 ++++++++++++++++++------------------
 2 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index cac6298..bc3b2cf 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -117,13 +117,13 @@ def sort_keywords(arches):
 	return keywords
 
 
-def diff_keywords(old_keywords, new_keywords, format='color-inline'):
+def diff_keywords(old_keywords, new_keywords, style='color-inline'):
 	"""Show pretty diff between list of keywords
 
 	Args:
 	  old_keywords: The old set of KEYWORDS
 	  new_keywords: The new set of KEYWORDS
-	  format: The diff style
+	  style: The diff style
 
 	Returns:
 	  A string containing the diff output ready to shown to the user
@@ -138,7 +138,7 @@ def diff_keywords(old_keywords, new_keywords, format='color-inline'):
 
 			if tag in ('delete', 'replace'):
 				o = s.a[i0:i1]
-				if format == 'color-inline':
+				if style == 'color-inline':
 					o = colorize('bg_darkred', o)
 				else:
 					o = '-{%s}' % o
@@ -146,7 +146,7 @@ def diff_keywords(old_keywords, new_keywords, format='color-inline'):
 
 			if tag in ('insert', 'replace'):
 				o = s.b[j0:j1]
-				if format == 'color-inline':
+				if style == 'color-inline':
 					o = colorize('bg_darkgreen', o)
 				else:
 					o = '+{%s}' % o
@@ -219,7 +219,7 @@ def process_keywords(keywords, ops, arch_status=None):
 
 
 def process_content(ebuild, data, ops, arch_status=None, verbose=0,
-                    quiet=0, format='color-inline'):
+                    quiet=0, style='color-inline'):
 	"""Process |ops| for |data|"""
 	# Set up the user display style based on verbose/quiet settings.
 	if verbose > 1:
@@ -260,10 +260,10 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=0,
 			new_keywords = sort_keywords(new_keywords)
 			line = '%s"%s"%s\n' % (m.group(1), ' '.join(new_keywords),
 			                       m.group(5))
-			if format in ('color-inline', 'inline'):
-				logit(diff_keywords(old_keywords, new_keywords, format=format))
+			if style in ('color-inline', 'inline'):
+				logit(diff_keywords(old_keywords, new_keywords, style=style))
 			else:
-				if format == 'long-multi':
+				if style == 'long-multi':
 					logit(' '.join(['%*s' % (len(keyword_to_arch(x)) + 1, x)
 					                for x in old_keywords]))
 					logit(' '.join(['%*s' % (len(keyword_to_arch(x)) + 1, x)
@@ -285,7 +285,7 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=0,
 
 
 def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
-                   dry_run=False, format='color-inline'):
+                   dry_run=False, style='color-inline'):
 	"""Process |ops| for |ebuild|
 
 	Args:
@@ -296,7 +296,7 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 	  verbose: Be verbose; show various status messages
 	  quiet: Be quiet; only show errors
 	  dry_run: Do not make any changes to |ebuild|; show what would be done
-	  format: The diff style
+	  style: The diff style
 
     Returns:
       Whether any updates were processed
@@ -304,7 +304,7 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 	with io.open(ebuild, encoding='utf8') as f:
 		updated, content = process_content(
 			ebuild, f, ops, arch_status=arch_status,
-			verbose=verbose, quiet=quiet, format=format)
+			verbose=verbose, quiet=quiet, style=style)
 		if updated and not dry_run:
 			with io.open(ebuild, 'w', encoding='utf8') as f:
 				f.writelines(content)
@@ -448,7 +448,7 @@ def get_parser():
 		help='Be verbose while processing things')
 	parser.add_argument('-q', '--quiet', action='count', default=0,
 		help='Be quiet while processing things (only show errors)')
-	parser.add_argument('--format', default='auto',
+	parser.add_argument('--format', default='auto', dest='style',
 		choices=('auto', 'color-inline', 'inline', 'short-multi', 'long-multi'),
 		help='Selet output format for showing differences')
 	parser.add_argument('-V', '--version', default=False, action='store_true',
@@ -491,12 +491,12 @@ def main(argv):
 	if not work_args:
 		parser.error('need arches/ebuilds to process')
 
-	if opts.format == 'auto':
+	if opts.style == 'auto':
 		if not portage.db['/']['vartree'].settings.get('NOCOLOR', 'false').lower() in ('no', 'false'):
 			nocolor()
-			opts.format = 'short'
+			opts.style = 'short'
 		else:
-			opts.format = 'color-inline'
+			opts.style = 'color-inline'
 
 	arch_status = load_profile_data()
 	try:
@@ -507,7 +507,7 @@ def main(argv):
 	for ebuild, ops in work:
 		process_ebuild(ebuild, ops, arch_status=arch_status,
 		               verbose=opts.verbose, quiet=opts.quiet,
-		               dry_run=opts.dry_run, format=opts.format)
+		               dry_run=opts.dry_run, style=opts.style)
 
 	return os.EX_OK
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index b491db0..5141159 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -75,19 +75,19 @@ class TestDiffKeywords(unittest.TestCase):
 		ret = ekeyword.diff_keywords(['~a'], ['-a'])
 		self.assertNotEqual(ret, '')
 
-	def _testSmokeFormat(self, format):
+	def _testSmokeStyle(self, style):
 		return ekeyword.diff_keywords(
 			['~a', 'b', '-abcde'],
-			['a', '-b', '-abxde'], format=format)
+			['a', '-b', '-abxde'], style=style)
 
-	def testSmokeFormatColor(self):
-		"""Run a full smoke test for color-inline format"""
-		ret = self._testSmokeFormat('color-inline')
+	def testSmokeStyleColor(self):
+		"""Run a full smoke test for color-inline style"""
+		ret = self._testSmokeStyle('color-inline')
 		self.assertNotEqual(ret, '')
 
-	def testSmokeFormatNoColor(self):
-		"""Run a full smoke test for non-color-inline format"""
-		self._testSmokeFormat('nocolor')
+	def testSmokeStyleNoColor(self):
+		"""Run a full smoke test for non-color-inline style"""
+		self._testSmokeStyle('nocolor')
 
 
 class TestProcessKeywords(unittest.TestCase):
@@ -244,14 +244,14 @@ class TestProcessContent(unittest.TestCase):
 		self.assertFalse(updated)
 		self.assertEqual(ret, [' KEYWORDS=\n'])
 
-	def _testSmoke(self, format='color-inline', verbose=0, quiet=0):
+	def _testSmoke(self, style='color-inline', verbose=0, quiet=0):
 		ops = (
 			ekeyword.Op(None, 'arm', None),
 			ekeyword.Op('~', 'sparc', None),
 		)
 		ekeyword.process_content(
 			'asdf', ['KEYWORDS="arm"'], ops, verbose=verbose,
-			quiet=quiet, format=format)
+			quiet=quiet, style=style)
 
 	def testSmokeQuiet(self):
 		"""Smoke test for quiet mode"""
@@ -261,20 +261,20 @@ class TestProcessContent(unittest.TestCase):
 		"""Smoke test for verbose mode"""
 		self._testSmoke(verbose=10)
 
-	def testSmokeFormatColor(self):
-		"""Smoke test for color-inline format"""
+	def testSmokeStyleColor(self):
+		"""Smoke test for color-inline style"""
 		self._testSmoke('color-inline')
 
-	def testSmokeFormatInline(self):
-		"""Smoke test for inline format"""
+	def testSmokeStyleInline(self):
+		"""Smoke test for inline style"""
 		self._testSmoke('inline')
 
-	def testSmokeFormatShortMulti(self):
-		"""Smoke test for short-multi format"""
+	def testSmokeStyleShortMulti(self):
+		"""Smoke test for short-multi style"""
 		self._testSmoke('short-multi')
 
-	def testSmokeFormatLongMulti(self):
-		"""Smoke test for long-multi format"""
+	def testSmokeStyleLongMulti(self):
+		"""Smoke test for long-multi style"""
 		self._testSmoke('long-multi')
 
 


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2015-04-04 21:26 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2015-04-04 21:26 UTC (permalink / raw
  To: gentoo-commits

commit:     083b5fd4a51c54dc7154c03bcdb9ce4b665e5491
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  4 21:21:55 2015 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Apr  4 21:21:55 2015 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=083b5fd4

ekeyword: fix unused variable warnings

 src/ekeyword/ekeyword.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index bc3b2cf..b0035da 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -227,7 +227,7 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=0,
 		def logit(msg):
 			print('%s: %s' % (disp_name, msg))
 	elif quiet > 1:
-		def logit(msg):
+		def logit(_msg):
 			pass
 	else:
 		# Chop the full path and the .ebuild suffix.
@@ -349,7 +349,7 @@ def load_profile_data(portdir=None, repo='gentoo'):
 			for line in f:
 				line = line.split('#', 1)[0].split()
 				if line:
-					arch, profile, status = line
+					arch, _profile, status = line
 					arch_status.setdefault(arch, status)
 					curr_status = profile_status[arch_status[arch]]
 					new_status = profile_status[status]
@@ -409,7 +409,7 @@ def ignorable_arg(arg, quiet=0):
 	return False
 
 
-def args_to_work(args, arch_status=None, repo='gentoo', quiet=0):
+def args_to_work(args, arch_status=None, _repo='gentoo', quiet=0):
 	"""Process |args| into a list of work itmes (ebuild/arches to update)"""
 	work = []
 	todo_arches = []


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2015-04-04 21:26 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2015-04-04 21:26 UTC (permalink / raw
  To: gentoo-commits

commit:     56cf23ea1bd90f9f850691dbf2052cd58aa99a98
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Sat Apr  4 21:23:44 2015 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Apr  4 21:23:44 2015 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=56cf23ea

ekeyword: fix crash when passing "" as the arch

 src/ekeyword/ekeyword.py          | 2 +-
 src/ekeyword/ekeyword_unittest.py | 4 ++++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index b0035da..7a0cc7d 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -478,7 +478,7 @@ def main(argv):
 			if arg in ('--format',):
 				if argv:
 					parse_args.append(argv.pop(0))
-		elif arg[0] == '-' and len(arg) == 2:
+		elif len(arg) == 2 and arg[0] == '-':
 			parse_args.append(arg)
 		else:
 			work_args.append(arg)

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 5141159..134dd80 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -372,6 +372,10 @@ class TestMain(unittest.TestCase):
 		ekeyword.main(['arm', '--dry-run', os.path.join(TESTDIR, 'process-1.ebuild')])
 		ekeyword.main(['--version', '--dry-run'])
 
+	def testEmptyString(self):
+		self.assertRaises(SystemExit, ekeyword.main,
+		                  ['', os.path.join(TESTDIR, 'process-1.ebuild')])
+
 
 if __name__ == '__main__':
 	unittest.main()


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2016-01-27 23:35 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2016-01-27 23:35 UTC (permalink / raw
  To: gentoo-commits

commit:     00e918798ece8a6fdf38ba2e5edad1c5b328c183
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Wed Jan 27 23:32:27 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Wed Jan 27 23:32:27 2016 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=00e91879

ekeyword: allow passing arch_status={} to disable profile logic

 src/ekeyword/ekeyword.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 7a0cc7d..64f4eb0 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -168,7 +168,7 @@ def process_keywords(keywords, ops, arch_status=None):
 	for op, oarch, refarch in ops:
 		# Figure out which keywords we need to modify.
 		if oarch == 'all':
-			if not arch_status:
+			if arch_status is None:
 				raise ValueError('unable to process "all" w/out profiles.desc')
 			old_arches = set([keyword_to_arch(a) for a in new_keywords])
 			if op is None:


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2016-01-27 23:35 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2016-01-27 23:35 UTC (permalink / raw
  To: gentoo-commits

commit:     1b33e0ae109e11b1ee696ea6c6919bb86ecbc66f
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Wed Jan 27 23:32:57 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Wed Jan 27 23:32:57 2016 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=1b33e0ae

ekeyword: fix "all" keyword handling w/-keywords

When an ebuild has a keyword like '-sparc', we don't want the magic
"all" or "~all" keywords to change it to 'sparc' or '~sparc'.

 src/ekeyword/ekeyword.py          | 8 ++++++++
 src/ekeyword/ekeyword_unittest.py | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 64f4eb0..e4a8197 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -180,9 +180,17 @@ def process_keywords(keywords, ops, arch_status=None):
 				# master list.  If it lacks some keywords, then we might miss
 				# somethings here, but not much we can do.
 				arches = old_arches
+
 			# We ignore the glob arch as we never want to tweak it.
 			if '*' in arches:
 				arches.remove('*')
+
+			# For keywords that are explicitly disabled, do not update.  When
+			# people use `ekeyword ~all ...` or `ekeyword all ...`, they rarely
+			# (if ever) want to change a '-sparc' to 'sparc' or '-sparc' to
+			# '~sparc'.  We force people to explicitly do `ekeyword sparc ...`
+			# in these cases.
+			arches = [x for x in arches if '-' + x not in new_keywords]
 		else:
 			arches = (oarch,)
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 134dd80..473113b 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -196,6 +196,14 @@ class TestProcessKeywords(unittest.TestCase):
 		self._test('-* ~* * alpha arm arm64 m68k', ops,
 		           '-* ~* * ~alpha arm ~arm64 ~m68k', arch_status)
 
+	def testAllDisabled(self):
+		"""Make sure ~all does not change -arch to ~arch"""
+		ops = (
+			ekeyword.Op('~', 'all', None),
+		)
+		self._test('alpha -sparc ~x86', ops,
+		           '~alpha -sparc ~x86', {})
+
 
 class TestProcessContent(unittest.TestCase):
 	"""Tests for process_content"""


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2017-02-16  7:25 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2017-02-16  7:25 UTC (permalink / raw
  To: gentoo-commits

commit:     aa32986eecd93ed87cbdb347c3ee4f943f397510
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 16 07:24:35 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Thu Feb 16 07:24:35 2017 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=aa32986e

ekeyword: add a linter helper

 src/ekeyword/.pylintrc            | 37 +++++++++++++++++++++++++++++
 src/ekeyword/ekeyword.py          | 15 ++++++++----
 src/ekeyword/ekeyword_unittest.py |  2 ++
 src/ekeyword/pylint               | 49 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/src/ekeyword/.pylintrc b/src/ekeyword/.pylintrc
new file mode 100644
index 0000000..6a040d8
--- /dev/null
+++ b/src/ekeyword/.pylintrc
@@ -0,0 +1,37 @@
+[MESSAGES CONTROL]
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifier separated by comma (,) or put this option
+# multiple times (only on the command line, not in the configuration file where
+# it should appear only once).
+disable=
+	missing-docstring,
+	too-many-lines,
+	too-many-branches,
+	too-many-statements,
+	too-few-public-methods,
+	too-many-instance-attributes,
+	too-many-public-methods,
+	too-many-locals,
+	too-many-arguments,
+	locally-enabled,
+	locally-disabled,
+	fixme,
+	bad-whitespace,
+	bad-continuation,
+	invalid-name,
+
+[REPORTS]
+reports=no
+
+[FORMAT]
+max-line-length=80
+indent-string='\t'
+
+[SIMILARITIES]
+min-similarity-lines=20
+
+[VARIABLES]
+dummy-variables-rgx=_
+
+[DESIGN]
+max-parents=10

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index a36dcd3..56e284b 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -179,7 +179,7 @@ def process_keywords(keywords, ops, arch_status=None):
 				# Process all possible keywords.  We use the arch_status as a
 				# master list.  If it lacks some keywords, then we might miss
 				# somethings here, but not much we can do.
-				arches = old_arches
+				arches = list(old_arches)
 
 			# We ignore the glob arch as we never want to tweak it.
 			if '*' in arches:
@@ -192,7 +192,7 @@ def process_keywords(keywords, ops, arch_status=None):
 			# in these cases.
 			arches = [x for x in arches if '-' + x not in new_keywords]
 		else:
-			arches = (oarch,)
+			arches = [oarch]
 
 		if refarch:
 			# Figure out the state for this arch based on the reference arch.
@@ -319,6 +319,13 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 	return updated
 
 
+def portage_settings():
+	"""Return the portage settings we care about."""
+	# Portage creates the db member on the fly which confuses the linter.
+	# pylint: disable=no-member
+	return portage.db['/']['vartree'].settings
+
+
 def load_profile_data(portdir=None, repo='gentoo'):
 	"""Load the list of known arches from the tree
 
@@ -331,7 +338,7 @@ def load_profile_data(portdir=None, repo='gentoo'):
 	  {'x86': 'stable', 'mips': 'dev', ...}
 	"""
 	if portdir is None:
-		portdir = portage.db['/']['vartree'].settings.repositories[repo].location
+		portdir = portage_settings().repositories[repo].location
 
 	arch_status = {}
 
@@ -497,7 +504,7 @@ def main(argv):
 		parser.error('need arches/ebuilds to process')
 
 	if opts.style == 'auto':
-		if not portage.db['/']['vartree'].settings.get('NOCOLOR', 'false').lower() in ('no', 'false'):
+		if not portage_settings().get('NOCOLOR', 'false').lower() in ('no', 'false'):
 			nocolor()
 			opts.style = 'short'
 		else:

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 7b9017e..be84cc1 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -3,6 +3,8 @@
 # Distributed under the terms of the GNU General Public License v2
 # Written by Mike Frysinger <vapier@gentoo.org>
 
+# pylint: disable=no-self-use
+
 """Unittests for ekeyword"""
 
 import os

diff --git a/src/ekeyword/pylint b/src/ekeyword/pylint
new file mode 100755
index 0000000..3a9a368
--- /dev/null
+++ b/src/ekeyword/pylint
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+"""Run pylint with the right settings."""
+
+from __future__ import print_function
+
+import os
+import sys
+
+
+def find_all_modules(source_root):
+	"""Locate all python modules in the tree for scanning"""
+	ret = []
+
+	for root, _dirs, files in os.walk(source_root, topdown=False):
+		# Add all of the .py modules in the tree.
+		ret += [os.path.join(root, x) for x in files if x.endswith('.py')]
+
+	# Add the main scripts that don't end in .py.
+	ret += [os.path.join(source_root, x) for x in ('pylint',)]
+
+	return ret
+
+
+def main(argv):
+	"""The main entry point"""
+	source_root = os.path.dirname(os.path.realpath(__file__))
+
+	if not argv:
+		argv = find_all_modules(source_root)
+
+	pympath = source_root
+	pythonpath = os.environ.get('PYTHONPATH')
+	if pythonpath is None:
+		pythonpath = pympath
+	else:
+		pythonpath = pympath + ':' + pythonpath
+	os.environ['PYTHONPATH'] = pythonpath
+
+	pylintrc = os.path.join(source_root, '.pylintrc')
+	cmd = ['pylint', '--rcfile', pylintrc]
+	os.execvp(cmd[0], cmd + argv)
+
+
+if __name__ == '__main__':
+	sys.exit(main(sys.argv[1:]))


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2017-02-16  7:25 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2017-02-16  7:25 UTC (permalink / raw
  To: gentoo-commits

commit:     c688fa044b7b5e8e72ae6e9cc7f54fc35e1ff0c1
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 16 07:12:52 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Thu Feb 16 07:12:52 2017 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=c688fa04

ekeyword: change --version to use builtin version action

Minor clean up here.

 src/ekeyword/ekeyword.py          |  5 +----
 src/ekeyword/ekeyword_unittest.py | 11 ++++++++---
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index e4a8197..a36dcd3 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -459,7 +459,7 @@ def get_parser():
 	parser.add_argument('--format', default='auto', dest='style',
 		choices=('auto', 'color-inline', 'inline', 'short-multi', 'long-multi'),
 		help='Selet output format for showing differences')
-	parser.add_argument('-V', '--version', default=False, action='store_true',
+	parser.add_argument('-V', '--version', action='version', version=VERSION,
 		help='Show version information')
 	return parser
 
@@ -493,9 +493,6 @@ def main(argv):
 
 	parser = get_parser()
 	opts = parser.parse_args(parse_args)
-	if opts.version:
-		print('version: %s' % VERSION)
-		return os.EX_OK
 	if not work_args:
 		parser.error('need arches/ebuilds to process')
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 473113b..7b9017e 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -378,11 +378,16 @@ class TestMain(unittest.TestCase):
 
 	def testSmoke(self):
 		ekeyword.main(['arm', '--dry-run', os.path.join(TESTDIR, 'process-1.ebuild')])
-		ekeyword.main(['--version', '--dry-run'])
+
+	def testVersion(self):
+		with self.assertRaises(SystemExit) as e:
+			ekeyword.main(['--version', '--dry-run'])
+		self.assertEqual(e.exception.code, os.EX_OK)
 
 	def testEmptyString(self):
-		self.assertRaises(SystemExit, ekeyword.main,
-		                  ['', os.path.join(TESTDIR, 'process-1.ebuild')])
+		with self.assertRaises(SystemExit) as e:
+			ekeyword.main(['', os.path.join(TESTDIR, 'process-1.ebuild')])
+		self.assertNotEqual(e.exception.code, os.EX_OK)
 
 
 if __name__ == '__main__':


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2017-02-18  5:24 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2017-02-18  5:24 UTC (permalink / raw
  To: gentoo-commits

commit:     76b7677ea2f95e11f5332dbcb71c97578d18deac
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Sat Feb 18 05:24:47 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Feb 18 05:24:47 2017 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=76b7677e

ekeyword: enable bad-whitespace check

 src/ekeyword/.pylintrc | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/ekeyword/.pylintrc b/src/ekeyword/.pylintrc
index 6a040d8..cd5b31e 100644
--- a/src/ekeyword/.pylintrc
+++ b/src/ekeyword/.pylintrc
@@ -16,7 +16,6 @@ disable=
 	locally-enabled,
 	locally-disabled,
 	fixme,
-	bad-whitespace,
 	bad-continuation,
 	invalid-name,
 


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2017-03-08  0:16 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2017-03-08  0:16 UTC (permalink / raw
  To: gentoo-commits

commit:     4759a27d5fd878b59201fb48233e066eccf03be2
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Wed Mar  8 00:04:15 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Wed Mar  8 00:04:15 2017 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=4759a27d

ekeyword: misc source touchups

No functional changes here!

 src/ekeyword/ekeyword.py          | 8 ++++++--
 src/ekeyword/ekeyword_unittest.py | 7 +++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 56e284b..6d09001 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -99,6 +99,10 @@ def sort_keywords(arches):
 			keywords.append(g)
 
 	def arch_key(keyword):
+		"""Callback for python sorting functions
+
+		Used to turn a Gentoo keyword into a sortable form.
+		"""
 		# Sort independent of leading marker (~ or -).
 		arch = keyword_to_arch(keyword)
 
@@ -306,8 +310,8 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 	  dry_run: Do not make any changes to |ebuild|; show what would be done
 	  style: The diff style
 
-    Returns:
-      Whether any updates were processed
+	Returns:
+	  Whether any updates were processed
 	"""
 	with io.open(ebuild, encoding='utf8') as f:
 		updated, content = process_content(

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index be84cc1..3465dfb 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -7,6 +7,8 @@
 
 """Unittests for ekeyword"""
 
+from __future__ import print_function
+
 import os
 import tempfile
 import unittest
@@ -21,14 +23,17 @@ class TestSortKeywords(unittest.TestCase):
 	"""Tests for sort_keywords"""
 
 	def _test(self, input_data, exp_data):
+		"""Sort |input_data| and make sure it matches |exp_data|"""
 		output_data = ekeyword.sort_keywords(input_data.split())
 		self.assertEqual(exp_data.split(), output_data)
 
 	def testNull(self):
+		"""Verify whitespace is collapsed"""
 		self._test('', '')
 		self._test('   		 ', '')
 
 	def testGlob(self):
+		"""Verify globs get sorted before all others"""
 		self._test('* arm', '* arm')
 		self._test('arm -* x86', '-* arm x86')
 		self._test('hppa ~* amd64', '~* amd64 hppa')
@@ -356,6 +361,7 @@ class TestLoadProfileData(unittest.TestCase):
 
 
 class TestArgToOps(unittest.TestCase):
+	"""Tests for arg_to_op()"""
 
 	def _test(self, arg, op):
 		self.assertEqual(ekeyword.arg_to_op(arg), ekeyword.Op(*op))
@@ -377,6 +383,7 @@ class TestArgToOps(unittest.TestCase):
 
 
 class TestMain(unittest.TestCase):
+	"""Tests for the main entry point"""
 
 	def testSmoke(self):
 		ekeyword.main(['arm', '--dry-run', os.path.join(TESTDIR, 'process-1.ebuild')])


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/
@ 2017-03-08  0:16 Mike Frysinger
  0 siblings, 0 replies; 20+ messages in thread
From: Mike Frysinger @ 2017-03-08  0:16 UTC (permalink / raw
  To: gentoo-commits

commit:     52fd99ac5d2a5d37767e2ab3fdbaa23ce24badd8
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Wed Mar  8 00:05:24 2017 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Wed Mar  8 00:05:24 2017 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=52fd99ac

ekeyword: add support for regenerating manifests

Since many ebuilds live in overlays with manifest checking turned on,
add a flag to easily regen the manifest files after we modify them.

 src/ekeyword/ekeyword.py          | 10 +++++++--
 src/ekeyword/ekeyword_unittest.py | 47 ++++++++++++++++++++++++++++-----------
 2 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/src/ekeyword/ekeyword.py b/src/ekeyword/ekeyword.py
index 6d09001..31225b0 100755
--- a/src/ekeyword/ekeyword.py
+++ b/src/ekeyword/ekeyword.py
@@ -44,6 +44,7 @@ import difflib
 import io
 import os
 import re
+import subprocess
 import sys
 
 import portage
@@ -297,7 +298,7 @@ def process_content(ebuild, data, ops, arch_status=None, verbose=0,
 
 
 def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
-                   dry_run=False, style='color-inline'):
+                   dry_run=False, style='color-inline', manifest=False):
 	"""Process |ops| for |ebuild|
 
 	Args:
@@ -320,6 +321,8 @@ def process_ebuild(ebuild, ops, arch_status=None, verbose=0, quiet=0,
 		if updated and not dry_run:
 			with io.open(ebuild, 'w', encoding='utf8') as f:
 				f.writelines(content)
+			if manifest:
+				subprocess.check_call(['ebuild', ebuild, 'manifest'])
 	return updated
 
 
@@ -461,6 +464,8 @@ def get_parser():
 	parser = argparse.ArgumentParser(
 		description=__doc__,
 		formatter_class=argparse.RawDescriptionHelpFormatter)
+	parser.add_argument('-m', '--manifest', default=False, action='store_true',
+		help='Run `ebuild manifest` on the ebuild after modifying it')
 	parser.add_argument('-n', '--dry-run', default=False, action='store_true',
 		help='Show what would be changed, but do not commit')
 	parser.add_argument('-v', '--verbose', action='count', default=0,
@@ -523,7 +528,8 @@ def main(argv):
 	for ebuild, ops in work:
 		process_ebuild(ebuild, ops, arch_status=arch_status,
 		               verbose=opts.verbose, quiet=opts.quiet,
-		               dry_run=opts.dry_run, style=opts.style)
+		               dry_run=opts.dry_run, style=opts.style,
+		               manifest=opts.manifest)
 
 	return os.EX_OK
 

diff --git a/src/ekeyword/ekeyword_unittest.py b/src/ekeyword/ekeyword_unittest.py
index 3465dfb..de40e7a 100755
--- a/src/ekeyword/ekeyword_unittest.py
+++ b/src/ekeyword/ekeyword_unittest.py
@@ -10,9 +10,12 @@
 from __future__ import print_function
 
 import os
+import subprocess
 import tempfile
 import unittest
 
+import mock
+
 import ekeyword
 
 
@@ -299,29 +302,47 @@ class TestProcessEbuild(unittest.TestCase):
 	This is fairly light as most code is in process_content.
 	"""
 
-	def _test(self, dry_run):
-		ops = (
-			ekeyword.Op(None, 'arm', None),
-			ekeyword.Op('~', 'sparc', None),
-		)
+	def _process_ebuild(self, *args, **kwargs):
+		"""Set up a writable copy of an ebuild for process_ebuild()"""
 		with tempfile.NamedTemporaryFile() as tmp:
 			with open(tmp.name, 'wb') as fw:
 				with open(os.path.join(TESTDIR, 'process-1.ebuild'), 'rb') as f:
 					orig_content = f.read()
 					fw.write(orig_content)
-			ekeyword.process_ebuild(tmp.name, ops, dry_run=dry_run)
+			ekeyword.process_ebuild(tmp.name, *args, **kwargs)
 			with open(tmp.name, 'rb') as f:
-				new_content = f.read()
-				if dry_run:
-					self.assertEqual(orig_content, new_content)
-				else:
-					self.assertNotEqual(orig_content, new_content)
+				return (orig_content, f.read())
+
+	def _testSmoke(self, dry_run):
+		ops = (
+			ekeyword.Op(None, 'arm', None),
+			ekeyword.Op('~', 'sparc', None),
+		)
+		orig_content, new_content = self._process_ebuild(ops, dry_run=dry_run)
+		if dry_run:
+			self.assertEqual(orig_content, new_content)
+		else:
+			self.assertNotEqual(orig_content, new_content)
 
 	def testSmokeNotDry(self):
-		self._test(False)
+		self._testSmoke(False)
 
 	def testSmokeDry(self):
-		self._test(True)
+		self._testSmoke(True)
+
+	def testManifestUpdated(self):
+		"""Verify `ebuild ... manifest` runs on updated files"""
+		with mock.patch.object(subprocess, 'check_call') as m:
+			self._process_ebuild((ekeyword.Op('~', 'arm', None),),
+			                     manifest=True)
+		m.assert_called_once_with(['ebuild', mock.ANY, 'manifest'])
+
+	def testManifestNotUpdated(self):
+		"""Verify we don't run `ebuild ... manifest` on unmodified files"""
+		with mock.patch.object(subprocess, 'check_call') as m:
+			self._process_ebuild((ekeyword.Op(None, 'arm', None),),
+			                     manifest=True)
+		self.assertEqual(m.call_count, 0)
 
 
 class TestLoadProfileData(unittest.TestCase):


^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2017-03-08  0:16 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-04-04 21:26 [gentoo-commits] proj/gentoolkit:gentoolkit-dev commit in: src/ekeyword/ Mike Frysinger
  -- strict thread matches above, loose matches on Subject: below --
2017-03-08  0:16 Mike Frysinger
2017-03-08  0:16 Mike Frysinger
2017-02-18  5:24 Mike Frysinger
2017-02-16  7:25 Mike Frysinger
2017-02-16  7:25 Mike Frysinger
2016-01-27 23:35 Mike Frysinger
2016-01-27 23:35 Mike Frysinger
2015-04-04 21:26 Mike Frysinger
2015-04-04 21:26 Mike Frysinger
2014-11-18 18:24 Mike Gilbert
2014-11-13 22:51 Mike Frysinger
2014-01-27 23:14 Mike Frysinger
2014-01-25 22:00 Mike Frysinger
2014-01-25 22:00 Mike Frysinger
2014-01-25 22:00 Mike Frysinger
2014-01-20 16:29 Mike Frysinger
2014-01-20  6:17 Mike Frysinger
2012-04-23  3:02 Christian Ruppert
2012-04-23  3:02 Christian Ruppert

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox