Fossil

Diff
Login

Differences From Artifact [952128b4cc]:

To Artifact [84ab0c78a7]:


110
111
112
113
114
115
116
117

118
119
120
121
122
123
124
125
126
127
128
129
130





131
132
133
134
135
136
137
110
111
112
113
114
115
116

117
118
119
120
121
122
123
124
125





126
127
128
129
130
131
132
133
134
135
136
137







-
+








-
-
-
-
-
+
+
+
+
+







	    trouble fatal "File $mypath contains duplicate definitions for revision $revnr."
	    return
	}

	set myaid($revnr) [$myproject defauthor $author]
	set myrev($revnr) [rev %AUTO% $revnr $date $state $self]

	RecordBasicDependencies $revnr $next
	$self RecordBasicDependencies $revnr $next
	return
    }

    method defdone {} {
	# This is all done after the revision tree has been extracted
	# from the file, before the commit mesages and delta texts are
	# processed.

	ProcessPrimaryDependencies
	ProcessBranchDependencies
	SortBranches
	ProcessTagDependencies
	DetermineTheRootRevision
	$self ProcessPrimaryDependencies
	$self ProcessBranchDependencies
	$self SortBranches
	$self ProcessTagDependencies
	$self DetermineTheRootRevision
	return
    }

    method setdesc {d} {# ignore}

    method extend {revnr commitmsg textrange} {
	set cmid [$myproject defcmessage [string trim $commitmsg]]
159
160
161
162
163
164
165
166

167
168
169
170
171
172
173
159
160
161
162
163
164
165

166
167
168
169
170
171
172
173







-
+







	# level). This gives us the branchid too, required for the
	# meta data group the revision is in. (Note: By putting both
	# branch/lod and project information into the group we ensure
	# that any cross-project and cross-branch commits are
	# separated into multiple commits, one in each of the projects
	# and/or branches).

	set lod [GetLOD $revnr]
	set lod [$self GetLOD $revnr]

	$rev setmeta [$myproject defmeta [$lod id] $myaid($revnr) $cmid]
	$rev settext $textrange
	$rev setlod  $lod

	# If this is revision 1.1, we have to determine whether the
	# file seems to have been created through 'cvs add' instead of
190
191
192
193
194
195
196
197
198
199
200
201





202
203
204

205
206
207
208
209
210
211
190
191
192
193
194
195
196





197
198
199
200
201
202
203

204
205
206
207
208
209
210
211







-
-
-
-
-
+
+
+
+
+


-
+







    }

    method done {} {
	# Complete the revisions, branches, and tags. This includes
	# looking for a non-trunk default branch, marking its members
	# and linking them into the trunk.

	DetermineRevisionOperations
	DetermineLinesOfDevelopment
	HandleNonTrunkDefaultBranch
	RemoveIrrelevantDeletions
	RemoveInitialBranchDeletions
	$self DetermineRevisionOperations
	$self DetermineLinesOfDevelopment
	$self HandleNonTrunkDefaultBranch
	$self RemoveIrrelevantDeletions
	$self RemoveInitialBranchDeletions

	if {[$myproject trunkonly]} {
	    ExcludeNonTrunkInformation
	    $self ExcludeNonTrunkInformation
	}
	return
    }

    # # ## ### ##### ######## #############
    ## State

304
305
306
307
308
309
310
311

312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343

344
345
346
347
348
349
350
351
352
353
354
355

356
357
358
359
360
361
362
363
364
304
305
306
307
308
309
310

311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330



331
332
333
334
335
336
337
338
339

340


341
342
343
344
345
346
347
348
349

350


351
352
353
354
355
356
357







-
+



















-
-
-









-
+
-
-









-
+
-
-








    method AddTag {name revnr} {
	set tag [sym %AUTO% tag $revnr [$myproject getsymbol $name]]
	lappend mytags($revnr) $tag
	return $tag
    }

    proc RecordBasicDependencies {revnr next} {
    method RecordBasicDependencies {revnr next} {
	# Handle the revision dependencies. Record them for now, do
	# nothing with them yet.

	# On the trunk the 'next' field points to the previous
	# revision, i.e. the _parent_ of the current one. Example:
	# 1.6's next is 1.5 (modulo cvs admin -o).

	# Contrarily on a branch the 'next' field points to the
	# primary _child_ of the current revision. As example,
	# 1.1.3.2's 'next' will be 1.1.3.3.

	# The 'next' field actually always refers to the revision
	# containing the delta needed to retrieve that revision.

	# The dependencies needed here are the logical structure,
	# parent/child, and not the implementation dependent delta
	# pointers.

	if {$next eq ""} return

	upvar 1 mydependencies mydependencies

	#                          parent -> child
	if {[rev istrunkrevnr $revnr]} {
	    lappend mydependencies $next $revnr
	} else {
	    lappend mydependencies $revnr $next
	}
	return
    }

    proc ProcessPrimaryDependencies {} {
    method ProcessPrimaryDependencies {} {
	upvar 1 mydependencies mydependencies myrev myrev

	foreach {parentrevnr childrevnr} $mydependencies {
	    set parent $myrev($parentrevnr)
	    set child  $myrev($childrevnr)
	    $parent setchild $child
	    $child setparent $parent
	}
	return
    }

    proc ProcessBranchDependencies {} {
    method ProcessBranchDependencies {} {
	upvar 1 mybranches mybranches myrev myrev

	foreach {branchnr branch} [array get mybranches] {
	    set revnr [$branch parentrevnr]

	    if {![info exists myrev($revnr)]} {
		log write 1 file "In '$mypath': The branch '[$branch name]' references"
		log write 1 file "the bogus revision '$revnr' and will be ignored."
		$branch destroy
383
384
385
386
387
388
389
390

391
392
393

394
395
396
397
398
399

400
401
402
403
404
405
406
407
408
376
377
378
379
380
381
382

383



384


385
386
387

388


389
390
391
392
393
394
395







-
+
-
-
-
+
-
-



-
+
-
-







		    $rev addchildonbranch $child
		}
	    }
	}
	return
    }

    proc SortBranches {} {
    method SortBranches {} {
	upvar 1 myrev myrev

	foreach {revnr rev} [array get myrev] {
	foreach {revnr rev} [array get myrev] { $rev sortbranches }
	    $rev sortbranches
	}
	return
    }

    proc ProcessTagDependencies {} {
    method ProcessTagDependencies {} {
	upvar 1 mytags mytags myrev myrev

	foreach {revnr taglist} [array get mytags] {
	    if {![info exists myrev($revnr)]} {
		set n [llength $taglist]
		log write 1 file "In '$mypath': The following [nsp $n tag] reference"
		log write 1 file "the bogus revision '$revnr' and will be ignored."
		foreach tag $taglist {
		    log write 1 file "    [$tag name]"
416
417
418
419
420
421
422
423

424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444

445
446
447
448
449
450

451
452
453
454
455
456
457

458
459
460
461
462

463
464
465
466
467
468

469
470
471
472
473
474
475
476
477
478

479
480
481

482
483
484
485


486
487
488
489

490
491
492
493
494
495
496
403
404
405
406
407
408
409

410


411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428

429

430
431
432
433

434
435
436
437


438

439
440
441
442
443

444
445
446
447
448
449

450
451

452
453

454
455
456
457

458



459
460
461


462
463
464
465
466

467
468
469
470
471
472
473
474







-
+
-
-


















-
+
-




-
+



-
-

-
+




-
+





-
+

-


-




-
+
-
-
-
+


-
-
+
+



-
+







		    $tag settagrev $rev
		}
	    }
	}
	return
    }

    proc DetermineTheRootRevision {} {
    method DetermineTheRootRevision {} {
	upvar 1 myrev myrev myroot myroot

	# The root is the one revision which has no parent. By
	# checking all revisions we ensure that we can detect and
	# report the case of multiple roots. Without that we could
	# simply take one revision and follow the parent links to
	# their root (sic!).

	foreach {revnr rev} [array get myrev] {
	    if {[$rev hasparent]} continue
	    if {$myroot ne ""} { trouble internal "Multiple root revisions found" }
	    set myroot $rev
	}

	# In the future we also need a list, as branches can become
	# severed from their parent, making them their own root.
	set myroots [list $myroot]
	return
    }

    proc DetermineRevisionOperations {} {
    method DetermineRevisionOperations {} {
	upvar 1 myrevisions myrevisions
	foreach rev $myrevisions { $rev determineoperation }
	return
    }

    proc DetermineLinesOfDevelopment {} {
    method DetermineLinesOfDevelopment {} {
	# For revisions this has been done already, in 'extend'. Now
	# we do this for the branches and tags.

	upvar 1 self self mybranches mybranches mytags mytags mytrunk mytrunk

	foreach {_ branch} [array get mybranches] {
	    $branch setlod [GetLOD [$branch parentrevnr]]
	    $branch setlod [$self GetLOD [$branch parentrevnr]]
	}

	foreach {_ taglist} [array get mytags] {
	    foreach tag $taglist {
		$tag setlod [GetLOD [$tag tagrevnr]]
		$tag setlod [$self GetLOD [$tag tagrevnr]]
	    }
	}
	return
    }

    proc GetLOD {revnr} {
    method GetLOD {revnr} {
	if {[rev istrunkrevnr $revnr]} {
	    upvar 1 mytrunk mytrunk
	    return $mytrunk
	} else {
	    upvar 1 self self
	    return [$self Rev2Branch $revnr]
	}
    }

    proc HandleNonTrunkDefaultBranch {} {
    method HandleNonTrunkDefaultBranch {} {
	upvar 1 myprincipal myprincipal myroot myroot mybranches mybranches myimported myimported myroots myroots myrev myrev

	set revlist [NonTrunkDefaultRevisions]
	set revlist [$self NonTrunkDefaultRevisions]
	if {![llength $revlist]} return

	AdjustNonTrunkDefaultBranch $revlist
	CheckLODs
	$self AdjustNonTrunkDefaultBranch $revlist
	$self CheckLODs
	return
    }

    proc NonTrunkDefaultRevisions {} {
    method NonTrunkDefaultRevisions {} {
	# From cvs2svn the following explanation (with modifications
	# for our algorithm):

	# Determine whether there are any non-trunk default branch
	# revisions.

	# If a non-trunk default branch is determined to have existed,
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
488
489
490
491
492
493
494


495
496
497
498
499
500
501







-
-







	# some period in the past it probably *did* have one.  For
	# example, the file has vendor revisions 1.1.1.1 -> 1.1.1.96,
	# all of which are dated before 1.2, and then it has 1.1.1.97
	# -> 1.1.1.100 dated after 1.2.  In this case, we should
	# record 1.1.1.96 as the last vendor revision to have been the
	# head of the default branch.

	upvar 1 myprincipal myprincipal myroot myroot mybranches mybranches myimported myimported

	if {$myprincipal ne ""} {
	    # There is still a default branch; that means that all
	    # revisions on that branch get marked.

	    log write 5 file "Found explicitly marked NTDB"

	    set rnext [$myroot child]
591
592
593
594
595
596
597
598

599
600
601
602
603
604
605
606
567
568
569
570
571
572
573

574

575
576
577
578
579
580
581







-
+
-







	    return $res

	} else {
	    return {}
	}
    }

    proc AdjustNonTrunkDefaultBranch {revlist} {
    method AdjustNonTrunkDefaultBranch {revlist} {
	upvar 1 myroot myroot myimported myimported myroots myroots myrev myrev mybranches mybranches
	set stop [$myroot child] ;# rev '1.2'

	log write 5 file "Adjusting NTDB containing [nsp [llength $revlist] revision]"

	# From cvs2svn the following explanation (with modifications
	# for our algorithm):

700
701
702
703
704
705
706
707

708
709
710

711
712
713
714
715
716
717
718

719
720
721

722
723
724

725
726
727
728
729
730
731
675
676
677
678
679
680
681

682



683

684
685
686
687
688
689

690
691
692

693
694
695

696
697
698
699
700
701
702
703







-
+
-
-
-
+
-






-
+


-
+


-
+







	    set last [lindex $revlist end]
	    $stop setdefaultbranchparent $last ; # Retypes the revision too.
	    $last setdefaultbranchchild  $stop
	}
	return
    }

    proc CheckLODs {} {
    method CheckLODs {} {
	upvar 1 mybranches mybranches mytags mytags

	foreach {_ branch} [array get mybranches] { $branch checklod }
	foreach {_ branch}  [array get mybranches] { $branch checklod }

	foreach {_ taglist} [array get mytags] {
	    foreach tag $taglist { $tag checklod }
	}
	return
    }

    proc RemoveIrrelevantDeletions {} {
    method RemoveIrrelevantDeletions {} {
    }

    proc RemoveInitialBranchDeletions {} {
    method RemoveInitialBranchDeletions {} {
    }

    proc ExcludeNonTrunkInformation {} {
    method ExcludeNonTrunkInformation {} {
    }

    # # ## ### ##### ######## #############
    ## Configuration

    pragma -hastypeinfo    no  ; # no type introspection
    pragma -hasinfo        no  ; # no object introspection