Migration from CVS to SVN

From GRASS-Wiki
Revision as of 17:41, 23 November 2007 by ⚠️Landa (talk | contribs) (→‎GRASS CVS repository structure: new subsection: list of cvs tags)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This page contains notes related to GRASS code migration (planned) from CVS to SVN.

Basic

  • The SVN command line interface is just like CVS, many tasks are identical- just change the program name from cvs to svn.

Gotchas

  • cvs2svn is known to break binary files (images) which were not imported into the CVS with the -kb flag. Luckily Glynn fixed most of these some months ago.
  • Files using keyword substitution, such as $Date$ in the description.html files, will have to have support for that enabled manually, once per file (or write a find routine with | xargs svn ...).
$ svn propset svn:keywords "Date" filename.txt
$ svn commit

or

$ find . -name '*.c' | xargs svn propset svn:keywords "Date" 
$ find . -name '*.html' | xargs svn propset svn:keywords "Date" 
$ svn commit
  • how to maintain timestamps of files? We want to keep the last modification date, not the date of local download

GRASS CVS repository structure

/grass-cvs
|
+---/CVSROOT
|
+---/grass
|
+---/grass51
|
+---/grass6
|
+---/grass_doc
|
+---/libgrass
|
+---/newsletter
|
+---/programgrass50
|
+---/web

List of tags

Based on lstag:

devices_cleanup_20000420
freetypecap
grass
grassreleasebranch_5_0_0
grass_6_0_0
grass_6_0_0beta1
grass_6_0_0_beta_1
grass_6_0_0_beta_2
grass_6_0_2
grass_6_1_0
grass_6_1_0beta1
grass_6_1_0RC1
grass_6_2_0
grass_6_2_0beta1
grass_6_2_0beta2
grass_6_2_0beta3
grass_6_2_0RC1
grass_6_2_0RC2
grass_6_2_0RC3
grass_6_2_1
grass_6_2_1RC1
grass_6_2_2RC1
lastworking
markus
post_compare_glynn_head_2002_11_27
post_compare_glynn_release_2002_11_27
post_merge_head_2002_01_22
post_sync_2002_01_22
post_vdigit_changes_2007023
pre-curses-fix
pre_fileinfo_change
pre_merge_head_2002_01_22
pre_merge_release_2002_01_22
pre_sync_2001_10_31
pre_sync_2002_01_17
pre_vdigit_changes_20070221
pre_vdigit_changes_2007023
releasebranch_11_april_2001_5_0_0
releasebranch_11_april_2001_5_0_0_DEAD
releasebranch_14_august_2001_5_0_0
releasebranch_26_april_2002_5_0_0
releasebranch_500
releasebranch_5_0_0
releasebranch_5_4
releasebranch_6_0
releasebranch_6_1
releasebranch_6_2
releasebranch_6_3
release_03_11_2003_grass5_0_3
release_05_11_2004_grass5_4_0
release_10_04_2003_grass5_0_2
release_13_may_2002_grass5_0_0_pre4
release_13_september_2001_grass5_0_0_pre2
release_15_05_2004_grass5_3_0
release_16_january_2002_grass5_0_0_pre3
release_17_06_2004_grass5_7_0
release_20070716_grass_6_2_2
release_20071021_grass_6_2_3RC1
release_20071024_grass_6_3_0RC1
release_20071120_grass_6_3_0RC2
release_25_06_2002_grass5_0_0_pre5
release_28_01_2003_grass5_0_1
release_30_08_2002_grass5_0_0
release_grass500pre1_20_may_2001
release_grass5beta10_7_december_2000
release_grass5beta11pre1_21_january_2001
release_grass5beta11pre2_28_january_2001
release_grass5beta11_4_february_2001
release_grass5beta6_16_feb_2000
release_grass5beta7_20_april_2000
release_grass5beta8_26_july_2000
release_grass5beta9_6_december_2000
start
testbranch_5_0_0stable

Testing SVN repository

  • grass/grass should be renamed to grass/grass5

Question:

  • Migrate all directories or only actively used (grass, grass6, newsletter, web)?
  • Create separate repositories (grass5, grass6, grassweb, grassnewsletter, grass7) or one repository (grass-svn)?

Proposed structure

Note: grass6 was created by copying files from grass5 in 2000. Development of GRASS 7 will start after migration.

Scenario 1

/grass-svn
|
+---/grass5
|    |
|    +---/branches
|    |
|    +---/tags
|    |
|    +---/trunk
|
+---/grass6
|    |
|    +---/branches
|    |
|    +---/tags
|    |
|    +---/trunk
|
+---/grass7
|    |
|    +---/branches
|    |
|    +---/tags
|    |
|    +---/trunk
|
+---/grass-addons
|    |
|    +---/trunk
|
+---/grass-web
|    |
|    +---/trunk

Scenario 2

/grass-svn
|
+---/grass
|    |
|    +---/trunk (grass6 CVS HEAD)
|    |
|    +---/branches
|    |    |
|    |    +---/releasebranch_5_x (note: 5_5 based on grass5 CVS HEAD)
|    |    |
|    |    +---/releasebranch_6_x
|    |
|    +---/tags
|
|---/grass-addons
|
+---/grass-web
|    |
|    +---/trunk
Alternative version
/grass-svn
|
+---/trunk (grass6 CVS HEAD + grassaddons)
|
+---/branches
|    |
|    +---/releasebranch_5_x (note: 5_5 based on grass5 CVS HEAD)
|    |
|    +---/releasebranch_6_x
|
+---/tags

Scenario 3

