Hello community,
here is the log from the commit of package cvsps for openSUSE:Factory checked in at 2013-01-11 15:54:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/cvsps (Old)
and /work/SRC/openSUSE:Factory/.cvsps.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cvsps", Maintainer is "MVyskocil@suse.com"
Changes:
--------
--- /work/SRC/openSUSE:Factory/cvsps/cvsps.changes 2013-01-03 13:54:37.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.cvsps.new/cvsps.changes 2013-01-11 15:54:21.000000000 +0100
@@ -1,0 +2,13 @@
+Fri Jan 11 11:17:22 UTC 2013 - mvyskocil@suse.com
+
+- update to 3.7
+ * bug fix in timezone handling (thanks to Chris Rorvick).
+ * major performance gain in the CVS client code (thanks to
+ Sergei Trofimovich).
+ * third field in an author entry is now interpreted as if it
+ were TZ.
+ * remove the --test-log option now that cvsps has its own test suite.
+ * new --reposurgeon option for passing reference-lifting hints
+ to reposurgeon.
+
+-------------------------------------------------------------------
Old:
----
cvsps-3.4.tar.gz
New:
----
cvsps-3.7.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ cvsps.spec ++++++
--- /var/tmp/diff_new_pack.7I12GS/_old 2013-01-11 15:54:22.000000000 +0100
+++ /var/tmp/diff_new_pack.7I12GS/_new 2013-01-11 15:54:22.000000000 +0100
@@ -20,7 +20,7 @@
Summary: A Program for Generating Patch Set Information from a CVS Repository
License: GPL-2.0+
Group: Development/Tools/Version Control
-Version: 3.4
+Version: 3.7
Release: 0
Source0: http://www.catb.org/~esr/cvsps/%{name}-%{version}.tar.gz
Url: http://www.catb.org/~esr/cvsps/
++++++ cvsps-3.4.tar.gz -> cvsps-3.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/Makefile new/cvsps-3.7/Makefile
--- old/cvsps-3.4/Makefile 2013-01-01 18:40:56.000000000 +0100
+++ new/cvsps-3.7/Makefile 2013-01-09 16:57:03.000000000 +0100
@@ -1,9 +1,12 @@
-VERSION=3.4
+VERSION=3.7
CC?=gcc
CFLAGS?=-g -O2 -Wall
CPPFLAGS+=-I. -DVERSION=\"$(VERSION)\"
+LDLIBS+=-lz # += to allow solaris and friends add their libs like -lsocket
prefix?=/usr/local
+target=$(DESTDIR)$(prefix)
+
OBJS= debug.o \
hash.o \
sio.o \
@@ -20,7 +23,7 @@
makedepend -Y -I. *.c
cvsps: $(OBJS)
- $(CC) -o cvsps $(OBJS) -lz
+ $(CC) -o cvsps $(OBJS) $(LDFLAGS) $(LDLIBS)
check:
@(cd test >/dev/null; make --quiet)
@@ -46,16 +49,17 @@
a2x --doctype manpage --format xhtml $*.txt
install: cvsps.1
- [ -d $(prefix)/bin ] || mkdir -p $(prefix)/bin
- [ -d $(prefix)/share/man/man1 ] || mkdir -p $(prefix)/share/man/man1
- install cvsps $(prefix)/bin
- install -m 644 cvsps.1 $(prefix)/share/man/man1
+ [ -d "$(target)/bin" ] || mkdir -p "$(target)/bin"
+ [ -d "$(target)/share/man/man1" ] || mkdir -p "$(target)/share/man/man1"
+ install cvsps "$(target)/bin"
+ install -m 644 cvsps.1 "$(target)/share/man/man1"
tags: *.c *.h
ctags *.c *.h
clean:
rm -f cvsps *.o core tags cvsps.1 cvsps.html docbook-xsl.css
+ rm -f SHIPPER.FREECODE
SOURCES = Makefile *.[ch] merge_utils.sh
DOCS = README COPYING NEWS cvsps.asc TODO
@@ -66,7 +70,7 @@
dist: cvsps-$(VERSION).tar.gz
release: cvsps-$(VERSION).tar.gz cvsps.html
- shipper -u -m -t; make clean
+ shipper -u -m -t; make clean; rm SHIPPER.FREECODE
.PHONY: install clean version dist check
# DO NOT DELETE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/NEWS new/cvsps-3.7/NEWS
--- old/cvsps-3.4/NEWS 2013-01-01 18:40:47.000000000 +0100
+++ new/cvsps-3.7/NEWS 2013-01-09 16:56:14.000000000 +0100
@@ -1,5 +1,16 @@
CVSps project news
+3.7 @ 2013-01-08
+ Bug fix in timezone handling (thanks to Chris Rorvick).
+ Major performance gain in the CVS client code (thanks to Sergei Trofimovich).
+
+3.6 @ 2013-01-06
+ The third field in an author entry is now interpreted as if it were TZ.
+
+3.5 @ 2013-01-02
+ Remove the --test-log option now that cvsps has its own test suite.
+ New --reposurgeon option for passing reference-lifting hints to reposurgeon.
+
3.4 @ 2013-01-01
Incorporate Heiko Voight's patch solving some time-skew cases.
The git-tree tests for cvsps are now completely merged into the test suite.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/README new/cvsps-3.7/README
--- old/cvsps-3.4/README 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/README 2013-01-07 13:21:56.000000000 +0100
@@ -17,19 +17,27 @@
If you have not used an older version of CVSps, you can skip this section.
-The 3.x versions have changed significantly. In 2012, CVS use is declining
-swiftly (GNU CVS hasn't been updated since 2004) and the original use case
-for this tool - browsing change sets in a live CVS repository - is obsolete.
-The 3.x versions are more focused on the --fast-export mode.
+The 3.x versions have changed significantly. In 2012, CVS use is
+declining swiftly (GNU CVS hasn't been updated since 2004) and the
+original use case for this tool - browsing change sets in a live CVS
+repository - is obsolete. The 3.x versions are more focused on the
+--fast-export mode.
Accordingly, a large amount of old code and options have been
discarded in order to reduce CVSps's complexity and improve its
-performance. It now always runs in what used to be cvs_direct mode,
+performance. It now always runs in what used to be cvs-direct mode,
doing client transactions with the CVS server and not relying on local
CVS commands at all. Consequently, all the hairiness around caching
and different log/rlog versions is gone and the tool is much faster.
Also, it is no longer required that CVSps be run in a CVS checkout
-directory, providing CVSROOT is set or --root is used.
+directory; it can run from a repository directory, or actually
+from anywhere at all providing CVSROOT is set or --root is used.
+
+The old -A option enabling ancestry-branch tracking didn't work
+and has been dropped (equivalent topological analysis is done in
+fast-export mode). The new -A option accepts an author-mapping file
+in the same format traditionally accepted by git-cvsimport, cvs2git,
+git-svn, reposurgeon, and other similar tools.
The old-style non-fast-export reporting mode is still supported, but
deprecated. In the future, it is possible that it may be dropped
@@ -40,6 +48,14 @@
Do 'make' and 'make install'. This is very plain-vanilla ANSI C
and should run on any Unixoid OS.
+== Dependencies ==
+
+The -g diff-generation option of cvsps depends on diff and sed at runtime.
+
+== Testing ==
+
+'make check' runs a regression-test suite.
+
== Running ==
Note: not all options are necessarily discussed here. Please check the
@@ -206,3 +222,4 @@
You can always run CVSps in that subdirectory, and since it IS a
separate repository, that does make a little bit of sense.
+//end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/compiler.h new/cvsps-3.7/compiler.h
--- old/cvsps-3.4/compiler.h 1970-01-01 01:00:00.000000000 +0100
+++ new/cvsps-3.7/compiler.h 2013-01-09 16:44:31.000000000 +0100
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2013 Sergei Trofimovich
+ * See COPYING file for license information
+ */
+
+#ifndef COMPILER_H
+#define COMPILER_H
+
+/* gcc specific extension. does nothing on other compilers */
+#if defined(__GNUC__)
+# define GCCISM(x) x
+#else
+# define GCCISM(x)
+#endif /* __GNUC__ */
+
+#endif /* COMPILER_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/cvsclient.c new/cvsps-3.7/cvsclient.c
--- old/cvsps-3.4/cvsclient.c 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/cvsclient.c 2013-01-09 16:48:13.000000000 +0100
@@ -12,6 +12,7 @@
#include
#include
+#include "compiler.h"
#include "debug.h"
#include "tcpsocket.h"
#include "sio.h"
@@ -42,7 +43,7 @@
};
static void get_cvspass(char *, const char *, int len);
-static void send_string(CvsServerCtx *, const char *, ...);
+static void send_string(CvsServerCtx *, const char *, ...) GCCISM(__attribute__ ((format (printf, 2, 3))));
static int read_response(CvsServerCtx *, const char *);
static void ctx_to_fp(CvsServerCtx * ctx, FILE * fp);
static int read_line(CvsServerCtx * ctx, char * p, int len);
@@ -126,7 +127,7 @@
send_string(ctx, "Root %s\n", ctx->root);
/* this is taken from 1.11.1p1 trace - but with Mbinary removed. we can't handle it (yet!) */
- send_string(ctx, "Valid-responses ok error Valid-requests Checked-in New-entry Checksum Copy-file Updated Created Update-existing Merged Patched Rcs-diff Mode Mod-time Removed Remove-entry Set-static-directory Clear-static-directory Set-sticky Clear-sticky Template Set-checkin-prog Set-update-prog Notified Module-expansion Wrapper-rcsOption M E F\n", ctx->root);
+ send_string(ctx, "Valid-responses ok error Valid-requests Checked-in New-entry Checksum Copy-file Updated Created Update-existing Merged Patched Rcs-diff Mode Mod-time Removed Remove-entry Set-static-directory Clear-static-directory Set-sticky Clear-sticky Template Set-checkin-prog Set-update-prog Notified Module-expansion Wrapper-rcsOption M E F\n");
send_string(ctx, "valid-requests\n");
@@ -721,24 +722,58 @@
static void ctx_to_fp(CvsServerCtx * ctx, FILE * fp)
{
char line[BUFSIZ];
+ long int conv;
+ char * sz_e;
while (1)
{
read_line(ctx, line, BUFSIZ);
debug(DEBUG_TCP, "ctx_to_fp: %s", line);
- if (memcmp(line, "M ", 2) == 0)
+
+ if (strncmp (line, "error ", 6) == 0)
{
- if (fp)
- fprintf(fp, "%s\n", line + 2);
+ debug(DEBUG_APPERROR, "ctx_to_fp: error: %s", line);
+ exit(1);
}
- else if (memcmp(line, "E ", 2) == 0)
+
+ /* EOF. likely delete file */
+ if (strcmp (line, "ok") == 0)
+ break;
+
+ /* wait for raw data size */
+ conv = strtol(line, &sz_e, 10);
+ if (conv == LONG_MIN || conv == LONG_MAX || *sz_e != '\0')
+ continue;
+
+ debug(DEBUG_TCP, "ctx_to_fp: file size: %ld", conv);
+
+ while (conv)
{
- debug(DEBUG_TCP, "%s", line + 2);
+ long bs = ctx->tail - ctx->head;
+ if (bs > conv) bs = conv;
+
+ fwrite (ctx->head, 1, bs, fp);
+ ctx->head += bs;
+ conv -= bs;
+
+ if (conv)
+ {
+ if (refill_buffer(ctx) <= 0)
+ {
+ debug(DEBUG_APPERROR, "ctx_to_fp: refill_buffer error");
+ exit(1);
+ }
+ }
}
- else if (strncmp(line, "ok", 2) == 0 || strncmp(line, "error", 5) == 0)
+
+ read_line(ctx, line, BUFSIZ);
+ if (strcmp (line, "ok") != 0)
{
- break;
+ debug(DEBUG_APPERROR, "ctx_to_fp: error: expected 'ok' at EOF but got: %s", line);
+ exit(1);
}
+
+ break;
}
if (fp)
@@ -766,7 +801,6 @@
{
if (kk)
send_string(ctx, "Argument -kk\n");
- send_string(ctx, "Argument -p\n");
send_string(ctx, "Argument -r\n");
send_string(ctx, "Argument %s\n", rev);
send_string(ctx, "Argument %s/%s\n", rep, file);
@@ -840,7 +874,7 @@
}
else
{
- send_string(ctx, "Directory %s\n", rep, file_buff);
+ send_string(ctx, "Directory %s\n", rep);
send_string(ctx, "%s/%s\n", ctx->root, rep);
}
@@ -877,6 +911,7 @@
char lbuff[BUFSIZ];
int len;
+ reread:
len = read_line(ctx, lbuff, BUFSIZ);
debug(DEBUG_TCP, "cvsclient: rlog: read %s", lbuff);
@@ -889,6 +924,7 @@
else if (memcmp(lbuff, "E ", 2) == 0)
{
debug(DEBUG_TCP, "%s", lbuff + 2);
+ goto reread;
}
else if (strcmp(lbuff, "ok") == 0 || strncmp(lbuff, "error", 5) == 0)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/cvsps.asc new/cvsps-3.7/cvsps.asc
--- old/cvsps-3.4/cvsps.asc 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/cvsps.asc 2013-01-07 13:45:04.000000000 +0100
@@ -9,19 +9,19 @@
[-h] [-z 'fuzz'] [-g] [-s 'patchset'] [-a 'author']
[-f 'file'] [-d 'date1' [-d 'date2']] [-l 'text'] [-b 'branch'] [-n]
[-r 'tag' [-r 'tag']] [-p 'directory'] [-A 'authormap'] [-R 'revmap']
- [-v] [-t] [--summary-first] [--test-log 'filename']
- [--diff-opts 'option string']
+ [-v] [-t] [--summary-first] [--diff-opts 'option string']
[--debuglvl 'bitmask'] [-Z 'compression'] [--root 'cvsroot']
- [-q] [--fast-export] [-k] [-T] [-V] ['module-path']
+ [-q] [--fast-export] [--reposurgeon] [-k] [-T] [-V] ['module-path']
== DESCRIPTION ==
-cvsps is a program for generating 'patchset' information from a CVS
-repository. A patchset in this case is defined as a set of changes made
-to a collection of files, and all committed at the same time (using a
-single 'cvs commit' command). This information is valuable to seeing the
-big picture of the evolution of a CVS project. While CVS tracks revision
-information, it is often difficult to see what changes were committed
-'atomically' to the repository.
+cvsps tries to group the per-file commits and tags in a CVS project
+repository into per-project changeset commits with common metadata, in
+the style of Subversion and later version-control systems.
+
+The older, default reporting mode is designed for humans to look at
+and only includes commit metadata, not file contents. The newer
+--fast-export mode emits a git-style fast-import stream which can be
+consumed by the importers for git and other version-control systems.
There are several different ways to invoke cvsps:
@@ -43,9 +43,7 @@
CVSROOT environment variable, in which case a module-path argument
is required.
-The default reporting mode is designed for humans to look at. The
---fast-export mode emits a git import stream which can be consumed
-by the importers for other version-control systems. In this mode:
+In fast-export mode:
* Each patchset becomes a commit.
@@ -55,15 +53,12 @@
* Other tag and branch names are sanitized to be legal for git.
-* CVS keyword expansion is suppressed.
-
* Since .cvsignore files have a syntax upward-compatible with that
-of .gitignore files, they're renamed.
+ of .gitignore files, they're renamed.
-cvsps honors the CVS_RSH and CVS_SERVER environment variables, but
-does not parse the $HOME/.cvsrc file. If you have a $HOME/.cvspass file
-(such as is normally created by cvs login) it will be searched
-for a password.
+cvsps does not parse the $HOME/.cvsrc file. If you have a
+$HOME/.cvspass file (such as is normally created by cvs login) it will
+be searched for a password.
== OPTIONS ==
-h::
@@ -98,16 +93,18 @@
Apply an author-map file to the attribution lines. Each line must be
of the form
+
--------------------------------------------------------
-ferd = Ferd J. Foonly -0500
--------------------------------------------------------
+------------------------------------------------------
+ferd = Ferd J. Foonly America/Chicago
+------------------------------------------------------
+
and will be applied to map the Unix username 'ferd' to the DVCS-style
user identity specified after the equals sign. The timezone field
(after > and whitespace) is optional and (if present) is used to set
-timezone offset to be attached to the date. Whitespace around the
-equals sign is stripped. Lines beginning with a # or not containing
-an equals sign are silently ignored.
+the timezone offset to be attached to the date; acceptable formats for
+the timezone field are anything that can be in the TZ environment
+variable, including a [+-]hhmm offst. Whitespace around the equals
+sign is stripped. Lines beginning with a # or not containing an
+equals sign are silently ignored.
-R 'revmap'::
Write a revision map to the specified argument filename. Each line of
the revision map consists of three whitespace-separated fields: a
@@ -120,9 +117,6 @@
--summary-first::
when multiple patchset diffs are being generated, put the patchset
summary for all patchsets at the beginning of the output.
---test-log 'captured cvs log file'::
-for testing changes, you can capture cvs log output, then test against
-this captured file instead of hammering some poor CVS server.
--diffs-opts 'option string'::
send a custom set of options to diff, for example to increase
the number of context lines, or change the diff format.
@@ -138,17 +132,22 @@
Kill keywords: will extract files with '-kk' from the CVS archive
to avoid noisy changesets.
-T::
-Force deterministic dates for regression testing. Takes a date
-argument which set the base time; ech patchset will have an attributed
-date of as many seconds passs the base time as its ID.
+Force deterministic dates for regression testing. Each patchset will
+have a monotonic-increasing attributed date computed from its patchdet ID.
--fast-export::
Emit the report as a git import stream.
+--reposurgeon::
+Emit for each commit a list of the CVS file:revision pairs composing it as a
+bzr-style commit property named "cvs-revisions". From version 2.12
+onward, reposurgeon can interpret these and use them as hints for
+reference-lifting.
-V::
Emit the program version and exit.
'module-path'::
Operate on the specified module. If this option is not given, either
the CVSROOT environment variable must be set to point directly at the
-module or cvsps must be run in a repository's checkout directory.
+module or cvsps must be run in a checkout directory or repository
+module subdirectory.
== COMPATIBILITY ==
The old --cvs-direct option, and the -u and -x options having to do
@@ -165,8 +164,9 @@
== USAGE EXAMPLES ==
cvsps::
- Run within a checkout directory, dumps the history of its module in
- its repository in the old format.
+ Run within a checkout directory or a module subdirectory within
+ a repository, dumps the history of its module in its repository
+ in the old format.
cvsps --root :local:$PWD/foo --fast-export bar::
Dump the history of module bar from a local repository directory foo in
fast-export format.
@@ -264,8 +264,8 @@
== CVS LIMITATIONS ==
Translating CVS repositories to the generic DVCS model expressed by
import streams is not merely difficult and messy, there are weird
-CVS cases that cannot be correctly translated at all. 'cvsps' will try to
-warn you about this rather than silently producing broken or
+CVS cases that cannot be correctly translated at all. cvsps will try to
+warn you about these cases rather than silently producing broken or
incomplete translations.
CVS-NT and versions of GNU CVS after 1.12 (2004) added a changeset
@@ -284,7 +284,7 @@
within the commit-matching time window, the order of commits reported
may be wrong.
-These problems cannot be fixed in 'cvsps'; they are inherent to CVS.
+These problems cannot be fixed in cvsps; they are inherent to CVS.
== CVSPS LIMITATIONS ==
cvsps may be unable to communicate with some extremely ancient CVS
@@ -297,10 +297,10 @@
If any files were ever imported more than once (e.g., import of
more than one vendor release), the head revision might contain
-incorrect content. 'cvsps' issues a warning when this might occur.
+incorrect content. cvsps issues a warning when this might occur.
If a CVS branch symbol could not be resolved to a translated
-commit, 'cvsps' will issue a warning to that effect.
+commit, cvsps will issue a warning to that effect.
== REPORTING BUGS ==
Report bugs to Eric S. Raymond . The project page
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/cvsps.c new/cvsps-3.7/cvsps.c
--- old/cvsps-3.4/cvsps.c 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/cvsps.c 2013-01-09 17:15:08.000000000 +0100
@@ -32,6 +32,9 @@
#define CVS_LOG_BOUNDARY "----------------------------\n"
#define CVS_FILE_BOUNDARY "=============================================================================\n"
+/* not yet used */
+#define CVS_IGNORES "# Generated by cvsps\nRCS\nSCCS\nCVS\nCVS.adm\nRCSLOG\ncvslog.*\ntags\nTAGS\n.make.state\n.nse_depinfo\n*~\n#*\n.#*\n,*\n_$*\n*$\n*.old\n*.bak\n*.BAK\n*.orig\n*.rej\n.del-*\n*.a\n*.olb\n*.o\n*.obj\n*.so\n*.exe\n*.Z\n*.elc\n*.ln\ncore\n"
+
enum
{
NEED_RCS_FILE,
@@ -72,7 +75,6 @@
static char strip_path[PATH_MAX];
static int strip_path_len;
static bool statistics;
-static const char * test_log_file;
static struct hash_table * branch_heads;
static struct list_head all_patch_sets;
static struct list_head collisions;
@@ -102,11 +104,12 @@
static const char * diff_opts;
static int compress;
static char compress_arg[8];
-static time_t regression_time;
+static bool regression_time;
static bool selection_sense = true;
static FILE *revfp;
static int verbose = 0;
static bool keyword_suppression = false;
+static bool reposurgeon = false;
static int parse_args(int, char *[]);
static int parse_rc();
@@ -147,7 +150,7 @@
static void find_branch_points(PatchSet * ps);
static int debug_levels[] = {
- DEBUG_APPERROR|DEBUG_SYSERROR|DEBUG_APPWARN,
+ DEBUG_APPERROR|DEBUG_SYSERROR|DEBUG_APPWARN|DEBUG_USAGE,
DEBUG_RETRIEVAL,
DEBUG_STATUS,
DEBUG_TCP,
@@ -189,8 +192,7 @@
*/
init_paths();
- if (!test_log_file)
- cvsclient_ctx = open_cvs_server(root_path, compress);
+ cvsclient_ctx = open_cvs_server(root_path, compress);
load_from_cvs();
@@ -232,11 +234,11 @@
{
if (fast_export)
debug(DEBUG_APPERROR,
- "commitid reliable only after commit :%d%s",
+ "commitid reliable only after commit :%d",
ps->mark);
else
debug(DEBUG_APPERROR,
- "commitid reliable only after patch set %d%s",
+ "commitid reliable only after patch set %d",
ps->psid);
}
}
@@ -311,9 +313,7 @@
int loglen = 0;
bool have_log = false;
- if (test_log_file)
- cvsfp = fopen(test_log_file, "r");
- else if (cvsclient_ctx)
+ if (cvsclient_ctx)
cvsfp = cvs_rlog_open(cvsclient_ctx, repository_path);
if (!cvsfp)
@@ -584,11 +584,7 @@
exit(1);
}
- if (test_log_file)
- {
- fclose(cvsfp);
- }
- else if (cvsclient_ctx)
+ if (cvsclient_ctx)
{
cvs_rlog_close(cvsclient_ctx);
}
@@ -597,48 +593,47 @@
static int usage(const char * str1, const char * str2)
{
if (str1)
- debug(DEBUG_APPERROR, "\nbad usage: %s %s\n", str1, str2);
+ debug(DEBUG_USAGE, "\nbad usage: %s %s\n", str1, str2);
- debug(DEBUG_APPERROR, "Usage: cvsps [-h] [-x] [-u] [-z <fuzz>] [-g] [-s <range>[,<range>]] ");
- debug(DEBUG_APPERROR, " [-a <author>] [-f <file>] [-d <date1> [-d <date2>]] ");
- debug(DEBUG_APPERROR, " [-b <branch>] [-l <regex>] [-n] [-r <tag> [-r <tag>]] ");
- debug(DEBUG_APPERROR, " [-p <directory>] [-A 'authormap'] [-v] [-t] [--summary-first]");
- debug(DEBUG_APPERROR, " [--test-log <captured cvs log file>]");
- debug(DEBUG_APPERROR, " [--diff-opts <option string>]");
- debug(DEBUG_APPERROR, " [--debuglvl <bitmask>] [-Z <compression>] [--root <cvsroot>]");
- debug(DEBUG_APPERROR, " [-k] [-T] [-V] [<repository>]");
- debug(DEBUG_APPERROR, "");
- debug(DEBUG_APPERROR, "Where:");
- debug(DEBUG_APPERROR, " -h display this informative message");
- debug(DEBUG_APPERROR, " -z <fuzz> set the timestamp fuzz factor for identifying patch sets");
- debug(DEBUG_APPERROR, " -g generate diffs of the selected patch sets");
- debug(DEBUG_APPERROR, " -s <patch set>[-[<patch set>]][,<patch set>...] restrict patch sets by id");
- debug(DEBUG_APPERROR, " -a <author> restrict output to patch sets created by author");
- debug(DEBUG_APPERROR, " -f <file> restrict output to patch sets involving file");
- debug(DEBUG_APPERROR, " -d <date1> -d <date2> if just one date specified, show");
- debug(DEBUG_APPERROR, " revisions newer than date1. If two dates specified,");
- debug(DEBUG_APPERROR, " show revisions between two dates.");
- debug(DEBUG_APPERROR, " -b <branch> restrict output to patch sets affecting history of branch");
- debug(DEBUG_APPERROR, " -l <regex> restrict output to patch sets matching <regex> in log message");
- debug(DEBUG_APPERROR, " -n negate filter sense, print all patchsetss *not* matching.");
- debug(DEBUG_APPERROR, " -r <tag1> -r <tag2> if just one tag specified, show");
- debug(DEBUG_APPERROR, " revisions since tag1. If two tags specified, show");
- debug(DEBUG_APPERROR, " revisions between the two tags.");
- debug(DEBUG_APPERROR, " -p <directory> output patch sets to individual files in <directory>");
- debug(DEBUG_APPERROR, " -v show very verbose parsing messages");
- debug(DEBUG_APPERROR, " -t show some brief memory usage statistics");
- debug(DEBUG_APPERROR, " --summary-first when multiple patch sets are shown, put all summaries first");
- debug(DEBUG_APPERROR, " --test-log <captured cvs log> supply a captured cvs log for testing");
- debug(DEBUG_APPERROR, " --diff-opts <option string> supply special set of options to diff");
- debug(DEBUG_APPERROR, " --debuglvl <bitmask> enable various debug channels.");
- debug(DEBUG_APPERROR, " -Z <compression> A value 1-9 which specifies amount of compression");
- debug(DEBUG_APPERROR, " --root <cvsroot> specify cvsroot. overrides env. and working directory");
- debug(DEBUG_APPERROR, " -k suppress CVS keyword expansion");
- debug(DEBUG_APPERROR, " -T <date> set base date for regression testing");
- debug(DEBUG_APPERROR, " --fast-export emit a git-style fast-import stream");
- debug(DEBUG_APPERROR, " -V emit version and exit");
- debug(DEBUG_APPERROR, " <repository> apply cvsps to repository. Overrides working directory");
- debug(DEBUG_APPERROR, "\ncvsps version %s\n", VERSION);
+ debug(DEBUG_USAGE, "Usage: cvsps [-h] [-x] [-u] [-z <fuzz>] [-g] [-s <range>[,<range>]] ");
+ debug(DEBUG_USAGE, " [-a <author>] [-f <file>] [-d <date1> [-d <date2>]] ");
+ debug(DEBUG_USAGE, " [-b <branch>] [-l <regex>] [-n] [-r <tag> [-r <tag>]] ");
+ debug(DEBUG_USAGE, " [-p <directory>] [-A 'authormap'] [-v] [-t] [--summary-first]");
+ debug(DEBUG_USAGE, " [--diff-opts <option string>]");
+ debug(DEBUG_USAGE, " [--debuglvl <bitmask>] [-Z <compression>] [--root <cvsroot>]");
+ debug(DEBUG_USAGE, " [-k] [-T] [-V] [<repository>]");
+ debug(DEBUG_USAGE, " ");
+ debug(DEBUG_USAGE, "Where:");
+ debug(DEBUG_USAGE, " -h display this informative message");
+ debug(DEBUG_USAGE, " -z <fuzz> set the timestamp fuzz factor for identifying patch sets");
+ debug(DEBUG_USAGE, " -g generate diffs of the selected patch sets");
+ debug(DEBUG_USAGE, " -s <patch set>[-[<patch set>]][,<patch set>...] restrict patch sets by id");
+ debug(DEBUG_USAGE, " -a <author> restrict output to patch sets created by author");
+ debug(DEBUG_USAGE, " -f <file> restrict output to patch sets involving file");
+ debug(DEBUG_USAGE, " -d <date1> -d <date2> if just one date specified, show");
+ debug(DEBUG_USAGE, " revisions newer than date1. If two dates specified,");
+ debug(DEBUG_USAGE, " show revisions between two dates.");
+ debug(DEBUG_USAGE, " -b <branch> restrict output to patch sets affecting history of branch");
+ debug(DEBUG_USAGE, " -l <regex> restrict output to patch sets matching <regex> in log message");
+ debug(DEBUG_USAGE, " -n negate filter sense, print all patchsetss *not* matching.");
+ debug(DEBUG_USAGE, " -r <tag1> -r <tag2> if just one tag specified, show");
+ debug(DEBUG_USAGE, " revisions since tag1. If two tags specified, show");
+ debug(DEBUG_USAGE, " revisions between the two tags.");
+ debug(DEBUG_USAGE, " -p <directory> output patch sets to individual files in <directory>");
+ debug(DEBUG_USAGE, " -v show very verbose parsing messages");
+ debug(DEBUG_USAGE, " -t show some brief memory usage statistics");
+ debug(DEBUG_USAGE, " --summary-first when multiple patch sets are shown, put all summaries first");
+ debug(DEBUG_USAGE, " --diff-opts <option string> supply special set of options to diff");
+ debug(DEBUG_USAGE, " --debuglvl <bitmask> enable various debug channels.");
+ debug(DEBUG_USAGE, " -Z <compression> A value 1-9 which specifies amount of compression");
+ debug(DEBUG_USAGE, " --root <cvsroot> specify cvsroot. overrides env. and working directory");
+ debug(DEBUG_USAGE, " -k suppress CVS keyword expansion");
+ debug(DEBUG_USAGE, " -T <date> set base date for regression testing");
+ debug(DEBUG_USAGE, " --fast-export emit a git-style fast-import stream");
+ debug(DEBUG_USAGE, " --reposurgeon emit reference-lifting hints for reposurgeon.\n");
+ debug(DEBUG_USAGE, " -V emit version and exit");
+ debug(DEBUG_USAGE, " <repository> apply cvsps to repository. Overrides working directory");
+ debug(DEBUG_USAGE, "\ncvsps version %s\n", VERSION);
return -1;
}
@@ -646,6 +641,7 @@
static int parse_args(int argc, char *argv[])
{
int i = 1;
+ debuglvl = debug_levels[0];
while (i < argc)
{
if (strcmp(argv[i], "-a") == 0)
@@ -680,7 +676,7 @@
fp = fopen(argv[i++], "r");
if (fp == NULL) {
- debug(DEBUG_APPERROR, "cvsps: couldn't open specified author map.\n");
+ debug(DEBUG_APPERROR, "couldn't open specified author map.\n");
exit(1);
}
/* coverity[tainted_data] */
@@ -696,11 +692,9 @@
++shortname;
if (*shortname == '#')
continue;
- for (cp = eq; cp >= shortname; --cp)
- if (*cp == '=')
- continue;
- else if (isspace(*cp))
- *cp = '\0';
+ *eq = '\0';
+ for (cp = eq-1; cp >= shortname && isspace(*cp); --cp)
+ *cp = '\0';
for (longname = eq + 1; isspace(*longname); ++longname)
continue;
timezone = strchr(longname, '>');
@@ -871,24 +865,24 @@
if (strcmp(argv[i], "-T") == 0)
{
- if (++i >= argc)
- return usage("argument to -T missing", "");
-
- convert_date(®ression_time, argv[i++]);
+ regression_time = true;
+ i++;
continue;
}
/* leave this in place so git-cvsimport will cause graceful death */
if (strcmp(argv[i], "-u") == 0)
{
- debug(DEBUG_APPERROR, "cvsps: -u is no longer supported.\n");
- debug(DEBUG_APPERROR, "cvsps: your calling program needs to be upgraded to work with cvsps 3.x.\n");
+ debug(DEBUG_APPERROR, "-u is no longer supported.\n");
+ debug(DEBUG_APPERROR, "your calling program needs to be upgraded to work with cvsps 3.x.\n");
exit(1);
}
if (strcmp(argv[i], "-v") == 0)
{
verbose++;
+ if (verbose < sizeof(debug_levels)/sizeof(debug_levels[0]))
+ debuglvl |= debug_levels[verbose];
i++;
continue;
}
@@ -927,10 +921,17 @@
if (strcmp(argv[i], "--debuglvl") == 0)
{
+ char *end;
+ long lvl;
+
if (++i >= argc)
return usage("argument to --debuglvl missing", "");
- debuglvl = atoi(argv[i++]);
+ lvl = strtol(argv[i], &end, 0);
+ if (*end != '\0')
+ return usage("invalid value passed to --debuglvl", argv[i]);
+ debuglvl = lvl;
+ i++;
continue;
}
@@ -973,12 +974,10 @@
continue;
}
- if (strcmp(argv[i], "--test-log") == 0)
+ if (strcmp(argv[i], "--reposurgeon") == 0)
{
- if (++i >= argc)
- return usage("argument to --test-log missing", "");
-
- test_log_file = argv[i++];
+ reposurgeon = true;
+ i++;
continue;
}
@@ -988,21 +987,6 @@
strcpy(repository_path, argv[i++]);
}
- if (fast_export && test_log_file)
- {
- debug(DEBUG_APPERROR, "cvsps: --fast-export and --test-log are not compatible.\n");
- exit(1);
- }
-
- if (do_diff && test_log_file)
- {
- debug(DEBUG_APPERROR, "cvsps: -g and --test-log are not compatible.\n");
- exit(1);
- }
-
- if (debuglvl == 0)
- for (i = 0; i <= verbose && i < sizeof(debug_levels)/sizeof(debug_levels[0]); i++)
- debuglvl |= debug_levels[i];
return 0;
}
@@ -1556,6 +1540,7 @@
return false;
ok:
+ //fprintf(stderr, "Time check: %zd %zd %zd\n", restrict_date_start, restrict_date_end, ps->date);
if (restrict_date_start > 0 &&
(ps->date < restrict_date_start ||
(restrict_date_end > 0 && ps->date > restrict_date_end)))
@@ -1703,6 +1688,33 @@
printf("\n");
}
+static const char *utc_offset_timestamp(const time_t *timep, const char *tz)
+{
+ static char outbuf[BUFSIZ];
+
+ struct tm *tm;
+ char tzbuf[BUFSIZ];
+ char *oldtz = getenv("TZ");
+
+ // make a copy in case original is clobbered
+ if (oldtz != NULL)
+ strncpy(tzbuf, oldtz, sizeof(tzbuf));
+
+ setenv("TZ", tz, 1);
+ tzset(); // just in case ...
+
+ tm = localtime(timep);
+ strftime(outbuf, sizeof(outbuf), "%s %z", tm);
+
+ if (oldtz != NULL)
+ setenv("TZ", tzbuf, 1);
+ else
+ unsetenv("TZ");
+ tzset();
+
+ return outbuf;
+}
+
#define SUFFIX(a, s) (strcmp(a + strlen(a) - strlen(s), s) == 0)
static char *fast_export_sanitize(char *name, char *sanitized, int sanlength)
@@ -1734,7 +1746,6 @@
static void print_fast_export(PatchSet * ps)
{
- struct tm *tm;
struct list_head * next, * tagl, * mapl;
static int mark = 0;
char *tf = tmpnam(NULL); /* ugly necessity */
@@ -1785,23 +1796,16 @@
}
}
- /* we need to be able to fake dates for regression testing */
- if (regression_time == 0)
- tm = localtime(&ps->date);
- else
- {
- time_t clock_tick = regression_time + ps->psid * timestamp_fuzz_factor * 2;
- tm = localtime(&clock_tick);
- }
-
for all_patchset_members(next, ps)
{
PatchSetMember * psm = list_entry(next, PatchSetMember, link);
+ size_t res;
if (!psm->post_rev->dead)
{
FILE *ofp = fopen(tf, "w");
FILE *cfp;
+ char buf[BUFSIZ];
if (ofp == NULL)
{
@@ -1837,8 +1841,8 @@
psm->file->filename, psm->post_rev->rev);
exit(1);
}
- while ((c = fgetc(cfp)) != EOF)
- putchar(c);
+ while ((res = fread (buf, 1, sizeof (buf), cfp)) != 0)
+ fwrite (buf, 1, res, stdout);
(void)fclose(cfp);
putchar('\n');
@@ -1851,7 +1855,7 @@
}
match = NULL;
- tz = "+0000";
+ tz = "UTC";
for (mapl = authormap.next; mapl != &authormap; mapl = mapl->next)
{
MapEntry* mapentry = list_entry (mapl, MapEntry, link);
@@ -1879,13 +1883,49 @@
printf("committer %s", match);
else
printf("committer %s <%s>", ps->author, ps->author);
- printf(" %zd %s\n", mktime(tm) - tm->tm_gmtoff, tz);
+ printf(" %s\n", utc_offset_timestamp(&ps->date, tz));
printf("data %zd\n%s\n", strlen(ps->descr), ps->descr);
+ if (reposurgeon)
+ {
+ FILE *ofp = fopen(tf, "w");
+ FILE *cfp;
+
+ if (ofp == NULL)
+ {
+ debug(DEBUG_APPERROR, "tempfile write of CVS revisions failed.\n");
+ exit(1);
+ }
+ for all_patchset_members(next, ps)
+ {
+ PatchSetMember * psm = list_entry(next, PatchSetMember, link);
+
+ if (!psm->post_rev->dead)
+ fprintf(ofp,
+ "%s:%s\n", psm->file->filename, psm->post_rev->rev);
+ }
+ fclose(ofp);
+
+ /* coverity[toctou] */
+ if (stat(tf, &st) != 0)
+ {
+ debug(DEBUG_APPERROR, "stat(2) of CVS revisuions failed.\n");
+ exit(1);
+ }
+ printf("property cvs-revisions %ld ", st.st_size);
+ if ((cfp = fopen(tf, "r")) == NULL)
+ {
+ debug(DEBUG_APPERROR, "tempfile read of CVS revisions failed.\n");
+ exit(1);
+ }
+ while ((c = fgetc(cfp)) != EOF)
+ putchar(c);
+ (void)fclose(cfp);
+ putchar('\n');
+ }
if (ancestor_mark)
printf("from :%d\n", ancestor_mark);
ps->mark = tip->mark = mark;
-
for all_patchset_members(next, ps)
{
PatchSetMember * psm = list_entry(next, PatchSetMember, link);
@@ -1941,7 +1981,7 @@
if (branch->ps == NULL)
debug(DEBUG_APPWARN, "branch symbol %s not translated",
name);
- else
+ else if (branch->ps->mark)
printf("reset refs/tags/%s\nfrom :%d\n\n",
name, branch->ps->mark);
}
@@ -1968,6 +2008,10 @@
ps_counter++;
ps->psid = ps_counter;
+ /* we need to be able to fake dates for regression testing */
+ if (regression_time)
+ ps->date = ps->psid * timestamp_fuzz_factor * 2;
+
find_branch_points(ps);
}
else
@@ -2907,8 +2951,8 @@
if (next_ps->date > ps->date)
break;
- debug(DEBUG_STATUS, "ps->date %d next_ps->date %d rev->rev %s rev->branch %s",
- ps->date, next_ps->date, rev->rev, rev->branch);
+ debug(DEBUG_STATUS, "ps->date %lld next_ps->date %lld rev->rev %s rev->branch %s",
+ (long long)ps->date, (long long)next_ps->date, rev->rev, rev->branch);
/*
* If the tagname is one of the two possible '-r' tags
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/debug.c new/cvsps-3.7/debug.c
--- old/cvsps-3.4/debug.c 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/debug.c 2013-01-06 22:50:51.000000000 +0100
@@ -65,8 +65,10 @@
fprintf(channel, BUGPREFIX "%s: %s\n", msgbuff, errmsg);
}
- else
+ else if (dtype != DEBUG_USAGE)
fprintf(channel, BUGPREFIX "%s\n", msgbuff);
+ else
+ fprintf(channel, "%s\n", msgbuff);
fflush(channel);
#ifdef _WIN32
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/debug.h new/cvsps-3.7/debug.h
--- old/cvsps-3.4/debug.h 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/debug.h 2013-01-09 16:44:48.000000000 +0100
@@ -12,6 +12,7 @@
#include
#endif
+#include "compiler.h"
#include "inline.h"
#define DEBUG_NUM_FACILITIES 32 /* should be 64 on 64bit CPU... */
@@ -19,6 +20,7 @@
#define DEBUG_ERROR 0x0001
#define DEBUG_APPERROR 0x0002
#define DEBUG_APPWARN 0x0004
+#define DEBUG_USAGE 0x0008
#define DEBUG_RETRIEVAL 0x0010
#define DEBUG_STATUS 0x0020
#define DEBUG_TCP 0x0040
@@ -31,13 +33,14 @@
extern unsigned int debuglvl;
-void hexdump( const char *ptr, int size, const char *fmt, ... );
+void hexdump( const char *ptr, int size, const char *fmt, ... ) GCCISM(__attribute__ ((format (printf, 3, 4))));
void vdebug(int dtype, const char *fmt, va_list);
void vmdebug(int dtype, const char *fmt, va_list);
void to_hex( char* dest, const char* src, size_t n );
void debug_set_error_file(FILE *);
void debug_set_error_facility(int mask, FILE *);
+static INLINE void debug(unsigned int dtype, const char *fmt, ...) GCCISM(__attribute__ ((format (printf, 2, 3))));
static INLINE void debug(unsigned int dtype, const char *fmt, ...)
{
va_list ap;
@@ -50,6 +53,7 @@
va_end(ap);
}
+static INLINE void mdebug(unsigned int dtype, const char *fmt, ...) GCCISM(__attribute__ ((format (printf, 2, 3))));
static INLINE void mdebug(unsigned int dtype, const char *fmt, ...)
{
va_list ap;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cvsps-3.4/tcpsocket.c new/cvsps-3.7/tcpsocket.c
--- old/cvsps-3.4/tcpsocket.c 2013-01-01 18:37:36.000000000 +0100
+++ new/cvsps-3.7/tcpsocket.c 2013-01-09 17:10:48.000000000 +0100
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -47,6 +48,21 @@
setsockopt( retval, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(int));
}
+ /*
+ * This is a good performance enhancement when the socket is going to
+ * be used to pass a lot of short commands. It prevents them from being
+ * delayed by the Nagle algorithm until they can be aggreagated into
+ * a large packet. See http://en.wikipedia.org/wiki/Nagle%27s_algorithm
+ * for discussion.
+ */
+ yes = 1;
+ setsockopt (retval, /* socket affected */
+ IPPROTO_TCP, /* set option at TCP level */
+ TCP_NODELAY, /* name of option */
+ (char *) &yes, /* the cast is historical
+ cruft */
+ sizeof(int)); /* length of option value */
+
debug(DEBUG_TCP, "tcp: socket created");
#ifdef WIN32
return get_fd(retval, WIN32_SOCKET);
@@ -224,7 +240,7 @@
break;
}
- debug(DEBUG_ERROR, "gethostbyname failed for %s: ", addr_str, errstr);
+ debug(DEBUG_ERROR, "gethostbyname failed for %s: %s", addr_str, errstr);
retval = -1;
}
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org