public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
@ 2014-02-14 17:31 David James
  2014-02-14 20:31 ` Sebastian Luther
  2014-02-17  7:45 ` Mike Frysinger
  0 siblings, 2 replies; 13+ messages in thread
From: David James @ 2014-02-14 17:31 UTC (permalink / raw
  To: gentoo-portage-dev

[-- Attachment #1: Type: text/plain, Size: 10284 bytes --]

The --newrepo flag tells emerge to recompile a package if it is now being
pulled from a different repository.

BUG=chromium:200417
TEST=Verify ebuilds get pulled in when repo changes.
---
 man/emerge.1                          |  5 +++
 pym/_emerge/create_depgraph_params.py |  1 +
 pym/_emerge/depgraph.py               | 80
++++++++++++++++++-----------------
 pym/_emerge/help.py                   |  2 +-
 4 files changed, 48 insertions(+), 40 deletions(-)

diff --git a/man/emerge.1 b/man/emerge.1
index 7b507fe..eacb77a 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -553,6 +553,11 @@ a list of packages with similar names when a package
doesn't exist.
 The \fIEMERGE_DEFAULT_OPTS\fR variable may be used to disable this
 option by default.
 .TP
+.BR "\-\-newrepo "
+Tells emerge to recompile a package if it is now being pulled from a
+different repository. This option also implies the
+\fB\-\-selective\fR option.
+.TP
 .BR "\-\-newuse " (\fB\-N\fR)
 Tells emerge to include installed packages where USE
 flags have changed since compilation. This option
diff --git a/pym/_emerge/create_depgraph_params.py
b/pym/_emerge/create_depgraph_params.py
index 98a7646..f9accf0 100644
--- a/pym/_emerge/create_depgraph_params.py
+++ b/pym/_emerge/create_depgraph_params.py
@@ -46,6 +46,7 @@ def create_depgraph_params(myopts, myaction):
                myparams['rebuild_if_new_slot'] = rebuild_if_new_slot

        if "--update" in myopts or \
+               "--newrepo" in myopts or \
                "--newuse" in myopts or \
                "--reinstall" in myopts or \
                "--noreplace" in myopts or \
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index ae6b883..fe1b48e 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -5389,54 +5389,56 @@ class depgraph(object):
                                                break
                                        # Compare built package to current
config and
                                        # reject the built package if
necessary.
+                                       reinstall_use = ("--newuse" in
self._frozen_config.myopts or \
+                                               "--reinstall" in
self._frozen_config.myopts)
+                                       respect_use =
self._dynamic_config.myparams.get("binpkg_respect_use") in ("y", "auto")
                                        if built and not useoldpkg and \
                                                (not installed or
matched_packages) and \
                                                not (installed and

self._frozen_config.excluded_pkgs.findAtomForPackage(pkg,
-
modified_use=self._pkg_use_enabled(pkg))) and \
-                                               ("--newuse" in
self._frozen_config.myopts or \
-                                               "--reinstall" in
self._frozen_config.myopts or \
-                                               (not installed and
self._dynamic_config.myparams.get(
-                                               "binpkg_respect_use") in
("y", "auto"))):
-                                               iuses = pkg.iuse.all
-                                               old_use =
self._pkg_use_enabled(pkg)
-                                               if myeb:
-
pkgsettings.setcpv(myeb)
-                                               else:
-
pkgsettings.setcpv(pkg)
-                                               now_use =
pkgsettings["PORTAGE_USE"].split()
-                                               forced_flags = set()
-
forced_flags.update(pkgsettings.useforce)
-
forced_flags.update(pkgsettings.usemask)
-                                               cur_iuse = iuses
-                                               if myeb and not usepkgonly
and not useoldpkg:
-                                                       cur_iuse =
myeb.iuse.all
-                                               reinstall_for_flags =
self._reinstall_for_flags(pkg,
-                                                       forced_flags,
old_use, iuses, now_use, cur_iuse)
-                                               if reinstall_for_flags:
-                                                       if not
pkg.installed:
-
self._dynamic_config.ignored_binaries.setdefault(pkg,
set()).update(reinstall_for_flags)
+
modified_use=self._pkg_use_enabled(pkg))):
+                                               if myeb and "--newrepo" in
self._frozen_config.myopts and myeb.repo != pkg.repo:
                                                        break
