From c26b526dcd8adca44f670c3d1d3ef79059d11f7c Mon Sep 17 00:00:00 2001 From: Sanel Zukan Date: Tue, 18 Sep 2012 17:49:48 +0000 Subject: [PATCH] Importing svn2cl as it is used from script that makes release archives. Making code DBus optional; all DBus related code is wrapped inside EDELIB_HAVE_DBUS. --- configure.in | 7 +- ede-desktop/ede-desktop.cpp | 7 + ede-desktop/ede-desktop.h | 8 +- ede-launch/ede-launch.cpp | 39 +- ede-notify-daemon/ede-notify-daemon.cpp | 15 +- evoke/EvokeService.cpp | 25 +- evoke/Xsm.cpp | 107 +++++- evoke/Xsm.h | 14 +- tools/mk-ede-release.sh | 23 +- tools/svn2cl/authors.xml | 9 + tools/svn2cl/svn2cl.sh | 343 ++++++++++++++++++ tools/svn2cl/svn2cl.xsl | 457 ++++++++++++++++++++++++ 12 files changed, 1004 insertions(+), 50 deletions(-) create mode 100644 tools/svn2cl/authors.xml create mode 100755 tools/svn2cl/svn2cl.sh create mode 100644 tools/svn2cl/svn2cl.xsl diff --git a/configure.in b/configure.in index 646864d..48f6679 100644 --- a/configure.in +++ b/configure.in @@ -106,10 +106,7 @@ else fi if test -n "$with_edelib_path"; then - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$with_edelib_path" -else - dnl TODO: remove this in release - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/opt/ede/lib/pkgconfig" + export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$with_edelib_path/lib/pkgconfig" fi PKG_CHECK_MODULES(EDELIB, [edelib],, [have_edelib=no]) @@ -129,7 +126,7 @@ fi PKG_CHECK_MODULES(EDELIB_DBUS, [edelib-dbus],, [have_edelib_dbus=no]) if test "$have_edelib_dbus" = "no"; then - AC_MSG_ERROR(edelib-dbus not found! You must install it first) + AC_MSG_RESULT(edelib is compiled without DBus so EDE will be compiled without DBus support) fi dnl find edelib documentation diff --git a/ede-desktop/ede-desktop.cpp b/ede-desktop/ede-desktop.cpp index 6ca5ede..b10dbe1 100644 --- a/ede-desktop/ede-desktop.cpp +++ b/ede-desktop/ede-desktop.cpp @@ -224,7 +224,10 @@ Desktop::~Desktop() { delete gisett; delete selbox; + +#ifdef EDELIB_HAVE_DBUS delete dbus; +#endif DirWatch::shutdown(); foreign_callback_remove(settings_changed_cb); @@ -244,12 +247,14 @@ void Desktop::init_internals(void) { wallpaper = new Wallpaper(0, 0, w(), h()); end(); +#ifdef EDELIB_HAVE_DBUS dbus = new edelib::EdbusConnection(); if(!dbus->connect(edelib::EDBUS_SESSION)) { E_WARNING(E_STRLOC ": Unable to connect to session bus. Disabling dbus interface...\n"); delete dbus; dbus = NULL; } +#endif /* read main config */ read_config(); @@ -820,6 +825,7 @@ void Desktop::notify_desktop_changed(void) { return; } +#ifdef EDELIB_HAVE_DBUS if(dbus) { edelib::EdbusMessage msg; /* send org.equinoxproject.Desktop.DesktopChanged(int32, string) signal */ @@ -827,6 +833,7 @@ void Desktop::notify_desktop_changed(void) { msg << num << names[num]; dbus->send(msg); } +#endif XFreeStringList(names); } diff --git a/ede-desktop/ede-desktop.h b/ede-desktop/ede-desktop.h index 7bdc4a0..60b95ec 100644 --- a/ede-desktop/ede-desktop.h +++ b/ede-desktop/ede-desktop.h @@ -27,9 +27,12 @@ #include #include #include -#include #include +#ifdef EDELIB_HAVE_DBUS +# include +#endif + #define EDAMAGE_CHILD_LABEL 0x10 #define EDAMAGE_OVERLAY 0x20 @@ -109,7 +112,10 @@ private: edelib::MenuButton* dmenu; Wallpaper* wallpaper; + +#ifdef EDELIB_HAVE_DBUS edelib::EdbusConnection* dbus; +#endif DesktopIconList icons; DesktopIconList selectionbuf; diff --git a/ede-launch/ede-launch.cpp b/ede-launch/ede-launch.cpp index 4a307b2..28019e5 100644 --- a/ede-launch/ede-launch.cpp +++ b/ede-launch/ede-launch.cpp @@ -1,13 +1,21 @@ /* * $Id$ * - * ede-launch, launch external application - * Part of Equinox Desktop Environment (EDE). - * Copyright (c) 2008-2009 EDE Authors. - * - * This program is licensed under terms of the - * GNU General Public License version 2 or newer. - * See COPYING for details. + * Copyright (C) 2012 Sanel Zukan + * + * 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H @@ -47,6 +55,7 @@ #include #include #include +#include #include #include "StartupNotify.h" @@ -63,13 +72,14 @@ #define REGEX_PATTERN_URL "((http|https|ftp|gopher|!file):\\/\\/|www)[a-zA-Z0-9\\-\\._]+\\/?[a-zA-Z0-9_\\.\\-\\?\\+\\/~=&#;,]*[a-zA-Z0-9\\/]{1}" EDELIB_NS_USING_AS(Window, LaunchWindow) -EDELIB_NS_USING_LIST(12, (Resource, +EDELIB_NS_USING_LIST(14, (Resource, Regex, String, + list, DesktopFile, RES_USER_ONLY, DESK_FILE_TYPE_APPLICATION, - run_sync, run_async, alert, file_path, window_center_on_screen, str_ends)) + run_sync, run_async, alert, file_path, window_center_on_screen, str_ends, system_data_dirs)) static Fl_Pixmap image_run((const char**)run_xpm); static Fl_Input* dialog_input; @@ -348,6 +358,17 @@ FAIL: return false; } +static bool start_via_mime_cache(const char *arg) { + list dirs; + E_RETURN_VAL_IF_FAIL(system_data_dirs(dirs) > 0, false); + + DesktopFile d; + list::iterator it = dirs.begin(), ite = dirs.end(); + + for(; it != ite; ++it) { + } +} + /* concat all arguments preparing it for start_child() */ static void join_args(int start, int argc, char **argv, const char *program, String &ret, bool is_mailto = false) { String args; diff --git a/ede-notify-daemon/ede-notify-daemon.cpp b/ede-notify-daemon/ede-notify-daemon.cpp index c2c6243..c5111d3 100644 --- a/ede-notify-daemon/ede-notify-daemon.cpp +++ b/ede-notify-daemon/ede-notify-daemon.cpp @@ -26,11 +26,13 @@ #include #include +#include +#include + +#ifdef EDELIB_HAVE_DBUS #include #include -#include -#include #include #include #include @@ -63,7 +65,6 @@ #define WINDOWS_PADDING 10 #define IS_MEMBER(m, s1) (strcmp((m->member()), (s1)) == 0) -#define CHECK_ARGV(argv, pshort, plong) ((strcmp(argv, pshort) == 0) || (strcmp(argv, plong) == 0)) EDELIB_NS_USING(EdbusConnection) EDELIB_NS_USING(EdbusMessage) @@ -298,6 +299,8 @@ static int notifications_dbus_method_cb(const EdbusMessage *m, void *d) { return 1; } +#endif /* EDELIB_HAVE_DBUS */ + #if 0 static int notifications_dbus_signal_cb(const EdbusMessage *m, void *d) { E_DEBUG("+=> %s\n", m->member()); @@ -313,6 +316,8 @@ static void help(void) { puts(" -n, --no-daemon do not run in background"); } +#define CHECK_ARGV(argv, pshort, plong) ((strcmp(argv, pshort) == 0) || (strcmp(argv, plong) == 0)) + int main(int argc, char **argv) { /* daemon behaves as GUI app, as will use icon theme and etc. */ EDE_APPLICATION("ede-notify-daemon"); @@ -329,6 +334,7 @@ int main(int argc, char **argv) { } } +#ifdef EDELIB_HAVE_DBUS server_running = false; notify_id = 0; EdbusConnection dbus; @@ -359,5 +365,8 @@ int main(int argc, char **argv) { Fl::wait(FOREVER); IconLoader::shutdown(); +#else + E_WARNING(E_STRLOC ": edelib is compiled without DBus so notification daemon is not able to receive notification messages\n"); +#endif return 0; } diff --git a/evoke/EvokeService.cpp b/evoke/EvokeService.cpp index e8dd192..796a895 100644 --- a/evoke/EvokeService.cpp +++ b/evoke/EvokeService.cpp @@ -26,8 +26,11 @@ #include #include #include + +#if EDELIB_HAVE_DBUS #include #include +#endif #include "EvokeService.h" #include "Splash.h" @@ -37,11 +40,6 @@ EDELIB_NS_USING(Config) EDELIB_NS_USING(Resource) -EDELIB_NS_USING(EdbusMessage) -EDELIB_NS_USING(EdbusConnection) -EDELIB_NS_USING(EdbusError) -EDELIB_NS_USING(EDBUS_SESSION) -EDELIB_NS_USING(EDBUS_SYSTEM) EDELIB_NS_USING(RES_SYS_ONLY) EDELIB_NS_USING(file_remove) EDELIB_NS_USING(file_test) @@ -51,6 +49,14 @@ EDELIB_NS_USING(alert) EDELIB_NS_USING(ask) EDELIB_NS_USING(FILE_TEST_IS_REGULAR) +#if EDELIB_HAVE_DBUS +EDELIB_NS_USING(EdbusMessage) +EDELIB_NS_USING(EdbusConnection) +EDELIB_NS_USING(EdbusError) +EDELIB_NS_USING(EDBUS_SESSION) +EDELIB_NS_USING(EDBUS_SYSTEM) +#endif + #ifdef USE_LOCAL_CONFIG # define CONFIG_GET_STRVAL(object, section, key, buff) object.get(section, key, buff, sizeof(buff)) #else @@ -90,17 +96,21 @@ static int get_int_property_value(Atom at) { } static void send_dbus_ede_quit(void) { +#ifdef EDELIB_HAVE_DBUS EdbusConnection c; E_RETURN_IF_FAIL(c.connect(EDBUS_SESSION)); EdbusMessage msg; msg.create_signal("/org/equinoxproject/Shutdown", "org.equinoxproject.Shutdown", "Shutdown"); c.send(msg); +#endif } static bool do_shutdown_or_restart(bool restart) { const char *action; + int r = 1; +#ifdef EDELIB_HAVE_DBUS EdbusConnection c; if(!c.connect(EDBUS_SYSTEM)) { alert(_("Unable to connect to HAL daemon. Make sure both D-BUS and HAL daemons are running")); @@ -131,8 +141,9 @@ static bool do_shutdown_or_restart(bool restart) { if((*it).to_bool() == true) return true; - int r = ask(_("You are not allowed to execute this command. Please consult ConsoleKit documentation on how to allow privileged actions. " - "Would you like to try to execute system commands?")); + r = ask(_("You are not allowed to execute this command. Please consult ConsoleKit documentation on how to allow privileged actions. " + "Would you like to try to execute system commands?")); +#endif /* EDELIB_HAVE_DBUS */ /* try to do things manually */ if(!r) return false; diff --git a/evoke/Xsm.cpp b/evoke/Xsm.cpp index 0ee5c7a..791f517 100644 --- a/evoke/Xsm.cpp +++ b/evoke/Xsm.cpp @@ -26,7 +26,10 @@ #include #include #include -#include + +#ifdef EDELIB_HAVE_DBUS +# include +#endif #include "Xsm.h" @@ -41,9 +44,12 @@ EDELIB_NS_USING(Resource) EDELIB_NS_USING(XSettingsSetting) EDELIB_NS_USING(XSettingsList) +#ifdef EDELIB_HAVE_DBUS EDELIB_NS_USING(EdbusMessage) EDELIB_NS_USING(EdbusData) EDELIB_NS_USING(EdbusList) +EDELIB_NS_USING(EDBUS_SESSION) +#endif EDELIB_NS_USING(dir_home) EDELIB_NS_USING(file_remove) @@ -58,7 +64,8 @@ EDELIB_NS_USING(color_fltk_to_html) EDELIB_NS_USING(XSETTINGS_TYPE_COLOR) EDELIB_NS_USING(XSETTINGS_TYPE_INT) EDELIB_NS_USING(XSETTINGS_TYPE_STRING) -EDELIB_NS_USING(EDBUS_SESSION) + +#define STR_CMP(s1, s2) (strcmp((s1), (s2)) == 0) struct ResourceMap { const char* name; @@ -83,6 +90,7 @@ static int ignore_xerrors(Display* display, XErrorEvent* xev) { return True; } +#ifdef EDELIB_HAVE_DBUS static void handle_get_type(XSettingsData* mdata, const EdbusMessage* orig, EdbusMessage& reply) { if(orig->size() != 1) { reply.create_error_reply(*orig, _("This function accepts only one parameter")); @@ -247,13 +255,75 @@ static void handle_set(Xsm* xsm, XSettingsData* mdata, const EdbusMessage* orig, } } +#define XSM_OBJECT_PATH "/org/equinoxproject/Xsettings" + +#define XSM_INTROSPECTION_XML \ +"\n"\ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +" \n" \ +"\n"; static int xsettings_dbus_cb(const EdbusMessage* m, void* data) { Xsm* x = (Xsm*)data; XSettingsData* md = x->get_manager_data(); + /* introspection */ + if(STR_CMP(m->member(), "Introspect") && + STR_CMP(m->interface(), "org.freedesktop.DBus.Introspectable") && + STR_CMP(m->destination(), "org.equinoxproject.Xsettings")) + { + String ret = EDBUS_INTROSPECTION_DTD; + + if(STR_CMP(m->path(), XSM_OBJECT_PATH)) { + ret += XSM_INTROSPECTION_XML; + } else { + ret += "\n path(), "/")) + ret += "name=\"org\""; + else if(STR_CMP(m->path(), "/org")) + ret += "name=\"equinoxproject\""; + else if(STR_CMP(m->path(), "/org/equinoxproject")) + ret += "name=\"Xsettings\""; + + ret += " />\n\n"; + } + + EdbusMessage reply; + reply.create_reply(*m); + reply << EdbusData::from_string(ret.c_str()); + x->get_dbus_connection()->send(reply); + return 1; + } + /* string GetType(string name) */ - if(strcmp(m->member(), "GetType") == 0) { + if(STR_CMP(m->member(), "GetType")) { EdbusMessage reply; handle_get_type(md, m, reply); @@ -262,7 +332,7 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) { } /* string-array GetAll(void) */ - if(strcmp(m->member(), "GetAll") == 0) { + if(STR_CMP(m->member(), "GetAll")) { EdbusMessage reply; handle_get_all(md, m, reply); @@ -272,7 +342,7 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) { } /* [string|array|int32] GetValue(string name) */ - if(strcmp(m->member(), "GetValue") == 0) { + if(STR_CMP(m->member(), "GetValue")) { EdbusMessage reply; handle_get_value(md, m, reply); @@ -282,19 +352,19 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) { } /* void Remove(string name) */ - if(strcmp(m->member(), "Remove") == 0) { + if(STR_CMP(m->member(), "Remove")) { handle_remove(x, md, m); return 1; } /* void Flush(void) */ - if(strcmp(m->member(), "Flush") == 0) { + if(STR_CMP(m->member(), "Flush")) { x->save_serialized(); return 1; } /* bool Set(string name, [string|array|int32] value) */ - if(strcmp(m->member(), "Set") == 0) { + if(STR_CMP(m->member(), "Set")) { EdbusMessage reply; handle_set(x, md, m, reply); @@ -302,13 +372,10 @@ static int xsettings_dbus_cb(const EdbusMessage* m, void* data) { return 1; } - return 1; + return 0; } -Xsm::~Xsm() { - E_DEBUG(E_STRLOC ": Xsm::~Xsm()\n"); - delete dbus_conn; -} +#endif /* EDELIB_HAVE_DBUS */ /* * This is a short explaination how evoke's XSETTINGS part is combined @@ -373,7 +440,7 @@ void Xsm::xresource_replace(void) { /* check if resource is present */ status = XrmGetResource(db, resource_map[i].xresource_key, resource_map[i].xresource_klass, &type, &xrmv); - if(status && strcmp(type, "String") == 0) { + if(status && STR_CMP(type, "String")) { E_DEBUG(E_STRLOC ": %s.%s found in database\n", resource_map[i].xresource_klass, resource_map[i].xresource_key); } @@ -427,6 +494,7 @@ void Xsm::xresource_undo(void) { } void Xsm::xsettings_dbus_serve(void) { +#ifdef EDELIB_HAVE_DBUS E_RETURN_IF_FAIL(!dbus_conn); EdbusConnection* d = new EdbusConnection; @@ -443,11 +511,12 @@ void Xsm::xsettings_dbus_serve(void) { return; } - d->register_object("/org/equinoxproject/Xsettings"); + d->register_object(XSM_OBJECT_PATH); d->method_callback(xsettings_dbus_cb, this); d->setup_listener_with_fltk(); dbus_conn = d; +#endif /* EDELIB_HAVE_DBUS */ } bool Xsm::load_serialized(void) { @@ -481,7 +550,7 @@ bool Xsm::load_serialized(void) { return false; for(elem = elem->FirstChildElement(); elem; elem = elem->NextSibling()) { - if(strcmp(elem->Value(), "setting") != 0) { + if(!STR_CMP(elem->Value(), "setting")) { E_WARNING(E_STRLOC ": Got unknown child in 'ede-setting' %s\n", elem->Value()); continue; } @@ -498,11 +567,11 @@ bool Xsm::load_serialized(void) { continue; } - if(strcmp(type, "int") == 0) + if(STR_CMP(type, "int")) cmp = 1; - else if(strcmp(type, "string") == 0) + else if(STR_CMP(type, "string")) cmp = 2; - else if(strcmp(type, "color") == 0) + else if(STR_CMP(type, "color")) cmp = 3; else { E_WARNING(E_STRLOC ": Unknown type %s\n", type); diff --git a/evoke/Xsm.h b/evoke/Xsm.h index 5c1a4e1..9898cef 100644 --- a/evoke/Xsm.h +++ b/evoke/Xsm.h @@ -14,15 +14,20 @@ #define __XSM_H__ #include -#include +#ifdef EDELIB_HAVE_DBUS +# include EDELIB_NS_USING(EdbusConnection) +#endif + EDELIB_NS_USING(XSettingsData) /* XSETTINGS manager with serialization capability. Also it will write/undo to xrdb (X Resource database). */ class Xsm : public edelib::XSettingsManager { private: +#ifdef EDELIB_HAVE_DBUS EdbusConnection* dbus_conn; +#endif /* replace XResource values from one from XSETTINGS */ void xresource_replace(void); @@ -33,11 +38,14 @@ private: /* serve XSETTINGS via D-Bus */ void xsettings_dbus_serve(void); public: - Xsm() : dbus_conn(NULL) { } - ~Xsm(); +#ifdef EDELIB_HAVE_DBUS + Xsm() { dbus_conn = NULL; } + + ~Xsm() { delete dbus_conn; } /* return loaded D-Bus connection */ EdbusConnection* get_dbus_connection(void) { return dbus_conn; } +#endif /* access to manager content */ XSettingsData* get_manager_data(void) { return manager_data; } diff --git a/tools/mk-ede-release.sh b/tools/mk-ede-release.sh index a35fea7..8974304 100755 --- a/tools/mk-ede-release.sh +++ b/tools/mk-ede-release.sh @@ -6,12 +6,21 @@ RELEASE_VERSION="2.0" ############################################ +script_dir="$( cd "$( dirname "$0" )" && pwd )" +release_dir="release-$RELEASE_VERSION" +release_dir_full="`pwd`/$release_dir" + dprint() { echo "* $1" } -release_dir="release-$RELEASE_VERSION" -release_dir_full="`pwd`/$release_dir" +generate_changelog() { + $script_dir/svn2cl/svn2cl.sh --authors=$script_dir/svn2cl/authors.xml -o $1/ChangeLog $1 +} + +upload_file() { + scp $1-$2.tar.gz karijes@frs.sourceforge.net:/home/frs/project/ede/$1/$2/$1-$2.tar.gz +} # prepare location dir rm -Rf $release_dir @@ -31,13 +40,15 @@ svn copy "$ede_svn_trunk/edelib" "$ede_svn_tags/edelib-$RELEASE_VERSION" -m "Tag dprint "Tagging ede" svn copy "$ede_svn_trunk/ede2" "$ede_svn_tags/ede-$RELEASE_VERSION" -m "Tagging ede to $RELEASE_VERSION" -############################################ +########################################### package="edelib-$RELEASE_VERSION" dprint "Getting edelib..." svn co "$ede_svn_trunk/edelib" $package +generate_changelog $package + cd $package find . -name ".svn" -type d | xargs rm -Rf ./autogen.sh @@ -54,6 +65,8 @@ package="ede-$RELEASE_VERSION" dprint "Getting ede..." svn co "$ede_svn_trunk/ede2" $package +generate_changelog $package + cd $package find . -name ".svn" -type d | xargs rm -Rf ./autogen.sh @@ -77,3 +90,7 @@ cd .. tar -czpvf $package.tar.gz $package md5sum $package.tar.gz >> checksum +############################################ + +#upload_file edelib $RELEASE_VERSION +#upload_file ede $RELEASE_VERSION diff --git a/tools/svn2cl/authors.xml b/tools/svn2cl/authors.xml new file mode 100644 index 0000000..f92f812 --- /dev/null +++ b/tools/svn2cl/authors.xml @@ -0,0 +1,9 @@ + + + + Sanel Zukan <karijes@users.sourceforge.net> + + + Vedran Ljubovic <vljubovic@users.sourceforge.net> + + diff --git a/tools/svn2cl/svn2cl.sh b/tools/svn2cl/svn2cl.sh new file mode 100755 index 0000000..1c549f7 --- /dev/null +++ b/tools/svn2cl/svn2cl.sh @@ -0,0 +1,343 @@ +#!/bin/sh + +# svn2cl.sh - front end shell script for svn2cl.xsl, calls xsltproc +# with the correct parameters +# +# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Arthur de Jong. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# exit on any failures +set -e +# report unset variables +set -u + +# svn2cl version +VERSION="0.13" + +# set default parameters +PWD=`pwd` +STRIPPREFIX="AUTOMATICALLY-DETERMINED" +LINELEN=75 +GROUPBYDAY="no" +INCLUDEREV="no" +BREAKBEFOREMSG="no" +REPARAGRAPH="no" +SEPARATEDAYLOGS="no" +ACTIONS="no" +CHANGELOG="" +OUTSTYLE="cl" +SVNLOGCMD="svn --verbose --xml log" +SVNINFOCMD="svn --non-interactive info" +AUTHORSFILE="" +IGNORE_MESSAGE_STARTING="" +TITLE="ChangeLog" +REVISION_LINK="#r" +TICKET_LINK="" +TMPFILES="" +AWK="awk" + +# do command line checking +prog=`basename "$0"` +while [ $# -gt 0 ] +do + case "$1" in + --strip-prefix) + STRIPPREFIX="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --strip-prefix=*) + STRIPPREFIX=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --linelen) + LINELEN="$2"; + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --linelen=*) + LINELEN=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --group-by-day) + GROUPBYDAY="yes"; + shift + ;; + --separate-daylogs) + SEPARATEDAYLOGS="yes" + shift + ;; + -i|--include-rev) + INCLUDEREV="yes"; + shift + ;; + -a|--include-actions) + ACTIONS="yes" + shift + ;; + --break-before-msg|--breaks-before-msg) + # FIXME: if next argument is numeric use that as a parameter + BREAKBEFOREMSG="yes" + shift + ;; + --break-before-msg=*|--breaks-before-msg=*) + BREAKBEFOREMSG=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --reparagraph) + REPARAGRAPH="yes" + shift + ;; + --title) + TITLE="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --title=*) + TITLE=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --revision-link) + REVISION_LINK="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --revision-link=*) + REVISION_LINK=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --ticket-link) + TICKET_LINKK="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --ticket-link=*) + TICKET_LINK=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --ignore-message-starting) + IGNORE_MESSAGE_STARTING="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --ignore-message-starting=*) + IGNORE_MESSAGE_STARTING=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + -f|--file|-o|--output) + CHANGELOG="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --file=*|--output=*) + CHANGELOG=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --stdout) + CHANGELOG="-" + shift + ;; + --authors) + AUTHORSFILE="$2" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --authors=*) + AUTHORSFILE=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --html) + OUTSTYLE="html" + shift + ;; + -r|--revision|-c|--change|--targets|-l|--limit) + # add these as extra options to the log command (with argument) + arg=`echo "$2" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD $1 '$arg'" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --revision=*|--change=*|--targets=*|--limit=*) + # these are single argument versions of the above (with argument) + arg=`echo "$1" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD '$arg'" + shift + ;; + --username|--password|--config-dir|--config-option) + # add these as extra options to the log and info commands (with argument) + arg=`echo "$2" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD $1 '$arg'" + SVNINFOCMD="$SVNINFOCMD $1 '$arg'" + shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; } + ;; + --username=*|--password=*|--config-dir=*|--config-option=*) + # these are single argument versions of the above (with argument) + arg=`echo "$1" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD '$arg'" + SVNINFOCMD="$SVNINFOCMD '$arg'" + shift + ;; + -g|--use-merge-history|--stop-on-copy) + # add these as simple options to the log command + SVNLOGCMD="$SVNLOGCMD $1" + shift + ;; + --no-auth-cache|--non-interactive|--trust-server-cert) + # add these as simple options to both the log and info commands + SVNLOGCMD="$SVNLOGCMD $1" + SVNINFOCMD="$SVNINFOCMD $1" + shift + ;; + -V|--version) + echo "$prog $VERSION"; + echo "Written by Arthur de Jong." + echo "" + echo "Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Arthur de Jong." + echo "This is free software; see the source for copying conditions. There is NO" + echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit 0 + ;; + -h|--help) + echo "Usage: $prog [OPTION]... [PATH]..." + echo "Generate a ChangeLog from a subversion repository." + echo "" + echo " --strip-prefix=NAME prefix to strip from all entries, defaults path" + echo " inside the repository" + echo " --linelen=NUM maximum length of an output line" + echo " --group-by-day group changelog entries by day" + echo " --separate-daylogs put a blank line between grouped by day entries" + echo " -i, --include-rev include revision numbers" + echo " -a, --include-actions add [ADD], [DEL] and [CPY] tags to files" + echo " --break-before-msg[=NUM] add a line break (or multiple breaks)" + echo " between the paths and the log message" + echo " --reparagraph rewrap lines inside a paragraph" + echo " --title=NAME title used in html file" + echo " --revision-link=NAME link revision numbers in html output" + echo " --ticket-link=NAME change #foo strings to links" + echo " --ignore-message-starting=STRING" + echo " ignore messages starting with the string" + echo " -o, --output=FILE output to FILE instead of ChangeLog" + echo " -f, --file=FILE alias for -o, --output" + echo " --stdout output to stdout instead of ChangeLog" + echo " --authors=FILE file to read for authors" + echo " --html output as html instead of plain text" + echo " -h, --help display this help and exit" + echo " -V, --version output version information and exit" + echo "" + echo "PATH arguments and the following options are passed to the svn log" + echo "command: -r, --revision, -g, --use-merge-history, -c, --change," + echo "--targets, --stop-on-copy, -l, --username, --password, --no-auth-cache," + echo "--non-interactive, --trust-server-cert, --config-dir and --config-option" + echo "(see 'svn help log' for more information)." + exit 0 + ;; + -*) + echo "$prog: invalid option -- $1" + echo "Try '$prog --help' for more information." + exit 1 + ;; + *) + arg=`echo "$1" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD '$arg'" + SVNINFOCMD="$SVNINFOCMD '$arg'" + shift + ;; + esac +done + +# find the directory that this script resides in +prog="$0" +while [ -h "$prog" ] +do + dir=`dirname "$prog"` + prog=`ls -ld "$prog" | sed "s/^.*-> \(.*\)/\1/;/^[^/]/s,^,$dir/,"` +done +dir=`dirname "$prog"` +dir=`cd "$dir" && pwd` +XSL="$dir/svn2${OUTSTYLE}.xsl" + +# check if the authors file is formatted as a legacy +# colon separated file +if [ -n "$AUTHORSFILE" ] && \ + egrep '^(#.*|[a-zA-Z0-9].*:)' "$AUTHORSFILE" > /dev/null 2>/dev/null +then + # create a temporary file + tmpfile=`mktemp -t svn2cl.XXXXXX 2> /dev/null || tempfile -s .svn2cl 2> /dev/null || echo "$AUTHORSFILE.$$.xml"` + arg=`echo "$tmpfile" | sed "s/'/'\"'\"'/g"` + TMPFILES="$TMPFILES '$arg'" + # generate an authors.xml file on the fly + echo '' > "$tmpfile" + sed -n 's/&/\&/g;s//\>/g;s|^\([a-zA-Z0-9][^:]*\):\(.*\)$| \2|p' \ + < "$AUTHORSFILE" >> "$tmpfile" + echo '' >> "$tmpfile" + AUTHORSFILE="$tmpfile" +fi + +# find the absolute path of the authors file +# (otherwise xsltproc will find the file relative to svn2cl.xsl) +pwd=`pwd` +AUTHORSFILE=`echo "$AUTHORSFILE" | sed "/^[^/]/s|^|$pwd/|"` + +# if no filename was specified, make one up +if [ -z "$CHANGELOG" ] +then + CHANGELOG="ChangeLog" + if [ "$OUTSTYLE" != "cl" ] + then + CHANGELOG="$CHANGELOG.$OUTSTYLE" + fi +fi + +# try to determin a prefix to strip from all paths +if [ "$STRIPPREFIX" = "AUTOMATICALLY-DETERMINED" ] +then + STRIPPREFIX=`LANG=C eval "$SVNINFOCMD" | $AWK '/^URL:/{url=$2} /^Repository Root:/{root=$3} END{if(root){print substr(url,length(root)+2)}else{n=split(url,u,"/");print u[n]}}'` + STRIPPREFIX=`echo "$STRIPPREFIX" | sed 's/%20/ /g'` +fi + +# redirect stdout to the changelog file if needed +if [ "x$CHANGELOG" != "x-" ] +then + exec > "$CHANGELOG" +fi + +# actually run the command we need +eval "$SVNLOGCMD" | \ + xsltproc --stringparam strip-prefix "$STRIPPREFIX" \ + --stringparam linelen "$LINELEN" \ + --stringparam groupbyday "$GROUPBYDAY" \ + --stringparam separate-daylogs "$SEPARATEDAYLOGS" \ + --stringparam include-rev "$INCLUDEREV" \ + --stringparam include-actions "$ACTIONS" \ + --stringparam breakbeforemsg "$BREAKBEFOREMSG" \ + --stringparam reparagraph "$REPARAGRAPH" \ + --stringparam authorsfile "$AUTHORSFILE" \ + --stringparam title "$TITLE" \ + --stringparam revision-link "$REVISION_LINK" \ + --stringparam ticket-link "$TICKET_LINK" \ + --stringparam ignore-message-starting "$IGNORE_MESSAGE_STARTING" \ + --nowrite \ + --nomkdir \ + --nonet \ + "$XSL" - + +# clean up temporary files +[ -n "$TMPFILES" ] && eval "rm -f $TMPFILES" + +# we're done (the previous command could return false) +exit 0 diff --git a/tools/svn2cl/svn2cl.xsl b/tools/svn2cl/svn2cl.xsl new file mode 100644 index 0000000..9d8d21b --- /dev/null +++ b/tools/svn2cl/svn2cl.xsl @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [r + + ] + + + + + + + + + + + + + + + + + + + + + + + * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , + + + + + + . + + + + + + + + + + + + + + + , + + + + + + + + + + + + + + + + [DEL] + + + [CPY] + + + [ADD] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +