Sylvain Beucler <[EMAIL PROTECTED]> writes: > On Mon, Dec 06, 2004 at 04:47:56PM -0800, Mark D. Baushke wrote: > > Sylvain Beucler <[EMAIL PROTECTED]> writes: > > > > > Hello, > > > > > > I would like to fix a problem that occured at Savannah. The issue is > > > pretty much described here: > > > http://lists.gnu.org/archive/html/savannah-hackers/2004-12/msg00061.html > > > > > > and to sum up, the logged username became uid##### instead of the > > > actual username, for a few days about a year ago. For example, user > > > "miles" became "uid65618": > > > http://savannah.gnu.org/cgi-bin/viewcvs/emacs/emacs/lisp/filecache.el > > > > > > The mapping uid<->user can be found using /etc/passwd. > > > > > > > > > We would like to write a script to fix these usernames. However, > > > rcs(1) is not meant to do it; moreover, the various RCS parser I had a > > > look at are more concerned about extracting revisions than making > > > changes to the actual RCS file, when they are not beta versions. > > > > > > Various web and mailing list archive searches didn't help. > > > > > > What do you think is the best way to fix the RCS files? Of course, > > > "manual editing" is valid, but I have the failing to expect a quicker > > > way :) > > > > Quicker? Hmmm... > > > > find . -name \*,v -print0 \| > > xargs -0 perl -i.bak -pane \ > > 's,^(date\s+[0-9.]+;\s+author\s+)uid65618;(\s+state\s\S;$),$1miles;$2,g;' > > > > Of course, I urge you to ensure that the repository is locked or > > otherwise not actively being modified when you run the script. > > > > I would suggest performing the initial runs of the script on a snapshot > > of the repository and then doing a comparison of the .bak files with > > the original versions to ensure everything looks correct. > > Thanks. However, I was looking for a more "secure" way to do the > job. In the best case, I would like to apply the script to fix ~2000 > repositories.
Ahhh, well, that does make a difference. > The script you suggest could match a line in the deltas (for example, > in a file discussing the RCS format) instead of in the administrative > part. I could stop the substitution when I meet "desc(\s|\n)@", but I > am afraid of missing that "separator" when parsing a RCS file > generated by an older version of CVS - hence why I looked for a RCS > parser. Such parsers exist in RCS, CVS, CVSup(d). > Moreover, it is difficult to test whether the substitution occured > properly. > > Any idea? The following hack to the CVS sources will probably do what you want. cvs log > before cvs admin -guid65618=miles cvs log > after diff before after I don't know about the advisiblity of making this a feature of CVS, so unless other folks specify a need for this kind of addition, I probably won't be incorporating it into a general CVS release. Good luck, -- Mark Index: admin.c =================================================================== RCS file: /cvs/ccvs/src/admin.c,v retrieving revision 1.101 diff -u -p -u -p -r1.101 admin.c --- admin.c 4 Oct 2004 20:37:50 -0000 1.101 +++ admin.c 7 Dec 2004 16:55:38 -0000 @@ -230,7 +230,7 @@ admin (int argc, char **argv) optind = 0; only_allowed_options = true; while ((c = getopt (argc, argv, - "+ib::c:a:A:e::l::u::LUn:N:m:o:s:t::IqxV:k:")) != -1) + "+ib::c:a:A:e::l::u::LUn:N:m:o:s:t::IqxV:k:g:")) != -1) { if ( # ifdef CLIENT_SUPPORT @@ -371,6 +371,11 @@ admin (int argc, char **argv) strcat (admin_data.delete_revs, optarg); break; + case 'g': + /* Note that multiple -g options are valid. */ + arg_add (&admin_data, 'g', optarg); + break; + case 's': /* Note that multiple -s options are valid. */ arg_add (&admin_data, 's', optarg); @@ -614,6 +619,31 @@ admin (int argc, char **argv) +struct rename_author { + char *oldauthor; + char *newauthor; +}; +/* + * Replace old author value with newauthor value. + * This is called via walklist. + */ +static int +admin_rename_author (Node *p, void *closure) +{ + RCSVers *delta; + struct rename_author *ra = closure; + int cnt = 0; + + delta = p->data; + if (!strcmp (delta->author, ra->oldauthor)) + { + free (delta->author); + delta->author = xstrdup (ra->newauthor); + cnt++; + } + return cnt; +} + /* * Called to run "rcs" on a particular file. */ @@ -917,6 +947,42 @@ admin_fileproc (void *callerdat, struct delta->state = tag; break; + case 'g': + /* + * -g oldauthor=newauthor + */ + p = strchr (arg, '='); + if (p) + { + struct rename_author ra; + char buf[50]; + int cnt; + + *p = '\0'; + ra.oldauthor = arg + 2; + ra.newauthor = p + 1; + + cvs_output ("changed author ", 0); + cvs_output (ra.oldauthor, 0); + cvs_output (" to ", 0); + cvs_output (ra.newauthor, 0); + cvs_output (" in ", 0); + sprintf (buf, "%d", + walklist (rcs->versions, admin_rename_author, + &ra)); + cvs_output (buf, 0); + cvs_output (" revisions.", 0); + cvs_output ("\n", 1); + *p = '='; + } + else + { + error (0, 0, "%s: %s option lacks replacment author", + rcs->path, arg); + status = 1; + } + break; + case 'm': p = strchr (arg, ':'); if (p == NULL) _______________________________________________ Info-cvs mailing list [EMAIL PROTECTED] http://lists.gnu.org/mailman/listinfo/info-cvs