[gnome-builder] libide: add IdeVcsUri
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide: add IdeVcsUri
- Date: Mon, 6 Apr 2015 21:29:11 +0000 (UTC)
commit b1eb1473824d3092e28701ca7ab8bd039365df26
Author: Christian Hergert <christian hergert me>
Date: Fri Apr 3 18:52:48 2015 -0700
libide: add IdeVcsUri
This structure helps to parse and extract data from git-like URIs.
I'd prefer to abstract this later on if we get more VCS support rather
than try to build a one-size-fits-all now.
This should be somewhat reusable by libgit2-glib longer term if desired
as well.
.gitignore | 1 +
libide/Makefile.am | 2 +
libide/ide-vcs-uri.c | 395 ++++++++++++++++++++++++++++++++++++++++++++++
libide/ide-vcs-uri.h | 56 +++++++
libide/ide.h | 1 +
tests/test-ide-vcs-uri.c | 92 +++++++++++
tests/tests.mk | 9 +
7 files changed, 556 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index bc7a1d6..2c996b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,5 +46,6 @@ test-ide-buffer
test-ide-buffer-manager
test-ide-context
test-ide-source-view
+test-ide-vcs-uri
test-navigation-list
test.c
diff --git a/libide/Makefile.am b/libide/Makefile.am
index 83a0959..d0cba48 100644
--- a/libide/Makefile.am
+++ b/libide/Makefile.am
@@ -266,6 +266,8 @@ libide_1_0_la_SOURCES = \
libide/ide-source-view-capture.h \
libide/ide-source-view-movements.c \
libide/ide-source-view-movements.h \
+ libide/ide-vcs-uri.c \
+ libide/ide-vcs-uri.h \
libide/ide-vim-iter.c \
libide/ide-vim-iter.h \
libide/modelines/modeline-parser.c \
diff --git a/libide/ide-vcs-uri.c b/libide/ide-vcs-uri.c
new file mode 100644
index 0000000..49c1359
--- /dev/null
+++ b/libide/ide-vcs-uri.c
@@ -0,0 +1,395 @@
+/* ide-vcs-uri.c
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "ide-macros.h"
+#include "ide-vcs-uri.h"
+
+G_DEFINE_BOXED_TYPE (IdeVcsUri, ide_vcs_uri, ide_vcs_uri_ref, ide_vcs_uri_unref)
+
+struct _IdeVcsUri
+{
+ volatile gint ref_count;
+
+ gchar *scheme;
+ gchar *user;
+ gchar *host;
+ gchar *path;
+ guint port;
+};
+
+static gboolean
+ide_vcs_uri_parse (IdeVcsUri *self,
+ const gchar *str)
+{
+ static GRegex *regex1;
+ static GRegex *regex2;
+ static GRegex *regex3;
+ static gsize initialized;
+ GMatchInfo *match_info = NULL;
+ gboolean ret = FALSE;
+
+ if (g_once_init_enter (&initialized))
+ {
+ GError *error = NULL;
+
+ /* http://stackoverflow.com/questions/2514859/regular-expression-for-git-repository */
+
+ regex1 = g_regex_new ("(\\w+://)(.+@)*([\\w\\d\\.]+)(:[\\d]+){0,1}/*(.*)", 0, 0, NULL);
+ g_assert_no_error (error);
+ g_assert (regex1);
+
+ regex2 = g_regex_new ("file://(.*)", 0, 0, NULL);
+ g_assert_no_error (error);
+ g_assert (regex2);
+
+ regex3 = g_regex_new ("(.+@)*([\\w\\d\\.]+):(.*)", 0, 0, NULL);
+ g_assert_no_error (error);
+ g_assert (regex3);
+
+ g_once_init_leave (&initialized, TRUE);
+ }
+
+ if (str == NULL)
+ return FALSE;
+
+ /* check for ssh:// style network uris */
+ g_regex_match (regex1, str, 0, &match_info);
+ if (g_match_info_matches (match_info))
+ {
+ g_autofree gchar *scheme = NULL;
+ g_autofree gchar *user = NULL;
+ g_autofree gchar *host = NULL;
+ g_autofree gchar *path = NULL;
+ g_autofree gchar *portstr = NULL;
+ gint start_pos;
+ gint end_pos;
+ guint port = 0;
+
+ scheme = g_match_info_fetch (match_info, 1);
+ user = g_match_info_fetch (match_info, 2);
+ host = g_match_info_fetch (match_info, 3);
+ portstr = g_match_info_fetch (match_info, 4);
+ path = g_match_info_fetch (match_info, 5);
+
+ g_match_info_fetch_pos (match_info, 5, &start_pos, &end_pos);
+
+ if (*path != '~' && (start_pos > 0) && str [start_pos-1] == '/')
+ {
+ gchar *tmp;
+
+ tmp = path;
+ path = g_strdup_printf ("/%s", path);
+ g_free (tmp);
+ }
+
+ if (!ide_str_empty0 (portstr) && g_ascii_isdigit (portstr [1]))
+ port = CLAMP (atoi (&portstr [1]), 1, G_MAXINT16);
+
+ ide_vcs_uri_set_scheme (self, scheme);
+ ide_vcs_uri_set_user (self, user);
+ ide_vcs_uri_set_host (self, host);
+ ide_vcs_uri_set_port (self, port);
+ ide_vcs_uri_set_path (self, path);
+
+ ret = TRUE;
+ }
+ g_clear_pointer (&match_info, g_match_info_free);
+
+ if (ret)
+ return ret;
+
+ /* check for local file:// style uris */
+ g_regex_match (regex2, str, 0, &match_info);
+ if (g_match_info_matches (match_info))
+ {
+ g_autofree gchar *path = NULL;
+
+ path = g_match_info_fetch (match_info, 1);
+
+ ide_vcs_uri_set_scheme (self, "file://");
+ ide_vcs_uri_set_user (self, NULL);
+ ide_vcs_uri_set_host (self, NULL);
+ ide_vcs_uri_set_port (self, 0);
+ ide_vcs_uri_set_path (self, path);
+
+ ret = TRUE;
+ }
+ g_clear_pointer (&match_info, g_match_info_free);
+
+ if (ret)
+ return ret;
+
+ /* check for user host style uris */
+ g_regex_match (regex3, str, 0, &match_info);
+ if (g_match_info_matches (match_info))
+ {
+ g_autofree gchar *user = NULL;
+ g_autofree gchar *host = NULL;
+ g_autofree gchar *path = NULL;
+
+ user = g_match_info_fetch (match_info, 1);
+ host = g_match_info_fetch (match_info, 2);
+ path = g_match_info_fetch (match_info, 3);
+
+ ide_vcs_uri_set_user (self, user);
+ ide_vcs_uri_set_host (self, host);
+ ide_vcs_uri_set_path (self, path);
+ ide_vcs_uri_set_scheme (self, "ssh://");
+
+ ret = TRUE;
+ }
+ g_clear_pointer (&match_info, g_match_info_free);
+
+ if (ret)
+ return ret;
+
+ ide_vcs_uri_set_scheme (self, "file://");
+ ide_vcs_uri_set_user (self, NULL);
+ ide_vcs_uri_set_host (self, NULL);
+ ide_vcs_uri_set_port (self, 0);
+ ide_vcs_uri_set_path (self, str);
+
+ return TRUE;
+}
+
+IdeVcsUri *
+ide_vcs_uri_new (const gchar *uri)
+{
+ IdeVcsUri *self;
+
+ self = g_new0 (IdeVcsUri, 1);
+ self->ref_count = 1;
+
+ if (ide_vcs_uri_parse (self, uri))
+ return self;
+
+ g_free (self);
+
+ return NULL;
+}
+
+static void
+ide_vcs_uri_finalize (IdeVcsUri *self)
+{
+ g_free (self->scheme);
+ g_free (self->user);
+ g_free (self->host);
+ g_free (self->path);
+ g_free (self);
+}
+
+IdeVcsUri *
+ide_vcs_uri_ref (IdeVcsUri *self)
+{
+ g_return_val_if_fail (self, NULL);
+ g_return_val_if_fail (self->ref_count > 0, NULL);
+
+ g_atomic_int_inc (&self->ref_count);
+
+ return self;
+}
+
+void
+ide_vcs_uri_unref (IdeVcsUri *self)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (self->ref_count > 0);
+
+ if (g_atomic_int_dec_and_test (&self->ref_count))
+ ide_vcs_uri_finalize (self);
+}
+
+const gchar *
+ide_vcs_uri_get_scheme (const IdeVcsUri *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return self->scheme;
+}
+
+const gchar *
+ide_vcs_uri_get_user (const IdeVcsUri *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return self->user;
+}
+
+const gchar *
+ide_vcs_uri_get_host (const IdeVcsUri *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return self->host;
+}
+
+guint
+ide_vcs_uri_get_port (const IdeVcsUri *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return self->port;
+}
+
+const gchar *
+ide_vcs_uri_get_path (const IdeVcsUri *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return self->path;
+}
+
+void
+ide_vcs_uri_set_scheme (IdeVcsUri *self,
+ const gchar *scheme)
+{
+ g_return_if_fail (self);
+
+ if (scheme != self->scheme)
+ {
+ const gchar *tmp;
+
+ g_clear_pointer (&self->scheme, g_free);
+
+ if (scheme != NULL && (tmp = strchr (scheme, ':')))
+ self->scheme = g_strndup (scheme, tmp - scheme);
+ else
+ self->scheme = g_strdup (scheme);
+ }
+}
+
+void
+ide_vcs_uri_set_user (IdeVcsUri *self,
+ const gchar *user)
+{
+ g_return_if_fail (self);
+
+ if (ide_str_empty0 (user))
+ user = NULL;
+
+ if (user != self->user)
+ {
+ const gchar *tmp;
+
+ g_clear_pointer (&self->user, g_free);
+
+ if (user != NULL && (tmp = strchr (user, '@')))
+ self->user = g_strndup (user, tmp - user);
+ else
+ self->user = g_strdup (user);
+ }
+}
+
+void
+ide_vcs_uri_set_host (IdeVcsUri *self,
+ const gchar *host)
+{
+ g_return_if_fail (self);
+
+ if (host != self->host)
+ {
+ g_free (self->host);
+ self->host = g_strdup (host);
+ }
+}
+
+void
+ide_vcs_uri_set_port (IdeVcsUri *self,
+ guint port)
+{
+ g_return_if_fail (self);
+ g_return_if_fail (port >= 0);
+ g_return_if_fail (port <= G_MAXINT16);
+
+ self->port = port;
+}
+
+void
+ide_vcs_uri_set_path (IdeVcsUri *self,
+ const gchar *path)
+{
+ g_return_if_fail (self);
+
+ if (ide_str_empty0 (path))
+ path = NULL;
+
+ if (path != self->path)
+ {
+ if (path != NULL && (*path == ':'))
+ path++;
+ g_free (self->path);
+ self->path = g_strdup (path);
+ }
+}
+
+gchar *
+ide_vcs_uri_to_string (const IdeVcsUri *self)
+{
+ GString *str;
+
+ g_return_if_fail (self);
+
+ str = g_string_new (NULL);
+
+ g_string_append_printf (str, "%s://", self->scheme);
+
+ if (0 == g_strcmp0 (self->scheme, "file"))
+ {
+ g_string_append (str, self->path);
+ return g_string_free (str, FALSE);
+ }
+
+ if (self->user != NULL)
+ g_string_append_printf (str, "%s@", self->user);
+
+ g_string_append (str, self->host);
+
+ if (self->port != 0)
+ g_string_append_printf (str, ":%u", self->port);
+
+ if (self->path == NULL)
+ g_string_append (str, "/");
+ else if (self->path [0] == '~')
+ g_string_append_printf (str, "/%s", self->path);
+ else if (self->path [0] != '/')
+ g_string_append_printf (str, "/%s", self->path);
+ else
+ g_string_append (str, self->path);
+
+ return g_string_free (str, FALSE);
+}
+
+gboolean
+ide_vcs_uri_is_valid (const gchar *uri_string)
+{
+ gboolean ret = FALSE;
+
+ if (uri_string != NULL)
+ {
+ IdeVcsUri *uri;
+
+ uri = ide_vcs_uri_new (uri_string);
+ ret = !!uri;
+ g_clear_pointer (&uri, ide_vcs_uri_unref);
+ }
+
+ return ret;
+}
diff --git a/libide/ide-vcs-uri.h b/libide/ide-vcs-uri.h
new file mode 100644
index 0000000..6902ffa
--- /dev/null
+++ b/libide/ide-vcs-uri.h
@@ -0,0 +1,56 @@
+/* ide-vcs-uri.h
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef IDE_VCS_URI_H
+#define IDE_VCS_URI_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_VCS_URI (ide_vcs_uri_get_type())
+
+typedef struct _IdeVcsUri IdeVcsUri;
+
+GType ide_vcs_uri_get_type (void);
+IdeVcsUri *ide_vcs_uri_new (const gchar *uri);
+IdeVcsUri *ide_vcs_uri_ref (IdeVcsUri *self);
+void ide_vcs_uri_unref (IdeVcsUri *self);
+const gchar *ide_vcs_uri_get_scheme (const IdeVcsUri *self);
+const gchar *ide_vcs_uri_get_user (const IdeVcsUri *self);
+const gchar *ide_vcs_uri_get_host (const IdeVcsUri *self);
+guint ide_vcs_uri_get_port (const IdeVcsUri *self);
+const gchar *ide_vcs_uri_get_path (const IdeVcsUri *self);
+void ide_vcs_uri_set_scheme (IdeVcsUri *self,
+ const gchar *scheme);
+void ide_vcs_uri_set_user (IdeVcsUri *self,
+ const gchar *user);
+void ide_vcs_uri_set_host (IdeVcsUri *self,
+ const gchar *host);
+void ide_vcs_uri_set_port (IdeVcsUri *self,
+ guint port);
+void ide_vcs_uri_set_path (IdeVcsUri *self,
+ const gchar *path);
+gchar *ide_vcs_uri_to_string (const IdeVcsUri *self);
+gboolean ide_vcs_uri_is_valid (const gchar *uri_string);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (IdeVcsUri, ide_vcs_uri_unref)
+
+G_END_DECLS
+
+#endif /* IDE_VCS_URI_H */
diff --git a/libide/ide.h b/libide/ide.h
index 0b3559d..7a6b7ee 100644
--- a/libide/ide.h
+++ b/libide/ide.h
@@ -87,6 +87,7 @@ G_BEGIN_DECLS
#include "ide-unsaved-file.h"
#include "ide-unsaved-files.h"
#include "ide-vcs.h"
+#include "ide-vcs-uri.h"
#include "autotools/ide-autotools-build-system.h"
#include "autotools/ide-autotools-project-miner.h"
diff --git a/tests/test-ide-vcs-uri.c b/tests/test-ide-vcs-uri.c
new file mode 100644
index 0000000..46527ea
--- /dev/null
+++ b/tests/test-ide-vcs-uri.c
@@ -0,0 +1,92 @@
+#include <ide.h>
+
+typedef struct
+{
+ const gchar *uri;
+ const gchar *expected_scheme;
+ const gchar *expected_user;
+ const gchar *expected_host;
+ const gchar *expected_path;
+ guint expected_port;
+ const gchar *canonical;
+} UriTest;
+
+static void
+test_sample_uris (void)
+{
+ static const UriTest sample_uris[] = {
+ { "ssh://user host xz:22/path/to/repo.git/", "ssh", "user", "host.xz", "/path/to/repo.git/", 22,
"ssh://user host xz:22/path/to/repo.git/" },
+ { "ssh://user host xz/path/to/repo.git/", "ssh", "user", "host.xz", "/path/to/repo.git/", 0, "ssh://user
host xz/path/to/repo.git/" },
+ { "ssh://host.xz:1234/path/to/repo.git/", "ssh", NULL,"host.xz", "/path/to/repo.git/", 1234,
"ssh://host.xz:1234/path/to/repo.git/" },
+ { "ssh://host.xz/path/to/repo.git/", "ssh", NULL,"host.xz", "/path/to/repo.git/", 0,
"ssh://host.xz/path/to/repo.git/" },
+ { "ssh://user host xz/path/to/repo.git/", "ssh", "user","host.xz", "/path/to/repo.git/", 0, "ssh://user
host xz/path/to/repo.git/" },
+ { "ssh://host.xz/path/to/repo.git/", "ssh", NULL,"host.xz", "/path/to/repo.git/", 0,
"ssh://host.xz/path/to/repo.git/" },
+ { "ssh://user host xz/~user/path/to/repo.git/", "ssh", "user", "host.xz", "~user/path/to/repo.git/", 0,
"ssh://user host xz/~user/path/to/repo.git/" },
+ { "ssh://host.xz/~user/path/to/repo.git/", "ssh", NULL,"host.xz", "~user/path/to/repo.git/", 0,
"ssh://host.xz/~user/path/to/repo.git/" },
+ { "ssh://user host xz/~/path/to/repo.git", "ssh", "user", "host.xz", "~/path/to/repo.git",0, "ssh://user
host xz/~/path/to/repo.git" },
+ { "ssh://host.xz/~/path/to/repo.git", "ssh", NULL, "host.xz", "~/path/to/repo.git", 0,
"ssh://host.xz/~/path/to/repo.git" },
+ { "user host xz:/path/to/repo.git/", "ssh", "user", "host.xz", "/path/to/repo.git/", 0, "ssh://user host
xz/path/to/repo.git/" },
+ { "host.xz:/path/to/repo.git/", "ssh", NULL, "host.xz", "/path/to/repo.git/", 0,
"ssh://host.xz/path/to/repo.git/" },
+ { "user host xz:~user/path/to/repo.git/", "ssh", "user", "host.xz", "~user/path/to/repo.git/", 0,
"ssh://user host xz/~user/path/to/repo.git/" },
+ { "host.xz:~user/path/to/repo.git/", "ssh", NULL, "host.xz", "~user/path/to/repo.git/", 0,
"ssh://host.xz/~user/path/to/repo.git/" },
+ { "user host xz:path/to/repo.git", "ssh", "user", "host.xz", "path/to/repo.git", 0, "ssh://user host
xz/path/to/repo.git" },
+ { "host.xz:path/to/repo.git", "ssh", NULL, "host.xz", "path/to/repo.git", 0,
"ssh://host.xz/path/to/repo.git" },
+ { "rsync://host.xz/path/to/repo.git/", "rsync", NULL, "host.xz", "/path/to/repo.git/", 0,
"rsync://host.xz/path/to/repo.git/" },
+ { "git://host.xz/path/to/repo.git/", "git", NULL, "host.xz", "/path/to/repo.git/", 0,
"git://host.xz/path/to/repo.git/" },
+ { "git://host.xz/~user/path/to/repo.git/", "git", NULL, "host.xz", "~user/path/to/repo.git/", 0,
"git://host.xz/~user/path/to/repo.git/" },
+ { "http://host.xz/path/to/repo.git/";, "http", NULL, "host.xz", "/path/to/repo.git/", 0,
"http://host.xz/path/to/repo.git/"; },
+ { "https://host.xz/path/to/repo.git/";, "https", NULL, "host.xz", "/path/to/repo.git/", 0,
"https://host.xz/path/to/repo.git/"; },
+ { "/path/to/repo.git/", "file", NULL, NULL, "/path/to/repo.git/", 0, "file:///path/to/repo.git/" },
+ { "path/to/repo.git/", "file", NULL, NULL, "path/to/repo.git/", 0, "file://path/to/repo.git/" },
+ { "~/path/to/repo.git", "file", NULL, NULL, "~/path/to/repo.git", 0, "file://~/path/to/repo.git" },
+ { "file:///path/to/repo.git/", "file", NULL, NULL, "/path/to/repo.git/", 0, "file:///path/to/repo.git/"
},
+ { "file://~/path/to/repo.git/", "file", NULL, NULL, "~/path/to/repo.git/", 0,
"file://~/path/to/repo.git/" },
+ { NULL }
+ };
+ guint i;
+
+ for (i = 0; sample_uris [i].uri; i++)
+ {
+ g_autoptr(IdeVcsUri) uri = NULL;
+ g_autofree gchar *to_string = NULL;
+
+ uri = ide_vcs_uri_new (sample_uris [i].uri);
+
+ if (uri == NULL)
+ g_error ("Failed to parse %s\n", sample_uris [i].uri);
+
+#if 0
+ g_print ("\n%s (%u)\n"
+ " scheme: %s\n"
+ " user: %s\n"
+ " host: %s\n"
+ " port: %u\n"
+ " path: %s\n",
+ sample_uris [i].uri, i,
+ ide_vcs_uri_get_scheme (uri),
+ ide_vcs_uri_get_user (uri),
+ ide_vcs_uri_get_host (uri),
+ ide_vcs_uri_get_port (uri),
+ ide_vcs_uri_get_path (uri));
+#endif
+
+ g_assert (uri != NULL);
+ g_assert_cmpstr (sample_uris [i].expected_scheme, ==, ide_vcs_uri_get_scheme (uri));
+ g_assert_cmpstr (sample_uris [i].expected_user, ==, ide_vcs_uri_get_user (uri));
+ g_assert_cmpstr (sample_uris [i].expected_host, ==, ide_vcs_uri_get_host (uri));
+ g_assert_cmpstr (sample_uris [i].expected_path, ==, ide_vcs_uri_get_path (uri));
+ g_assert_cmpint (sample_uris [i].expected_port, ==, ide_vcs_uri_get_port (uri));
+
+ to_string = ide_vcs_uri_to_string (uri);
+ g_assert_cmpstr (sample_uris [i].canonical, ==, to_string);
+ }
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ g_test_init (&argc, &argv, NULL);
+ g_test_add_func ("/Ide/VcsUri/sample_uris", test_sample_uris);
+ return g_test_run ();
+}
diff --git a/tests/tests.mk b/tests/tests.mk
index 68819a8..2b9845e 100644
--- a/tests/tests.mk
+++ b/tests/tests.mk
@@ -53,6 +53,15 @@ test_ide_source_view_CFLAGS = \
test_ide_source_view_LDADD = libide-1.0.la $(LIBIDE_LIBS)
+noinst_PROGRAMS += test-ide-vcs-uri
+test_ide_vcs_uri_SOURCES = tests/test-ide-vcs-uri.c
+test_ide_vcs_uri_CFLAGS = \
+ $(libide_1_0_la_CFLAGS) \
+ -DTEST_DATA_DIR="\"$(top_srcdir)/tests/data\"" \
+ -DBUILDDIR="\"$(abs_top_builddir)\""
+test_ide_vcs_uri_LDADD = libide-1.0.la $(LIBIDE_LIBS)
+
+
EXTRA_DIST += \
tests/data/project1/configure.ac \
tests/tests.h \
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]