[pacman-dev,3/5] sortbydeps: factor out dep cycle warning

Message ID 20170415215707.22767-3-andrew.gregory.8@gmail.com
State Accepted, archived
Headers show
Series [pacman-dev,1/5] graph.h: replace hardcoded values with an enum | expand

Commit Message

Andrew Gregory April 15, 2017, 9:57 p.m. UTC
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
---
 lib/libalpm/deps.c | 70 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 37 insertions(+), 33 deletions(-)

Comments

Allan McRae April 16, 2017, 11:29 a.m. UTC | #1
On 16/04/17 07:57, Andrew Gregory wrote:
> Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
> ---
>  lib/libalpm/deps.c | 70 +++++++++++++++++++++++++++++-------------------------
>  1 file changed, 37 insertions(+), 33 deletions(-)
> 
> diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
> index 6f05f0d0..01e550a4 100644
> --- a/lib/libalpm/deps.c
> +++ b/lib/libalpm/deps.c
> @@ -158,6 +158,42 @@ static alpm_list_t *dep_graph_init(alpm_handle_t *handle,
>  	return vertices;
>  }
>  
> +static void _alpm_warn_dep_cycle(alpm_handle_t *handle, alpm_list_t *targets,
> +		alpm_graph_t *ancestor, alpm_graph_t *vertex, int reverse)
> +{
> +	/* vertex depends on and is required by ancestor */
> +	if(!alpm_list_find_ptr(targets, vertex->data)) {
> +		/* child is not part of the transaction, not a problem */
> +		return;
> +	}
> +
> +	/* find the nearest ancestor that's part of the transaction */
> +	while(ancestor) {
> +		if(alpm_list_find_ptr(targets, ancestor->data)) {
> +			break;
> +		}
> +		ancestor = ancestor->parent;
> +	}
> +
> +	if(!ancestor || ancestor == vertex) {
> +		/* no transaction package in our ancestry or the package has
> +		 * a circular dependency with itself, not a problem */
> +	} else {
> +		alpm_pkg_t *ancestorpkg = ancestor->data;
> +		alpm_pkg_t *childpkg = vertex->data;
> +		_alpm_log(handle, ALPM_LOG_WARNING, _("dependency cycle detected:\n"));
> +		if(reverse) {
> +			_alpm_log(handle, ALPM_LOG_WARNING,
> +					_("%s will be removed after its %s dependency\n"),
> +					ancestorpkg->name, childpkg->name);
> +		} else {
> +			_alpm_log(handle, ALPM_LOG_WARNING,
> +					_("%s will be installed before its %s dependency\n"),
> +					ancestorpkg->name, childpkg->name);
> +		}
> +	}
> +}
> +

Patch is OK.  I'd love it if these messages migrated to the front end too...

A

