Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Jul 2013 15:36:51 +0000 (UTC)
From:      "Lev A. Serebryakov" <lev@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r322938 - in head/devel: subversion subversion-static subversion/files
Message-ID:  <201307131536.r6DFapWK074240@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: lev
Date: Sat Jul 13 15:36:50 2013
New Revision: 322938
URL: http://svnweb.freebsd.org/changeset/ports/322938

Log:
   (1) Fix subversion-static port to use SERF.
   (2) Backport fix of issue #4383: problems with symbolic-link WC.
   (3) Backport change r1500762 (no isue # found): conflict between
       GPG Agent and other password stories.
   (4) Fix error message when Subversion is configured with BDB abd
       APR is not.
  
  PR:		ports/179807, ports/180121, ports/180121
  Submitted by:	[3] eugen@grosbein.pp.ru

Added:
  head/devel/subversion/files/patch-fix4383   (contents, props changed)
  head/devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c   (contents, props changed)
Modified:
  head/devel/subversion-static/Makefile
  head/devel/subversion/Makefile
  head/devel/subversion/Makefile.common

Modified: head/devel/subversion-static/Makefile
==============================================================================
--- head/devel/subversion-static/Makefile	Sat Jul 13 15:33:23 2013	(r322937)
+++ head/devel/subversion-static/Makefile	Sat Jul 13 15:36:50 2013	(r322938)
@@ -3,10 +3,10 @@
 PKGNAMESUFFIX=	-static
 
 CONFLICTS_INSTALL=	${PORTNAME}-[0-9]*
-LATEST_LINK=	${PORTNAME}${PKGNAMESUFFIX}
+LATEST_LINK=		${PORTNAME}${PKGNAMESUFFIX}
 
 OPTIONS_EXCLUDE=	${OPTIONS_DEFINE}
-OPTIONS_SLAVE=	NEON STATIC FREEBSD_TEMPLATE ENHANCED_KEYWORD
+OPTIONS_SLAVE=		FREEBSD_TEMPLATE P4_STYLE_MARKERS SERF STATIC
 
 MASTERDIR=	${.CURDIR}/../subversion
 PKGMESSAGE=	${.CURDIR}/pkg-message

Modified: head/devel/subversion/Makefile
==============================================================================
--- head/devel/subversion/Makefile	Sat Jul 13 15:33:23 2013	(r322937)
+++ head/devel/subversion/Makefile	Sat Jul 13 15:36:50 2013	(r322938)
@@ -15,9 +15,10 @@ MAN8=		svnserve.8
 
 TXT_DOCS=	BUGS CHANGES COMMITTERS INSTALL README
 
-OPTIONS_DEFINE=	BDB BOOK GNOME_KEYRING KDE_KWALLET MAINTAINER_DEBUG \
-		MOD_DAV_SVN P4_STYLE_MARKERS FREEBSD_TEMPLATE SASL \
-		SERF STATIC SVNSERVE_WRAPPER TEST TOOLS \
+OPTIONS_DEFINE=	BDB BOOK DOCS GNOME_KEYRING KDE_KWALLET \
+		MAINTAINER_DEBUG MOD_DAV_SVN NLS P4_STYLE_MARKERS \
+		FREEBSD_TEMPLATE SASL SERF STATIC SVNSERVE_WRAPPER \
+		TEST TOOLS
 
 OPTIONS_DEFAULT=P4_STYLE_MARKERS FREEBSD_TEMPLATE SERF
 
@@ -212,8 +213,8 @@ pre-configure:
 	@BDB_VERSION=`${APR_APU_DIR}/${APU_CONFIG} --db-version`; \
 	if [ "$${BDB_VERSION}" != "4" -a "$${BDB_VERSION}" != "5" ] ; then \
 		${ECHO_MSG} "" ; \
-		${ECHO_MSG} 'You should build `'"${APR_PORT}' with Berkeley DB (4 or 5) support to use subversion with it." ; \
-		${ECHO_MSG} 'Please rebuild `'"${APR_PORT}' with option "'`'"${OPT_NAME}' and try again." ; \
+		${ECHO_MSG} 'You should build `'"devel/apr1' with Berkeley DB (4 or 5) support to use subversion with it." ; \
+		${ECHO_MSG} 'Please rebuild `'"devel/apr1' with option "'`'"${OPT_NAME}' and try again." ; \
 		${ECHO_MSG} "" ; \
 		${ECHO_MSG} "Or you can disable Berkeley DB support. Only 'fs' repository backend will be available." ; \
 		${ECHO_MSG} "" ; \

Modified: head/devel/subversion/Makefile.common
==============================================================================
--- head/devel/subversion/Makefile.common	Sat Jul 13 15:33:23 2013	(r322937)
+++ head/devel/subversion/Makefile.common	Sat Jul 13 15:36:50 2013	(r322938)
@@ -3,7 +3,7 @@
 
 PORTNAME=	subversion
 PORTVERSION=	1.8.0
-PORTREVISION?=	2
+PORTREVISION?=	3
 CATEGORIES+=	devel
 MASTER_SITES=	${MASTER_SITE_APACHE:S/$/:main/} \
 		${MASTER_SITE_LOCAL:S/$/:book/}

Added: head/devel/subversion/files/patch-fix4383
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/subversion/files/patch-fix4383	Sat Jul 13 15:36:50 2013	(r322938)
@@ -0,0 +1,77 @@
+Index: subversion/libsvn_wc/wc_db_wcroot.c
+===================================================================
+--- subversion/libsvn_wc/wc_db_wcroot.c	(revision 1496006)
++++ subversion/libsvn_wc/wc_db_wcroot.c	(revision 1496007)
+@@ -434,6 +434,8 @@
+   svn_boolean_t always_check = FALSE;
+   int wc_format = 0;
+   const char *adm_relpath;
++  /* Non-NULL if WCROOT is found through a symlink: */
++  const char *symlink_wcroot_abspath = NULL;
+ 
+   /* ### we need more logic for finding the database (if it is located
+      ### outside of the wcroot) and then managing all of that within DB.
+@@ -611,6 +613,7 @@
+                   if (found_wcroot)
+                     break;
+ 
++                  symlink_wcroot_abspath = local_abspath;
+                   SVN_ERR(read_link_target(&local_abspath, local_abspath,
+                                            scratch_pool));
+ try_symlink_as_dir:
+@@ -632,6 +635,7 @@
+       local_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
+ 
+       moved_upwards = TRUE;
++      symlink_wcroot_abspath = NULL;
+ 
+       /* Is the parent directory recorded in our hash?  */
+       found_wcroot = svn_hash_gets(db->dir_data, local_abspath);
+@@ -669,7 +673,10 @@
+          (ie. where we found it).  */
+ 
+       err = svn_wc__db_pdh_create_wcroot(wcroot,
+-                            apr_pstrdup(db->state_pool, local_abspath),
++                            apr_pstrdup(db->state_pool,
++                                        symlink_wcroot_abspath
++                                          ? symlink_wcroot_abspath
++                                          : local_abspath),
+                             sdb, wc_id, FORMAT_FROM_SDB,
+                             db->verify_format, db->enforce_empty_wq,
+                             db->state_pool, scratch_pool);
+@@ -737,7 +744,10 @@
+         }
+ 
+       SVN_ERR(svn_wc__db_pdh_create_wcroot(wcroot,
+-                            apr_pstrdup(db->state_pool, local_abspath),
++                            apr_pstrdup(db->state_pool,
++                                        symlink_wcroot_abspath
++                                          ? symlink_wcroot_abspath
++                                          : local_abspath),
+                             NULL, UNKNOWN_WC_ID, wc_format,
+                             db->verify_format, db->enforce_empty_wq,
+                             db->state_pool, scratch_pool));
+@@ -809,6 +819,7 @@
+                                              scratch_pool));
+           if (resolved_kind == svn_node_dir)
+             {
++              symlink_wcroot_abspath = original_abspath;
+               SVN_ERR(read_link_target(&local_abspath, original_abspath,
+                                        scratch_pool));
+               /* This handle was opened in this function but is not going
+@@ -826,6 +837,15 @@
+                 apr_pstrdup(db->state_pool, local_dir_abspath),
+                 *wcroot);
+ 
++  /* If the WCROOT was found through a symlink pointing at the root of
++   * the WC, its cache entry is now keyed on the link's target path.
++   * Cache the WCROOT under the symlink's path as well. Otherwise, future
++   * wcroot queries for the symlink path would construct a fresh wcroot. */
++  if (symlink_wcroot_abspath)
++    svn_hash_sets(db->dir_data,
++                  apr_pstrdup(db->state_pool, symlink_wcroot_abspath),
++                  *wcroot);
++
+   /* Did we traverse up to parent directories?  */
+   if (!moved_upwards)
+     {

Added: head/devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c	Sat Jul 13 15:36:50 2013	(r322938)
@@ -0,0 +1,145 @@
+--- subversion/libsvn_subr/gpg_agent.c	2013/07/08 14:27:14	1500761
++++ subversion/libsvn_subr/gpg_agent.c	2013/07/08 14:29:04	1500762
+@@ -156,42 +156,28 @@
+   return (strncmp(buf, "OK", 2) == 0);
+ }
+ 
+-/* Implementation of svn_auth__password_get_t that retrieves the password
+-   from gpg-agent */
++
++/* Locate a running GPG Agent, and return an open file descriptor
++ * for communication with the agent in *NEW_SD. If no running agent
++ * can be found, set *NEW_SD to -1. */
+ static svn_error_t *
+-password_get_gpg_agent(svn_boolean_t *done,
+-                       const char **password,
+-                       apr_hash_t *creds,
+-                       const char *realmstring,
+-                       const char *username,
+-                       apr_hash_t *parameters,
+-                       svn_boolean_t non_interactive,
+-                       apr_pool_t *pool)
++find_running_gpg_agent(int *new_sd, apr_pool_t *pool)
+ {
+-  int sd;
++  char *buffer;
+   char *gpg_agent_info = NULL;
++  const char *socket_name = NULL;
++  const char *request = NULL;
+   const char *p = NULL;
+   char *ep = NULL;
+-  char *buffer;
+-
+-  apr_array_header_t *socket_details;
+-  const char *request = NULL;
+-  const char *cache_id = NULL;
+-  struct sockaddr_un addr;
+-  const char *tty_name;
+-  const char *tty_type;
+-  const char *lc_ctype;
+-  const char *display;
+-  const char *socket_name = NULL;
+-  svn_checksum_t *digest = NULL;
+-  char *password_prompt;
+-  char *realm_prompt;
++  int sd;
+ 
+-  *done = FALSE;
++  *new_sd = -1;
+ 
+   gpg_agent_info = getenv("GPG_AGENT_INFO");
+   if (gpg_agent_info != NULL)
+     {
++      apr_array_header_t *socket_details;
++
+       socket_details = svn_cstring_split(gpg_agent_info, ":", TRUE,
+                                          pool);
+       socket_name = APR_ARRAY_IDX(socket_details, 0, const char *);
+@@ -201,6 +187,8 @@
+ 
+   if (socket_name != NULL)
+     {
++      struct sockaddr_un addr;
++
+       addr.sun_family = AF_UNIX;
+       strncpy(addr.sun_path, socket_name, sizeof(addr.sun_path) - 1);
+       addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
+@@ -273,6 +261,44 @@
+       return SVN_NO_ERROR;
+     }
+ 
++  *new_sd = sd;
++  return SVN_NO_ERROR;
++}
++
++/* Implementation of svn_auth__password_get_t that retrieves the password
++   from gpg-agent */
++static svn_error_t *
++password_get_gpg_agent(svn_boolean_t *done,
++                       const char **password,
++                       apr_hash_t *creds,
++                       const char *realmstring,
++                       const char *username,
++                       apr_hash_t *parameters,
++                       svn_boolean_t non_interactive,
++                       apr_pool_t *pool)
++{
++  int sd;
++  const char *p = NULL;
++  char *ep = NULL;
++  char *buffer;
++  const char *request = NULL;
++  const char *cache_id = NULL;
++  const char *tty_name;
++  const char *tty_type;
++  const char *lc_ctype;
++  const char *display;
++  svn_checksum_t *digest = NULL;
++  char *password_prompt;
++  char *realm_prompt;
++
++  *done = FALSE;
++
++  SVN_ERR(find_running_gpg_agent(&sd, pool));
++  if (sd == -1)
++    return SVN_NO_ERROR;
++
++  buffer = apr_palloc(pool, BUFFER_SIZE);
++
+   /* Send TTY_NAME to the gpg-agent daemon. */
+   tty_name = getenv("GPG_TTY");
+   if (tty_name != NULL)
+@@ -388,8 +414,8 @@
+    password in GPG Agent if that's how this particular integration
+    worked.  But it isn't.  GPG Agent stores the password provided by
+    the user via the pinentry program immediately upon its provision
+-   (and regardless of its accuracy as passwords go), so there's
+-   nothing really to do here.  */
++   (and regardless of its accuracy as passwords go), so we just need
++   to check if a usable GPG Agent exists. */
+ static svn_error_t *
+ password_set_gpg_agent(svn_boolean_t *done,
+                        apr_hash_t *creds,
+@@ -400,7 +426,21 @@
+                        svn_boolean_t non_interactive,
+                        apr_pool_t *pool)
+ {
+-  *done = TRUE;
++  int sd;
++  const char *tty_name;
++
++  *done = FALSE;
++
++  SVN_ERR(find_running_gpg_agent(&sd, pool));
++  if (sd == -1)
++    return SVN_NO_ERROR;
++
++  close(sd);
++
++  /* Also ensure that GPG_TTY is set in the evironment.
++   * If it isn't set the user won't be prompted by the agent. */
++  tty_name = getenv("GPG_TTY");
++  *done = (tty_name != NULL);
+ 
+   return SVN_NO_ERROR;
+ }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307131536.r6DFapWK074240>