aboutsummaryrefslogtreecommitdiffstats
path: root/devel
diff options
context:
space:
mode:
authorLev A. Serebryakov <lev@FreeBSD.org>2013-07-13 23:36:50 +0800
committerLev A. Serebryakov <lev@FreeBSD.org>2013-07-13 23:36:50 +0800
commit0cc8983b26815211ca61eb7b13d9d2e4682fcea3 (patch)
tree791cdda5f7fe06e8cb1c0e780aee3e01fe699a4c /devel
parentfeeaef56373bba5c330bc6b50c4d51a7a9d63218 (diff)
downloadfreebsd-ports-gnome-0cc8983b26815211ca61eb7b13d9d2e4682fcea3.tar.gz
freebsd-ports-gnome-0cc8983b26815211ca61eb7b13d9d2e4682fcea3.tar.zst
freebsd-ports-gnome-0cc8983b26815211ca61eb7b13d9d2e4682fcea3.zip
(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
Diffstat (limited to 'devel')
-rw-r--r--devel/subversion-static/Makefile4
-rw-r--r--devel/subversion/Makefile11
-rw-r--r--devel/subversion/Makefile.common2
-rw-r--r--devel/subversion/files/patch-fix438377
-rw-r--r--devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c145
5 files changed, 231 insertions, 8 deletions
diff --git a/devel/subversion-static/Makefile b/devel/subversion-static/Makefile
index 31bb3f6871d2..d160bef83f57 100644
--- a/devel/subversion-static/Makefile
+++ b/devel/subversion-static/Makefile
@@ -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
diff --git a/devel/subversion/Makefile b/devel/subversion/Makefile
index afdb83a68245..9895c19f25e5 100644
--- a/devel/subversion/Makefile
+++ b/devel/subversion/Makefile
@@ -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} "" ; \
diff --git a/devel/subversion/Makefile.common b/devel/subversion/Makefile.common
index 0a358f81f210..602b35f4d519 100644
--- a/devel/subversion/Makefile.common
+++ b/devel/subversion/Makefile.common
@@ -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/}
diff --git a/devel/subversion/files/patch-fix4383 b/devel/subversion/files/patch-fix4383
new file mode 100644
index 000000000000..94ea0914a3b8
--- /dev/null
+++ b/devel/subversion/files/patch-fix4383
@@ -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)
+ {
diff --git a/devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c b/devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c
new file mode 100644
index 000000000000..a14a96d46b9c
--- /dev/null
+++ b/devel/subversion/files/patch-subversion--libsvn_subr--gpg_agent.c
@@ -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;
+ }