You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Xypanastheu <Ge...@gmail.com> on 2008/01/08 06:12:14 UTC

Subversion repository most-recent revision number

I am trying to write a small Windows console application
that uses the SVN client C++ API
to get the latest / most-recent revision number
from a Subversion repository out on the server.

My code is below.  I have tried to go as far as I can with it.
I'd appreciate any feedback or help that you can give me.

I'm not sure what to do for the revision value.

What are batons (e.g. svn_client_info()'s receiver_baton), and how
are they used ?

What libs do I need to use ? :
  for  apr_pool_create() and apr_pool_destroy()
  use  svn-win32-1.4.6/lib/apr/libapr.lib

  for  svn_client_info()
  use  ???

Is there any existing example/test code that does what I am trying to
do ?

Thanks,
Chip Chianicti


/
*******************************************************************************
* PROJECT   SVN Revision
* DESCRIPT  Get Subversion repository latest / most-recent revision
number.
*******************************************************************************/

#include <stdio.h>

#include "apr_general.h"     //btw does #include "apr_pools.h"
//#include "svn_types.h"     //svn_error_t
//#include "svn_opt.h"       //svn_opt_revision_t
#include "svn_client.h"      //svn_info_receiver_t -(), btw does
#include svn_types.h
//#include "svn_config.h"    //svn_boolean_t ?



/*===  PROTOTYPES
==========================================================*/
svn_error_t *
Callback_svn_client_info
(void *baton, const char *path, const svn_info_t *info, apr_pool_t
*pool);

void
Callback_svn_wc_notify_func
(void *baton, const char *path, svn_wc_notify_action_t action,
svn_node_kind_t kind, const char *mime_type, svn_wc_notify_state_t
content_state, svn_wc_notify_state_t prop_state, svn_revnum_t
revision);

svn_error_t *
Callback_svn_client_get_commit_log
(const char **log_msg, const char **tmp_file, apr_array_header_t
*commit_items, void *baton, apr_pool_t *pool);

svn_error_t *
Callback_svn_cancel_func_t
(void *cancel_baton);

void
Callback_svn_wc_notify_func2
(void *baton, const svn_wc_notify_t *notify, apr_pool_t *pool);

svn_error_t *
Callback_svn_client_get_commit_log2_t
(const char **log_msg, const char **tmp_file, const apr_array_header_t
*commit_items, void *baton, apr_pool_t *pool);

void
Callback_svn_ra_progress_notify_func_t
(apr_off_t progress, apr_off_t total, void *baton, apr_pool_t *pool);





/
*******************************************************************************
* FUNCTION  main()
* DESCRIPT
*******************************************************************************/
int main ()
{
  printf ("\nHello hello.\n");



  /*===  BEGIN SVN CODE
======================================================*/
  apr_pool_t  * pool;


  /*===  CREATE POOL
=========================================================*/
  apr_pool_create(&pool, NULL);


  /*===  USE POOL
============================================================*/
  svn_error_t              *SvnError;
  svn_opt_revision_t        PegRevision;
  svn_opt_revision_t        Revision;
 	//svn_info_receiver_t     //Callback
  svn_boolean_t             Recurse;
  svn_client_ctx_t          ClientCtx;


  PegRevision.kind     = svn_opt_revision_unspecified;
  //PegRevision.value  = ???
  Revision.kind        = svn_opt_revision_unspecified;
  //Revision.value     = ???

  Recurse = 0;

  //ClientCtx.auth_baton      = ???
  ClientCtx.notify_func       = Callback_svn_wc_notify_func;
  //ClientCtx.notify_baton    = ???
  ClientCtx.log_msg_func      = Callback_svn_client_get_commit_log;
  //ClientCtx.log_msg_baton   = ???
  //ClientCtx.config          = ???
  ClientCtx.cancel_func       = Callback_svn_cancel_func_t;
  //ClientCtx.cancel_baton    = ???
  ClientCtx.notify_func2      = Callback_svn_wc_notify_func2;
  //ClientCtx.notify_baton2   = ???
  ClientCtx.log_msg_func2     = Callback_svn_client_get_commit_log2_t;
  //ClientCtx.log_msg_baton2  = ???
  ClientCtx.progress_func     =
Callback_svn_ra_progress_notify_func_t;
  //ClientCtx.progress_baton  = ???



  #if (0)
  SvnError = svn_client_info
    (
      "http://subversion/svn/software/VRS",     //path or url
      &PegRevision,
      &Revision,
      Callback_svn_client_info,    //callback
      NULL,                        //receiver_baton,
      Recurse,
      &ClientCtx,
      pool
    );
  #endif


  /*===  DESTROY POOL
========================================================*/
  apr_pool_destroy(pool);


  /*===  END SVN CODE
========================================================*/


  printf ("\nPrgm done.\n");


  return (0);
}




/
*******************************************************************************
* FUNCTION  Callback_svn_client_info ()
* DESCRIPT
*******************************************************************************/
svn_error_t *
Callback_svn_client_info
(void *baton, const char *path, const svn_info_t *info, apr_pool_t
*pool)
{
  svn_error_t   SvnError;
  svn_error_t  *pSvnError;
  pSvnError = &SvnError;
  return (pSvnError);
  //svn_error_t   SvnError;
  //return (&SvnError);
}


/
*******************************************************************************
* FUNCTION  Callback_svn_wc_notify_func
* DESCRIPT
*******************************************************************************/
void
Callback_svn_wc_notify_func
( void *baton,
  const char *path,
  svn_wc_notify_action_t action,
  svn_node_kind_t kind,
  const char *mime_type,
  svn_wc_notify_state_t content_state,
  svn_wc_notify_state_t prop_state,
  svn_revnum_t revision
)
{
}



/
*******************************************************************************
* FUNCTION  Callback_svn_client_get_commit_log()
* DESCRIPT
*******************************************************************************/
svn_error_t *
Callback_svn_client_get_commit_log
( const char **log_msg,
  const char **tmp_file,
  apr_array_header_t *commit_items,
  void *baton,
  apr_pool_t *pool
)
{
  svn_error_t   SvnError;
  svn_error_t  *pSvnError;
  pSvnError = &SvnError;
  return (pSvnError);
}



/
*******************************************************************************
* FUNCTION  Callback_svn_cancel_func_t()
* DESCRIPT
*******************************************************************************/
svn_error_t *
Callback_svn_cancel_func_t (void *cancel_baton)
{
  svn_error_t   SvnError;
  svn_error_t  *pSvnError;
  pSvnError = &SvnError;
  return (pSvnError);
}



/
*******************************************************************************
* FUNCTION  Callback_svn_wc_notify_func2()
* DESCRIPT
*******************************************************************************/
void
Callback_svn_wc_notify_func2
(void *baton, const svn_wc_notify_t *notify, apr_pool_t *pool)
{
}



/
*******************************************************************************
* FUNCTION  Callback_svn_client_get_commit_log2_t()
* DESCRIPT
*******************************************************************************/
svn_error_t *
Callback_svn_client_get_commit_log2_t
( const char **log_msg,
  const char **tmp_file,
  const apr_array_header_t *commit_items,
  void *baton,
  apr_pool_t *pool
)
{
  svn_error_t   SvnError;
  svn_error_t  *pSvnError;
  pSvnError = &SvnError;
  return (pSvnError);
}




/
*******************************************************************************
* FUNCTION  Callback_svn_ra_progress_notify_func_t()
* DESCRIPT
*******************************************************************************/
void
Callback_svn_ra_progress_notify_func_t
(apr_off_t progress, apr_off_t total, void *baton, apr_pool_t *pool)
{
}






// DDDDD    OOO    CCC   U   U  M     M  EEEE   N   N  TTTTT    A
TTTTT  III   OOO   N   N
//  D   D  O   O  C   C  U   U  MM   MM  E      NN  N    T     A A
T     I   O   O  NN  N
//  D   D  O   O  C      U   U  M M M M  EEE    NN  N    T    A   A
T     I   O   O  NN  N
//  D   D  O   O  C      U   U  M  M  M  E      N N N    T    AAAAA
T     I   O   O  N N N
//  D   D  O   O  C   C  U   U  M  M  M  E      N  NN    T    A   A
T     I   O   O  N  NN
// DDDDD    OOO    CCC    UUU   M     M  EEEEE  N  NN    T    A   A
T    III   OOO   N  NN

#if (0)

/
*******************************************************************************
* PATH      svn-win32-1.4.6\include
* FILE      svn_types.h
*******************************************************************************/
typedef struct svn_error_t
{

  apr_status_t apr_err;        /** APR error value, possibly SVN_
custom err */
  const char *message;         /** details from producer of error */
  struct svn_error_t *child;   /** ptr to the error we "wrap" */
  apr_pool_t *pool;            /** The pool holding this error and any
child errors it wraps */
  const char *file;            /** Source file where the error
originated.  Only used iff @c SVN_DEBUG. */
  long line;                   /** Source line where the error
originated.  Only used iff @c SVN_DEBUG. */

} svn_error_t;



/
*******************************************************************************
* PATH      svn-win32-1.4.6\include
* FILE      svn_opt.h
*******************************************************************************/
enum svn_opt_revision_kind
{
  svn_opt_revision_unspecified,    /** No revision information given.
*/
  svn_opt_revision_number,         /** revision given as number */
  svn_opt_revision_date,           /** revision given as date */
  svn_opt_revision_committed,      /** rev of most recent change */
  svn_opt_revision_previous,       /** (rev of most recent change) - 1
*/
  svn_opt_revision_base,           /** .svn/entries current revision
*/
  svn_opt_revision_working,        /** current, plus local mods */
  svn_opt_revision_head            /** repository youngest */
};


typedef union svn_opt_revision_value_t
{
  svn_revnum_t   number;
  apr_time_t     date;
} svn_opt_revision_value_t;


typedef struct svn_opt_revision_t
{
  enum svn_opt_revision_kind   kind;     /**< See
svn_opt_revision_kind */
  svn_opt_revision_value_t     value;    /**< Extra data qualifying
the @c kind */

} svn_opt_revision_t;




/
*******************************************************************************
* PATH      svn-win32-1.4.6\include
* FILE      svn_client.h
*******************************************************************************/
/**
 * The callback invoked by svn_client_info().  Each invocation
 * describes @a path with the information present in @a info.  Note
 * that any fields within @a info may be NULL if information is
 * unavailable.  Use @a pool for all temporary allocation.
 *
 * @since New in 1.2.
 */
typedef svn_error_t *(*svn_info_receiver_t)
  (void *baton,
   const char *path,
   const svn_info_t *info,
   apr_pool_t *pool);




/
*******************************************************************************
* PATH      svn-win32-1.4.6\include
* FILE      svn_types.h
*******************************************************************************/
/** YABT:  Yet Another Boolean Type */
typedef int svn_boolean_t;



/
*******************************************************************************
* PATH      svn-win32-1.4.6\include
* FILE      svn_client.h
*******************************************************************************/
typedef struct svn_client_ctx_t
{
  svn_auth_baton_t               * auth_baton;      /** main
authentication baton. */
  svn_wc_notify_func_t             notify_func;     /** notification
callback function.  */
  void                           * notify_baton;    /** notification
callback baton for notify_func()   */
  svn_client_get_commit_log_t      log_msg_func;    /** Log message
callback function.  NULL means that Subversion  */
  void                           * log_msg_baton;   /** log message
callback baton   */
  apr_hash_t                     * config;          /** a hash mapping
of <tt>const char *</tt> configuration file names to @c svn_config_t
*'s.  */
  svn_cancel_func_t                cancel_func;     /** a callback to
be used to see if the client wishes to cancel the running operation.
*/
  void                           * cancel_baton;    /** a baton to
pass to the cancellation callback. */
  svn_wc_notify_func2_t            notify_func2;    /** notification
function, defaulting to a function that forwards to notify_func().  */
  void                           * notify_baton2;   /** notification
baton for notify_func2().  */
  svn_client_get_commit_log2_t     log_msg_func2;   /** Log message
callback function. NULL means that Subversion should try log_msg_func.
*/
  void                           * log_msg_baton2;  /** callback baton
for log_msg_func2  */
  svn_ra_progress_notify_func_t    progress_func;   /** Notification
callback for network progress information.   */
  void                           * progress_baton;  /** Callback baton
for progress_func.  */

} svn_client_ctx_t;


#endif


/
*******************************************************************************
* PROJECT END
*******************************************************************************/


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: Subversion repository most-recent revision number

Posted by "C. Michael Pilato" <cm...@collab.net>.
Xypanastheu wrote:
> I am trying to write a small Windows console application
> that uses the SVN client C++ API
> to get the latest / most-recent revision number
> from a Subversion repository out on the server.

Your mail is misdirected: this list is for discussion around the development
*of* Subversion, not any ol' development *atop* Subversion.

That said, if all you want to do is display the youngest revision number
from a repository, you should consider using svn_ra_get_latest_revnum

   /**
    * Get the latest revision number from the repository of @a session.
    *
    * Use @a pool for memory allocation.
    *
    * @since New in 1.2.
    */
   svn_error_t *svn_ra_get_latest_revnum(svn_ra_session_t *session,
                                         svn_revnum_t *latest_revnum,
                                         apr_pool_t *pool);

You can use the example program svnput.c[1] to see how to do this in C --
not sure what the C++ API looks like around this area.  (svnput.c does more
than what you are asking for, but would work as an example.)

[1] http://svn.collab.net/repos/svn/trunk/tools/examples/svnput.c

-- 
C. Michael Pilato <cm...@collab.net>
CollabNet   <>   www.collab.net   <>   Distributed Development On Demand