+                                               elif reinstall_use or (not
installed and respect_use):
+                                                       iuses = pkg.iuse.all
+                                                       old_use =
self._pkg_use_enabled(pkg)
+                                                       if myeb:
+
pkgsettings.setcpv(myeb)
+                                                       else:
+
pkgsettings.setcpv(pkg)
+                                                       now_use =
pkgsettings["PORTAGE_USE"].split()
+                                                       forced_flags = set()
+
forced_flags.update(pkgsettings.useforce)
+
forced_flags.update(pkgsettings.usemask)
+                                                       cur_iuse = iuses
+                                                       if myeb and not
usepkgonly and not useoldpkg:
+                                                               cur_iuse =
myeb.iuse.all
+                                                       reinstall_for_flags
= self._reinstall_for_flags(pkg,
+
forced_flags, old_use, iuses, now_use, cur_iuse)
+                                                       if
reinstall_for_flags:
+                                                               if not
pkg.installed:
+
self._dynamic_config.ignored_binaries.setdefault(pkg,
set()).update(reinstall_for_flags)
+                                                               break
                                        # Compare current config to
installed package
                                        # and do not reinstall if possible.
-                                       if not installed and not useoldpkg
and \
-                                               ("--newuse" in
self._frozen_config.myopts or \
-                                               "--reinstall" in
self._frozen_config.myopts) and \
-                                               cpv in vardb.match(atom):
-                                               forced_flags = set()
-
forced_flags.update(pkg.use.force)
-
forced_flags.update(pkg.use.mask)
+                                       if not installed and not useoldpkg
and cpv in vardb.match(atom):
                                                inst_pkg =
vardb.match_pkgs('=' + pkg.cpv)[0]
-                                               old_use =
inst_pkg.use.enabled
-                                               old_iuse = inst_pkg.iuse.all
-                                               cur_use =
self._pkg_use_enabled(pkg)
-                                               cur_iuse = pkg.iuse.all
-                                               reinstall_for_flags = \
-
self._reinstall_for_flags(pkg,
-                                                       forced_flags,
old_use, old_iuse,
-                                                       cur_use, cur_iuse)
-                                               if reinstall_for_flags:
+                                               if "--newrepo" in
self._frozen_config.myopts and pkg.repo != inst_pkg.repo:
                                                        reinstall = True
+                                               elif reinstall_use:
+                                                       forced_flags = set()
+
forced_flags.update(pkg.use.force)
+
forced_flags.update(pkg.use.mask)
+                                                       old_use =
inst_pkg.use.enabled
+                                                       old_iuse =
inst_pkg.iuse.all
+                                                       cur_use =
self._pkg_use_enabled(pkg)
+                                                       cur_iuse =
pkg.iuse.all
+                                                       reinstall_for_flags
= \
+
self._reinstall_for_flags(pkg,
+
forced_flags, old_use, old_iuse,
+                                                               cur_use,
cur_iuse)
+                                                       if
reinstall_for_flags:
+                                                               reinstall =
True
                                        if
