lib/SVN.h

Code
Comments
Other
Rev Date Author Line
165 24 Aug 06 jari 1 #ifndef _theplu_svndigest_svn_
165 24 Aug 06 jari 2 #define _theplu_svndigest_svn_
165 24 Aug 06 jari 3
91 23 Mar 06 jari 4 // $Id$
91 23 Mar 06 jari 5
91 23 Mar 06 jari 6 /*
978 12 Dec 09 peter 7   Copyright (C) 2006 Jari Häkkinen
978 12 Dec 09 peter 8   Copyright (C) 2007, 2008 Jari Häkkinen, Peter Johansson
1635 30 Mar 23 peter 9   Copyright (C) 2009, 2010, 2012, 2023 Peter Johansson
91 23 Mar 06 jari 10
687 04 Aug 08 peter 11   This file is part of svndigest, http://dev.thep.lu.se/svndigest
91 23 Mar 06 jari 12
149 12 Aug 06 jari 13   svndigest is free software; you can redistribute it and/or modify it
91 23 Mar 06 jari 14   under the terms of the GNU General Public License as published by
693 11 Sep 08 jari 15   the Free Software Foundation; either version 3 of the License, or
91 23 Mar 06 jari 16   (at your option) any later version.
91 23 Mar 06 jari 17
149 12 Aug 06 jari 18   svndigest is distributed in the hope that it will be useful, but
91 23 Mar 06 jari 19   WITHOUT ANY WARRANTY; without even the implied warranty of
149 12 Aug 06 jari 20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
91 23 Mar 06 jari 21   General Public License for more details.
91 23 Mar 06 jari 22
91 23 Mar 06 jari 23   You should have received a copy of the GNU General Public License
693 11 Sep 08 jari 24   along with svndigest. If not, see <http://www.gnu.org/licenses/>.
91 23 Mar 06 jari 25 */
91 23 Mar 06 jari 26
800 03 Jul 09 peter 27 // Turning off warnings from using deprecated function, i.e., we are
800 03 Jul 09 peter 28 // using subversion 1.4
800 03 Jul 09 peter 29 #ifndef SVN_DEPRECATED
800 03 Jul 09 peter 30 #define SVN_DEPRECATED
800 03 Jul 09 peter 31 #endif
800 03 Jul 09 peter 32
800 03 Jul 09 peter 33
185 06 Sep 06 jari 34 #include <map>
91 23 Mar 06 jari 35 #include <stdexcept>
123 29 Jul 06 jari 36 #include <string>
123 29 Jul 06 jari 37 #include <vector>
91 23 Mar 06 jari 38
164 23 Aug 06 jari 39 #include <subversion-1/svn_client.h>
164 23 Aug 06 jari 40 #include <subversion-1/svn_types.h>
91 23 Mar 06 jari 41
91 23 Mar 06 jari 42 namespace theplu {
149 12 Aug 06 jari 43 namespace svndigest {
91 23 Mar 06 jari 44
233 26 Mar 07 peter 45   struct log_receiver_baton;
233 26 Mar 07 peter 46
91 23 Mar 06 jari 47   ///
140 04 Aug 06 jari 48   /// If something goes wrong in the use of the different SVN classes,
140 04 Aug 06 jari 49   /// an SVNException is thrown.
91 23 Mar 06 jari 50   ///
91 23 Mar 06 jari 51   struct SVNException : public std::runtime_error
1513 23 Sep 12 peter 52   {
1215 09 Oct 10 peter 53     SVNException(const std::string& msg, svn_error_t* error=NULL);
91 23 Mar 06 jari 54
1219 12 Oct 10 peter 55     /**
1219 12 Oct 10 peter 56        Copy constructor
1219 12 Oct 10 peter 57      */
1219 12 Oct 10 peter 58     SVNException(const SVNException& other);
1219 12 Oct 10 peter 59
1219 12 Oct 10 peter 60     /**
1219 12 Oct 10 peter 61        Destructor
1219 12 Oct 10 peter 62      */
1215 09 Oct 10 peter 63     virtual ~SVNException(void) throw();
1219 12 Oct 10 peter 64
1215 09 Oct 10 peter 65     /**
1215 09 Oct 10 peter 66        override base implementation
1215 09 Oct 10 peter 67      */
1215 09 Oct 10 peter 68     const char* what(void) const throw();
1215 09 Oct 10 peter 69
1215 09 Oct 10 peter 70     /**
1215 09 Oct 10 peter 71        access svn_error_t
1215 09 Oct 10 peter 72      */
1215 09 Oct 10 peter 73     const svn_error_t* error(void) const;
1215 09 Oct 10 peter 74   private:
1215 09 Oct 10 peter 75     svn_error_t* error_;
1215 09 Oct 10 peter 76     std::string msg_;
1219 12 Oct 10 peter 77     int* ref_count_;
1219 12 Oct 10 peter 78
1219 12 Oct 10 peter 79     // assignment not allowed
1219 12 Oct 10 peter 80     SVNException& operator=(const SVNException&);
1215 09 Oct 10 peter 81   };
1215 09 Oct 10 peter 82
318 18 May 07 jari 83   /**
318 18 May 07 jari 84      \brief The SVN class is a front end to the subversion API.
318 18 May 07 jari 85
318 18 May 07 jari 86      SVN provides one single global access point to the underlying
318 18 May 07 jari 87      subversion API and makes sure that there is only one point of
318 18 May 07 jari 88      access for the binary.
318 18 May 07 jari 89
318 18 May 07 jari 90      The singleton SVN object should be initialized with
318 18 May 07 jari 91      SVN::instancs(const std::string& path), rather than
318 18 May 07 jari 92      SVN::instance(void), before using any other subversion related
318 18 May 07 jari 93      classes or calls. Best practice is to initilize the singleton
318 18 May 07 jari 94      object early in the main program. The logic behind this
318 18 May 07 jari 95      requirement is that all subverison related classes and calls
318 18 May 07 jari 96      expect that repository and WC access is properly set up at
318 18 May 07 jari 97      initialization. However, most functionality is available
318 18 May 07 jari 98      irrespectively which instance call is made.
318 18 May 07 jari 99
318 18 May 07 jari 100      \see Design Patterns (the singleton pattern). Subversion API
318 18 May 07 jari 101      documents, SVN::instancs(void), SVN::instancs(const
318 18 May 07 jari 102      std::string&).
318 18 May 07 jari 103   */
91 23 Mar 06 jari 104   class SVN {
91 23 Mar 06 jari 105   public:
91 23 Mar 06 jari 106
91 23 Mar 06 jari 107     enum vc_status {
91 23 Mar 06 jari 108       unversioned=0,
91 23 Mar 06 jari 109       uptodate,
91 23 Mar 06 jari 110       unresolved
91 23 Mar 06 jari 111     };
91 23 Mar 06 jari 112
318 18 May 07 jari 113     /**
318 18 May 07 jari 114        \brief Call the underlying svn_client_blame3 for \a path with
318 18 May 07 jari 115        \a receiver and \a baton.
318 18 May 07 jari 116
318 18 May 07 jari 117        This function is called from SVNblame to do 'svn blame' on an
318 18 May 07 jari 118        item. The \a receiver and \a baton is defined in SVNblame and
318 18 May 07 jari 119        the \a receiver is called by the underlying subversion API for
318 18 May 07 jari 120        every line in \a path provided it the item is under subversion
318 18 May 07 jari 121        control. The \a baton is used to communicate anonymous
318 18 May 07 jari 122        information through the API to the \a receiver. If \a path is a
318 18 May 07 jari 123        binary object an error is returned, all other errors will
318 18 May 07 jari 124        generate an SVNException.
318 18 May 07 jari 125
318 18 May 07 jari 126        \a path can be either a URL or an WC target.
318 18 May 07 jari 127     */
1218 10 Oct 10 peter 128     void client_blame(const std::string& path,
1218 10 Oct 10 peter 129                       svn_client_blame_receiver_t receiver,
1218 10 Oct 10 peter 130                       void *baton);
138 03 Aug 06 jari 131
318 18 May 07 jari 132     /**
501 19 Oct 07 peter 133        \brief Same as function above with the extension that revision
501 19 Oct 07 peter 134        \a rev can be set.
501 19 Oct 07 peter 135      */
1218 10 Oct 10 peter 136     void client_blame(const std::string& path,
1218 10 Oct 10 peter 137                       svn_client_blame_receiver_t receiver,
1218 10 Oct 10 peter 138                       void *baton, svn_revnum_t rev);
501 19 Oct 07 peter 139
501 19 Oct 07 peter 140     /**
1547 20 Oct 12 peter 141        \brief access the content of file \a path at revision \a rev
1547 20 Oct 12 peter 142
1547 20 Oct 12 peter 143        Content of file \a path at revision \a rev is copied to \a
1610 11 Feb 23 peter 144        result. svn:keywords are not expanded.
1547 20 Oct 12 peter 145     */
1547 20 Oct 12 peter 146     void client_cat(const std::string& path, svn_revnum_t rev,
1547 20 Oct 12 peter 147                     std::string& result);
1547 20 Oct 12 peter 148
1547 20 Oct 12 peter 149
1547 20 Oct 12 peter 150
1547 20 Oct 12 peter 151     /**
318 18 May 07 jari 152        \brief Call the underlying svn_client_info for \a path with \a
318 18 May 07 jari 153        receiver and \a baton.
318 18 May 07 jari 154
318 18 May 07 jari 155        This function is called from SVNinfo to do 'svn info' on an
318 18 May 07 jari 156        item. The \a receiver and \a baton is defined in SVNinfo and
318 18 May 07 jari 157        the \a receiver is called by the underlying subversion API if
318 18 May 07 jari 158        \a path is under subversion control. The \a baton is used to
318 18 May 07 jari 159        communicate anonymous information through the API to the \a
318 18 May 07 jari 160        receiver.
318 18 May 07 jari 161
318 18 May 07 jari 162        \a path can be either a URL or an WC target.
318 18 May 07 jari 163
318 18 May 07 jari 164        \see Subversion API documentation, SVNinfo
318 18 May 07 jari 165     */
140 04 Aug 06 jari 166     void client_info(const std::string& path, svn_info_receiver_t receiver,
140 04 Aug 06 jari 167                      void *baton);
129 02 Aug 06 jari 168
185 06 Sep 06 jari 169     /**
318 18 May 07 jari 170        \a path can be either a URL or an WC target.
318 18 May 07 jari 171
233 26 Mar 07 peter 172        \todo doc
233 26 Mar 07 peter 173     */
318 18 May 07 jari 174     void client_log(const std::string& path, svn_log_message_receiver_t receiver,
318 18 May 07 jari 175                     void *baton);
233 26 Mar 07 peter 176
233 26 Mar 07 peter 177     /**
318 18 May 07 jari 178        \brief Get the subversion properties for \a path.
185 06 Sep 06 jari 179
185 06 Sep 06 jari 180        The retrieved properties are stored in \a properties. To check
185 06 Sep 06 jari 181        whether \a is a binary item use SVNproperty::binary(void).
318 18 May 07 jari 182
318 18 May 07 jari 183        \a path can be either a URL or an WC target.
185 06 Sep 06 jari 184     */
185 06 Sep 06 jari 185     void client_proplist(const std::string& path,
185 06 Sep 06 jari 186                          std::map<std::string, std::string>& properties);
185 06 Sep 06 jari 187
318 18 May 07 jari 188     /**
318 18 May 07 jari 189        \brief Get an instance of SVN.
123 29 Jul 06 jari 190
318 18 May 07 jari 191        The singleton SVN object should be initialized with
318 18 May 07 jari 192        SVN::instancs(const std::string&) before usage of this
318 18 May 07 jari 193        function. Best practice is to initilize the singleton object
318 18 May 07 jari 194        early in the main program. The logic behind this requirement is
318 18 May 07 jari 195        that subverison related classes and calls may expect that
318 18 May 07 jari 196        repository and WC access is properly set up at initialization.
91 23 Mar 06 jari 197
318 18 May 07 jari 198        \throw An SVNException if the singleton SVN onject is not
318 18 May 07 jari 199        already initilized.
123 29 Jul 06 jari 200
318 18 May 07 jari 201        \see SVN::instancs(const std::string&)
318 18 May 07 jari 202     */
318 18 May 07 jari 203     static SVN* instance(void);
91 23 Mar 06 jari 204
318 18 May 07 jari 205     /**
318 18 May 07 jari 206        \brief Get an instance of SVN setup against repository pointed
318 18 May 07 jari 207        to by \a path.
318 18 May 07 jari 208
318 18 May 07 jari 209        The singleton SVN object should be initialized with this
318 18 May 07 jari 210        instance call before any subversion related classes or calls
318 18 May 07 jari 211        are made. Best practice is to initilize the singleton object
318 18 May 07 jari 212        early in the main program. The logic behind this requirement is
318 18 May 07 jari 213        that subverison related classes and calls may expect that
318 18 May 07 jari 214        repository and WC access is properly set up at initialization.
318 18 May 07 jari 215
318 18 May 07 jari 216        \throw Throws an SVNException if initialization fails in the
318 18 May 07 jari 217        underlying subversion API calls, or if \a path is a URL.
318 18 May 07 jari 218     */
318 18 May 07 jari 219     static SVN* instance(const std::string& path);
318 18 May 07 jari 220
318 18 May 07 jari 221     /**
318 18 May 07 jari 222        \brief Set up a repository access session.
318 18 May 07 jari 223
318 18 May 07 jari 224        \throws SVNException if session setup fails, or if a session is
318 18 May 07 jari 225        already set up (i.e., repository cannot be changed during
318 18 May 07 jari 226        program lifetime).
318 18 May 07 jari 227     */
318 18 May 07 jari 228     //    void setup_ra_session(const std::string& path);
318 18 May 07 jari 229
91 23 Mar 06 jari 230     ///
91 23 Mar 06 jari 231     /// @brief Check if entry \a path is under version control
91 23 Mar 06 jari 232     ///
91 23 Mar 06 jari 233     /// @return True if \a path is under version control, false
91 23 Mar 06 jari 234     /// otherwise.
91 23 Mar 06 jari 235     ///
91 23 Mar 06 jari 236     vc_status version_controlled(const std::string& path);
91 23 Mar 06 jari 237
91 23 Mar 06 jari 238   private:
318 18 May 07 jari 239     /**
318 18 May 07 jari 240        \brief Constructor
91 23 Mar 06 jari 241
318 18 May 07 jari 242        The only way to create an object of SVN type is by calling
318 18 May 07 jari 243        SVN::instance(const std::string&). \a path must be a WC path,
318 18 May 07 jari 244        i.e., not a URL.
318 18 May 07 jari 245     */
318 18 May 07 jari 246     SVN(const std::string& path);
318 18 May 07 jari 247
91 23 Mar 06 jari 248     ///
91 23 Mar 06 jari 249     /// @brief Copy Constructor, not implemented.
91 23 Mar 06 jari 250     ///
91 23 Mar 06 jari 251     SVN(const SVN&);
579 18 Mar 08 peter 252     SVN& operator=(const SVN&);
91 23 Mar 06 jari 253
271 02 May 07 jari 254     ///
271 02 May 07 jari 255     /// @brief The destructor.
271 02 May 07 jari 256     ///
271 02 May 07 jari 257     virtual ~SVN(void);
271 02 May 07 jari 258
185 06 Sep 06 jari 259     /**
185 06 Sep 06 jari 260        @brief Free resources when failing to reach end of
185 06 Sep 06 jari 261        constructor.
191 07 Sep 06 jari 262
191 07 Sep 06 jari 263        cleanup_failed_init will free all resource acquired in the
191 07 Sep 06 jari 264        constructor and throw an SVNException with \a message as the
191 07 Sep 06 jari 265        message.
191 07 Sep 06 jari 266
191 07 Sep 06 jari 267        @see SVNException
185 06 Sep 06 jari 268     */
1217 10 Oct 10 peter 269     void cleanup_failed_init(svn_error_t *err, const std::string& message);
140 04 Aug 06 jari 270
91 23 Mar 06 jari 271     static SVN* instance_;
91 23 Mar 06 jari 272
123 29 Jul 06 jari 273     // Subversion API stuff
123 29 Jul 06 jari 274
318 18 May 07 jari 275     /**
1547 20 Oct 12 peter 276        the url is fech with svn info. The url is stored in a
318 18 May 07 jari 277        url_receiver_baton. The struct is filled in the url_receiver
318 18 May 07 jari 278        function.
318 18 May 07 jari 279     */
1547 20 Oct 12 peter 280     struct url_receiver_baton {
1547 20 Oct 12 peter 281       std::string root_url;
1547 20 Oct 12 peter 282       std::string url;
318 18 May 07 jari 283     };
123 29 Jul 06 jari 284
318 18 May 07 jari 285     /**
318 18 May 07 jari 286        url_receiver is the function passed to the underlying
318 18 May 07 jari 287        subversion API call svn_client_info. This function is called by
318 18 May 07 jari 288        the subversion API for every item matched by the conditions of
318 18 May 07 jari 289        the API call.
318 18 May 07 jari 290
318 18 May 07 jari 291        \see Subversion API documentation
318 18 May 07 jari 292     */
318 18 May 07 jari 293     static svn_error_t*
1547 20 Oct 12 peter 294     url_receiver(void *baton, const char *path,
1547 20 Oct 12 peter 295                  const svn_info_t *info, apr_pool_t *pool);
318 18 May 07 jari 296
1218 10 Oct 10 peter 297     void client_blame_call(const std::string& path,
1218 10 Oct 10 peter 298                            svn_client_blame_receiver_t receiver,
1218 10 Oct 10 peter 299                            void *baton, svn_opt_revision_t& head);
501 19 Oct 07 peter 300
91 23 Mar 06 jari 301     svn_wc_adm_access_t* adm_access_;
91 23 Mar 06 jari 302     apr_allocator_t* allocator_;
91 23 Mar 06 jari 303     svn_client_ctx_t* context_;
91 23 Mar 06 jari 304     apr_pool_t* pool_;
123 29 Jul 06 jari 305     svn_ra_session_t* ra_session_;
1547 20 Oct 12 peter 306     std::string abs_wc_root_path_;
1547 20 Oct 12 peter 307     std::string relative_url_;
1544 13 Oct 12 peter 308
1544 13 Oct 12 peter 309     /**
1544 13 Oct 12 peter 310        Private class holding an apr_pool_t* and that takes care of
1544 13 Oct 12 peter 311        deallocation (in destructor) which decreases risk for memory
1544 13 Oct 12 peter 312        leaks especially in case of errors and when exceptions are
1544 13 Oct 12 peter 313        thrown.
1544 13 Oct 12 peter 314      */
1544 13 Oct 12 peter 315     class AprPool
1544 13 Oct 12 peter 316     {
1544 13 Oct 12 peter 317     public:
1544 13 Oct 12 peter 318       /**
1544 13 Oct 12 peter 319          create a sub-pool of \a pool
1544 13 Oct 12 peter 320       */
1544 13 Oct 12 peter 321       AprPool(apr_pool_t* pool);
1544 13 Oct 12 peter 322
1544 13 Oct 12 peter 323       /**
1544 13 Oct 12 peter 324          \brief destructor deallocates apr pool
1544 13 Oct 12 peter 325        */
1544 13 Oct 12 peter 326       ~AprPool(void);
1544 13 Oct 12 peter 327
1544 13 Oct 12 peter 328       /**
1544 13 Oct 12 peter 329          Access apr pool
1544 13 Oct 12 peter 330        */
1544 13 Oct 12 peter 331       apr_pool_t* get(void);
1544 13 Oct 12 peter 332     private:
1544 13 Oct 12 peter 333       apr_pool_t* pool_;
1544 13 Oct 12 peter 334     };
1544 13 Oct 12 peter 335
91 23 Mar 06 jari 336   };
91 23 Mar 06 jari 337
149 12 Aug 06 jari 338 }} // end of namespace svndigest and namespace theplu
91 23 Mar 06 jari 339
91 23 Mar 06 jari 340 #endif