CVSSYNC(1)

πŸ“¦
version 1.59 Β· 2 versions
, in debian bookworm, debian trixie, ubuntu jammy, ubuntu noble, ubuntu resolute, ubuntu stonking

πŸ’– CVSSYNC(1) β€” the cvssync manual, bestie edition πŸ’–

okay so real talk, this is the manual page for cvssync, a lil tool that goes and grabs CVS repository masters over rsync. it ships alongside cvs-fast-export(1). no cap, it's giving "i just want my ancient repo back" energy and honestly? we love that for you. 🫢


✨ NAME ✨

cvssync β€” fetch CVS repository masters via rsync πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

cvssync [-c] [-v] [-n] [-o outdir] [host-path module | cvsurl]

πŸ¦‹ DESCRIPTION πŸ¦‹

so basically, cvssync attempts to fetch a copy of a remote CVS repository into a local directory. and the way you tell it what to fetch is literally just the arguments you'd hand CVS to perform a checkout of the remote. that's it. that's the whole interface. iconic.

orrr, if you're feeling fancy, you can give it a single argument in URL format, shaped like this:

cvs://<host>/<path>#<module>

now here's the part that's lowkey genius: if a previous cvssync has already been done into that directory, cvssync will do the least amount of file copying required to resynchronize the local copy with the remote. it relies on rsync(1) to pull that off. efficiency queen. ✨

cvssync also knows about the site-structure idiosyncracies of some major CVS hosting sites and applies that knowledge so you don't have to. presently its rules are known good for SourceForge, Savannah, Sourceware, and Berlios. its default method should work for many other sites too. and if you wanna peek at what rsync command is actually being generated in these cases, hit the -v option. πŸ‘€

because cvssync uses rsync, you may need to have an ssh public key installed in an account on the target system for it to work. that said, many CVS repositories are set up in a way that makes anonymous read-only rsync possible, so you might get lucky. πŸ™ˆ

cvssync is an auxiliary tool issued with cvs-fast-export(1) in order to facilitate moving CVS repositories to version control systems that aren't chipped out of flint. πŸ’€ (yes, that's the actual vibe of the original page, and honestly it ate.) of course, you can also use it for backups and other purposes. do whatever, bestie. πŸŽ€


🌸 OPTIONS 🌸

  • -c β€” create a mirror that you can do checkouts from. normally this tool creates a bare mirror of the module masters you're interested in, without creating a module subdirectory and CVSROOT. with this option, the created directory structure is changed to include an empty CVSROOT, and the masters go in a subdirectory named after the module. a cvs -d:local: co command can then be used to make a local checkout for inspection. πŸ”
  • -n β€” dry-run. generate the commands that would be performed but do not execute them. useful with -v. (imagine doing the thing without doing the thing. main character restraint.) πŸ’…
  • -o β€” set the name of the output directory. the default is to use the module name.
  • -v β€” verbose. show subcommands as they are being executed. πŸ—£οΈ

πŸ’€ DISAMBIGUATION πŸ’€

okay so this is very important, bestie, listen up. there is another program called cvsync for making live mirrors β€” this is not it. 🚨

one important difference: cvsync requires a dedicated service daemon, cvsyncd, to be running on the CVS host; it's not designed for ad-hoc fetches from random hosting sites.

there is also a program called cvssuck that is roughly equivalent to cvssync. it has the advantage that it grabs the master files using CVS client commands, so rsync access is not required. it has the disadvantage that because of bugs in CVS itself, it may mangle repository metadata on the way through. 😭 the author warns:

"However it is inefficient and not perfect because cvs client/server protocol is not designed for mirroring."

heed this warning. do not use cvssuck except as a last resort. like, actually. fr fr. 🫢


🌈 EXAMPLES 🌈

note that these examples may become obsolete as CVS repositories are decommissioned. they are meant to illustrate usage patterns. (gone but not forgotten, rip to those hosts πŸͺ¦)

cvssync cvs.sourceforge.net:/cvsroot/rfk robotfindskitten

fetch the Robot Finds Kitten project from Sourceforge 🐱

cvssync rfk.cvs.sourceforge.net:/cvsroot/rfk robotfindskitten

using the full Sourceforge pseudo-hostname also works.

cvssync anonymous@rfk.cvs.sourceforge.net:/cvsroot/rfk robotfindskitten

any login credential is ignored. (it literally does not care who you claim to be. unbothered. moisturized.) πŸ’…

cvssync rfk.cvs.sourceforge.net:/rfk robotfindskitten

the leading /cvsroot on a SourceForge path can be omitted.

cvssync cvs://cvs.sourceforge.net/rfk#robotfindskitten

same fetch using the URL argument style.

cvssync anonymous@cvs.savannah.gnu.org:/sources/groff groff

fetch the groff project repository from Savannah

cvssync cvs.savannah.gnu.org:/groff groff

login credential and leading /sources can be omitted on Savannah.

cvssync cvs://cvs.savannah.gnu.org/groff#groff

same fetch using the URL argument style.

cvssync cvs:///home/user/foo#bar

copy module bar from a local CVS repository foo. 🏠


πŸ› REPORTING BUGS πŸ›

report bugs to Eric S. Raymond <esr@thyrsus.com>. the project page is at http://catb.org/~esr/cvs-fast-export. don't be shy, tell them what broke. 🫢


πŸ‘‘ SEE ALSO πŸ‘‘

rsync(1), rcs(1), cvs(1), cvs-fast-export(1).


and that's the whole page, bestie!! this one's from the 2019-04-24 edition of the CVSSYNC(1) manual β€” go forth, sync your ancient repos, and slay. βœ¨πŸ’–πŸŽ€πŸ¦‹πŸŒΈπŸ’