/grass-svn
|
+---/trunk
|    |
|    +---/grass5 (grass5 CVS HEAD)
|    |
|    +---/grass6 (grass6 CVS HEAD)
|    |
|    +---/grass7 (grass6 CVS HEAD, then modifications)
|    |
|    +---/grassaddons (grassaddons SVN HEAD)
|
+---/branches
|    |
|    +---/releasebranch_5_x
|    |
|    +---/releasebranch_6_x
|
+---/tags

Copy of GRASS CVS repository

rsync -r --times --links --bwlimit=200 --delete rsync://rsync.intevation.de/grass grass-cvs

→ cca 600 MB!

Creating GRASS SVN repository

grass5

cvs2svn --use-cvs --no-default-eol \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grass5svn-orig grass-cvs/grass

grass5svn-orig

Question: exclude selected branches/tags (which one?)

According to undocumented these branches/tags are suggested to be excluded:

--exclude="Mike" \
--exclude="grass" \
--exclude="unlabeled-.*" \
--exclude=devices_cleanup_20000420 \
--exclude=post_compare_glynn_head_2002_11_27 \
--exclude=post_compare_glynn_release_2002_11_27 \
--exclude=post_merge_head_2002_01_22 \
--exclude=post_sync_2002_01_22 \
--exclude=pre-curses-fix \
--exclude=pre_merge_head_2002_01_22 \
--exclude=pre_merge_release_2002_01_22 \
--exclude=pre_sync_2001_10_31 \
--exclude=pre_sync_2002_01_17 \
--exclude=release_15_05_2004_grass5_3_0 \
--exclude=releasebranch_11_april_2001_5_0_0 \
--exclude=releasebranch_11_april_2001_5_0_0_DEAD \
--exclude=releasebranch_500 \
--exclude=releasebranch_5_0_0 \
--exclude=release_grass5beta11pre1_21_january_2001 \
--exclude=release_grass5beta11pre2_28_january_2001 \
--exclude=start \
--exclude=testbranch_5_0_0stable \
--exclude=grassreleasebranch_5_0_0 \

A lot of dependency problems:

ERROR: The branch 'unlabeled-1.7.4' cannot be excluded because the following symbols depend on it:
   'release_grass500pre1_20_may_2001'
   'release_13_september_2001_grass5_0_0_pre2'
   'release_16_january_2002_grass5_0_0_pre3'
   'releasebranch_14_august_2001_5_0_0'
ERROR: The branch 'unlabeled-1.6.4' cannot be excluded because the following symbols depend on it:
   'release_grass500pre1_20_may_2001'
   'color_changes_20010502'
   'release_13_september_2001_grass5_0_0_pre2'
   'release_16_january_2002_grass5_0_0_pre3'
   'releasebranch_14_august_2001_5_0_0'
...
cvs2svn --use-cvs --no-default-eol \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--exclude="Mike" \
--exclude="grass" \
--exclude="unlabeled-.*" \
--exclude=devices_cleanup_20000420 \
--exclude=post_compare_glynn_head_2002_11_27 \
--exclude=post_compare_glynn_release_2002_11_27 \
--exclude=post_merge_head_2002_01_22 \
--exclude=post_sync_2002_01_22 \
--exclude=pre-curses-fix \
--exclude=pre_merge_head_2002_01_22 \
--exclude=pre_merge_release_2002_01_22 \
--exclude=pre_sync_2001_10_31 \
--exclude=pre_sync_2002_01_17 \
--exclude=release_03_11_2003_grass5_0_3 \
--exclude=release_05_11_2004_grass5_4_0 \
--exclude=release_10_04_2003_grass5_0_2 \
--exclude=release_13_may_2002_grass5_0_0_pre4 \
--exclude=release_13_september_2001_grass5_0_0_pre2 \
--exclude=release_15_05_2004_grass5_3_0 \
--exclude=release_16_january_2002_grass5_0_0_pre3 \
--exclude=release_17_06_2004_grass5_7_0 \
--exclude=release_25_06_2002_grass5_0_0_pre5 \
--exclude=release_28_01_2003_grass5_0_1 \
--exclude=release_30_08_2002_grass5_0_0 \
--exclude=releasebranch_11_april_2001_5_0_0 \
--exclude=releasebranch_11_april_2001_5_0_0_DEAD \
--exclude=releasebranch_500 \
--exclude=releasebranch_5_0_0 \
--exclude=release_grass500pre1_20_may_2001 \
--exclude=release_grass5beta10_7_december_2000 \
--exclude=release_grass5beta11_4_february_2001 \
--exclude=release_grass5beta11pre1_21_january_2001 \
--exclude=release_grass5beta11pre2_28_january_2001 \
--exclude=release_grass5beta6_16_feb_2000 \
--exclude=release_grass5beta7_20_april_2000 \
--exclude=release_grass5beta8_26_july_2000 \
--exclude=release_grass5beta9_6_december_2000 \
--exclude=start \
--exclude=testbranch_5_0_0stable \
--exclude=releasebranch_5_4 \
--exclude=grassreleasebranch_5_0_0 \
--exclude=releasebranch_26_april_2002_5_0_0 \
-s grass5svn grass-cvs/grass

grass5svn

grass6

cvs2svn --use-cvs --no-default-eol \
-s grass6svn grass-cvs/grass6
...
Error summary:
ERROR: A CVS repository cannot contain both grass-cvs/grass6/display/d.erase/main.c,v and grass-cvs/grass6/display/d.erase/Attic/main.c,v
ERROR: A CVS repository cannot contain both grass-cvs/grass6/general/g.mapsets/main_inter.c,v and grass-cvs/grass6/general/g.mapsets/Attic/main_inter.c,v
ERROR: A CVS repository cannot contain both grass-cvs/grass6/include/gproj_api.h,v and grass-cvs/grass6/include/Attic/gproj_api.h,v
ERROR: A CVS repository cannot contain both grass-cvs/grass6/visualization/nviz/src/getCat.c,v and grass-cvs/grass6/visualization/nviz/src/Attic/getCat.c,v
Exited due to fatal error(s).

