use strict; use Cwd; printf("%s\n", getrepoid()); sub getrepoid { my $dir = getcwd; my @dir=split m{/}, $dir; my $cur=""; my $subdir= ""; while (@dir) { if (-e "${cur}.svn/entries") { return sprintf("%s", svnrepo("${cur}.svn/entries")); } elsif (-e "${cur}.git/HEAD") { return sprintf("%s:%s:%s", gitrepo("${cur}.git/config"), gitbranch("${cur}.git/HEAD"), $subdir); } $cur .= '../'; $subdir = (scalar pop @dir) .'/'. $subdir; #printf("cur=%s sub=%s dir=%s\n", $cur, $subdir, join("/", @dir)); } return "$dir"; } sub svnrepo { my $ent= shift; open(my $f, "<", $ent) or die "$ent: $!\n"; readline($f); readline($f); readline($f); readline($f); my $url= readline($f); close($f); return $url; } sub gitrepo { my $cfg= shift; open(my $f, "<", $cfg) or die "$cfg: $!\n"; my $url= ""; while (my $l= readline($f)) { if ($l =~ /url\s*=\s*(\S+)/) { $url= $1; $url =~ s/\w+:\/\///; $url =~ s/:/\//; $url =~ s/\/.*\//\//; last; } } close($f); return "git:$url" if ($url); return "?"; } sub gitbranch { my $head= shift; open(my $f, "<", $head) or die "$head: $!\n"; my $branch= ""; if (readline($f) =~ m{ref:\s*.*/(\S+)}) { $branch= $1; } close($f); return $branch; }