reinstall_atoms.findAtomForPackage(pkg, \

modified_use=self._pkg_use_enabled(pkg)):
                                                reinstall = True
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py
index 52cfd00..ab4e88f 100644
--- a/pym/_emerge/help.py
+++ b/pym/_emerge/help.py
@@ -17,7 +17,7 @@ def help():
        print("          [ " + green("--color")+" < " + turquoise("y") + "
| "+ turquoise("n")+" >            ] [ "+green("--columns")+"    ]")
        print("          [ "+green("--complete-graph")+"             ] [
"+green("--deep")+"       ]")
        print("          [ "+green("--jobs") + " " + turquoise("JOBS")+" ]
[ "+green("--keep-going")+" ] [ " + green("--load-average")+" " +
turquoise("LOAD") + "            ]")
-       print("          [ "+green("--newuse")+"    ] [
"+green("--noconfmem")+"  ] [ "+green("--nospinner")+"  ]")
+       print("          [ "+green("--newrepo")+"   ] [
"+green("--newuse")+"     ] [ "+green("--noconfmem")+"  ] [
"+green("--nospinner")+"   ]")
        print("          [ "+green("--oneshot")+"   ] [
"+green("--onlydeps")+"   ] [ "+ green("--quiet-build")+" [ " +
turquoise("y") + " | "+ turquoise("n")+" ]        ]")
        print("          [ "+green("--reinstall
")+turquoise("changed-use")+"      ] [ " + green("--with-bdeps")+" < " +
turquoise("y") + " | "+ turquoise("n")+" >         ]")
        print(bold("Actions:")+"  [ "+green("--depclean")+" |
"+green("--list-sets")+" | "+green("--search")+" | "+green("--sync")+" |
"+green("--version")+"        ]")
--
1.8.0.2

[-- Attachment #2: Type: text/html, Size: 16096 bytes --]

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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-14 17:31 [gentoo-portage-dev] [PATCH] Implement --newrepo flag David James
@ 2014-02-14 20:31 ` Sebastian Luther
  2014-02-14 20:43   ` David James
  2014-02-17  7:45 ` Mike Frysinger
  1 sibling, 1 reply; 13+ messages in thread
From: Sebastian Luther @ 2014-02-14 20:31 UTC (permalink / raw
  To: gentoo-portage-dev

Am 14.02.2014 18:31, schrieb David James:
> The --newrepo flag tells emerge to recompile a package if it is now being
> pulled from a different repository.
> 
> BUG=chromium:200417
> TEST=Verify ebuilds get pulled in when repo changes.
> ---
>  man/emerge.1                          |  5 +++
>  pym/_emerge/create_depgraph_params.py |  1 +
>  pym/_emerge/depgraph.py               | 80
> ++++++++++++++++++-----------------

Do you have this patch in some public repo to pull from? I just can't
manage to get it out of the mail with thunderbird...

For now one thing:
Please add some tests.

- Sebastian


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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-14 20:31 ` Sebastian Luther
@ 2014-02-14 20:43   ` David James
  2014-02-14 21:37     ` Sebastian Luther
  0 siblings, 1 reply; 13+ messages in thread
From: David James @ 2014-02-14 20:43 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: Mike Frysinger

[-- Attachment #1: Type: text/plain, Size: 1021 bytes --]

On Fri, Feb 14, 2014 at 12:31 PM, Sebastian Luther
<SebastianLuther@gmx.de>wrote:

> Am 14.02.2014 18:31, schrieb David James:
> > The --newrepo flag tells emerge to recompile a package if it is now being
> > pulled from a different repository.
> >
> > BUG=chromium:200417
> > TEST=Verify ebuilds get pulled in when repo changes.
> > ---
> >  man/emerge.1                          |  5 +++
> >  pym/_emerge/create_depgraph_params.py |  1 +
> >  pym/_emerge/depgraph.py               | 80
> > ++++++++++++++++++-----------------
>
> Do you have this patch in some public repo to pull from? I just can't
> manage to get it out of the mail with thunderbird...
>
> For now one thing:
> Please add some tests.
>

Uploaded here: https://chromium-review.googlesource.com/#/c/186651/

You should be able to cherry-pick using this command:
  git fetch
https://chromium.googlesource.com/chromiumos/third_party/portage_toolrefs/changes/51/186651/1
&& git cherry-pick FETCH_HEAD

I haven't added automated tests yet.

Cheers,

David

[-- Attachment #2: Type: text/html, Size: 1810 bytes --]

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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-14 20:43   ` David James
@ 2014-02-14 21:37     ` Sebastian Luther
  2014-02-17  4:57       ` David James
  0 siblings, 1 reply; 13+ messages in thread
From: Sebastian Luther @ 2014-02-14 21:37 UTC (permalink / raw
  To: gentoo-portage-dev

Am 14.02.2014 21:43, schrieb David James:
> 
> Uploaded here: https://chromium-review.googlesource.com/#/c/186651/
> 
> You should be able to cherry-pick using this command:
>   git fetch
> https://chromium.googlesource.com/chromiumos/third_party/portage_tool
> refs/changes/51/186651/1 && git cherry-pick FETCH_HEAD
> 

The patch has conflicts in depgraph.py.

> I haven't added automated tests yet.
> 
> Cheers,
> 
> David



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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-14 21:37     ` Sebastian Luther
@ 2014-02-17  4:57       ` David James
  2014-02-17  7:49         ` Mike Frysinger
  0 siblings, 1 reply; 13+ messages in thread
From: David James @ 2014-02-17  4:57 UTC (permalink / raw
  To: gentoo-portage-dev

[-- Attachment #1: Type: text/plain, Size: 764 bytes --]

On Fri, Feb 14, 2014 at 1:37 PM, Sebastian Luther <SebastianLuther@gmx.de>wrote:

> Am 14.02.2014 21:43, schrieb David James:
> >
> > Uploaded here: https://chromium-review.googlesource.com/#/c/186651/
> >
> > You should be able to cherry-pick using this command:
> >   git fetch
> > https://chromium.googlesource.com/chromiumos/third_party/portage_tool
> > refs/changes/51/186651/1 && git cherry-pick FETCH_HEAD
> >
>
> The patch has conflicts in depgraph.py.


Rebased against latest master. I've also added a bunch of tests.

Review URL:
  https://chromium-review.googlesource.com/#/c/186651/3

Fetch command:
 git fetch
https://chromium.googlesource.com/chromiumos/third_party/portage_toolrefs/changes/51/186651/3
&& git cherry-pick FETCH_HEAD

Cheers,

David

[-- Attachment #2: Type: text/html, Size: 1695 bytes --]

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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-14 17:31 [gentoo-portage-dev] [PATCH] Implement --newrepo flag David James
  2014-02-14 20:31 ` Sebastian Luther
@ 2014-02-17  7:45 ` Mike Frysinger
  1 sibling, 0 replies; 13+ messages in thread
From: Mike Frysinger @ 2014-02-17  7:45 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: David James

[-- Attachment #1: Type: text/plain, Size: 826 bytes --]

On Friday, February 14, 2014 09:31:19 David James wrote:
> The --newrepo flag tells emerge to recompile a package if it is now being
> pulled from a different repository.
> 
> BUG=chromium:200417
> TEST=Verify ebuilds get pulled in when repo changes.
> ---
>  man/emerge.1                          |  5 +++
>  pym/_emerge/create_depgraph_params.py |  1 +
>  pym/_emerge/depgraph.py               | 80
> ++++++++++++++++++-----------------
>  pym/_emerge/help.py                   |  2 +-
>  4 files changed, 48 insertions(+), 40 deletions(-)

looks like your client line wrapped everything which is why it's unusable.  i 
guess you need to use `git send-email` or tell your client to disable line 
wrapping when sending out patches.  unless gmail is your client in which case 
you have to use `git` ;).
-mike

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17  4:57       ` David James
@ 2014-02-17  7:49         ` Mike Frysinger
  2014-02-17 16:39           ` Brian Dolbec
  0 siblings, 1 reply; 13+ messages in thread
From: Mike Frysinger @ 2014-02-17  7:49 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: David James

[-- Attachment #1: Type: text/plain, Size: 611 bytes --]

On Sunday, February 16, 2014 20:57:29 David James wrote:
> On Fri, Feb 14, 2014 at 1:37 PM, Sebastian Luther wrote:
> > Am 14.02.2014 21:43, schrieb David James:
> > > Uploaded here: https://chromium-review.googlesource.com/#/c/186651/
> > > 
> > > You should be able to cherry-pick using this command:
> > >   git fetch
> > > 
> > > https://chromium.googlesource.com/chromiumos/third_party/portage_tool
> > > refs/changes/51/186651/1 && git cherry-pick FETCH_HEAD
> > 
> > The patch has conflicts in depgraph.py.
> 
> Rebased against latest master. I've also added a bunch of tests.

LGTM
-mike

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17  7:49         ` Mike Frysinger
@ 2014-02-17 16:39           ` Brian Dolbec
  2014-02-17 17:52             ` David James
  2014-02-17 18:23             ` Sebastian Luther
  0 siblings, 2 replies; 13+ messages in thread
From: Brian Dolbec @ 2014-02-17 16:39 UTC (permalink / raw
  To: gentoo-portage-dev

[-- Attachment #1: Type: text/plain, Size: 1000 bytes --]

On Mon, 17 Feb 2014 02:49:24 -0500
Mike Frysinger <vapier@gentoo.org> wrote:

> On Sunday, February 16, 2014 20:57:29 David James wrote:
> > On Fri, Feb 14, 2014 at 1:37 PM, Sebastian Luther wrote:
> > > Am 14.02.2014 21:43, schrieb David James:
> > > > Uploaded here:
> > > > https://chromium-review.googlesource.com/#/c/186651/
> > > > 
> > > > You should be able to cherry-pick using this command:
> > > >   git fetch
> > > > 
> > > > https://chromium.googlesource.com/chromiumos/third_party/portage_tool
> > > > refs/changes/51/186651/1 && git cherry-pick FETCH_HEAD
> > > 
> > > The patch has conflicts in depgraph.py.
> > 
> > Rebased against latest master. I've also added a bunch of tests.
> 
> LGTM
> -mike

Well, it looks fine looking at it from your review link.  But I am
unable to fetch it from your link to test.

fatal: remote error: Git repository not found.

Mike, if you can confirm the tests pass. Go ahead and merge it.

-- 
Brian Dolbec <dolsen>


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 620 bytes --]

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

* [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17 16:39           ` Brian Dolbec
@ 2014-02-17 17:52             ` David James
  2014-02-17 20:09               ` Sebastian Luther
  2014-02-17 18:23             ` Sebastian Luther
  1 sibling, 1 reply; 13+ messages in thread
From: David James @ 2014-02-17 17:52 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: David James

The --newrepo flag tells emerge to recompile a package if it is now
being pulled from a different repository.

BUG=chromium:200417
TEST=Verify ebuilds get pulled in when repo changes.
TEST=New test cases.
Change-Id: I8d5ff1cfc8c1d23e00c733b861547d3626bc2ece
---
 man/emerge.1                                 |  5 ++
 pym/_emerge/create_depgraph_params.py        |  1 +
 pym/_emerge/depgraph.py                      | 80 ++++++++++++++-------------
 pym/_emerge/help.py                          |  2 +-
 pym/_emerge/main.py                          |  1 +
 pym/portage/tests/emerge/test_simple.py      |  1 +
 pym/portage/tests/resolver/test_multirepo.py | 82 +++++++++++++++++++++++++++-
 7 files changed, 131 insertions(+), 41 deletions(-)

diff --git a/man/emerge.1 b/man/emerge.1
index 7b507fe..eacb77a 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -553,6 +553,11 @@ a list of packages with similar names when a package doesn't exist.
 The \fIEMERGE_DEFAULT_OPTS\fR variable may be used to disable this
 option by default.
 .TP
+.BR "\-\-newrepo "
+Tells emerge to recompile a package if it is now being pulled from a
+different repository. This option also implies the
+\fB\-\-selective\fR option.
+.TP
 .BR "\-\-newuse " (\fB\-N\fR)
 Tells emerge to include installed packages where USE
 flags have changed since compilation. This option
diff --git a/pym/_emerge/create_depgraph_params.py b/pym/_emerge/create_depgraph_params.py
index 98a7646..f9accf0 100644
--- a/pym/_emerge/create_depgraph_params.py
+++ b/pym/_emerge/create_depgraph_params.py
@@ -46,6 +46,7 @@ def create_depgraph_params(myopts, myaction):
 		myparams['rebuild_if_new_slot'] = rebuild_if_new_slot
 
 	if "--update" in myopts or \
+		"--newrepo" in myopts or \
 		"--newuse" in myopts or \
 		"--reinstall" in myopts or \
 		"--noreplace" in myopts or \
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 2ed7aeb..b741c47 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -5389,54 +5389,56 @@ class depgraph(object):
 						break
 					# Compare built package to current config and
 					# reject the built package if necessary.
+					reinstall_use = ("--newuse" in self._frozen_config.myopts or \
+						"--reinstall" in self._frozen_config.myopts)
+					respect_use = self._dynamic_config.myparams.get("binpkg_respect_use") in ("y", "auto")
 					if built and not useoldpkg and \
 						(not installed or matched_packages) and \
 						not (installed and
 						self._frozen_config.excluded_pkgs.findAtomForPackage(pkg,
-						modified_use=self._pkg_use_enabled(pkg))) and \
-						("--newuse" in self._frozen_config.myopts or \
-						"--reinstall" in self._frozen_config.myopts or \
-						(not installed and self._dynamic_config.myparams.get(
-						"binpkg_respect_use") in ("y", "auto"))):
-						iuses = pkg.iuse.all
-						old_use = self._pkg_use_enabled(pkg)
-						if myeb:
-							pkgsettings.setcpv(myeb)
-						else:
-							pkgsettings.setcpv(pkg)
-						now_use = pkgsettings["PORTAGE_USE"].split()
-						forced_flags = set()
-						forced_flags.update(pkgsettings.useforce)
-						forced_flags.update(pkgsettings.usemask)
-						cur_iuse = iuses
-						if myeb and not usepkgonly and not useoldpkg:
-							cur_iuse = myeb.iuse.all
-						reinstall_for_flags = self._reinstall_for_flags(pkg,
-							forced_flags, old_use, iuses, now_use, cur_iuse)
-						if reinstall_for_flags:
-							if not pkg.installed:
-								self._dynamic_config.ignored_binaries.setdefault(pkg, set()).update(reinstall_for_flags)
+						modified_use=self._pkg_use_enabled(pkg))):
+						if myeb and "--newrepo" in self._frozen_config.myopts and myeb.repo != pkg.repo:
 							break
+						elif reinstall_use or (not installed and respect_use):
+							iuses = pkg.iuse.all
+							old_use = self._pkg_use_enabled(pkg)
+							if myeb:
+								pkgsettings.setcpv(myeb)
+							else:
+								pkgsettings.setcpv(pkg)
+							now_use = pkgsettings["PORTAGE_USE"].split()
+							forced_flags = set()
+							forced_flags.update(pkgsettings.useforce)
+							forced_flags.update(pkgsettings.usemask)
+							cur_iuse = iuses
+							if myeb and not usepkgonly and not useoldpkg:
+								cur_iuse = myeb.iuse.all
+							reinstall_for_flags = self._reinstall_for_flags(pkg,
+								forced_flags, old_use, iuses, now_use, cur_iuse)
+							if reinstall_for_flags:
+								if not pkg.installed:
+									self._dynamic_config.ignored_binaries.setdefault(pkg, set()).update(reinstall_for_flags)
+								break
 					# Compare current config to installed package
 					# and do not reinstall if possible.
-					if not installed and not useoldpkg and \
-						("--newuse" in self._frozen_config.myopts or \
-						"--reinstall" in self._frozen_config.myopts) and \
-						cpv in vardb.match(atom):
-						forced_flags = set()
-						forced_flags.update(pkg.use.force)
-						forced_flags.update(pkg.use.mask)
+					if not installed and not useoldpkg and cpv in vardb.match(atom):
 						inst_pkg = vardb.match_pkgs('=' + pkg.cpv)[0]
-						old_use = inst_pkg.use.enabled
-						old_iuse = inst_pkg.iuse.all
-						cur_use = self._pkg_use_enabled(pkg)
-						cur_iuse = pkg.iuse.all
-						reinstall_for_flags = \
-							self._reinstall_for_flags(pkg,
-							forced_flags, old_use, old_iuse,
-							cur_use, cur_iuse)
-						if reinstall_for_flags:
+						if "--newrepo" in self._frozen_config.myopts and pkg.repo != inst_pkg.repo:
 							reinstall = True
+						elif reinstall_use:
+							forced_flags = set()
+							forced_flags.update(pkg.use.force)
+							forced_flags.update(pkg.use.mask)
+							old_use = inst_pkg.use.enabled
+							old_iuse = inst_pkg.iuse.all
+							cur_use = self._pkg_use_enabled(pkg)
+							cur_iuse = pkg.iuse.all
+							reinstall_for_flags = \
+								self._reinstall_for_flags(pkg,
+								forced_flags, old_use, old_iuse,
+								cur_use, cur_iuse)
+							if reinstall_for_flags:
+								reinstall = True
 					if reinstall_atoms.findAtomForPackage(pkg, \
 							modified_use=self._pkg_use_enabled(pkg)):
 						reinstall = True
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py
index 52cfd00..ab4e88f 100644
--- a/pym/_emerge/help.py
+++ b/pym/_emerge/help.py
@@ -17,7 +17,7 @@ def help():
 	print("          [ " + green("--color")+" < " + turquoise("y") + " | "+ turquoise("n")+" >            ] [ "+green("--columns")+"    ]")
 	print("          [ "+green("--complete-graph")+"             ] [ "+green("--deep")+"       ]")
 	print("          [ "+green("--jobs") + " " + turquoise("JOBS")+" ] [ "+green("--keep-going")+" ] [ " + green("--load-average")+" " + turquoise("LOAD") + "            ]")
-	print("          [ "+green("--newuse")+"    ] [ "+green("--noconfmem")+"  ] [ "+green("--nospinner")+"  ]")
+	print("          [ "+green("--newrepo")+"   ] [ "+green("--newuse")+"     ] [ "+green("--noconfmem")+"  ] [ "+green("--nospinner")+"   ]")
 	print("          [ "+green("--oneshot")+"   ] [ "+green("--onlydeps")+"   ] [ "+ green("--quiet-build")+" [ " + turquoise("y") + " | "+ turquoise("n")+" ]        ]")
 	print("          [ "+green("--reinstall ")+turquoise("changed-use")+"      ] [ " + green("--with-bdeps")+" < " + turquoise("y") + " | "+ turquoise("n")+" >         ]")
 	print(bold("Actions:")+"  [ "+green("--depclean")+" | "+green("--list-sets")+" | "+green("--search")+" | "+green("--sync")+" | "+green("--version")+"        ]")
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index da223a6..6225fc9 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -36,6 +36,7 @@ options=[
 "--fetchonly",    "--fetch-all-uri",
 "--ignore-default-opts",
 "--noconfmem",
+"--newrepo",
 "--newuse",
 "--nodeps",       "--noreplace",
 "--nospinner",    "--oneshot",
diff --git a/pym/portage/tests/emerge/test_simple.py b/pym/portage/tests/emerge/test_simple.py
index d3bb866..bf0af8b 100644
--- a/pym/portage/tests/emerge/test_simple.py
+++ b/pym/portage/tests/emerge/test_simple.py
@@ -247,6 +247,7 @@ pkg_preinst() {
 			ebuild_cmd + (test_ebuild, "manifest", "clean", "package", "merge"),
 			emerge_cmd + ("--pretend", "--tree", "--complete-graph", "dev-libs/A"),
 			emerge_cmd + ("-p", "dev-libs/B"),
+			emerge_cmd + ("-p", "--newrepo", "dev-libs/B"),
 			emerge_cmd + ("-B", "dev-libs/B",),
 			emerge_cmd + ("--oneshot", "--usepkg", "dev-libs/B",),
 
diff --git a/pym/portage/tests/resolver/test_multirepo.py b/pym/portage/tests/resolver/test_multirepo.py
index 8d65b2c..5c3ef7e 100644
--- a/pym/portage/tests/resolver/test_multirepo.py
+++ b/pym/portage/tests/resolver/test_multirepo.py
@@ -37,11 +37,20 @@ class MultirepoTestCase(TestCase):
 
 			"dev-libs/I-1::repo2": { "SLOT" : "1"},
 			"dev-libs/I-2::repo2": { "SLOT" : "2"},
+
+			"dev-libs/K-1::repo2": { },
 			}
 
 		installed = {
 			"dev-libs/H-1": { "RDEPEND" : "|| ( dev-libs/I:2 dev-libs/I:1 )"},
 			"dev-libs/I-2::repo1": {"SLOT" : "2"},
+			"dev-libs/K-1::repo1": { },
+			}
+
+		binpkgs = {
+			"dev-libs/C-1::repo2": { },
+			"dev-libs/I-2::repo1": {"SLOT" : "2"},
+			"dev-libs/K-1::repo2": { },
 			}
 
 		sets = {
@@ -96,6 +105,68 @@ class MultirepoTestCase(TestCase):
 				check_repo_names = True,
 				mergelist = ["dev-libs/D-1::repo2"]),
 
+			#--usepkg: don't reinstall on new repo without --newrepo
+			ResolverPlaygroundTestCase(
+				["dev-libs/C"],
+				options = {"--usepkg": True, "--selective": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["[binary]dev-libs/C-1::repo2"]),
+
+			#--usepkgonly: don't reinstall on new repo without --newrepo
+			ResolverPlaygroundTestCase(
+				["dev-libs/C"],
+				options = {"--usepkgonly": True, "--selective": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["[binary]dev-libs/C-1::repo2"]),
+
+			#--newrepo: pick ebuild if binpkg/ebuild have different repo
+			ResolverPlaygroundTestCase(
+				["dev-libs/C"],
+				options = {"--usepkg": True, "--newrepo": True, "--selective": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["dev-libs/C-1::repo1"]),
+
+			#--newrepo --usepkgonly: ebuild is ignored
+			ResolverPlaygroundTestCase(
+				["dev-libs/C"],
+				options = {"--usepkgonly": True, "--newrepo": True, "--selective": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["[binary]dev-libs/C-1::repo2"]),
+
+			#--newrepo: pick ebuild if binpkg/ebuild have different repo
+			ResolverPlaygroundTestCase(
+				["dev-libs/I"],
+				options = {"--usepkg": True, "--newrepo": True, "--selective": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["dev-libs/I-2::repo2"]),
+
+			#--newrepo --usepkgonly: if binpkg matches installed, do nothing
+			ResolverPlaygroundTestCase(
+				["dev-libs/I"],
+				options = {"--usepkgonly": True, "--newrepo": True, "--selective": True},
+				success = True,
+				mergelist = []),
+
+			#--newrepo --usepkgonly: reinstall if binpkg has new repo.
+			ResolverPlaygroundTestCase(
+				["dev-libs/K"],
+				options = {"--usepkgonly": True, "--newrepo": True, "--selective": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["[binary]dev-libs/K-1::repo2"]),
+
+			#--usepkgonly: don't reinstall on new repo without --newrepo.
+			ResolverPlaygroundTestCase(
+				["dev-libs/K"],
+				options = {"--usepkgonly": True, "--selective": True},
+				success = True,
+				mergelist = []),
+
 			#Atoms with slots
 			ResolverPlaygroundTestCase(
 				["dev-libs/E"],
@@ -137,6 +208,15 @@ class MultirepoTestCase(TestCase):
 				success = True,
 				mergelist = []),
 
+			# Dependency on installed dev-libs/I-2 ebuild should trigger reinstall
+			# when --newrepo flag is used.
+			ResolverPlaygroundTestCase(
+				["dev-libs/H"],
+				options = {"--update": True, "--deep": True, "--newrepo": True},
+				success = True,
+				check_repo_names = True,
+				mergelist = ["dev-libs/I-2::repo2"]),
+
 			# Check interaction between repo priority and unsatisfied
 			# REQUIRED_USE, for bug #350254.
 			ResolverPlaygroundTestCase(
@@ -147,7 +227,7 @@ class MultirepoTestCase(TestCase):
 			)
 
 		playground = ResolverPlayground(ebuilds=ebuilds,
-			installed=installed, sets=sets)
+			binpkgs=binpkgs, installed=installed, sets=sets)
 		try:
 			for test_case in test_cases:
 				playground.run_TestCase(test_case)
-- 
1.8.0.2



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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17 16:39           ` Brian Dolbec
  2014-02-17 17:52             ` David James
@ 2014-02-17 18:23             ` Sebastian Luther
  1 sibling, 0 replies; 13+ messages in thread
From: Sebastian Luther @ 2014-02-17 18:23 UTC (permalink / raw
  To: gentoo-portage-dev

Am 17.02.2014 17:39, schrieb Brian Dolbec:
> 
> Mike, if you can confirm the tests pass. Go ahead and merge it.
> 
Please give me some more time to review it. I'll commit it if it lgtm.


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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17 17:52             ` David James
@ 2014-02-17 20:09               ` Sebastian Luther
  2014-02-17 21:44                 ` David James
  0 siblings, 1 reply; 13+ messages in thread
From: Sebastian Luther @ 2014-02-17 20:09 UTC (permalink / raw
  To: gentoo-portage-dev

Am 17.02.2014 18:52, schrieb David James:
> @@ -96,6 +105,68 @@ class MultirepoTestCase(TestCase):
<snip>
> +
> +			#--newrepo: pick ebuild if binpkg/ebuild have different repo
> +			ResolverPlaygroundTestCase(
> +				["dev-libs/C"],
> +				options = {"--usepkg": True, "--newrepo": True, "--selective": True},
> +				success = True,
> +				check_repo_names = True,
> +				mergelist = ["dev-libs/C-1::repo1"]),

Why should it take the ebuild from the repo with lower priority?

I thought the intend was that the package should be reinstalled if it is
now pulled from a repo with higher priority than the repo from which the
installed package came.





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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17 20:09               ` Sebastian Luther
@ 2014-02-17 21:44                 ` David James
  2014-02-18 17:35                   ` Sebastian Luther
  0 siblings, 1 reply; 13+ messages in thread
From: David James @ 2014-02-17 21:44 UTC (permalink / raw
  To: gentoo-portage-dev

[-- Attachment #1: Type: text/plain, Size: 1800 bytes --]

On Mon, Feb 17, 2014 at 12:09 PM, Sebastian Luther
<SebastianLuther@gmx.de>wrote:

> Am 17.02.2014 18:52, schrieb David James:
> > @@ -96,6 +105,68 @@ class MultirepoTestCase(TestCase):
> <snip>
> > +
> > +                     #--newrepo: pick ebuild if binpkg/ebuild have
> different repo
> > +                     ResolverPlaygroundTestCase(
> > +                             ["dev-libs/C"],
> > +                             options = {"--usepkg": True, "--newrepo":
> True, "--selective": True},
> > +                             success = True,
> > +                             check_repo_names = True,
> > +                             mergelist = ["dev-libs/C-1::repo1"]),
>
> Why should it take the ebuild from the repo with lower priority?
>
> I thought the intend was that the package should be reinstalled if it is
> now pulled from a repo with higher priority than the repo from which the
> installed package came.


Interesting idea -- but no, that's not what I implemented. The intent here
is that a package will be reinstalled if it is now pulled from a different
repo than the repo from which the installed package came. This is actually
an important difference for our use case -- it allows you to switch in both
directions, both to higher priority repos and to lower priority repos.

From a theoretical perspective, the reason why I implemented this is
because "ebuilds" are the source of truth. According to the ebuilds, the
owner repo of dev-libs/C-1 is repo1, so this means that, with --newrepo,
any binpkg for dev-libs/C-1 from repo2 would be invalid.

This functionality is useful in the case where an ebuild changes repos. In
this case, with --newrepo, you would want the package to be rebuilt and any
binaries to be invalidated, and our tests validate this.

Cheers,

David

[-- Attachment #2: Type: text/html, Size: 2557 bytes --]

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

* Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
  2014-02-17 21:44                 ` David James
@ 2014-02-18 17:35                   ` Sebastian Luther
  0 siblings, 0 replies; 13+ messages in thread
From: Sebastian Luther @ 2014-02-18 17:35 UTC (permalink / raw
  To: gentoo-portage-dev

Am 17.02.2014 22:44, schrieb David James:


> From a theoretical perspective, the reason why I implemented this is
> because "ebuilds" are the source of truth. According to the ebuilds, the
> owner repo of dev-libs/C-1 is repo1, so this means that, with --newrepo,
> any binpkg for dev-libs/C-1 from repo2 would be invalid.

Actually this test passes even without --new-repo. So yes, your
interpretation is what's used by portage. Patch is committed.

> 
> This functionality is useful in the case where an ebuild changes repos.
> In this case, with --newrepo, you would want the package to be rebuilt
> and any binaries to be invalidated, and our tests validate this.
> 
> Cheers,
> 
> David
> 



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

end of thread, other threads:[~2014-02-18 17:35 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-14 17:31 [gentoo-portage-dev] [PATCH] Implement --newrepo flag David James
2014-02-14 20:31 ` Sebastian Luther
2014-02-14 20:43   ` David James
2014-02-14 21:37     ` Sebastian Luther
2014-02-17  4:57       ` David James
2014-02-17  7:49         ` Mike Frysinger
2014-02-17 16:39           ` Brian Dolbec
2014-02-17 17:52             ` David James
2014-02-17 20:09               ` Sebastian Luther
2014-02-17 21:44                 ` David James
2014-02-18 17:35                   ` Sebastian Luther
2014-02-17 18:23             ` Sebastian Luther
2014-02-17  7:45 ` Mike Frysinger

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