Question: Remove Attic files?

rm -f grass-cvs/grass6/display/d.erase/Attic/main.c,v
rm -f grass-cvs/grass6/general/g.mapsets/Attic/main_inter.c,v
rm -f grass-cvs/grass6/include/Attic/gproj_api.h,v
rm -f grass-cvs/grass6/visualization/nviz/src/Attic/getCat.c,v

Restart

cvs2svn --use-cvs --no-default-eol \
-s grass6svn grass-cvs/grass6
...
----- pass 2 (CollateSymbolsPass) -----
ERROR: It is not clear how the following symbols should be converted.
Use --force-tag, --force-branch and/or --exclude to resolve the ambiguity.
   'releasebranch_6_2' is a tag in 2 files, a branch in 5259 files and has commits in 1513 files

Restart

cvs2svn --use-cvs --no-default-eol \
--force-branch=releasebranch_6_2 \
-s grass6svn-orig grass-cvs/grass6

grass6svn-orig

Exclude all undocumented braches

cvs2svn --use-cvs --no-default-eol 
--force-branch=releasebranch_6_2 \
--exclude="grass" \
--exclude="grassreleasebranch_5_0_0" \
--exclude="markus" \
--exclude="releasebranch_14_august_2001_5_0_0" \
--exclude="releasebranch_26_april_2002_5_0_0" \
--exclude="releasebranch_5_4" \
--exclude="unlabeled.*" \
-s grass6svn1 grass-cvs/grass6
...
----- pass 2 (CollateSymbolsPass) -----
Checking for blocked exclusions...
ERROR: The branch 'markus' cannot be excluded because the following symbols depend on it:
    'start'
    'releasebranch_11_april_2001_5_0_0'
ERROR: The branch 'grass' cannot be excluded because the following symbols depend on it:
...
cvs2svn --use-cvs --no-default-eol \
--force-branch=releasebranch_6_2  \
--exclude="grass" \
--exclude="grassreleasebranch_5_0_0" \
--exclude="markus" \
--exclude="releasebranch_14_august_2001_5_0_0" \
--exclude="releasebranch_26_april_2002_5_0_0" \
--exclude="releasebranch_5_4" \
--exclude="unlabeled.*" \
--exclude="devices_cleanup_20000420" \
--exclude="post_compare_glynn_head_2002_11_27" \
--exclude="post_compare_glynn_release_2002_11_27" \
--exclude="post_merge_head_2002_01_22" \
--exclude="post_sync_2002_01_22" \
--exclude="pre-curses-fix" \
--exclude="pre_merge_head_2002_01_22" \
--exclude="pre_merge_release_2002_01_22" \
--exclude="pre_sync_2001_10_31" \
--exclude="pre_sync_2002_01_17" \
--exclude="release_03_11_2003_grass5_0_3" \
--exclude="release_05_11_2004_grass5_4_0" \
--exclude="release_10_04_2003_grass5_0_2" \
--exclude="release_13_may_2002_grass5_0_0_pre4" \
--exclude="release_13_september_2001_grass5_0_0_pre2" \
--exclude="release_15_05_2004_grass5_3_0" \
--exclude="release_16_january_2002_grass5_0_0_pre3" \
--exclude="release_17_06_2004_grass5_7_0" \
--exclude="release_25_06_2002_grass5_0_0_pre5" \
--exclude="release_28_01_2003_grass5_0_1" \
--exclude="release_30_08_2002_grass5_0_0" \
--exclude="releasebranch_11_april_2001_5_0_0" \
--exclude="releasebranch_11_april_2001_5_0_0_DEAD" \
--exclude="releasebranch_500" \
--exclude="releasebranch_5_0_0" \
--exclude="release_grass500pre1_20_may_2001" \
--exclude="release_grass5beta10_7_december_2000" \
--exclude="release_grass5beta11_4_february_2001" \
--exclude="release_grass5beta11pre1_21_january_2001" \
--exclude="release_grass5beta11pre2_28_january_2001" \
--exclude="release_grass5beta6_16_feb_2000" \
--exclude="release_grass5beta7_20_april_2000" \
--exclude="release_grass5beta8_26_july_2000" \
--exclude="release_grass5beta9_6_december_2000" \
--exclude="start" \
--exclude="testbranch_5_0_0stable" \
--exclude="unlabeled-1.1.1.1.4" \
--exclude="unlabeled-1.1.1.1.6" \
--exclude="color_changes_20010502" \
-s grass6svn grass-cvs/grass6

Question: Exclude more tags (which)?

  • I guess tags "freetypecap", "lastworking", "pre_fileinfo_change" and maybe also "pre_vdigit_changes_.*" could be also excluded... --ML

Add other switches (e.g. --encoding) ??

cvs2svn --use-cvs --no-default-eol \
--force-branch=releasebranch_6_2  \
--exclude="grass" \
--exclude="grassreleasebranch_5_0_0" \
--exclude="markus" \
--exclude="releasebranch_14_august_2001_5_0_0" \
--exclude="releasebranch_26_april_2002_5_0_0" \
--exclude="releasebranch_5_4" \
--exclude="unlabeled.*" \
--exclude="devices_cleanup_20000420" \
--exclude="post_compare_glynn_head_2002_11_27" \
--exclude="post_compare_glynn_release_2002_11_27" \
--exclude="post_merge_head_2002_01_22" \
--exclude="post_sync_2002_01_22" \
--exclude="pre-curses-fix" \
--exclude="pre_merge_head_2002_01_22" \
--exclude="pre_merge_release_2002_01_22" \
--exclude="pre_sync_2001_10_31" \
--exclude="pre_sync_2002_01_17" \
--exclude="release_03_11_2003_grass5_0_3" \
--exclude="release_05_11_2004_grass5_4_0" \
--exclude="release_10_04_2003_grass5_0_2" \
--exclude="release_13_may_2002_grass5_0_0_pre4" \
--exclude="release_13_september_2001_grass5_0_0_pre2" \
--exclude="release_15_05_2004_grass5_3_0" \
--exclude="release_16_january_2002_grass5_0_0_pre3" \
--exclude="release_17_06_2004_grass5_7_0" \
--exclude="release_25_06_2002_grass5_0_0_pre5" \
--exclude="release_28_01_2003_grass5_0_1" \
--exclude="release_30_08_2002_grass5_0_0" \
--exclude="releasebranch_11_april_2001_5_0_0" \
--exclude="releasebranch_11_april_2001_5_0_0_DEAD" \
--exclude="releasebranch_500" \
--exclude="releasebranch_5_0_0" \
--exclude="release_grass500pre1_20_may_2001" \
--exclude="release_grass5beta10_7_december_2000" \
--exclude="release_grass5beta11_4_february_2001" \
--exclude="release_grass5beta11pre1_21_january_2001" \
--exclude="release_grass5beta11pre2_28_january_2001" \
--exclude="release_grass5beta6_16_feb_2000" \
--exclude="release_grass5beta7_20_april_2000" \
--exclude="release_grass5beta8_26_july_2000" \
--exclude="release_grass5beta9_6_december_2000" \
--exclude="start" \
--exclude="testbranch_5_0_0stable" \
--exclude="unlabeled-1.1.1.1.4" \
--exclude="unlabeled-1.1.1.1.6" \
--exclude="color_changes_20010502" \
--exclude="freetypecap" \
--exclude="lastworking" \
--exclude="pre_fileinfo_change" \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grass6svn grass-cvs/grass6

All documented braches/tags were migrated. Repository contains also some undocumented tags: grass_6_0_0, grass_6_0_0beta1, post_vdigit_changes_2007023, pre_vdigit_changes_20070221, pre_vdigit_changes_2007023, release_20071021_grass_6_2_3RC1. In contrast releasebranch_6_0 is missing.

grass6svn

newsletter

SUGGESTION: merge newsletter into the OSGeo journal SVN

cvs2svn --use-cvs --no-default-eol \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grassnlsvn grass-cvs/newsletter

Question: exclude branch "markus" and tags "Final_version", "ready_for_grammar_spelling_correction" and "start"?

  • I guess maybe only trunk can be migrate, we don't need any branches and tags in this case... --ML
cvs2svn --use-cvs --no-default-eol \
--exclude="markus" \
--exclude="Final_version" \
--exclude="ready_for_grammar_spelling_correction" \
--exclude="start" \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grassnlsvn grass-cvs/newsletter
...
Checking for blocked exclusions...
ERROR: The branch 'markus' cannot be excluded because the following symbols depend on it:
    'volume1_final'
...

Cannot exclude branch "markus"

cvs2svn --use-cvs --no-default-eol \
--exclude="Final_version" \
--exclude="ready_for_grammar_spelling_correction" \
--exclude="start" \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grassnlsvn grass-cvs/newsletter

Questions:

  • Rename brach "markus"?
  • Rename tags "volume[1|2]_final" to "release_vol[1|2]"?

I guess only trunk is enough -- ML

cvs2svn --use-cvs --no-default-eol \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--trunk-only \
-s grassnlsvn grass-cvs/newsletter

grassnlsvn

web

cvs2svn --use-cvs --no-default-eol \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grasswebsvn grass-cvs/web
...
ERROR: A CVS repository cannot contain both grass-cvs/web/bugtracking/index.html,v and grass-cvs/web/bugtracking/Attic/index.html,v
...

Question: Remove Attic file?

rm -f grass-cvs/web/bugtracking/Attic/index.html,v

Question: Ignore branches ("markus") and tags ("start")?

cvs2svn --use-cvs --no-default-eol \
--trunk-only \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grasswebsvn grass-cvs/web

grasswebsvn

grass7

Based on grass6 HEAD.

cvs2svn --use-cvs --no-default-eol \
--force-branch=releasebranch_6_2 \
--trunk-only \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
-s grass7svn grass-cvs/grass6

grass7svn

Scenario 1

svnadmin create grass-svn
cvs2svn --use-cvs --no-default-eol \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--branches=grass5/branches \
--tags=grass5/tags \
--trunk=grass5/trunk \
--existing-svnrepos \
-s grass-svn grass-cvs/grass
cvs2svn --use-cvs --no-default-eol \
--force-branch=releasebranch_6_2  \
--exclude="grass" \
--exclude="grassreleasebranch_5_0_0" \
--exclude="markus" \
--exclude="releasebranch_14_august_2001_5_0_0" \
--exclude="releasebranch_26_april_2002_5_0_0" \
--exclude="releasebranch_5_4" \
--exclude="unlabeled.*" \
--exclude="devices_cleanup_20000420" \
--exclude="post_compare_glynn_head_2002_11_27" \
--exclude="post_compare_glynn_release_2002_11_27" \
--exclude="post_merge_head_2002_01_22" \
--exclude="post_sync_2002_01_22" \
--exclude="pre-curses-fix" \
--exclude="pre_merge_head_2002_01_22" \
--exclude="pre_merge_release_2002_01_22" \
--exclude="pre_sync_2001_10_31" \
--exclude="pre_sync_2002_01_17" \
--exclude="release_03_11_2003_grass5_0_3" \
--exclude="release_05_11_2004_grass5_4_0" \
--exclude="release_10_04_2003_grass5_0_2" \
--exclude="release_13_may_2002_grass5_0_0_pre4" \
--exclude="release_13_september_2001_grass5_0_0_pre2" \
--exclude="release_15_05_2004_grass5_3_0" \
--exclude="release_16_january_2002_grass5_0_0_pre3" \
--exclude="release_17_06_2004_grass5_7_0" \
--exclude="release_25_06_2002_grass5_0_0_pre5" \
--exclude="release_28_01_2003_grass5_0_1" \
--exclude="release_30_08_2002_grass5_0_0" \
--exclude="releasebranch_11_april_2001_5_0_0" \
--exclude="releasebranch_11_april_2001_5_0_0_DEAD" \
--exclude="releasebranch_500" \
--exclude="releasebranch_5_0_0" \
--exclude="release_grass500pre1_20_may_2001" \
--exclude="release_grass5beta10_7_december_2000" \
--exclude="release_grass5beta11_4_february_2001" \
--exclude="release_grass5beta11pre1_21_january_2001" \
--exclude="release_grass5beta11pre2_28_january_2001" \
--exclude="release_grass5beta6_16_feb_2000" \
--exclude="release_grass5beta7_20_april_2000" \
--exclude="release_grass5beta8_26_july_2000" \
--exclude="release_grass5beta9_6_december_2000" \
--exclude="start" \
--exclude="testbranch_5_0_0stable" \
--exclude="unlabeled-1.1.1.1.4" \
--exclude="unlabeled-1.1.1.1.6" \
--exclude="color_changes_20010502" \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--branches=grass6/branches \
--tags=grass6/tags \
--trunk=grass6/trunk \
--existing-svnrepos \
-s grass-svn grass-cvs/grass6
cvs2svn --use-cvs --no-default-eol \
--exclude="Final_version" \
--exclude="ready_for_grammar_spelling_correction" \
--exclude="start" \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--branches=newsletter/branches \
--tags=newsletter/tags \
--trunk=newsletter/trunk \
--existing-svnrepos \
-s grass-svn grass-cvs/newsletter
cvs2svn --use-cvs --no-default-eol \
--trunk-only \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--trunk=web/trunk \
--existing-svnrepos \
-s grass-svn grass-cvs/web
cvs2svn --use-cvs --no-default-eol \
--force-branch=releasebranch_6_2 \
--trunk-only \
--encoding="ASCII" \
--encoding="UTF-8" \
--encoding="ISO-8859-1" \
--trunk=grass7/trunk \
--existing-svnrepos \
-s grass-svn grass-cvs/grass6

grass-svn

Scenario 2

Notes:

  • newsletter repository can be merged with OSGeo newsletter repository
  • web in separate repository outside of trac

Script available here.

grass-svn2

Scenario 3

Script available here.

grass-svn3

Moving wxPython GUI code from Add-ons to trunk

See script...

Final scenario

Repository structure

Scenario 2

Scripts:

./grass-cvs2svn-base.sh
./grass-cvs2svn-s2.sh
./grass-cvs2svn-wxpython.sh

grass-svn2

GRASS 7 development notes

MIME types

According to Converting CVS to subversion:

CVSREPOS="$(pwd)/grass-cvs"
PROJECTNAME=grass6
# Find all extensions. Also include filenames without extension.
# The E (extension) and S (slash) trick is to get GNU sort to separate
# them, although this is not really necessary. But note that at the
# same time it removes the leading slash from filenames without extension.
find $CVSREPOS/$PROJECTNAME -type f -name '*,v' ! -name '.cvsignore,v' | \
   sed -e 's%.*\([./][^.]*\),v$%\1%' -e 's/\./E/' -e 's/\//S/' | \
   sort -u | sed -e 's/^S//' -e 's/^E/./' > step1

# Compose an extended regular expression that matches any "extension"
# as found by the previous step.
EXT1="($(grep '^\.' step1 | xargs echo | sed -e 's/^\.//' -e 's/\+/\\+/g' -e 's/ \./|/g'))"

# Find all mime-types and related extensions that really exist.
egrep -i '^alnum:[^[:space:]]*space:+([^[:space:]]+ )*'"$EXT1"'($| )' /etc/mime.types > step2

# Extract the list of extensions from the previous step,
# filtering out the extensions that we don't have.
for ext in $(sed -re 's/^[^[:space:]]*space:+//' step2); do echo $ext; done | \
   egrep -i '^'"$EXT1"'$' | sort -u > step3

# Compose an extended regular expression from the previous step.
EXT2="($(cat step3 | xargs echo | sed -e 's/ /|/g'))"
 
# Find all "extensions" that weren't really extensions
# (or for which we don't know a MIME type).
grep '^\.' step1 | egrep -iv '^\.'"$EXT2"'$' > step4

# And turn it into an extended regular expression.
EXT3="($(sed -e 's/\./\\\\./' step4 | xargs echo | sed -e 's/ /|/g'))"

# Create a list of files for which no MIME type is known.
find $CVSREPOS/$PROJECTNAME -type f -name '*,v' ! -name '.cvsignore,v' | \
   sed -e 's%.*/\([^/]*\),v$%\1%' | egrep -i "$EXT3"'$' | sort -u > step5

Binary files in 'step5':

./macosx/app/app.icns:                                       data
./db/drivers/dbf/dbf_catalog/datetime.dbf:                   DBase 3 data file (2 records)
./imagery/i.atcorr/test_suite/ETM4_400x400_atms_corr.raw:    data
./imagery/i.atcorr/test_suite/ETM4_400x400.raw:              data
./macosx/app/English.lproj/MainMenu.nib/keyedobjects.nib:    Apple binary property list
./lib/proj/nzgd2kgrid0005.gsb:                               data
./db/drivers/dbf/dbf_catalog/river.dbf:                      DBase 3 data file (5 records)
./raster/r.slope.aspect/r_sl_asp_northangle_diffs.tar.gz:    gzip compressed data, was "r.slope.aspect-diffs.tar",  from Unix, last modified: Tue Jul 21 20:15:15 1998
./lib/vector/diglib/test.ok:                                 data

Add to mine.types:

application/dbase                          dbf
application/x-gtar                         gtar tgz taz tar.gz
application/octet-stream                   bin icns raw nib gsb ok
# Create a map from extension to MIME type. If a MIME type that starts
# with 'text' exist, use that - otherwise use application/octet-stream
# when there is more than one MIME type, or use the single known MIME type.
for f in $(cat step3); do \
   MIMETYPES=$(egrep -i 'space:'$f'( |$)' step2 | sed -e 's/space:.*//'); \
   echo $f: $MIMETYPES; done | \
   sed -e 's%:.* \(text/[^ ]*\).*%: \1%' -e 's%: [^ ].* .*%: application/octet-stream%' > step6
? b: chemical/x-molconn-Z (only ./raster/r.le/r.le.setup/polytocell/bmf.b, I guess it should be bmf.c...)
grass6/raster/r.le/r.le.setup/polytocell/bmf.b:               ASCII C program text
grass/src/raster/r.le/r.le.setup/polytocell/bmf.b:            ASCII C program text
grass/src/imagery/i.points3/inter/find.b:                     ASCII C program text
grass/src.contrib/SCS/paint/Programs/newp.map/cmd/scan_gis.b: ASCII C program text
grass/src.contrib/SCS/paint/Programs/newp.map/cmd/map.b:      ASCII C program text
grass/src.contrib/CERL/SGI/ISM/grid/gdwrit.b:                 ASCII text
grass/src.garden/grass.hdf/hdf3/HDF.lib.3.2.3/doc/HDF.apdx.b: ASCII English text
-> b: text/plain

? bak: application/x-trash
grass/src.contrib/GMSL/sg4d/lightdefs.bak:                            ASCII C program text
grass/src.contrib/GMSL/g3d/src3d/raster/r3.showdspf.openGL/Viz.h.bak: ASCII C program text
-> bak: text/plain

? bat: application/x-msdos-program
grass6/scripts/windows_launch.bat:                            ASCII text
grass6/lib/init/grass.bat:                                    MS-DOS batch file text
grass6/lib/init/init.bat:                                     MS-DOS batch file text
grass6/lib/init/grass-run.bat:                                MS-DOS batch file text
grass6/visualization/nviz/scripts/nviz.bat:                   ASCII text
grass/src.contrib/CERL/raster/r.rational.regression/main.bat: ASCII C program text
grass/cygwin/startxgrass.bat:                                 MS-DOS batch file text
grass/cygwin/startxwingrass.bat:                              MS-DOS batch file text
-> bat: text/plain

bin: application/octet-stream
grass/src/general/g.help/help/06.export/06.02.asc.bin: ASCII English text
grass/src/raster/r.out.bin:                            directory
grass/src/raster/r.in.bin:                             directory
grass/src/tcltkgrass/module/r.out.bin:                 ASCII text
grass/src/tcltkgrass/module/r.in.bin:                  ASCII English text
grass/locale/ru/tcltkgrass/module/r.out.bin:           ISO-8859 text
grass/locale/ru/tcltkgrass/module/r.in.bin:            ISO-8859 text
grass6/raster/r.out.bin:                               directory
grass6/raster/r.in.bin:                                directory
-> bin: text/plain

cab: application/x-cab
grass/src.contrib/eurogis/v.in.EE/x.cab: ASCII text
-> cab: text/plain

cat: application/vnd.ms-pki.seccat
grass/src/scripts/contrib/i.oif/i.oif.cat: ASCII English text
-> cat: text/plain

application/java-vm
grass/src/general/g.help/help/09.imagery/09.04.class:       ASCII English text
grass/src/general/g.help/help/17.manual/Help.pages/i.class: ASCII English text
grass/src/imagery/i.class:                                  directory
grass6/imagery/i.class:                                     directory
-> class: text/plain

c: text/x-csrc
cc: text/x-c++src
cpp: text/x-c++src
css: text/css
csv: text/csv

? dat: chemical/x-mopac-input
grass6/misc/m.cogo/cogo.dat:                           ASCII text
grass6/lib/proj/ntv1_can.dat:                          data
grass6/lib/gis/fmode.dat:                              ASCII C program text
grass6/raster/r.statistics/gauss.dat:                  ASCII text
grass/src/libes/proj/ntv1_can.dat:                     data
grass/src/sites/s.qcount/tutorial/cls.dat:             ASCII text
grass/src/sites/s.qcount/tutorial/reg.dat:             ASCII text
grass/src/sites/s.qcount/tutorial/csr.dat:             ASCII text
grass/src/misc/m.cogo/cogo.dat:                        ASCII text
grass/src/raster/r.in.gridatb/example/elev.dat:        ASCII text
grass/src/raster/r.statistics/cmd/gauss.dat:           ASCII text
grass/src/paint/Drivers/versatec/patterns/ce3200.dat:  ASCII English text
grass/src.contrib/PURDUE/s.medp/doc/cressie.dat:       ASCII English text
grass/src.contrib/CERL/raster/nodenumber/xsect.dat:    ASCII text
grass/src.contrib/CERL/raster/nodenumber/yak_trap.dat: ASCII text
-> plain/text / application/octet-stream

dbf: application/dbase

? dir: application/x-director
grass6/raster/r.fill.dir:                     setgid directory
grass6/tools/cvs.rename.dir:                  POSIX shell script text executable
grass/src/raster/r.fill.dir:                  setgid directory
grass/src/tcltkgrass/module/r.fill.dir:       ASCII text
-> dir: text/plain
 
? doc: application/msword
grass/src/fonts/original/hershey.doc:                        ASCII English text
grass/src.contrib/SDTS/libes/fips123/bugs.doc:               data
grass/src.contrib/SDTS/libes/fips123/fixes.doc:              data
grass/src.contrib/SDTS/mapdev/v.in.sdts/filenames.doc:       ASCII English text
grass/src.nonGPL/agnps/r.agnps50/documentation/vrfsftwr.doc: Microsoft Word 6.0 Document

eps: application/postscript
fig: application/x-xfig

frame: application/x-maker
grass/src/display/d.frame:                                  directory
grass/src/general/g.help/help/12.map.display/12.03.d.frame: ASCII English text
grass/src/general/g.help/help/17.manual/Help.pages/d.frame: ASCII English text
grass/src/tcltkgrass/module/d.frame:                        ASCII English text
grass/locale/ru/tcltkgrass/module/d.frame:                  ISO-8859 text
grass/unused/tcltkgrass/module/d.frame:                     ASCII English text
grass6/display/d.frame:                                     directory
-> text/plain

frm: application/x-maker
grass/src/general/g.help/help/04.wind.mgmt/04.02.mng.frm: ASCII English text
-> text/plain 

gen: chemical/x-genbank
grass/src/display/devices/windows/libW11/wrap/xwrappers.gen: ASCII C program text, with very long lines
-> text/x-csrc

hdf: application/x-hdf
grass/src/tcltkgrass/module/r.out.hdf:         ASCII text
grass/src/tcltkgrass/module/r.in.hdf:          ASCII text
grass/src.garden/grass.hdf:                    directory
grass/src.garden/grass.hdf/hdf3/old/r.out.hdf: directory
grass/src.garden/grass.hdf/hdf3/old/r.in.hdf:  directory
grass/src.garden/grass.hdf/hdf3/r.out.hdf:     directory
grass/src.garden/grass.hdf/hdf3/r.in.hdf:      directory
grass/src.garden/grass.hdf/hdf4/r.out.hdf:     directory
grass/src.garden/grass.hdf/hdf4/r.in.hdf:      directory
grass/src.garden/grass.hdf/hdf5/r.out.hdf:     directory
grass/src.garden/grass.hdf/hdf5/r.in.hdf:      directory
grass/locale/ru/tcltkgrass/module/r.out.hdf:   ISO-8859 text
grass/locale/ru/tcltkgrass/module/r.in.hdf:    ISO-8859 text
-> hdf: text/plain

gif: image/gif
gsb: application/octet-stream
h: text/x-chdr
hh: text/x-c++hdr
htm: text/html
html: text/html
icns: application/octet-stream
ico: image/x-icon
jpg: image/jpeg
lyx: application/x-lyx
man: application/x-troff-man

me: application/x-troff-me
grass/src.contrib/SCS/paint/Programs/ps.map/read.me: ASCII English text
-> text/plain

mid: audio/midi
grass/src/CMD/generic/make.mid: ASCII English text
-> text/plain

mpeg: video/mpeg
grass/src/raster/r.out.mpeg:            directory
grass/src/tcltkgrass/module/r.out.mpeg: ASCII English text
grass6/raster/r.out.mpeg:               directory
-> text/plain

application/x-troff-ms
grass/unused/man/utilities/ptx.to.ms: ASCII text
-> text/plain

nib: application/octet-stream
ok: application/octet-stream

? old: application/x-trash
grass6/dist.i686-pc-linux-gnu/docs/html/gem/img1.old: PNG image data, 559 x 111, 8-bit colormap, interlaced
grass6/gem/docs/GEM-Manual/img1.old:                  PNG image data, 559 x 111, 8-bit colormap, interlaced
grass/unused/misc/m.clump/proto.h.old:                ASCII C program text
grass/src/raster/r.random.surface/MAN.old:            troff or preprocessor input text
grass/src/tcltkgrass/README.old:                      ASCII English text
-> old: image/png for grass6 old: text/plain for grass5

pat: image/x-coreldrawpattern
grass/src/paint/Drivers/versatec/patterns/ce3200.pat: ASCII text
-> text/plain

patch: text/x-diff
pdf: application/pdf
pl: text/x-perl
pm: text/x-perl

pbm: image/x-portable-bitmap
grass/src/raster/r.in.pbm:            directory
grass/src/tcltkgrass/module/r.in.pbm: ASCII text
-> text/plain

pgm: image/x-portable-grayma
grass/src/raster/r.in.pgm:            directory
grass/src/tcltkgrass/module/r.in.pgm: ASCII text
-> text/plain

png: image/png

ppm: image/x-portable-pixmap
grass/src/paint/Programs/p.ppm:                           directory
grass/src/general/g.help/help/17.manual/Help.pages/p.ppm: ASCII text
grass/src/raster/r.out.ppm:                               directory
grass/src/raster/r.in.ppm:                                directory
grass/src/raster/r.in.ppm/trees24bit.ppm:                 Netpbm PPM "rawbits" image data
grass/src/raster/r.in.ppm/image24bit.ppm:                 Netpbm PPM "rawbits" image data
grass/src/tcltkgrass/module/r.out.ppm:                    ASCII text
grass/src/tcltkgrass/module/r.in.ppm:                     ASCII English text
grass/src.contrib/SCS/paint/Drivers/grey.ppm:             directory
grass/locale/ru/tcltkgrass/module/r.out.ppm:              ISO-8859 text
grass/locale/ru/tcltkgrass/module/r.in.ppm:               ISO-8859 text
-> text/plain / image/x-portable-pixmap

ps: application/postscript
py: text/x-python

raw: application/octet-stream
grass/src/mapdev/v.in.arc/testdata/f1.txt.raw:                 ASCII text
grass/src/mapdev/v.in.arc/testdata/f2.txt.raw:                 ASCII text
grass6/imagery/i.atcorr/test_suite/ETM4_400x400.raw:           data
grass6/imagery/i.atcorr/test_suite/ETM4_400x400_atms_corr.raw: data
-> text/plain for grass5

rgb: image/x-rgb
grass/src/display/d.rgb:                                      directory
grass/src/libes/g3d/snap.rgb:                                 SGI image data, RLE, 3-D, 573 x 372, 3 channels
grass/src/general/g.help/help/17.manual/Help.pages/d.rgb:     ASCII English text
grass/src/general/g.help/help/17.manual/Help.pages/i.his.rgb: ASCII text
grass/src/general/g.help/help/17.manual/Help.pages/r.his.rgb: ASCII text
grass/src/tcltkgrass/module/d.rgb:                            ASCII text
grass/src/tcltkgrass/module/i.his.rgb:                        ASCII text
grass/src.contrib/GMSL/NVIZ2.2/TOGL/apps/ben.rgb:             SGI image data, RLE, 3-D, 133 x 158, 3 channels
grass/locale/ru/tcltkgrass/module/d.rgb:                      ISO-8859 text
grass/locale/ru/tcltkgrass/module/i.his.rgb:                  ISO-8859 text
grass/unused/tcltkgrass/module/d.rgb:                         ASCII English text
grass/unused/tcltkgrass/module/i.his.rgb:                     ASCII English text
grass6/lib/g3d/snap.rgb:                                      SGI image data, RLE, 3-D, 573 x 372, 3 channels
grass6/display/d.rgb:                                         directory
grass6/scripts/i.landsat.rgb:                                 directory
grass6/scripts/i.landsat.rgb/i.landsat.rgb:                   Bourne shell script text executable
grass6/imagery/i.his.rgb:                                     directory
-> text/plain / image/x-rgb

ros: chemical/x-rosdal
grass/src/raster/wildfire/src/r.ros: directory
grass/src/tcltkgrass/module/r.ros:   ASCII English text
grass6/raster/wildfire/r.ros:        directory
-> text/plain

rtf: application/rtf
sh: text/x-sh

? src: application/x-wais-source
grass6/lib/init/grass-run.src:        POSIX shell script text executable
grass6/lib/init/grass.src:            POSIX shell script text executable
grass6/binaryInstall.src:             POSIX shell script text executable
grass/src/general/init/grass.src:     POSIX shell script text executable
grass/src/tcltkgrass/gis_set.tcl.src: ASCII English text
grass/binaryInstall.src:              POSIX shell script text executable
-> src: text/plain

? t: application/x-troff
grass6/swig/perl/t/R_slope_aspect.t: ASCII English text
-> t: text/plain

tcl: text/x-tcl
tex: text/x-tex
tgz: application/x-gtar
tiff: image/tiff
txt: text/plain
xbm: image/x-xbitmap

? xyz: chemical/x-xyz
grass6/scripts/r.out.xyz:                        setgid directory
grass6/scripts/r.out.xyz/r.out.xyz:              POSIX shell script text executable
grass6/raster/r.in.xyz:                          setgid directory
grass/src/raster/r.out.xyz:                      setgid directory
grass/src/tcltkgrass/module/r.out.xyz:           ASCII text
-> xyz: text/plain
# Instead, build a props file for use with the '--auto-props=FILE' option.
echo "[auto-props]" > propsfile-g5
sed -e 's%: \(text/.*\)% = svn:eol-style=native;svn:keywords=Author Date Id Revision;svn:mime-type=\1%' \
-e 's/^/*./' -e 's/: / = svn:mime-type=/' step6-g5 >> propsfile-g5

echo "[auto-props]" > propsfile-g6
sed -e 's%: \(text/.*\)% = svn:eol-style=native;svn:keywords=Author Date Id Revision;svn:mime-type=\1%' \
-e 's/^/*./' -e 's/: / = svn:mime-type=/' step6-g6 >> propsfile-g6

Remove mime-type:text/*

cat propsfile-g6 | sed -e 's/svn:mime-type=text\/.*//g' > propsfile-g6-1
cat propsfile-g5 | sed -e 's/svn:mime-type=text\/.*//g' > propsfile-g5-1
#Finish the generation of propsfile
sed -re 's/(.*\.([^.]*$))/\2 \1/' -e 's/^([^.]*)$/\1 \1/' step5-g6 | sort | \
sed -e 's/^[^ ]* //' -e 's%$% = svn:eol-style=native;svn:keywords=Author Date Id Revision%' >> propsfile-g6-1

#Finish the generation of propsfile
sed -re 's/(.*\.([^.]*$))/\2 \1/' -e 's/^([^.]*)$/\1 \1/' step5-g5 | sort | \
sed -e 's/^[^ ]* //' -e 's%$% = svn:eol-style=native;svn:keywords=Author Date Id Revision%' >> propsfile-g5-1

Files are available here.

External links

SVN hosting

There are two main options to host the new SVN repository.