>  /* Re-order a list of target packages with respect to their dependencies.
>   *
>   * Example (reverse == 0):
> @@ -204,39 +240,7 @@ alpm_list_t *_alpm_sortbydeps(alpm_handle_t *handle,
>  				nextchild->parent = vertex;
>  				vertex = nextchild;
>  			} else if(nextchild->state == ALPM_GRAPH_STATE_PROCESSING) {
> -				/* child is an ancestor of vertex */
> -				alpm_graph_t *transvertex = vertex;
> -
> -				if(!alpm_list_find_ptr(targets, nextchild->data)) {
> -					/* child is not part of the transaction, not a problem */
> -					continue;
> -				}
> -
> -				/* find the nearest parent that's part of the transaction */
> -				while(transvertex) {
> -					if(alpm_list_find_ptr(targets, transvertex->data)) {
> -						break;
> -					}
> -					transvertex = transvertex->parent;
> -				}
> -
> -				if(!transvertex || transvertex == nextchild) {
> -					/* no transaction package in our ancestry or the package has
> -					 * a circular dependency with itself, not a problem */
> -				} else {
> -					alpm_pkg_t *transpkg = transvertex->data;
> -					alpm_pkg_t *childpkg = nextchild->data;
> -					_alpm_log(handle, ALPM_LOG_WARNING, _("dependency cycle detected:\n"));
> -					if(reverse) {
> -						_alpm_log(handle, ALPM_LOG_WARNING,
> -								_("%s will be removed after its %s dependency\n"),
> -								transpkg->name, childpkg->name);
> -					} else {
> -						_alpm_log(handle, ALPM_LOG_WARNING,
> -								_("%s will be installed before its %s dependency\n"),
> -								transpkg->name, childpkg->name);
> -					}
> -				}
> +				_alpm_warn_dep_cycle(handle, targets, vertex, nextchild, reverse);
>  			}
>  		}
>  		if(!found) {
>

Patch

diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
index 6f05f0d0..01e550a4 100644
--- a/lib/libalpm/deps.c
+++ b/lib/libalpm/deps.c
@@ -158,6 +158,42 @@  static alpm_list_t *dep_graph_init(alpm_handle_t *handle,
 	return vertices;
 }
 
+static void _alpm_warn_dep_cycle(alpm_handle_t *handle, alpm_list_t *targets,
+		alpm_graph_t *ancestor, alpm_graph_t *vertex, int reverse)
+{
+	/* vertex depends on and is required by ancestor */
+	if(!alpm_list_find_ptr(targets, vertex->data)) {
+		/* child is not part of the transaction, not a problem */
+		return;
+	}
+
+	/* find the nearest ancestor that's part of the transaction */
+	while(ancestor) {
+		if(alpm_list_find_ptr(targets, ancestor->data)) {
+			break;
+		}
+		ancestor = ancestor->parent;
+	}
+
+	if(!ancestor || ancestor == vertex) {
+		/* no transaction package in our ancestry or the package has
+		 * a circular dependency with itself, not a problem */
+	} else {
+		alpm_pkg_t *ancestorpkg = ancestor->data;
+		alpm_pkg_t *childpkg = vertex->data;
+		_alpm_log(handle, ALPM_LOG_WARNING, _("dependency cycle detected:\n"));
+		if(reverse) {
+			_alpm_log(handle, ALPM_LOG_WARNING,
+					_("%s will be removed after its %s dependency\n"),
+					ancestorpkg->name, childpkg->name);
+		} else {
+			_alpm_log(handle, ALPM_LOG_WARNING,
+					_("%s will be installed before its %s dependency\n"),
+					ancestorpkg->name, childpkg->name);
+		}
+	}
+}
+
 /* Re-order a list of target packages with respect to their dependencies.
  *
  * Example (reverse == 0):
@@ -204,39 +240,7 @@  alpm_list_t *_alpm_sortbydeps(alpm_handle_t *handle,
 				nextchild->parent = vertex;
 				vertex = nextchild;
 			} else if(nextchild->state == ALPM_GRAPH_STATE_PROCESSING) {
-				/* child is an ancestor of vertex */
-				alpm_graph_t *transvertex = vertex;
-
-				if(!alpm_list_find_ptr(targets, nextchild->data)) {
-					/* child is not part of the transaction, not a problem */
-					continue;
-				}
-
-				/* find the nearest parent that's part of the transaction */
-				while(transvertex) {
-					if(alpm_list_find_ptr(targets, transvertex->data)) {
-						break;
-					}
-					transvertex = transvertex->parent;
-				}
-
-				if(!transvertex || transvertex == nextchild) {
-					/* no transaction package in our ancestry or the package has
-					 * a circular dependency with itself, not a problem */
-				} else {
-					alpm_pkg_t *transpkg = transvertex->data;
-					alpm_pkg_t *childpkg = nextchild->data;
-					_alpm_log(handle, ALPM_LOG_WARNING, _("dependency cycle detected:\n"));
-					if(reverse) {
-						_alpm_log(handle, ALPM_LOG_WARNING,
-								_("%s will be removed after its %s dependency\n"),
-								transpkg->name, childpkg->name);
-					} else {
-						_alpm_log(handle, ALPM_LOG_WARNING,
-								_("%s will be installed before its %s dependency\n"),
-								transpkg->name, childpkg->name);
-					}
-				}
+				_alpm_warn_dep_cycle(handle, targets, vertex, nextchild, reverse);
 			}
 		}
 		if(!found) {